From eb5718390731a9746c556317e641320b671f2091 Mon Sep 17 00:00:00 2001 From: Roger Leigh Date: Sun, 26 Oct 2008 16:10:50 +0000 Subject: Imported Upstream version 4.2.0 --- src/.cvsignore | 2 + src/Makefile.am | 32 + src/cups/.cvsignore | 13 + src/cups/COPYING | 280 ++ src/cups/Makefile.am | 236 + src/cups/README | 116 + src/cups/calibrate.ppm | 376 ++ src/cups/canon.c | 679 +++ src/cups/command.txt | 76 + src/cups/command.types | 36 + src/cups/commands/CleanAll.cmd | 6 + src/cups/commands/PrintAligmentPage.cmd | 6 + src/cups/commands/PrintSelfTestPage.cmd | 6 + src/cups/commands/ReportLevels.cmd | 6 + src/cups/commands/SetAlignment.cmd | 7 + src/cups/commandtocanon.c | 196 + src/cups/commandtoepson.c | 241 + src/cups/cups-calibrate.c | 839 ++++ src/cups/epson.c | 705 +++ src/cups/genppd.c | 858 ++++ src/cups/rastertoprinter.c | 759 +++ src/escputil/.cvsignore | 5 + src/escputil/Makefile.am | 48 + src/escputil/escputil.c | 1277 +++++ src/foomatic/.cvsignore | 12 + src/foomatic/Makefile.am | 101 + src/foomatic/foomatic-generator.in | 671 +++ src/foomatic/foomatic-printermap | 294 ++ src/foomatic/foomatic-templates/Brightness.xml | 24 + src/foomatic/foomatic-templates/Color.xml | 21 + src/foomatic/foomatic-templates/Contrast.xml | 24 + src/foomatic/foomatic-templates/Cyan.xml | 24 + src/foomatic/foomatic-templates/Density.xml | 24 + src/foomatic/foomatic-templates/Dither.xml | 21 + src/foomatic/foomatic-templates/Gamma.xml | 24 + src/foomatic/foomatic-templates/ImageType.xml | 63 + src/foomatic/foomatic-templates/InkType.xml | 21 + src/foomatic/foomatic-templates/InputSlot.xml | 20 + src/foomatic/foomatic-templates/Magenta.xml | 24 + src/foomatic/foomatic-templates/MediaType.xml | 21 + src/foomatic/foomatic-templates/Model.xml | 21 + src/foomatic/foomatic-templates/PageSize.xml | 21 + src/foomatic/foomatic-templates/Quality.xml | 21 + src/foomatic/foomatic-templates/Resolution.xml | 21 + src/foomatic/foomatic-templates/Saturation.xml | 24 + src/foomatic/foomatic-templates/Yellow.xml | 24 + src/foomatic/foomatic-templates/gimp-print.xml | 26 + src/foomatic/gimp-print-version.c | 44 + src/foomatic/paper_sizes.c | 46 + src/foomatic/printer_options.c | 119 + src/foomatic/printers.c | 45 + src/foomatic/stp_limits.c | 98 + src/ghost/.cvsignore | 20 + src/ghost/COPYING | 339 ++ src/ghost/Makefile.am | 113 + src/ghost/README | 1245 +++++ src/ghost/README.bsd | 57 + src/ghost/contrib.mak.addon.in | 17 + src/ghost/contrib.mak.addon.old | 51 + src/ghost/debian-patch | 40 + src/ghost/debian-patch-stp | 34 + src/ghost/devs.mak.addon-5.10 | 51 + src/ghost/gdevstp.c | 735 +++ src/gimp/.cvsignore | 5 + src/gimp/Makefile.am | 87 + src/gimp/gimp_color_window.c | 581 +++ src/gimp/gimp_main_window.c | 3314 +++++++++++++ src/gimp/print-image-gimp.c | 343 ++ src/gimp/print-intl.h | 36 + src/gimp/print.c | 1319 +++++ src/gimp/print_gimp.h | 124 + src/main/.cvsignore | 18 + src/main/Makefile.am | 97 + src/main/gimp-print-internal.h | 524 ++ src/main/gimpprint-config.in | 93 + src/main/gimpprint.m4 | 189 + src/main/print-canon.c | 3103 ++++++++++++ src/main/print-color.c | 2146 +++++++++ src/main/print-dither-matrices.c | 61 + src/main/print-dither.c | 2850 +++++++++++ src/main/print-escp2.c | 4571 ++++++++++++++++++ src/main/print-lexmark.c | 3055 ++++++++++++ src/main/print-pcl.c | 2722 +++++++++++ src/main/print-ps.c | 868 ++++ src/main/print-util.c | 1649 +++++++ src/main/print-version.c | 62 + src/main/print-weave.c | 2715 +++++++++++ src/main/printers.xml | 1095 +++++ src/main/quickmatrix257.h | 6027 +++++++++++++++++++++++ src/main/ran.367.179.h | 5995 +++++++++++++++++++++++ src/main/ran.509.131.h | 6084 ++++++++++++++++++++++++ src/printdef/.cvsignore | 8 + src/printdef/Makefile.am | 50 + src/printdef/printdef.h | 103 + src/printdef/printdefl.l | 93 + src/printdef/printdefy.y | 213 + src/testpattern/.cvsignore | 8 + src/testpattern/Makefile.am | 66 + src/testpattern/testpattern.c | 554 +++ src/testpattern/testpattern.h | 80 + src/testpattern/testpattern.sample | 168 + src/testpattern/testpatternl.l | 87 + src/testpattern/testpatterny.y | 192 + 103 files changed, 62761 insertions(+) create mode 100644 src/.cvsignore create mode 100644 src/Makefile.am create mode 100644 src/cups/.cvsignore create mode 100644 src/cups/COPYING create mode 100644 src/cups/Makefile.am create mode 100644 src/cups/README create mode 100644 src/cups/calibrate.ppm create mode 100644 src/cups/canon.c create mode 100644 src/cups/command.txt create mode 100644 src/cups/command.types create mode 100644 src/cups/commands/CleanAll.cmd create mode 100644 src/cups/commands/PrintAligmentPage.cmd create mode 100644 src/cups/commands/PrintSelfTestPage.cmd create mode 100644 src/cups/commands/ReportLevels.cmd create mode 100644 src/cups/commands/SetAlignment.cmd create mode 100644 src/cups/commandtocanon.c create mode 100644 src/cups/commandtoepson.c create mode 100644 src/cups/cups-calibrate.c create mode 100644 src/cups/epson.c create mode 100644 src/cups/genppd.c create mode 100644 src/cups/rastertoprinter.c create mode 100644 src/escputil/.cvsignore create mode 100644 src/escputil/Makefile.am create mode 100644 src/escputil/escputil.c create mode 100644 src/foomatic/.cvsignore create mode 100644 src/foomatic/Makefile.am create mode 100644 src/foomatic/foomatic-generator.in create mode 100644 src/foomatic/foomatic-printermap create mode 100644 src/foomatic/foomatic-templates/Brightness.xml create mode 100644 src/foomatic/foomatic-templates/Color.xml create mode 100644 src/foomatic/foomatic-templates/Contrast.xml create mode 100644 src/foomatic/foomatic-templates/Cyan.xml create mode 100644 src/foomatic/foomatic-templates/Density.xml create mode 100644 src/foomatic/foomatic-templates/Dither.xml create mode 100644 src/foomatic/foomatic-templates/Gamma.xml create mode 100644 src/foomatic/foomatic-templates/ImageType.xml create mode 100644 src/foomatic/foomatic-templates/InkType.xml create mode 100644 src/foomatic/foomatic-templates/InputSlot.xml create mode 100644 src/foomatic/foomatic-templates/Magenta.xml create mode 100644 src/foomatic/foomatic-templates/MediaType.xml create mode 100644 src/foomatic/foomatic-templates/Model.xml create mode 100644 src/foomatic/foomatic-templates/PageSize.xml create mode 100644 src/foomatic/foomatic-templates/Quality.xml create mode 100644 src/foomatic/foomatic-templates/Resolution.xml create mode 100644 src/foomatic/foomatic-templates/Saturation.xml create mode 100644 src/foomatic/foomatic-templates/Yellow.xml create mode 100644 src/foomatic/foomatic-templates/gimp-print.xml create mode 100644 src/foomatic/gimp-print-version.c create mode 100644 src/foomatic/paper_sizes.c create mode 100644 src/foomatic/printer_options.c create mode 100644 src/foomatic/printers.c create mode 100644 src/foomatic/stp_limits.c create mode 100644 src/ghost/.cvsignore create mode 100644 src/ghost/COPYING create mode 100644 src/ghost/Makefile.am create mode 100644 src/ghost/README create mode 100644 src/ghost/README.bsd create mode 100644 src/ghost/contrib.mak.addon.in create mode 100644 src/ghost/contrib.mak.addon.old create mode 100644 src/ghost/debian-patch create mode 100644 src/ghost/debian-patch-stp create mode 100644 src/ghost/devs.mak.addon-5.10 create mode 100644 src/ghost/gdevstp.c create mode 100644 src/gimp/.cvsignore create mode 100644 src/gimp/Makefile.am create mode 100644 src/gimp/gimp_color_window.c create mode 100644 src/gimp/gimp_main_window.c create mode 100644 src/gimp/print-image-gimp.c create mode 100644 src/gimp/print-intl.h create mode 100644 src/gimp/print.c create mode 100644 src/gimp/print_gimp.h create mode 100644 src/main/.cvsignore create mode 100644 src/main/Makefile.am create mode 100644 src/main/gimp-print-internal.h create mode 100644 src/main/gimpprint-config.in create mode 100644 src/main/gimpprint.m4 create mode 100644 src/main/print-canon.c create mode 100644 src/main/print-color.c create mode 100644 src/main/print-dither-matrices.c create mode 100644 src/main/print-dither.c create mode 100644 src/main/print-escp2.c create mode 100644 src/main/print-lexmark.c create mode 100644 src/main/print-pcl.c create mode 100644 src/main/print-ps.c create mode 100644 src/main/print-util.c create mode 100644 src/main/print-version.c create mode 100644 src/main/print-weave.c create mode 100644 src/main/printers.xml create mode 100644 src/main/quickmatrix257.h create mode 100644 src/main/ran.367.179.h create mode 100644 src/main/ran.509.131.h create mode 100644 src/printdef/.cvsignore create mode 100644 src/printdef/Makefile.am create mode 100644 src/printdef/printdef.h create mode 100644 src/printdef/printdefl.l create mode 100644 src/printdef/printdefy.y create mode 100644 src/testpattern/.cvsignore create mode 100644 src/testpattern/Makefile.am create mode 100644 src/testpattern/testpattern.c create mode 100644 src/testpattern/testpattern.h create mode 100644 src/testpattern/testpattern.sample create mode 100644 src/testpattern/testpatternl.l create mode 100644 src/testpattern/testpatterny.y (limited to 'src') diff --git a/src/.cvsignore b/src/.cvsignore new file mode 100644 index 0000000..282522d --- /dev/null +++ b/src/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..b2c3d3a --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,32 @@ +## $Id: Makefile.am,v 1.7 2001/09/09 20:40:27 rleigh Exp $ +## Copyright (C) 2000 Roger Leigh +## +## 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, or (at your option) +## any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +## Process this file with automake to produce Makefile.in. + +AUTOMAKE_OPTIONS = 1.4 gnu + +@SET_MAKE@ + +MAINT_CHARSET = latin1 + +NONGIMP_SUBDIRS = +## @-@-@-@-@ NO-GIMP @-@-@-@-@ +NONGIMP_SUBDIRS = cups foomatic ghost testpattern +## @-@-@-@-@ YES-GIMP @-@-@-@-@ +SUBDIRS = printdef main escputil gimp $(NONGIMP_SUBDIRS) + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/cups/.cvsignore b/src/cups/.cvsignore new file mode 100644 index 0000000..bd2def4 --- /dev/null +++ b/src/cups/.cvsignore @@ -0,0 +1,13 @@ +.deps +.libs +Makefile +Makefile.in +canon +commandtocanon +commandtoepson +cups-calibrate +epson +genppd +ppd +rastertoprinter +ppd-stamp diff --git a/src/cups/COPYING b/src/cups/COPYING new file mode 100644 index 0000000..960fe74 --- /dev/null +++ b/src/cups/COPYING @@ -0,0 +1,280 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + 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 diff --git a/src/cups/Makefile.am b/src/cups/Makefile.am new file mode 100644 index 0000000..2580fdf --- /dev/null +++ b/src/cups/Makefile.am @@ -0,0 +1,236 @@ +## $Id: Makefile.am,v 1.45 2001/11/18 00:05:17 rlk Exp $ +## Copyright (C) 2000 Roger Leigh +## +## 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, or (at your option) +## any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +## Process this file with automake to produce Makefile.in. + +AUTOMAKE_OPTIONS = 1.4 gnu + +@SET_MAKE@ + +MAINT_CHARSET = latin1 + + +## Variables + +PACKAGE = cups + +bindir = @cups_bindir@ + +pkgdatadir = $(cups_conf_datadir) +pkglibdir = $(cups_conf_serverbin) +pkgsysconfdir = $(cups_conf_serverroot) + +cupsexec_backenddir = $(pkglibdir)/backend +cupsexec_filterdir = $(pkglibdir)/filter +cups_modeldir = $(pkgdatadir)/model + +AM_CFLAGS = $(GNUCFLAGS) +DEFS = @CUPS_CFLAGS@ @DEFS@ -I. -I$(srcdir) -I../.. -DCUPS_DATADIR=\"$(pkgdatadir)\" -DGIMP_PRINT_VERSION=\"$(VERSION)\" +INCLUDES = @INCLUDES@ $(LIBGIMPPRINT_CFLAGS) +LIBS = @LIBS@ ../../lib/libprintut.la $(INTLLIBS) ../../lib/libprintut.la + + +## Programs + +CUPS_BIN = cups-calibrate +CUPS_BACKEND_BIN = epson canon +CUPS_FILTER_BIN = rastertoprinter commandtoepson commandtocanon +CUPS_NOINST_BIN = genppd + +bin_PROGRAMS = @CUPS_BIN@ +cupsexec_backend_PROGRAMS = @CUPS_BACKEND_BIN@ +cupsexec_filter_PROGRAMS = @CUPS_FILTER_BIN@ +noinst_PROGRAMS = @CUPS_NOINST_BIN@ + +EXTRA_PROGRAMS = cups-calibrate commandtoepson epson genppd rastertoprinter commandtocanon canon + +CUPS_LIBS = @CUPS_LIBS@ + +cups_calibrate_SOURCES = cups-calibrate.c +cups_calibrate_LDADD = -lm + +commandtoepson_SOURCES = commandtoepson.c +commandtoepson_LDADD = $(CUPS_LIBS) + +canon_SOURCES = canon.c +canon_LDADD = $(CUPS_LIBS) + +epson_SOURCES = epson.c +epson_LDADD = $(CUPS_LIBS) + +genppd_SOURCES = genppd.c +genppd_LDADD = $(CUPS_LIBS) $(LIBGIMPPRINT_LIBS) +genppd_DEPENDENCIES = $(LIBGIMPPRINT_LIBS) + +rastertoprinter_SOURCES = rastertoprinter.c +rastertoprinter_LDADD = $(CUPS_LIBS) $(LIBGIMPPRINT_LIBS) +rastertoprinter_DEPENDENCIES = $(LIBGIMPPRINT_LIBS) + + +## Data + +CUPS_PKG = calibrate.ppm +CUPS_CONF = command.types + +pkgdata_DATA = @CUPS_PKG@ +pkgsysconf_DATA = @CUPS_CONF@ + +if BUILD_CUPS +INSTALL_DATA_LOCAL_DEPS = ppd +endif + +if BUILD_TRANSLATED_PPDS +PPD_NLS = $(PPD_NLS_1) +endif + +if USE_NLS +PPD_NLS_1 = ppd-nls +endif + +install-data-local: $(INSTALL_DATA_LOCAL_DEPS) + if test -n "$(INSTALL_DATA_LOCAL_DEPS)" ; then \ + $(mkinstalldirs) $(DESTDIR)$(cups_modeldir); \ + cd ppd ; \ + for language in * ; do \ + cd ..; \ + $(mkinstalldirs) $(DESTDIR)$(cups_modeldir)/$$language; \ + cd ppd/$$language; \ + for ppdfile in * ; do \ + $(INSTALL_DATA) $$ppdfile $(DESTDIR)$(cups_modeldir)/$$language ; \ + done; \ + cd ..; \ + done \ + fi + +uninstall-local: $(INSTALL_DATA_LOCAL_DEPS) + if test -n "$(INSTALL_DATA_LOCAL_DEPS)" ; then \ + $(mkinstalldirs) $(DESTDIR)$(cups_modeldir); \ + cd ppd ; \ + for language in C $(ALL_LINGUAS) ; do \ + cd ..; \ + $(mkinstalldirs) $(DESTDIR)$(cups_modeldir)/$$language; \ + cd ppd/C ; \ + for ppdfile in * ; do \ + if test -f "$(DESTDIR)$(cups_modeldir)/$$language/$$ppdfile" ; then \ + $(RM) $(DESTDIR)$(cups_modeldir)/$$language/$$ppdfile ; \ + fi ; \ + done; \ + cd ..; \ + done \ + fi + +refresh-data-local: ppd + cd ppd ; \ + files=`find . -name '*.ppd*' -exec basename '{}' \; | sort | uniq` ; \ + for language in . de en es fr it ; do \ + for f in $$files ; do \ + ff="$(DESTDIR)/$(cups_modeldir)/$$language/$$f" ; \ + if [ -f "$$ff" ] ; then \ + echo "Removing $$ff" ; \ + $(RM) "$$ff" ; \ + fi ; \ + if [ -f "$$ff" ] ; then \ + echo "Unable to remove $$ff" 1>&2 ; \ + exit 1 ; \ + fi ; \ + done; \ + done + + +install-data-hook: +# Remove unused directories in install tree + -rmdir $(DESTDIR)$(cups_modeldir) + -rmdir $(DESTDIR)$(pkgdatadir) + -rmdir $(DESTDIR)$(cupsexec_backenddir) + -rmdir $(DESTDIR)$(cupsexec_filterdir) + -rmdir $(DESTDIR)$(bindir) + -rmdir $(DESTDIR)$(pkglibdir) + -rmdir $(DESTDIR)$(pkgsysconfdir) + -rmdir `dirname $(DESTDIR)$(pkgdatadir)` + -rmdir `dirname $(DESTDIR)$(pkglibdir)` + -rmdir `dirname $(DESTDIR)$(pkgsysconfdir)` + + +## Rules + +.PHONY: ppd ppd-stamp-pre ppd-stamp-nonls ppd-stamp-nls ppd-stamp-phony + +all-local: $(INSTALL_DATA_LOCAL_DEPS) + +ppd: ppd-stamp + +ppd-stamp: genppd + $(MAKE) ppd-stamp-phony + touch ppd-stamp + +ppd-stamp-phony: ppd-stamp-pre ppd-nonls $(PPD_NLS) + +ppd-stamp-pre: + -$(RM) -r ppd + -mkdir ppd + +ppd-nonls: genppd + for language in C ; do \ + mkdir ppd/$$language ; \ + echo "$$language:" ; \ + ./genppd --prefix=ppd/$$language ; \ + done + +ppd-nls: genppd + wdir=`pwd` ; \ + cd $(top_builddir)/po ; \ + $(MAKE) ; \ + $(MAKE) DESTDIR= prefix=$${wdir}/catalog datadir=$${wdir}/catalog/share install + for language in $(ALL_LINGUAS) ; do \ + mkdir ppd/$$language ; \ + echo "$$language:" ; \ + LANGUAGE=$$language ./genppd --prefix=ppd/$$language --catalog=`pwd`/catalog/share/locale ; \ + done + $(RM) -r catalog + +$(LIBGIMPPRINT_LIBS): + cd ../main ; \ + $(MAKE) + +dist-hook: + for dir in commands ; do \ + if test -d $(srcdir)/$$dir ; then \ + mkdir $(distdir)/$$dir; \ + for dirfile in $(srcdir)/$$dir/*; do \ + if test -f $$dirfile ; then \ + cp -p $$dirfile $(distdir)/$$dir; \ + fi \ + done \ + fi \ + done + +clean-local: + -$(RM) -r ppd + + +## Clean + +CLEANFILES = $(EXTRA_PROGRAMS) ppd-stamp +MAINTAINERCLEANFILES = Makefile.in + +EXTRA_DIST = \ + COPYING \ + README \ + calibrate.ppm \ + command.txt \ + command.types + diff --git a/src/cups/README b/src/cups/README new file mode 100644 index 0000000..812dd6a --- /dev/null +++ b/src/cups/README @@ -0,0 +1,116 @@ +README.txt - 11/21/2001 - CUPS Drivers based on Gimp-Print +---------------------------------------------------------- + +This file describes the CUPS drivers based on the Gimp-Print project. + +Note: to use these drivers you must have CUPS 1.1.9 or higher. We +recommend use of CUPS 1.1.12 or higher. + +All code is Copyright 1997-2001 by Easy Software Products and/or the +Gimp-Print project and is provided under the terms of the GNU General +Public License. The licensing details are provided in the file +"LICENSE.txt". + + +INTRODUCTION + +The CUPS drivers contain all of the files needed to support +photo-quality printing on any printer supported by the Gimp-Print +project. You can find out more about the Common UNIX Printing System +("CUPS"), an IPP-based printing system for UNIX/Linux, at: + + http://www.cups.org + + +WHY DRIVERS FOR CUPS? + +CUPS is designed from the ground up to support printing to modern +printers. In order to support as many applications as possible, CUPS +provides a PostScript RIP (currently based on GNU GhostScript 5.50) as +well as an image file RIP and many file filters that handle conversion +of files to a format usable by a printer driver. The filter interface +is extensible to support new types of files that can be printed +(e.g. a GNOME metafile, etc.) All of this filtering happens "behind +the scenes" so is transparent to the user. + +In addition, CUPS uses PostScript Printer Description ("PPD") files to +describe printers, allowing applications to see the available printer +features and capabilities easily. The CUPS PPD files add a few +additional attributes to the standard PPD specification to support +printing to non-PS printers. + + +WHAT TOOLS ARE INCLUDED? + +We provide two tools for making CUPS drivers. + +The first is called "cups-calibrate" which allows you to do +super-simple color calibration of your printer drivers. It is an +interactive program that prints several calibration images through +your driver until a final profile is produced. + +The second is called "genppd" which generates PPD files. These PPD +files are created in several languages. The program reads printer +driver information from the Gimp-Print driver database and produces a +PPD file for each driver. Normally, users do not have to use this +tool directly; it is run automatically in the build process. + + +WHAT DRIVERS ARE INCLUDED? + +We support all of the Gimp-Print drivers supported by the project. The +Canon and EPSON drivers also support simple printer commands to do head +cleaning, test prints, and alignment, as well as an EPSON-specific +backend that provides ink level information to the user. + +The printer drivers in this distribution are so-called "raster" +printer drivers. This means that they receive a stream of images, one +per page, that contain all of the colors, etc. for the printer. The +printer driver then only needs to convert this to the appropriate +printer commands and raster data to get a printed page. + +We also have a new experimental interface for printer commands using +CUPS printer command files - ASCII text files with printer commands in +them. This allows you to do a head cleaning, align the print heads, +etc. + + +WHAT SOFTWARE DO I NEED? + +Currently, CUPS 1.1.9 or higher is required, as is an ANSI C compliant +compiler like GCC. The code has been tested on a number of vendor +compilers and should be quite portable. + + +HOW DO I START USING THESE DRIVERS? + +Please read the README file at top level. + + +WHO DO I CONTACT TO GET HELP? + +For support issues, you should contact +gimp-print-devel@sourceforge.net, the developer mailing list for the +Gimp-Print project in general. + +The primary author of this driver is Michael Sweet of Easy Software +Products (mike@easysw.com). Mike is also the main developer for CUPS. +Please don't expect an instant response (or even a response within a +week) as Mike often accumulates a backlog of 100 or more messages each +day. + + +COMMERCIAL SUPPORT + +Easy Software Products provides commercial support for all of +its printing products. Please see our web site for more +information: + + http://www.easysw.com + + +LEGAL STUFF + +CUPS, the Common UNIX Printing System, and the CUPS logo are the +trademark property of Easy Software Products. Please see the +CUPS software license for the terms of its use. diff --git a/src/cups/calibrate.ppm b/src/cups/calibrate.ppm new file mode 100644 index 0000000..f8a1324 --- /dev/null +++ b/src/cups/calibrate.ppm @@ -0,0 +1,376 @@ +P6 +# CREATOR: The GIMP's PNM Filter Version 1.0 +576 192 +255 +^]\X[\[\_WWZY[\^_`[\\WXZZ]_XY[Z\][]^^_a___^_^bccabcabb\^^[\^[\^[\^Z[][\^[\^[\^[\^\__\]_[]_[\^^```aa]]^[\^\^_\]_[\^[\^[\^[]_[\^\^`]^`^_a_ab^_a^_a^_a^_a^_a]_a]_a]_a]_a\_a\_a\^a\^`^_a]_a]_a]^a]^a\^a]`b]`b]`c]`b\_a\_a^`b^_a^`a^`a]_a^_a]_b\_b]`a^`a]_a_`b_`b_`b_`b]_a\_a\^`Z^_[]^Z\^W[\VZ[UXZTWXֺνҾҽʴŴĵɺĵϿͽǹɺŷúº~}{~TrVsVrWsZuZtYuZuZtZu\w[u\v]w[u^z]x\y[v^y\w[w]w^x]u_w_w^x^z]x^x_z_z_z^z^z^z_z_z`|`|_}^}_{`}_}a}`|`z_|_|_~_{_{_za{`~a~`}a~a~a~a~`|a~`}`}`~_~_{_~^{_{_}_{`}a}_}_|]y]y_|]y^{_|]{]|]|]|^|^|ZzYwZvXwXtΤԮŪ~}]dUYcQ`j[dk_U]B^ePT^EESws^{v_vq\c^MKGKF>IF:HE8ID9KF9NH:SK=UN>SI;OE8LB5HA4FB7C?5EB7JG:OK?UQDVTEWWHXXGXYFZZGZZFWVBWUB[YF^[G`]Ha\Fb[FaWD_UC\UB^UCZTB[VD\WE\WGaZIfaKhcOjeQjfPjfQjfPhbPhaOc^Jd^Lf^Kd]Kb[J`WG[UEYUDTNBQL@QK\[J^aT]aTqwnŹz}{_cU@=-?9,?9-=8*=6+=5(:2&7/#3+!)#ѫd޶ڥn‹̑¿qgRü˸˸˘ƶ~}}r~lpnr}d~XjsGW_=\fBajAW_6[URSxyEtpFxrFN{}O[]_KW_NXcP\aPYbP\bWafU_eNX_PZcPZcPZcQ[cZcg\dg`jm_gkdlm`ikYbgXbgWagT_gT\gV_gV^gT^gWagXbhVafWbgYci^gk_gmWagYch[ek]ekYchZdiYchVbgVbgYbh[ci[fk[ek[diZcjYch[diZdiXciWcjWckWckWckXdjYfkYglYflYflXflXflXemZfoZgogortz{XcfWelXelYgl]inZglYfnYflXglYgmWdlYflZhm]in[hm[glZekYflYfkVejUcjUciVbhUagR_eQ\bNZaVvVwWtZwYu[vZwYv[u\v]w^w_w]v^x]w]x]w]w_x]w^w]x]w^x_x]w^x^x_z^x]x_x_x^x_x^x^x_x_y_y`{a|`{`za|a|a|az`za{a{a{a{a}`}a~a}a~a~a~`|a~a~a~a~a~a~a~a}a~`}`}a{a{_{_{_|_|`|_|_z_y^{_{]y]y\w]w]y]x[w\x\xXvXuŝͥȥz||W]Nlqgch]qvqZbTJS5[fFS_>>L&}rsl]PK@NK?NJ@NJ@MJ=JG6)>7)=7+<4+<3(:2'80&4,#*"ۻĉhأuשûǾ˿nuֽ냏îzxvx\}YeyVekJW^@NT7[bA^`=]UNxyELlj?\yvJ}|W\]`LYcMXaPZaPZaQ]bQ\cVaeYciS]dQ[dT^eR[ePZdR\bWbg\gk[ehfnpdlmcim\fkZdiT]gU_gXahYcjXahZckYchWbgYci^gn\gkYciYciYci\fk]gk\gk[cjYciXci[dk[el[fk[fk[eiZbjZbiXciXckXcjXckXdkYfjZfmZfoYglZhl\in[hm[hm\in]ipYekYddĥ}Wcj]jo`lpblp^jn[hmZglYhlYhl[hn^jo`lo`mq]jn[imZimZhmZhlZhlYglYfkWdiUahQ^eM[bMZbWvYwYvYvYvYuYu\v\v]w]w]w]w_w_w^w]x]w]x]x^w\v_w_w_x_x_x^x^x^x_w_x_x_x_x_x_x]x_x`y`y`{ayay`y_y_y_yaz`za{azaza{a{a|a{b{a{a{a{a|a|a~b~a~a~`|a|a~_{`|a}a{_{`{a{_{`|`z_z^y\x_y`y]x^y^x^w_x^x\w\w[vZvYuv{||ɨuwyfk]jpbjpbGR,`fLV_;]gGPY=FQ->L#|{taSNAQMARO@RO>QN>MI4?8/94+:4,=6/?:3A=5GB8HE;LIUU;SROO:NM8HD6C?5@<096,72*71+<6/>82>:3A>3EB7HF8LGSS>MR5KN5CB2B@4==-98+83+62+:5/<71<70?;1@=3DA3FC5HE5IE6GC3LJ7hh\tri`ZIKA-PE2PF6TK:WN>ZTC_WG`YGc\H`XE_ZE]XD]WE]VE]WE^YI_XH`ZJb\Jd^Lc^M`[J^XHXSESOAOK=KD6SQFoqmйorkOOB;6)94)83)93):1(6,#5,#3)!,%ߪwȿ̢xWLEfWQ~k[xzxrtuusurqgXfaVTPJkicnk_{zjo|y}~srt~pxtpwwszwx}|uzxy|zwzzkrqrxwltlgnVgnO]eKZbTV\IY^ET\?QXBPTGD4RREwzxپưmngLL?<8.83)72(61&4.%5,#3,#1(!.&ڻtޱܰpÖίQJAjeamicgc^l]X|jĩռz{u~tyvp}||sq~tr|wwoibRidZZUM_ZQYSF^YItr~u~tz~yvvyxqxvpxvnvrryumqpellirpemmovpdngdm_YbKlucqxc^gMPW>RZ>XaDPSAjjR`dCMR:\\@MO8HJ;]_`UbjWekZhlZim\imbkpcmqakoako_in^hm\fl_hn]gn\gn]hn[fm\gm\gm\gm\jn_lp_ko`lpamq`mqbntfpv`mqhqvfmqfpt^knfnrdnqeotanrbmrirvnwxrxyqxzmxxlvwjsthosgosgptgpthqufrvequequcqucqufqwfrwgrxcrwmxvȪΨĤ߯^im^ns_ms`ot_nt_mr`otbpubpubquaptcqubpt`nsaot`nr]kq]jr\joYgnVenTdlSaj\|]{^zdzl}wrk{g|bzazaycyfyfzfybycybyawcxaxbxcxawbybybybybybycxcycyc{dydyb{c{c{b{czc{c|c|c|c|c|c}d}c{c{c|d|c{ec|c{d|e}c}e}d}c|dc}c}dddd}b{c}c|c{d|c|b|b|a{b}a}a{a{a|`zaybxayaxaw`y^x_x_w]wo{fud{xd\]pkkoomzmzֺǥrsgrvf}~}xww}}jlc{|~ZcGV_=bg[utukmjpqqxy´ǵ]Ze6Tf0Uc1Sa4OR;QR?O[3KZ.GP/GM3CM+BI,:9-60-31+52+73,73+76,:9.>;-B>0D>/EA1ffZtpeUL8TJ8WO:ZR>\UB]WDaYGaZG`YE`XE]UCZRBYQA[SC]TD_XF_XIaZJc[Lc\L_ZK_XKZUFUPCOK>LK@62YSKqkejgbhb`^VJjݽ˥p~uyvwsyuqqfnhYc\O[VJ]YLieUvzl}|r{yt|zmtsmy}o{|q~~nyyz}mtogqlsyudfe``\ab`gmkltrajgdkkaib}^xNpvUkr^px_]eIPX>_eHUZ>^cF`dEU\@NOAUXJMSASXJdcI\_aXenXenXemXfmWenWenYhn[inYhlYhl[in]jo`lpbnsdnsanrbpsbpsbpsborfoshqvhqvfqvgqwgtxcptjtxktxiuxjvxnxzlvxkvxfrugtwequerugtwjsxluxlwxmxylvxgrvlvxmwzmxznxzlxzkuxkvxlwylwymwykvylxzmy{oz|s}yàťţЪΨɢŠipogt{_ov`pybrx`qxaqvartarwbrxcrwbswcswcrwcrwbqu_qt]ot_ns]nr]mpdqojqoݰ]|^|^yh~s}yupe{b{czbzczcydyhzh{fyczdye{dye{eycyczezd{d{d{d{e|e|eze|e|e{e{e|e}`uauc}e|ezf}e~g|d|e}f~gf~e}e}f~ge}f~f~f~f~f}e}e~f~hfg~he}he}e}e}c|c|c|d~fc~c}c{b|bzbzc{bybybz`w`w`wjb@~tNyYxpVyZ}YyUn}`sxxllvwȽ7kh]@<Ґs̖ڣ۰ʸrwm_iPej]V_AgnVz~svuaeUX_G]cUgmihcr=Rk)Rm)Rj-Sb4RU>Vb:Nf*Ka*K_-J_*G\'BG-<7482/30+7;*;F(=D)>A*>=.B>1D=/LG9ttl»üɾżµqm`VK6WN:YQ>^VD^VD_XE^XE_WE\VCZSAYQAYQA[SCZRC\TE^XF`YI`ZJ`YJ\YH[VGYSGXRFVSHQPEQQGnqnάvwqRRBEB6B?4;5+71(4/'2,$2+#.*#0(".% 㽾޳c^jԿΪtpc[Cc[X`ZSMC:b\TLD?H>8D94H<7`XRqmfniegeabZPhծ}yn|~yv}||~r\SEb[N[RFVQFSPDTPBkeRkiY_cYnurmx{q}}r|s}p~wp|uwxuyxnuq}OMJVJDTH@ND>B=:NPNcgf_getdtyRdiK_fIfmMnvURZ@YbG_gPT[I[bIY^DLM=QRDU[AuuWba?]`bZgpWgoXhmYhnYhqYhqZhqYgo[jq_mt[kp[hq\hs]lrcpubnscpufsvgtwhtxhrvisxjsxlvzksxivyjsxluyjsxkvyjvymwzpz{kvxlwzhuxjvyjvyivxnyzpz|nxzlwyitwgswkvzjuzjuxkyymz{r{|v~zzxv~t~}u~~ts|˦̦ȣŢu|u]jn_mr`lp^lobqwaqxarxasyetyftwbswbsxftyfuxeuwesvbrsfstivtiuqckjܾ{ϗ&ʛVh3Ni%Je'Mf*Kg'E]'>C-<7483/8<+?O&@Q"?M$AE)C3<7.83*50'2,$/+#/*#/("/& ¥zy}NZɟﲫǛr_WSe`ZND=F<5ULFF<6F93B82H=7C50G<6^UNqkcmhbhe_aXN}gЫҲy~n[riZb\OULAbZMPG=WQHZYPddZb^Rtrdstimrmjrplyymyyu~}~s}j~v~nupnvqirjjjfcWQ\LIRFCVOKkkg`cbflkho]uShmLbeYbgSosUciDmsSksS\fJFN:NVEPT<\\GdbIifCpjBliE^bc[kpWin[jo[jo[iq\jr]jr]ju]kt]js\kr^ineps]jp]ks^ms`ot`otcpufswkuykvwmwzmx{ny|kyznz{mxylxylwylwznxzoy{q|}oy{lxwnz{lyzo{|pz|qzzp{|mwzitwitwkwymx|my|ly|o|}t}~z~xutyzģȥͦȤ¿á㾻pwt`rxbsvcuydtwdswdtydtygvzivzixyn}{p|{o}yp|ylzxesq۠A3Ӵrb~_}_|`|a~c}c}f~f|g|e}e}e}c{e}c{c{h|f{f|f{f{e|g|f|g{izgzg|g~g|g|g~g~he~g~g{f{g~g~g~Q]_IG?OLI^nvijjuv}wj~h~ihg~hhjjjhg~jg~g}f}f}f}f}g}g~g~g~f}hhh}fg~e~e~c{c{d|c|d|d|czdzczcz}qSca?X],tmAyU|YxZnpu~kdrnihib]]H?꾡Ѣ٧ܮܲڵַݭP9{[ٿŬ|~svp\eMU]F`eXy}{zz}z}z}xzxyxy^b`{}waajA1;43:9-BP)C^ B[CS#CC-KA5QG8UO8cdL̿ªum`\Q;^R=_VA`XEaZFb[GcZG^WEZRCYQAXQAXQAYQA[SC\VE^XH`ZJ_YI^XG]XGZTEWSCTOBTRFUTHSRFbc\vyy}´ĵ§stmZYMFC8GC8A=2>9.;6+83)4/&2,%/+#.*"/& Ŝt[TެroVYPJgc^OD?F<7H=8G;6E:5B83H>8B82B73?40A50RD;g]Qmiblidhc`_VNxeĥڶάxbzcS`TFaXKSI?SNHKF>XSGmfThcNjk_w}o{kvybprs~ut~h^aOwzfqwoksnhpkcli__`ODBQFGPHIKGFHCB]_`cjk`hhmu^gnRckYejTouX}[_dAfjINU?2;53?E-F_&HhHdIS)NF7VJ>WP;SZ0kvMƿ̰shWaT@`U@dYDd]Ie]Kd]Ic\I^XGYUDYSB[TBYSC[SD\VE]XH`ZJb\K_ZJ]YHZXGYVGXUDTOBTQFXWJVUI\[PnqmsuudeZMK>EB6EA3?;.>:/<7-94*72(4/'1+#.*"-(!װvc`ܿϥSKHic^ND@I<9G=7G=7E;5B73G=:C93C83?41C63M@8xiZvemcXf^Vkf`jgbfb`_VPn^¥گӲǧn[kTFXJ>TKAWPHWOCc^Nptiiqjitqx`orlun\]FMM?acWlqkhpm`hhajkX]]LCDLCEKEGIFHFDE]_`_hdhngrxgfoQ[dVY`ObhOZ`CV[F[`HPT?FM6kmK]_8]aPvsWzwOsqE}U_ad`pu^pu^pu_pu_quaqwq{y޲ˤǞhtp]mr_lphpqcnn_nubpubpubqvdsxhvzfuzguzkw|o{|nz|p||r|}t~r~~p||lz|stuvus~~s~~q|}mz}iw{kx{n{|o{}ky{ky}jx|lz~n{~m|}m|p~pqqqpqvȧ׮߱Ϧ̤ͦԪХͦqzuiw|iyzhy{ix{gwzgwyo}kxvhvvfvwgvwduwfuudss]knGEB.2<-')`bfh~heed~dfhgghhjg~gh~hg}h}g}h~i~i}i}j}norstnklp}}vݳĞ-32Wcex|vojjjkjkkjjlijlljlljjjijiiikhhg~f}f}f~f~fg~g~e~f~f}e|d|^[9_\2eb7}tPxkOobE}pVqxkv^~}yptxtv|y[B?V1-X55L,,XDEڹ߬߰ڮ٫եէԤԢϠԣѡʙП֤֥Ӡ̛ѡСѦǨ~~~~~~~qurzxz~vxudkYyz}y{y}wywzwywyruyejddh]^dZ`d\nfV]]DOe)OrQvUt#Pm*Sf4Xk6Vt&Qs Tt$Vw!PrFX)><2=;1DU+Ml JoKe!NP2VJ>ZR>X\3Xi.nέ{sreSdXDaV@fZEf^Hf_Kf_Jd\JbYI]XE\XD]XE]XE^XF^ZF^[I_\K_\K]ZJ\YIWWIWUHUTDSSESUGWZNYZLWWJcf]uxux{|jmjvyvvysWUGFC5DA2@<.?<.>:-<8,;5+83)60&3-%/*"-(!ˣu߾rjekoOPJAga^NFBI>:F=8F;6F;6A74I?;C96C96?41A51J;6hXNyhwk]l_OykldZb]Xpkeie_ea_]TMk[ֱֹҪذܶʬǣcS^K>[QHfaSjgVmiWrsdkrhgqpzvUTAQRHbg_hokbjjdkicljhkiH?@MBDMFIGFGECEV[\nvilr^iq`ZaHX^X[d[_eOW]M]bVW\LW]GLQ5aPT6}~[WplE}WrlI]acasw_qu`rv`rw`rx`qw߰ĝ֫Ȟ}w_lqaowaqvcrwcrwcswdsxdsxguyiw|jw|ky}n}~p~q}~n|ly~kx|q~~m|~n{~r~~p~sq~oz|o|uxxvuq~psttttutttuըѩѩөˡͥo{zhz|jz{l|}o|{t}{|}vzp}|iy{fvybtw_sv^rw\mq%(*+-2j]Wdccddggggkiiijjiiiiiijjkiknn}nn}uxxtmnvz}ptsֶ::;Yabv}okkkllkkkkkkjkkkkkkkkkkjjiiiiiihg~hjjhh~ih~g~g~f~f}bb?id;xsGzoNqR|kI}bzst|c|k{npvlgp{xvyfNMX,*]53\87T-*O,,T?A׵ܮ٫ڬ۬שרҤΡդӤϢӤթէӦԨФ֪͞͡~~~}}~|~}~{|{~{~{}|}{|{}||{{||}~acafhbutxTY>ps[{zta\KSW:Mg%NuQw!Sv$Rl+Vh5Yo3Uw#Qw Vx(U{"Oq IV-@>4CF3Ka(NrPrPb)RM8\QAZ[7Se%j<}ƽļƦtipcQi[HcXBfZEhaKhaOhbMg`Nd]Lc\H_[G_ZF_ZF^[G`]Jb[FpZH~[J{ZGuVEpSAmQ@cL=aO?_NAaWJ^YKZ[LZ]Pgldy~~vzzfiekmi~~ee[SPCFA4A=/?<.?<.?<.<8,:5*83)80(7-'1,$-("ϥ{w}Lz~VswNfkBagDpWOHf^]RJFI>9E:5F;6F<6B63K?6-%$#$,,.Wcinkmnnlklkmmmklnklkmllkklmllkllklnjkkijijkiiiiih~g~g~_b2lf@jc<rNvcBvRbwsQypIylCyUwqT~|fw\zkMzXif}|y}r^\Y.(a31Z54];9W/.Z10Q/.Q<<аްڭ٫֨بէӥӥզ͠ѢѣТԧԤѤУΡХܰ}~}}}}ljWwsmRN;PV3Pk$Ov Pw!Pv%Sl,Yj8Zt4Qy"Tx"Wz'R{ Mn%IV2BA6HR4Nl&OwRpR\/TK:[W>Uc,Zu'{LȽ˸~rfreVi]JeYEg\GkaLkbOjcOibPhaNf_La[H^ZG_\JaZFsXEeX^VVMVL_RfVUJ`TXKLDTI\N^L{[Li]Rnnhrwtqxvdkfcf`wzz}|cbXWSHRLBGA5A9-?<.?<.>:,<8,;6,93)90(7-'5+$2)"Ǡ޼ƢjmKn|}]kmRHDNR:ehNgjClkHolExtNYU5]acevwfuudqpٳӥ͡ϧ׮ӨԧҤ˞r|weuyfuyhuyguygw|hv|hw|fw|gw}gx}ix|gx}iy~kz}kz}kz}mz~l}k|l|n}p}w||}|~~~}~~}޸̨zʨج̥ǝܮѥجتԨÿxzssoorp~}m}}k{j}h{~gz|fwxfvxcvy`qu)&',*0"fefghhhhikkkkkkkkkkkklmlkklnnqq~nostqpomntafg&#$814*%'vlnmmnnoonnnonoomnmnnnmmmmmnmolmmkmllkkkkkkljikjjjwqFjd?wkG}mKg^8_`2jk;\\-{sJwpCzqG~Wx[zqQuW~\dhhroobV,(`3/a64[76T20`85a64\53T11R>>Ҵޯݱۯ٬جԨڭڮ֬ج֪ۮ֮ԮҪԮǤ幛̢mxpeYU{tTO=V\7Tp'OwPx"St&Tm/Ym8Xv4Rz#Uy%X{)S{!Nm&JT5FF7M_0Ru$QyPk"TY3TN:U_3Rl#n9VɺvmsiYj_Mf[Gh\Gk`KlbNlbOjcQg`Ng`Na_La\G{ZH^SWRMJDD;;B@;6?8<5;551:2I=F:NCVL]Tpg^df_]aYhkhrtrvwteaWWQDVNDTNCKE7C<.B<0@;/>:,<7,:5+93)71(5/(4,&4+%äxyYuvWXQE\UUZSQG>;D96E;6F<8A63G<8G<8E;7C94@43H83p`SueVqaQXC9hWPl^Q]KAl\Pj`Uh\Rj\O|pcj^UB42B655*)<22D9;=694-2=77`TMzȭݾϮѯӯֶڻ漡{rad]QGF=EHCZ`YaheXa_r~tiodFACJDFFBDCDD@?APSVNY]Y`cZceW^]_ddV[ZbfdTZUR[OahVkoNkjGbdEtuUzzUNM-zvSmhD`Z9_a_|ۧΠͤĚҥˠĞĝozygw{jw}jy}jy|huwjy|iy~iy}hy~iy|ky}kz}kz}k{~m}m}mnnn~poqsutwy{~}zײʞҩÞȠϨȣȠ֩اݰө٫̡yvqppooxx~j{ytxlzuᜓTCCG62UKEiiiijjikkkmlkklkmllknnmmnnmnnon~ponoqqmmlj}SY[-))9442-- _ksqnqpqqqqqqqqooopoooooonoonoopmmnmmlmkmmllnmkmmmkl{sMk`CviMbU9kd?ab3ff6urDyLvHznIthGzWzUZZZfoqvgG;d60d76c74c95c98f=9d:8a98\43U43R=?ԶݭܯӦڭﳐҟ˗|Đxɗ}vsvq}lufmeieqotr|p3spn}zv^_IHP)XW@Zb;Xt,OwPx"Rt&Sk1Yo7Yx-R{"U{'V}&T| Nj)LR7JO8Qh/RyQyNf$RT5ST8Rg)Yx$|H[ļ¸»zrvi[k`Ng\Ig[Ek^JkaLkaMjbNhaNd`NgZIaT[X@A>?ABCBFGED>=99:9A>81?75/3/93J=?44-61NEQIrZPX]S_`U`]NZTFXQFWPEUNCLF8E>/D=/@;/=9.<6,;5+;3)72)40(5.'8.(ȤزΧmoMUSCXPO_XTI>;A63D:6D96@53E86G<8E:6B73>21E83k[N|liYMq`OeRF_ND`LCbPCn^Nm_RfVKn\RqcU|pdXKDB64sh`VJBA40ZNHF:6JA?XTR\YV\SL|k«ٹĥϭͮͫԱغ꿧i\\QD`_Thpbjwl\d`GACHBEF@CBBB>??QUXNW\R[`QY\_eeV]]RY\W^XSYT[baX^QgnPhhCbmmGssP[Z9nnEmgE^V:iiexߵثΤͣɞr{wixykvvmxxx}l{|l|k|m}l}mopppqpqrqrrrqqqrrwwz~جҪʤýͦϨЪˣްԪ֪ɡywtrpͮʞÜ>62\LM&womnpoolnommoooooqooorsrponpyrqoqoqnrpogx~553F>8JE?NJDKFC9>>tppqqrqqqqqqqqqqoqqqqqpoqqppopmpnpnnnnnmmlnnnmmkmYT4^V9b[@c_AjfBfb;haQ4${zlefSkmU_`HamEXv/Px Ov Qt&Sm1Yq6Xx-S{"S{%V}$Qz Mg,JR7OX:Tp+U{PtK^)NR4S_2Nn!e0Rhtq˱½|~utm^kcNeZGdYDh\Hj^Jh_Kh_Md_Mo[Ib\ST9;45?@;<:978?>6745:8953/;26.4.?9cayzJG/-2.1)K=uREYWF[YI^\K]XJ\VIWREOI30=30?55E:7A73@53;20D71gUIzl}pbTIveUp`Nq`S{jZm]LteTm]O`OHp`U_PFmaW[NGF96}pzm~rg|obyl_aVLUMFb[X_\X_][YOJj\ִԸɫणʩ̬նsfg_Xdb]KDEKDFFCE@>@<;>JNPMX[R\^V__OVXW^`RY[P[ZirYltP{djebDddBppLed?jfEPQ8\\ARP8aa`{}uyzqyypwxnyzqwvxv~ٮ~xuvvsustwxzxzy|ywy~|zӭݯҦȡÿžke[&(.'&)E:3|}xypoqpsqrtsssqrrrspu{vvxtsuprrrrro䲱jw{qrqtttttutttttsssrstssrsvvx{}srspsssqppooqqpppop[W5ZT6[R=j<:g87g:7_20a53_43\22U0/M7:气t[QWJJF657##/3C"M)&f2.D;[JɞuTЪȦﰔ̬~xxn]bFU]7biKOS5TW:|zhwZZx/MxPvRt'Sn2Zv4V{(S{"S{$V~$Rv%Nb0OZ:Uh5Uy(R}Mh%FW.K\/Lo#Nxg8ZYv|G_²|wrxx`ihJgaFe[Bg_Fh_He_Hd^I]O..&#$!%#)&'&*')'21::42./GJ88&##+%(#1,GD=:601-818180D9G7_Oim]nk\ljYieT\ZHOM:IE5F@2A<1?:/>9/>6.<3*90)90*;1+Ȭ~uIECb[YA:6YSP=42?63=43:2250/6003...)(6.-WH@uh{nzngSKhWRm`VpaUpaVl^VreZl_Vj_Xse\eULh]SxZPKH<7x{m}qdtfugUp_Iq_iYM`PG[OG[UOf`[a]Y^\YXPLs\Sǧдħåŧ𷝪yd^PSBCOHLHFIBBD??AGJOKTZW^`Y`_SZ^Y`aV\\PZZR[V^dSkpL{{TbbAtvPTV2nnL\Wa;/a32^51]22X12P7=䩒稐ݡyk. ( 0P$!`0,g43B3?;1=9/>8.>6-;3+;1*;2,r_s|UvRNK8_VWOFB?40]VSB73D86A64D;8=52<42:52911:21vkncVymtk[Sm_Xi[VocYnc[le]ibYld\yntj`i\S}uiwWKCJ=9yzlug~pbp^Jr`L|mYqaTkVMiZPwjh_U]UPf_\b]\_][YTOnYNǮŦȬ§§꼩|rSCAB;=GEFGFGFFIFHJLKLORRMPSNRVSXYJOQKRWY`_qv^vwNlmJwyOnqLgkFkkMSXAbhMDI/`__srknmgllgpojrpjtskwvo}{uywwpzyqwvnxxozzqzzq||rtvxx~s}sx|{x}y{x{|z|zvxyz~{yw}|yyԽ!)&*roompqsrvvxwvsuvvvuwvxxxz||xvxvwwwwvwvvutͪ|uxxvvxxwxwxxxxwxxw{uuuuutssrtsrrsrqqZV3D="D>&c]7tnCwqBTgaAc_@niRojVoiPw_uX_i~q^fOoQ?gB9b41f66f66e54g84d52f64f53rJ>wVAy\@rQ8c;,vRB[1.[2.P+$YA[EgUj,,,7=R#!c1,j96C=KBYMxkUs`tWx^ÖgQiwzsPpkEVdPfaZbxr}rXwkMrRxiEZXyZha{I\b`iiOprQ^b@`dIT]>KT:EL8k~cWx,LxLvQs*Vr3Ww/U}$Q| S{$S{$Pr'Pc5Te;Wt0T}"Pu Ga%J`*Ql!RyPrWm-Xl1[o.oɰ˱ǺʻIJuvt{~abeBca>db?eeAgcDfcFi`FG9}bX Zx,'~&%jkËbhms­DKJ_ge͠^^MJHDEALDF?QEIAG=XMKE6667MHynvwkoo_gfT`_KYWENL9DA3@>3?;0>;0>9/>5/;3,;1*ozr~pfsXn~]aaDXROSLIF:6A52LA>@52=2.F;7>50B86;0/@51L@9UKDynqfZuvjqbX{ofzsl}rqmdf`X{vmywm`^QJG=8ynwiwi|o_p_Ln_QtfVrcViXMfVJzk{jwjg`W]XSfa]b_[_]ZXSPkYO¦xUDbTĞݯĦ鹤WFC@79FAEFCEECFEBFFCFDBEB?C@:<@9;B??YZNorP\bBmuJ`i?dkCmnINU7_kLLW=_^_ljfihbigdjielkfonhrqjsrlutmxyozxq}}rxvukxwoxwnvumxwo}zs{zq~rs|q{xm~zn~qxxvwx~}t}{zz{zx|zxzxs~rruvv{}{xrrsux~{||y}ۃ|r'&-}vorsuwtuuwwuuyvvz|zzxxwxxyxyyxxyyvwwyv~fmnlncLdgaxuxwxxyyyyyxyxxxy{yvwwy{|yy{zvststsrqqslAG<MB+WyI}RneEXR9kbGj_FhaOnhRz`{rSw]|ax[pYgF8kH9c61d33d53d52d52e41d52f63_6+{VCpH8^GxY91=70>4-91+dun@D6sylwgx_B@,C=3>618/*>41@61<3/E=9?71?61C96?40NA8yn_{o|xk|rg}ow~vk|wtlcxl{qcw}pgZOeZT?52iXLhXJ}qvhk]Nj]Rf[Rh[RqdX{nr~p~o|kwqe[TQ[VSga^b_\^][UTQa\XukfWG>R70cB7~ky빣컧`IEC87E@@DACC@CC=BA;?=68,+C51:2(JJ;gqGhtKPY6z~YCJ-DN7EO5bbasrjmlcihcigclkgpojlkgnmhonionioniqpj}rzyuqpisqkvvywywukwtk|wn~{n|wmzulyum~vyy|x~s{|t{{{ys}rxstqpr}p|xlt{q{xn|zp~sxv{||t{~{y{{{~x}xOKI')1q|xwwxxyy}xzdYP|y{|xyz{zzyzy}wz{~opl{~y|{{{{y{yy{zz{y}}w~|y}{~|}~yxuu~~{~}uwvutttttUQ+<7OI/{TrJc]7MI,c^CskRtkOynWtiSpgOrlWvqX{uVz[t[JwZJxXHf85d52e53e42c42a20g64c6-oI9tP=wO@zRAz\>kEy]>|\C\6(93F>PBx7,F%#F'%J%%Ja7-^2&k85s<:C>GBaVuiOEthOq[fQo_hIbaDdeE{RvqK]^=ytL{NOPa]S\zQ~P^xjGwSh\>ykJ{nE_Y3SV1S[6NW4S]4]g8fm5jr6P\*LX*LX)LQ-GI/AH#zex\Rv'MyMuQs+Vu/Uw+Q| NzO{#Py%Ok+Si7Vl2Ws.ỮgbGbl-t-~,|1yISoаïmmɸ˸`^ovebu{RgmC>ICGCF?F@A<968430<4RDqdsxhqqdki\edS[XGJH:@<1?:0?;1>91=80<5.9/*{x~{z8;+FI?{qjoXUVBTREG?=<33D;8?41?61;3.C96L?6zn`}vi{o}sxofXfWIyuk[LfYMn^QmYKyoarkZlXDdPBXKDC50hRCvbSvlam^Tk^Tk]RiZPh\Sryxuurzshd^[1''?75ZUOga]c^Y_[V\WRPC;ī~q^E;T8.|WFnߵpYS?53A:AA9<;//4%#-;36?:5w}ZWc7T^;LS5KS<@J4IS=bba{{nxxlvvlrqjnmekjdihcihdlkgnlilkgywru}~}}|}txv{zrsrkmkfpojzyrz}u}~~r{wm~yn|o{pyumpkdqlfqmgpmgrnirnhtqktrixuk}ym}q~ozxs~psxxss|xwurp{{m{{kxxkvviwwk{{mttg-+)qy~zzxw{~YG?^@5}xjkh||}|}|}{{z{zzĝ~q|{|{}}}~{}{yy{z||{||{yvyww{|{~y~}x}{{}z|wwwvDD+22KF(xnIB?ZX9hdFtlMofNslRwoOuZzoUshSza|WuoLkXDv]LwZHlD:g63e53`30a30k>:c51qJ=jI4sO>jJ5oF9gNyZ5a01n51A9B8v90L'&G%%K$#HZ6)mN8d=0k74x=9~BO}KXZabn]hd~rHypFPuiC}YxHlh=RX/IT-N\1Sa/T_-T_.S_.LX+NX-HS,DJ+EI.GL,t}_rUOv$LyMvPt*Uv-Uy)P{MzNz#Pw&Pl,Sh7]nBv}_~vxѢ[h.ew)k|*o/l)x0~Ydaȵй\}Zzg^yPnuBep;cn6co9co:co<]b9ҖyzTHH^A>FEor͡ʟ͟Ҥvxĉ`c{z<7@2>92>91?91>81<6.61)@#JF&DEklD`];b]CmdKqfPtjP~rYx\qSu[zqYlhMtqUf^DeT9hO8fA3c50a40`31_30f94a3.b3.nJ;tR@oM<~[H]H{^CjD2g=0_1.m91{C8z=6q6-N&#G%%N$"]92M,^D-hXAe:2x?<A66Ƣmpէȝʠ٧סΑɄHG7554:8<9FCEB:6=8C;B=LH=54.0*^U~zntwhnn__^MNM=@=3=71=7/>91>91;6/6/*8OEOSPZ^MliS`aIznRYJqx`HE?]VTF>;A42?30;0.>1/I=7?50rlb}wh|ym|qwpddSEbQChWImWDpaT|gTCkWKjZMm`RnbSrhVkaOl^OQLDUNIC<8D=6vk^|psuzzw|}{}}vc\UvuqoS?Q:+[PLC<8I@?<561-0.,-)$$)E1(oUIyo_E7Z?1`IAjdD41A>8761+#$iVMo^]GalMZgD:G->J5=G4:F/aaapnimlfkidihdkietsmvvlxwo{xp{xq~zqvtwsw~tuvwyr~|s~t}s~zpstyvorndspezyoyxpxxqz}torb|bcPssbvvcnxzj{{hWV=fdLZWC:0mjVXV?xv_~zfd[>I?k|u`c[Ckzq[<4jfR}ztxuourjrqitrjyvl}zn|ynzwl{wkzwlvtktqgpqhpoiomhqoiqnioninmhlkfkkfhhdggdeebcc`bc_bb`bd`cfabd`×Zv<+)-13 $BVܫOh~ΚοԀzyn`|=0~@4|?4s3)v6+A5@4A4=2o:/:20/32:)#oIB|ljz}ȡsyŽy|{~{~}3251II*BG"RT-VU8b^D_Y@f\JwmWxnXw[x^shRhfPebHjiM`b@fj=|nLX5)eK9`;0b21_3.e;3e81f61c5,oM8nO9qT?rX>waBx]AhH3rT@xyVCwJ6v;4n4+O&!J,'M+#U=*bX5da<_c@dR=n?5{?:GBHCsC;kXpVkVUBjEP0KN5loH|GJVN[^[mC{TS}O^UJQQ~sQqkOec>WW6SW4RU:GM0RY3X`;OX2QY3LV3HO0HM.;?HN+Z_>gxPc{CJvKwJtPt)Rw+Oy%KyKwMxPr,Q\KUU^NMTTSWIHKBAD̹ΤuyhDS#Zug*tkҾҽ\xVayNtIn@c|3^{-`{+^|)^{'[z&dv2ַ˵;661661-,hhtxا̠΢̗МїllHF32:9E@B=<9<;532.40A<=64.4.8/maw|npoa`aONM=>;0=60=60>92>81:4-5/)YnlRSHXYFsrZrtN|YfrzK{f{lwJv}RJG7]WWIA=A41=3/;0/;0.F71j^TB:6ibZ~ylvrg|rqg[dP>dQ?eSBjXEviZ{bTD[TLID@*''# a[Rh_Pi^TKJGTOJA95MG@uj^{qrx}ysnc~}tuZBW=,`TK[VMYSKXPJH?hj=zk^=^Y4^?._60c82]6,eB4rT>mJ6sT>rX=fP8xeHoY=iV8kR8dN4r\tT>{M>t=2n2+T*'K4)[G2VP0WW2MO/NU2ZT8nD8~ALK;\UVME@B63>2/;0/80-E6/th[kcZA72OFBSMCwuj}sh]PfXHfZMzlaOH@mf\wbYM@@AFDC!!""_[TdWKi[SPJGVPLD>:VRIsi\w}s{~~wzozxmw}x^EZB/`UK^WL[TKYRKZSKTMG?72;2/@73<2/4/.-*+,)+%""%:+$ZEgfejjjnnj]WGI;#XM8QB+J;>0J=$K=#E9N>"SE)rgQlaPkaQ{tbOD3A2sgO|g}xc^Q7QB&I7QE-^P8L#RC(D7K@#F;E=TRBrtnA<(?9]\Jtvj|{xx~wx}v}z}}~x|t}qs}t}v~t~syp{~r~s~uv}pҾԾí}ONJo_8cmwŠ̓՚ܦ*ݪ4>M*F6ީ6ư[VUSMHxĵ}z{~zsj~@6@8D<{B:k60p82x=5B8C8y@6L><^ln`hh8/&U2,`2,X/)qd_~Īŝt}~z}y~~w~zuz{rxztyzw{z}y}}1,0)5.QO8LK3SQ=WW?[[B\YHgbSe^Nc^Gc^Hj`Me\Jd\HUZ7Zd5f_1qg;mqBXX1[M0W6'_-.b<2`I4]H/lP=cD2]B1bM9mXCiT@cP8kYAfZ?vfmH2m3*Q&!O:.QC*RT/QT3UY8U^;VT@lHA@;ID{SF^J8fQiU:0~A9Ǎr}N`}xF{HDOO[WYQYzr@|vFM^vBVsmBlkAoqJbf;Uc-O\,EN.HQ0GS)N[-JT/EN/HQ+\f>AJ(DI,HJ/LK1YsBTt1HsIuLt#Pu*Qw(Mw"JwIu[wENQZ:8B97;:9<>=@AAC>=?;8;ךu{wljejDPt*Ylr÷|XqQtTuRkCc5^*Z%Z#Z#X~"Vz#Zp(Ѽ⾸߻׵зNIK,./###389AEFKBFīرիܲ׮ϔ88007765005431..208382?74+72;/\R}|okpa\^MHH9:7.<70=70=60<6072+82+/FXQSOIEC84<2/;1/8.,E5/j]PldXpi`?61\UNiaW~{qvdZOf]TLFBkd`IGEfc]~{s^VMECBNKK#!#%#$d`[skfcRHSE>VRM^UPHA* 9$/"8,RB#sZ*s;vxrjNIF]XPѕzxh=/P3%=,#;*P@9B-+Ah[}>2t=5E<9FOM)++FHGLKDROF[[V"$$SUW755P2.mgг궯u~y~{}~~|{{-'1*@=)FG-EC-SRTW6TV(kBhS,[]0nvMU[0bT7[2-bD9eVDl_Lh\Kk^Rh\Nf[Lk_Sl_VoeWiaRldWi]Ulbœj0'm3,X*$T?0OE-MN0FH+BC'JR7IG7fE=z?8E>rO?YN8XHYK~=6D>zbpj9y?x?WXd÷lŶlTzAKMjh5cd;nj9X\usERfjBknGcd@Y`8W_7V]:S];HQ2KU/LT0IP0LV5NX7BG,QU8LQ1QR7Qn6Ns-FsJs Ms(Tt/Ru*Lu IvLq(ozp53C-).*(,658?>@315?>?:68ϊ{yx|rnMe,OyVZµ~uW{is}enKd6b6f:g8c0^|.Xw)Zu)Vi(ʸ߲޶޹ҲůOLP+)-001324889.12*%%vzܷթ˜::5577-./.20-+..../.1071512.71H=g\hm]VWICC7;7.;7/=8/=80;5/83,83,CYMRSEnrUqr\emKahH]dBmtMt~XJL=TONTJHB83;/-:0.7-*B5/iXLgXJeXKeZP;5/ph`rj^w~u^WMd[TA?@bbaJEE`]WnphOMCKF@C=981.9:3IF?QG?J:/Q>5C;7TPKA;7KGApj`yzpfypynulyyXXXdd`~eKaH2c[O^ZN_XM]XMKE=F>9?64<3/B95?52FB=KF?GC=DA;@97=642+,*$$/,.;:;BCCF>9|bTğƙtঐОjZŔURM-) +-&3/ 1- 0- 7675<;;;97>: ?;?; A> DD'QQ3KM.ON3SQ5=;<794]XCrs_yxgecP\XCd`Kc`JXS>RK6vtzz||p}wukrx~|uzr|v~jlv|umZD:'C:(ME1B6!9,=18.8,UH3QD.G<"H=<0=-A1UK3|}~}}}}|{xxxxxu}u}t{tzrszmннλϻѾнӾҿտǽ_BtR}Y`gm O<"!("!".)-7+-1436dS6ġ]~[ZVKFDyriЂ~~sC:Q@ǎpo^B9~G?L;zE;E87XfiOUV%&'diiDGI;<[WJYSGZVEa\J]YGd\K\SBSM;PK8QO4YU2WQ)k[2`[/]a2VY2hlGWO2_OCjc\ecYfc]nlbjj\feUhe\caS^\LdbRkj\ke[wj}G=q6.l3+Z($_97Z@7LF2MP4EF/GK3QO;^NBoH?I?bH5ML4_HWFjaKCr]}K|HNZdnjf|O|P]Ry|Mag>TzKnm>knCbd;Y\=keKukLojLjlF`a@ST?LM9OQ5WX>SS;FJ/MR1?D'=C!BOZ`9Hh)Kq&GrKs"Qs0Vv8Qs+ItIs!a{JPQX($,&#',(++(+*'(1.0313GAD҉xmccoqov\HuSH{c_oLsW{^uUnKg@mErNrNjDa{;_x5Zt.Zt-Wm*t嶰㹶۹βOOR''),,-CBD456+**)*) "!C54oo4433:987222121550066;7;7)&01333+5*laTMSGA@5<7/<8.<8/<5/94-84,;4-?VGqw_glLikY`fJ`fL^cHfoQQWGQLJWRP91/4)'1('/'&?0-fVIjZJnZEaVE[SJ93-qlbz}uzvp\VL\MEK@<\SPH<7LK@:=168-?8-\ODH?3WM>\N@]O@t]Ls[MG;6TTO;:5GC=jc\{zus[Svmhiconlttnba`|sogkRfL4g_Sc`Sa^Q`]RNG@LD?A74?52C:6D<6OKDLG@IC=D@9@;7=65<32,!!) 4..DAACCDDCCF?:r\QeTzSE~ӞSQM$-$ '!& 6//+ /( /' 1'1&+" 0&-% '*&63.* +3-5/3,1.969563E>!40=8=6E<B:7/1,5.OI+TO2ZQ6[V=_YA[T?[T<[U;QK/G@!MF&LG#RM(NG%QI$]X2OI#KDNI#IDJESO(XU.RK'PI&SK)LCQJ(QI'MEQK NFJB D=D7K>"ND%A78->4HC'otswvwwwwxyxwxw}t|u{szpxosxlϾ̺̻̺κкмѽҾȳY=kKrQyV}Y{Y +mRdN!!?/+>+).08,-6j7՝'|_2okeNJF^VRπwH?B8~?3nW~V?U@_KB4A6C;;+'MWX\dctvpz}y\[OgcW$D4-M1*U.(pWPΤz{v}}{}& 0/UQ=SO>RM?HD1ykQdN,dT2`U.d]7WR+dQ0{tV^bA`aJTPKjfeig```Wgd]fbX`\SWQDifUeaRzobvK;M@SJm4,k3-[.+[A?WA;MA/EC,87&+(;4%ZI9iI7kD4N=,WO7_N5xI6̟QHm[eU{StlH{QzPnkImiId[@|kJzkJlfIgfKhfIfaEnjFVW0c`Cb`F\YEgaMc^CcaF\]?PP9EF0QS9SR;XY<``B\[BPW3CG*13HP'OR1@a#Fn#GqMu&Vw9\w>Qr-HqIo"pd.(4($%7:.45,)&))''B?@ؽ{ttsv{Ik@H}aRqJf>wY|ZpFnGpLpKkFiFjHkKe{Ccz?_x6[u0Xt/lw?ཱܾԸTTU*))+-.&%&)('&&%'(&1($xwJI3344.-22100/005300..73;854*(-(9/2'tOEELB>>5<80<70<8.:6.94-;4,=4-UlWhmN]_G]^NTYD_dMY`FSW@LHEVNMRLH60/6/-3-+,%$ZOFtj^eT=aTCXSNSMGB72bYNJA6G=3=:2QL?H<.A8.G6-jYL^NBbTDYLAaPCmTFUD:`PCWF9QD9NC9NE>PJDWUP<:6<63:3081-fa[vi_hap\Sxssnopn[[[`a]ztoUjP6lbWheYgbVe`VXSJJB95=43-"!+'0():65IFEDDDDEED?:k]Vn_XXC:Q4'[YYEBMI@TNDYSH]VJ_WIe\Oe[OcXKdYL[RF\UI[SH\TF]VHXSGVRFTPFNIBRLHSNFUSHYUJ\XMZTJYVM[WNXRGHD4A?2RPJb]Sd`R^WFaYFf]Hh]IlbNjaKh_JndNkcKkcIqiNpgNf]BvmOrjHzoNvkLaX7ldC{sRkbAgZ8k^<]R1]T2j`=YP.kb@k_>xlIqgB^V0\T0ZN5>0RI/j`>ofCvV}qRtXy]{tY|v_{iuq`heWjh\opbfg[imbjodjmblnclnbknbik`hkagi\gj^de\̺˹ɶʸ˷̹ͻϼнҾӿƹZBcF gJlN rR{[^z]L;, *((~>ȗ#~f40,-4'vhX~wXTQRNKwŲUC=smm~uPIC9FJ77cmmekinlcPRSOQQSONh=6o7+l:/n<1m;4qRLө{|szxt}x,$/)0-GF5LO;OQ?QOAPMAWQHUPHQMCRPEMIgiJ\cAWb:W_=NO6NR1]`?eeHiiKefIVY9\`@TV<:[Dk!GqPu+[y?]xCRq.Ip"Jm)V_P&*37(Xp?7A)#!735<<><;=)')NJNja`h_\̾renc7gr-M{YMoi|RsN|]dxZmSkMeBjEpIpLnJi}Eaz=_w4]v2Zo,㼿ӻUUQ%$$310535))*('(&%$"!" m<:<<3233--2301.-00,+0/0-0.30/-1/@:L?D9PBUE<;?3::1<:/>;0<8.95,:5.<6.CXFWY?Y\H_aPT[CLR>IL=JDBWPO=4/SIE@62<2/7.-B5/lcW[PEfVBXOFQMGOHBKDZK@i]JaSHWF<`OCTC:UHWHB\\]MOOOQQTTTWWU_^Xge\ol`ok^tpcsoaqo`rnaqmaqmaok_plaif]hf^fd^]\W__Za`Y__Zcb]ec^`_Z]^\[][XXYNOOMPOVYZUYZUYZRUUPQRTUUQQRPTRQURRUSSUUTWVOQORSRWZYTYVY]ZY]YSUPVYRTWM[\T]_V[YPVRIRNAd_Sd\QaYOb]QfaTjdTvo`{sc|ud~wemrnikmol~j}{hyvcrqbnoalncgkbgkbfkbfkakmcjmbpqgnndopemodnodlnbllahh^̻ʹ˷˷ȶʷ̻̺λѻӾҿE7M8^D dHlP +kKcq m J8&5r|oZQH7* B3%}n\d_\ROLwnƺԽѾ̻DZ©̞o\A2fVR_YX5C'#[6.U.(N("L+#;$&B*&5" =BDIKInoeb`Ue`P|xftnZwtbzvcrlY~inh\\[Yde`fe`F%y7/{6-|8.};0s;/lH=rH@rJBwKAhKժ}~se^zI>~;1}8.y8.x:0wH?le~|~~[ZV.+.,qrnaaYpnespm{yv{yxzwq`YNKB/_T?`Q2RO'Z[2SU0PV,MO&TU,~\@P>VFj`syQ<-S5+R4-S:0S@4Q@2zyD6h\dZJ?_Uq:1|d\^QMRHGMEATM@PL3EF.<9(><*IA+IA)UH.\M2WI5SI:PC0fN8uN>sNCperhlWKgVIlZKjXKjXKdQDqXFngPyfQxgpUnhKbeGbf@ooLglG``InnSyvWlqQtsVilJ]d=[_>US:SY6[\;``DZ[=a]B\Y@a_FFH/6TAgGqSv0_|C_zFRp0Io%Pm5GI@# TcAYkF)%'879+*-(%'/*-ͼjVPZ[t4F{ZaʮoiTuntnVeKgFjAf~>_z8`z;_z9]z4[x0[w/gs8ͰʟVVRED;;94)$"3-,1+*(#!$!!&#"I('GG7866//55553311./*).-2/.-s,)i0)p+%<7@7917.@9XA5;A2>C3>@0>:/;8.:6.=70yhlrNggP^_ONVAPTCFE=WOOI@0.TB6~rblaU]M=\YRLKGQNJDB:JB8OE:ND:ND;GB?A;6roh~xywqfzvlurm``_bcd\`b\^^]abffarZnR8mf\lkclk_hg\fcY]YOa_T^[RQMFWRJUSHSOFOKCIE>FB:B<6A95/%#/!!*8010**+(!!'#!;65IFGGHI/*)6(![[\OONNOMSSRVUP\YS`\UdaWlg]pk_leYkfZoj_lf[hdYok_fbXebXdaX`^V][V_]W]ZV\\V`_Z_^X]\W]\Y\[YYZZQQQRSSWXXUXXUZXSTTQRQTUUQQQSUTUVVRSPTTSUUVPPQSTTTUURUTRTSUXUPUQVYSVYSZZV]^X^_X_]Ub`VhdYkg[li[lh[kg[rm]vqa{ueyuczg~kknjklo{k}lywg{xjtshprhkmfmngijcklfkjcnldnmeonfhg_lkbmi`ff[lmahh\gg]ȸǷǶȷȶʶɹʶʸιϼҽҿ |ZH U=X? qLqdkvymO]]`=2-v)$qWõ}ltkk_P|rlgWTQ|rl{tĬپؾپٿؾٿʹiQBU>8pkiPWT276ED>w{y=<1!.+(?@=)&$BA9|o~qi^Py|vhgcX93. +N-*f7/c70c81`5*s_r9*|=5z<4y>8aGجĶwuha`Z[?4g7*n5)j2%e2*d6.f6,i7.m7/l5,c8-`LDttr~|~WXO-*?A/ruqed^rokrpkmlgvrp{vsg_UUF3H?#LD*RM5_S3YL,PO,EQ*EU*W\5|X@NFOHyrZPOE]Zc<9b96\84b@ebH[Z?e`GiaRpnWccGttYfhJgkJmnM`bB`eEchHUV;ZWA[XBZT>PP1TT2SV73P=_ Gl#Tw2_|E^yCPm/Jj*Rk::;/=E/Xn@)+!5/4446425#""&"$#!"%#%յhV+ ؝ +SyCTsХwsqv}wr\eKbCd?^{4Yz/Y{0Y}0Y|/Y{0Yx.QЮͲkj`ae@bfH\WBoJ@\.)D'$5&$#k969:88//12:;553355,-|1/x0-e+(S'$f.+>:A;>7E5\J8BI5AD5?=2=:0;7.;7.dyS`cDiiSkl[CK7JPA>@6FCYSKWUJTRGPLDLG@IE>C?8B:70&&- *4++.'&++##&! )*2,*' (%&ZZ[FGGQQPRRPUSP^[T`^Wfe\ebVpm`b^Tkd]d_S\YNb^T]ZOb_Ud`X_\T^\UTSNQQMVUSPQORPM\ZV]\X\\XQROOOOOOONONRUURVURUVPRQRSSUUVRSSTUTVWWSURVVTTUTQRRRSSVWWVWUWYWWXTXXSYYVWUR^]W_^X_\U]YRe`WgbWmfZlg[mg[lfXoi[un_xqc{ueyg{i{hzgi}jzf~lzkzvfzvhtqespfljajiagh`ee_de^ggagg]lkammcppenobllblmbllaklaij^ƷűıŰDzƲƴȶɷʷ̸κѽ50-ؑvG1&G*U(y vuka[Pjgaynz\qa\V^_aSSR}x}wq][Vb_Z}rоηڿеhվؿ׿ؿٿؽٿ]P=bU?^TBribSegYdcZzlycqvp\bZN~vhe`Q`ZNnm]}hxqv\ze`WBgtoaB>6-*(PQSKJJ.-,upapTM?;NAQA.r_IaT7\T5g^D[I/XD*DI%DR*CM(RP-|R;KCXP|vQF`WcDCoOLvYUkdjVLsYQuoy?6nfidcS_VkciODdQHID9LL9HJ5A;-I;2A4*K:0`@9jD9hM9cO:[H7fVCj_Eaa=dd?b`A]\>]\BZV<^ZB]\B[\?`aC\ZB\YD[[BbaH_XF^XAecFbbEieIbcBZa:]\@_VJZTC\X>]]>RV5T]4V]5X_6]e>V[:Z^?^bFUY7^dAVZ7ad@chD1I ;W!Fh&Vu8_|F[u?Mg-Kj-Tk:4:&WiDVq9WcC-*&($&)%'&%'%#$! Ͽ{lg|b՛՜(Xjճ|~}rqZiPb~F`~>\1W(V)Y+X+W,Xz*VзY\VfsGdqBgeFVH;:k>>L11O65i119945--66552222|'%20g($Y)%S($H# o4275>9C:TI=3B9B:q*$L@c<,TA3EA5=<0;7.<7._pMDE0bdPWZIKS>@H7DL?93:51<41.#!. ".!"-"#*++ )$$'*-++![[\=?=JLHNNKOOIWWP^[S]ZRgdXkg[kg\ieYjf[b\Tid[daWXUK`\T^[T]\T][W\ZV[ZT[ZU[ZU`^[[YT^\WXXTWWTPPMQSQVVVTYWSVUTWUNPMVXTQSPSTSRRSUUSSSRUUUQSRSTTTUUTTTRSSTUQVVQWUTVUQYXTZZT`\U`]S`\Slg[jdVleYleYleXun_pj\uoayscum]|uezg{g{f}i|kzi}yizvftpbtpcli]ih_bbZce^cd^de_bb]ef^ef]hg_if_hg^hf^gf^ff[gh\hh^ĴıñðįðİųƳɶʸ˷͹GFEĒ~?+2:uP`lr hU&QPP\XNic[xto{srGF?GIHBB@MOMmg_}sivɵλy`ZS{Ʒ׾ؾ׽ֿ׿־׾ؿ׾׿׿׿սս־ֽֽֿ׾־׿̜lllhmlQ}pwnRzglmtlRvpXslUfchcE3174H=(F='G>)5/B?*VRFGE?JKK;94{۲wvkSSFĪ˪zqc=1'>)6, waEU9kB1cG:`MAfL>g?0aG:C4,fH;L<1WYT=A9NSJ\a[ad`SXTRWUV\XW]YW]ZY^^Zbbahhbjkdmmt}|luvepqakmozzx}|~zys}irtcjmbklluxvuv5775"<:&;<&AD+MM9HG3OI6ZK>dRDjWGq]Gg[>]S7XH1hD1UD'JW.DK)EI,MM-dS5MBSO~y{vK@pfoc^aOJl]SxeYn_P{j\lf|E>PGlH={cUq\V_QGWF:OA5:3)C>381(=1+B:0GA3N>2fIBjKA~VMxNG{VMoSDkcAlh?[^:`[AVLQ[4Wc;JW&W_9]bD[bB`cC1G!9R#Fc)Us:_{FYt>Mg,Pk2Um=O^8XoAWq>Zs>Vd@88--+)-,,($%$ %#"ǹNB@gRőӓɝnZ`ӱzjw^r[gP^@V,QS$T&W'W(X(|PyVW^U]EfwEjhHSLIKx8:.<90<7-O^=ikS_cPY\HZbECL:@H:HP>XaCxXt_T^TNZBIP1d\C~vsl}{rrmeabZIDASMGUQIVPIXRKZSLYTMZTLZSNZTNYRK\TLZTMWQLYTPSRKWTNb`[_[W`]X`^Y\ZUVVP:96>89?87<42njd~x}ZVP~##FFC34.<<9FHG[__^__adcbc_u]uX<>=#ID0PK6:4 >6$?8%7/F@-51}x^|sXug_OqiPrnIwybrd~Ĝ~pUtkZMK>,72"q`CWAlF6aC4cF5`B0iD2hH8A+ qSDpnd~}sWZYTX]Y^aV_bS^aT]aT^b\cfW^aWbgYbiV`gS]fP[cS]gQ[fR\gP[dP\cNYbP[cQ\gKYcKYbJV`KWaMYcOZdKXbKVbJXcNXe69!4354 ;9"GE0QM:JH0[YDOD3Q@1n[Hr^GhT:v[Bv]IhG3D/CB)=:!WJ?UK6/JA:PE7hZL^PCs]Qze[vcZs_SdVDNF0C?0JC7WLBJA5OL>FC5MM:LM7TE7}SRzRR|TRsOL{XUR2.RHsI8B90QD@RC?SE@RD>UHBVHBTI?YMCTJ>VK@YN@XP?^`AilIlmKbjAbiAgnHemF_iX]@^dD/F"8L$B[(Vr:a|FYt=Qj3Sl6Vm;Yo=Vo9Xq>ZrQZ:AE264+72,lifø¿ѵǶ1+$v_Ζ̝}^\ͭz{b{ftdkYbDR!RQV"V#V%U(b@54.:3_-!_, a>2>7.:80ixVTZ95@;:B=<721RMJwsnzys~YVQ~GFC`a[OOJOPIOPO\_`]^__bbbdbv^wZ=phZqrjie^LE?KD@QKERKEQJDOEA:1.OJB[XMVRIE>7?93HE>A=:2*(. ".!"/!!'(*+&%(! +2# 4&2![[\GHGIJHFECJHE^ZS_\TURJ]YPidYgcY`\Rd`VidWmi]gcWmg]g`Ya^X[WP_[UXVOZXQ\ZT]\U_\Wa\W^]WUUQOONOOMKLJRSRQRQTVTOOONPMMOKTVSSTSRSROPPOOPOOPOOPOOPVWTSVRUWSTURVSPTTPUVPUUQUSP[YQ_ZRb[QbZPf_Tg`ShaTibUkdWsl]woauk\riZvm^wp`{q`xp`un]wo_wqbvo`vrckfYif[gc[ec[ca\]^Y__Z_]Y`_[a`ZXWRb_Yb_X`^X`_Wed[fg\cbXhh`žſǿ¯ðıŶǴƴib]ҾϻҽħxP< aG dMA7?<8A>6D?8FB:01.&&#"! ME:[QDUM;YM8QG,GC!c^>qTpUgX?bT=]N8VG5F8'WH6:.bUE]O8TM4<7 UJ4;3MD0QE/H>+IC1@8%K>&aS3k];seAxjFvhCzqMvU|WumMheJ}v]rxn;ȚΣÞzg\N:tdGj_C~oSfbI~cMbKfO~cLfQgTu]uyfxqc^abHZjJ\kJ[hK[hJZeM[hJZdM[fO]gO\fO\eLYeKXbKXcLYdLYeKXcLYfIWcFR^GS^EP[DPXGS]HT_FVbDS`CR_DQ_ES_HUa&'?5&E;*OI6OG6QG8XN@_RFP>/eO:oZCqS=kM8v_NiG;L(D:-^VHWOANH;NINI?\THd[OTPCPN?bTI[M;mhLbdHVTDEA3]QFLE8HF7?>/NM>XTBRP7L=,F;-LC4ZR@LC5:/ nR>i]>]cF\^E`bIcfKbeJa`GabIfjLfkIdkFflHejGinKhqHclEknLjnJjlJkpKelFaeF\ZDfdLhlJafGgkK`gE_fD]fD_eEY^>]cD[dBZc?Yc=[dDZ`E\bD0F#5I%>V%Tp7_zB^u?Um6Wm8VkZn=Zn9Yn5Xm4Yk8OV;/)(!6.,sjkĸRMT""&MB՜ԙ@g㺸rzgwftbmUW.S!QQS U$X'X&`5a{EIT2vmL|G8CDSU[[DE66j!}.,00,*}/+|**//x)(k*&k&#X#!jGC`I@sHCv9698;;B?/-95=593?7n7,[*#f*!Z<197,liNtkRsn[VZGQX>pyX`eCW`?MU6d\IokdVWU\YYedeWXXXVSNMG^^Z^]Yca^]][\\YYXVVTPOLIMJGHGC=;8:76:53A<8-(%-&(-&&@<7/'&6--LB@?77@53A75?63>62VNKwsm|zu}NKE''#OOI<=7HIBPRPaab`db]cc`dcr[{\?ogZstkkg_PGCB75C76F<:A93a]QE?9VSLZYNYVLUSISNGKIA?<62*(, 0"!.+) /"!)#",&$)4%#6(#6("Z[[EEFHIHRRPYWRa\S^[S^ZRpk`hcWb^Sb]RidXfaTa\Ra[QjcXUPGQNHROIVQLXUNUSLTSLWVOROHOMHRPLONKIIGNNLIJHKKKMQNMPNQSPPRNSUQPQMRRQRRPRROTTROOMMNMMNNOOPQTQTVSRTQPNISRNWVRSRPXVRTRKYUN^ZP_[Pf`Sg`Tf_RibVldVmdWkcVneWtm\ogVys`}udyg~ye{udzsdsn^rn_xrdpl`baXcaYYXSZZUYYU[[U^]Wa`Ycb[cc[b^Ya`[baZb`XdbZbbVklaÿ½¾ľżƿIJ˺b[PƼȴ˶ιϼǰWK,/&2-*50*=9/@;3B=7EA:IG?SOHc]Utnd~wn}ruwvcQuٿԺջӺӻԼ×~ؿ̽µ}|wgfaPNJ@=;/-*%$ !#%!&!&!'#*#>8.E<28.!F<,YM:PF4XL>l^LbQA_RHH<-K;/N@2cVJNB3_TFnbRdYHQE4D:#JA*KD/TH2WJ4TG6OC6_TAZM1m\@{kQeV9`T2n`>`U3]R2cX1wiBnc=pf@pc>k]8pH}lEsf?zWbvnU~sYdyWxX|\`xZ{lPefYFmaNm_JqTzxhQoUH:,@@>IXbGT]HV`KXcKXcJX`KX`KXaHU^IV_HU_IVaJWaGU_DS_CR\EQZZ^_|wnu~n~w~qrpgNTYKT^MT^HT_GVcHVc3,4'O?0<,OG6J<-:+I/!^NB_H4eM6mN:rR=jYa>8;G<3j_V81%5/%?4-MA8G@6C?6JA5ZH;xlXagDOR:2,(<62MG[[CVT@TQBVUBQPVXBUY@[j@Yi?Yf@]iEV_>`jHXd>\kGWiAZi=\l?\j=T_5[g=^j?\f>ZfZh@Zi@Yf;Xf:Zh;\j=\m;[o8[m:GM8(&*%(*%'($%'%"$<66f`fIFL%%*""%#%*21 Teάyvviq_nYdHU}1T+T&S$R!R!V$X+\2\~5`u;}oQk>9`\SSCD@@`%#~97~/0r*(0.q*'k-*u*({*)p*)[&"b'$Y$$XC53;5w9/_*"[( g,!Y9-Ƿ]WD747.+0'&.%#=51<502++0()4-*RKD@51TJFA65B85@62?63?52[SN}zsyYVPzzzQTP[ZUCB:QIEHA<;62][SB=8XTJ[\OTSIPLCC=7IDA?;83**, !-!"*!"+ !* /#!.%$.*($4(%9*&9*'Z[[EFCPPMSRNUSLVSLSPL^ZSb\Q`\Q`ZR]YOc]R_ZPe`We`W`\Rd_W\XPZVPURKVRLQMJTSMURLVRLWVPUTPTROLLLLLLGHGHIHKNMPQPNNNOPNNNLPPMLLLHHFIJHGGEMPNMMMMMNSTSQQQNPNOPMSQNRQMSQMSQNSQNVTOXTN_[Ra\R\WKa\Pb]Qd^RkdWg_QjdWpi[piXnhVrkZxo]yp]}we|ve|wfpk]sn`sm^idWff[ge]abZ_aX[\U`b[[\T_]W__Whf^hc\`]W\[TdaZ`\U_^S_^UºûĺżȼȽȽɹiaU˺Ʋȴȴ˴ζϺȇw)#.*"0-$3/):5,=80@=5GC2(>94A73 PHFNB:OD8@5.=5-&M@5J@3?3)RE5WJ4YK6I=)MB/K?0=2(([NC]Q={mSrWdT;`Q5k]?`T8YN6bV@k^Ej^^S:|\xiLpQ}Z~lKyeKzjOybTDSD0lZA{{hMNB5YMA7-'[YUzxo|zumprn[cfKXaKXbIV^JV_HW_NZdKU]QX^KU]KT[cghpog|ŭ{\nddi|n^uncvba]CQ[ESa<;&5,F:.C3*M=2A2#IC3HB1B5&aPClPgYGO<3;,eWGYNC62%@:-JC7I@3H>.HF5JJ8NN/TV8Yh9U_8R[9OW8MW5OZ6OX5LX3IP1JQ4CK*CL,LR2AF)AE)FI+HH,PR7VW9KK-XY;YS5eP6^J0_M/^W5X`AY_I`fPW`D`fN^bKZ`GXaHW`DZbJX_FQZ?QYCU_GXaFPX>U^BOZ9S_;T^_wA\m@\cB\bCZbBYaBZbAZdA[hA[fC\iA\jCDG5(*,&++*/,*,,*)+#!%!"%"#&""&'(&5:*OU,7Xོȫywqslo^fN\;X7Y5V0W+T(U'V(X-Z4]{9`tFnkWfCBYSKFABEDf-*|:9s53x31~43^'$f/-l-*j-)`53T77V*'V&$_UHER6Q@2k@8y41v2186<7?98575@9;4c3-9Z%m5+̯йyiGG8HO>RYDJS>W`BhoJKN0VUJSNNMFDH?21]VRx~xnhax`ZTXXXXYXJIDghdijgegf]^_]``]`^oZ|_@mcWKGBYQLQHDPGCb^TZTK4.+4.-IC=[WN\]QVTKLD@@73>75=834,*)*##-*+*%$.$#0&$.&%-('/(&:/+9/(9,&XYYDECMKJKJGRQKTRLVSLQMGd_W\WMf`W^ZPXSJTOGSODRMFQMEVPK]YQSNIPMJRMHYVPNLJSOJXTOLKHCC@FECDCCEEEJJJMMMNONLMLJLLILJIJJGGFEGELKKNNLRRMOPONONLMLKLLLMMPRNQSOLMHPPNSSPRQMQPNNMIPOITRKXSN[WMb^RhbVmeWe]Pb[Orj]pi\vp^sl\rl\xr`zsarj[sn^pk]sn`rm`kf[nj_kg\b`Y]]XYYS]\X]]Zba[^]WPPJYWR][Ua_W[XQ]\Ub`XcbXgf_ººļżǾƾƶȴİİƳǶʷ̹˹\YN($/*"/+$1.%61)84-@<5EA:NJEYUOd`Xpkczpx}}|~unc~}xwuE?8|{x-%"+))'*+uuo`jcSaZJXQARJ9OG9!""!#$# $ $ '"&"&!&#*&+' +&*&+( ,(!/+#/+#..#D?2<5*52!2/?6)5*"$$%.& E@4F;0D:+l`SYM@WK;]P?XI9ZL6]R=WJ9=1%PG=I=0>2$G;/B7,XM9qfHk]Ci[A`S=\O;[N9WK8NB3_S=`S9UE.OA-OB14)E81I?2cUFTG/|nRVI.i]@j^9^elr`I`R@XH6p^Dm{{~h3*";2/WJ>vWya@x[eS?IE?M[cJXbHU\FRZGV^V[]~vgzfumb|p^f~qizbHt\BiR:mU=_I4l]KXH7|fMqddaGVb2,2,-(JG842EC1;?&??*>=']UDKE'QN+RQ1ML3FI2HP0MR/kcIOL:UX;WX9SP:ML5PP6UR9NI9MJ8OO:PW7PT6T[;PY9?>(CC(JN0NP;NM>qm`zlYX@JD(RB*K8&B6(<7"RW5B:C,PI3L<'\>4iKBlLAdK;cI4gS[CkR}k~{uyvxyz}xy}yzxx}xx}yy~yw~{y~yw{}zywyx|vvwuuypppvto_YSuncusjsttstyedfpnpssyssxqqu~z~nouonrzuxqpsnmrmkt7N':P'@6060$'"!"*,'#"&!!% #!"$*0(B@z2/x40CC<:;:88w11y21x21h55[EDaKL[??P(&]QFFX6UR1jG:|;:k4/f6*;5=9:66385D>d/-8K@:MB;LB:SHD7/,<514-+1('/'&/&$]TL_XNaVMh^Ri`Vl`UXIAL<6zqdlaNrcUXG;bTKZG;dTEbQDi]QdZP^ULE=8@63<11mhb{zovri{worlhgb_LKLmnoaaadb]cd_ijj__`]``]_^mZ}^Bm`T\TMi^YKDCH@B?=CB>JICPNLKIHPNKLLKCCAGGGLMLPPPPQRNPNMMMLLLGGHJIJGIFFFBEEAFGEMNMNRNMPLKNJJLJJLJLMJPPLOOLPRKOOKPOMJKERQJWTNTPH^[Q]YN\WLc[R_XMa[Mc]MpjZriZul\qkZqk[ngZqk]rk]lfYeaVc`V^ZQ_[SYXR]]YXWR_^YXXV^^Xb`YcbZdbZ\[SZWRcbZ\[UZYRYYP`_Xx|}spgxibSoj\{n}@@9+' .)#/,$3.'50)84->96GD>QNH\XRqnisz}mpp_VIuoctod     % SK;MF5LF5LF6KF5GD4EB4#$!$!'#)%(%)%+)+(,* /,!/,!0,!.* 0,#1/#30!51%53(75(;:-HB8IC6640042E@-aWDFC)AD*:5%J@1^SAWJ=dXJXK8ZL:UH3NB)QD0[P<<2 I=-<0$5,#?2!gXCXK7_P>pbLH;+G;-[OAC4&_R@h]KPD3fYHWJ8TH7eZBbT;^RA$G;0RI9TI9RF0`S7qdCjb>fb0obQykZfYLWH7vgVTVU54 569?#7C :D!JS2?K$DO)EN(X]?EM*@M)7mB;lD@l;4^I\C[BЁq~xtyvvvvvvvu}uuzwu}wu|ws|vt~vt~ut}vu}tszss{ss|rpyj^[mjirrvnoxmmsnlwpownmummvoos|vxkkruxwtkjommokjp=R*=R(=T'A[*Ol4Yt>ZlB]bF]WI[WKZWK[WLZXMZYK\^I[`HZ]HX[H\^K23&).)(0)*/('''"#&%(&&-($,'9A3?D'/J[ͮ|spdiYhRcFbFfJfIbDaB`?X7U5U3X5[}8]w>g~\_cHmB9JK20x750-21895621320.1111a44c>?j88X9:L67]JBM\8S\(aC.78fA4MU2cI1iA3n61w0/u/0}87l34G$%6BξԽST@R[@Ya>NR5FC7RLFb`XokdXSMpi_{q{tl<0+0(%1*'0('4+*WNG^ULPD;SH@QD>NA9_VNcXOwj\aN=cP=_K>ZI<_K?aM30@21E>:;71:43OKEOKFE@<60.+%$FB=:HEAC@:DB:ZVMVQHd_Ud_QQLCPKCXTJ[VMa]S_WMTPGB>8A=8PMFYTMVROYTPQOJGFCHFAFFBEEBGGHIIGHHGEHFIIIFHGHIGLLLJKJEEFHIHEGDFHEGJHIJILMJKOLLPLNONIKJPQNRRNIIDPPJRRLYXPTSLXVPSPIZVM]ZN_\R_\R`\RTPIVRKfbXqk\haRsk\uk\lcUg`SjbUhaQh`Sd`U^]SecXhdZb_V[YRQQNYYTQPMCECEECSRN[\VZYSa^Xlh_^]Ta`WXVN`^Wmnf4)IB2^R>~clsrsyvtytotrtwtqusqvuvwv|stzueji`\[PKG:BA2>;/NI;qk[LH?RMGx{}u# +'!($+%.(!1,&2-(2.)83/?<8JJFr}wqajnr{{ooi + OE6WM:_XFSL=LF7EB7 + +  +  +#GD6FB2GB2IE2GE2HE2HE31/",).-!.-!0.#0.".) -(3/"71&73%;8(>;+?<-CA1GD2IF6EB4@>0>=/72!<: 62+&72/*^V?F@#HB(cXGzn\naOyjUfWDiYGWF1cTeT=WI1MC/KB5&9-^P:bUE6+I<,^Q@ugRh[GgW@zkToaMbW7ha5oe>lb=mc@}rPueGuhRthRos~jzkTz]z]|bnUlk<0#j]N}a{xXrhX?|fsj\M[aP_lS]b`UHp^E|lVvdPi|dr\|olfy}lQj[FI8*I9'RC5eXJ}mY{j-/,-378?"5:AE*@G(GL-DE&QK6VJ1XL6H?+MJ1NL4XM8M:'F?-40$91&1*60&A:-G<3GA8j\Tf8-b]M-(P:2?8361.?:1L;3Q/+S2-P3.X<9z\Ze;3b83`4-Q-$<$;$J@,UQ2B%QK1TQ.`@8d>6k?8mD=lF?p=5bNZC^Gևvz|tyvx}tt~yyFEEB?;IHHLKK_]^vu}ts}ut{qqtsswrr{ppzrpvsska`ihjnnvmmsllnlltlkvontmltmlslkrmlryoltkmkjrjiojirDZ0BW*9S%;T&Jd.Ws9Xo>ZcEZWI\VL[WL[XM[XO[XOZXNZYMZ[LWXKUUGVWA/5$.7,9?5'-&'+(&+(-:3>K:ki9)٣٬a^`ɱ{pjZc~N_~G`EbEhJkNnNeGeGaC]>X9X~7Y;\|=]uCge]`IpGCB?30671.,*0.~1/y/,z.-y.+/.u31_@?^54o31`-.T33eXLHd6K]$ZK-d41]RGK\1Q_.RU1g51s02r./w57t47m::0E+%D?5A6/YTL;4)B4)B5*F<1D<1OE5QN7ouR`f@hkMKE7}kuym`tkbscRwiXsbpaRund4.)0)(;00ZOI^VMXNFUJDSHBJ@;cXR^XP`VLWH8gVEseWvjZyl]vm]G>3IE<]\Sy\NGK=8:1+snf|yuof]Xnje^_[^a`pqkjlicdd``aceg[]^adaoZeEUI>KHERHERLGZVPTQJWTK-0.LONIC<\WOPMBWQK@75;/,QLH?<6=94QKFQKGOKE:31)#$KEBWSO1,)61.hhbfh_gg_YYYAA@CA>JGCGD>XSLVRK\VL[UIXRGVOCZSJWRIKH>A<5YUL[VLRNGONGFD?HE?DB<882@<8CA=PNISPKHHEEDA==:==9?A?FHGCHDHJICEE@A@ABAIIIKLKIMJJNJHLHKLKKLKKNLFJIEHEGLHKLINNJOPJNPJMOIVVORRJQRJSSK^ZNd_Ra^Q^[P[WM]ZR^[Ra\Rb]QlhZsm\_YId_Stnask[sl^ph\mhZfbVUSKXVNYVMje[SRKWVPUTNXYT\[WSSOJJFCCANMKNNIVVN^]Ued\TTLXXO-% 2)8+1$ ,(!=;9swrsvqvuqzyqrtirqhsqfVrvkTvxowzsxtopdcbV^ZIa]KIC4E=/' @<51//%# 96)&"#%!'#*&+' +' -*#2.&/,$-("+&&!MD5^TAWL9UJ8RJ9TM=>91   +  TRO|ukyo`>7)A=/>:-@<1" + + ?:,KH5HE3IE3GD2GC3IE6<:.52(42(,' "!($>:,FA1?<+?=-A=,?>)B@*B?+:6)]ZK]\KefYRJ3KC)LD,g~odSsiStgLjZFiZLWK;VJ6PB/M@0VF:gXHzlXyiSs`HiZDO@.o^EudFh]:ZN4l\ElPtcGj]DqfMdWDbVGm`NiYCwfQbT@i[H_P;k\IXM@]M[=2_60i?5lF?pJBo?4fQdKfOՉs~~rt}tt}ss}wu}LIG<7,JGA@=8ZWWut|rq{srxlhkojmmltnnxonvnmraabfeellpkkrjjkkkommullskkrljpmjpljpkggljojioihnhgoH_3E\,7P$5N"F^-Tq7Xs9Vf>YZF[UKYTKZWL[XN[XOZXOZXOXVOVUMSRKkfHz:i`*HP1,7-.9.-7+7B-ge2#ݥݰ\fuYp_dM`E\}@Z|=cFiJkLnOnQeIeIaE`E_B\?]Aa|A_uGc~iUigy\]o9364.-00|,*s+(31t,+j*&l'"u-)d1/j;:s67o21r..a,,^L=F`.G]&KQ*J?0V^SH`7N_$OZ)T;'j85m/0j//u33u96L''7%$jg[ebWfd[daVeaUf_T_[QKK=u{Z||XttR~^cdIHG3u`vdN}jSxiSygPygRtcNhZHmeYA;4/&%A74_VMf]Tmh\^XMoe\ULFpkbGI?:?7<90pi^caZ`_Y^^VSRK6;67;6QQK|sj\KDvkxqgw|trlkdaea^gebe`Yvtkvwqhhf]Y[][\aedafco]fFXJ?EDBMHEPHEIEBC?<7763@94]XPSQGWSLIEA1,*KIE@>:?=:RPIRPI?:65/-5/.50.JEA.)$963ggaJKCPOGYXY310C@;PLEUQHMI@[WP\WO]XOc_W[WM\UMhbV`]SXTKD@8><2@>7=<7?=;A@=CB>JIDKJEDD?CC==>9FEAJHEIIHJKJAB?BC@@C?BCBHJIHJHJLHGJF?A>;?;@C??A=685684?A??C?=B>:>;7;6@B?ILFLOIGICBH?DG?DI@BD;<\[Z61'ID4@=0/+##"!& ($ % $% !!!)&B>3?;262)'#  +  TMH:3'<7)=8)A;,A/DB3DB3EB4EC6$!"#-+!baJHG2PP;GH5``JnlJpqOnlOPQ=mnSihEjkKxm^uiWnbPdW@UJ9SF;SF6aUDkaOUF7[L>k]MsfXeZO^SFIB66-'J>6PA6SF;B7,dWAeU:f{\vfJrYs[~eqdMm^Hk[EoXpvhtdNr[dU=m_H~pZiY@~^feT:hW;}mTtdP}pVr{mWq]G}lSqiGmo|g~r\VI>2)">73aUBjY@QA3rb}audO3%OA2u^~ce|``Q;xgPu^ktZw]p}yix\lthugh~dvf%-&;2)4*9+E8-3%3%;- D;+M8&V@+ZC,YG1ZJ:cK@B%PA6IB7;9*C@.LD,lG7p?6e]|YSqOGql]D@T7._LCF1)H7-M:.S1*S0)S1+S72dbd5-c5.h:0Q.&?.&cYQ`]FA?'=+ ST3PX.P>0W7/aB5bD8eI9^=-gRw_ցhΊvrs{rs}rs{ts{NLK93)4,%60)TQNqqvqqxqqvjhjkfhllqmnulmtjjpaad^]\jjlhhkjjkijmjjrjjphjohinhhkhhmifhhgjggmjgkedgMb5H^/7L#3H#AW*Ok3Yv8Sk7X`CYUIXQKYUK[WMZXOZXOZXOYWOVSMTRNmb<ְ"ϩz$fe8]_?lk@w2!Ӟۦ  EWgwwc}I[|B^AdEdFaAgGkKnOnNlOcGbGeJcF_C_BaCcFcuJ`v[~nXXb:6;9/.43}-+5611/.y/,0-,*|;:s331034{.-c#$qJBR^/Gb#IX%OV:QeSDc@Ka(K\!IO'R6+n53s32u10>7l649pslomehf_omepmapmcPNDklTgiDpqMloMY[IEE>:NKDEB=B:6VSMRRHWVOED?;74JHG?>;>:8QMIRNIC>:A>8ihaDB=FE>ZZ[@@=EDBJH?MJBPLEGC;IE=D@9KG?PMFTPFTODROFOMDQOGSQIKGCLKFJHCJHD<:464/=;4IHCSQLTSMDC=:967987:8?=BCBGHECFCEFEDFC@AAEFDOQMJLHKNKJMJLLLEGEACAHJHMQMMPMLNLDGCGKEIMINRMQTMMPILPHVUL[ZP\[N]\OXXI\ZOZWLb^Qe`Ra^Ook\e`PkfVdaRe`SjeXtq`d_RebUeaUdaVMMGKOKPPLOOJLMGQSOaaY]]TcbZ\[S__W]\UZZSWWOVUNGGEKMK41(9534/,xQQOJNR123*!6/+$ :5-/+!IC5gaIslNspLroK}sO}uQurN[R6ytSywTbcSYVU=<4 KG663* + + #1-!=9+A>/;7*85*# .*%30' + + +  MJ=KI;LJ6viS`zmRkudLrbIm]FvfOjvxfL~_g~^hX>rVtXef|cw]wgP}p\seRm^JsfQsZvYlcDrswxj]N=oykVaTHA93!7/*RC5$bTGTB/>/$5*$qbQr_GxbHn}etdLs\u]_N9eR;|dtcKgw^mw{`{av]elrYyhQwa%( 7."1':/!>3$90 7+:1!G=.N=+_J5VB-]I4WE4eF8Z4'A5&SL>:=(<:!ZD.tC6zC7tD7uUL}ohdRNN/)Q/(^A9R2*S9.N8,S3+O1*Q3-O4/dad8-g;.t@3P*">,$bXS_]INR31-PU5VZ9E7+L7-XF9\H8\I5V@,bO~h‡qu|{rryrs{qqyqqwSRR95,71*5-%GA=uu{qqwopwnptonqmknjjpklrjimcae^]^ghihehhjlijmghkdfhhingfkhgjcbgkiheddfcfb]Ud_RNc5H\/5K#0F":P%Ic.Vr6Sn5Vd>WWFWRKXUKZWNZXOZXOYWOXVNUSLSPMWP7ү6ԢΝԠפ ݪŠXWZ[mUw5^AfHlKlJkJgGkLnMlMkLhLhMhKcG`E`BdHcFbuMg[wkHD\6.D>>7550/..11-,-+,,--45=>--+,+)byPMBN57x10s01x72s0-V# txqrskff`uslrsjvum\\TKNLIEMICOKFTPHRMFJA84@<8B<8B;7A;5XTNZVPYVPhibDD@LMJVVW0/-:83<<6GEAPMFRPHHH@USJYUJPMCVPF[TMXUKMJAPLEDA;::4>?7::5?>9HFBLLFFD?DD;FF?;<7=?;?B>BDAEFE?EB>A?9:9675;<;BEADEDAB@DEB==9;;8;<9:;7@B>AB?HJDMNHNNIIJEDD=UTKMMC[]QVWKXXL`^OeaSb_RfcTfbSXUH`]QKI=XWIjiXvscjdUkgX`[MgcV\YOTSNQQNNQNNOIUVNXXPTTNDICJLFLMFKLFJKELLFXWPZXRZWPXWPgf_'$ +)&3/.0,$E@>tMKHJHHD@='#!/+']XP\YLTJ>tgXvpVrmCxOsoEspFvuL`W5ysJlhHPMGtqo^YA}X,)GD:5:81&%% &! "!&#$3/*NJ@("1-$63'2.%IG=|v + *'"+'!# )' B@4@>5HE8LI>  +  B@9PMBQOCRPDSQFNKC$'#%!LH7jgAge@fb@if@ge@geAhfBba@ddBa_=eeBkaUbVJtj\?7+,'#740LD;PF=.("LDRF;\TKOGB;3+>4+A:3VKAJ>4I=-h^HpXd~mR\L6zbju~wWsT}_dhkNf|p{lVoaJvdNs[mu`xdtaugU^S>wiN}b}bfl|agS>RB3qbPybmaQ\N@PB7 +NC<5)$I=4:+2&"0$ xkZugSnpZropyiRn_MsbO}gt[iv`p^LZJ8iXFq`L\L=hYKZJ8yhRvfQs]oY%  .%-#0(/(2-><)82#B7*RD5UD/]J6\H4XH4eLf(>7:74578/021-,,))*)*00:933(&~)&f!uNN@UX6XPJhQKkOLf9BZ G^3AT-?HNF'fB4k64f/0j/-q4/c)(uyruuohicvvowwlxxq]\V>=3_dGhlIefFdfG]^EUXECE>YUH{|tbb^}zHHDLMI;B7=B8CF={XHCtjcie[mg]mf_l`]]USkgcGIA=B6<>7B?:WIHeYUwj[S}xvr}kic[VSZUSZUQec^kjga`aWTUoe`l`Zcfg\aa|m[dFcTGB=8ieaLEBa[TfcZRNIa]UWSLC=8OJDQNFYYQ?<8A=:,*++'(-()1'%/# #!(7.-URKYWPZWQihbAB@MNLYZZ==:CB>HGBJHBPLFBA:872;82IF?JG?IG@B?886/11+,*$53.A@9FG?AB=HHBLJGFF@DC=@B:8959;7;<8:=99;7585;;<@A?HHGHHIBDB@A>77500---'..+01/465;?>?=CE>MNFLOFTTJSSFXWL][M^ZLigXfcSYVIjgY^[Nwudqm]kgVokXsm]WSGfaTe`RA@6=B;EFBDD>UULCD394'HE=ID8`YHwnZ{h{nerl_g_;}uNkd>lgArkEZN-pkFYVEYVWFB;mfEwqDkhHRO8faP][P + !31+%#$-*+%"!!!!  %"omg[WQ <:3>;2**%  + + IJ@II=LI?ML@:61    !" XXKVSIVSKXVK\ZO,' *&!)$!)%kgFogCoiHlgEidBlhFmiFfcAjfFkgFliHYSLJA9=2+'!4/,{uhuj\u{ptfdZN:2-TMFti]maRdXJl`Pk`PJF.XS<~hhtowukiifhg|bw[l~oVt_xet^pYnk^JqYhZDhZGzlW}oYvgPyiSkWAfQ0$>2&JA:3,&K?5(0(#<2*D>9XRLE;7>86IA=xhWTE4hVEaQCeVEqaIdT>ZK;YJ9m]JJ=,o]Kn]M:,#,* &\I4NC*WB*i@1q@7v^Voc\gTIQ3)R3*N3*N5(N2)T<2J5*L=.P=/Q:0M5,J1)qfsA0zH5R?P+0#`WOcZNPK9BD*OZ5TX9VK=C;+PE4VE0_I1iJ8zfVuh^rihppropropwnntnlqpqsb__C>995.C@9A?9optlltklrklrjjnmknjhhjifqnob`^[XUkibfbZjd_bcKYZ=hjE``GhaSebNddIljObbCbd@ff?ccQ+5J&;P(Gb+Nm.Ol3Sb=XYHYSMYWOZXOZWOWUMUSLURJPPLQJ4Ϊ?əР֥աԠ֣ ܪܪު !b3jyahg]wzczbqSqKtPpKlIlKnMqQuQrOmOjKfIaC`D_Ec{KetNYulIeknFAq5.<8776755-.//*+,*,*/.655430,+})&r'"t>=N`i0clInhGhTGe:E\!G`9G];HX$F>WD.OH,d83e-+b('e**wyvuvqhgbxxqwxoyysZZUGI:\^@gmFpuPadE]aEOT@BD=_XJvhicy|vYYUXYU:A6A=?=5okfNOPTTT]^]Z\[7=7;>9CA;e^\ohgxoghWO|^ZW_YU_ZT[UO^WTda][ZW\ZY\URyqm\TQ[ZY]`[{lZ~bF[L@PLKVSQLD@VQK\XR[WPc`XVRLD;9NGAJH@XWR<98?;91../*+)$&0%$3'$#!& )""UQKQMIRNIigc?B?OQNZZZ::511*-+$42+20)76/CA:DD=JJBBA9770--'<;4@>9CB6ED=DEDJJIHMIKOJCF@A>?=BE@FHDHKEHIEHHADC8JI>EF8KK=ifVso^^[N\ZMfdTmiYlgVol\daPWUHhg[c^Q`\PbaWaaWTTMWVNZYPLNFFIEGIHKMJNQLTVPGIALPHBD/%%YTC_YFf_IkeGmgMLG7e]IxlD[R5niLia@jbBqdGujS\VB|pNoe?ogDogCqiCh_;l`>^[@`_]ZVU-'gaDpk@rl@wpEypHvnMjcHB=0"  757--,30-#=;:'%#&$",*&  +))hda=97 ??9CB7GG> + 641NNDQQFPQGSSL + + + + + + ZXP[YMYXMZYL^\MD@395&KE2XS8gc>ke9iege>liAlg@id=gcF:+n}r\cTA[N;B6$VL3|oUgozsyjNuYrimjmlSv\gW@iXBl^JviXviUtasdRwkXTH9O@2l\J]O?WL=(!WJ>eUEaSBWG8]ODTH<2)#,j]P-&%0(!K?44&1+*TNI]YVIIHUSUVWXTOM.2#/"K<3ZN@iZFbQBWI=^PBJ;.H;2C7/D958+(5*#>1+0&!*!'4-'0'#A74/# +D9.58!..)&RRKOQGXWNYXPSSFUSH]WQNG?ID9C<0@<(74]P>XB*N@%SA)UC*]A,iA2rNGvgdPD:_ZGM:,P<-M9,M9*O5+S;0N>.NB.M<+UC5SD2F5%wjyE/Q?\GjN<7-$]SM_YKZYAIM/IS0W^:TJ9J@+eO\ushVqy`~c_zg~npUrIpKjHlJoNsPtPrPrRlOgI_A\B^|EdwJclNZslIbgi84m/)99AE0/--,-*+-,+)0-.+1/**,+*(*'y'$n2/T`d/bjIqpDh_Dd@G`%HdD>TDDS0HI!OV&LN'l61f0.i20d(%{txzjhg]vvpwxqxys]]V?B0dhIejFZ_>\aCUY@GL^YJwwpggcuwrPNLSUQ:@69:>7CB;jc]^YUskfUIDyriea`XV_YUsng^YTb^[rnh|u~{v}xqo_\gYUXQOZ]ZwjXbIPB4b`[\ZTJB?HDBD?>:42\XRQKED:7ME@;71630956A=;2--2+*60.1%$4'%#$"UOKWVRXVQgfbA@:LJFVWW'&"00*11,541==;FF@><3A>40.'A@9DCFC@:==7POIOMF5400/)0.)33.9969<68<88:634112/551:;9@B@@A>8:68;6@B>@B>CFB=?;;>9@C?BGCAEA;?;jd?nhAsjAwmFukCznH{qGtJxpHleDgcYmhaIA1OE*}tMxoIyoJ{rIxNtHuP4/$QNM21-0-,%!533=<:/.* + + ! 1.*WSM @?9EDcc>cc=_^9_a;Z^9'C91XM@vl\PC5p`teSf\QkcXbYN[SJsj\xbktkxrxmrhd|}x|]}lSwcIpXjXA|fQF5hZKl`Mj^Nj]LqcQj]OYM@XM=WH;eXK:0'/%LB;=0(-"%5'#9-%0& ,"/%!&#+"!"/'&HDASOKNKIFEFIJKRRSRTVDC@zn>0'91/>30PD;\K><,0$:-'7-&&,"#*" &"'&'$,$ 2--0(&.&!6+*7<#11+(77)FG7AC3FE=GEK@)YB*K>$G>$S>'[>,p]T[KAPB4hjVL;,N8,M<,N;.S@3H6)N?0SJ5MC0QF5ND0PC7odgTo[q\jYF92(ZSIf`KWU>MN7SX7SX9SJ=O@/[Mk[fKibLh^Hj_H]YBffE\[6FZ5M`6Rc;Ma5>S-7K)>S*Fa*Jj*Kh.Qb=UWGXVMZXOYWOUTMURKQQMLLFw2߳ӧТ˙ӢΝϛҟס 6ez|Y}`\|`^eroTpIjHjJoKuQwRuTsQiI`A]B^E^vFbpL`fN^qnG_ee40h&#;<;<00**,--+(&'%-+-)-))()&++,*y'$g(&bbh/akGorDhdD_DH`4KiUCXSFZDH`$IXN<%W12UD>\,'[&!mcjkUvz{pwyt\\WHJ9OR2imI_dCY]>W^?GM;AC<^YLtvpklhtwsUUPWYT9=6;A8CC:}aTPcTOxsnz{xqga]e_[mgbIHA;@9><4olhWZX^__eggUVU8=5:<5CA;ogb^WSbVS`KH|w`\X`XUc\V{rlf{v}s|}iVRcPN\ZWZ^\wiX`F_O@fa[VRLJC?F<:JDAC:8KD?LFASJEMF@VQINICJFAEC>:756/,1)&0#"4*&#!$ SMJ<96SPLde`BB,+&'(!32/:92@?9<;3PNEIF?>=666,,+%86/DB:<;4ED=JIB>=876033.776?>:=<6994774--'..(--)--)--*+,%.1-35133/574;>:<>;<>;9:?99<8FGAJKCLNEHLC;>7>@;OPGVSGRPBOOD\[Npm]c\Nc^OhdUYWGDD::<4VYNDF?CGAGIDDH@MQJ]_WYX;4{UOFѻ{l=;3JICKJCLKD  PMCZWJ`[IebMf`Ld_JicKxoTtqRjgFidCe_=]Y8eaAZV3^\4tyaumnhqkjoWubKtbGw]grW{iKuVz]nuXp`JYJ:3&\QERF9ZM>m_MYK1-$*!-$!*"%(( 7.*-#4(#+!)" QKIXNB23!--($31!BD/IL2FC4B@3@>2A>3=:0?<1A>/;<)=<,??.VN;S?'fT5O@&KD)GE)KM3LG1SQ>geUN>0N9-N<.L6,UC5G>+OB5OG4UO9LA2RF9^ULqgtd{is\j^Lb\O]VJjfN]\BTU8WV;TQ;_WIaJBsRHj]wcTi]Ko[{m_tm|vr|vmzvhpeUgZDl_Nwl\pbQph\a]Q\TMgbMa`FukWjaKqfTrdh_M_^@`fBYY?VY;daGccCY]=ehIbdFehJghH`[CZXDb_E]\?e`E]]BD<\VHrtmhidtwr[[VXZU8>5:?6EG;^RMpgc[VR[SOVPM^YWjfcqlfGG@:?9<;2omhLOMPQRXZZ>?>:=69<6@@9leaXPOvr[GC}vXRMzsknh_rnff`ZXQLkcYxpftlc|ujyoh{rm[]ZXZXxhX~_E[J8TMGA96RJE\VM^WNUOFYRJLF?VPJJE?a`W^_V[YTTSMJGD@:6?953*'6(&##% (#%701OGFdea<=7:85ZYZ)'!'%(& .-$=<4GG?@?8HE9<>;683:<9=?<:>:8=77:313,560695:<9@C?=@;?D>CF?@D=8;49<5=A9BA;02,34.;=5AC9LNDKMDPNGVTJZZN\[MHI;BC6GE8]ZLXUG]\M_\N[ZN\[NRQFVVLbaTaaT`]QMKATRHWVLRSI@C>:A;BFBGJECEBLOHPUKRSM@B?>?><>;364EIFPO2RQ4ZV8c]@h`CkbEphHqiKsjJrf=qiHrjHskHoeFoeEogFjcAohEkb?peDldBlcELJ<&$)MIF]R9tHyqJyoIzRwnJ}tOvNniL&$! #!NKF,('51,532;<;HB4|YlfLJF361#($  b^[F?:`WJɱ÷tl]LIBHF=ED:1/(<91XRfdBogGldFzlYyexaeWEiZIvan`N`PCG<4TLCnu}l{to}ft_TD4iXEt\xjx_huZmRlX>aQA:.&3($LA8J;1=1)L>4RD8`QBrd\M@J;2=/)5*":-%+!$%! %?5.2&!1'$8-*0'"2*'!' f`Uzwjwxlhmb~ytyruyrwgd[F:.A5(OG7wbUK=A5)F:'<.!C922)!PD:PD9uj]4+!B:2YOG/'"2-/0+.B=<ƶ45#66$76"77&9:*PU/B>1><*FE1LI0bT5cD,[L5b_HJM/JM.Y_Ic`TI7+VD8P=5RD5VK9J@.LB1_XEVPZ]>[]=^a>^b>]]CTW;`dF`fC`g@WZ;YXD`bAZb;_b>af@nqFeeABU1J]6PaQ/AW+Ea)Ii*Lc4PY?TSIURKUSKTRKRQJONLWUHҸW۰ +Ҫ ͧԪҡОԡ ̠}YCnOuR~O{YW\SylnvStMyT|UvSrOlKeF`D`E\qC\gEabLbdO_maAVZ]..k)&j1.F@31993254+'*'+(*'*(+)*((&{%n$i#kWY-`g;dh9]^>\SBbXCecB[LKdTFW1GQ$?N5=SRJYMP8!W%$yOmnJjeTojnZZV7;2=B/^b?fkBX[9LO5EJ9BC;\WKmohkmgpsoVSOPSM8;4:<5EF;zjd\hd\jdZpf\ldZiaYh`Ye`ZBC?:?9;;3mleMPNOPQOQRCCD8<57:6<<7g_[XOLaVRsjb{tlibZia[zvkfcXjc[xrgysiymymwodibWytkyvn\[YTSQvfWbH`N>haZTOIf^WfaWd^U`YOXSIWPGIA;RNHdd]_`\\]YWWULMIA;7>844*(4(%%$&!fjm@BELJKa`]33./0+VVV&&,,%..(65/00(/.&45*=;3;90-,!22*DE>BD:ED:ED;NMDURG\ZPIGB99165/<:6:73//*++',,(,,),,(220788<<:=?<:>:<>=<<:>>9;<:55443043-24/03/47037146236257147003,24-.0)02+/2*35.@B=>C<>C;?D<;?8=@:EF>LMDRRE`]OcaS^]N[XLZVHc_OgdV^ZK_\NdaR`]N_\N_[LVSFTQGNNDLMEFE=CE<:@;6<79>9CE?LNHOSMTVNY[QUWPPRMJKFTVPRVRkdGlbHh`EldGpiItiIvkKqgHohHjdHg^AkbAbY6hbBh`?d]&!952422=<:XT?wnArh@phAleAjcDcaC``CUUBLMGJHG841i_RŮʾ}eC@,A=*D?*?9'40&NH5VL-WR1XQ1]U6cW:cX9[U7UR6XR8`Y:c\?kaE_X>d[AoeHl`EiaFiaDf^Ac]@oeKc^Dd`B`ZXQ;a^Hxm_t^q^r`v^v\|xSvsQcYJehJmpKljJedFegFpqPphUskSldKleLniOikMnkTlfQdfEgmHqrMebE]XBeeKc`IkhOpkVjdT]_K`aHjhQgaMjfM`fAfhLgfNhcIonLV^6bhEU\6\a:]^CX]?_fAQ]4bmB^e@TZ;gkFZa5bl@^d=joDad5@T-HZ5K^7I\6H[6H\7EW3CU+B^'Ed(Ja0MYAGFG\\T>=7863VVV!!$$)*"00)660==7LIATSIGF=YVLRODA=4CB:GF6:>6;@:7>6?A:692AD;>B9VUJNN@[[LidU`]L]XJSSEVUHYXKZXKXXIVVH__QVTIWTKEE=AB;JKD?A:8:77:7=A=;@;6;4/4-36/;@97:6;@;ELDAE>>@;RUOj_Fg\De_@e]@f^?^V:^W:a[=WQ3TQ4RO2UQ4TL2DB%PM0PL0LH,WQ5YQ5^S7QJ0>:0%"%1,*IFE!PG/OJ0OI.RJ1WO5YT6WS8[X?2/#",($=96)'%:98:86WR<_X6OJ+VR2SR3RP3QM.OM/SRIYURA=:($$dZMδg((66AA$QP6QP1]Y:b[;aZ:kdDmdAj`G<1I<2L@6RF?I?8B71A51>41D;5A94;.-9/-)(0$!6.*OFAQLA>7,4+#2)!;4-̴éбҶ¥ͲǨִ߿׶ʭ_TKvl^~H>5UI@XOH{ws[TQ/,%,(*&EG8MP8Y_AYaAVX>KJ9QQAFB3VV;FH/JF7JG5JH2CF+BD&`c?UU5`[CIH1JL1PR2\_HbbXM>0TF0]R;XK9UL5f^FKA-aYCqhRvdt]t^tbpaKvjP{sS]noIgcKchKehCipDchAcjEemDloOjjKlnLglJjiLloNkoNllPglJcmDkqHqpM\a@biJ]bCejJflIggK[`GabI^_B_cC`e?`i?Xa=]eE[_BU1K_8I\7I\4J]6K]7I]7BV-D^)Fd(F^*IV7NNBQLGQMIPMHPLGGKJz|Ī:ժխ9J?>!ߩ Р +CH|JxM{PPSRT_]S~e|KoKrPrPmJcF^~C^xC^qE^eEccLhjTgpTegIddS0.n/,Z-,b(#5051412-)&/+-)0-/+}('.*y("{)%p&#b$gED4^e;koLFAHIA`_Yihc;=5>?6C@9tlcrj^xqdynatiYul\xpdpi`sldvodxrgwpfyrh|vkyrflfYb^SgbZc^W\[QtgU}`FaN;`YR# .)+B=;nnfklbjjaih`eh]df^bc\^`YYYUUTR955@<7?854,(/% ""ADI;77=.(F62[VOUWORQMXXV54,BB9FGA<;377,88/96.22(42(41';8.IH>SRHPQDUVL;<3:;39:5DD=<;4++%&%'&*'!(%)&!..)..)..**)$('()!.2+47313---&0.*-,)23.25/7;4<@::<97:59=946100,895:;77935717;4=C:7;45:38=5@FA>A=:>76:29<3AD;?@9GI=QSEIIMM@<>349.380;A7>E;:@65:08<49@5;A806.4:28;713/.1-4958?96=7485.2-051/40061152374@ECe]@jcFtlJriGogGkcDe_@`Z;VS5PM3QN2PN2RM2PL0JK.GL,LJ-RM1JF*MF,JF.50) #,)*?:'<7'62 5/84":6$74";8%>;)43$,) &#)%'#.,)850<8&@>$;:#>;'>>&01<9%EC9HFGHDB0+*% tˮ;u=?#DI*IL*RU3YY8]Z:jcBjcAd^;meAujGjbCh`@peGe`?fbBlgHg_BdX=e_D\Y<\Z<]X:bZ>f^@_^id@c_;[[6a\<[W8XV3^]<^\>caCzl_h\Re\PsiYvzhsqeQVH=:0(cTEvdLo]G`O>G7-G92?0,:-':0*3*&1($6+&1'"4*$,"- =0(@4-C;5?6/H?5I?8C:4D90J>4A5/A717,&C71$-" " )"!)!)!VVLqsfup|ov|kr|hyqfo^itfdo`fqaah\W[OUXRKRNDKGGLJDIEPTMz{sac\IKIEGCDID\_YhibTTPOPJSVJUWMILCXYMnq`vSOF~qz}CB4($-*9;&TZ8V\9NV3`fDQPZZCqqV\\BbdNbbOUVBPT@agA`b@QR9LO4OS5VX:dhKbcNXL8_W=d]C_Z@daDllJ_Y?g`DxrUtkRlgIqjNiaJigH]aR\;[d=~{Q[_5Q_1P^3al?^j=[i=Ze<^i?_n>]h;Ud8Wb6dm@`k>al@bi>ho>BU1GY2G[1EZ.G]1L`6L`2DZ*D\*Gc*D^*FR4LM@PMGOLGOKFMJGT]\`ЩҨ#Х(د'45ޥߦК6IuIyKzNyQ}OPSS[X@\IwRpLhHdFbD`|DavF]hC^_EffOjqUjvVleWwoB./d+'[)'_(%t2,41;:3/)'-*/,1-4-'$})&z($x("o("g&b1.=Y\7jn;df>bc?]XBYHJdT@ZDDX6:K>5H>DY:BU.FI%B0nlNebLsm[W~RqcocYilI[_FLK9E;/B8*2,"2/#0/"-*,-$=:6caXbaV_]Ozth@6*22)1,&80)3.'A5/bSCrgXxwl}ymzmyekx^zerk^zuh{wl{o~szuuobneXuiYxiUujZkbV^YNufQ|dG_M8^XO" /+,C?;nnfkl`jj_ii`gi_eg]bd\]_WZZXDDBJHF@96?646,)1&!"" AABPE;\I>E60VRKmpglog\[Z43*.+$00'@?7FE;98/78.9;0QRITSIDB9DC8FF:WUKEE;<@658.02'34*)))+!**#'%)( (&(' '''( &&,,&3409<7=>7673451561562795<><<@:36/25-3614719=5;?:8;57:58958935928;59>9<>95:236//0(-0&-0'.1'38.9<25;/9?3DGA64:058<616-/5-59213.4625:59?99?;:A;7=78>98>9;@:>A:@E>9@:GMGf`B`W:aW7j]<`T4d[;bV9ZT4RR/US5XT4^\9\[9VQ2LK.NO0SP2JF,TO5OJ/OL0>:,!&")&-/.-20313051 94%72#:6%-+0-51".--*($,(($)%%"(&&#&#+'EE@HEE<87300ζɻNJ,UU3^Z:`[<_[9_\:c_>a^:`\;`]<]Y8a]=ldEe[__=heA`\;bbBVQ5c]Bd\@icA^Z;b`B^Z;ba?[];\Z;dc@^^;WW3[^7[`;YODsi\xwndWH;0%]QGTG;"_RF`O=@2&N?8- $&$1'"7-&1)$91-sojw]UK6,&>50;1*, (3+'5,)0)#&&)mg[uI@7:4/952WVSgiamphuxkjqeZbUV^OV`QIQGEOFAJB?GDEJ8@E9@E3;@9BG7@E506:7<@9?A;AALNNIKLQVWINPNUS3998?CDJL=BB?DCEHHDGG9><;??CFF;@>;@@VV?:;$30FK.]iB[e=biDZ^@ZZA]^CdhKaaMppQWY8hoMbeMhhRSWBfnC_fgq>an;\i5fo=fn@djEotNlvFnuIenCfoC`jAclDgnDntFryIjsG`j>^kBdlIZg@_iBclK`iIgpJrzN_j@co=lxDbk?O\7Vc:yyN`a7P`3Wb5aoA`o<\i7`i;]h9`n;`p?Zi:al?`k9]i9am=Xb5ak:9N&;R&9Q"E\+K`0Oe4La0EW*IY0K_/G[,FS3IL;MH:L6EY2BS'CI%F@%_]9:5\U?WP+`^9<9//,-*-*-/247$97'OC7PE8TE8XJ>MC5MA3WJ><3/ba]hf_ee]daTPF7C=2?4.C8/52*9/(`O>xp_{{dex_~dqz{wehsVz]|cuc~bFbP>uvk0-+0++72.onejj_ii_gj`eh^df]ab\]_YHHEPQOHGD?96>656,*2)#  (!!LE?\M3POHHI78<8<)53!65!44 ::'72!6051!40!2+3-51#4/"-*62#*&0+EC@GDB2.,;73-'% ]QDɼ5-G@+IC,QK0MI,UR1WV3SS.SS0YW:QM1_\4/=3/G=;)## -%%)6*"'(* .% <3.LA9D=6OHB4+(3*%<4,]YN{umn\vwggi\TWQioenthkoedk^]eX]dY`e^TYUX]ZTYVU[XDIF:AA:@B3995<;:?>5>?7AC3<<3<>3<@6=B5=B1;@,2519>19>/7=4;B39@4:?07<39>17;-13/373:A6C=BJ>FO?FObeCY`:IK.X^8kwFgrCenBjpIcbBikHgjIhjMlmKgiGlsKglDjkG]d>dnBbg>`dIefUffRopQfiIkpNrsOfj@nsIkpHejGlmGinGcjAdnBbiD`eBkoGglD`j?\l@_i:\qm>crAlvDgq>eq=Xd1_l9^iMZ0Ta8opEnj>N_3Tc4ftA^m6`n;`k=Zg7^l7\k8Yh8_mH'͒pdiVV8llMc]eg>xyTooD`zZi\>OF0E;)^T;dY@D@0[ZNcaUdbVxvnHE95=654+*2'#V?=YD6SE1RF2gQBgZIri_ilgVTU+("10+<<7BB:EE;12+88343++("&$#"*("01'),"-/'03*69/9<3/3).3)-1'.1(.1)/1)14.AE=JLD?@76:015*24-//)00+55299755243/44,35-15-.0)--(/1+03,15-05*-0'.2(47.7:33705:54:114*690.3'+.%.1(<>5:>4=C8FI@24+34,?@7WXKMM?VRDC@4B@5NK?WSFXVJGH^X9\U8TL3UN5XO8WL5LD+GG/PP5NM3HF.FD,AB)DA-F@-D@+JI0OL3PM6EA.GG/BC,<<(DB,@@*9:#8:#78#79"33/.351044 232274 ;7$5/ 1/96!74#<85<88,)%=:5772($$&".&}i-(3153!.-635397BB$EG(EC(E@$KC+HB*OK/TM1XT5JF(TM1QM.NJ/aZ>OM.SO2^Y:\S9ZS6b\?^Z:WS5\U;WS:US9XU7XW9NN3RR6faZj`VzocSJAXLERG>% +$3(#(1%C8-G;5<4/?61>63$('C95>75|xouoiwrlpkeid]TLE{zuz|k{svndf^[\UMPHRTJPTIPSISVLINCIPDPUN_d\TYUUZWTXRQVP\_\jll]a_MQQV[[KOP?DECF>CFIMNIMPJPSJNRMRTNSTQUX[^`PTXZ]_OTTNRSIOTMRWCIMDJP@HNGMUdn=cmBUV4kiBkuGitBnwCjrEquMouFelBosKtxOek@jtEbn9x|PfoBlwGkrHmqLvu^llRosO`fAhmJksIs{JjoEkrC]c?elCaiAekBbkAZe=^gAmvFiq?hoGXg9Yf9~SqCdr?ksDjsBZd/cl;Yd1muFT^1bn@iuEbm?isBdq>\h8Wd9`lAmxBm{DfsBdtF^l?muK`h?bo@grA^mJ':D FD#\V/^Y1db7``1ig;|yK|wFEO\fhhlxmuX~Xm`cvyXiiqvXmztyd~ov}j|sv{jmsbkpainYhmYqyh{tz~|lO_M2L<.L8*rS:gYA}oiFXO-S@3><$~vQRgI^N?qqfnpfjkbjjajkbiiahh`fh`df^bc]VUPNLHQRONOKEEC=95<751*)/%!4+(jE8wS8sTjdDeY=i_Ih_RtjaVUU*(#/,&/,'&#)(0.'('!$#$#)*+,#()&'13(55,//&*,").#*0$&(+*"-1'03+9>6;?67:/-.$-1&26+26,-/'*,&.-'.-())#))",,%..(.0).1(15,--'+,"** ,/&.2(/2(.1'04*47.26-4608>45:1/4)16.672794:>6?B9?@8DD=IHAJIABB:=?6@A5@@5MK@GG<77-76-7:/?B9@E:9=4@B953/,/)22-461252040260483/2/+/'*.'.1*,/).0-7:69;714-:>8seLrcFteKj`HncKbXCUO9bYAf[Ca[@f\DbYCNJ0\X>RQ8dbDZZ:VV8]X>%=?&563369"32<:%2/4275 40!51/3-.,&$941:63952,(!0/'"1+62:3 2.84!85!956647;>!?>!BB#DB&IF,HC(ID*IH-?= HD*A=#KH.DA*D>)>8"JE-ID)NL2NM3LJ/JJ2GI1NN6KK1CD.PQ;NN;F=8@62#  *$%3-+.(%.($3-&8.&L>5-*"3*&0)(PJGzuplf`UQKqjdTNJKFBPHFJD@IA>60,81+!3)",#DB>HIF@BAABCBFCTVOGHBHKCUUOZ\RJLDDHDCFEFJG@D@BHFDHFCG:@C4;?AHL7=@@DHELPep^h>]j@[ikpCfh>trFqsF\e6\j=^j;Xg6fs?dq>Yg7]j?bmBjwBjw@fuAcoCblAemA\h>[i:luCao9ip@yLpo@gq@\i2bo;cm@IW/Yc7[PY/R^4|S`o:\i8Wd6Yf4\m7Zj5P_1T`5R_2IU,Vd7Vb5R\15L$3L!4M8Q!8Q!;T#\X8OG@RG>R<2+)4.)=6/92)A:0@83H>5RH5aYDJD1KD2^TAHD/UR*ID3IC,[T5\[7_]5YX0da:gh:__/ihrrHsqOfd?_]wwPopPPV8mrNMU6OU7aUQU0JP4\aHXY8_U9gS;nvXNS8/ocwucqL>h>9U=4UC2vhNwdI[KUTU! #!#!*'",("*%-(!(&(& &$$$&%/0$., &#$#'&'&&&%%)*!*.#/2)02*13+.0(13*03)-0'/2+6807:301+--'--&))#))#,+$/0&/2)27,00(**#*)#')!+/%04*-1'14+/4)47/23+492:A9;@888311,33-;;49<2>>6=;3+,"**"/.&23+15))/%%),,#23(./&-1'27,535313.,/(./).2-6:3@C:?B=?C@9FGA@@:23-;;6EEA@B?^Q3_Q1cZ<]W>b\CfZCj[DoaG\P7j]FobIf[Bj`E`U8%HA)OK1DB*?=&;5 DB'CA&VK2UJ2LC+D='B<#LC+H?)JB+A<(?9)C?-HF/BB'EF*@A)>=&AC-?5/.6/,700@9:@:;8347//3-,511QMMKGFVRN@:45,&3+&* .#".%".%#%#/*%OMKEDE<;<;<DG@EI;CF8@D3;@:AE@GLEKQ8AI:BIDLRBJO@GLkvCftBguDozGam;mzCcp=foCkqIfnF]ekrEuvRepE\h;sqG~pGfm9fr>cj:qpEY]0rnAif7MV*Te8Xg7Td4drZe8Xf:]h;ouEhr>dl;zuIhg8lq=Ua*\k8`kbgGgpRjwYl]n_gUjVZuU=>@F)+a.*f+&p2-t0-s,)n+(c&i("k(#l&!l& o'!o'!j#j&f%^!L>>/`c2cd3aa8][:\\8SQ?RN/A=AVH>WCP+;F080/%53+50(4/(E@5D;72,'50)70*52*3.)3,'84-3,'2,%6/+?538/*70%EA5JE5B>1HC3`]Fh`N^QENF8JF:KD8M?6SJ:HB*D@$VP5LF0``BRQ4caFa\AQK+wuM}Nhc;aZCH@+Ȼ{j~siwmlf_icX{dXT2)E)&ukczk}bNZJ;plckkdlldmmeijcihbeg_ee^QPLKKFZZUWWQOPLJKH:97/.--+*)%'*$#61,B5.E9+D8%oN?XB0TF2Q6&kB2p\=TSS$""# # #",) )'%#%#$"#"%##"%"$"('%$&#,*%01);>5>?6:;304,*.#*,")+!./'79247003+-/&/1*//(--%))#)) () )*!+-#**"**#..&03,03-03,46/03,/3)6927:39<5:>769375/65.)(",,%+,#00(::1,.%&'/0(68/7<1>C7;=434-*-$47.9919>327.7:634/..'9;5574374,/),.&+,%13+,1'15-04-/3,)*$-.()+$''"11*AB>bZ?c^A`]@][@XZ>]]@b[@f]Aa[>bY>cW=ZN3\N1WL2ZU:b[BWO5`W%?;';;$;)A=)JC.C<+@;)@:(:6"A<,?<,F>/IC2GC/IG4<68<66@74RF>OB8M=3=0(0#8-'80*=:7>97A<=JGGE@?931SOLROMXTRE?>4./;45=66=876.,/&$&0' ##)" 543667467;==6<<;>=CDDA@?EHDFHFDFB?A=GGBIIH>A@?C?9;9CIE388=@?>B@8;;8>=DG4:>3;A19;5=@DILAEH:AF28>/6919=4=D5>D4=A3:@1:A2=D6>F7@G9BK=DL=FM@HQ=EM7CK3@G3=FxOal9bn;]dn7{Qmp>ruKguIp~Mjx@jx?`n;oxEhu@gtDkxE^h6uFu~Ks{Lbk?]h>blCalApzI_i:yQeo=ao?Qb0[l>`mAWe6_n>fwA]i7dr?`o9eoFR_4Ud2efsp@Xb2srEsoBT]5JW,cp@Yg7Xg3_l8Tb5bk?]l?ao@_n9_k9Zd7Ub5Vb7O^.T_3bi@jpA^e5mm@ZZ4dg=R].N[-KW+=H!KS.phJKK+=E&GI+BM+=H'=F(:C$;M78D"=H3:==0==,63(/*"63&4/#,*!-) 0. :9,.*!86)53(.)%:6/52)HB<@92G?84/'72,50)<713-%4+#=4/;4/92+;2+=62B73A9.>9-F@4<5,WR=;6&IB0IA+`ZDTP6]c]6NE3H<4v|zmrneXMBhUBrnaspdoncpncmlbki`caZ^[SRNHMLEGG@CD>=;7863,+)+)*****)*+'(4/+?40:0.=+$lA3lB5H/(I7/N8-X@3TRQ!! "'$%""!!""!#!"#!+( ! &$21*0.&43-23-26-25,03)..'--$..%+*#()!).#*.#()(* () .1(*+#)( '(-/%)*!*)#**$-/&/3'04++/&,,%25+/4*36-58/79059/34+)*!+* $###('10)12*CD;WY8US5VP5_T9]R5SP4EG&CI)LN1RM-_X=i_Be]@ZU=kaImcG_W:bY>WL0TJ/^U<`T:WH1[P5ZR8[VE?'LH2=:%+$'"92)0'72%<7%D;)SJ5B>&A>(F?-PI398AF,8?!>A#EE+JH.EA(A?#EG+C@&;4E?'FA+A='C?*?<$A=$GB)A?#@A$OM0VN8NJ3JD3QI4OE0IB.IC/VP5%A=--('C=7OH?VF:3")4-%F<9fa[roeuvn}óxpf?8/IA9;2.6.,6/-3/061/7/))KF?TQGRRJ554356178899699277+3128849:<==IJGEEAKJGFHGCEE5;;7>?;ACCFFBCC/422895;<4:;044@AA:=<2889??:?@MPSFK8AF6>E6@F6?E1:@/7=/:?2:A08@*27/;A1;C2EJE7AI:CK3>F6>F4>F?IQao?pxHUg1\k:QjuAmxFhs@myDdn<_g:^jZi8am;\l8\g=Yf7Zi9bc8ZYY2\j:ci;cf:U^3bb:fj>Ya8JS)Va3R]2MZ.Ub2IT+Z`8Q\2R`3Ve6Q[2R[3>H%EO+CM)?G'DL)RY2QV0UT3:?LT3;-?8.@92A7261)52):5,:5*A<2B<1:3):6.>70>6,;1'?50C92OB8ru|vg~nf\QTHDL=7PB8OA6bUIeXKZNDzn^~|xpn\RAl\GcL8|jTkcRugPc[MeYHd[K_SAlbUcTBaPF_NAeYKE>4^VN81*@<92-)>:94/,30-@:6C;5qھӍ~liaYupbsTQQ"-)#33)! "#!"!# ! #)).-$)+$$'*,!'*), (*,-#00&'&!"" $'#*""$"$&.3(#%" "#*+ -2',0'.2),/$,-#-0(+0'/0'-1''*'(./$)*"55.23)22)77,55,+-&)) -,#()-0&9<35<0.3'*/%+/%+-$%$84&11((,%(+##'&( %'$%+,(+/+&)#(-)-2.+.'') ()!(.#*-#-/$#%"$$%%' #"44,YX?`bDVZ:TT5XW8YV4_Z:PR2IJ-adEVV9f^>aYj[>sgI{kSv^h[E]OSM3[V;PP5SP6[ZYN6WJ5\S8WQ3YP:^Z=^Z=J@+I@0SLXO7UP5RR5QG2L?-F=-A=(EJ/88NC)F?'NJ/IH*EF&<=!GE*:?CE&A?!HD)NI.GF*RI2TK3OL6TO:rnhq_Uvn}ѷθfaQ3*6)%I=6F945(!g]P^OAG@;MLF<61:4/:735968=<7<<:=<8=<=?A7=@5=@7=<7;=@NSSGIJ1:=-46@EF=@A6<<<@Daeg`cf6<>4:=AHJCGG8>C059/596?F8BF19?07>=CF;CH@JO:CJ5@D:DI9DL/8>2:=9BFH19?39?9AJ3:D5GNsg?ag8T`/TuyBv|Oqr>x|Mal>`n3jw6ct8]m8fq@Vg6Uf2wLkvAoyM_n:lzAhsAim?fsDbn?itCes?r~I]n:<@<>D>@D@CECDIFH@V'(=%:%:%<%<&<&='?+A.F5K6N6O9Q>P 9LDG\s?T^5MK< +ګשӤѠުР.ft}-A^5GOA~;z>{Az9jqDtyJxHrxJV\#/)JX=O`5\g@`oH^pL\tP]wO`{Na}LeQ`{L`|ObyW'+((""J3.L$ c(&k,'d'"d*$a$^%^$a&a&b%b#b#c#^!L51-ZV0[W(GD0TU0Z[-NM):9$1/"0($4&-938H+9G29;6/3*%91*:6'63%92)1-20NK676"98&77$.+!0("2,$;3*H@1KH1JK.JM+hjE__@JI300%<7/94*FE39<&><,=8/A9263(<8076'7:&<;-BA3?;+84+A=2A?0B>172'3/#FA2yr}ugpc[OMC:H;3SB8`PF`NDVD9`MDgUD}xwwdWChWChWFn^HlbOiYBsfVaS={q]fZEvfcSeuiPx`yp\zmdZGghiffh_[]mhkc_aZVWd`aoklXVXQNP[WWmikWUU_]Z>>?d]`A9@ZWX[XZ\[\]\\SRSVUVWVTQPMJJJ\[[QPOWWUJKIJIHSTRccbONMMKIMMMA@?OMN122HFGFCD=;545GEFZWVQMM0/0434/./101101;:A@B@?B<;=faQ|xc{xczwa{l:79GEFHFGJQUQ^cQ\aPZ`PUX112000112/00011747?<><9;A=??<>B@AEABIEFEBBPKLOJKQNMRPOXSTYTT\WW[VUZUTYSSVQPXQPUONTMLRKJQJJNHHLGFMEFHDDFBCFABDAAC@AA=>A=>?<<=:<;8:;7::7:;8:857637636344657JKMhryCDPcRWp]_n\ar`ekY[n]`^TZaTWjUVbOUdSXcSYaOWfZarjqsnx֨pqqMEAxSROpQZ4b>AՏ~xrs{{nm^^wUT~`_vvvtnmWYpDCb:+A<)C>-FB/93%;6(61!>:,TSR$!$&"!A@0SX9LT5RX:Xa@QX:12<;)>@,52(97)52)FJG-0,Yggg|`sx}x~}~ͩľ¸⢵ɿĪqoee`\c\[PKPNLONMODEFKJLKHJOMN_XU^WWQMPedfHHIMMK}{nuhuzmuyjzn{o{pjj`HC=HB=cd]{ygjcKLFNNIHGBDE@LKGY\V^d]]d]QTRGFFMMLGHGIHE@?>vz|[]aKNOw|{jmjSOK5.+:52JEBF@@QOK@82."J>3qeUmaT?7.NICQHF,%% + $ui`gXRWIDUQLWOKZSOXRLZTN^YSJ@9eYMxre=1,@2.`UJ>5,SJCTIBF<4OI>tmb@5/KB8&C:8>62F<:QF@*#! +[QL^TM=10E96*! xɚ¶ĸƺŹ|IPS639%""") (C5!:03?`U)   ?an,cw1as1]n-5     #)!&/ "0#%0!!@,)C1-:''H32M:6TA;WC@\HA`LDfNIeLDdJBaF=_D:_B8\?6[>4W9/X;1Q2+J.'G+'C,)@)(<'&8%%4##2!$0 "+'%###  !%,׭ɮƛhrwڗĕλڜ͍95>YKOnTTo]`n^cn]`n[]s`bYLPbQUeTUdQUgRSgPPiQTkTTpVVjPR_HJ]JKXGJ[LOZLP]RW}|~RPNVMGƨܸɨ˯S7>J17xRUoo_`wSU~[]|zqpy_]tPQf>?f<>vJLbcqqlmjidecc]]ccd{z|wwxwwxwvxwvxwvxwvxwvxwvxwvxwvxwvxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxxxywwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxxxyxxyxxyxxynmnyyyxyyxyywxxwxxtsuyxxqmm|www}x|k`\znizy|wxywxywxywxywxxwxywwxwxxwwxwxxwwxwxxwwxwxxwwxwwxvuwutvutvutvtsutsutsutsutsutsuttuttuttutturrurqsrrsqqqmlnmpn;ȸƶôǶϺĴĵĵļƽȾɿ¯ïĮĮŮıưŰƲƷܻ̳hiXRP@UUHHD7GC2GB-D@*B>*A<+=8&C?-<7(84%1-@:-VTRDF*EK+%%BC0PX8PW:IM2PU8SV<..98(GM369&:8*63$40%50%><-45';=30/)allqz~~ٯהøż~qDA>jb^f^XYSS]XYPLNONPFFGSSUMKMWSRXSSdYTg\ZIGHffg\\[nqkpulYZOPPDqrbv|ku}sUSKA:4MHE\ZWtzqRSMSPLRPMHGBMLGJLFSSOIHI?>;CCASTRbdaikjNKH`c`ourosqlplTRQTTRnqmy~w~aYOXJ;hWA}mUK@7*#$,!OB?^RM2&!OF?ZTK;1'[PGaYRYSP_YUXQKTMI_VPg\UB82_UMn`SD6-dYQ`WN`XMQLEG?9[PIaSK90(NG=KB>I@ND@PGCJ?+*8((5&%4%&2$$, '&&'&  $&,δЮějsvԍŽꝱٜܺɏz{gp{!SIOeNLr_]l\`q]asacn]]aRWXKPcOReRXaMPiVYhUWgTVdQTiUVfQPnUUmTUjQQfKMeOP}ywDA@|ulе|ok^fpoo`_3Q7>{VVyWYpp·tsjgsQQlDDf'CC1*)><,FI225$10"GH4-,97+<>,=;*72$4/"44$5<1^hhjzȰϻ¸ɾܯPMKOMPLKNgc`}snUPTMLMebcFEGJJMLKMJHIZTTe\Yg]YUNMJJLfggx~xaf]TWNTUMnqd{}zofi^lmeYXQy{u`b^osmEC>@<8KIEKJGQPNAB>SSQ_b\qvotzshnimqmCB>SQQdfb45/.+(4/.0+*:54HGB}x~OH@\K8l[@aWI H<:nhbic_^WRVMJgZRQG=ljdomgqnfkf`qngnjb}ukpg\ync_RFaSHaUOaYRa\V\VOWOIOHCXQKMD=LAJ@;I?:H<8KC>)"JDBQLILFBG><9/,0$"-  +&1$K?,*;)(7'(4&(0!"+'')&!  %ƯǛkrtާ̂dt}lꜲ|zvvjzlx_iyv~yTU`#%RHOfNLgan`al]bn^al[]l\`WIOYINcQUeRVaMRiUVkXXfQRkUWmWWmWWgPPmVWjRSm`a`^\LEB~|xbli[bcdoqgQR(YAGdbuWUnHJg;>oEEYYhgpnkjlljhю{lm|c]bcc{y}vwwvvwwuwtuuwuwttuwuxuuuwvxwwxwvxwvxwvxwvxwvxwvxwvxwvxwvxwwxwvxwvxwwxwwxwwxwwxwwxwwxwvxwwxwwxwwxwvxwvxwvxwwxwwxvwxvwwvwwxwwvwwvwwkkkuuuvwxvwxvwxwuxrqqyxzhab{xz|uvsvvqpjZUzvxwvzwxxwvxwuywvxvuwwuxwuxwuxuuvutvutvutvuuvutvutvtsuusvtsutsutsuttuttuttuttuttuttusssqrsppqppqppppnpoopnlnhqr¸źƺ˿˾̿̿íïIJdzżټζδĮ}YYHJB1D<*FA/D@-D?,=9&<8'<8&:6%85$;6(84&NLBUUR<<$HG/%"99&((87$<<&00!.-#==,AB-+(31">>,+(:5'NP:55!66$0/!@=+JO3?A-NUKO\Yerq]or{蛭οξ葒><>OMPMLNMMNHEDOJMPPREFGJJKSQSMJKhddTPRUPPaYTQKKLLNegfx|zpyp|~ilellf`aZ__Y_b[jnftztsyqqvnnsmlpkw|wWXVXWT\]Yyzt@<9HC@gg^}E8,kZEicV<;;%! IB>HA=A63?43QFD"=;6[XS_\Wda[da\][VPHDupg\dYNcXMB:4[TN\WOUQKeaXspec^V[PIN@9@62PEALBPGCNEAOA?$, ;.)L>:~ƛ´ŶɺɺȺ´s:7=-")&$)!)"& + +?n|6t6r?z#- +   + - %3'(+!1$&/!!B-+N7/Q<7JJ`J\WFBeH@uRQwZVs^WscZos{WtSZmhMCeJ?bF:`C6`C7[>4V:1Q4.M3,J3.I51G3/C/+A/->+);*)9))4$%/ +()($! ҬŝkptޫҦ^j|zp|rѹvaixt~s}zvzsvyn|p|gphp~hq}pxnywqx>:EZSXZDDw\Ttc`$*0%0?3>H?IMAJVHM^KP_LQbOTdRVhVXkXXjSSmUVkUVcOPeOQeOP~yyLGClbXbmmfjjÈkmnS6:2!(w^^yXWiGHg?@lAC}QSdeqqoptrzyqrzvűig}|vbcczy|vvwvuwuuvtuuttuvuvvuvvuvuuuvuvwvxwvxwvxwvxwvxwvxwvxwvxwvxwvxwvxwvxwvxwvxwwxwwxwwxwwxwwxwwxwwxwwxwwwwwwwwwvwwvvwvwwvwwwwwxwxvwwvwwnnouvvvwwvwwvwwsstutuwwxkfeywx|swstwstj\XxppwvzwvxwvxuuvuuvuuvutvutvutvutvutvutvuuvutvutvtsuusvusvtsuttuttutsuttuttuttuttuttusrsqptqqrpppppppnppoqmkmhrsĜķƸɺ̻ѾŴоп¼ü¾׸γȱmsgD@4HC3MF4D<+D?0HD3B=+A:(A9)<8(?:)85#5/"@:/UTQC?'d]=YV89:"(+RQ8LI2@A)''43#?A-% -*30#-)63#NO;-+:9%-+42#@A+76#>>(EE1=>*<;.SUL~ȈꕨɼŹʿ̿ɽʾ_aZECEJHKJKLOOPMMNAADzUNOGGJFFHPLMUQRXRSURSLLMPMMic^MJJIHIegf|vzzsxzx}{vjnd\`Sgj^lpa~vkqgu{ssypptlvzr{ymohgjdpsltzqrtmQQJil_icU_\RZYUdc]PLHNGFE><;42;42;20.&#,$ 2*&/%$1+)3,*C><*!YNGL>3cWIocU PJH^YVsqjnkaniaicZ_XP=2/G<9LALCBLC?PHC4*$90,.%!Ǜöŷȹȹɸ˹ȸw*$+%"'&-'+,%* %6<1k|5u:Aw  +  +   +- #, '/!!2!!G/+S3,R<9JYzCeUHJlKEzXWnivaZmc]qYrXT[hJ?hLBcF;aD:^A6^A5X=2S8.O7/M7/I5/H50E2-B0-B/,?,*:))5''/ -,+)& l|ãɽ¶hpt̗v]fumym{agsaky}`jybjwbiuehvimwnq}nq|rxjr|eo{^ftblxbhpbgpafs]cr[bomoz72; "ia`]FEpQK|)*4"2+. %.SEJ^ORaNTaOT`NRdRTgSXjWWjTUmWYkUVdOOdVWjhdME>`knfkkĽqeg=#*W26rDF\^jjpptrnlml°¸omxtija`mibbczy|vwwvvwtuuttvuuuutuutuutuwuxvuwwvxwvxwvxwvxwvxwwxwvxwvxwvxwvxwwxwvxwwxwvxwwxwwxwwxwwxwwxwwxwwxwwxxwzwwywwwvwwvvwvwwvvwvwwvwwvwwvwwmnnttuvwwvwwvwwqoqvwwvuusljwwxystrszxyf][tjgwxzwvxwvxwuxuuvvuwvuwvuwutvvuwuuvutvutvuswusvtsutsutsutsutsuttuttuttuttusstsstssssssrqsppqppppmpuprvornjnirsğ÷ǷŹȺͽоѾλĽǨռdzzeeZHB5D>.FB.GB0RN>C>,D@->7'95#;7&1-63#95)YWW4-bU9h`A\Z;NP/NR/VX4\b9)*41"AC+)''%*&,'32"42#.*64"0,41#42 ;8)84$89&88(85%D@-=<&GF4䨷w|wо˽ǺBBCLHMNNOKJKPOPOMMRNP>91<5.>92>82?:5D?>;4392-92-81,.($/)$.*$0*'2+'6-)5*'H?8h_V;/+-&'fda]XS_\Wjhcc_ZokeheaRHFD95:1/3,*$)! +B:8OIGJDBOHFKFBLEBKA?.$#.''HCA{Ş´Ķǵȷɷ˹˹ϼ{!$#!("(-'-("(  Ceo0t9O#)  +  + + + +%-#'."=,+A-)M0+W)&Y<6KWrAhPMWkLE}_]ca}e]kgfayRe^OPjM@hKAdG<`C9`C9\?5Z<3T90Q7/N70L71J72H51E3/B/+A1-=,*7((3"$.-,,&[cgťƹaeht}wsxmimy{uwklvbht[bpaiybkz]dp^dqZdriu]hv_hu`ep]al^dq\cpho|dmzgpzbck_[cefogelihr_dnTYeMQ_WZe "512yuYCElOIun7)2@1;E5= #:4?OBKOAF^KP`KP]MN_OQdRUbOPeRSkXYiSThQRyppRPIcXMֵs}|[[UleKJ1!1 zQSecolɑurnk喋˨onpqfgmmss~ig|iewbbczy|wwxvvwvuwutvvuvvuxvtxvuxwuxwuxwuxwvxwvxwwxwvywvxwwxwwxwwyxvywwywwxxwzwwyxwzxwzxwzxwywwxwwxwwxwwywwyywzwwyvwwvwxvwwvwwvwwvwwxwxxwwomlvruxxyxxyywzsprxwzzxxzxwx|vusu{xynfdug`zyzwwzxxzxxzyxzxwywvxxwxwvxxwywvxwvxwvxxsvzssvstvswusvtrutrutrusqtspsrpsqorqorqoqqnqqmqpmqnlopil\A:R72jbfhqpƢººøùø¸·¸ù÷ǸǷɻ̼νноѾ¼̲ڿu}hq_}ow\a^J\]GvyaѹmoaNJ;LH6EB/EA/MI9E@.EC,>9(A<)A=)84$KJ'+)(&%#0/!77&41$+)MN9>@+HK321B=//,98(55#EC/RT7RW7@C-=<*XYFIL7QSIEMJuvouvfddzqoow~x~zξȞ~MPTKFHQPPJIIIIJKIJ]YWUPPb\Y\YQQNNa\Z`ZXTPMZVTFDERPPKJK@@ALJKJGHPNNfih~zu{slqcz}uw}jz~l~rzóɵìŮ|abXVTLMIBFC<>99D@=A;9@:9A:8E?;1*(+$ 6.*71.5.,C;7G?:A:5  ZVR]ZT\WR6/+4..MGFF>:B95.%",'&{ǟ²ñƶǶȸʸ̹ϻ̹x#"!%$   B}:C7py     + + + + +$,"*9)*:)&L6/V2.[(&\60QUeGhNSdfI?xXX}_\zc]lkmRhKUmfPIjM@hJ@dG=`C7_B8\?5Z=3V;1R7/O6/N80J71I61H40D2.A/,=-,7''2"!2""/ - - '! X_dΧƹ]^`]fskr~rqwmkrmlrmltlovopxfit^eqZ`m\dp\co]dpaiv`gvakwbisY[fOR]W\hZ`l]esU[hdgp[QST@ASBFN@BTGMTJRZPVRLTLGO$ (ROL~XEHeKHeTT=5>QMSLAK&%>4@H9AJ:@VFKUDH^MPZHLaNRdQT\IL]KM_JM`OSnjhMGA~ڰҰѳѯҫܲɰL,1.!:%(llϨtrlkecebon릡pnh```nmrljolinzut~vslgjkhnlhokgnlholiolhnlhmlhmlkmlhmlimlimokm~{smllhmlhmlhmkhmlhnkgmjgmkhmjhkjhkigjplm}|lhiifjhfjhejgehgdigeifdhiejfcha]`eacfbhfbid`eb]cicgf_`c\\a]brjfsf^[_idfSD?pYLTGHa]g_\b^Z`_Ya_Ya_Y`]X^]X_]X_]W^]W_]U[raVl[J^PIZU\YT[YTZZU[XSXYTZXSYXSYYQZYQZVPXVNWVOXVNVUNVTHMS/&F#YMSiqpåºĺ·ù·¸÷·÷·ŷ˹ʻоҾҿҿҾҾֵwzjROAűĮĽαٺŨ|relYGM>cjXHG7A@/GE6GC5PL?ED4KL9IF7GD5HD3WWGlqb\fVXYINJ8FB.GD.FB.B=,B>,IE.D@*;6%EA0A>,NOA<=1YWW$ DE(CC$WR4qfJfa>YZ3MS/ +&_]A34'&&%2/ 2/ @>-HK6JM3MQ8U\=NT6AB-/.OQ5X^;PU2EF(SU5@@(==+:9(95&@=,70#=8*IE9ljfVTQlie```stl~ͱļžǻנ̮^\XLHIIFC[XS_[TYUSHGGQNNIGHJII[WRKJGIHI]WVQLK[YWJHF^\Wig_A??AAB=>?IGHHFGdfe{uws|zq{k{luxeq|v}tptnTWPPPKJHCE@<94/;5-=6092-94-:3.82-70,2.(83-73.0.):83510B=;,&$2+'6/-5.+-$!$/(#70+?3/A52A72A94*#ZVRSOK[WT`[XFA=(!@96D=9( yɡź´ıŵȵɶ˷˹ιϻӽƸ]fe5-3 "( '(( -IN;AM!&     *#0"#1"!:&$N@:bULY81`))^-)ZMQN_YV`lRGq\Vu`Zye[o_Y^X`ZQWhMBiN@jMBfJ?bE;^A6]@6Y<3U91R91N7/L93J72H60H61D3/A1.=-+;))5&&2""0!"0 !.!("\hlТķ\\^hjwijrjjobciihqnovfhpdgpeiuQYeTZhY_l^eq_dnaer^dn^bl^cnY\fVXcVXdX[fRUaNQ^TU\bVXVBDXCF[GIZED[DFZEFXCEA6<rpi|UFHeQQWEHB7CPDNRDN$E;BM:@N?DO@EUDH]JO_MOcOS^MN`MOcNR^JOnegXUQ[SIȧڭڰج۰۰ۮ⸒sd7$. vifɻnkjfgekeje{ȿgeİlhw~[[]WS\VR]XS]WF>X?.VPPVS`YS^YT]XU^XU^XU^WR]YQ\YU^YU]ZT^ZU^bWXqYFdQHZW^YU^ZU^YV^ZT^[V_ZT^ZU^\V_ZT^YV^aSPhP<`PKZT]YU^ZT]ZU]VRZXU^WU]YU]XU^WUVskkkfgd]`aZ`_Y_kab_W[WT]dXWqfRKScZ_SC=gPCQ?=ZWbXW`XV^YW`XU^YU`ZW`YV_ZW`YV^YU`YU[yhYbN9bUJXW_YWdYWcYW`VU^XWbWW_YYbXWaYWbWU`UU`YYbXYbUWaYT[A"K( [TZiqnũǻŸŹźƸƹĹ÷¶÷÷ö÷ǷɹǵƴȵɷμѽѽֿտԻԼּʸȱ$C)'uPI{m_l{mKQCHK>FI:\dVYaUQVJ=C4DF9BA4JL?X_O|xTYIul`kW{PWFQSGGH9GF7KJ;BA3@@2HG5=<.??0HH6IH5HG5EC4EB3EB3HD3HF4KG7IE4MM+C@+@<,C>/=9(51"<8+WVV%"EE);<FC*`X;fb@b`;bd=FI+76')$=<#67%.-# /-1.??,>C+HN4KP4EK0CG,;9&97%<>#OW4Q\3S[8=;%63%.-:7'@>-<:(64'99+55%WWE66'lkgomlxtn~{vppoeeftsoʶpwt嬵囮ݠgd]XRO\VUtnfxoeUPJNMHHFE]ZUYTONMHUUP?@@DCBfbZ_[VZXTZ[O``U@?925/'83+B?8DC99E>;4-),##C<9y̤Ǻ÷ĴôòĴŵɵɵ˷˷ͺлӿԿajg/'.# -(,  M7B@z  + $    3#%B-)H1+ZPER<3^'$c(&cA;\PLbSIm_LrhTulXujXoZMmSFiMDgJ@kMBjMAfJ>dH<_B7]@5Z=3U91P7/N8/J72J82I72F40D30?/->.,:)+4%&2"".!/!#0"#,!)!# n}~Ÿ[\_^dp[_ieemXYcSVcikscfofirekuaiuX^kZ^j[_iUXd]amXZe[_jWZfWZhQS`\_kX\gMMYZ]fTSYcY\R>AWEFVEGYEGWDGVCE]KN929 y|t^QU[ILD7=1+44*33*5,&3M?EQ@EO=DTDIUCGVEI\LM^NO`PQ[KM\IN\LPspkQICnܳׯٰٱڲٯ׬̩dFC5'.|uoefkhjgkgoj~{zupȬkislhZ[^WZeXZgX[d^KD\A.VUUW[hZ^fZ^gY\fZ^gY]g[_hY\f[^gZ^g\_iY\ga]^s\FhWJ_aiZ_k\_i]`j\`i_bk]`j]`j\`j\alY^iaYUeL6bTL[bk\bk[_k\`fbbdY]daaf[Z]je]xpbssxprsr\bj`_`]]_ZafwkX]dgfh9) `L>aSN_is]hp_hp_ip`iq`ir^hp\ip\ip`kr^kt`infZNiR<`UK`nu[mvZjs[mr^mq\ls^nu\ms\ntZmuYkt[msYlrYmr[ot\ilA%!F$bcejpo¸õµ¶ķŷŷŶöŷƷƷƷŵŵƶĴĴĴɵɶ˸λϼԿŎ# F,!rJ;]<0J>2DA3D?1C?0@=0@>0<<,DB3@=0;8,A=2=:-:8-B?2FE6ED4<;.AA4>=0BA3?>.CB3::,><1@@1:9->>2HH6JI7GE5FB4C?1C?1IG2HH0NO4IH.B?+DA/C>.A=+B=+A>,>;)?:)B?-?<)?;+@;.<9+73%>:-TTSEG&V`3HJ*leHg`@ifBPW)_h7--+'.+%#66"PR;JM1RR:EG,KP6BI,LR4HL4<=&CB0=?%ZaAOT7FI+U`8Wb=LP4JL3@@+53"QT9EF0<9)31&9:%BA-HI8adV|WSJpni~|yÿzzs̯ɴu|ʲʼuzxVUQROIe`W]YR[SM\SOHHDZ[SJKBVVNjhWhiWBCB=885.40,0,(-($(!5,)3+'6/):30<73-&#.(#6.'80*:1,-%#&"60,60-840<73;731*)3,(5.,# 4+(x̧ǻĸ÷ĵŶŶĴǴɶ˷˷ιιкԿR[X.%. +'&  +    ,JPKX27 , +   1#$E/)O5-UB6utd\+(b+*YC7hbFxwS`_kismLl]F`J;dI?iJ@kNChJ>fI<]@5\?4Z<2T91P7/N80K81J82G50B0-=-,7()3%%0!%, *'(0"%/!#, #)!"' (o~Ưġ[\^SXeOR_WXbSV`PS`X\hXYf]]fVYdZ`j]`n]_j^amV[fVZfWZdZ^fX[fVXdZ]jXZeY\g^akWYcVUYZQSR>BWEGSABRACSACTBCWHL% ))(+vjhf[HKdSTYMQ]QTUKOPCJN=ARAER?DUDHSAFWFJYGJ_NP[IKWDHTAFf]_][USIA˹֪֬ڱذٱٯ׬M.2,A'*d`kjuqztrml~ngrbccvwxpstnqqo`WoUFsmhflplprnrtorsortmqrknpkprmpqhnndilioqonkv_MoaQlrrjrvkrsjppippcmndmnhprdmpdmrfqrjb\kT?g[Riuueqsitwgqr|vkµƸ{|qyxjgblpm}xt_mljnn7'!`J>gZPkzyjvyr{yqythrrgqqiuqiwslxulxup{xu}w]O=.54)88.31(53)@?1A@2@?0DC2DC0>?0<=.?B1CF3@A164+<;/98,==/FF4GF4CC1DB2DB1BB.JL2IM.FI,@@*?;*<:)84%1-<6'96$30 50#:8'76%<7)=6-NPDGGf^9aP;^E9hLAiL@bG:`C6\@4Y;1S8/P7/N82L92G50?0,7)*3&)1#')!(% !!'."$0!%*!(&9;@s̱Ǫ˻YZ[HKWMQ_TVdUYcTXcVZfaclXYbZ\gY\gWZeUXeSVcVYfQT`TXbVXaXZdPS^SV`RT_PS]\_iMQZ]]]{qpR>?[GHVEGYEGVDEZGGQFJ$'DCCyxXHNkTTlSShLKhNKiPNcMMXEHTBFP?AR?BVCE\HL\JL]KMTCEM=BzvtJD?yl]گ֮֫ڰխذ֮ݷpc7%,qb_vp{t}vryxoovq}{lh^YWZE9bK=iSEdPCu_TaIiUIl]j]j^p[PxbU|g[j\k\pZNi]pbzeXxeXm`uguhqfwjshobwjyntg{l|owlsvytueu_hglkljq{}eU{{qzjZl\O[G;^F6v^Q]J>UD6eQ@lVFm_sbopuszzpYC^I9iSCxoopmozi{kteserdoaoapatdo`qctcm_kpo³ijŷŴŵŷŷŷǷȸ˸͹λͺѼҾȼǹŹöҿT\Q9%h@1jD5c>1F4,56.54)<9.=;.>@/>>177+32(53,97.30'43(<;/<;0;:.<<+A@0?@/?B.6>)8?*HN!UX1ED c^8^S7.))%;8!KO.DH.HL0LQ2AB(DG*PT5MP2EI+43!;8$RR8>@'TT;PN5CD,B@,??*DG+X_@44;9%Z`?=@"MP3BC->=*PP9GG.QU5JM.OP796(KJ~ry}ƨԽýԹӾLGDPLH_[QkdVqg_ic^^[RbaU_aQ`cOefRa`Nom]xvdxj}r}rewhtqfbSWZIS[GQWFtsdfbUXUK@;3[XQfihw}qsxjz}ts~~m~wm~szvsu{iu|lw}mnsbzrjp_jnYqucu{gw}m{rceU[[MTTBUTAYYCZZD]\Ja`N`bOaaN`aN_`NefTcdMehQns]hiSddKhiNfgMjnVsx`rwampZfiR`bM^`MacR`bSfgYfgYgk]kodccW_aVhjb__WSRHC?7B?8RPJA>93.)1,&/)!/'4,&1-(.(!/)#/($,& *$'#'!'".(&/)(x~~ϧʽǹŶŶŶƵǴȸʷ͸͸ϼѾº{2+2  +" %%       +  /2#!.*10#%C.+]E:]C8iVIzxlMA0vyPpqHgfHWSDUQGNG;J=4LA2c\;lj8tq9nj9h[=bJ;gJDcg_PELbZ^YOSfOOiUWgSUfNOSADWDEVCEWCIUADXDE_MOYFI[IMaWY^\UNF@ܯٯׯ׮լ׮׬ȨcD@9#*4"xqifyvqmlppom{pkyzun^[\G?9OG@I?6J?9C;4D=5B:1PJ@NH@OJCQJ@PI@OG?OICPIBJA:MF=OG4K8+cRC\I9hUDK8(]G8O:+fTEp_PiWGaL;mZKhTEjXGp^PbhfŸǸʶ˹ҽu~pWTG}{͸ǼǮ´XPF`:-\8&\@0J@7>83@=3<:/?>179(;8.=;2:9-50)63,84*;9,=9.83-84,=:/62)42(44(45'01&7:,DE1;:*9=&?F)GJ4IH6EB0LK5HI0HM-JP+99;8'63%2076%<9,<6,E@6::/85+FB6016:&GC697'99&==,AA5VVR@A!AB#=5gY>mgBglCPE)|bi  # 32MQ169!;='AC-;<%JN0MS4TV7TT4[\<74RQ8NR6WZAEC133 ;:%AB*;;)CC05.!;9$[`>BD*HG286$>=(CC+?;(>:(><)86#98(BB+HK3UY?shgNϰߎvˇzQQPUSOEA?LHHUOKIDBSPN;:9KJFb`Q`dQX]LVXJ^`P~}jpm]iiXtp`vkeZNzg_NZ\HX^JKO?UWHWWH^^NUTJLHB85*YVGdddx~unuhlrdyst|quzcpxP?5]<3\M@w|jltapucsydu|h|q{z~sx}jw|gu{hrwby~mxnq^jo^}w}lilZv~t{z|lefU]\I[XG`_KaaPZZGXZEZ[H`bOdfTptbqudikVnq^ln[pq\klWno\jjWpq\or_z|imoZnp_fjWhjWcdQfiUmsaaeReeTfgYceWlnagh[vynmrghk`gf\TRIMIBGC<=80<81>932-'3/(1+%50*0+$-(#2,)*%!<86xΩ̾ƹĶƷǷƷɶȸʷ̹κоҽ…;9= /'-        K&(% + UW]#$' 0 "D0)|ulnj]fF:Q=/zvMroB]O>aRGhVO^JDWBtgB`D4aC8^B6X=3S8/P7/N5-I6-G4.?-)4&%5&&3$%1"#/"#2$%7')7()4%&/ #+!%2$&QT\VdgŲƚ]]_ST_RVcRU`V[gUXdWXdNQ\^doagrW[hIITKKTJNSRUY^`fWYaZ[c[\b\]a[\a]\c\[bedlggiuvqYEJ[HIZEHYEH[FI\IM7-5}vNEKYKOb[_b^eYWbUJQaRWk^ecTZXEG^HJ[HLJAGxwuIE?qeXڳܮٰ֭׭ׯߵ⼿L/1,I25~Ӎdaxw{z}wsoowwrrxwnmgha_up|zuZZYJF@IE?GC=HA>?83OIFPMIWUPWUPYXRVVPXVQKE=XVPWTPYWUWTP]ZUVRLnf`RGCPFBRGDXRMVPLZTNUPKVTOTRNVSNNJETPLSQLVTOa\UqjaZVQYSLXPGwheCmpdioToVgOs[[<(A)H6*4cR}bKyhP6'X;(fRfM;bMBUE8PG=SH=WJ=N>0\NDWNDVJ?RH>YOCTKBQF;aP@`N;K?3<,#I9/M@6PE=NB6SD8N?2N=/G8,O@5E8,J?2B8)H>0B5'F7*D7+@3&F;.gjjdm_D.&L4-5 KJ@˽ԾsjSF\7'^;*sdXsvjimbbcWefZhj]UVITUINLBII>GD;A>6GD;@;5FA:E>9MF??7.C:582)1,&81)A;3F>4F>6A:0BA,AB(;9'A<.ID4@=)BB+II/EC.@?-:6+E>8J?:H>8D>;>72TLDWTHSMAIC3EG-EF0B>067"HI2==&;<*[]UJS&RX/<>GG"Y]-FN$;8}qPi_@( '!41QS146==*?@)>:(JG0JK1XY:KL,ifH63`bDRV7IP69:&88#:9[Z<:9";6'6/ DC,A@*97!OO92.B=-EA+51!A?-?>&<:,/*:8$DE-AD)@G+DJ/>C&9;$bbPyuc}n~t_hfZ;<=-LLECC?DF>X\JadPPSC]_QynvF=0pi\97'IN9>@0KK=VSEFF1giSWYIQQ?98$FF0dfenthrvi{w|ys{okqa~wznqlxl[4.a[U91xzwww~iu~q~p~nv{`qw`|}pu`w{gjm[w}mw|iu~t|ut{kjm]hhVbbN^^JbcQ^^N]]JVTA[[GYYFYYF_]I_aN_aO_aOabQhjYffS^_M^_L]_K_bOabOaaMXWC_^KacRcdTstddfV``Okn^`_O_`Ntyknrelqa{ruyknsglocefYSRGD@6GD;KG?;7/4/'4.(1*$0*"0+$;41x~ϨʾŹŸƸƷǷȶɸ̸ͺϼоӾԿտļðȹPVW 0&.   0)2      + a25  + / #K71hbUcXIjS8Oma?kPImUMkRHgLBaG:Y>2P7/N50K3.O>*un>~z9xo_A7]?4V;1R9/O5-J4,F3.C/*?-*7(%7('5'(5&(5&%;+*<,*<,)9)(6%%0!#+ /#$|hy{qǻȣĵ\]^OR\PR]RTaNQ\SUaMMXLNYOPZY^j[coNP\ST\Y\`PRX[ZaYYcVW`[\cddjcdi_^gVT[TU]hhj[JNYEGUADYHI[HJVDJ3-6$!%OGJR;=\KLͬɯʃkm{ZS]hbinel]JOYCFdKMc]``a^JB=Юźqoi_s][A%*,wsgerq|z{ieunz\Ymnkkmnrqiimf}{uZWXD>8IC=F?9A5-,)>40IB?IB=KA=KB=KB=>1,JA/L:-J8,   !+!,!-!-#/#-#6%dO@bO>dQCF0$?/%C5*?3(@/&D5*H7-H5*N;0M1UG9M>0TD6M<0TA1M=.flkͺD=0A*!>*!_C8Y>0ѝwXFuO>iI7`=.q\Pk`Q̶Ůëɯy~{}|ifW[UI`YNtn_mfX\RFcZLc[MG;2E=1PH9VKAg_PncUaXNcVJbXK_WHjaSe^LhcK_YGbYLc^M`YJd\L\UIZ[TDI LT&KR'IL%FNFI%54KP(?@#64!NO1=<#==(79$1-;7#??)IL/RV4TT8:7"NN/RU4RU6?>'RU3RT0\[6VV2OK3IG*EB(@=)?=):7%+(<:(20ED0DF+MR2OP654TW:JO/EG-FK/8:!FH2=<(GI264":6&98$ED-xs]NG582$CC6<<7PPJDEUS@[XFXVBZXDYXFVTBZZFXXD__L`bQmo`rscbbS`_N]]M[[IYZI]^N`aQvwgbcRjk[ko]il[il[`aPdhVegW^_OaaR[]LffW]^RXXLHF:C?4?:0C=4<8-<8.B>7x~ͧʾƹǸȹǹȷȶʶ̹ͺμѽӿվֿ¹ι )# + +   + +e.2   +&O:5WB6ʶtd@KgN8lMDjLAeI>_E:Y?5R;2L3-K2*J1*M1-VC,~tBzq=`O5\@4Z=2U;/N5,L5-K5-F3.A.*>+):+(6'%4%#5&&8((;**<-)<*)9))8'&5&&2$%-"%86;Zfi.-0TZ[˷͞[\^LNYTXaPT^EHRMPXORYKMVTU[HHSCGTFGRVR[_[aiflmjn[ZbLLVUW_\_hWYaOOXRR[fhoYYZrjaaPQ^GKYDGWDHT@DRCH>>@3,ļllrqvqwt|w}idfdd`mitq~|xurrwuph|ytXTT1'+#%%.! + +0:%  + 1#`C0{cqfrZ<(=%@+$=)"Y?5?%cH=/7%X@6wbQleSuT>zcSM<2J7,XC9   + + +  (U<*iQ@G-"iTH6-$&   +0   # +),!fmlDz0$jG:fH8nJ9mQ=qTEqI9tP@qM>mJ@jKAgK?Ӷ̰̯ɬˬƪ§æȧʩϮʫͬʩvwxwgt|u||}y{vyq^}we{os|ltj\zqcvhuk`WWS;<MV(FM!MO(SR0<<84Z_4V]/NN0-,/-CC'LH5?=,,-64#43B?-IL1FL.AC)<:$PO/Z]2W[2SW4QS0Y[3bd9eg:PS,Y_7`d=II-<8%;7%IG/EC-76#OO435MO5NP2WZ'KM2KM7TTBb_RMN>NPAHJ;=A'FJ,KO5GL2EE.hgVQR9`aFRR9BG*GK0FJ.FN.EK,@F(EJ/GK0IN09<$24PW3OW3NU1MS3[[ZMMBKI=QMAYXQgmbrznzzfmqL9Jd.=CE|>:[4.dTMu|py}gw}hrv^mqWqt[zhuy|w}tzdyklu^~p{mr}sdfQjn[fjXmr`qudmp_swhlrbptdmr`kp_psbhkZ__NYXHZYGYWEkk[svgoqc_`Pij[kp_]_OaeShhYjl\mn^fgWdeV]]MRQ?[ZIghUijYhiYklZfgRaaMdeRnp`mp`fhWgiXacTcfYik_[ZObaWUTLVULIF=OKCw~ͫ̿ǺǸǸǷȶƶʶ̸ͺϼѼѾԽվ»t|z &# 1%.    +   H$b&*    +  T=7aD6~pquKrBbD9bC8V7/D*$=("@+)8%%2!6 ?(%I0*K0&n]8~y:iY9Y=3Z<1T9.L3+I3+G3-C0+?-*:)&3%#2#"1!!1!$0 #2"#5&%6''8'&8'&7((5&'."&&"')ìƥƶ]^_OR^FL[?DPLPVWY[WZXstsdbfYYahhkigkigjgdhcdgbcgTU]OQ]KP[VWaEENQPXPPVddgPOPq`]XCHWDGXFF[IJJ?C!NPMzW`Ufldb]^Y?AdHC}:8Adkwt~vacpYPYVBFXHHojdLD<~̰Vab\bcX_aY]\yvC"$,J58hhwxutdaz`\dcjirpƶrjƸplefjew}}~VUU89/67-%#0"     L4,G*    +  +u[EvXI:tdTycPU9,F,"D- <*!C0(D(gH=L)A( H2(lUCr}bN|[GlSCr]Pr^Nr\M@+$.#"(    + $W<-^E3B.#dQF8,!.$'!!%!#   + eml<%ZE}TAb@.jXr\LpF8iH5pM&11EG001JK5HK.OP5HH0EH-FH+NQ3FL+QU6EB-E@1B?/>>(IN/OR5KH6?<+PS7PW5DJ+HL2>A&RX1EK(NS6KL2DC2@D,CF+12FI1IM0PT5;?#PT6@B(NP2FI,OS6>B)?D,;@%CH*LR1EK-@D*IP4++22!MQ3HP-9> JM3YYXGF;FE;IG=VXPaf]zvyvvwmQW^)4R#2Q->[\;EFF[^]CI][q|jov_qu`sxbjnVjoWjmYlr_psauyhv{f|~y|muygor]v|fknXbePtyduziu|llp_fhVosagkYrugzqy~qacRlm^abRegU`bM_`LXWFWVD]]MghXZ\HgiYlo^dfTb`Qmo`ko`beWcdV]^MYYG__L\]I_^MacScdU_aP`aO^^MdeU`aR^]N^_PddYZ\OSRHNH?w~Ϋ̿ɺƸƵǶǶȷ̸ͺκκҾӾӽԽվƫdz2.2 +!         +i-2j'*  + !  U?9eE6eIU9.E)#@(%_KFZMII>@(%&(6! H1+\H.~>wm:[B1Z=3Q7,K2+G2*C0*A-);(&3$#0 !* #"$)2$$7('6&&6''/"$''!ѸҪͼbbcGIQ6:HGIS^`aYZ\^]^^\^^Z^^]_``ca`e`addhogmsv|io{[cp[esT\jSV`HKUHHR_]eVXTǵj\YT>DR@CP?BSBB=4:bfbV`Qega|zhmkoqnZABaC?vm  "   BGUxa\hYIPrjiQNGYMDɨͬW`]chg⚩Y`a\]]kST;$/rVVyrrokjonsq֋rjmjpg҄mg͊pmgghbsajhs]tj  ! +    Yg_YmfXiaf|rfunxSUO  -(   @JEFQJJTMKXRS`X//) ::7 +'V;,T@,[K=teX{m`Q6*K.!F*;( B0)I1'cG:X0&O3'|hUrhK;mM=`G:lYMU@5{eVaH:6)$1'!0& $""T?1lQ=6(,!'   +   +   +   + 0%!MTNfmk°jk]mL=lI4nI5cB1aD2fB/c@/gD3lJ9mJ:nL;_@-ӷͰ˰ǫǩ禝̫ҲҲέʩƧƨvtr~~zxtrrutrmTUNCD$JK*OR-SS,MQ'KS&LS'OQ)fh?UV3,(+'HI&QY,IL, $$?B&./*$:8#AA!`e>Y[4Y]4bh9U[/PR0SU4PS,UV.VS0TU0Y]6@@'-*XY7QU3DE-BB*;:%43#98"_aCXW?DE,BD-HH2HH.HI/KM0JJ/GE361$>9(@=)LJ6ID2KH695#IK6:;%CC-FL+JP+EL)IM-RU5SW::<%9;'@C.9>%>@*GH/?C(@E(88!GG/BC)OS4&8:$<>%IO0FK,<@#??*33?A)GM/7: LQ8abaqwnx~udg`hmgntmhoei_T{SJSCO%-D"&;.=[A5K85))j:WVCYUEUSCWUEUSARP>UTCVTEXWHSRBPNAw~}Ψ̽ʺȹǵɷ˸̸̹κϻϻӽԽֿ׿žǞfon$"#!     y26z15 +    T@9fG:kJ=nQAueA{IN8+O87=+'$!"#&# +  &3 L8(Ey:^L2Z=3T9-J2+F2+A,)<+(6$$0 "  !-!'%#2"%5&&3''1#%%'$214̲\]]XY_RR[UT[RQYWU^][b^^ddcg`_d``hgimnnnURWCBK8:D25>=@H>CKBCMAFPBHSEIUCHRpsm~sqU?EXEHYFG]KL,$+RTQ]WUmmMPRruqUCDaCAmd-"&8*59(112Dbl|s|VS\uqmKB>vٱΰX`^cfgW^_a\]_@D*<$^\fe~z|xniόjdtpig|s׉nh҈nkrrxwgfb_uUVwSUrSS_khk^zn  +"% + %ylljmx!  +R[T    ## 493sywuDSJ)-(JK> /;$D4(D5*]J?bRDM2%N/#Q4&<#F1)V?4S8-U4)ueɳʿ|kxcXYB5`I>2"6)!<+TB4*-"0%$(#! K8+cJ6I>3 +      8'!)$ + + +    =F@vgljwsXIpO;gC0cB0]J:zfB4d?/X8'a@/hF5aA/hJ8`A0ѵ̯ȫĪƨ¦¥ĦħɩǤɨЮЯί̭ɩ{wr]vwtvuql[[UHM'MO.PL/FB%IH%DIQX*EI!FH'/2 @A*W\0T^-W^1QV,BJ#`j9JP%QO2QO0^d7Wa2RU0SW2CJ Wa2PY-KL*XY5V[1]^6WT2SS2SV2UR5PO0V[6EG(HK-2171$JE1SK7YS>UV:C(:>%AD+BE,DH.35 <>+^^__d^]d[iofjogejeptnfOEUH\GB, N1;o{~z~vzxcLD62%#.$knY}zinqXknWloZ{lwk|~xt|mzuxoyotzkmr`hm^nrbqvggm\suf__Oz~nsvffgUqudfiXfiXegWkm]iiX\ZIYYGUS?MJ8QM=LI7NK;VSDMI;LI:cM=tn^K{fDJWD/>'(=/1ehjT]`=BH((0  *"+749/)--#C1({Gz>`L5_A8V:/L2+G1+@,):('2#$%  ' +!1$&4&'1 $&,!#Ԭ͹ccdnmnead[X^`_c\ZaWW^NQWQRYWS[\\cVW`zxzg^`[V\YWYddddffpoo:4;3-792;609QPT`UPj^][IQQ@DZCDZHL/)1oumnzoRGN[ba}XDFeHEs\Y0$+@9CF>F%%:;L`lkxstrw|SLGMC<™ƻUYX\a`ߐSZ[i\]?"$.!R36|y|t~v}uriionƸtpnlgf^_vQRsTToRR}ddij_kgqgt  +22AF?tkov}$#T\S   ,"' +zqqw|CSI"5 Z8(rG3vI2P4#%1& hVE~kS5&M0#U7*4B-$]G;H-$K-#uaUugt~ru`RVB5I;2([H=    +   J5*eK9]PF       C.&    + +  + +cgljtaPv@0}I;jK9eE3]@1I=.u`P`<-d@/V5%_>-b?,dA2fE5eG7jĻгϱͰȩȩťħħĨƩƩĥŦʪЮұѯѰԲϮʪɪǪ¨Ưovzw{~}x||{{q]]WPT,SW.NR,OM.QQ/PS-T[1S[-X^0ioDW\9DJ$OV+V[1W^4Zh2\k1Yd.]d2bj9_g9V_2QS0FD+IJ-?=&JK,W_1GJ%FG'PS+WX0^\;ZY4[Y6ML)KM*V\6QV5?@$D9(RB4K=-[K:UK2MJ0DE(LQ0KN/@@)@?(E?.HH21/95"@?%KJ0NI6A?(63"=>*AB+DD,AC'EE*Z`7HO)FK,CG+>@'?>(62%<;(@@+78$::(9:$89#==%@@(BC(67 12>B)FJ/67"?A'>C'9=$>@(=>#69 89#''GG6`ab^a]]aYX[TOPIfhc`d\eUM~ZN}~uK%0*#sd1-mVQcF<[I=V?3fWygVNP@hlXknYsyd|fYTFR2)gWfpw{x{|xn`E>) I2.~tfq{dsyb|w|clnTklUkoWmr[yox~m}twuziqwerxgeiYfiXkn]km[kl\feUhiYXXGTRBYVFXYKZ\L__PWWHcdVcdWbdT`aRKH:GC3IF7SSHKH;JD6KH=E/.fca  !#PSULJLE35R@3PJgS>gH?[=1O3+G2+B-*:('0!!'(!'"'&!,,%-CBF2,2 )2"&5%%2#%+ 0!"$ݬͷbbb~{~z~VRW``dceh`ad\Z`TQXLKUSQXSNVNKS^^`dfhTW[hff@=C4-97/<60:KHKaZYaURk`iO=EYACOAE"xusp]SXkmPWU}]DHdJI]FE4&2C8CMAK%#?@Pjsmyq}t~vvuH@8}l޵گαZa``eeꡱRTThMO,3$pWW_EEwp֌wqrowuzyii}^\{YXtOPtPRvXXqomloprn{a^nQP_kgsiv#   + 4!,./+#T\Qu~t{)*! QXP   +7,&)  +iuk~zq{LRG,S6*Q0"W3"^EvL1V4$4#5%p[K{cS4$N2(\;,E&T<.T=1H/$U<1yyno]OwhUI]E2wZGR;,1!N:/,   + + +   L5+kM:UF<       0    + +   +zkfkitpF6pE3s4(yQAhI6iI9[G7mZK]7+]<,R3#bA.eD1eA0`?/aB5N7)ȸԹеѲαϭ˪Ʀʩť̬ѯԲѯѮϭ˪ʫĤĦx}zyj}wxt{vxymVVQII(JJ)JL,HJ(MM-WW7QS.JP'LQ%\f1Q]'W]2MR(T[0SZ2NV+NY,Q].dk=]g5S[/MP.KL.JG1@<(84!ED(JH+EB+@="UV4QQ/LL*WW4ON,UT4RT2PU2U[6FF)RF1XG7SC3XK7WK4XL8ID+EH(PU4=@ FG-MN0IN-HH-cc<]`5TS0NH2\X?C?,22"21RU6EF(MK.^c8QX3:=#MO51.2.!73$:7&85%<;)54$<='<;%B@-<:$=@)02AC-:;$EI-<@)++AB--.87$FI+AD)FJ/11GG3`abz{gkesysZ`Yc^S`RwZPh%#g !+&1.0.w*&|lc;=27%!?)%D0']M=C7+HLIaf_MRD{n~o~i:/#D;`R6_=5r^nxyo.)=>;E' XPrb{rsyb|oxsxaz|dtxbpr^mpZklWkmYv|eyip}m~out}iy~ls{m{~lu{jnq_abNbdRfgVcdShiZ_^PVTEcdThj_YYJRRBYYIPO@MN>RSEWVKPN?cdW\\RFA6KE8KH=v~}Ү̼κ̹ͺͺноҾԽº¼н<:=.',&%%"$ :6:1/4""  +n065:I29" +C51ytaiFOvHdJBlTMbPKPHEXQQ0 $/"'FADJEGE78YB@k^BZatbVpUK_C5Q7-I3-@-+9&'/ 0!'/+075< %%)%*IJK*&&,!3$$5&%0"#-4!%PUSܲҽbcbkkmWRSzzica}yzutSORa`cmmnYWZXW\LJRRQZGGS[[_lhePKQ3+86/8B=DC@D[OWYKSPͼԨ׬Ǭbij[aariiI'-+A&){wwpolkoccqnii|__XXsQPqPQxZZwurqmjza_lMNeEDaCAcHEpXUkf~zbkhphv"  7' 53.`cY6'" HMAr~~*-$ LSM#   +0' , +&%! 3@;szVO>tYDu^U0"Q. ]:(c>#]CU4&<) E0&raP~hY;*I-"[;,L0 eL;bG9G-"xj~xndRD~^MDYGU5(jQAU8*a@.bB/`?-\>.X8,K)غѵϱʫͭȩ£ĥƦŤ̪̫ϮΪʩ¢¢q}xdzdhxwXXSBA&FA*KJ/LK.B?$BC$OP/OP0EG!\e4PY-IL*KO+SW1JM.OS1NV0LS,[b6?FUW7UV7IK,CB*2,HF.CA#EE*;4$74 98KK+NN.UZ2[d4IG)JK,IN)Z]5PP/TM5[K8\O9QG1RJ1\W:VW4SX-R\,RX/SY0Xa4Wa5QV.YZ2XU4TR3ZU8SO/C@(85&=;*KL275MJ-FH'LN024AC*33 .-;7(:5$>;)41<;'9;$76!@>,73"BC-..<=)::&CF*<@&&&<@*:;$:;(?@*HJ0<<#74!88'fhhbi^dkc|{xwjpheh^fYk\+"62.,{uyn' to' 4!qgyaUCF5EI8HH@=AAJOOtue}s_|lcZJxVIkWG?h<=|HJn4*}fh{bV+'50v%=7x}u}hylmr\or\kmWloYhkVmoYoq[dgOlnWqs[nrYw|dw~iv{fsyeotbhmXfgQuvfjnZgiVfgSa`M\[H[[JaaQ\]NVVGfgZ\]O[[MVTF[YINM=OM>JG9RPBRREQOD^]TIH((<%%>((F,,J8$q_fldx`VgJ>U8.J4.@-+8%$1 !.,#5/1*#"% 5-2, $.!/#2"$3$$4%&1"$/%ײмeedlklPNPxtt|yupomrpqmkmigf^]^xxxtssVVZ45C00@*,U6P1"C-&C%xbPg^B0J-!_B1Y9(x]JaG6C-$F60\NFrcYr`U}k]UP@8Q:,ua<(C2* R?5  +      +F1%uR?^PA      '!%   + +   uf~fji}zkTAoF2iB/2&'$sNOeLLlNPU>H]J:sc[=/hG5cB0^@/K1#vaSG'ַӶЯӰЮͫåɩǦǦ¢¢âáyyx~xext`vr`~wTSR95"PK3NM0NQ.KO)PV/PV.RX2UZ4[_6EH)FF-HJ-LP/OV3AD%JN+LS.MQ1MN0;<LL-TX4>?!41FH+20?:%6/FD-98LJ.WY4Y]6\b5RR0^b8^e6XZ5VT7QL2VN4SL3UL5LD-PP.V_1QW+LR+GM#MR*JP&LW)Zf2`h5`^6XS0ea9^\1UT/=;"41"72 9:$HP*V]7AC(<<(OQ776$/,73&,&94&61$53#353165"CB-<<&B?-99$00/0:;&1.;<&CH-55%<<(79!32.)?=1egdyvs{qu}rwtyupvjsjZZ>-t_W4G^a)%# <6:70 T=4WKZNgXbXHeWGkVIaIBfMEZED[ROQ>0}XKwd*)yCFOQzpS;)pYoxzO=4S-%YIsbKA\Ymr|f~p[mu|gv{gpuamr_txdvxdswamnXegPmrZswbnt`~sikU^^JikWdgRcbPln^pscln^abQy|mqscstedeUabRghZSSEQQCacUPL>NJ=QOEHF9QRFQPEQPEv}}Ұ°онϼоϼмҾԾü¾ľοGNL@>B!+$)002@AD  &{1726]FL&/:!'  D31dFX9/J3-A.+:''5$%1"#4%%<*(;)':*)6()7))9)+7()6''4%&5$"4%%/$1">>;ձѺ___\Z[TTTSSTUVWOQTEELUUZ__`jilLMUkmtsvyfhj[^e]_gOQZihhic_.(60(2PLQtspԱd^b}zbZb)!']_Z~h^_i\^{|Zfas~wqflx{wkowilpbhb\c|v|ZTMMA:Ƕ֪׭ְٰ۲۲ܰ֬δU55'8%+v`boVXyZ\I49F9?{z~zǹxslisTS`EB[<<`DBr[Vtmii_{tbbWhg]rohzypakhojz$ "  8%# *30{qoz|trigZJ7)N,aK;4#4&  A.#M1 - GC9u}kj^LV3'G%^7'pYcE2g;(E&V5&}V:uI+R1"<'O,!qU@bE0M.!M1&O/!z[FkL8A/, +#!^NCj\UB40H2+qXJ8$E6, YD;#        N6,yU@j[L      +/! +1# +   + #  +we{eki{{xu~rzt}~gO=pE4b6)$! m1MR:^bEVP:N[I7{_N],"_7(gB0^;+L.!j_KoWGյаҰϫޤĤ¢ɨǤ¢~hkpmv`WHmiUxXXTDC&MN-OR.Y]6T[0OV)S\/Ya7Y_:WY7PO42168PU5AF';:"<:!JL,25<="PP5GF*SU1MM+JL-85!-(/(83:6B@'B@'FG']c9UT0^`8cf=]\;[[:RR3HF-HE+JC+NG/H?(NN.HM%IM+IL*JK)GH+MM/NU+am-gt/dl,bc+nq7eh-mu3hq6^a7X]8FL+OZ2QY2JJ0?=)MN7)'/+75#1+ 83'4."51$1-1/41#63"><'1/3/!99&//53"*'GG16:"53%2.9:#--.,CA3dfeouix}qcg[v}qhZC`K=8KUKj^-TB5M?;9.;7%#'%=!DwKFNLgYyfo_rI;e>0m]WGW`JYZMB9{l|7+O=X,$ty{v]vy^t}gx|tL U2*Y3#_Lwdp_xr}h}geSeQu\u}hps^np]qwbfjWhkVmp\knYknYfhSfhUot`uyhhiWqsaprbt{lmrbx}mhlZaaNegWXXHVVCYXH^_O__PUTFPN@OMAXWKOOBee[CA4QQDSTKw~Բ´Ҿнннѽվ½ÿĿЖbhi##/%,$!&ipqEMO# ! #59/3W7<(   ?/-^D:lE9h/'xKC|jJZa\zkJdO7Y?/Q9,K7(XH0qg*):''4$%4''9('>+)@,*=,+=-,;**7&%4%&4$$5%&3$', ,ֳкZ\\JMPILQFHNDCLHGQIGQLJSOJPPNTDGPV\ihmwrrvnijfac][W˻xq2+96.8PMQib_vnf^^UOV.%,w~qzcecbZYrmfehpuxTR[qqzywgclonwurnH@8tcׯ׬ԬدխѧҪҩ۵tgH.5"RHOXRYd]fQGMPKRLKRmmogkkpkoocfX>?Y</P3&A-$ O<3, +    M5*y[EbVH +    9'(8$ +   + $ + +vaw`ebu{gQ>oF7K%&z!"q(2P3N\@MJ28X5'{1,r!p"h c!ZϴD-еӱΫ˫ʩʫťťĤģ䢣ĤĤģģŤ¡~}~hvdztfWXT;>PS/MN.NP0SY1S[0MT,QV/LP-FE)HH/NR2MR/AC&BC,432/LN.NS054??$;8!3-QS2AE%)"'!6-"<3&3) 60!86 KM.OR,V[4ae=`a HH*CG)57!22Zg+\l"cs+^i&ai+SZ"]a(^l$hx-jw0`q1LW)JU*V_5A?(A=-=:(+(.)RT9CA*4.!0+3.20 .,73&;7'DB..)96)55#*+('% 75"33@A+(%/0;=&45"?A.```kpcptgoujyzv{y~}u/(">Tc2.1M=?UFuh$1.%!52EDy;;xACJ@gQ2k\H~fUhjlxykof+":. $" 4*(K;2xy}cL>c$ D;v4)M Z'f=.UC^KhR{XTEv{|p{pzm|rqyfin[mp_ln]hlWln\{t{qkn[fgTcfRgiWmp`ijYegWnqcgiY^^L__ORRBSSDQOA\\MceYVYMim```WbaWVUKTQKv}|մŶҿѿѽҽԽſҿchi__cioq%!'""$~49-3\/3137   + 9((^E;h2+s&&u@:rVFYnre[SPOLW]p{\~cYi\fYx[ReD8W7/F/)?*)?+*>();)'6'&<*)@,*>+)=+*9((6&&8'%6%$6%$6%%3%(0$ֲϺZZ[AAHDCMECPKHRNKQKGPLHQLIRIHRYZ_k^_jSUaLPlVUkRQfTT[WTa[[2,8609A?BngeQLT~~{|RTVxvg]cw}}}xw}vuwJBi='J&]9(xN0k@&Y5%;$[:-_@*}Y4S6(E+!e>,sN5Y;** + )YJ0,gK>I+6!+<*!J7,  +    + N:-x_JkaT      >*4 ;%    + +,  +te|ejh{||{}~|mZHfA2?'-q(-~n%"W6GW@KC/-]8'z0,p{"y{"syj]I԰ѰղͪȦǦ£Ť¢}}unfqVVT87JM,?A"HJ(JN(EJ%MP*OV,IL)LN-GH)@D$>A&73#41)$-+)'/+-+64!74$6-#-'74#)%/*&"%3* 3/ :9"AC%HJ)RX2W[4]]8aa=WQ43*1.85#"!0.;?!?C#CE':9!88!@B&@B!U\)XgQ\ Q\"Va#Xa&en1er.`n*cm/`m*gw3eq:V`2`g???&>:&JF&pkMHA.>B&HJ,><%;8%94 JL0=<(?;+0,,*2-!:9%.1HM.BF%>>!V[5Zd7V`5KP1DH,=F%=A*44%deezsmqaotdek_hmbsxoadZ ?Uf!8DFODeYwhk_FN&E;:6=CJOvK9u<~LM`[^V *&!6 <("#(dYuaT{}u[%:{"(#$YdUsv{W`R{mwauj{szrvoqvdrwegjYdfSSMF3*$A90baQ{ryrtchiU`bNjkXWUCUSCSTC\]NYZKYZJ_`Qjm_ztswjjnbgk]txl_aThj^giajkciicv}״Ʒ÷ӿӾս־ľ~::=HHKSUV`ab=@C" &n,2(,u@ET_]  +/!Z@9f&#p'%xNDvWGuXJoXpj_[Y[_c{]zhV|`UgZaW{^QuVKgE:Z:/I.(:'%<((?+*>,*>,*=*)?++B-+@-+=+)<+*<))8&&5$#5$%5'). ղϹYY\@@JFEOFEOLKSIJPJHQHFNEEMKJTNLUn\^kJJjJIiGGiHGnXX[XXbccZW\2-6C?FHIGĻ~j`ZlbaFBK! /,-~}}}TUN1(-/$)) %%!)(%-.,4SU[ca\D96ԪժԯҫҫӬҬѧӫ733{pigXNkOEZ;6nZSwq~zz|ymQKBȎĵ;ʼ|}qQQIXVNFE,D'G,kD.lJ2L6'-##1(( 5'aL;|j &5(#{cU_A3]G<\E8A, ^H; + +  +  H6*oZFmgY! +   2 Q7'D'=#    + .  +|gyche{{}|~z|}}naOaC5XJOi$*|!q&#\8DM;?!GI(DLW^-KQ&HK)SW0II)GG(PT.FG'3/3-;7"($+%$ -*;<$52 )&B?/)$1+0-'%%!#-$$*&><$RS2KP*MR-WV6ed@lgFaV@FB'ML,78BB(DG&AA%<;%62"/-HL#]i(^m$Xc%INNP$OR&OU$T\"NVOV%LO%PW&fv2iu5bj9Y_7_b8d{thG1)@>)OR1DJ%TW2UQ4OL0?;%<6'75"31!HG2U_4Wc2Wc1S^-X`1LS(JS'NX(U_0?H%KU2EI-66'aa`hk^cdWY\P_aUhi\k^>q6r9=2#|RDlZ@2.=' qarB7-.y "k>#ɫSw!w2jkNwqWR=6Se("3#  +kJBYOpJ0x@at~j}t{x}pc\Z(#y\<2eZG~jZpjXX_Tvl}s}zv|irTD\PJ6,8+*RCC3"OI=[[Ggn[|mq_YYGWUCWUBbbQztw}p|srwkuykx}pw{mdfXhiZ]\M^]Ofi^ilbw|smtit}ضƸķտӿվ־ŕ236oux/13A@B""%/),V%*$(l$(  + + 4"&S84a&%tB:nO@mNlJ}_T}eZ|j^}m[}pYqYyjSteSr`VyaY{`VcZ~aUzZLzZMxWKiF8[9/K/*8$#7$":('>,*A.+A.+C-*C.+A.,A-+@,*>+);'&6%%3$#7)+&RVQԱιZZ]CAJFCKLKQNNSKKQKJRJHQIHRCDLPPVpaa_BClMMnKLnLLtddUSSgghusv.(2LJOmnj̄zvshgٗ},&0FFDz~~tbi[abZ3-,4/0700:34;46{zB:3thYϫխׯӪӪҫخխԬԪݷ\O=ݾٮӱ¯ŶzzoOOF^]ULJBTQKkwuEDCZVRCA;QLH}^]W^gekkv  "U7*3 %)%xii~v?E= % 4"eWEZE5cA2gVqXH_C3G*;%Q/sM5l='[0 F"c7%gLjE.`7'E$[4#[@kC*V2$C,$T1"`8"aNR*=$R7(ZDeJO3%0%$:12&4$bM}k,;/->/'gM>Y>.6!8#% \I?"   "   G9,sePqm^    2 Z;+L-F& +  +   + nuoeungliukY`@5D29h"'ul ^AAGA5E)V@2ok!l!w"~'%bDH?bMHŮϪǦǨä£ġɥģäģ¢{axitTSR'&BC)HN%NY'LU"UW-JK+RT2JK-DB+:7 FH'BF!><@>#-+$ /+6635<8($!HJ,1263::!# %"&!%( 5/ RR4VX/\`6KO&\a8bg8^a6WT/\]1ag4`g8OR*Y\5>? ??'96FJ"ft/fr&ISJOMP(;;====LN&=@U[,HP [e0fu/fr0_f5egTjDXs>OlA7BfXO62I0*fVt2)###!Y70ݼId_gebZ˭=AKyy_fe_F*-x+0nyhtm`esaYK;VC3gtceo]u|hon\~{n|~s{tSI" V%!>2.P4,iKDmi[fmYmoZilYvtgcdRWVCXXEuzkymqbgkYyx~ofhYRSAPM{JMN+(+ "T6<&,y#'ppDQN& :))I1.b=5pLAmL=H<^ecgziw     M3%7b`}e{p.(!" [ZSLA5aA/bHg9 dG8kTAfMrYF(8 U1!lA*n="a3S)W/iK4`<$]7(B%\6$mB*b8$R/#G,!T-iF3zukS6"sZ[>/1$!;0/:/-N8*bJw9%+!>0)k]F, K6-?(([F;/    + +I;/xp[|wh#    =&[:(Q/V1 !   "#  okkbccdjg|wehB5U)/kum$ C=3CN;O-"N6(ɳ_0$mu&#v" j(EF;\[[tƚħĦƥĤƦƤɦƤã}uTRQ*'89GH'RX0V]1YZ7ML-WZ5?@ D?+:5!@@"9=BI DI 783131! -*)&CB+NR-=A99 9:"!!("(#1,TQ.^c7cj9\c3gnAkuCluB`i3iree\f6_i9ejAopKhh?mnIusQmkFRU,GK&GI)KI-CB'96@@&DD%SW/PX/IO+MU.GN/]^a]_Tpd@}4,~e!PaM!nGQA"CFJ>HNRap5Ic>TzF5:e:.T2*qa{*!};Ǯ^je?[c`_H{SfHC["97TRNET2/W\e`]5֯(ղ*v]#.>U2@\01F()0{cYteUZ[MSULneXh[MeUDXK;aC:ySI`NAaeMcjR|qcj85u;6a<2f1([Of[||n|u|ygt^}eTuzrtbkmYrvdtwgqsdlo`eiWgkYv{klrcz~tMI:QJ(%4!!4"!=*)@-+E1.H4/H3/G3/C/,A,*<)'7$$7$$2#$:).ԲηZ[[EDKDDJCCJBBJ;;F??HWX^WW^UU^]\`l__cDGgGGiGHfIJi_\[[]~{|8/5@;@͖~ު!$' v}qnyg]eWfncpumqvmxyp_\ZJNO9=<'(@5;@26L=;J70isZ|hNsaGjZBfU@cS>eR>_M9_P@]O@fZMHDBVJEG;5ȹσzSPJFFEURMJHAJFAUTMih_`_XYVOvBA#K.kC0h4a5"N&X5#iM9\7$Y5$>'R3#Z6c;&S-P. ]8&ų®~|gtucVE^F;RC>XEBG1(T6(~-:2/#P=6bG8J7-M7,+R;0;% +$    F9-xczvh$     A&d<)M-I)    #!   uqqiijdif|}~~xiE4e?/k-"sj$:?*wW=0T4'~j{e'e.$p=2^w?yFyq|YquIqrIqqHloAopCah]c9bg=df>de=[`7vyQkX^/Wb/Yb2emBbdfkgVg%t^9v*K=(JV@A0988UVTKOUW]d %eC8S.&\Os-$ &$v5*F]W6Md65;pY5V|L`D3nGWVjEFcgPGyeOě:հ 8)7O1Lg,C`quq`aRdWvF=63@;C>JwJDƎqN@^`J`^IoC?xBDpG9XGgVsdbVk]}jvydkepnq`v{ihiVeeQhjZv{mptgoo`rxf}`cVWUGSSBXWFYXHfhY{zvw~ݻɺĻºüû½ľ㒑lJN_?E6 '^#+xi #==;  &@12aE=lJ=tVAy_EyXN~]Q}dSr`pYGqPFiNDTRa?GdMEOpTJmJ?mIAgFFgGGkOPe^[][^PGK513ԋz]SSB=? !iofXaQhpd{t{jkbtqlMGH^WWaTVLRS6:9'&C9AH>ID>J?4@I51XI=´yUWV<;6^[TFC=WUO<;6SOKIE?OKE!KF?[[[<==>>?"(#!1(&Y<-B%"7-#+ N2$^:(T2U-V2!E#S-V+[;'{_DyZ?Z5"Q3&>'G0$H%h:#Y7%F&L/ [D3R3$O2$2A+"B&[8$T1Y>,ŷŴˬycKqXF`L:IVJ\`QH,H82_OJm[Ux>1*$7k[L4(G3&3]B0cK= + !    F8.~kwk*     ; a5$R0 @(    %'  lllededhe~}|~pO=a>-a<+e^&FF1}WN>a:/eD3reF5Z<)^?/bA6}n[Zvk mkŧĢɥɥ˨ɨƣ}xTSR-%0+=<'VS6\Y9VY1bc:`e7go:^a/[\314*((%1399'''#<<(2368 +)51"><)13BD&<>"DD)*,+,-*AC'NQ.V[0bk6ls@hm?fp^d5]d4`e9`c<[\^KB4qUi }}-"I4bK'dO.=:2fnp^VGLB>1"4#;PDTEODB:hQPLGO4%%]?8iD8oO@oM@vUH|ZOz^O^ykKnOEnJ?iH;TFK@EcKGUlRGwVHaUz\Q|cY{cXjI>^?3U=4B.-5$$6##3 !4$%:()B/-F2/G2.F2/E0-A+*>*(:%%/ҲͶXY[::FA?L?=I@>I=>fEFdEFmXYhb\˹HGH廵OACQIINEFibb-+2]^Z|uz{qwneWQNfVWcZ\NAFibd^QRNTU022!#9)0<)1@-4>,36'(dYHy|t]_Yfmk=BB`dd_caqvwKNQ88:<;<{~sYVRmxxGHDVSKHFASQK<:3WSOJGBb_Z^\V@?<\XRFD?NJEYZZ͜IF?WVW?;6=83B?:B?;61,+*'/("\@.D%/T9%F/M1f:%G$O1I*E)J)K+X<%tV9hH3>%B+A-C.N1#P.N7%G+F/6#9 G-2 2L1$Y5#R1`L9Dzy\J<+4.(+#;#!-$#5(%XA7p`XB7  aNCK+qQ?bN=5 J-W4#B+ %  +">0)}pdsi-     @$W/ I,>)!  + + &)  ilk]dadhe~~wZFeC2oJ;[,L&VG2yF's}g^;-`>/^9*d>3[;*Etʧɦɧ˧Ţ{|~yTRNC=%3.IH,ZX:TR1MM,[W4\Y3fb@gc@=51,#$!)$" +$ '! (#)%0-CB);4#-'%"'#,%40ML,KM)_e8dmliEuwLa]:_Y:da:fgDTUX2-+F3sXs!4o5r-uZ1.'_eYp97,%6,$,%"'! 6 q92HHL;QZo\YgZd=1RBFB8<8# ~K=`IBZZ t/*RGpZ÷cЮIЭ)ŝ>Y;~^AnWO]+-ON+(g2(yL@p]GV=.10o1:6J=K/+R6n__dV_iZGD6GB5NRHsxgsycxsvcpq^mnZZ[E\ZEZXHfgY]^Nqqajj[rwky^^NSQBPO@w}޿̼ǻļþž2NE&G>*H?2NE*J?5XG9M5\>6bB6dD7^?3V7/J3->++>++?-,;*)5&%8()?*)C.,G2.F1-E0,@,)=*(:%%$ճζ[[\DDM@?JA@K@>KA>L??H@@J>=I89CSONZ<;eDGcFFqdcr_[Y~{{f]XNEHMFI[VVyssYTS}"NMQPMLia]9/1s]YOFIn[_oegH:=nhgNDFQUU677 ,%,@4=3:E9<|~tcV_chlmryzGKMjmnHLM336?>AkkbOKG>=9PLHMJE]ZWlvtFB;^YSKHCb`\rrs?=8]YSFD>MHEY][MHBXXY-.->=;ZVQKD>I?5aSBiVChN;W>)YA,aC.[A-R9'V8%B(G.G-D.N2!R1X;&gI0V:*<'@-G3"C1"F4&A.!M8'L4N8(Q?3J4&dL;nWEr\NW@5`H8_C2aM>J<0dSF{gܽhlXIG*aF:`PG9$ dGATG>dgXsvelp_qvhznv|igiWnq`qtc_^IWUBZZH\\I[ZG`bPopclrcqvfZZK^\Qw}ܿͽǻƽſռEiY)KA'J?2PD.NA,L@-M@*G<,PC)I>>A9Z-&q&&qINmik[`]U:6gB5jG;mI?pPBvTIvVKwWJpOBjH:gF9bB6aC8jXTm[SkRFfMDY>8R92S<3U;2O2,I/-@,*. (2 6$$7'&9)(:))@.,D/+D/+C.,?,);'&9$$$ұ̳^]_[Y_YY_TSZKISDBNCBK@AH?>H>?HXSPп^DD`BC`DDj_^įQJKNDG[SWmfg{x{xx!SSW,'/oad<14sqOEFdOOnce?15qjiD;?]ca%&( %-$+8.5:-2516<18JD>pxuiljnusDIJdghsyrEGJ*'+::;|{xbcZOKG{EDBXTOLID_\Y҅DA;\[ULIBb`[A@;[VQGC?NIFJDA\\\TPMJE@HA;F?7C9.>2&A5)G:0:*X@+W@+XD5N6'E1!9$4"05$7';$V:$M2>+7%@-<,OA7B4'=+>-D4&?-!:-".lXDkT?<&/$-C([?2Q91H4-7(!{hyeRNO@>?6=8+0#%)+}bSU6+bE;mKD\Z=9,!WLE@-&VB9lWGy[KR9,N?2ZB5ZA4 3%xbTVC6"   +4"K0#A%A-#   (  Va]Sd_ejg}~gvR@?-(RYY^LCbE/¥r`KV0$L7'yW6&c<2cB$WƬŢ  zw\WU~dL~`v\KmUCgP?|fVm[xbiizpW{oV}e{yeza{tZ~fugj}`x]i_w{}z|U~xJzQtSodHG<%G<&MM.RN0@7";-!@2%D:'WM3aa8qyJwwSldMm|v_ydtwjT{p\myRp}rYwnR}}^fs[|wycbnu~lh~tlfwg~lvctpUTV!  M8ao"$1<3T`\)=zH>&  $/:EyjsY+iPiC~N*tH+[8"p8^@"pVPPE3.t/3P#(GKq>Dhhjxhg_RQ|l^ɾoldDm<|kUPʽkmhzBHEKfPUj}()'' ,.q'^D/gQD<.H;{KC]4-qei^[ZOYXFZZIorewbbQppasui]\J[ZEYVCTR?WWG`_O]]MfgVik[y}pbdYw}ܿʼƾǿĿbr&E<(J@*NB3QC0OA+LB0OB=XG2G:2G=0C;I82yI;r2'o#["'t~tM75b>4jF9kI8M50A,)3 6&&=-+8'&;))>-,9((:((@+*B.+A-*?+)=)':&$7$$2/,Ӳͳ[Z[?%    +.@-%<'B-#    +*!  +#UTUUXWfjg~mWEH2&OQPkUZlM>ũdJ6J'jW6*[4*qU$Nªy}uZUSvrU=jO;S9)O5qXN:'ZG6jZEzd{rZ{coxh_KjcIsoKkeAwlSuiR{tU]Y0~zPyWxqK`b~^t~vLwNz^eR@cRDm\LB3&2&7//'<,$B1(H6-K9+i^I϶~ѻ}{cvp\ndQg^Mk_Km^Km^Kt]{YnudDv]~oVtXijq_pbrdwlqnxzWfhBxuVxfz^dohz[}Xaa9brsj{|UTV$ # "S>tVj0>1NZZ@gM D(pZ)9)6(=.XDtXk(t'/CIQ]XH66>iK@OGt:AW-5Z-7A ,_5;qRYtLSz@EA=\S>=*.aD_(wl.-01]AHͯ}zb$%~!"$dB~c)3%&)<;Bg*#fYM0$SA4g\LTTF]ZMgk]qvfXXJik`in`jk^ceR]]J\\H\[I^]MghXeeT__NcdV`cXw~}ݿ̾ȼƾſƾFiZ%B;*LA/WF2SA2TE,TG/OB;MBC@7C92Z30U--},+9(c9%h''cKD/0]:/gC5jH:mK?oLBmNCmNDiI?cC9fE9hI=mRFw]Q{bV}dY}cY~dYx`TsYMeH?\A6dMCN6/D1-A/+A.,A/-A,+<,*<+*>*(?,*@,*>)';'&9$%7$%JOHԲ̴[[\=3':-$>3-:0';2,:4.@:172(91&8.#3(7,%;1+<2+?60?2,A8./",ucSx`NhL>oaiYcE/ueRQ=1cL?O9,2% # ~rn8+>3=1&?4PEQHD8s -$m2*d@8S;/pO?wOEqI<=!')A+9'"    +,9+$7&:' #  "DBDLLMfie~}q~^\QPLJRRR\qo=?}ct\:)J/V>0]7+V:'WRáá~|`ZXsYErXN2tYt_HK8+H:0:*S?.vsWotdGp}t]qjJquq|}qN{aukhyZrt|fziTtdSXG0_S@^TA9/2';*=+0G7*QB2zt^ʶӼʲcbP_[I`YHxeym[o`JhU7~zd}pXzcqU|deczsNY[txMhkBoqMdgBSU0SU.moInsO`l[{TpjEqnFfj?ag:quJ\||V}zX}UVW% &"% %X@b&YG%HHD|7$u+9Ģ0A)8'A.O:oVg"Q3X;"S7P:& +MM AE~78o-2GW +`x20EDIJMNFI26=4|WCwʯaZ" yY&qʧBA_TU74]PqFB'/3.0;<:8B`C3mG8O7(ON@RQCccVxsw}kuzk~nqgbeU``OcbQb`ObaPmm^bcScdTij\`_Tw~޿̾ȽǾſǿ٭WZS,E>H>=GCAKDDNJKRLJQDBJ@>HFFLUNNlXWdFJ_FFlZUūxxuwxrǢÒ(&'JIL5/3gY[E9=~dcSIK`PSmdeF<;ebZb`Vnui999::92020-./+./)--'+,(+H=7̴X]\osrTWXajjAEH_bdnsrrvv@AD+)+557]]VKGFB?:WTNOMIidaږ`^WccYcbZ_ZV qqi}tqgli^vrf}xoW_^KqeFi^LpcHm`If\BXOBUL?UK@WO>WO3Deid|~~vlx~yILNODFYjL`b@.zmW]7(YC0|j[3'R0"Vts|yzVPLmW[@*aw^FSB4si[g^O}rdzk[\H4fP6rg[ExnZsfX>p_G}bpbHZM1|bs\hU>yYsPr`?oSiX<{b{oOthGs~~Y{S_uXy]vgL`P:j\EncMmfOtoZpm^om\~y}{zhkkiWgdT~zjsm]rhZi]MaRE{bu]rw\s`Ht^S4llFUU-PS.bcC\_AfkLheEgg=di@opProQzxYvsrGjn>nrBfj<\`6OR*`h:dj;{{TpoSRT(%#.*(/+,-('+ cH$u#@- 7-$Ai!v3+r*3z/Aǥ9ҭ;ʦ(Ƣ+:tQ|]*2=Kp!*nV&_5#m'*`[ LJ.!:))E+)c@4iHaD9aD9aD9`B6cF;oUKrYNrWMtUKqSIkRHiOFeMDZA9]G>I3/=*(<**<-+A0->,*;)(:*)5%&2$&6$%7$$7##6"$#Ҷͷ[[\KITOMWNKRKJPGEMLJPIGOPMWYWZIBA~wmZY_EL[ACS87Ķк͹rrk~|v/-0JJK6/3m_`F=?wdbVROYQLosi|u}v}wci_88899:887788788556343544UOFǰZb`nqrdgirz|?DF_dc<<:B<8><<\[TKFCcb\hg]ljbnjdnkbȺ~}szsjnf|øĵͱXb`RoM~lO{kCi[VymOqcMreMxhMvgQvgYoQyjRxjLufNvhMrfIk^?[Q=UMF\SJaYGYQ@PHIYQBOFBMF9E=9B:>D<9=9=B@IVOCNEFHBCFAFLGLTPJQLKUOJRKHNHIMFbWHvqdJ̴_.#RIz6)REbT`R:.703)TISDdUte}ȳλuvfsкënyg 1($2% -!3*#! ##;45LEFghd}{ohmpRCIpCT\:Eg~:?vhOn_IW1#{kVm]JX5&l\H`8~~vlo~nkhD3%PA/D/G/xeSd]HzbwkTrdPYJ5zhTo]IvdO`K3u^Gwap{cj`o_=jMsaG~pVg|Ur}Z\rr@wo@wL]mWwRueBn[?o_GjyqXzaxrZxv`|iso\nq~~kywemkYqr^pqZedPxsclkXqp^_]Lb]PlfXlaPuiYgYEfY=dU?vkZukFumJqiJUN5G='v`yjQqkOtuTvyVrtMfgEbcD\\>igF`c=`e8[a1Z_2TV1GF'X]4quJusQwwXXZA>A<;=KILC>A0,,7)}b%y]8$H8(k:6s)!#r5à&&Ǣ)¤%ɦ%ά=8>%D% a$lI?ZBVxD8ZNeSZ3%7@&&oG;|,1276nVSI.'RIs_O^U*KGkK@iJ@bF;X<3S82U<3`G>aKBiRIjPEjOEkNEhMBfLBcI>_D;S81W@8D/+8(&6'&:)(9*(9)(6''7'(/ $- 5""7"#7"#6"#+&$Ӷθ\[\IGNMJRTQXTRVNMQTRXHDJA?JIHNnc[ƲxucKNkSUp_]{xt|{XY]a\Whdb637CDDKFDVMHjideg[vwyy|tx`d]99:99:889888789556344455[UK̯und°®rj\ψ_]Z^\TɺʥҾ˾˽ɿrsnɳXb`VqQ}lUqVpUykRvhRwjQviTwlRuhMteRyiLscSvhTxjSyjTuiPocRuhRuhRwiPtfRtgLk_PobTrcMk^YxlTteVqdWrgTtgZxiQh]Rh]Vm`OfXUmaOh\WrcRj^Tg[^]LPF0jcNò§fV]Pqdo`vRBzhvf~ma:1A5I;UJ}ĸɼŴƸvnW~aQo_vRAx~l0+#-2.)*#+)!64,2/(00(#")*&$&!%$!'$#")$#@9@JIKEDG,&"U@#hL!9%K<%iW5o sjww#bK s!#"#ʦ0)ez18Ȣ4͞742{3y,r vM_0L(m4h2$yJB}\TnO+ڲH̲?B!fZVM"& /)g2ɣ-͠-c4S, H)hTwN':"7!Q*"W%+-*&#62TQG,*mMÛ,)NyX^_Pcg]LMEXVIRO@SQDYXL\]PTVJadX}~zcgY~smpemnc^aTkpcz̺Ƚȿо3<$'T86X63 % !'#)$)%*%*#&!!*+% $#(~q4)KbW!$8 !A)'*, @('Y:1cC8gH=eG:Q=7VD>bKCcKC`G?dH@gMEhOG`E9?,)6&%3%$3&&4%&4%%4$&2$%-"."5#$8#$6"#2"uxtҸи[[[GFMECLUSYMKQJIOJKPABHBBLSRW~obfSZjX]VLSACJghm~bcfztphc_a[ZA48?7=A82:18>5*1+:G@2>5*2+)1,.51(,(+-*::8ghdd^hjXiE]RqYtGsW,Q6%}y{}]ZVylTi]EkdN__LgbOZN9rcLv{paKu[jo[EqaIfr}[~`jbEȩѯriDme=bX2f~pS~cmPojX?nhZ@m`OobMtjSqgPvlWogRso[~{frp^utatq^pnUsqZjhSxxd~|grwsbwsbc_Mqtour^hdR|zhxscwn`e^Q{rdi\NaSFTC2PA4I>3zoan_Jj[FvgNic@rpHik@^`6Z\/UY0ZZ0X\0_c:XX5MK,]`C]cBacCeeFbeBinHcuRRT" /.00.0:323+"-"0#3)"D<1hJf!tS ~_dK]Ie (sS v#ģ7Ť( '1+ȥ Ү$Ӱ!Я&ί0˩;6v/Wy6nFkHZ;?' _?2nF/_Q(,l"X@;Yy>L3JEINHEW8r@L&37JWA<2{6xL($9:c,/rb8%(@k`8TQBTUJPPCY[NSQE`bSgj^^_RbcUhi\^^L\ZIhhY``QffZ^^Q{̼ɽȾѪ}{'$%z#(!%%&,&+"( (#(&*,.$'"&"'" &#*kOL""8*)%5///'9'# #&H0+X=2`C8bD:bE;[@7O93J93E43H:7H72N94T>;W@;]FA[E?YC=VA;L73H30:('3%%2#$1 #1!#/ #0#-!, 2"#4"#5#"5!$ԸϸXYZ==FEFMQPUYW[MLPLMORRVWUZPLPzmԳLCKQJPONTKNWUX`\_cosv}tspnhHBD #@B?}w~vy}v{y~w}u|UYQ:;;99:88988999:78856779:`XN׬ԩ׭֯ҫӬѨϪϩӫΦЭk`Uǽ˱Ī÷ԽĆůYb_V}oQxhX|nQvhPzkT}nOziNvfV{mY}oV~lMxgP{kW}m]rZpSykW|nZ~pX|nX|mX|kY~pZrX|oVzlT{lTvgUueY|lT{kVzkZ{kVwgWwgWzi[ziTtaRuaOtaX|gUzhAWJNTEbZFyc{tpwlSfXBlW|eяxמĵ{yqp^qm\ytbzsc|ir}l~xe|gwbPfVobP{r_ulZKQA7G=:JB@NFARH;L@7G==PF@WL8LA;QE?THCTIeT=cN9TB.aP9rcLpeQ|rXg]S=qfPqjSf`MgcMtpYjfPsnWtnRhaIe]Gd[CjnhTngRplXc^Mjuqz}zj{xgOI:mfWaYG|whfZK~pH8+@0#ydWI2eX>zlQl}nSOE(]]6cc8YU-ZZ0_c9X]4\f9uzUksLlrQsvW_eAZ`=cgBinFptUsy]SRT.*'733535503%!""('03';*XAQ:\GS?xYvxoPpS3 4rhDJ"ɫ4ӱ(ִ(ү)Ѯ)ѱ+Ѳ)ͮ(ʪ,ɠ9zTU5T6X;(dA-N)aQ2.85s2.}q{l}~syLGQ) 1L(W.C!1BE;LB'y>{l\50r,.HIrEBfQrHF4˥(Ы-<]ZAceaUVHXXLSTGVTDOL>YUFPN?[ZKQO@\\J[ZI]]Nrtlz˼ǽǿȿſ۲$3'&&)%' )% (!(&*$&&)*,"$$* & $u#'S/""&:4(C<#0);1')  /G0+V=3]@6[@7ZA8W?6Q>6O?9D53RDCWDDH559$$6#$4!"8&%?*)@.-4!$--"* *$%(-!. 2! 3!!4 #(ӷϸ]]]_]aa`aPPPQOR`acoooYX\GCM?;BrnuisnbIOU<>]NOZ[\mlozxzruvxu{ws^WXXTUsmkXORMJPGFC}yyzyyz~w~MRL:;;;<<;<<99:::;9:9668668g_T޸֮կӭկӭ̨ϩϩѪѫϩ֯g\QɼȥóķȽY`^U|nV|mW|kUykVzlQwhNyjR|mZ}oWyj[{l_pUykUzkY{kVwhWsdWufXwiZzlQwhX{jX~kX{lX{kZ{lWykV{kZ~n]oU~lZp\}kVyiTzjX~lX~j]r]o`l`l]pTzga~nTYHh`Lpl`Pnl~gZP;xoVzs\yb¨s~ucmfTjhUnn_moaafWdh[ik^hjZghYedV][OifZ|xju|dRlVHQSGOM=egVhub^lZE]NF_OBXJLhXHdTEbQGgVIgVGcR?VGDYIG\JMcRMdTgge}}|rjLsUX8IBLP{Opuwn[gM>~h}{zr~a`]peQuiPwjT}oYkdUBWD3iWGoZFtV̫w[leM|vW|zP|rLsb=iZ7K9#s^IX?+`A/w^GpYTC0{fQtWubG}mRq`HeWCxmYhZGsjSvmSftkSy`xmUrfNlfSqkW}hzhjb]Ge]D\WEto]pjVplVrq_pldTjbSf[KaQ?yco^It_v]~nTjsUI/SF1VI6edCaj;OW1T[4elCLU']e?\bAagAda>hcBgeB{|YosTTTV,)&2+*'##*&'0-.1--83+<77<9=GBD@3 XD;+A-mS%G-jQ*pq{)A? ˧.Я"Ϋ%ͫ)ͭ+ϭ,ִ*մ)Ѱ,ϰ/ʩ1=}]#T4pI5W+nC5ug縮׮ljeX]OCHjOKV.s/G! 6 @?;O= <3,whZ^S|-+a:7ucVmB4uLY8Ѭֱ7YWLTUL^_RWVIOM@JG9NIQQEPN?TRBRQCgfXnpf{̾ȿȿݙfg('&%,(%'**")")&) $%''*%)%%)%*y $_$&" 1,-HA(B:*+%;)  +A-)P92T<5YA8U?6T@7XD<\IA`KBaIC_HErZZY@AI33<()9')+"$(*!(-!) -"-0 "0 "2!/ STQҵ͵___MKNVTXFDJQRUQOQWVYA=D?;C95><8A# +bKN[?C]ORVW[olnqnmxy|ytsliklihVOPwqp}vLCDOOQHID~x}}xnuj]cXMTITWOEGC>>>#"$##%$$'$&'&(''(*)*e\OׯױկڳҫЩΧϩӫΨΥٱ`SJϿŽƹķžzr~|oywjwwkY`]XymWwjZyj[yiVvgZwkXwhZxi\{k[zmZwhVsdPscSyhSvhZ{mXyk\~o\oat]t^qX}nQxhUzk[{l]yj[udZud\xgYvfXvf^yi\vc]|iZ{i[k[zhXyh\ygWq_WyeU}fRu_\o]hhWYTCQK;mcTqhXofSvq_\VCSO;?;,_]OGH7UUEOMBkh[feThj[dfWmn_a`Qml]tudywgzyhxwfxwfzxhom[k]N`fWul^S`P@^NamZ_nYPgSKgTJkUKnWIiVJjVFeQHcPKcRIcQE]KJaPTiYffd{}}~RwVMpGZn;1\tR|_wqtrrZJkVGxv}~~jhekaKi[JRC2TD/paHz_lY@ufY[D0nT=RF)qeGqlJg}vhNjYD}fI7(K.lN8gW;~lSRA-\M6cVA\O9n]Gj^Jyq[rmVl~y`lgTmyt`}ye~h}|c}{duͷrn]plVnwyxg~kvu]ut]s|y~lzvbh_LbUFbTGOA5`O<\K8zeaUEP@0C6'znbPH2orLP[-Xa8ekFZ_2]b6T[2[f;^j:}~ZllKppKoqNosTSRT#"0/2.*)G>,*&!957@=>A92K?0D@Aigi<75F>7J9 X>jM}]kr}# ƣ#ţţ#Ȧ%Ϯ*Ԯ,ֶ0ظ2Բ-Ӱ+Э(ˬ13U(_ `/&zi~qxlmMCFUCGe_yiR>ˢ:]3X0R/2B_n! (2\RY,&H YK}XH9̦=/98ʧ%ͪ+fW*POM__UXYPOMDQNBMJ?MMCOOETTHUTEWVHSRDYUHz̿ȿȿċ29)%(&&&((!,+"*&%,',"&|"%&*!&%)#(|#%_)&%)=7-H<*"@4&- +  *=+)L62Q<5R@7T@7_HAjRFmSGkPF]A?kHG[99P56@+.?*->*-8&*,",!0 !1!"0 "--/ *MOJҵ͵]^_YZ_NLT31<87@B@FHDJHDJRMS838<9C%"*bOQ[AF\NRNPTolmsnlzv~vontnlzOKKVTXILG}wolseV[QOSJUWOcc[_\Umh_^ZOPSM432+%&3**0((0)*0)*,'(*%'f[LװٲײشΨԮϪ˨ʧʧվղYOGȸ|}}oxvjqpcrpdttizxkt}õǺZ_]\ykWwhXvgTqcWrdXvf[{l]|m]{l^}l^yk]|l^oX{j\~oX}mZrS}lY~m]o]o\oW{kSzi\}oXwg[yf[xg^}l_xi`xi^{k_yi^wf^yia}m[yhZue[tdSo_Po]Pr^WwcKjURn^WcUVUJUTHXUHYVHebTXVGSRDbaPwubxvfkhZuq`ywgyygxxeyzgttbstbrq_ut`tt`zyfwsaurawtaxufxr^xdKxWDk`T]fX56*RhVJiTSm[ivcmzdSnYPkWPiUPjXZuaVq_OeTF]LKfSNhWSl[Vo^fgc}}~WzSSwLaybVw_{xiq}igV~i~~}aa^y}sbndQxwcJr`KdQ08({k]^OCE<.zoCysCTU4HK,ad?TT-TW)fk?]d6ho>^e(*()3"%6&%4$&1!#. -$\`^ҵ͵MRW@COB>FFBKEBHNKQHDJ@=G>:@.+0B=F)%/yxhZ_]EJrdeyytֿyph`g_^+%,EEENOFURGgdZ\XMrneqj\{sc}m|]^Y*++944C94C84B73@61>412--pg\Ӽȵp{zbJ¦Q=#ϼfP7}gQvB,ͺ:0+~~tuwktthushvth{zntõŹȶŵZ_][ym[xjZvh[uh\yiY{lUyjYzkUyiUwh^zl_xkZsf]whZrb_whYtfZvh\xiXwgXvf[xfXufQtdYvgcxmc{m^{mYwg`{j\vfXvc^xgc}m`}m^xhb{l^vfYtdNq_KnXPq]OnYOmYRp^PfXYaW]`SccTfeUc`QecSkfYojZvs\us^tq^pjUrn[tr_pn\rr_ro\us`ro\to\sn]vs`vr_vs`xr`ztc|yfymWjZc[M#&AB9PkX[xfQn\Xp`dsau~iIXFRfWSm\KfSG]MQgVUn^ZraWn^[tbaxhggc~~{b~SJw^vxzvomhizy~^\YdXCsκd[EskrcMh^Hu>+iP]H2UA0n^H_P?nYG^L6\N;wkVl]LUA4aO?gZEneOrjTngSqkYrp[rupq}|f~f|{d~fleNpgO{tZ~{czw_wt_miTzv^rzw_toXwrn\niUheQqp^mmjUqws`}kx}xdlfTd_MjfSkcQogQriUiaTiaUe]PXK?^RD:+F8+TL:skH[R4VP8cdDilA`b4X[+jqBhkFUK2^ZAikKfj@^c8hSST'%(! !$ ?7'   0,,.*+/+-+').'(:65A==@?=\]^bdfLIM8/-C5$K5V<tVgpx #ţ&˩#ϭ"ײ%׶)Ա'ڹ48^Y,[N0W +&wo]PW У4JG@^]WRSJIF:SNCzЍ5>)(&'(('( (++"+"*%+!' &%+ %!%#*%+#&dA"$ 0,-D:5H>*&''!# " +  &A2-WA9bH=iPEnTJhNCjOAjNAjKA^B:P64S44P12G/1<((3!$-3#%8''5%$5$#3#"1# ryuҵʹPSXDGTD@DFBFFCGKHOQT]bfnfgm-+4GCL*&3a__|uy\HOжֹӲ~zvrc^[KEEJBGNFJ&!'FBK??>nn_pv~wqj]pg]OGD+/2!!;,+9++;*+:,+<.,+'+"#wi~kYjSiU|dhmYEiT@jotaNULGvttȻҿ˺Ƴsxufsqdli]jfZhcXe_Ve]Te\Ri`Vqf]wkaY_]WtfWtd[pfZpeXtfZxh\yj_zk_yl^xj^wj\qg^wj[tg\ufZoa]tg`xkayl^yk^yj^vh[vh[{kZxjYoa\rc^vg^xiVrc\yjMr`Yvfb|j[ud_wh`wh\sdYudZzgUt`MoZOp[LoYHlXFhW5QIISL\`Sln_oo_hh[_^TaaWdcVkj\ef[ggZa_T^]V`aWfg\gh[ln_ssbqoatsbom^srcwvh|wi|vhp~xho^VWRF6:0YaWC\KNeTQkYJ`RMeV[kZy~kaoZUp]\tdXn^Wr`WsbXtbVq`PmZ[ucghd~~{ye|Vpfk|zvqooszzwvy|w~}igdu^i[Gk[GK;+^UEc[IO@/jZD\L9N?1UJ8\N<_I7aQ=~j{zn`aTErwtq_i`Pg]Lb[KgaNmfPlfOvs_lyyb{ze|oplS}w]woYuqWnjTuqZsqYvs]`]G~hwrZroXnjjfaItp[rr]jmiVzucyu_nzxeywbplUjhPc]NG6,yq[uoU{fxmePldQpgSmgTmeTkcTiaSlbTaTITG/~o\D:)<6"F<'JE)bc>]^6_b6ek;]`3|rYNH.HF)]V@TE3w`UUW'&(.,.223/.1-)(=4(*"(%'-+*'$$%!"(""*#!6/.50.B<;:52D@=A==C@AROM_XRMD=G:,P9`EuWdn{àɣЫή+ֺ:'3ʱP32ӱ ӱ&˪%Я(Я(Ӭ1Ϋ4ǡ*Ÿ6=B<<Ĥ9ë5ȫ/ͭ*έ-Ю*ղ(ֳ,ش-ر.ֵ4ճ<ҶBɩ/ʧ ̧%,|7E>0@;2>9.@=0QOGKIBDA8FB9IC:B=4JJBUTMSQIQME{׶+'()'$") &"( (!(#,#,"(#+%"*#!%#)#)#*((m!L,*/G;3H=$0,! +  # )J62_E;fL?fK?_E:^E7_E9]B6`E;]A9Q62C+*;&)2 #1"5#&5%%5$#4#"8%%7%'#е͵RUY=@LEAFIGKLKOQV]cjs]aga`e,(/E?H<7>xksȴǥָضtni[SSPGHMBEOEGLDIGAFD>AYST6/5)#.BAA``Wsi_\RLmbULHlZVZONB5:\NRG=D"&0 + E8=C8=G38C69D35 + oTC3vcOdzǤş˵ѼǠ̸{p`{yvxuuiondhcYeaS`XL^ULbXIqg[|perzW`]Y|nQud\yk`wk\ug[xh[xjXug\th`xl^wj^vj`xl_vk\vh_ugZpbSq`Sq`Vra\sf^uf_whWvdUvfXxiXvgUteVvf]|k^|kYvfXseToaVscYo`]tebxg`sd^qbZk\MeSNlYNkZE]NC^OIeY7D?5E@/9>-58*2:.7<3;>#,8$,8(2;%.5)15,26/38.14MQN.36*/50378:@3MK?KH@JG?KG>EA7zSU*()'!-(*%&)#)*!*#)#("'#'}"!%#$+!+"(m!!Q!%$5K?/D7*82#!"%$ 4$%S>4^C8^C8\B8R;2R:1P80N6-J1*@)':&%6##6$$8&&8%&3##1"!5#$:'&'ϵ͵SVYKNUB>BDAFNOQjnvejsYZ`WU\)%,d`csnmzm`hʶȩܼںidcMEJMEHMEGSJMVNPd]`xrrf`^LFINMREFF715cYZJ=Cv\\PGJlZ[g\_B6:jYZD;@&)2$%:(,;+0>+.;,1C13 y|jU̿~<8:PHD{qf}sjtvs~n`tdp]{fSzeT}jY}kZp`xhtcsavfyY_]RufJp_RwfXvg]yj\ziZvhZxhWugWseVscYvfYseVoa`zl^xiWvfTta[|iUvc]xg`xi_xh`wh\ud_xj]xiSucMvaTwc^yhcyj`vh\tgYre`vhYn`_sd^pc^nbbob^l^LWNOZRW_WW^UQXQQXQIRJAKC3=A(48'2<'1=&1>(0?$,:&0?%0@&1B&1H8E^2\S@]U?xpYws\}x^zx\~{cwrj{wavnXcXBluj~|ciygzsV|\sjQPH5_U@{ixuoZvmXrhRg_FrmR}iu|xxs~|hqv}~zj~{mƳZQ?iaO`XDlaMnePqgTi]Ni^L[P e"1ÚƥѬѫѯ!ά'Я.ѯ+ѯ1׳+ٶ-ٶ3Ӱ/ұ6յ8׷7Ю6׸:ӳ2ܾ@پGQX}ߒɕ“ºlKĩPϮ.&q,HE?RRO@=4>:.@=0A=1?;,A<0EA;LIB73'?;1HE=DA8NHA} ,)'(*) ) +"+ '"(!(!,#-&,#) '"'"&!%#!*!*$*x()[#$ 6PC,H8-@7"'&40&0% #**D0.W?6^C8\B7U;3O6/J4-E0+A-)8&%7%#6$#8&%7$$3##2##2"#8&&5#$yyxε͵UVYRPUaYZWSTOMOkqw:;F 53;&%*pmmsnlyq~.%ٿ®gfeulmullulla[\ha`wtr1,.MKPCEE@:9B<:H?3?;*44+560=>:GH4=?+5<+5?*5?5@J@Q^C_[HiVKeWUj^YoaRl\Xo`Xn`J_QNbTQeXQg\UeWdjWsvcVcSSf[Ti\Sj[Tj[ffczz|~~}}zwtnlf~d~lU}gS}gjtosqntwy{{z{{}~~a`_yublyqqmVpiSmeOoeNe\FYM=\QD\SDfaJunU[S@jcTplWytXyrW~fjzwad]KYN."VMFL<3>/)5$nJ}hFVE6eU9hd=no@X{tLsjDUUW&&*))+" "&##+%&,((0*$=5&,')+'%-'(6112,*:316/,5/-.**,('2,+-&$3,'3)$0)-&EA=LLH8514,,1,,0,,.*+3,&?0J6VCE-f0`j$ ɦͩ ̩ѯ"Ʀ ӱ)ӭײ"ڵ$ش&ڴ-ڹ:ڻ>շDռMϴC^ƖurVzOn>|b#7%Ψ1˥).\K*@?>KH?^^ZED==9,;6)<7+=9,KH@PNI?;3D@8@>6NKCEA8}ΚUX+(''&' -$/#)$*!)#*"/#.%+#) *#!%z!$!% %("()-g"$! 4ND2WG";4)/)E;&I<"/$ +$,*'J62Y@7\B7U=3Q70K6/F0,;'%9'%7%#6##7$$:''8%%4%%8&&8((-''ѵ͵VYZLJO\STh_^uon#"+%=6:?25;68C58  +4/,Y^]TUVlqqQUWRTTwyx_bclgg_YYldaǷȴ÷ȱƬ¨u±ƧjaaKDtOLVUZb`Yyl^|m^zn]zlVziZzi`{kczl_wj[wi`xl^tg_ujZpd^ui^ujdyndxjcuh_uh[uhbxjcxj_uh]ue[ueYxfMkZTsaWudbyj`vdcxiavdhzjdyj^vf_vhbuhctfZf[Yf\I]RJ^RGXPN^SS`VT`XZf\\g^clb[c[ae`Y\XVYSKOJQYSGWMLXOOSLJPIKXOLYQLVLJTKOUMLTKJTJISHJRIJRJJULJRK;CE9GMDVSGXLNYSO_VWn`Ul^ZrfWpaZqb^td\tdWn_Tn`Rk]ZiXrwbw~j[m]QgXYsdffcz|x|~~|wrmgfoquzytspu~{|~||~`^\yudzweus_pmWrmU~x]bupUoiQspWjfLrkSjeQrp]qn[roZssYliPlgVlfU{xdfbLd]FicKnjRf`IkdNkieOqmVleMtpVѺī|]{u[x|fuq]u|{fws]gcJroT{z_xv]h~|e|fxs[kq|ujLtP|nKi[@j[Ef]HnlYuqa|wdun[zt_d]HngS|sal_FteIpcJwiPreNrgVvj^naPp[EyjRtQJ6f]MTH8qbD>0`V&QI(si5f_2i^=YO/||Spz\UUW" #+), # $/'#% )$!,&&-)'1*&5,*5,*@:90**50.2-+*$"(!0*%:2.83/81.62..*&2-,9202( 3* 1+'=8<* 8(O7T<}c4u~ŤĞΪ!Ǥ#ѪѪӯձԱص0״3ѱ8hukIcvf9~=3./̦0Ы,Ω(Ơ$pn<^]YPPQEB**9(''Ѷζ[]^OLOF?DKEG\TVB>DABHJKP>;E0,2mjirml|uqvl;,(_`^hfdƅ||u=975/<::=K?CSGJ[MMeNO^QQ^HHiZ[5*/gWY949#$. +) 'D;D78 + (%#lroRUUߤ^edKLM^eb}|vusl<9<{lnWP{UKƧ{SIT86xtk<=v¥оǸɱc99Z>>U[]c\]g@B~TSZb`^pYxh[wiWxh\|m[zh^xg[ugWteSrcYsfbwl`uiVscYuh]qfZqeXrbczjUp_Zuf`xkdxjbwi^uh_zjWudNr`Ls`PwbTubZxgUtaRr`Rr_[vccyjawhbvhdvhcufatf_re\od[occvjdxlVj`J\SWk`g|mfyh_obGSMYe]LVLU_Ubi`^e^Z_YRYTP^UMVPLRMMSNKTMLTLNVNLRLKQILRJIRHJSKMSMOSNNTNKQMIQKLVOSaWP^SSdWZn`Uj]RhYUo`Po]Rn^Wn_Rk\ZraVfT|}htajm_feb||}}xsomx~}z{wyz{{~~}|oa^\]UBWP=c]IicNjbLleIohJqkRlgNmcJneKf\DohPtr[qoXvv_pmWtmTmdGogLqjOldNnkWqypjU|d}zcruϸ̲ȯ}vdrmoy}fgjszu_nfLqhM~ar}uVyu_|[uzhzrYqeN|qWkaJg_Kf\D|sWy_eY=eVDYL=\N>cSC]P:ȬwmPpfHmb0fh+km1ik9so=Enf9iQU(SRS + !! $##$$ &"*%!1+(:53?73D:6>604+'( -'#6/.:323.)>64GA?<772+(0(#%-()-&''#" 6..9,#@-bEd (&ƥ'ǤƠɥ̧ϨЫϬͧͪͬ*ѯ&ݺ,+/ɦ0Ь0Š!#w%duVyY'x`/nfJqusWVTZYTEB9Ancei>A~tп̹ƸĴèe>;U<<=535/-,%#.)&+%$820943HEDF@>C<;:41D<:F?:D=;?43C80gW>]{Hx;n!+3Ù›ŢÝƠҮ&ͨ!ǣ(Ÿ%f{XqUT9hK u:g,kT/lW3dU5bcaMOIYYSKKGJJFD@:=:-C>1@;/95+?<2MLEOMGEA9B=5C@9MJC}±+.-'!.+ ** &!+' '#)'$.*"+#+' %|$%rk w!" %""(%)Q)>8.I96M@-*%' N@&N<G9$# - / 6>.>01%3#!H2-T>4S;1Q91L3-M6/Q81L60K61H3/A,(6#!3$<-?-0#BD/Ѷηbef^bcrmkYTW}usYVVLMTOOVHINA>F-)4" ./,4[QPZNLnopghlTRTONQkfba^]c`^}Ľ,((FFK99;REGJ=@gUUXCDeUVUBAsff1'*sab2/3'*-+!)@49C6;B36@6;@46 ***rrnW\[Z\]v|zOUUNOOMMOX\\}zqjg_649vPJ]DDs[[lA?ϴtMF[CBaVUk@@xn³ϼéǮg>=W?>^gfiddhCDuMMYa^[|kTvg\wiawl]xj[veQo_Ysc_rdbshasj`sibxi_vh`zl`zjbzld|lbmYwd[widznbuh`xibxjbvhYo`_ugbxih~m_zj\zh`{k\yh`|kc~l`zj_whbxjezlfyjhzkk|mdxifzl]tff{ik}mi|jk}mk}mdvfeyhbxecykZpd[qdRfZWh^buidxiZl^\na]j_S_VOZSSaTZiZ^k^_i_YaY`e^]cYV\TPWPNWQNZPN_SRl[Wqa]sc_pcareate]rb\sc]uf`xhTq`Rm]]tfep`gfW`laf{lggd}|{|~v~{~zwzzwz}~xtz{~~~}~y^]XjhLc_EjdJnfLc\Bg`GdYC_S@f\DbYBd\Hf`LfbNkiSyv_usYupUnkN|fzwt]tĮϷӹͳnysVwoXcVApfOlaHg_HpfM{t[yu\qjTvpVuoTnfMlaI}uY{tYqfNl`HrjUyt_xyup]ohRsT_[xnUlaL}u_rnZ{~t_sjSv^zciYBqbKh[Ek_HeXDi\NxhbWFxho]Hza}nWnbLcXAcYAsfMogPmgKk^Dp^FnyaPQR + $!## !'&&& 0*))%!  ! " 867512821<64:33=43-% GBCIFHC>@1++/*);662.,B<<;54?74KD@@;6d`\uskrl]nbDs_3~g2rAv06<70?:1JE=|ұKR+- .* * ,+' (!*#)"-!+ ')!)%"+#.#s!#q#%k!p #"&"'#%)\" )?9;\I*A4(2/ '$>8(N=O@("* 33=!B1A4"/"1=((D/)B-(E/,H2-G2.@-*>+)8&%/ / 7(3&1"?-C->*.32"_eQ~u˽ԷϷbdcUX[b^_OINaZ[UQRNPTQRXHIM.*5!+.,7ECEOHIQKKklljknHGHJHI~}~f`]VRSa[\ca\{Ŀ)$&FDK558VKN@67gWWZJJg]\REBib]HA@jc]VSP456&%)'"&* %+ %- '* %1*- *((kjgWZZ]`_yzziooOTTJMLLLMWZZ~sqi768rLF^GGaHIg=<˲oHA]DE}ool==mb̺Կƪγa;aU?cWAj`HlgNzaz`qnTokSkuİԿʱl{uT^V9dXByoT^xqVeZCl_Gi[A{qVphOuoUplRsmSpfLtiOk_Hg\Fg_ErjPvlRpcEh\AdXBys[yx]|hr~_~uTcW<]O6seJf{w^vmWoeOvjQrfMcS>iYBbR>eS?dS?k\Jl^PgZLbXM}q|o_eS=mX1SG4]Q9`SE\P;yjIue;gw@i0x=>9?fV;va9ub@aQ9VM=@93.)%)#!$-)%93/FB:=80IE?EA:RPLFB;JGAHF7#91! 254G+C4D9B5$4#@0#>3#)!/!$1.)#'/#-+4&9+3$7%6 ?*9$*T_KյиbefLPXIIR@>FEBHKIMKKRKJOFCH(%1 +$ -?;A`UUWNPhikmnpbbeSSTjedTNQ[UUXURĽ%"B@EONLhf]^\Ufe]ii`lmcpuirvjzsv~p~x686566000../-,-.,--+++(+.+-0--/..*))ljhZ\]_aauxwlrrPUVIKLSRTuzzW\]swo:9;qKFbJGdLLlBA©pIC_FGXJJpBCpeȷ˸ðd>=YBBipqysrhCD~TU[b__|m\wg^ui_xi`vj_uj_wh]wg]wh[vfb{l]xhdzk`tg^rfbyj^xhbzk]wg_wjdxjarf_rfbxi^vg_xj^rebth_qearfduiewhexi_vfcrfdrddvgh|mh|lbxi^vgjpj}njod}jbzicwfh}lormpdlf~kcyfj~mmom~mo~km}jh}iimi}lh~m\xe]{i\yfc~lg~kopk}kkkmoqqooi}kh{igxgfwferd`qacse]p`]pa]tc^vdWp`Xpabvf^sc^qbcxg}tfhW`k``uga~pggc|}}{~~~~~~~|wvw|||~~~~}}v|{v}][Vj`DaX9c[@YL2`R:ZJ1jX:p_=kaFnbIi`E|w]zwXz^~x`g{t|g~y`f|w_~zcnʳŬrpeJ{nEuIexoYsjTtmX{u`pgOaW=dV={pR~`ynRnaEpeFz[vmPizbwoWpfLuY_xRh_DnhQpiQ~v_wx~s^pdh\Di\Kk^Mk]Jn_Go`Ig^P|q^}rXufNnbPtgUsfVpbQqdTth[i[Mn_HcYebBzvYo_U6f^Ae|sZt^QPR   # ! ($#$&! 201)')!!$,)*" !)''99:&%&)(+98:@7391-D>;YQONF>WODXOBXPDVLA{fseDpcI~ym]YRKIJKKO(%&1,('"96-;8.41(GC;=80@=3@=4=90MICHFBHD?=:1<90@;3;7.73)62':4+3-$4/%@;672)95,KHA}ΏGI)!+"/,+)"+( &!($ +#+(!/ )%!)(( %J=_!b!`z#%"'#$%` +.C;0M<7LA#2,""#" !*58<K/O@ L>H=$4'.0%-CW!'7 + !"OB/-  %2"*0 5%-% 4$pzh׶ѻadfMPX<LIB<80;7,;8.<8-93)?<171';6,62(83&>:-}ʿѯ&. .''( *&",#*!& &+&* ) ) '(#@4z4gAmG#i-'^n" &"z_5RG4Q?-D6,:4'$!   #48=BQ3"TE#NA>2 ! "#9M#H4  ! # ?#-&  +  *-"!'0#cnZڶѼbdfHLT@@JBDLCEMHGOIIO::A31:%, '.+4TNS|mi^VTmljywtwtpzTLLWNPHADbY[RJL]UXywaYU$!TTWac[uyh{uf{khh\|~tw}u}v}v1214451112121121121110110././//00&$%yy\YVIFJ525mGCcKK[@Ah@>mD?^DCOBBl>Ag^|~f>=V??imk{ynHHWXYa_]yl]xh]vh_vh[tf_whavh^tfa}m[{iYxhTvgVxh[vgczm]zi]m_xib|m]vhavid}mbymgzngzn`shawi[teUrb_xif|miodzjZvcXvcd|jlqj}mh}maxg`yh`}ie}ka|hb{ff{hfmfpfqinb~k[{fd}kj}lgyif{jj}kfzif}kf}ke}ld{ih{kfxhfzih}mjnfzik}mj~lkmf{ii|ln~mq}omymq}ol}nl~n_sb_tdeyifyieyiaueezjYo`Xl]ShYZm_Xoadxigse^zhfpfec{{z{|~}~~~~~~~~~~|{|}||}|}}|{~~~w{}x~~|v{y{^ZXSF4QE7c[D\ReXBeYDj]C`Q5j[Bh]GbV?gYAg_GslSkdLbZCngMpgMqmZ­wunWlbHo~oR[L6zkO|mP|oTuS{[~t\qePgXFwgKYrcKznZdWEQ@2UF5tfRrhQdYDN9&ziUmaMnbPsgTxlT}q[j]MVI583(<7.61(83)<7.4/'2,#=8-}ɾ˹)6, ,- .(()!)$& ("(& )"-#!* )!^@p8~V"l?kR'b<"Y_|"$%(X!6XI8[G&@4!/+!''#!  "!4;:BDQ3 VH$SI#KA#0(###L&A( %#  +"# + + +   + 5&D380ٷҼ[[]>>G>>GBEMFHQ./:<>HKKQKKOC>D\Y\ljk}vs|jcxïͶػñlc`mdcjdclb`{#!QPRef]kh[ndyiac`Y|~u{yxyr///444333334111111011011001/////0(&&֬ժ٭թөӫگթիϦϼXMG636fabKJۓ{xrKJe^[DCþ\Yg[|tuxZVYEDwZV][[c`^}mOs`QwdY|hY{iZzh]yhayl\wgWvd^{kb{mcwkf}oXvf]{jXwfc|maviatf`refxmbvjcxj\sd\vff}lhof~oc{mg|laxgazh^zgZ{g\zg_wgavfaufbzjcyjh}lkngzi`udbyga|ihomtjokrc}kh}mhykj}nk~mk|ll}ml{li{kh{lcwhh}ljng}khmhnemjni}lnotuproqmoh{lk}nj}mkng}kcxgawd_tccyhg}k_vdf~lg~mg}ndxlcyjfzjhyjd~kfoffc}vzyzzzzzz}|~}{}~~}|~~yxyzy|}{|||}~~w}}~}~|}{}||{zzx\YUUJ6UM=]VDnfOvoYuq]r~fvr\}pxv_xqVvoTqhPsmWtkSm`Em`EthSk`NvjVl`IoeO}t_fXBshJe[?aV@pcOl]J_Q=eYEL<-I:+cUCdU=j[?hY?}cwnUxrYyrUz]t̵v]rYhkugPovgLygL}e_P>paIxiPbT=mZDaK3W@/& QC5{hS{hR{iW+ q\Izcx^{oVl`I~hqq\QB)TN4zqYtfRbWCYR:yoWriKvtWi\T4dZ>OMO    #!$&#%#!!)$#(#!-((4/,?990,-.)+1,..'#.&"& )#!(!( #"!"'!3,)+& 730,&$'""($"(" ,'$.)&,&$..*0*).)%840FC@=96GB@[XU830C>;C?9=7294-RPHCA:PLFEA:GC893+82+:6/72*0*"0+#/+!72)94,50(4/%<9/{ʽȿȿȤxw$'+*( +!. +")&!' %&%$*"'"(#%1%Ay5a/`-qU/a@$OTq "| !%X >[J?[E,D9"2,'0/#"""""#! 9<<?FDP0ZL%]P$QE"5&!Z'-f$%( $! +  ? "   +  +  / @2I8B5ܵӽ]]]>:>D?D?;BPRZ55B--9LLQGEKNIMEEJ66?tpovfaַݾ׹ºnge~up|upvlkmdcc\Z}wuZSSvrs?<@^_]XXWXVWWUXVXW}xyyywr../455233233222122001001/01/00//0&$"ɸ״ήΩԫӫӫذدѪѪХн1*'~sl{~gWM}}vvp|tgeXLw||{pxjgbUQgZQdVMl_Xx[b`drTyfRyfPtbLq`SucXwfZwjZwi_zkdzmcwkb{l[xhZ{i^yi_wi_yj[zi`{lbxjbykcylf{o`wia{mczj\xeXtcVtdTsaUtbYud`{j\wgWrbTtaNr_Oq_Swb^ygcuggykg{lc{kcmVydXwb]xefp`}jhmorhmgoenbkb~ke{kb~j\zgaic~kazifn]ygUwbVzeZ{f]|he{ilmezgh|jildyhd|jazgjpg|kk|mbue`ved{kbyhcyh^udc}kd}k`wgawh`vg_zj`{ignffczytzxtxy|y{zz||}|}}}}~~~z}yxxxx{~}{zyzz||~|}~~}}}||{{yy{vwxyvxWUTB<.vqc{xf}|kspwokR|x_mkW|jd^IlcLriWnfWTJ:ldSqjYf\Jh\LdZLSG;G:-ZO=ocHjZ@pbMj^I|u_sgV>]O6sunRSF9pfQiW7ub8mEqaCj[DVI5m`Ikm|jwmVz`x^wlPxb`TC@2%sdPcvwcwrehZLL<0tduZpUP9,ZA3=%D0#?,xggTC]E5J1A/$xhU{}n[ydwhS|nZudtfTpaOpdTobNglX:~ø{ONO + +        "$!!)&'*%'5019569561/097883470.61-+#3,)1*'?99>642,(0+%+% 61.0)'2*)=78C==0)$,%(!' '".)&+%"2-&0*$81/,(%)# -($62.,'&60/1,(51/EA>B?;TRP\\YTROIEAC?=XXVWURLJGXXUOKGUTMOMGQOI>93IC>VSNOLESQKLKESSMPNHYYRca\SQLB?7<70;6.?<4?;41+$.( +&72+{˻ȼĽž%+(). *,+)''%~$ &#")(#)"( &!F.y5p8n;z\)mS)gG,NMg !~"$vV ;YG2L99OC&81(& !"#""#!!8<=AG@'60]Q'^P!O<Hd$2L#4&!    ,2@  +  )8+A4F5A6ݵԾ][[YRUHCIEBHOOV)(6'&4FEMC?FLHK??FEEMxstvgcypdVMBZUX]VVQJKWQOVPPVON`[Xpig~ ?jaIeZEcXElaOtl[WH1OB,h]EdY:XL3UE,q^PC8QDdH0lO:iP=2"vzq0 ;+B1"K;*VF6`O?^N@ZMCdVHq]HeR;v^KA'[V4kaBk\CNLN + + + + +     !"!!  !,()-)*-**)%$5001++-'$0)&1,,3-,$3.+2,(2)#,#0'2(5*"-&)#'")"-$2-(1.++'$0-*1-*2,*3-)4/,740GC@KIF><9GC?LJDEA=LJEKHF:83GD>EBee^ggaB>9:5,:5-JHAnqjGE>A>4C?5C?7IF@<71EA:<8061*,')#.)-(-'51(zߺɼǼŻŽǿǿʿҾYZ&**!/ ( -)&$$%*#"&!)('"$+'|#F.`*g.r=h6kR'\A#K DR%p%s!@*(3ZH3L<,C7'93&0,!%$ !!#" "4;<=D<!# 2.`T,[J"G/qA=ϮĞVD=NA=~piWKHYMH`RHQHE&!&medXH?wh]}pshuf[vi`ums}nrd^QHqf^aRHbSO`TMxlg`SQWKIkddpheypd_l]Xj]Vsj\dbbp`}m`|m]{k^zk_zk[wh`{l`xl\wh`{lczlcwl`xk`yl_vi]wha|me|ndyj^{lZxh`|mbpd~oWvdUwc\}i]|iUubQuaOtaQuc\{i[wg\whQq`Oo]Ss`[web|m`wg`wgcyiexhioitjujrpplngp[l\ocpiuhrhriplpjtap^~j]zh`}l_~j\zec}ki~mi|ml~olpb|g_yf^~kY}gYhYiV|g\|gclgnb|jaygaygb|kd|jd{jcndpZ}hX~jPydY{gWzfffc|ttwwxyxw{zwxyyxxzx{{{z}~~}~}{zxx{z}yyyzyxyzz|w~|~~|{~~}u~~}}~{||{{{zyvxyxrvwtsw^^[xyivufvȷIJjdTi^PK@.]S>lhUxoѾurmYf]I_Q9I6"9(?4%t|xcxp[leQxvt]o|\kvbxo]jkv]k]Co{p]ugTzmYzh}sgQaK59#3%:)S?5VC8,!GD7~idTB" A2'`ObSIpzn]_RIsg_xlzrd}jslY@@WY4kkMMMP + +  +   **.114758957B>?@;;A9:?<;,'')$#-(&4-*5-(.&'3&0&!+$1'.#-%1)#(!% +'#.+'.)%.+'5/+4.)84-;61<6/?;5@:4>:4YXUYXT4/)83,72+;4.A>893,2,%?;4UTLbb[QMGC@5>8.95,83,50&3-$3-&.* )%(%($'$("E@:{߸ɺǹƺżǾƿƿǕ})'(*+)&#& '#  &~" '# ''*}"u!~!a8q3Y'a2vZ5W<M-#.?-d'7Y%)'>8/_M4QC&<2"6/"+(!%$#!#"$$->:<B4!"""##$%LF%\J$W2"xV3`RE;&8+!/$  + % E'6 +  /!?0D6H< K="D9#WWX01>-+'&4 +)'489F66C)'4$ + +)&!*{onô>DMEEIRMMVMLUIK[QRFYIA]NL'!'}xrf`K>;tfej^Z~iww~tm\Xj]Wja`unme\vfZ}qjs~x}Zc`U{iYyi[zjZziWygWyfVyfWxh^{l`zl`|m\th\vhQvbUxgZzi\~jVze^|jbyjd~n\}kW|g_~ld~md~l\~kSxdZ~jV|gQwaNs_Wzg^|j`zl`|lSq`UucUuc[{h`}misemlyllfZprbpnj{kpqcycVrcvvg}~noi{kgzhb{iluoqp|jpqmsjs`l`|jd~ld~ld}lhojokqlpkoh~niokrgnc~kb~mbmgphpenbm\|i`~l^{j`kWyeJr[NuaLu`Ir^Wye\}iddbttvusxxtvvvwvwxwwvw{z{{{{yy{||xwwvyxyyyyyzxvvxz~zy{zyyuzx~~~~~~~~}|{{{zzzyvvvvvusmvnsqt^][yur`ozvso]ndT¬Ȳйҹƫؼż}p}vg~UF-ugLbwW~bikTB(gT9wZwYtkUm_G{mTs_Gƻo1]F8 e]Q7+L?2\K5Q<%bNC;;>96E:6G?;I@=8.&6(3&1'-%,% .&#;402*%3,':301*$3,%5.&5/&93->82EC>\[Vab[PKG61+94-:4-94-?92PMENLFHD;HE7A?5EA8;6+51'50'3.$2-#;6.84-51*-( 52(50+A=:{ǹǸŹƻĺ˄Ye-&'-!.&%)&& $| x"x (&!('%#y $uP0p4g.sRy]7XA$?'* 7$H0X.A!3RG.WE.K?'A72+!!$# ""'&'<==>* !"""$EA$RF{q0c`*D?(>2F=$<2$*    9!  /"9,A3C6G8L@$D@.WXY,.8 !0! 20986AAFSCDQ==J*,,655===C|]gqUMC5>BKJHOB@C;:<$%HHI-*2&B@F/,3,(.YYP;2)vrncbWGslWjdM`aM_^Nlpg+-.434$# ' #.,0./0--0#!!ɼ}Ӷȷ.&'wwh[V}oekfgWNM^I@.!{mfXdaWq[}nb~odskwc~qirdzkipeq[yk]|nYvgYkNxfEt`Zo[wfcnfqfpdp`leodpene|oe{ob{iYzfbob|k[wfc~mblfohpd|kc|jgqksowlsLLA[C?gSJbNEhSLt^ThOGlWPwe\jUMu`XthrU@5R?;q`Wvi}k[h[Pj{j`ogod}mlshodnhse}menktjpg|jhnb|jb}ka}lcnhr\wcYxeYvdIp[Pzd^kY{f]kYlRweesdramYsbbda|z{wwwwxtuyxyz{yz{yt{}}}}||||wy|xyx{|{{{wxxwz}xz}{{{wxxyp~~~~}~||{~{zzyxxxwvtrurusrtcdc{okdSxve~ngVg\I]Rs`I~hOjjsYj[LdXIuhW[N:bTBF8'aW:FB+@>0KLM + +  +          25967;77>??B98;CAG::>::?A=8:=76946?861) /$2'2) -&/(4.$.'-%-%-'2*"2*#1*!2,$3.(70*4.*3-)83->7050'A=5>91IE=:1'5."?8-DA7GE=<8/3/$+',(+%&#/*"# #$%("$!QMHyλ˻˼ȽȼƜw-F*!'(&"!&!!|#vx!v#$)'$ul {&o7x?mKsV(^C+4( 3I-G1 7ZN*TAB4*I?"5.$!!" "3=;9 !'&5/A]_:HFE3I=!K@$B9@8%-"!  3,3&<.C7#D7"B8 I;I;$X\V[[ZTRNVTPYXT^\XPNHYWSPNJXVS[YUZYVZZU[ZVYVR__Y``Z_]Za_\__[db]YWSZXUUSR\[X_^\a`]fea^]Zca]fe_b`[b_[spmqoknlhda]da]^[Wgfbgebhfbihenlikiefd`ifc\[Xjhdge_hgchgcba^`_[YXTYXS[ZTXWSjgfhfe[YWUSPTTO``\WVR[XVTRO`^Zba^RPNca^SROSROSRORQNPOM^]Za`]cb]dd`[[VUSQZXU^]ZWWTUUQ^]ZUTRYWTZYVSQPXWSljhffd_^[nnk]YZfPLdMIeNJcLHgPMdNIeNKdMJdOLdPNdOKdOKdMJeQMiUShTSfSPeROhUSdQNfSPfSPeOKgQMePLfQNePNfQNfOKfOKhQNlUQhSNiSPlWVdNLiSPnVTkURjVShZX_XVgUTiQMiSOfQLeQNbPMaPMbQNYJHWLILA=B;8HB?aOLfNJeNIcNHfOJcKGdMIbJFbMHcMHeNJwa^YFBjVTlVSmVSjSOlVSeNKiSPmWTlURjTQgQMiSPkURjUQn[WeSPlVRlWToYVkWSgQNfPKhRMhRNiROiQOiSQ^^`ttq]^[SUVKNQLNQMNQPQUPPSPQSRRVQRTPRSOQTOQTOQTOQTPRVPRVPRVPRVQSWRTXRTXRTXUUZUUZUWZUWZUX[UWZVX[WY\VX[VX[WY\WY\WY\WY\WY\WY\WY\WY\XZ]XZ]Y[^Y[^Y[^Y[^Y\_Y[^Y]_LMO?<655WY]\_a]_b]^a]^`[^aZ]a[]a[\_[]_[^_[^_Z]`\^`\_`\_`^_aghhtut}|}klm]^`dffbdeprr~YXZ^YYc__`\\^ZZZVUYTS]XXZVVWSSZVV]YX\WXYSTZUU=9==<=qk\e_`kbXYQ5_]]PPVgb^h`QmbH[UAdfo]ZYgbba^]d`_yxvJMQACLpik|~~cebormNOJQHFxfisdfB66GFDHHGEDDNMLROPYUTXUTTQQXVTYVU[ZXYWVYXUXWU_^\dd`bc_bcaccaba`d``c__d``[XWa]]pon_[[a_]]YXca_c`_fbba_]a^\][YZWU^]Y[ZWVTRVURSRPQQPRSQOOMRROTTQNOMqro~x]]^ighffeffeffeffeffeffefgefgffgffhffhgfigfihfjhfjifjhfkifkjgljgljgkigligkhqvsw|xpusosprursvssvshlhgiggihgihfihhihgihgihgihghfssqstrstrmnjfgfgfegfegedgedfececba_]db`olkomknlknljljgihfiheiheihemjhnkijigkjgljgmjhnmgnljkjgifdcb^_]Xc`^jhf`_\igenmj\^WUWLdd]VVNKLAkmhutqq^[tRRm_^kpf^`Lik\RSFcc]b`\keQidPkgVsoZgbLb]H]WFnjU`[HUP>d`Je`Jf_JkeNolTmiRfcNojTsnSg`IniUd\KpiWkgRqlVjfQ|vay`}cv^w_shQgvmUgjoqjkk~gzerkWriUi{r[ki~gko{c{e|eydkdRwo^f]Kzr_zb~h|exaggwcvm[tlZiaO}vcneQkcQQI8vq_ofTn{d|hvoZqhVofU{t_vo\uo]ye|vatmX|gwq\wp]mhUjrn[jSO/+--..//25 31337%7%9&<*=+:';)<*5 29&7$;'7#59%5 3@)7"=)9%6"4 7%C1O?^7'?.229%7$;)~5$3 p-p7%_,H!6p*3,-.+,*..,@'A,:'9#G0;#:$9".028"=)=)9%4 F2?-B+?'@*;'>)@+?'>)<':$=(ba^qugfb7>ADL?EMBGOFKRHNVIOWGNVDKTCKTDLUELVDKVELVELXDNVFNXFOYHQYHRZHTZIT[JT[KV\LW]LW]LW^LW^MW_MW_MX_MY_NYaMXcMXbNYcNYcNZbO[cO[cQ\cP\cP]bP]bS^eT_fU`gU\a,%#GGFXemWckXdkYdkWciYdkXdkZelYek[ekXgkWdkWdjXdjYfjZgkbkq{^ijgqsmtt`hju~zۻշαƪ¦]XXiTLhTJhULdQIfSKgULjVNo]TaRE[NAl`RpbTpaZcRP5$(8+'z6z^Jk+lUG1"/+ +< oLm"INVrmeeRH_LEcQK]\X/;*9%6"@,<';&>,<*5#3!4 5!8%<'='6"8(9'7$TD_7'@037#<)>+9(<*:(x3#r5'g1"T*?"B}-1.1./--.47"V@C1;%A-B,>'>';&>)7#A-A,C.>(8#?+@.>(;'>)=)<&>(:$;&7":&;(ab_}zg}yc}fxQUS[NI//C8WXg#A=DVpTS}BAa,)r)03LCOU\rp^QFhXNfUKfXJsmQ|Yf]CdTHbOGaOF_MFVE=bTJiYQeVLk]Ri^QmaSrcXn]Sg[O^SF\PGeXNsbWn`RME5WO@uhi]P[UDSN=SO?XSBWTAUS?VSARP=TS@QL,<*5#5!;(=*9%8#7"19#5!9$9':&9$7#6#:(>-XEiP>@.3!5#<)=*<)=*6!z4!v8'f-Y*N)5 +V',5 /,,++3/:%3WA;'@,C-9#8":(D/>*?+:&>+>*=)>);)?*8$=(>(>)8#9%8#9&6":'acanmqgpkkd>CGCHREISGMUKQVNTYNSYLPXJOWHOVHPWHPXIPZISZISYJSZJR[HS[IT\LS\IT]KU_KU]LW]LW]MW_NX_MY_MX_NX`NZ`NZ`NZ`OZaO[aOZaO[cP[dQ]cQ^cS^dR^dT_eVagVagVagVagXbjXahXbhZbiYdhZdi[fj\fk^hkzhooZfkYdjpzynuubloakn]il\ginwx{~Xdg]fk`jm[ejZej^hiŧ^ZZp^TcQGdSLhUN^OEe[Irݹ‘fdi:5BX;9; +wTsZiN{Y  5'$WIGYLLdTLdQD]PJL>9TH@=6+^biC=IUDN;1AfRZWce +o:D|{]_6?KW^mfofYk˞ЧwbcSJWF>YI?iWLjWMeSJ^OElaO~e}cf[GnaTk^Qk]ReZJk\PXO>PK;RN=b[L_ZLRSAQQ>ST@PR=MP;ML;RO@XPDYRD`RHeWMgZOhWLgRLQ@;w޶߶߲ݯݱܱܱ۲ڱٯ۰ٮۮ߭ԩӫҩ۪ܭث߭΢Ǡ}`_^vvkttjttitthtshusgusiurfvtfusgtsguvltvltujtthx{nz{}}~orzzz~nvrcmiXjfUt}}{|{xkyxkywj{xlv|rx{zyrnbuqevrevrewsgwrhuqfuqguqfsqfsoermdqmcqlbmh]kd[ng[qj]voc~wj~xk~wj{tdyo`yn^wn^wn^ul^tk[rhXpcStjXSK0ulUr`T^M?~pmhY~wk^PF3,~&0L/JT+pqO}xjwueijevtuupwwwz{upayg}kvew}|gxhuo}yzur~{tug_QcT^R{XKrpxt~iVWIWHyJ?_Qtragj\hj\hl^leUgY}aU|_Ry`RwVRD`YMC?3a]Suvdkts`tsar{ts^pyxcss~vd|`RaQ{]Lx^NebQbgUdhU[]Lysbr^^JaP{XH~n\ps_iUR0.413/6!26#5"04"5"4 8$49&@.F6?.8$;(55!5"<'6!3116"5 646!27%7%B0>,fSzeQI6/3<*;(>*:'8$~2 z6&m0e0W)D&-r/,15 -.C-36 0/?)H444D.44?(A->-9&:&:&A+>(<+<';&:&;'6"8#6"07#-8&bdalhmopn~^^\>CHHMSIOVMRXMSYNV[OU[KPYJPYKRZKRZJTZKU[JTZLT[KS[IS[KT\KU\KU\KU]KU]LV]LX]MY_MY_OX`OX`OX`PZaPZaP\bQ\cQ\cR]cR]cR]cS^dS^eT_eU`fU`fVagVagWagVagWagXahZbiZeiYdhXdhZdgnvuw}z^hkZej\fkbnofppajm_im_jmistx~{Zei[ej]gk\gkaknWbd駥[WVcSHdTKbQI^RBڧ|lvdw42?F2:F%$ [EkJvU )WHB^PG\PF]OJ[JCQHaZE[V@ZYE[[GPS=OT=NOvq_icMcZWk?0l:.k:-kK,9&9&4!8%4 2!2 32 6$4"7$6"A/8'4!1<*UEnWEP>16":(:);(=*9&2~9't2 o6"`-P,+C 2.9"2?)34z+5 /+[G=(16!>)<&>*:'3#8$>+:'?+8$7$='=(8$:%8$5#7#8#9&07#beam}~fmmmrnr\]YGKPKOXLQYMRZPW]PV\MR[LP[LQYIRYJTZMT]MU^NW^NV_MV]LV\LV]LV]LW]LX]MX^MX_NY_OX`OY`OZ`PZaPZaP]bQ]cR^cR^cR^cR_cR^dT_hWbhWbhVbgVbgVbgWbgXbhXbhZciZejZfkZfiakor{vhom\ej\fk\fk]gl]gl^hm]gleoqblo\gkZfj[ej\fj[fkXcgUae{©ʭŨ_[[p_TfSJ`RDڽනcwƙݱ̮[[Z(';- aD hF^BQ>,ZK;`QDVJBg[RYMBmtTŧ̯J:2YVPX[`8$0.$/MJNJ1+uORUy&/yz`FIS +W qVC[_UYpG#$||iڷ^J@pbViZMj[S٨ҨѩҦഌmOM8RO;TT:ZX@UXCQR=NL:RS@XTC_]J_UFf[L\QCbZJTQ?bWIfXMXL@ZMCSG<<fVVu/)x.'z5.pC9t|oTTQce[TVLJJFlofFICHKEs}F=JAKC}G@weqmvA9F?F>F@uVYQVYRszljl_psdprc{zjxzeZF>H>HAF<}uxrurcs[QWJ]OVIaR?A9EE>hjbM60=2~3(~.%q5*]`PaZNUNDd`RzzhvjjVvpq\tutazuwg&v+ w-!m. {nYegSotiiZlSs\q[|hriSP,/1.0232123438"<+8';)8&<)6$;(5#5!4%4%6!3 24!5"6$247"6"5"4 4!2!>.`PgQ?O=3 28);)9'?,;)7%9(y4"r4$d.W.8 7 _'-53+.n*;!_(27!8#ZG;&8"9"6%6#:'7&;'6">*:&=)5"A,<%9$?,;(8!7#9$;(08$cfaongknkrpj|{QSQEHPJNWKPYNSYNT\NS\LR[KS[JR[JR\JS[LU\OY`PX`OW_OX_NW^MW^MY`MX`OZaOYaOXaOZ`PZaP]cQ]bP[aP]bQ\cQ]cS]cS]cS]cU`eUaeWbhWbhWbhWbhYbiYciZcjZcj[el[ejYei]gjv}zahi\gj[giakn\fkcmq^im\fk[fkYfkZfjdlpdllZejXcg\dh~ryuy~{Ʈϱʭǫ^[Zo[RmYO{w×jffYgQiSr\ܲYbOVHEF53&cM5_AmN\=dIm_FcWRWQ>ѬҪֺ7');)& 6MKW#.!!XJ@7\-5QVcDBvnkN&&Jw).^BK8Jc/9ZvR(!vTQ[ZHKGLYXDRK7hhb­Ų]]KZT>VP>eYNaWIdZK[PB^TEWU?JJ/OM9TQ=LL6LJ6HI1VQ@YOCQK?gXWo/%s/&u3,rN?eodUXXhne^d\X[VntlJQLSVQ{o{E4~5*3)o0%tjgW[VIidVyxhp|{u}jyzee'u*w.!p/"u_O{jkl]v{roYMhRt]oZtawyfhSP.1/.120025"126#4>)7%;(B0?+6#7';'5 32 7%;(9'5 222228"0324$:)n^kXHJ9:)29'9'@+;(;)9&9'~7$v6%h2b1G#>#=10/1D-H-*#/ s.,-?)F2<'9!5 ;(;';'9'7$12#;'9'9$6"7$4 7#7#4 7";'17"dgd{xqnmllsrjo||sORUDGQHLYKPYNT\OV]NT]NU_LT\LT\LT\LU]OX`PW`QW`QX`QYaOW`PXaOY`OXaOY`PZbOZaO[`O[`O[`Q\cQ[dQ\dR]cS]eS]fS^cT_dVagWbhXbhWbhWbhWbhWcgYcjYcj[di[di_imu}zx{y{u}ws{xlsrjrrcmm\gk\gk]hl\fk\fk\fk\fkktsovu`hlYcgenp\fi^hjv}zêǬͱũ^YXo[PlYMxldrqlfSdO`L^M`Q`QdVcUvio_?9.9(+dRK\F"^AV9iP&iWNJB1}vuD!.",'XIE.@"`).NH +tc^_ZT0U9Br;8KTR^=9G_`_g p*7z{wOV6QXHns}nsgku+ATf_moNJ8LC5PH;NL8OQ6UZ?MQ8HQ5NVKO6JQ6EH2KT8>B,KG9IF3NI7BD-EF.NR;:9*t߭٩ް麣oߴ޲ߴݱݲܳܳ۲ڱڰ׭׭֭֭լԪҩͨ˧ͦɣȡߜ½½Ɵz__^xwjwuhwuhwvkvuhwuhwuhxvixvixuixujxujxvkxwjywkidWwtfw|{|tuqanl^9<67@=KF:B>GH>qi[~yj~wt{ipjXpgWf\LrhXztd}~{}yl}ym|xlzxl{xl{xmzwm{vlzymzvmyvmywm{wl{yh|zazxZyxawshyv^{|>w~9Ta`9f`KqgXWH:P@3TE9f]QleZtnc}wjpsu{ij[7E? =C@G@FTtfWVk-"r,"u2*uRFnuh``\lribh]_d[qukY`W_cZwkzD<~JC~I?KC~loxyhvA9H@C5~4+4+l,vxeaRkfV{|i}{|upc)v*u."n- jWptdIF<`eZu~ufQFfRs`jVr]hSQ.0/4302/25"323 5#6#?.7'07!9%9&9%5514!7%09%:'4 27"7!6 1304 <)u`eZDN=14":'<)<)B/:'9%:&}3!>.u9(q9(U(J%< S$32/<&Z&* +K!}20-O;8$48$5%;'9%;*;+5#2 6#A.7"5 34 5!8$9%4 6#39%bfbqhpmpsoopvqcisxwqILRGKWIM]LR]PUaPVcPV`RX`NV]NV_MV_NYaOW^OW_PX`QY`RW`PZ`PX`PZ`Q\bP\bP]cO[aQ\bQ]cR]dR]dS]dS^dS^cT_eUbfWchWchVagUaeVagWbhWbhWbgYbhZch[di[ei^hm`lnhrt^ikktrltr]gk[gj\gk]hkakn^hljssrzwv~zVacWafXbgWbh_hḵǫ˯}^YXmYLlXLgUKwpkjch_RWl^N`eHWxE[JYF^Q[WECLMcfaaF94iUQhSEfJgM"_KEN@6Եֶuʼtpq]GE4 /"#+&+E20B-,4[9QS:MW:EO3KQ:QV>`YJWPAFE2EF3@I-KR7KP;MN7NG6HD2IE7FC342't٭L9$٭ثܰ޲޲ݰݰݰݯۯحի֭֭֫իѨͦϨЧͧΧ̧ǢŢŠģäz__^ywlwtjwuivtiwuiwuixviyvjyvkyujyvkyxlyxlyxlywkyvjyv{{iuzyugsqe:>9:B??KGDPMAIE152FNKBOMH?y{lx{iv}ntqxhlsc{sk^JCE=D:SCyoolYs`OWFQDH?PBC>8TUK4A67,~4,o-"uxwcxvdxvdqyyydxxrnl~jv|b)w)!u.$j%zfu|g|p\bWv~w^IBYFSDPAkYhTR0/11240036"21327%<,9(4!7#47$6!5!5!:&6!5!4!23335!21;(3#22>+n]S>P>149$9&=(<'C08#;(<)>,q.p3 W&S'H$6 o07"6!*G4*lA2A1d%/,0K95#;'49%5%4#3":(7#:&x/7"5 37#6#6"237$27&aebllrsroqsqpvtmwuazxffh?EGKSA\cHHMFOSbPTdQWdPX`QX`NU]LT]MV_NW^OX_OX`PY`RZ`SZaR\bQ]cQ\aQ[aR\aS]dR]dR]dS]dS^dS^dS^dUafT_eS_cU`fT_dT_dVagWbhYbiYbiYbiZcj[ej[ei]gl^hn^ik}}ipnaik]gk]gk_il`jk^il[eiksrltpdllXbfW`fW`f]gjx|ϱӳǪʮ|`[Zp]QkXLeSG]SG|wR_=ZY>o\NbTHS]>Kp5;k#\XA~>GDOUqx}`\L[JDdPDhVL]MEŮm{zytutpqUIH{KIC{pn*#" +_XZK4.&D!$H( + 5-,5* SV>nfTd&(ij{{{ %;%!;5-=][ac^Lj_JeK>^TAA@4TSPwwk_]e*&;:.5WG>JC@CJNkg`C?,<:&ME6JF4JF5XJ@TB8NH=KF;F=3LF8HH3CH/IP:56"94$JF9GC5CA295+t߰ެhV:ݮ֩ѧҧ׬ۮڭܯܮڭح׭իլլ֫ӪѩЩϩϧЧϧ̨ʥɤǤƣä£|__^yvjwtjwtivuixvixvixujxujyvkzwkzwkzvjzxlzxlzwj}ylzuzwfywjGIA:A?AKGEOK5<8.-)1.)02,FQLCQM=FBTTIyj|n~zlb]Q:<49?<:B@:BA473TPCrjYxqc~s~||ym}zm~zn}zo}{q}zn}znyi{{S|{O{yMuvDom9^Zwy!oq8ZS1G; KA->1#of^togd\FNNNQ(rp\mhT~}a:;ezx\6949 47 +VX%_a)np;rrEkk6}|Pk_6}B;E<}rwftyhsyj}pel[]cVtyjl_E?CBPKP_MSbPUcSXeOWaNV_MV_MV^OW`PWaPX`RZaTZbR\bQ[aP[aS]bR]dR]dR]dS]dR]dR]dS_dT`eT`eS`cS`cT_eUafVbgWchWchWbhYbiYbgZch[ejZeh[ehmutsyuowu[fi\fj]gk`jm_il`kl[fiZdgpyxu|x\dhVafXbiZdgt|yͯΰè{^YYiWLlZNmZOfXLr^JW7NF;s^L[T>=O 9O$!2MuDkjѕpco_UkUP{dŋCTl|{{zthhhZ\VTY̿VTL}rnl +3,4C?BH52 +" + E!!6&izsUak()/ttw!777M%,$(7,"]bFW_;zy_]_L##~v`]Vy<9::00PL;PM:PH9I@9JF8KJ8PH8NG7RH:DSKvɺѧQOA?:-EA2ED2HG4GF4FF5AA0?<.71(uݬګ٨ӧeQ3ϧئۭӨթ׫ڭڭڭح׬׬իիԪիحѨШЩΥΧ̥ͦʤǣǣǡšğÜ~_`^zwlxtiwuixujxujxujyujyujywkzvizvi{vi{wl|xi|wk}pyz}~ohh]5<9>IDFPL4840-*21+0/*.,&24/GSMDQP=E@heYnzvifX6:5=DB>GE?HEIG7>8XTG{rc}nt}zl~{n}zm}zm}zm}zm}zn}{r~yu~yt~zprpV|w[ZR-A>?@.&3%j`R{wmzrij`Oba-HN +LN!ddADG25 bvxJBF 37SU)HI==<;=>??D@WP"dXXq8-r.%r0*aVkqbhg_swmeh^bf\tyn[_W`c[lb{B9}H?|E=vJ?yxwk>8u?7|?9zA7wxjsugxzjoqawyjgh\km_ik[oaF?H@D?5KL@B1&~>2u, v-#n* vmtb^Nmk[wxc{|etsa}~jtlo`^Lzyfb6'o%l+l+vSAW]JWZNGI;bha]PHMAXG[KSD{hiUP0/48$0421321035 339'27#24!7#6"3:'5 4!37#4 6#3"7&:'@-D27%4 3"9(ibYCQ?157"8%/5!<*5$8'9&6$9)z6%e*c-Y,E'4X'1.2:&* ?"I5V 0.2T@7#4!8%6!:(6)@-4!9&m*:&36#7!47 7 6 7 5 :'bfbjjmporvxuzsdpp]U)=BF;^SCIEGMZOUaTZfU[hSZfRZeQW`OX_QYaQY`RY`PY`PZ`PZ`R\aS]cR]dS^dR]dS_dS_dS^aV`dT`dS_dVafVafUafWbhUbfVbgWchVbhUagWag\djZdh_jlfno`il`jn[di\fk\gj[ei^il`jmYchYbgcjmksqXchXbh[fjowvç~^YYlZPn\QlXOsh[|_lIEF)XK=fQFB90JCAE>9'h]MaeDVwFp_c[EbOC޽:=P/7RytstpnrghV@B_]fv|qkn:38-*0QKJ8.#JA61M)):clMҽHS`EMg#),.,.PVDqЛ缉|g, VTT]YVpjd71(LK=(BD.GH5HE3F@4;4-w泽fککܫ˜~mMܲ˜Ѥۯܯܭڬڬثجժ֫ժԩҩѨҨթͥΥΥ̥̥˥ʤǣƣššğÜ``]zwkxujwtjyujxujyujywkywkzwk{wj{vizvi{wjzvi|ylr||{zykILF;EAEPJ8?90-)32,32,63/20*00)8=9GTPEQMGJD{lrxvh?C>{u[UT"ywG+"wq`|s~xktm^ofYoiX]^'EJ[`,?C;;vwNEGJQ DI=>2/535497E9]BjP`UTg.#u1(r3,|_TUXHKKAMNCUVKQQGTTJNNGKIBxbYx?6{D;~IAl@6ygzxptm\\2,uB;|A:{E<}|acVlnaih[uxihl]\[PedVpqcocJCH?C:G;v}z}kmXJXJH=z>5wA5&'"\\V*z:0v.!v/$m(z|som~s|ug=.v)"p,!n-!rJ;wyjfj^af[ltlZPH}F:G;M@}N?njTO...301001:#35!34 14!>*16#4 36#5&4!3 5!4!5$@,:$37#7#8'L=E2A0@.<,@.eQ_T?XF217!:&?+<(>*:&:&:(<*9'{5r3k/C2;!4q1010m6$)R&y?-^)109"M6r3 m15#8&z9*i3!m1i(_(n*w+x,o)m,m)j)g%f(l'm-bfaonoopimnrv}aU:a_H\FBE;A0KWTTw~OlqORWKQU_W\hV]fT\bU]dV^dSZcQ[aR\bR^dS]dS_dS]bS_dS`dS_dS^dS_dS_dS_dS_dS_dS^eU^gUafUbfVbgR_dUbhWbgWbgWbgZchZcgYchYbh[di[ei[fi\fjgqrcmnZdi^iliqq[dhWagjsubjkĩ_[Zr^Uo[QuaXy}zxtqsntvUTBKB4;/1}zbRG8kUMw]Yy_Yo[NlZLͰRSZXZn^cnh`]mefrmne\]C?F23Idgoñʱy$&1=E;U_@RZ>/ 0R1+{zv50$2-  )$* +v뺴·[G=: XMISJEi`[SNFKH6NL9FG2HI3GF5GM6FK6`d[׺v}EAzTHVF\ECG4F?2NN:GI4FE1E@0LG;86+ZWPZbZ/ZO1t[[M7viEإСݬ˾`ժҡڮ֧۬ةتثש֪թթѨѧϧϧϥΥϨɢʣˤɣɣšáàş``]zwkwtiytjxuiyujyuiyuj{wk{wk|wk}wk{wk}wk}yl}zly~y}wywl=A=@LGEPK,-(31*54/77276276243020.DLFHWRAJGedYuVWL=EB?IECJE,+)/-'/.)252GRNBNJAD?ztgr~uzo~{m|o~{o~{o|o}p{p~sRM3RS%auuHdf+,%C;d|u~yh>9`[@tqZhgC[_$MQVU#WXAD:ANTAE 226457:;43 +VApKSEbUTi-#p-#r1*h[koaFCBSQM]]UYZSy|p[]U`aZj`|A8|E=I@{J@zucq?9}C;|A9zD:zt|m}uuus~otxg{ro`F>E<}=3|?3l~ip]OMA~B9z>5wA5KLD +y:/{-!z-!q*vup~vvwc}{myvttuamxlE4y) u,q+qF9y~njteV]Qp{raXQxD7|E6G=K>{p]iUQ1314212138$>(3!5!8#:%6"6#59$5!5#;(:)3 49$;)<*8(5">+8%9&}=*E7B2E7~A2K;{7$TFF1!N>5!5"5 =)7":'9$6!7"3!:(~6&8&q+n.`1I)@#4 C +10/4[)3-.y1//>({H8xG6>.<*|:*|@1s>.q=+}>/|6%:'7$9%9%6"4"{3!~5#8#{;*cgdrjkorsmtvov?/_  39B,80?g[IOLNVfPXbQY`PX`PXaNX_OY`NY`OYaO[aS^dQ[bPZaPZbPZaQ[bQ[bQ[aQ]cR]bQ]aQ\bR]cR^cT_dR_dS`eVafUbgUbgVbgUbgUagSafYdi\gjZeh]gkaloaklXbh^ilXagXahYahfoqqyu\XWiVJdSAm^Hmmi97===A}{ffU yUK@sf^}l_|i[{h[yc[whYոJIV02H{tjnbed^_]Y^56GWYdɳee_,.6HM?RS9PP:rϼzezjdc!3+8Q?7 ^WO))-+,=~dUJ}pfA.(.;,&SHBf`WJI8DM0CI/BJ-FK1KF5GD3DD7|{xqhUr57\H*T@;Ay=6IJ4GM6@I/CH/<<*50!55)VTSF9&øne;PF'`χ~QlaFZM5RE0K@.^R=zѠޮf]8ǿ˝ب˿ǙdХרѤУګ٪ת֪ԧӧҦѦϧХΥͣ˥ɣɡȟğğşğÞÿþ½~``]zwkxtfytg{vizuj{uizuh{ui{vi|wk{wjyuhzuh|vi|xk{|{|vrpe:@=DOJ=C@32,993::5886775664552775<>9OZVHUPHME~|oMIZ[Rtw{n|p|p|p|p|q}q|r{pjeN[YD 14=?CFDFEH>@gg4?> EA%%!(' 87ORQI5*:< dUTi)m&t2)m^ajZ?<9OPGNPEBB;lmbWXMde\ze[|A7|E=|Dlzxtcn;1}EG=?7|?4kklmsp_aNAx@5|>5|>7u<0EK<*K=4"5"39(5"3:&2=(:'=+A/9&v+t/i*],P-!/ +1^*/24A+9 #^+/12L8/03338#7!100/-.0.0/,4 cgd{srkkruosr~oH; + %7 >H60%,EjGOCKQeKS_JT]LW_MWaMY`MY`OXaNX`OYaNY`OYaOZbO[aR^dS_dQ\bP[`P[`P[aQ[dR]cQ]cS_cR^cR_dS`eR_dR_eS_fS_eT`gUafZej[eiZciZdh_ildpp_jkZdiXagWafXcgail~jgbװ淳png + + +422ssn~~owCC3/-hfa}ztsmcndQkcL|ʱUQX.-B]_li`btllTMQ4/?KJThgZE@3PM9zza׺UewP]oľwre&!*GD7LK2NO7}|yunh`]HA?$TG?HE3JE5I?4>5.LF;MM9CJ1KT:BI/IM4IF1_TC]THOJDw}q}a73q*1{)3H[OF-AS3KW:HN8KM:HL57;'TRP;3A7G=.B9.=1̮of<_U;?7"J@/J@.J=,D9(NC-|~ٳgee];{UP/JB,^S<\Q2ȤſD;!`U9řfoxoaȠש•߲˝ثשתӨУϣХ̡͢ɡɡȠǟŞşşœ¿~``^}xm{uizuhyugzuh{uizuhyugzui{ui{vj~xn|m|wi{vht}lryrii`85365177255/560440@GCFVPCMG|{nz{vrzvhupb{n}q}q}q}s~st~s}zdhgBebALH$HC&&[U851'$ifP^ZA631/ DELPSS*BA//+-..<6?46,&,' /,#94.( =4KB,dVUg(k&m.#rcrvh^]Uik`^_UNMHoofCD;DD<|e\|@6|C8H?s@7p|vfp:1|B8x@5s?6vxirhzv|i\H@D;C9}=2|xpq}}kjZOs90x8/x:2r:/&+ EE=r4){/#x/$u-#zj}rvw}{uvlzuWEs(o)q,!o@2{adXjtjie]m9-D5E7xA5~kgWUC3E4A4I/@0B2I8G7E5E5A3C5C2KI:@0@/:(:(@/<(B.I9I9RDPBK;L;ZJOB5"6!39&3 16"38#:)<*8':(|.v/j-^-U.F$= 6 u20--H4=B+{:'0.0:$B-12/117!122.00/2-0.6"bd`z}anpnnottnqwiL? ,/H>3>A=/UckEGP_HS`KU]KV_MX`MX_MY`MZ`MY`NZ`NZ`OYaNYaNYaOYaOZaOZaO[`OZbQ[dPZdP[dS]cS^cQ]cQ^cQ^cQ^cP_cR_fS_fWbg[fiYbhZci[ei^hlcmnksrfmm`ik^hibjkjssuzw~}}xgg`}|dOP2yw`fcU  4.-{xpv~{o[[I16$!L?7LJ6JI6OH:IF5IG5QP=ML8HN1MS6KR?T^TVZ[uwy<4-VTLTaF_nNmc[W"S%L!.ge:P+ER2EJ1FK1CI.AC0VSS;/F;)@2%?5&@7'9/JB$WL6OB1SD:NA:D;.D;&@7$F;(A6 A9$JB*KA.B9+@9$MH+?7 A8$<3#H@,D>"61ME.MB1^P;|oQeT?{naFqncˢȝѤԨ˞Ӧ΢ȝΣ̣ˡʡʡƿɡÝ|aa_}yl{wjzuh{ui{uizuhyugzvi{wi|wk|wkqv}k|vfzwgab[=EBEPK@FA@D=>A::=4584894;=6?>8@>9;<6AG?P]WM[TIUQFRMJRO794972;;6996883995894686JZUCSO]`Xwwzn{ul}{m|p~r~q~m~mtp\]+_b(jc=,#., '%73IJ$DE32 <:3032hfF~{g~nptolMPL*0) .& 0)5/.* 2.jXB;*,( +52A>&dTTi+ k&l-!sdUWH<84UTKIID>=;``[0/-751|cY~@7z@5~D:q>5rrx|o`i5+|B9x<4r<5uuo{pts|j^C;A:A8t9/thxoxyghYNl5.r5,y:1p8-$ +BD< +r6*z.#y/%{3&jZw}o~~k|xv}ywus{zhgdRwpsUEu,!q* q,!h3&{{is}kel]jsi]VNo=2~=2u<1i8+salWVA/?,>,?/B1B1?,;+<*E4A2A.G7C36(E6>1C1:(<+@/<,@.B3C5D6A4?/=-B2>,@,@,B0B1;*@.=,;);,C0D4yA25#7%5"5":)~6&6"1<(;*;*}2"<(x+w0j-a-Z0O&F'6H! /120=)A----1-H3021/3"7$7!3<&2.26"=(2206#cfbo}|cnsqjllomrg\H8  +# =4&&7C=b[c?IQgIS]JU]KW_KW^KW^LX^MZ`MZ`MZ`MZ`OYaOYaOYaOZaOZbOZaO[bO[`O[bP[dR]dR\eS]dQ^cQ]dQ]eP]dS^fUae\fkYchYbhZdi[ei\gicmpltsovtiqoiqokqolsqtyvsvuryu}}{vrysjok]_Zu|gvytYlN\sNhqYUF=w]PF4 ?97zsyokcSYTCb\PEDJNUQjddlei2.>_^e|yoysngha[^IEL@@IOJPYKHgZO}zul|zyf[\/)5aeu5'?3qWsXHUHBZMFJ@1E=&VH3ufYE<18,?2$=2$B9)7/JD,A:%?7%A:%A:$A9'>2'8,aU@{qTyoPuZobLbP@pbK|fvjSay[\N9aV>qscbV?z}xx{ba`}zn{wj{vj{vi{ui{uizuh{vi{wj{wj|wkp~yx{~{XXQ496CMFJSMKUPAKCCJCCKDGNHJNIHLFAE?9<5593S`YO]WN[TNXRKSN55/:94;;5::5::58:3792775HTLIYUGQIzy}n}q~r}qi|}Jb}o\WYsoPRF/0(kfRlLG-MM)RT(GG 50411/ ~zh}xr}znvn?:)%34 rqI=;89 78MI&K>gVE.* 8852cTSi+!o(i'yjSVJC?=VVNJLD<;6\^W--)42+w\Uy;3s92u=4n@6onwryhm<4p7/s91n:1ziyp{u[F,?+=*>-A0@0<*8'D3@.:'9&8(C2F7;)C.A/@.?.@-@/B0B0D2B0F4D2H6D2B0?.B2?,?+@-B.D3B0B1x7(9'7)8(>,>-}7'<)8#7%8';+z3":'x.x6"w8'm4!f4"Z,Q*A#3c,,00012--.0E1L8212"6"7#A/9&6 8#=*36$5"7#36#@/cgbyslgqvpsq{vfA4-D2{s 8/E2 [GOHGRfHT]IU^JU^IU]IU]KV`KX_MY`MZ`MZ`MZ`NYaNYaOYaOYbOZdP[cP\dQ\eQ\eS\fR]cR^cR^cQ\dP\cS^cWbgYchWbgWbgYcg\gj_ikktrqxvszvz{u{ww{yx~yzzrwsrvux}w~w{vlpnjnlpnjym]k`T{qe|cTMZKFPC8|vk7'  $ "\RPPKHysgym7.+(!#)&([]\|vsqlhikfhd]_^SVunjha]|zprunno7ZNC[NBXL>QD2SD3hZNPE8PC5PB5MB4OC6H;/?4&C9+B7,B5*C7*E9)J=/RE7M@4E8+RF4[N<^OA`O?\Kh[CpcH{nO~qRwhOmbIj_FoeLujPukQnfMwoUzoTxnRypWslR|uZpgOsoUpkQtoUsvxvxyz}|}|}}}y~wxzyzvwnca`}ym{wj{ui{wk{wk{ui{wk{wj|wk|wk{wj~p}|y{}|{sSTL7=:463),'*.)/408<8BGBHLHJPKKSOKUOMWPLTPNYSO^WO\VP]WISN5735725818:58:6>?:==:;<:=C?N\WFSNxznz}Vu{F_s~s~lY}:]`'cqoBa[3\\4~~Idb:|mvwk|ceaIpjU2.0- +roW~zm~xkze?:4/"EH~PQLA< NMLJ%!?0aP?63BC"`TSZ&b&Z$iQBxmuwkzxx|qt\NCK'L) K,"P8-|ksu|yhN7+M+ E$C&riYtwcwwcrsnliVlrq`aXM7&A/%>-#aTEl~zwvdshgWheXD>65* I?2bZJon]feSihU[YG^YGP@2o[JkVH]K=f^LfdQ~}ku~ovvdu||irqrqnlZywel}h}{hliYnl[urafbPkcVSP?ljVhfSdcQbaQlj[uuez{jgfVxyfjXV>,:(9(:(;)>+?.?-=,?.@.?,<(B.;*>,:&:)<*<+<+<+;)<*=+;'8$9%7#5";)6$D1?,9&<*=+=)=+=+=,;.@/9&;':(:%:':(9&7#9$48$E1<(q-x6$6#{.u-k,i1O%9 ;w20110.1/-/:(SC:'8&;)9(>-;(8$4!<)7#7%{9(u2 <.@2@0G9bfbqqswkosyuoiZD71J6'_P  5HDMfFS`HT^GT]GU]IV_JUaJWaKY^KY^LZ`LY`M[`NYaNYaN[bNZbOZbOZcOZdOZdP[eQ]dR]dS^cS^cR]cU_eYbiWbgWbgYbh[ei`jkltrsxvrzvwyyy{z|{~~~}w}w~}uys{x~swtnsqlqo`a^xk^WIBRC=PA81$zvlE;6646fil_`[VSA-)"=:6VQHH><;/(/,1IPVffejfb{{svtutrsiegqllXOP`US_TO}vonnUVWTXYW]a:CPKUb58=867RIVf37L43D:9E47H:9: +#TNFFC464!LR8?I.;H-BJ0AD+EC.IE4GD3>:.\ZYdWJYK>XI2J<0G9.H8,H:-F5(J:+J<0E7,E7+C4'ZL=M@/H9+UF8maNoaNqeRoaNqcOylW|hmooory`{s\{|ywx~{z}z|yzyy|{z{|z}yy|xwwxwwww|s}s|r~t|r~s|p{qynv}lw~lv~nv|mtzkrxkmrecb`~{m|wk|wk|wk|wk|wk|wk{wj{wi|yk|wkp{}|z|sRTLAGCHOK=B?FKGINKGLICGD;?=584.4/.2//517<9AGAGRJR[TTaYS_YISNKTNKSLIOJDJE?D@;>;472.4.NZVIZSjqewgf~{hzv[k}}Hwx=ih,aIcd-x|Ers?JM"ED(|vwvwuhbMEA%tznxjXQ3:6+( &$=?=;ukHxlIdZT6%!'#N<-M@+66`\[aTDk]OlbTXM>f_LcdNjjVdePYYDkjWWUC^^LRQ@IH8faRmkZtsbjfWpo[wvc~j~uljWwucnkhdOleRrn]ecTdbPjhVjgSsp_qn]e^MpkZpo\yvdyyeyya~~jws`tpmp}{hheUl~hzyeqmjZtqcfcVol_wxfmn]qreLK>tp`uo^NI:qo^xwfmno||ivtsan}|k|knuqorrsytdf^R~zxunm\orv}jiUS6$:$:*>)=(5"B0>->.B32 1B-?,000115 24!307!0116"5"3 5#8&:)43!6#4 6"4"2 7%8%7%5#5!5"5"5!8%8%=(D1<(l&:&`&k3!x35 3 n+k0U(C#7 +F ~012122///5!8#RA8%<,D4A1;)|4 y26$>,=,?.<+E6<+4 9(`damlhlpkkjr[SGF82H6+I9 + +  U@IFFQcFS^FT_HU^IT^JU_IV^IW_JX^LW^L[aL[`L[`LZaN[bN[bNZbNZbOZbOZcP[dP\dWagXdhXdhS_dVafVafWbgXcf[ei`lmajklsqpwts{uw}xyy~}{yyy||}|~}|x}w}z~zx}wryspuqz~yx~vsyttzuqvrdaasg^r~t|voD939-#oi^I?<844yxuDC8GK/DD-86%C@4>;/OM:heZ1-.1+,bab973yyt~{|njmqmoidfjbe\SPwqnJMSJNS<<>WYZ[ZZB?=nnkUSEr: F2-!:56NIIFAAXTV #'TNOpkfzNUe0/>E=ALCD6),dXVi\]bSPosi[^T]XJNM:Qb`/WqUh\w=PX#'*!&"#FI>,.CG15,(eaXSVBDI-JP7JS5HO2DH0LN5JL6HG3<8+\YWVH:[L<6:6/5005/3939@;AIBHQJLWPMXTKVRJVQITNESNK\W_bW¥ťwߵ㿧myuMeg,z|IMJ>7IBQSCE44 +QN.'#`_H{vxurp~q{tcp|n|iG@$31*' /, ifEJG.>8n~qgQ'")',$ \I:O>.bc`~nfiUrs_qn[idUgaRmrxxspqutwyvwq][Jmtt}|h{t}wcyuanpmmyvatsa~jd_Oxy}p~swsxo|}~knqq`jgWc`RXVHdaRhgWml_]ZMxued_Q_[Msrwsvom[fcTn{ta]Nnk\zxfvtasp_lhVqo]qo_dbQc`QjjWkiUigSwwbvuezxgutb~lxyeiXT418&|4"}2 }4"@/@.B3>.=*7$43 5"4 5!5!5"8#6#6#<*5!9%9%=+G3C/H6J8I6;(9&8%5"4 6$3#3 bPP;7&8%7&7#7#6#7#9%G5G3H5H4B-<*\)L9)JH8CD6HJ4fhhIFB(##~~pFB@}z~mik~ztt931;32MNV'+:NPQmsuadauvoLKFTRFUQG0 $a\Z92/yyu`^Y-(074;OS?TTFYTZDBN[r\qv/..823gb]kd]^SJ]PKOEHegjQ[eTcq')(QQE6GL5O@Zl1F*=V@YiXw>R_ FI9GR0MY69>(FM4HT4JW7JO5LV8IQ3JS3KP4NN:IJ5::,lie{}~{}}z{w}{v}u[wmUtkrxoqwtmurqtsssqsswntqtussxsvxvut~t}tv}twwvv{sxw}vyu~xztyttswtsrl{kbb`{o}xk{wj{vj{wk{wj|xk|yk|yk}yk{viqux{~sRUNBJFELH/2/00*22,650<<5CC=BD>??978202.*-(?F@N\VO[VMWRGLIGKGKQNGMIAFB8?:073,1,/0&00(5>8EJ>ι׮uگɟ¤׸YEE ||HYE:1' {v^pmjRzjyjvvvscgh?qvq~o~o{kB<1/'$WR744 `b:[[/JB.++( 7*fSHdeav~lxxvbutbt~xsp~iwu}y~vnutbxuguw{zdjxzwcnwxc~qon\ywehcS|{fywdb]Mywe{yeposs_mrr]|zgonYmol[vubnm[sr`|{gxvc~jsrakhWb]MOH=pm^\XHnj\a\MkhX]VIjeWwucwvdnus_ywekhXwsdrr`qjhVr~lxvqrn}zi~|lsv|{d}wrnpxyfgXW>.?+l0i2#p6$k3!x;,?0s3$5"14!O<[IWEZHN;P>PCTHSIQCTFXHR?O=J6J6J6L8M:I5L8N)425 11-2bfbofikosowpLB<>0(oi%v{hq{ lqsr-[[ + + #(:7.20d~3MYI@:YTVʮIDGsorvqr{|o(9--1*/dhj`degechd_w^]SZXNA572)(]WU?=:rpk>C0DP.s|qgly32?Wmz]5@99<4681672681DLEQ_WQ_YQ^WKUN77125//2.,2,06035-vҸϵc];zrCěxŖ߼βqqXUN!F=TE^['no7?>[WAzvuvwvzxYOQ ruAztsp|o{mSM15241~x_>=]o`_*pt:VVEF 31 0+ F>*eebmz{h{}illY|zfrmvubss_qo]ebQusajyyfswtrontuayzeosxm}{fkttbliWrr_{xgwucntxvu}{fn}pwq|szzyrow{zf~|j|zgmjYovt`mpnZ~{hd^Otx}|isuq`}lpp}|hwtr_n}{hnx{zxmqsu}|gzxtwvucz}~khUS6#;&>+:(8#7"6":'|213|1h.t0u0s2q1r4#`.a1!g0j3#j0i3"k0k/t3 |/}12 ~3!5"z5#t5&v7$z3y2~5!6 |4}2Q?yZHG6B/>,>,~<)I5i;*E5<(<*;'=*E0A.E8!/3215^&Q(H%4 +B{112042//>-7%8&D011/011///0-+,3aebmjllpmqmlI>4~x3nvns qw +LK^Y%xz + + }|w wtww + +vxC}sizkybliq_g\a[\ORFS\IZbIZaLZaN[dQ_eQ_eUafWdhYdi]gkclmfnobjjbllemnippjpnntrltrmtrqxts{uqxtrwuqvtpvsqvtvzvw}xuzuuzvswtpuqmrqmqpqussxuuzuvzvtztuzvqvrlqneii^XWYFd^ZVQLggXKW;IQ84,*A:@+%*?<999646/24-34.662782DIDP]VRaYR`WMVP-.*0.)11,573@;1ιʫݲɩwh3dzjj`ÉٯҶ}fmW]R9IE"UH,/(~Qlm9\^+01oojtxrVX Z`kzuust|pqiQ62 c`Gm`[:mtqCbh"X^RU1/1, @@ giez~wuz~puxvmwxfx}|hyyn{vvuqrwuwwnywewtczwedaQqn^ttbvw{npq~krn^vsaynttro]qn\osr]zxfro^ro`ecP}}ksr`miXmhWrn_^ZL~}jtolY}{isq_wtburayygqumjXljZom\ZWFxwd~j|yhigVnm\hfVvveuucsr`lkWwwasq^ryygxwfy|gjTR1/../203v,1x+u4D : I!U$U#V&V.U,\1V1B#8 += < K$T&O$Q%N"S'A E J J"K$L#L$M'M&G"I#K%M&O%Q&M&Q(P&k1k-s/u-s/['W6%B"o-r-t-s.r,r-e*[*Q'?"+ `+/132//037$6%E1:&11012/.00//-4!aebrfijmigjxtbQI#C pt ou lq~ C?) } x} +un2ę}tp|\I(1 >N+oIdA`?`Br[uhfQRGXdI[eO\eN\cQ^eVbgWchVbgYdhZbf^gjaijYdgWcf^hjdkldlmfnnjqpjqoipokrpmtqptrotrrvtw{xrwsnsqosqnspqutqutqurzz~}w}vtzttxtmspgllchhaeha\[dTMXG@_RJqi^^Zt;=( +828+(1BAG8464( 8316/,XM@:8;468145035/66/9:2:;5DICScZRa[TaYQ[U35.872;<6]VIӻħޮŗĥWhd]\ZĉĦz`zcOqdNLD)LF&|zSa\Exy=:/.iZZ&mo?vwbc0SYkp8|wuvus~q}h70pNL!RU`b#FG dc5:1JC(efbu|}~jliXr~j~||ilq|}kddSqzzfsxxxev|}jkwvcljY|yi|yi~}iorxua{{h}~lyvdnzxf|j{i{{e|{f|{fywd||i||iosjfTplZ|wh~{i{zfuqlz~jpqmxudxudvr`m|xf|vfzwftus{wflgYusbnifU|mssyhdU|lwvswyve|zizxfwwf{}jvs}}j|{iwpn{|jgTQ0315!5 6!9'};,p1o,r.^)C%2 R%}3}2t01-202 1 6 8 9 3 . # A6*zpYy`ZL=29 < :9 +8 9 : +; +9 7 8 : 8 5 8 = : +: < > ; 7$8"D C"C"?!C g-i)h+\+F 9"9 q02011/.8#8&:)2M:1122110/-//,3cgblohonnqmys`1(puou ntqv y{HC !wv ~ rj-q_^hDeEaAQ3B%=!X=1,.%'.-/8/4DBA@D1EK;;1iQiNn,tYgeT9 (%fec)(+cd^cmkiuvv{zsagz@He&9)/=$+GF<onp<81~}lrka<21\X[MIM QO>-@aIcy@JO*K !U*,F0->"O35=;3'#EALX6N]7P^=IV2NU6V^ANW8MX5KX3LW5AF2igcq~{xuwx{z~{{vjx{~ppkyvnttsqpvnzj{c{cpvjSngkmkornlnpmrmts{~http{kyix}f~mp|jyir~k}myix~irybyk|m{l{nylxkwis{ehq\eoZt}jt|ipwfpygoxfjuckvdq|ixnoyfmuedba|p~{m~zl}zl~zl}yk~yk}zj}zj{k~{k{n~n|lo|{|pIMFDNILSK/1,30-55.4607939<9:=8>@9@C=AC=AD?EIDUaZRaYUbZV`Y8;5<>:@?5϶Ţ㯙לxruDx\XWWUҦeSC-bT>v}poCoq4}ftr~xjWQ ;9-*=9B=ddat}yhdT|~~muztm~v{}pyyrrvvwwxuys{{n{wwvzmsvt`~y~p}jsyvflvztq_ynmsr^pqt|{iyweq}{iowtp|j_ZJ~{lp}{ivsqqjeT{~{hostut`xrnuvdpvuwxfrtr|}jjWT0101125"8({5"i/g,m.^.c/:'z05 1<.AA'I'N%V&Z'_(Z(P&M*ڻwQ9c+b/ ^/!]-_0\*[*X(X*[+X*T(T+Q*I'N-M+W1: qA0A <&:!?"G%H'W*|4"k'o0b)R%I(; K%x-200//.23!18!H5/211.01//.,2cgat~~bjmookrfaH7$ qtpv ou pr zz + jg$uo) } ~~} wm 'uz\V2[6pL_avUgHtVhK\DA),R4xVue_RVI\fN]eP\bP]dP]eR]dQ]cR]dQ\dU`fYcgZbhZdi_hkfnnckmennellgmngonlpmhmlaji`ijbjiimminmrvutxvsxtqvrptqnsphmkekichgdijaghafh`eg`]\TF@xl`rvmaK?1K?.J?0ie\hec0'*+7?2N;Rp=VN)cN v:mPk lw^&! 2866giiliXotmz_bY%W2WNNF@BLGE94.PTW.2>GGJ-0!'B>3 4*/H<<\YU\\T49)T`>MX5JT4IS2MU6OW6LS2MX6K[6:H)opixop~uynylyf}dy}zz~tjrnt}dsrqvxey`yahhthQjtkpkmlo}~emlrkki{}d}ikkotorsqplp~ow~h}owkykykykt{gt|ht{g|p|ppzm|onvbqxgowfqwev}jktbmweq|jlwdkucdo^dba|p~zm~zl~{m~{n~{m~zm{k{n}l~np~o~{lp~|rJPHENFIJ3@@2=@=;:466266244*NN8EG9@B@CF@GIDINGTaXRbYQbYTaW492:<8><1仙沛Ӎkjg`b}fONeb}rcLz{vezg}y^zh~t}o}pt}rzh91drt'\chm+vhxwS\\+]b_gin/{lT]F7phDhe7NG%..:;89SX@ggd}nyr~~}n{y|p{}~tsalfdRpn\umuslhTwooqw{}iyvc~|h{zg~lyud~lnlZ~j}~irn\a]Lxucro^jgV~m{zgsp^{ygzxe{yfxubrq]xvdvubol[nj[heUifUGB6srbsq^tq`up_oj[^YKsp_sp_ifUunnkZol[jmjYvtbtq_~}hc_Nxucuvbwvdqp]ttbywfvwefeSyxgsr`tsbrt`iTO/1332.15"}3 v1r0z6#d+f+~/z0}5$21_"[-d,f.k.k+k,j+c*ʼƥϪٲŠsC0k.h/f.l0l/l0!i+f*h.c*_+Y(X(^1"Y-Y+Z)c.r4 I T2$< +e6$k6"c0n.3 s+q-j)U%C$F&6 +d.+1-1//233 3?(8#120114"2/-,8%`c^||bqokfkepe`H3(voomt ou +ot prz} ~A:;3]Wxt} |y{ +wn~r%”sY:.546D"T1_?C%H)O4R9C,'F)^={b{UTL\dLYdOZcQ[fR\eQ\eOZaOZaP\cQ[aT_eZch]eiX`gV`eWafZdh]fi^gh_hi]fh\dgZbfZbf^ggcjikopnrqkqpglkgkkekigllejjcijbgiahh_df`efgfeMC>|pwlRC7LA4D:+F@QZ;yXpa8aX.jT(#!*-GGDDEDTMFzyl{gfe WF[$ @'F)qD"^9L); F=.?7/szzq1.-  ^KLjB>aV C + [ w4*W$E+(?87qpi83/SPQQLN6..TKJSHBHCC;35/+5 DB6FJ+86!43EA3QMFxwshh`MR8NU4OT6PW8R[=PZ:S[J,ljd{v}lttzksrrv~eqk{wprntgkpjlo|d}elgPvs]piT}x`rrfQmlwrXnmmippj}jl|itw^mm|gphlj{go~jtqt{fxg|n|mrzns{foxcowbqydu}kt{hx~ims_t{fu|grygoudqxfu}ixlw~lv~ks|gnyenwfnyfaj[dda|o~{m~{n~{n{n~{nzm}zi{k~n~n~o~zk|nry{}pJPHCNIGK;64 27314/24068(km=PQ$AC;DGBAC=;>8@E=UaZRaYRcYWbY:>8AA=AE@B?5m}ˑcb9=TM{oE?|sq{wfqgXnj[pi^{wjt|o~o}o}pp{dvnLzsPli=rwbg be&VU&JLGI FJFM SWa{lT?3{~mtpKce2likMDGHN*`rgdeaqn}~l~l|~jssbssaqq`qq`{{jqsnp~ipn}~jl~~l{ygvqa~zhlmqxonyu`qotxuecR|ry~~l~~}~lwvjurvml~}iq{k}|ktuwtdxu{xf~kvutcuqtp_mu|yeqoqn]tzudpl[zwh|{ivsbvsc{xhxrbkiX{{iuud~{jusbtphSQ-.22102123v-f(Z(b,6#3~1z-5`" a,a*P$S"Y,T'X-kٱ޵÷^'n1 i/n/l1\%7#w0r3n0i/d0a/e. `-_.\-`-g1"CUETCM@+-y-n+[*>"L%<$< |4 -020/2/04 /L8/13 04!20/..5#cgeshimmmrq`WFb\Cq{oqmr ms ms +ot sszz +~}waYB8 ;3 >5RG {|~ x zo +{mJr_C-46781-+0426`GB*! X:fNzXYI\kQZgQ\gS\gT^gU_gR[eT\eVbgVafTafS^eVbgU`fZdjVbeS_cVaeYag]ei\dhZbhZag\eh_hj`iidijglkglkgllekielkdijcjjahh_df`efcfhXWUph^|pZOCRH9I?-OH2fgfwyB=C`eiABDWTKYVV.*&NP@rnPYL:A5"H<*>3!""+y}yMNMduZ{PcXJ۷>۵9?IUelZc}wmrn{AFPUbbRU_^Ӫ̤ub_I~xi~zhWUiJMsACPRXYVVl:AH'.nʛ߯ƗsDD020'0-QY8JL3MN6NR8PY;PR6RX:QX:;?*pnhźuyyzok}vkyttcgrirmyzfgxyplstsw{w_sfoePxxalkxqvzf|hru`qw`oqZz}fw}eyjlrpulpusqro}lw~h|mr}mvjr{eylu}hpzg|pmubnvcmwct|gqyfjp_ovbmtamubovdlsaiq_fl]js_blZdo`gp_fr`irbdca|p~zl~{m}zl}zl~{n|k{k~{j}yi{l|yi|yj|ms~}}pKQJFLI\YR1."22'6729<1jl:W[CEBEFE?B;=\yuUhhGN-4",&.)4-8/93:68_VѦܱѡاᲛr^WHL/7(0)4.8/83:BGeX΢ݫڬw99NN6LL6MM7EF-PN:LI4MK4;;(ljeoowqqpolnvrqs}ixrkgxw\v{mngmkm}~bsvqWwtxlUus]~euu]su^x~dx}dlmvouw_mu{ew~eflTs{ds|cs|cyhop}i|jqu}eu}hzjxfszdxjyjzlt{hoxektat{it}jr}hv~js{is|iwkrzdjtaovdltcisapyhkucjwdeqbhudbq`^kZdca}p~{m~zl~{m|n|n|j{k}l~n}yiqppnzsaxq`{ud{k~ykKQJINKJ8*`T6ee?ppUHJ.[_&EI9CEB?B:9TaYWaP[eNWbXC==A<:B;28/^M?xi^WD?.*2(6-RQ^Yj]n\xf~m~pmfFRMRRde+_`#il.os*_bNRWZ ~PppLeaAMOOQPXUY{|xyfRErcT{ytNWT'vrPsMD*rcg^LHI4AA#JL7efb~qzyg}kqsrsb|}jjkYuvey|jomsnyqomn|}j||l||jyxenmZxucxweuuacaPywfyxfqo^uveml\mkZxxfvvd}{h{yg~|g~}hpwucmjXTPAsjgVro_<8(}uturtvorp`xrn_mmyrzyip|zk{vh]ZJz~~lxvqq}{ksp_hfVnnkr~mxvcyv||jfeTr}l{|j{|jtuc{~khTQ..000/39(8%234$u5&l-4}0~4 x3x2!q.|19(7'7&{2 /w2¿wpÜ軆Y>2"4 6#25"34"c*8%16"7$4 5"3 15 7#o'4!z/53~25#001{/g,C\+R'B$7 n/0000./228%7$B/3033 00//17$dfbrmmhhqroSK9K@3G=wyms lplplpjnlnmm ml plwrxtztyt|x|z{xzsyswpwo ne vgo#nqnB&6+/*+0/0--,24='R:<((6"mrkebqx|s^kebfo\cj[ci_eiajm\eiW_eW`fX`fZbhYbeZcgZbf[ch_hi`ghdijejlciieliflkglkbggbghglkinldjidiidhidgj^[[VPGRH=MC6@7,LJHBKEqw>Y^(7=GW'K\-FQ2:69&OOI@;:KC*ttZoaAyf1ra9sc:{+!X[6x?̣F\|lE",5=BNO;?|38TW:ABLGU@KNMj_p]L\2%xM<[ԫ&#?J7>fen*+'-OSRX?S?SdavlL?[%H]%NX/y}VĒquMCG+LR5OR7RT:QW9JQ2=?%b`\cymqortwevo}bh~elclfiv}{jnh{{b}d}}cnumsod~dlplSzzbe{^xoWczr]^ZJz}etzcip[ciVglUx~g|~fl~hns|h|ju|es{edlTs|es{cjr]hqZw~eyjzlm{m|oxjzmxkt|gxkxlpycr|fq{hjuahr_rzgqzekuclucfqahsaoxfhraen]eq_^m]cqaercdca~p~{k|n|p|n|n|k}l{k{k{k~t}nMN?HPCOUK2+^X"TR-PP8NO.KK1CE#LM501!edN=A/;A-mkg~lestwoUhsmTupZi{rpis{vcmnmiaovulvw^kmTh~ex{ae~~de|v\}dznRaznVN@4VG9i]L|yhqs]x|cnn~iziqu_uyaryafnWpwax~fpxis}fnw`hq\is]oxcrzfks^bmXen\u~hmuao{gr|hrzdr{fwjs|ft~hozekubiuanxejtaluait`gr`cn\co]am[hsdr|lan]ive_lZgobdca}p~{j~{j~{l|l}l}k{k|n}xi{nzyyxx{|n[wkFmj@JI6ge@XK@.XR-dd-LJbc932~|V88#89-ntUhnNT_QZeYT_J@F9<>257224//4+02*qfOMBAXZ>@财弤㩛Ҍ͍|~{lxbzhzjwoZ^Z1dg#bc]`X[kn1QH?7SO(SU`a8zzd^].YX+zqRYG3d]<& i`m_YncU`Ufheyuwytsud][M{|kq{|u{xuwnnxwn~lnyws}kqzzhorp^ihVfeUoo\uvd^\JWSCheRoskywd~ll|{hsq_|yhro`oo^rrbuwc|}koq^llZ__OaaQgdU`^Onp]kjXpm_zwgro^to^n}ygnvuf{ziro`ywgzwevubtsdrp}yin}j~pxrooty}wqvexufyhzhyq_hUQ//01234217$6$}7(x@1r:-|0|1Oo4!z4m,u5&s18#|-z.v/i'y]I~~tľȝĹ_,t0 {1 ~2}3!3.o/@+47%6#7$6$4#6%6#9&|,:&-6!5!3 6#2242v1G"d/d*W'K&6 T+20-.02/8$9&9&>-:&126#2 2 /06"hkgnmnnpkmqjVLA2H=/7-". 9/ +quoq mqkpinlmlmlj mh mg ke ndrfrgodh`d\d\ d[ +kbt+wsomdIq)&,---.*+/./(2-:$F/7!mP!?p$Qx+Ru,Js&dFtX>K+"(TG&Ze:Im1Mp2Oq1To1BYI\*37!>777011..LMPPB%wqPyc1l_$ D_LZT^c@aB Z: |X z+S,h(l47Nf$(l'*ljjivt}VViI A Zun+hTJ~uqkcDCII:;_^J K&%S !KJtGF{{xlM > +`q!%n`HҞٗqvmjA)(Qi U=C.?KBXkbfpT9FR_tD^g0E %6#%(!iϗ`?Hm,>]#8R6O,@fe`brv{^xy}tos{t|rnp~nw~bjutz|aijP}{^hkmi}ijq]uzakqt\nlTm}dz\}dL@9L@8PD8YRB^[FooY{kmrZqtwr~kzju}gov_ir\ozdwit~gxjzlvilu_kt_mwdmzelwbgr]\iVjualvelwbnybnxds}hlxbwopzgs~jp{fq{heo]jsbjudetdjxg]m][k\\k\UcTSaR\fXdca}p|l{l~zm|k}m|k}n{n}zj~n{~{{|}|qDC6BA%]V/d_$@8@0%KB/<53-:3$KC->5IG;`]DWM\aGciSuyScpLSH2bN.wgtqsryo_L=`8-^6(]5'\>1}~njq`gj\ij]jk\hi[_bV^_T]bVW?5_+c/ a/!i_gUS35#4 04 5#3 1426"z9)x?1s8,}3 p/6 ],{4k-o2p/o(8%5$X'i+g9%rymwuaGt+{,~12100g(<*13"4"4!:(6$8&7$8&{+9$+55!5 5 2/21}4T)h/i,^)Q'A$2l003.-01.24 6#@.1.0///07$`c^pkgjmipXQ>LA3H<06*!0"$ /$nkptmrlqmmmmlmjilhmhng mg me me mc kcld lg mg Ptqmiel)%&--0p+h#),,.))017 kK>f$Ms(Qv(Ns'P|.bGz^9qR8kcy~}pwunytnzvmwsqzvlrpipofmleljflkipmkqoiomgnlgllhmkinlgljdih_ee^de]cd]cd_de_de\bdZ[_CJZ?EZ@ESUYbYY_UWEOe3Jm/Np0Oo2Da$D^$8O>R#BM28:(37$RWR*%~vN\R6|h+KR=wmD]aCcJ E/fOgnU`*SS?9#ffsni}sqzslgh` F + H F jpjIKXXVwc^Z^+.m$) xvO'&>'$$ ~hdqe_feWWHHEIImKQL1%zW}mXoge*!'>dr48ZQS9^ALm&>O%&-KQEDU5>L"@J)EO/FN4BI17;(fe`ftgp}a{wzy}b~dqrruvyygvmkpoz{cix|`x}eou^x}dbkRmmTb`Hjt^pt\xoTskWeXJg[L@5&nrwbmp\[dOZcPbgU\dQVaLmt]txbw|dp~moxbmxahqZblYbnYmxbs|fnvbfp]itbgr]oxciu`r}hr~inzfq|fr|hiuaes_ao[ep]hr_fo^jubnxejvbozf^lYQbRObQYkYao_]m[dtcjygbnadca~r|l{l|n}l}m~n~o~n|l~n|{}{||{n=>0\a:]b2=>$76/8937<6-},H&9'5 6$6%4"8&4!7&4#<-v*8"/204 4 313 11`*x5 o,g*Z)N(8 @ z/00-.1136 3!8%?+/00112!7&ceczze|zbkmk~g|xaKB3JA4E=04(3%& ()[Ttumrmpknmmmmjklklhlh ni mi oi ng ni pl pllqmjjmj1)"%)*.l [%w'-*)**+*1XMCf"Ln%Mr&Mp%Pu,Ms,Aj%Q{:&H +9\(y}y|~~wyyyv|wpyunytq{vszutzuu{ww|yv|wqwrpurmrojnlfkjbhh_ef\beZ`aZ_b\bdY`bX]aW\a]]]fhiJNWDIW07JdvTGe,B`"Po3vPzVX`V]E-;2 jILs]]jYW[('WK HE#!\s` !zu[[Tha[\OP{ek\PB33zdc! O-+n:9uOKd@;WRR + EkYXM-,`z%%`R i45EEF .Pn W&%==@7G`3;QKT^(;\&9X6K7>e?jF_*!mkj;6+64 DJ/<>*<5'86(hfa}miLTSBur^y|x_ys]lknlP{{a}besllsstondlk{hqv\ntzfsy`v}enu^qyb}}cz|bwhuu]~fviy{dwoVts^ddOuv`rq[ns^lwapw`x}emxiv~krzfkuanxdv{dyfv~dkt\gqZr|fwmzmr|ekt]lw_gpZ_jWdq]cp[es_aoZlzdhv_p|ger]jxckxdnzep{gt|js{hp{ho|hjwcbo\iweSdSK`NYk[hvd`o_bp`^l\Q`Rdcat}m}l}m~n~n~o~n~n~{kp{|{~||{{lVV;BH*LSP2665715927:5?@ +_f ou5JEIB:3<8 QIOCF==?RS0UU/YZ2dfcqprsbF RR"S!X$T"S WN#{qxxz|zi~|kwxfuu}|kquxfM?d#b$h)i,!f%f'c'd(g*!^.$|}o|wwrvmeY[(k"h#i%yP?twjHC@PNHZYRROK]\UONG?=:glheWL_"`&]$Z"eUss|vwtseI2(e'g&g%R :>8AA>[^XEGBUWPKJD21/iqjt|sP;4q1#r-o*k`gYW;*;)?.B4E7G85#8#<+;/9)8'p6(j4&w5$s4"j5$m1!z1h,g3!o1 v*D1g(K&c(^'Q%D$eM9kTq[{dK[<(Z&o-x+*-0-1/5$@.2!7#8&4!5!5$7$5"5!<(v-7"125"4!4!3/312b*y4#s-m+d*X)I'5 +a,.0---//05 2>,6#12 2 206$cfcji|zezh~ydke^MJA5JA5C:-4( 3%'( 1!1 A5 +njrukploknmnkmklllmi mjmjmj on rp }4oqmkfmqB+*$#''',n p$,(''+-+m=@TFeJm!Nr&Nl'=W5GXRV=88?=-lf:wt"t>vUpTkRUo7F\+BZ'Lf'Rx0vZuu~XdE9pTQWY\ s43LHPA=:.*Llv #kGD_]WXHDkCDWc/ TJKR./a"!`kfdF + *Lp}<>J20qo$ 8^#!q.-iUV6GZXbp78C./@8:C58*BP+BV(LT2F80940b`\OH8RS>RK>YJBF<3gfauvjjORP?spYpy`lrogsrs]mmXRUAkiTvw\vy_}~coisjy|b|fqw{aw}eir\owa{jrycyfgcLyy`nu]hiSrv]pzajjTtkTuu_ptZs{dtx^lpXt}exgpwfrx`v|frzfjt_gr\kt^kt]qxbmzdozefp\_mV^lWr}ftfwhrzhnxekvajwbfs`dp]_kW\kVZhTbp[ft`cq\et^_nZjvdnyeft`boZoyfgubds_fudcud^n][k[[j[_k[_l^^k_ccas}m|l{m~{j~zi~{l}yj|yk}ykqz|{~||{nCH?CLKKSP;>FJCIKFJLFLNEMNGEHANR=66,D@)BA%U]JQa\Vd\FOCYaNbH6D9=-odeZhZp[]Ohd^ST^E<9&|έ}oYlqykLgZztHljqqycJC4120 +A7K="0$ i_Rt<79: KQfn*a`(7- 0( +/)76 8hmfgXP`!b&\#[#oQBrubhfVa]Nml\srb^\PJ4,e'g'g'RBF=GHAjmd]^Rkm_ZZOB@:gpfvxQ@8l.!m,f(l`iVR004 7#56#428$>->.A1C6s7+y4z/o6%o3"{1o+f1j1!u+1i&V(f']'U(J#K#L#O$Y'e.m-u+-,..2116"5"1"7$9&5"6#6#8%5"6#<(v+8#03123!2/6!20|<-w5'x4#o-g,])P'@$8w1//-.02013"5%B0/1/103 adaqijkmkWPBLC7JA5C9/6*!4(."2$4#4#7$7$OEplrtlololojolmmnnomooq qs nm[onokig\Cz*$&}%'(%*i!O ,,)*,L0TT(:PD_Il"Ni&8H4C8Q4S8^u^z_T<~QNs0e8eCl\vguilfkjenlmuqnrokpmgmjaff_ff\cbV\_T[_T[_V[_V[aQY^NW\MU[SW^UW\6;KRS[JHK]^_}>I.Ko$Rw+Il%Jk"Pm,$#  wzvhqN]u4eSe~TKS.2( # 7N!W9lL}_&N?)`m@mgm;4c ^ + D I0. 4bum(*iWVA:7iKHH F&!4-,xPKb/-^b##U'(L44=87?;;A96<"Xm""mj696*%&)"3.(9/->.,J1.J40H@?A=@5-./$!2($+ !+"1(*9/.NC@<3.`\\USHHB3PI;UK>D:2fd`nkQspV~huq^qjVx~x_hlnc_IdaKkiRj~~gkxxg|w`K=)cYC[R@kdQRK9ihSnu_`kUelXqzbpw_~htuZru]x}d}jiiRtx`v{eomUxqYyycv~cisZiqZjt^r}fkwar}cp{dnw`enXalUit]p|es~guis|dku^iu^pzclxalxcit_it`fq[]lWcp^gt`juaeq\hs_ozfkvbhtahubhs_lwbgt``nZ`mZ_mZer_er_lxegr`]kY]m[\lY_m\VdVL]NZjZam]Q^Recas|n~zj~zj~{l{m~yl|yk|xjytf{rgf_PeZNj_QneUvm\}rcwf{kxkHLGEJGKRLEIFLMIKOIKNHFKDBHA>D<;A;:?8<<*9:)6<*R\QQa[Sc[XeYUYJLD8]J?ZEq^hYhXfTbSsjYG>K^U?JCx~fkTmp~gNost_vZse6VT~yfwsoG?E@95;:n{nvjXM>%?9 ECusJ]`*pi?^V5n{asoMljFa^5XW$^X ca*no5kl9_`_pp_mn[ttehH=[$[%X%U#U$V#Z$[$U*jo^owxfmutbnm]khYcaPpm]sraljZ|}kpO-!c&`(a+f+"b&c*b*b'c*`3'rnrxwgzyhttrao|{koh\X'i$g%i$oG5`aYhiaosifg]knbef\TTNhlfh\R[ _%]$\"wYJxlj]ji]~qurreL71b%f%i'TAFTv,\J1Y/L7Z1\5eDkZmb`bZhk_ghcji^de^dfY`cY`c[be^eg^df_de[bdW\bUZ`PX]W_cSTZ#<(+>66DZ\d^`dccdKb.Rr&Il%Km$Pk-&$% (- &8GG"A/]@[:  T;2cI_i|Y#8 Q_>,\X<{c}^NED%& 0*,%Glv!!f69*%+ih_IEC7--=2280.<65>53G85J98>211-*/+(/%$0*'/)$811C74`;7r?=B0,6/-,##&(1($E;9=2.:,*?4/1JD5bVEtmYtq_zv^ulsjgdNu{cnu\abJrjTf^JllTyjr{cnwajyafuacsZbrZmybju\jr\dr]ft^\kXet_n|diwagu_o{egt\lxdju]vir}ejvabo[XiW_n[kxdhvbTdTQbPRcRWiW[kW[kW`mYdo^ivcjwdcq_bp^bo[jwdhtbhubhud`p\XhVYjZ^n^_n_\i\fda}n{k~zk}zk}ylxm~{j}yi}yi|yj~nzvipk`nh\ysdyv|nHMFCKGKTM69?8:@9=D9;>/EI?AGAQ[TTaYUc[WdZLRHELCEJCgYxeo_aJpY;eS}peUJM_YJUMpctgFcWE~vhzg~eVB/uoZusslRLNIMI ZY9{ys{gE9^N=/ unRaf`;j[\#^a#eecgdTy|jqrbhH9Z!X%W$V$V#W%\$X#S)uyj}{kjhWro`kj[wvfr|zjvtwyWE8_$`#_%b)`%b*a(b&c'`4(wxzrzw||jq}nrk]W)j"g$g(lD2zHHASTLde[UVM[]URUKFEB^c_j^WZ a$a$\#tWHoq~or}~lWSG:&a'e%h'TBE*<)<(9':';%;& H5^SmhsqssttutnjYJV9(cLjiijhgjO(z-&}'{&v%{%&(#(/u-fjlO;%74.;1<6J6P8Q6O5O6O5K*F96;44C=;C:8C??A>::E@>:1,@3(>0(6+$*#)$"2/,I?:( >53OIAYOKUKHOC?90.!8/.MA>EC.GL+RJ=QDB:-,!/&#GB?ZWP40)(!% "hfanso|xsY|d||p|z^usYiirrXIN;\bOtkRoRfLkRn\IrYI_0"_)[+_9+L8+/]LA&'2)C6&E6"i^HuiNz`dZR6BB<@AY%c&e(T~DI?@@:^aXHF@GHCVZOIIBW]T~RHBf-$x/$w/!ufiVR.0001335"7$3111w/u2{6$:(y1u/c*l2!r1n/c._+_(v.n.])c.j,o.t.x,w-w--.-,/8%^)6"/1425"8&8%15"7$4!:'z/4136"8%D32>,2226$G82 2~-s+i*_*Q'?$< w100001//016!<)0.28(chck~ik{wcyv`~iPI;L@7H>5B7-3&4&5'+5'<(?.C0 >-<)<)<(@)?'C-H4 N>PBM;O9U9+U9*bG0qjeihhi^D-P -'{&y&s$p%u$z&x$p"j$|[EmghV=4.&3/>2G5N3L+;'4,@4M2J-FI?2;&B3T6P3D/@3H4KVh|zukoi]c`RX[NW\S[aS[bU]bX_dS[aQZ`W`dW]bPW^W^cSSM-7&.$))',9'.A05G.,6YW\B;AWTVz^UJ/8Ke#Jm$:O3C?Q!:1<2yoGgN]?& =81.#(#"=87RKGoe_zpd]VM-! >*&C/*ZSQ=53+#$BB6EP.YQCRD:VG:L>7&+ !E@@)! C83E;8ed_udYZDXWAkeN\[IvvaffPTYEkq[qv`ty`qthcNhZFv\}aK]A*XB2D2*;.-@//R k)I+UB2SG8LD;C91J?3?3(5'1<'1dJ6[9"G+Q;-B0"]XH``L]U>kXAP?({i{qjv`ufov]@;*73(sxcnxbhu_ar\cpYkt|s[>O;'_\Lfvb_r\dt^es_ixbkzdjxd_p\gta]kW]kVcp\er\_mYap\`p\ap]`p]]n^ar`\o]WiXRfVWjZXkZjzi`ractcYkZ_n]XhYecap{l}zl}zl}yl~zm}yj|yj}yj|yi|yj~yjyjwjzz|z}{lGKEGOJLXP261..)23-683:<6=>8CE>DE?EGAGJDIKFGJCRZTTaWTcYXeYMVL;=7:>99:1ubNP>6602 C:ucgZM[UL[Sxp{dLChd-ik1gh%[Zc^+UJ-sPwqElvtwvwouoUztzt\_Y?[T7cY>xzQL#EF:/F5 [K1{pYjhg:be/GH`_/76 +FFfhfuvsdG;\"Z'Z(W'V#Z'\(X%U.queq~~nqp}~m}}lrnrp`q~n~iUFX$W%a%`'`&c'`#e'd%_2$wpvsey{{zjxvexue}{lhbTV(i#e#g&j=-mriouk}wtxmuynuxnopjglemc[Y!_#_#_%lL4D:22'2%0"4%<-D1!C0 C1 C/@.<)>*?,A,C-D*E+M2$K2&M4'Q9)T;+R8$fijggegy_GD*P ,'z'w%s&o%m'k%n%r'a3 mfx]7),8%1.<.B1J-?% ,61I3LLC!75*.1:3@/7'(z&$,+1?<[ut{~ytuwnnqkbdcY^`PWYRY\RY^OW\NU]RY_Y_ePNL*1i]TRK<8EJ_&Jh%6L53J@?PGCJBBA:90)'""0,,>>;TBBhA?1!]TQ[RKG<8:-)/&"+ >3+YQIRIF0('("$@>=820/#-TE3C5)( 1,+[SJf]O=6/&%G94G95}|y;71RHF.%'NFBcYO[MCE9*TN@M?;!,""JC=OK:EB2fgb|}bwv]dgRabNdhT\aPem]fp[mv`|kt|bkt\qoWmP5y=.*N=0#?1"I:'RB.^P<4(2#G/?%6#-C.o[DpVu]mTsU?|iRaaH[n[]r]ui*-/.$wxc{|dqs^baI{^nOfGwgF{hM[F1OB7PL?dp^^r^YnZRhSRgTXkX]oZftao~imzdmzdkwbeta`o\]lY`p\^n\`p^ap]WiXLbNC]KA[KF_MJ^LTgWUiX[o\_q^arbebapzl}zl}zl~zl{l~ym|yk|yk|yj}xjzj{kzj}|{|}nGLCENILWOHMGQSKUXPW\UW]UY_VY_UW]TTZQPUNMRJEKCT]TT`WUdZXeZOXO6948=7:?96=&<@2164<>'q^DeREN^XL\TxXQ+_[ARL2pgLZR)QOYW'H;A4 kgG|xvvvvz|t\A;-) ,* =;!|xsWD;YR:s^S4+%#>9UU'_\.QPCFHGgjf|xsgL=\(X(\)Z'W#Z&\']'\4%rtuwzzwzywwfqylYI^$L\'`&`&c'a&f)h&^0!xvs_]ZLuzyg}{kwvegfVxvgmgZR+g$e&g'l=-utd10'1- B;2-&64*-* JKCpf`Y!a#_%Q!dI:o|}lbaSprbsucppb9.$K#U"_&[#n^52,2,*YVO:71=;7NKC93.KLDy|YSLY(b$j(vghVS0010143511511}1d(a+d2"]4#]+a*x2v2#t5%u4%v4#w1}5#22/0.000-/0/1/7#<*3.48$14!5"5#244!2!7$/3134 l+~@.8%15 3/4 26"4 4 3v/l+^+Q(C#3 j0/00/000.-07&4!0:'aca}{fi}hkkvr_RJ?H?5I?5C812&5'-, :*A0D3"E3#F3#D0 B/>,@.A.B-C.D/G1I2"K2#O9)R9)R7'pXbgggeeuZK1"A'K z,({'w'u&t(t&u'x'g0 wgQljL;%13(6%/+:,@.F2F'#/RS1h[39'),0&('&../0/0),3?=VO[uIgXj{oy}v~jm~p}{pvsmllidgd`cb\``cfiWTUmxso`af`afhggnjgida[LFK8/>="6RCcNi.2?73  +5#3 40(~qmXYD') + 0.0ecaF7&lLacO+1'&WPJYNHG73J?:':0+5.)NGBUNJLD@*"%10/JGDbXS<3.~vq3($2'%,##1#>."QKHvqf]SGMCB& !JDA1('* "0)(%WF3J<.+#"1+*PGB!(NC>&7-*UPMonl5.(QFB.%%UJDSC8`WL/)#.#TEB3,+MH;FC4ffawX^FPQ;^^G~j|j}lqvnfxxgx|dv`K/ĨUG5aRJhI;J,!$ 2C-$2#, .=- :)4&0!0!4(4, C6'Q7(9=f@3P2%X@c2>G%0Y2#cHnUiq\R[F##&#=3({aqXw^{fMqfOjlZq|iffK~nRj]NIC63,W`PTnXSlUWo[TkUUhUWkWWiWbr^et`YiUVgUDXH`p`br^WhUbr`\mZ\m\`q`[m\PfUWmY`s`WmY[p^QeRSiW\qafdcs|l{m~zl}zl~ykwl|yk|yj}yi}yj{kzkyix{z|}oHLFEMILWOHNGHKEFKCDIA?E<>C;:B89@79>68:4593391NVNTaYTcYWeYT\U6:3:=4>B<=C9,,-+41 FG8ZRDnWHOZTK]T~kfQrlWkwn`e[Ahk7ll:j[=`E5PI,wp|_pvu|r[=3 72., "!liU}vpMXW%PF-$ &# +871/)&$" +*%C=4) ?1RHKF ceb}ny|irfJ=Z"S"T"Z'W$V$U"Y#\3%vt~lq|}lwxfttbhgVz{iihWxyg|nhTE_"V$P!`'b&g(b#i*e%`1"zoz|h|~m{|ivtdecSp{yg}|lmi[Q+ e$d'e'b4&q G:/$-!' KJCrldX"`$_#\&fE6txsysyxjOG=S'`%a%X"hZKMCA@:[\UBD<@A:ROGC@7AD>txZWRU'i'm(qbiWS00214337%5!6"7#6!6#4~5#t5$k2"l1t5"6#5"~6$}5${5$z11312221331100133!5#v.2-1;+v4"4 6$2"114 31.5!4%4!t1 w7%l1 s/8$34 024 3110~.s,f+\+V*>"@ +}1/.1.00/./6!=)4<,cfbnvs\|wd|gq{ME9JA7G;3A5.8, 4'4(."5'?.H4%H4%H4$F4#D3!E1"F2"E1!F2"F1H1!H2#I5%K5%N8)O9)R:*nW@iffdeedR7&L3&='> k'*{'y'y)x'y*{)p/ ^I7ohjWA8..<)6#, '4,<-@4GPP5|gp]}20+,p$-,/1-0-///,,&%9IAIp8S{B]9V~?Rktvtun|l~ykzwf~zj{vgxuhxvkOMMJB;wjthbbcbb^ZVZSQLB(4*(    (" G5XI-~yjLA9E=8)!  *"!B8,J>48/*UNHA98(5/.C?3-M=*1 9.*WVP}F=7WLG' NHC?73TIGA7/UG6C6*+&%732-$"/%%SIB8.+8.+C:6khd]]YNEAC75 :0,obWYOF730D<:ZNF;.+&^RNYMDhjeejSjq[syclpXilTmpVqtXrv]knU~cw}`ajNS^Brx}d]YDlUBuaEsnrY_6(`H<=, xe_E4V<1O7+C+G1#H2#K6)=,!.?1!H7'4 / 0F"B%p=/xE5zB3A1@2?24"H/M6mVI?+1"8$iR?s]FcP"+( 30,)('==+$A47& +;3cdapo^YYIeJ<\#U&Q%T#[$W$T%\&[1$uq{|kv|}lz||kzxgt~mtsjUF`"\$S"Y%d&g(b%h(d%^. z|}pv~optqxzgrobV/!g"d$e%`2$v  +I>2"+) @B=snfV#a#^#_#g@1ytxwfooyyjNE,d.`&c)u3!31304 223/10y+o+h*a+M'9^+~,10.100-.0=+2>+bfc~|gmk}yf~yghaSH>5JA7F>4A70:.$6(.- ;+C1#E2$E1$D2"E3"G3$G3#G2#H2$H2$H3&G2#H4%J6'K5'M7*O8(Q;,ZA/jedecbe_G1Q:-L6%?+7Q u,}+{)|*|(~(s/T>.odqZC1!+1,>*5%/%0)4)56;z`|cj@1y01r"{'$+,+-]]",-~5<>-@!.J"&C/<]=Pu0@a"(;dhhwr|m~|myvgxsdxufzwikif}}teneZtqi`]WR[WRYOKL>8()08OA[Lc(;F2(5,. -?Q':F<, mqmtws>41 + +*!$@70b_XWRP6,.$ ) odO@3$ C:6QF@J@>$4--LD@6+(*" )!WI<3# ;.)JFB~}qoh\L@;NEA' 2((JB>D;68.)QIF)SD8-#2,/G@>I@,z]Kxh{n\q`o_yjYuhXuhVwfUwfTwfV{lZsfTaTDXG5O<+3&>2%A.F.?-b=.}@/A,9&D1H6L6?'m7!n:%X- ><'@,:*D1$J3&J3$P8(G- G3%C9+E?/UO==1#66%dv`WiUYmX`nZgmX`fS[cOSdPUcOScNTcQScRFXGFYI]l\\jYUdS[jY_m[ZgW\k[]kYWfVScTVgX]l^ebbq{l|xk|xk}yj~zk~{l}zj}xi}whyi}wh}vizsd~oort{mJMFDMIOXQ7=835-582:?7@D;DH?GJCKOHMQLOSNTUPTWPT[ST`VSbYUbW[bZJLEKMGINGJOHHMFGLFJMFBH@BD=_QHaWNP^Uwqz}ozt^cX<~lJ@2BF:;6.*)) JMU\\b)13 %# *( :8HD)1.*' -*./LJ-kcGA>LF"JA%egd~lpr`cM=Z"V%U%V&]#X%U$\$Z2$vxxgpz{jszzjvudvvquhSDc#`&_&S"^'c&d$h)b%Y,pvg|~lqu|~jnpo^pvvefaTT-!e"c%d%b0"92*C90f^SN@5UMA_VJTF<]ZSupfT"_$]%Z%_:+som]|zlo~nuse\VNO&a)a*[)qM@PC7K90WF;G8.G4-Q?8I5.G90c\UWGAS*[&W&odhUP....00//01/10//5!3"6"6"2312311132225"3"3!35"001/3 :'u4"5!/2 9'5!244 211111m-U%a%b*\,_1"o/10224 442.10/u+m,c*R'F'; +q2/00/101/+6 B.8'cfck|e}yf}h}iQI>JB9H@7F=6A801$8+ 2#2%8)@. >+F1$G3%G3$E3&E2"G3$G4$F2"I4(G2#I5&J6(K4'K3%M7'P:*N9%cc`cc^dqZAP8,P8(M7'B/!6%9 Uq+{-|+|,j0 L;+jghR<,3(0;-=,:,5.6/9.:phLv[eQK l)&s$!x&")){0+Q% hQc@=X.8R?Jd>If/;[1;W !2%+*3q|m|m~zm|yjzxi|yjlgfhPHpVNqeZrh_wogrkdoe^WLE.%!  ;HDY"9MRg226.%0,/0))(,32:?97F>:*! $.# 8--80/LCAA76RNKyxsmjfA;9## E90G:&+"1+-80.TJEKEDC><&B;9SJEH@9G:-!!6,&HB<\\UTMFNCA3+(' 60.NC>;0+@728.*:,$NB7,%'700`[YpnjLD=ZTOGD>E>;YROvvsA<5A63C;6.&$/$%fVJtdR\QK')!!ZSSef`qw]R\Dmw_ltZx~gYeOZhS^lWdqZt}cp\eH`iQ]jViv`U]O"%51-zdrgMUI5`S@XK6UI8XM@XPBf\MndTpfTqfTujXshWh^KaWD`VDpfUxl\yl\}qa~qas^r^yjZs`}mTq`Jl\HqUCuSAs=,r$`J}S:rND>:D=L\TN^Spxhwv}ug|tem\<}b8>;VU7wq\ryschYK6$i`H77 trZ|}dF;=9-( +)( ,0 +el6[b+RV#:9**:;42FD%CB ;;30,, }]?8HC$cebegWtwhuxjhM?Y!W$U&X%^%Z#X$^"Z2$hl\uudxwhsrbji[~~mnm^nk^dbTjjYzzhuxfjSDi$`&^$`+T#`$d$g)a#Y-fm^putb}y}lprtrctocO-"_(^)_)]0"vdVP?6P=6[KBWD:TB9T@7R:5UB_@4dXNYJBcXPYPHSHBaWQQHBA:5uuq\QNI$T R%j`hUQ/-/0/1350020101121111330112102143 212012419'W#9%/48$414 1 11/36%10w1v4404"4 10029$/2/1/0.-t+j+])L(: E 21//01./.-4 E4ada~kzwbyua~zewraI?7IA8IA9D;3?6./#6(/!2$>.D1#F4&H6&C1!D3"E3"C0!D3 H6&H4%H2#H4&I4'I4(J5%L4&M6(N8)O7&gO}\ec|Zb}\sZK5(N:*N:)N9*J5'A/!9'9FU#Y)N4'I8-o[giiUAL:.$ 2?/?/=2=0<1AGM-}exaR6&Hq+)q%!u'#w+,mf*6C#/H 04)4N,4N)#""0'stqttp~zl~{m~{n}o^VUtWNbE>hXNne[i^WocZ`QHO?7  + CT"K`'BR#IW)20$*"&,''.#!" *$'>30F>8ica80+=52;542---((/()-))-'&4-/2--<74KGE$,$"-# G;66* 91/ZQN" *00>SMK81-(B<9NC@NF@H@9A438.,=7395/QLHpmdhcVYURUNI")"!PGC2'!>3/LCARJDTG;.% 80/3-(?;:YWP92* .((MFBwvtuwqOGB1('4,*G?5'+'*&+&/'8/!=6&1(( *%71#'!kdUb[Kh^N]TD_VEg]JujUh]Hi\KyhOydJpXq_JWG4s^LeS\K8H?/PL@JF9MSAWgTbu_ZoY^q\^s]]s]]qZ\qZOdNSePShTWmXZnW^oZct]fu]es]dsa]mY`q]cr]dt_^m[YjVOaOVhVXkXUgVOdQF]JG]LThY]n^VeVXhUP`PPbRReTTgWedb~o~zj~zj{k|l~{j~zj|lyjyjpvNQHFNJNWNIPHNRIMRILPKKNIIMGHLFFJBDHABF>AF>>C56<44925:429207/KVON^Skufooszax[~pwp^r}n{pb~sf@0#xm_G?#qF.UIA+L9672/&' +?@MUJSTV"D@./ =>98UV0GF!7734AAuCCIJ#adahj[sveweN?]!Z$X$^$a#c%d&a"_7(zyvujk[||k|}lwugmh\sp`u}~mqXIf$^&\(\)U'W$_$c&`#X+in^wpzwywtvtec[QD&J E E Crsjopi|}tz{rllfoidd^][ZWha]; GJ!N"V2%|vfvucyxg{{kwvhyxiF=3M'`*`+!^)^;.hmaX^U_d]SZQLSIci_X\SPWQfmhG?5$$'8 - &#*!"3 !0BDHyr}p~{m~{n|yk~pe]Zz^TrhulshaWJBI6,E6-  + +IV&Sg,Md%3:71!!&/&% ( % \RJ|sm?2/-'')#"#5*&=51A98=644,))0(%3,-HBAJA@?40;,(3& 7.,!D:3TI@<:D66N0,6[SO*!-&!KA=WOKZXV]VTTOJF=:$5-(`]Y'!RJG2)(+##2*(kd[LB<7,'6.)SF;6,$5.-LB>">97QJCRMDQQOF@;TLIb`^RLI.%$LGCKHDwkctdX[RL0)),"!?61`b_iq_owadnVwhqypxv{^nsYipTXcK[dMJXCL\I7H7?I7(0+6/!81"70!1+1,^[J`ZKc\MC<.iaVSL;`ZK:2"61$VQDKC6TL=80#?7.$#*%USEZ_SWlXSnXFbMUoY]r^OePUhS_oX`nXeu]`rY^oX`rZ`q\ZnXYjS[lWZjVYjX\n[ZlX\lX\kWds^]n[\m\YkXFZHLaOAXGC\LBYI=SDGXIVeU[iYVeVOaQDXHKaPedb}p~{j~zkyj|l~{j~yjzkyk|lrv{{{yy}pMQIENJMXO3;3+.&+0(+/(+0),1*,2*.3*-2*-2*.1*.0*FLDWbXVdXUbX\g\27.7;58<5:?751%!bE"kR!hi557IJNL@CUX-EGRR.EFCC\]6f\b#IN!YZYa^PfeWqsfhQB_!a%[%^#a$f&g&d$[4&tpn~mssbxwfqo_jiXon`ZXJyyfukSCa#['M$rM@S$M!]&_%a#\-ilZwuaoo^yyizygon]wud~lXUFe^UM* \#\$X$N#w\i__h_munhphQTJ\\TX[WTWTWQLJ T T P"Q/$x~ns~|mrpavug[ULE*"Z&Y&\+#nPD~kk_F2*M,"P0%yokTR--000010111113!/113313210133111112121111/16#A12/314#14 1 2114!5#11111103!/0113"?-7#8%?+C0:*23 }1m+^)S'K&55 +t1/011.....@*dfcv|f|yb~lLD8KB;HA7F=5E;3B801$6(- /"8(@. D0!F3$H3%H5&H5&H5'H6&G7&H4(K7+J6&K7'K8(I4$I4%K4&M5&M7(Z@.eesTa}^|]e]D1O8,O:*N8*O8-N8+M8*N9*N:+L6)N:,J8+M=.ZG6kddR@/O>4H7-%&(4A 4C!3D2@fx_~fT=+5])'p/2o*/l--|]Q%!"%&-""144;{p}zk|yk|zk|yl}ohdb{qni]yqiC80*   +   +1069:=*(41  ,# #$#0()81/N>8qZStib OFAkaYbWO^TKWJBYI@f\Rnc]UKG* -((=76OHDH>;LFC7/.+""F=7H<1UC@4)1>IDBYWOYQI+'%LD@'/'$ojaH?4E6-, OC9?2(0(*C95MFB/)(d]TYQFFC=@94G=7lhd\WU!0%%,# B<:pd[n[Oi`\(#") >40`b_`gP{}atgjrVhpWs{bx~dwoppq{e\hR]hTJ[IR]L\dP^jO5N8=XG*4'%*'!871KD9YOBbXJh]Ng]Ml_OkbQk^KcVAg]MZSDWN>TK=NE6G?0HB5OG7I@1RL?QMAYWISRDSRDRNCWTJB@6OKDVQGPL?aiWcwaXlWVjTOdNJ`KYlVYkVXjS_s[]pXeu^iw_kxcgt_gu_cq\cq]^n\RcQPcPYiUZkXXjXK^MMbPMbONcOVjVPdRMbPMaQNbODXHNbPO`QO`QEWHEWIOcSSgWfca|o~zl~{m~zk~{k~{k~zjzj|l|mqxyyyy{zrPSKFOKNYPMVNWaXXaZY`Z^g]]g]^g]^i^`kbakb`ha`jaZdZT^TVdXVeYYeZS[SS\TT]WV_XV_XV_WV_VV^WS\URZQNWPR`Ybm_{{zx~vf~n~m}m~no}tetlPBE:;/5)5%t6:<433% >01!P5UDhTP_b$`d,BD^^4IJ>ArrL|jl2V[)__]SOBYWKmodaK>RT#T"U!U V Z"X!V8+sqswsb|zhm{yg}lyrsqnVDf'^'W(S%['V%T"e(g&\,mn]ususvwfqyttcsqdH3*I"L$E!Q9+{zzqJ;3B-&Q>3`NDwn_wnqwdbSvb^TXOH@3*B92a[PgfWtvdiiYabQfgXik[sxf{l{~loo]{zg|{hrxhWU0022022212211216"A.C1;*<.<-3"336"7$7#4!4"2222 321321003!=-2.32151204 04 5!/301313 3 1100E58&6&:':)8&?.A/@/=+?-w:)h7)\0!P1"9 M$211/..-..;'dfcyud{xcpjdUG@7KB9HA7H?7E<4A5-3(4&6(4&;*C2!F3$F3%G4&J6(I6(H6(H6(G3#H4%K5*K6(M8)J6(I5&L7(K7(F3"H0#X>,eaz\uV~_{\{^oXAL4)O:*O:*M7)P8-N8+Q;-N8+N:,N:,K8+L:-O=-gafeR?P?6O>1L:/;+"( )*/6=9&tay_ya{gQC-!7])(r.5m)-UL6*  $$$$%(fgewr~p~zm|xj|yl~}p`]][QHeVK@1)    +  "%#72!0+  1''+ 80.'eVM|tcZRJ<39*"NC;/H,)=4*#6+#YMDmg_D<8-#"=63JFCIA==53.%!TKFf\XnZXODH/.7JCBQIC*!!:0.H>;MIGYUNda\ECBRNL^]]975FA>WQN"4--OD=NB8ZMEZOHPF;@3+,%#_UQ<5,YOJSF>fUII:/TH@SI@LF?ZVT,""5+)' !^UOpaUea_%.!F70iie|cqx`nv`enY]jVN_KEXDSaGclSfnWQ\FYcO`lVH[GFYFAQ?O^JZjSLaLAZF:R@IRB$-!0B:,:4(/**-*//*/-':4,IB7VL>UH4aWGbZM`VJcYL`SCbZIb]Ob\M^WIa[N^ZO_]QTSHNKD995,..%%' #! 4:2L]JBVDN`Lfu]fw_as\bt]cu_UiRPhR\o[br]gu_bqZXjTXjWDZGNcQUhV\kYamZ]mZRcQTeUMaPOcRMbORhTVkWMeTD]JRgT]p\XkYVfVHYIFYJI]OL`QNaSJ_Qfca}o~zl~xm{j{j|k~{kzk|l}mpzx{{}zzsPTKGSLS]UFPHJTKMWNNWOOWPOWPMVNPYQOWPNWOLXNKVMEOGXdZXh\UfZ\j^Q]SVaXVbXUaWTaVR_UP\RO^TO]QLYPKXNWc[`l_||zxi}m~m~prqyivn^=05(/-1E<49=& 5$1&%x<Z^Z\ NMgi.kk1YU&LL$BCpXQ*;> FI^^]_\PdcW{~qxrdwk{n{nyk}prvt|tnsoq}kkw}kyyzqkSCd$^%_$a([&\$X#b*g&`/ tmiS|jtv}~lvuep~~ntsbhgZZTJb\NjeWQOAZZKbbS\YKEB5^^N_aQ[\Na_Sb_Q_ZM]YNCA5_\RedVghXrsa|}l||jvueroarqcgeVcaShdWa\Ozyjpm_rnapj\heXs}mn{|jomkZlluvqhe[G}/v-w.{-/3!18$5!3"2 {*~0B2L=dReRREPA^P?/4":'9&:(7$8$1 6"@,;+5"6$7(@/<(3!3!/4#m(z8(//10211111"04"6!1101101 6"0104 18$8&8$5322 /20~0h+j-\)H)1b,/0/0/0/-<'cdbsitmZYREJA9JA:H?8I@8F=5A6.0&2&3$5&@0!B0 E2!D.E2#G0#F0!F3$E3%G2"D. F1#H4&H7)J6)K5)E-D-K6)M7*hO9}\oQ}^c{]{\}^nSJ4$M6*O:*O9*M9-N9-M8+N9,N;-L;,M<-K9,I8(r]z]{_|fRN<1N>2N?1L<1J8/D3*H6.N:2nZNzaya}cUA2D2(6M g+.uKDp`O!!'2-1+,-rq|n|yl|yl|yl{nb^]RC89&  %,#!&, 'B=)'  1$ # 7$ ,$$"E:3gTKwib=4/H>9L<7AF )!4*'A7/g_XjbZQGD+!831LC?/#7.*WOKECG<9B42?LKPNKDTLH) -#!I@9vso5/-HB<=71;63CA>.)%2//'#!^YV#) XOING>\UNseXfVE?4,-$&G?6K>1g\Pwi[ucWtbUlYMXMFPKJ4)&<2+*$$`[ZxrkQPM&F5/`OBggbdiOpu^tx`nu^`jUR`MM]KcpZs~g\jVWeTZjXR`OBP@J[IXgRsHWCI]J4K@6MB/E>0@<.>7+8/+3*.3,/4/+-*-.*./)65-56.+,%++%$& "$!"!#"",)-@90C<*:4*94&51;VGGaM[m[_r\]nWbpYet]SePTiRXoVUjTQgQQfRJ`KE]JG]JAXFQhUJaN;TAM`OZiVO_LM_OG\KBWGRbSRcQNcP>UCG_MKdPNeRH]KMcQLaOUhXPdTNaQH\JN`QPcUeca{nym~zm{o|l~zj{k|l|l|lowy{zyz~sLQIIULQ^TO\RUcXVeXVe[Wc[Xc\[h\Yd[Yf\Xd[Wd[Wd[TaWYg\Wi^Ue[\k_UeYZh\^k_Zj][j^XgZVeYUfZ\k`Xg\Wc[VdZ_l`~yxw|zhzm}l~orr}mvfgY1!,,+/]84<J( /*/ 1^OHSSW*RW(UW(1- +PQ'OQokGqlDEG BD?@cdbvyjln`abRlqaovfagWlscfm]V\OV\N`dU]cRgl]\YKifWnk[wvexudtp`zxfyxduu}|gxwc{zenWHa!\$Z%^&_$a$d&[!f)^-wkv`\Lpn]{zhwxgtterrcnj\mhXwudrq_onluursrbusfqwwhvxistcliZ~yimlhXmk[tpyzgv{|jrrxxftrbroaf_Prp_{xgvsdon_dcRvscpn\qo`sqa}|kkiZmzyhovxfh_\uC1H7K=M=H7M>M?KJRCI:TEI.B0I;U&7&/131334!1 1!13 3"3"1131113 0104 |1230021/2202i-n0h+T)=#: z1//1/../<'ehf{xeysa|lKD9LC5N>3M<2L;1K:0K:0O>3UC7|cx`zazhSL91I6,@0#C-%O;/va:,&%$MIHmmh|q~o|xk~{nzxi{xkzvj}znWTS &3'%8-,8.)%/%$*"# + / LA5B8;''  4".0&#%C:4SH=G>@U>>K\WZC75ZQM0'%4('?5,?6.(##80.aWNE71"&$,% NKE^ZX$+"WOI40,aYQ|ljYG8/'0');2+j}hZwfWyiZxgVu`Plc\732!I81n\N0'%887~,&$.eRG`L>gidq`gRX`Mfm[ovbqzcv~fv~d^kWTgVEXIO`M`lXoxdis^enYV^KGVDM^KGXDSbP:L83I74J96M<9O>5N;3L:4P;4P>0J72N:4RA4O@6RD5QD6SF6TF6RE5OB6RD7PD9RF6PD6OD6MB4NB2R@0T>4WB3ZD1WA7YF;ZEPfRcr]SeORdOPcOMbOVlYQiSJfOJgQ>\H6TB5VC9WDOgSTgTTgTQeRThU[n]ZkZXhVTeTObQI]LUgVXhXRbTMaPVkW[l[PcSPgTMdOOfTLcOQfTQfUUjZNfWPfXfc`{n~yl}xkymxj{k}n|n}m{kowwyz}{~~o?ICM[TL[RL]TN^VM]UK[SKZSKZSKYRMZSKYSJYRIXQIXQHWOIXQWj`XlaN_WK[SM\TM]SN]UM]UO^VJ\TJ[RJ\RJYPLZQK\TQdX|{pqq~o}tfzm}mtsjY_P@01#.)4))q1>AR.*.*0`EMU;>GJ#y|aYX*\[%0/ +^X0FGOM#PM,ded{}mopa~~nqp`VSEvtfrseopbppcnmbifZ{zkonm^trcrp^p{{jpxxft{}yvd|k\XEiVHa!\$\%a&a&e&c'\&[#\."t|ktpo_~nvxoyxwfwrc|zhxuewwetrnqslm[sutu~}knk]yvf{xftqa}ovveyxixwgvwg{|kwxgyyinl\jfZqm_a[Mqn_~l}jnnywf~nok^~|mmvtcr{zf|}lpeWV=+15!30137&=+8$8$8(303 7&4;'8%112033221133#1/3!1001115;*b+8&./033#5"4 12"48%6%4!3010114#11/7%5"33222222112n+v2"m+a*N(8T&/021...8'bdazvfwr_lfWH@6IA9IA9G?7G?6E;4?5,5+#1%0$."<, B/!C1!F3$G4&F3$F2$I4&H6(G5&E3$G4&G2$J5(J5(K6)F2"I6&K6)I5$rYba~_xYwXwX}]yZ`H3M9.J5(L:*K7*I5(L6(L6)L6)L8+N=/M=0L9/hTCfx]z_bL75/'&A:4|vla\/%&*#%F><* 7/,77?$'>+,<607xh]SKC:20.$!@3,{+%!RIEfbZge_[WR6.+GA=F<8OHBWSR#)WQK<71E90`UHoaQ-$ .#"<-(WOFlgZwi]s_Ps_NwdQxi\eca(gSH}iXH?8<<7+ >,%o_fOBVZW;J9JWGGTENZIHRBJ[KDVG8M@=VDCYHHZIN\KJYFGRAEQ>VdQKYIO\J[fOP[G?Q??QA:SB7P?5K:6K;3I85K;5N>6TB6VB6WD5WC6[D6]C6[C6ZD4YC4UB3S?6TB3R>5R@4O=5R?4UB5WC5U@6VA>ZFC[H\o[_p[ZmYE\HKaMUhSShRNgPRjTRfSH`MKcPI`JNdNOfRVlXOeQSfSTiUOdRQdRVgVPaOP`QGVGOaQVhWViXI]MK^NMbOShUJ_MB[I@YH9RC:SD1N>KdVfca~pznzm|p}m{nyo}m|l|m~okaSg]Og]Pj_RlaUneWvo\otISIWcW`l`crdjxip~otqqnpmo~mporrususrovstr{wz|xwtwtyu{v|}xzz}y{Ħͬ|heZMeZMf\PmdY|lopyi-4'4%2%,-<;o&q/O:Z1++4$w,>/[]@NG-?5#mvoVdy[}zXmldMgify{j][NdbVgeWhiYon`hgYfeXol_^]Pli\nl^_[NyxjgdUnk\o}~m{|irqqvvud~}lywd~dUG\"Z$^%a&a&a%a%_$[#X,ipafcTjgY}nywdlhV~|l||ktscspapn_liYpk[rnZgcPlkYkgVso_a[NecT^[Lb^Nb^N\WItpcqm_om^ywe{gnsqc~~o{|n|}myzk{{lliZ{zi}|j{zjyvg~l|gsroyzgnl\rywennprr_}mgUQ/6!00/.15 21214113024 11111212123A.8$1212430.4~5$b/8&.1306"33!18$2 6$7'4 13/10/15"3 132"4 2222032/23w2"w0s0g+\*I'3 l/021..0;&cecorpl\G@5IA7H@8IB8C;2D;3?4,5+#2&1$* 3%=-?.D1!E2$H5'H5&G4&H5'F3%E2#G4%H4'I3'J4)I4%J6&G2&J4(I2#rWtUlQtWvXz[xYvWy\wbII5'L7*J5(J5)L6(M8*N9,M;-L:-K9-L:.M<0]J;}ew]x]xdQM;/M=3M<2M<2N=3M<3L;3L<3fWIv_u^w_vdRK:0N>3J8.L<0ZH9t\9())JLMt{m~{m~{m~zm~zmzvgzwhxtgzxkfde2**>667-,90,!/! , -" - 9+$'@4.M=5=:F 9/1D/-DTNVaXU'-&#,"!YPJ\K>r`NTB4K93pYTxmhNE?/+*C@?PJGA546.++#!E@;UMGyPF@]SO-&&2+*:1-?84QQU88E65@YQO}n\g]V821,"<2*~|lG<:JD?YXUIHE<952-(XLAmbXC>>(8-)PIF]\VI=5XI:^TC'4)%7(!'0,,hhgzskucVgVHyuo0-.&9)#q\O~vfDD>,$%vcTFX[Z:J?BRDL[L;KTB4O=8TA:YF;XCE_L@ZEH^JDYERhSRhRMbMKaMRgRZlVXhTVhTVjU[nW]q]UiUPfPPhRKaMH_KLcQK_NK`NTiVVjXTfVQfSDYG@XH>XGPdRTfVTdTMcRQdTNdSE\NB[MD^OAZNfdb~r~ymyn{ozm{o{ozlzl{m|mzlyrgyrgyshzti~ujpŪyzzuutosuwpc{sh{sg{tfyk}np_Q<2;-7+--(;}6EM!c13-/x)C( sqeV>-"u~bc_qrdb`V_\PbaR_^Q[XMpoahg[edWYTHPJ@E@6_[Plk]tsesqdtscyziyxfkwubn~jol\nm]uvdhVJZ#[%Z&`&^&]&`$`$e*T"vej^w~mrxnj\yxg}~lkfUpn`yyi~|jsmqm\jfVzwgso_~|lhcX\VImj\hdWom]wve}l|zfl}jvtfu|}luw}}lup`ojYurcyueto_~kzucto{|i}|nli[~|l~|hklnqqbwzjjUQ1B/2 /112221333131106$21111121014221110/12/2VIrM?@0./016"5"3"16"5"6$8&4#1.01/12/3 4"4!|3 4!222333 2/23{2#2x0i,d,V)?!@3/.../;&dfc{xeyv`_XIIA9KC;G?7IA8G@6C92?4+6+#4&5'.!3'=.C1#D1$F3&H5&H5&J7)J7)J7)I8*G5'H5'I7)J8*J7*L8)J5(I4(M7'z^z\vWy[{^xZoPuWxZoUI5'K7*K5)I3(I3(L6)M:,M;-M=/N>0N>1N<3SA2zcz_v]zbO<.N=2N>4L<0M<2N=3K:/K:/O>2s_w_sZxaTA5N>5L=1H:.H9-o\ydM#$/+y|l~{l|{l|xl{wjzwiyugxtgzwkihf{pWNH/"  $$/"2'! :-'5(!5)"TD7RKR!)J')BOKR8.0+$$,%!,&#/'#f^Vi`Wrg[gXM)_QI{wIB<8/)VIA\N@ohc,&'-%#7,&"ZXUf`Xt`/',%'>.%XF:-0(%%!!MMM{}wFCB!${oh|/,%,$#&(#RSLpofdecflZbiVfo\eo[PZIJWG]gVpwfovaks]JT@GSBDN@CP@AOWF>WE?XE@YGF^KC\J9UB9UBJ^LI^JE]JC[FE\IN`NOaLPdPNdPI_LAYFF]JG^KQfRQfQ?WCIbME_IRiTRjTC_K?[HB[IKdR>VDF]KI_MF]KD\K>YGIbPF]KF[KDZIAXIF\KG[LF[MNdSF[KQdXca_|p{ovmbwlzmzn{k}o~wj~xk{m~wi~wi{l|m~psztsqstxxuyxssruxx|xywzzxyxyxyyyzzwxuwu}tf{kzjzkyk}m}ml^PD]Q,1"4$,v%FC%!p).'<,iQ2(5 7:~pbU<-!z~TUwdebtuhVTIopblm^kl^lm]|}njk[vuhZVKpmbfgZ|}mstc~mnyziqrxxudq{zd{xfto_yxfgWJZ#[#Z'a+^(`&c&_%_%X'lXMgj]yxhrx||{lu~nnwueyxjc`Rvqcqn]oiWhbTojXojYtqadaTfaVroad`Tni[jcRkdRpk[xvevsaom_roakk]hgXspaqoajhYsoaf`SjfXqn^vra|xea]MywgkhYlj[ni\jfXifVsp_usaiiXji[on^iTQ023/0/222221116"2014332112302211132!2/01319&s`wG84!-/1236"14!2 8&9'6"1131/12/04"~2z0 3 22220012/14"20n/a+\+I$8 X&31.//9&dfc}hjTM>HA9JB:H@8I@8F>5D<3>3+6+#2%7'0"6(=-B0#D2#E2$F4%H6(I7)K9+K9+K9+J7*J8*K7)O:+N;+N9,N:,M8+V>.a`|^z[~`|^}`{^vXx\R<)L8-L7*K6*I4(K6)J4(I7)L:-L;.N4N=3N=3L;0N=3M<1L:0G8.ziXpWpXt]tcOJ9/J=0G9-H:/dUEt\ZG5$)[\[~l~{m|xk{wi|xjzvhxtfvrezvjiif6(&'*0"'>50@602#/5"J8,SMQ3;Z+,C*#!!2(&-&#D=6UMHJIIdgfutq :-'h]Xvso-%J@9A73/(&GB@4,)D:8I>7[RK~}unhaA964..80-6.*MKIqrqJMYACTXOMhc_0)*3)(;0,\SJpym[k^T_ODN=2^QDSB7^UM[ZX&#/";2.#vdIA2(!#-"F8.TB6RA71$-)&c`]??:&SLHUUQ/.,)##%-WA6O:05#A0-ZdQgp^alZHTGEQEKWFgr_T_OS^Mjq]nt_HXCK\JN\KHVFAVDBVEG]J?UCEYGH\IF[HFXGCWF;RB4J99O>9P>;SB8Q@6P=7R=@ZF@[F@\G=[G9VD9SBYGB\JLaOI_LG`LG^JOhQKfPPhTKgRJhRNiSGbMGbMBbMB_LFbMHcOFbMGbMOhVPgTQkVKbPIcQC^KE^LSiVQeTG[KO`RQbTFZKLaVZWR[N;zobe^Kys_j`Ownbwjxk`xkxkykzl|l|l}lptwywwzzzyxzzwwvuw{y|zzzzzxzzywtxyzxuyts}m{sc~pp}m|m{m{l~nq}lq0z" +$(,Q'1}&&,1$z?(PT3yypcOE;'||}|}VssEY\YgddbfcVdaWgeXihZddVkk\rqbttelj]b_SecWUQGkgZutbzxgrp`ifXnl]|xd|yec_NrmZd_NhdUb^PhfWqaUX#X&X&X'_(c'`(]'](V*vmbTQJ[WLd`SifVcbO[XIZXJZWKKG>hg\LH>VPHVQF_[N^YMkfZ_YJf`Ob[KYUG_[OZVL]YMtqbxvel|yhok]uu{zl~rebUrre||nqqbr{{mwshok_}|k~p~mppnj\|yiuscsqcml\om^qoapoahgX~miTQ//3/0/12223/213"5$016235"123112 22101106$14105!k~y=-10117#36#16"4 5&1"6"30101102232~5"6"22222022/13 21v1g+_+U(H&:k-1/.09(egdjhQJ=H>9KC;HB8G=6G?6A6.?4,6-%4&;,7)<, B0"B0#C/!G4&G4(H6(J8*K8*K9+L9+K:,K:)L8)O;+K7&N9,O;,M9*^H3da`bb~_|_xZ{^|^eO9J5*L9,K6)L7*J5(L7*J8*J8*J8+J8+L:/J8,jUx\y^qV|fSJ7.P?5L<0L:0G5,J9.J:/G:/`PApYqZr[t^R@3K=4I;.H8.M>1pZ{hRC2&6)4*$[VOq~{l}zl{wjzvhzvhvrcvrexth][ZWLBZODRE:E7-&.)B818-' JA9VJC2I=548L;!1") #!0&"/(%UOIOGB833-)(+#6*$90,XSM}f`Z3'F;4TLGLD>HB==1+=0)E90lg`zyrQJF0(&90-$/*&qrnGMVCHbFHR`ZX-# -"1%!"1+&f^Og\KN?1G6+R@5NA7urn*%$.$$1#R?47't]SA) !* ZUO|~zqZYR"'%6&.!6,)6'$9&"@.$U@4`I9gO?kRAjR@ZD8\][\dQS[GHSEIQDek[jra^gW_hVXbOHSB]eUiq^gm[mt`R[IISD`fQswaPWFO[LJZJ@QAJYJFXGAVDE[IEXFFZHGZI?TC>TCATD;P>>VEC\HF\I@WDB[GCZG@XD=XF9SB>UD=VE:SDAXG\PAwoa~n|l}m|lzk{l~ooP?#+.,0!3!{03$6)1$13#?3yywf]C75}}qttEtwHcd5|[l`^]faUQL@ZUIWRG[WJB;1UOGWSGYTLa^S^ZQb]SkeYrm_jfVa\RgbVtqaf_NlfXgcWkh[QJ>E@3RL?c`UuvgN7+T!S$T%T'T$X%T"Q#R!FOQFRJB^YOWREaYLc^RfaVf`Vjf]d`TkfY_ZOd`Sso`faUgbWc^Qzvfqm\qn_d`Rtocoj]so_zvcxuc|zjtsdyylsli]ol_[YNdcXnma||qnl_ok_wuh^YMHF5sraxveurcvvgki[ywhdcSfeUihZnl_nmassdon_wygiUQ-.1//0/111113 17#6$012337#32224$111/1112025#20>)s]zq]O>.0112 23"3!4"4"8'5"5 1/1331203 26 05"0/222231221!42|1r0i-`+S(@#F"1../:&debpmLE:JA1K:/J6-K:/K;0H1G8-H9.o^MqYZH8I91D5*J<1{uh~{m|xj{vjzvhyugxsfwsfxthRPP%7)";+!@0$A4)A4*;.$1$#+!(" *&%/# _]Z:0(>3,3)#-'$=41L@9E95PHDmic][U.((4,)/%""0-)AFO`_cID@.%"2&!F6.",%&0*'c^QxfjZJK:.~|v<96) !'I6(oVvOE5,'()$!+%!2.)2.*%!#'*M:/^K=`L?_H;bK=]F6aJ;W?2S;.`I:bI8bI7S>2WZYAOBGTE>K>>J=:H;=KGVGHXH@SDATDCUECXFBVD@TD?TDAXF:SAAXFAZF=WDYL>WK>YNAYNAZNB[OC[OC\PG_RH_TIaWLc[Qg_Urma|l}m}m|m{l{l{l}mC56(5'3'/$5'QC*(- .1//!xgyv`Q>7,|z|}xUgk5ntA^|_^]LI>NH=TQF1.!+%E;5HD;TOHURK\YPWRKUPGd_TNG;NJ>GC=MH=YPEXPCYTHRNE[WN<:.*&JF9^]Pwu|nb~pdwm|qg|rwlvxyuJH=JA;PH?TMCXSG\XMVQGVPCRN@NF:OH:\WKd_Sb\PYRIOJBTODYRF@7*MG:XSIZUJJC5ZSHXREd`SidXSNB_\Qa^TYUKPLB[WOYUK]ZPMJ@YWMYVMEA685*=:,SQB`[MhfYieYYTIieZ^\NNM?hh]^\ShfZii[`^QdcVgTP1/9&1/33101025#1 3"6%1201121224 8'12215!13!0115$30<)jXreTI;00013"26#2!4#4"4"4#6#113/03238%9%3 {.3002203322212 10{2s-g,\(N(9`,,.09'dec|vd~veNF:H@8F?6H@7E;4F>5B:1<2)7,%1#9)8)8*;+?+ @0 <,C/#E2$G4&I6(J7*L9+K7'K9*K8*L9+L8+K8*H6)I5%t[C_axY}_a{[|]|\~^}]{^N9(K9,J7*M<.K8*J5(H5(J8*I7*H6*H5*J8,cN>v]v\t[waYF7L=1M=0M<2I;/F7.E5+E5+F6,vdQmUnVpYr[N<.H:.H:.E8.P@3zeOxfQK7/J;1H9/WMB}p|xj{wiyuhzuhvpevrdvsf\[ZHA;7+"1$#1!,$-"#((+!;;H,1I,1NC64_M;1$!+'&WSO^RGeN?`L=E6+6-)=40=0(RI@qqj;2-3%=3*5,(<97'80+G;4bYOfe_6..8-)7)#3+* 85/qom-%!1'$3% N:.N;.3#+ -'#SQFqm\A>=)"#)2$xaWD3-'.)* 6'_J?bMB\H<`LD[G@YG@O=4L<3T@4cM?gNBgPBgPBaI;dN@_I6E9;F9?KYG:WE?ZGAZH?ZH;QA?VEBRCBL?IQCEPCDQCJUGGUFEWFE\J>WDNbPSiTMbNLbOH_LIaOC^K?[GF`KE^II`MNbPPcQPbPI]JN`NM^NG]LJ_NH^ND]N:XH:VH3NB/L?.MA9UKWQO5&3)$4' N?N6A4F?C2"wj_~s{m}m|n|n~q}o{nbWKUH=UJ>XMB[OE[PF]PG]RH^SG_TI`UIbWLbWLbVLaWLbWL`VLbXNcYNcYPbZRbZRcZSe^Ue^Ue^Sf^Uf_Ug`Wh`Ug`Th`UhaUhaVibWkdZlf[nf]pi_tobzj|l{l|m{l{m|m|ml_/!.9-7(I:tt3 1 /1"1!4&5(zkwyWD6A1$}{jmpH{}VoqLUW*`d2\ZZB=4D?7>90(%$!4/'<8/B>6IE>=91)$LF1D?8OJ@QJ@NFIAGC9RNEMH?C=374'KG=FA:EA7SMGURHWSKEB;86+'(/0!74(MK>[WK[VL\WMOK@B@577*WVKb_V\YPJG@QOG><5hUQ-07%0/320/1042 4 5"6%3 35!4!2;(4"2114 22122 301131103|f;)00004 26"23#11 6#5!04 3/1220024#2 4!22022333222 212~1|/n-f-[+E%< t1//;'bdazwe}weKC8G?7F>6IA8F>5E<4A70;3)9/'0!:*8+8*9););*?-B-A+D0!J6(L6*G5&G5&I6'I7)F1#H4$H7(K8+F3#z]CsP^crSuU|]}\|\_xW}`iS?K9,M<-J9*L:,L9+L:,L9,J9,I7*E6)I7,[G8uZv\rYqWnXEI:.PA5G7,H7-F7,F7,G:-F7,YG9oXoVlVnWmZGE6,H:-D5+H7-vbQjSYE8J;4I;1E7-qj_zvh{wixtgvrdtpdvqdvsdZYWLA:>0'9.+- 1#+%0Q:0K6)D/"B509:F)&-ljf8(3++1)'mljHFB2)'(E:1TB6ZF9TC8)IDCwwu41.)"##%6,(*##-')$R@7[D7\D9XA5iSBeM=bK:aJ9gN=gP?dM=gOAcJ:eL=X@2YC2aJ;U>/ZE5V>.bI;iRBoXHiOB\F:Y[Z2>4:F:PYKhjYgiWVYIQWJPXJKVIAN@>K>BNB^eSnt_HQ>CQEGTGESE?NABQCFSHLWINYKFQFFQFAN@HVGN[L?RBFVHDUEF[IBXGF\JDXHCVFCUE@RB:L>>L?8D8,5+0<01@29G96B68F9AM?GSEEQCFTFDVF?UD;UD=WF?VF:M?SDE\N?VJ;VJA\OYSTTA82&tg2yi2OAO@H<=3VJ7maZeXMqfZ}nzkzm|m{lzjuoac\Tc\Tc]Rh`Tg`ThbVhaYhaYjbZjcYjdYkcYldZle[ldZkcYkcYkdYkc[nh\miXnjWmhWmd[oj`pi_pi`qj`pi_pi_qj`qk_rk^sl_tm`tmauoevobyrf~yi|lzl{l{k{l{l~o}zh|I;?3D8XJsx\M8*2$6'7(=0bTwuwO=-L@1dyd{zVyxUYfo8\ZYFA7>:/F@:0,"*(20!74'//#63(;7-,&B@3*,+032"?<0LF=HA8HC:IC;4,:4/:5/60)>93C=881*D?8NHC51'A;2KF<50#)$=;*99*%#D@5_[RTOG>91<90 *+)&EA8HA7NH?OIAGE6EB5GC9[YPQNEFC:DA:GD;CA8hUQ.14 12010/111124!4"4 8$4 4 49&4224113141001111013I5YE=,/0104#7&6#6!3144$8$034142222220.3 222222222232232x.m-b+P'< Q&{+09'gifuq`{ubJA4H>7G?7E=5F>5C92@6/<3)9/'-!6(6(6(5';*A/ B-B.E2#D0!F1#E0!H7'D1#G5'G5'J5'J6)J6(H5(F3"{\AgFvUxYuWzZwXz[}]|\|\^nSJ8*K9,K:,L9+K7*NAF`AIe8A[3:W=4:6(1+)?;9kheA/%C1&J7'E2(9,'<50B95C;3~yaa\A87QKJQB;TA7I7.M:/E2&B@;-#$D60L;,S@4+ jig[ZY,%#%&zCA;#%+ .E5,A3*C4/?.(9)"G5,XC6ZH:ZE8ZE8^I<^H<]H;fPChQDbL=iQDkSFgQCfOBiTHjTHjREkTGdOAq[LfP@cLZ[Z[aRZ_NTXFJL:hiW~m\bQYaRZaQgo\em\io]NWDGRCXdWEQE@LA;J=AOBDQEGRHPYMDPDHUHHUHITFJWHCRD>TD?RD@SCDSEK[JHZIHXHDTEBRCCRD;H;3<07<35:19A89A96?6O@ESFDRDCK?CNBKUJJUHLZLMYKT^PU`QO\NLYLM[LR^OQ^NP^OG[KIYKM]NI\KJ\KK[LK\LIXI@SD8QD8PABTER^PNZL@QCGXIAUHE^SROLI;^^S6' =/:06+L<%D4*tg_vi~xk|vh~vj~wkxjyj}vhyrenh^ld\lf\mf\nf\og]oh]nf]oi^qj`qk`qj`rk`slbsmbqk`qj^rk`sm^rsC|=z=y@xvUumevocvmbtmauoduocuoduoduodupduocwqdxreyueyue}vhyjzjzlzk{m{l{lyue}lxiteptrnw7$>.."_Nyhrrsxb>,SJ5SK+3.ojJyuYjVS,hgB|]UU'\a0ZYXFB8;6,@<2?:2)((*" /,51#95)%"%&&*')*+20!=9-RMCRMENHC?:0(%61+.)#$":4)k_UaXPbZNaXL^VK`WLZPG[QJ^TJ]RIYND[OF[PFPG=EB:F@:>91>70@<3E@:E=5B<361)<6/?91F?5D=4C=5E?:D?7?:2?;5HD7/LGA93,*% ..%!1."AA4@=0EC7?F,:=)IC2F5,yhW~lT}jTyfO|hQhUDD3)E7,B3(L;0~kV~kUTB5H90G9/G9.pgZzuhxtfupcrl_rj^vqdXUT!":2.6)%?0(2!?/#bWJ]PFK:0O>1F4'C4*2'"<6959NDPn=Jj=Io?If4052($3.-onlSD;U@2RA5N=/N=2@5/>95JD@e_WmmhKHIH@=]I=O=1YG:[H=UH<-)&/&%C2+L6+XH;}vb`_-&#(. /$ !**!/.$/+%( (.$#&=0+:)!`L@^I9YC3aK;^H:ZC7]I>YE:ZF9ZF;aLA]H<\G;bNB_L=ZE8_IO?FTF?I7:D:9F9BKAFLBAH=?F;9@8DKBCKB>G=7>47;131)>:4<>5?D;?E;DMB5I;.A3=M?>L?6F:4H:@TFEVGJSFLTINVKPZLQ[NJVJDUG8PA:UE8UE9GB;C>8YUNXTJLH>QKCNIA;5/(#)$/,74&13")%*%0*'#82&@;1E@8MG@50)#)"(#"+'42'01")*(+;>-[XO[ZO_`T]^SXWK][OYYNiUR-///021001111125%4 6!1 418&111313301111"11111229&G8:)/2203!113#04!6"5"6"13 002 0/2325"|/.3/0222/022v2"4$23221/q/d-U*A%A w/:'efcwp`wpaJB6HA8F>6F=5E=4C;2?5.<3*7,$,,"-!5'6(9*=-A-B0"C1#D1!E1$G4&F3%D1#F3%F4&F4'G4&E2%E3%I5#tVuSsTsUuVtVrSwSvVuVxWxXzZqZDK9,M<-I8*L:+J8,NXE9]NBi\RWG=$( 4*%LE@ijgph`fXMYG:fUG{_`X5-/*^QFrkcYZV)$#(/ E4,RA7K=5VF<]JAZE=_KC`LBcNBcMCdNBiQDgPA^H9bJ;dKmYJoWHwaSzaR{aRxaQfSE`L?fRGfPDqZNbPE\\YgiXno[DI8DJ<;D8]gYYbQbjZjr_iq\YaNOYHHTCQ^MWbUYbRQ\LX_OPXJU\NaiYMWHKXIGRE=K=?NA?N@ETF?M?>N?@N@EQCDPCFOBCM@GTE@K>DNAAJ@5@54>39C95A54@5;I;;G:@H=FNDDNBELC=E=DKDBJDHMFBC;<93>=5><6<94;93:;5EOFEQG=NC1B8?KCBOEHSIDQEEREKYKCSECQE?LBCPEARECSEFUGHVHIVGIUJCQGJTI@PCAPCGUGHUILYLCTE@REOCGWIXcXnnUpi,4#-$LD#OC)XJ(YG=Pzpk|re~ui}ui|vf}vhxj~vg{tfuodsl`uncuocuocwobuocwnevodwqevodwocxrdwobvpexoewodqnTgn)lt)v}2ku(sx8xu`yqixqexqbuuVz{SU|{Wwqawpdwqcwpawqdxqdypbytd{uf}vf~vf}vhxjzk|mzpa}m|m|m|n~o}oq{hAD*MO5G;() xgG?%LIRG&2^YBc`DqfPME/51UV-de8Z\(VZ+LM$Za1a``__WcbYhf^ZXQXUL_\SdaW_]T^\S^ZTUQIVRISNFROEZXNdaYli`ki^kj_jjaa`Xb`X`\UNKCGB6?<3BB7?=166':=.<=1TTJ_^Vec[gf]dd[jTQ,.010111111111 31134 13 6$4 03111 1005"1 13!5#6"1101;)PB:'135#13!22325$3"6$6#/1102/20208*y2"02222223224x-6$424 /11y/i-]+O(;V%9(efc{hzr`PE9F=6F>6G@6D;3B91@6.=3+5-$*0"4'4%3%5&;)?-A0#?-A.@-C1"F3%G4&F3%E2%F3&C1"E4&E2%O:'qUrSvWuVvXoPqQrRsStVuUtToPrWM7&I7+G5(I8*J8*J8*L:,N<-M<.L:.I8*t]xZx[sVsVlUI8,aPBQB0G:/F8,G:-G;.G<.P@2oWkS~iQ|iR|iSfTCA1'C4)C3)`N@|gQzeOTA1G80E7-F7,ocWxrdsn_unavo`tnbSPRUPME@@<2->0(H93,"+0"3$."D8/QC5O<0<(J8)Q>1F3$^L=R?2N>1/#+%%40.YOFkXL[M?fTIYF9XG=&1&$:40$ikczqka/)&/%%]VPy{w>=:3+(&)F5,eTEeRCmWKr^KvakYt\Jw_Ot]NjUFhRFkWJiUFiUGjVIp[LmYKq[KxbQpZLn[LlXKoZMoZLt_RkVJdOBcN@hSFlVHgRFmXKkVJXB4r[LoVFhP@fM?lUFnVIlUIfQFcMAWB8Y\[=F:6?58A:?J@V]NIQ>[aMOUBV^LZbRKVHBQBCRBCMALSF^dVS\NFQDCN@CQDAPE=MA:K>=L?:J=;L@=MB9I<9L<=N??M??L>BNAANA;H;?J?7@5>E;:C:>I?>K=;G;BNBBNB=G;BK@@H=HODDNBBJ?BIAFLB7=3FJC=@6<;4650;92?B9HLB?E=DNE?KABMBFODBMCCPECPDDQE:J@2D;5G?9I=EQECLB?J@?KA>LB4I<:MC9I=:KA?NBHTIBNBEQELYLHVIAPCL\MO^PIZMVcXif[2# _KBL=$E8IB;/H68;xMzpl|rf}th|vi|vf|vh|vj|vfztfunbtmbuoeuodyt\jj;ys_xqdxv[yu\xrczsgyrfxreysevncypdooFel'el)ls,hp'hm.yu_{skyxZzHACHzzOztbztfztdyteytewqdyqdzqdyte}vhxi~vgwhwixi}vg{m|m|m}no~norzr\iaF{q\;.5%?9zsVSA00 yuzpWDCYY/YY0TV-MO"UR,QT$S[)_^^_^Ua`WaaWaaW`_X^]V`_Va`W`_WaaXbaZbaZaaXcb[`_VcbYcaYcbYcbYbaYcbZcbYbbYecZ\XRZUNYTLPKC\XPUTLRLDSMCQLARMCMF=QJBPH>TMEVNG]YQjg^kj`ih_ddZlj`gg[ef[gf[gg[hf[ig^ii_ii_hh^gg]hg]gg]hh^ih^ii^ih^kkaklbkkbee]hh]hh`gf^gf_fg\gg]gf^gf]fe]gf^ee]fe^fd]ec\fd]ed]ee_ed\fe]fe]ccZde\ee]ff]dd\cd[_aY`bZbc\iTQ-///1210002456$7$7&3 04!4 111101101114 4 18%9&110128'NA8(/0113223!16#4%3#5$/0//2/02308&|5$/2000220223!/6#22 3 01/|0r.f.Z(K'9 +h<,cca~xf{hSJ5E<4C92B81@5.:1(7-%*/"0#0$3%3$6(;+;)>-B0 B0!C0!C1"B0!C1#D1#D1"E2$C0#F3%\D0pQjMrToPsTtUsUsUrRrTsUsUlNiIjQ8I7*I7*F3'C2&G6(H6(J7)J8*J7*H5'pXsUrVnQnRqUT@0J9.raNC4'E6,F7,F7,F7,F5+vbO}hO|hP|hQ{fP~jVI7)A1'B3(N>2|iUycMmWDE2)E6,D4+PA6|sdwo`ul\rk\vrcVTT:-)XTQ.))-% 7.&WMElcb*!"0"2"C3)=/$=.#F4)C0$F3(F3(K9,7#K8-NO?6R?5UC8TD6ZI?, *!-'')"!1+(GG=~p;6.9.1(RPF:61-%$/%$!$N=5dRChXK`M@gTGeSCfPCr`QmZJpYKr[MvbSkWHkWFmYKjVGmYKs`OvaRxaQ}gVoXKt]Oq\MkUHlVJhRFoWJqZKu`QxfWhTHp\Op[O|fZycVwcSfRBlWJiTHu]N~fVlUIaK?xaU[GI;FRCZeWs{ilp]lq]Z`NV^NLUEGQAGSE=L>;K@9H<@L@JUKLXL7F9?MBFUH:F:?H;9I<4H=2C6:G:;D9=F;;F:;H;9I=:I;AMA?I=>I<@I@>G=@LA>I=;G<@L@DPDBNB:G;@I@BKA@I@>H=AI>BJ?LA>KAANCAMD7F:COCGPD@J>BPB?M@=L?:K>;M@5F;/A5(:/D0%=0#qfOL$KI#=>6795nxpmH_]^^]Va`W`_V`_W`_Xa`W`_VbaZbbZbbZbaZa`Wa_W_^UefZccYcaY^_Va`WcbYcbYcbZeeZdcYebZdbZdc[dc[ee\dc[fc[fg\ee[gg_fg\hg]fd[dd\dc]dc[dc[bbZdc[b`Yhd]d`YdcYgcYdcYhe\ecZfc[ec[ccZec[eaYec[ebZebYcbYdaYdaY`aXcb[baZ^^UcbYcbYbaYcbZcc\baYcbYec\cbYcb[dc\cb[caYcbYdc\cc[ec^ec\cbZcc[aaZ[[SaaY_aZ`aY`aY^^X_^VjTR--/01/00106"34 6"4 |1 5!35!//3"1/11/000/2019&:&6#3 1-18&I;>/0011031245#3$6%3$/////040222222022000/22}14"22 2 200t0l0f,_-Q'A#E.!egcokYxn^\SED7/D;4A80E=4>4+;1)9/'4+"'*,,-,1"7&9(<+>,A-D1"C0!B0!?+>*B0!@-A/!?+aI5nQrS~dFrUkOjLjLsRpNuVoPsSkLjLpVQ:+I7+F3'D2'G6(L:+J7(E3&G4&VC0tXnQtXlQiNkOiVBC1%xfR_M>E6-C5*E6+C3'A2'[K;sXjQ|gOzeOxfNn\H@0%?1&?0%zeRt^HxaLT@5B2,A2)A2'maRypbti[_TJslaXWUM@9A<9*$!&=5/LB;RKE_[WbTOM;2QC6O>2I7,B/#B/#N=.J9*J;/`KCTA7dSEP?36+%&-'&RVKm`XP?2SC9G4+K=2K<1=1,?66-)'pjgǵAF33+.%+"#$  N=5\J>R?5ZG9XF:aMBt`QkUHZD7cPAfREs]OkVG{gTvcOkWF|gVs]IhSDkWGr]Lt]OiSDqYJ|cQkXoYI}eSpZJpXJt^NlVIu]QvbUiTGuaRr\MwaSs^N}fVu_RlVKhVHueWlXIlXK^LCac_}jmqXJPISD=J<8HH;>N?9K?=K=>F:;C96D96F8:C8;F9@H<;B89@4?D:AH>G9K?1B73A6?H?CJAAJ>9C7=E:=D8?H>AH?AG?@I>=F;?NBCTH=QDI_OeaaYF6XH(A>I<xm;;>9Abc6b_*lo"zs`{rg|vg|vexivk|vf|vfztfuodwod{v[ed"A= [\$v7{?x~E}vj|vk|vi~xk~b}Duz>qw7z~5/XN9H;)4!,XJ:kZ73-* +++ +# - zg~t_ \ No newline at end of file diff --git a/src/cups/canon.c b/src/cups/canon.c new file mode 100644 index 0000000..158af1d --- /dev/null +++ b/src/cups/canon.c @@ -0,0 +1,679 @@ +/* + * CANON backend for the Common UNIX Printing System. + * + * + * Contents: + * + * main() - Send a file to the specified parallel port. + * list_devices() - List all parallel devices. + */ + +/* + * Include necessary headers. + */ + +#include +#include +#include +#include +#include + +#if defined(WIN32) || defined(__EMX__) +# include +#else +# include +# include +# include +#endif /* WIN32 || __EMX__ */ + +#if defined(WIN32) || defined(__EMX__) +# include +#else +# include +# include +# include +# include +#endif /* WIN32 || __EMX__ */ + +#ifdef __sgi +# include +# ifndef INV_EPP_ECP_PLP +# define INV_EPP_ECP_PLP 6 /* From 6.3/6.4/6.5 sys/invent.h */ +# define INV_ASO_SERIAL 14 /* serial portion of SGI ASO board */ +# define INV_IOC3_DMA 16 /* DMA mode IOC3 serial */ +# define INV_IOC3_PIO 17 /* PIO mode IOC3 serial */ +# define INV_ISA_DMA 19 /* DMA mode ISA serial -- O2 */ +# endif /* !INV_EPP_ECP_PLP */ +#endif /* __sgi */ + + +/* + * Local functions... + */ + +void list_devices(void); + + +/* + * 'main()' - Send a file to the specified parallel port. + * + * Usage: + * + * printer-uri job-id user title copies options [file] + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments (6 or 7) */ + char *argv[]) /* I - Command-line arguments */ +{ + char method[1024], /* Method in URI */ + hostname[1024], /* Hostname */ + username[1024], /* Username info (not used) */ + resource[1024], /* Resource info (device and options) */ + *options; /* Pointer to options */ + int port; /* Port number (not used) */ + FILE *fp; /* Print file */ + int copies; /* Number of copies to print */ + int fd, /* Parallel/USB device or socket */ + error, /* Last error */ + backchannel; /* Read backchannel data? */ + struct sockaddr_in addr; /* Socket address */ + struct hostent *hostaddr; /* Host address */ + int wbytes; /* Number of bytes written */ + int nbytes, /* Number of bytes read */ + tbytes; /* Total number of bytes written */ + char buffer[8192], /* Output buffer */ + *bufptr; /* Pointer into buffer */ + struct timeval timeout; /* Timeout for select() */ + fd_set input; /* Input set for select() */ + struct termios opts; /* Parallel port options */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + if (argc == 1) + { + list_devices(); + return (0); + } + else if (argc < 6 || argc > 7) + { + fputs("Usage: canon job-id user title copies options [file]\n", stderr); + return (1); + } + + /* + * If we have 7 arguments, print the file named on the command-line. + * Otherwise, send stdin instead... + */ + + if (argc == 6) + { + fp = stdin; + copies = 1; + } + else + { + /* + * Try to open the print file... + */ + + if ((fp = fopen(argv[6], "rb")) == NULL) + { + perror("ERROR: unable to open print file"); + return (1); + } + + copies = atoi(argv[4]); + } + + /* + * Extract the device name and options from the URI... + */ + + httpSeparate(argv[0], method, username, hostname, &port, resource); + + /* + * See if there are any options... + */ + + if ((options = strchr(resource, '?')) != NULL) + { + /* + * Yup, terminate the device name string and move to the first + * character of the options... + */ + + *options++ = '\0'; + } + + if (hostname[0]) + { + /* + * Lookup the IP address... + */ + + if ((hostaddr = gethostbyname(hostname)) == NULL) + { + fprintf(stderr, "ERROR: Unable to locate printer \'%s\' - %s", + hostname, strerror(errno)); + return (1); + } + + if (port == 0) + port = 9100; /* Default for CANON NIC */ + + fprintf(stderr, "INFO: Attempting to connect to printer %s on port %d\n", + hostname, port); + + memset(&addr, 0, sizeof(addr)); + memcpy(&(addr.sin_addr), hostaddr->h_addr, hostaddr->h_length); + addr.sin_family = hostaddr->h_addrtype; + addr.sin_port = htons(port); + + /* + * Try to connect... + */ + + for (;;) + { + if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + perror("ERROR: Unable to create socket"); + return (1); + } + + if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) + { + error = errno; + close(fd); + fd = -1; + + if (error == ECONNREFUSED) + { + fprintf(stderr, "INFO: Network printer \'%s\' is busy; will retry in 30 seconds...\n", + hostname); + sleep(30); + } + else + { + perror("ERROR: Unable to connect to printer"); + sleep(30); + } + } + else + break; + } + + fputs("INFO: Connected to printer, sending print job...\n", stderr); + } + else + { + /* + * Open the parallel or USB port device... + */ + + do + { + if ((fd = open(resource, O_RDWR | O_EXCL)) == -1) + { + if (errno == EBUSY) + { + fputs("INFO: Parallel port busy; will retry in 30 seconds...\n", stderr); + sleep(30); + } + else + { + perror("ERROR: Unable to open parallel port device file"); + return (1); + } + } + } + while (fd < 0); + + /* + * Set any options provided... + */ + + tcgetattr(fd, &opts); + + opts.c_cflag |= CREAD; /* Enable reading */ + opts.c_lflag &= ~(ICANON | ECHO | ISIG); /* Raw mode */ + + /**** No options supported yet ****/ + + tcsetattr(fd, TCSANOW, &opts); + } + + /* + * Now that we are "connected" to the port, ignore SIGTERM so that we + * can finish out any page data the driver sends (e.g. to eject the + * current page... + */ + +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGTERM, SIG_IGN); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = SIG_IGN; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGTERM, SIG_IGN); +#endif /* HAVE_SIGSET */ + + /* + * Finally, send the print file... + */ + + backchannel = 1; + + while (copies > 0) + { + copies --; + + if (fp != stdin) + { + fputs("PAGE: 1 1\n", stderr); + rewind(fp); + } + + tbytes = 0; + while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0) + { + /* + * Write the print data to the printer... + */ + + tbytes += nbytes; + bufptr = buffer; + + while (nbytes > 0) + { + if ((wbytes = write(fd, bufptr, nbytes)) < 0) + { + perror("ERROR: Unable to send print file to printer"); + break; + } + + nbytes -= wbytes; + bufptr += wbytes; + } + + if (nbytes > 0) + break; + + /* + * Check for possible data coming back from the printer... + */ + + if (!backchannel) + continue; + + timeout.tv_sec = 0; + timeout.tv_usec = 0; + FD_ZERO(&input); + FD_SET(fd, &input); + if (select(fd + 1, &input, NULL, NULL, &timeout) > 0) + { + /* + * Grab the data coming back and spit it out to stderr... + */ + + if ((nbytes = read(fd, buffer, sizeof(buffer) - 1)) < 0) + { + fprintf(stderr, "ERROR: Back-channel read error - %s!\n", + strerror(errno)); + backchannel = 0; + continue; + } + + buffer[nbytes] = '\0'; + if (strncmp(buffer, "@BDC ", 5) != 0) + fprintf(stderr, "WARNING: Received %d bytes of unknown back-channel data!\n", + nbytes); + else + { + /* + * Skip initial report line... + */ + + for (bufptr = buffer; *bufptr && *bufptr != '\n'; bufptr ++); + + if (*bufptr == '\n') + bufptr ++; + + /* + * Get status data... + */ + + strcpy(buffer, bufptr); + for (bufptr = buffer; *bufptr && *bufptr != ';'; bufptr ++); + *bufptr = '\0'; + + if (strncmp(buffer, "IQ:", 3) == 0) + { + /* + * Report ink level... + */ + + int i; + int levels[6]; + + buffer[12] = '\0'; /* Limit to 6 inks */ + for (i = 0, bufptr = buffer; i < 6; i ++, bufptr += 2) + { + if (isalpha(bufptr[0])) + levels[i] = (tolower(bufptr[0]) - 'a' + 10) << 16; + else + levels[i] = (bufptr[0] - '0') << 16; + + if (isalpha(bufptr[1])) + levels[i] |= tolower(bufptr[1]) - 'a' + 10; + else + levels[i] |= bufptr[1] - '0'; + } + + switch (i) + { + case 1 : + case 2 : + fprintf(stderr, "K=%d\n", levels[0]); + break; + case 3 : + fprintf(stderr, "C=%d M=%d Y=%d\n", levels[0], levels[1], + levels[2]); + break; + case 4 : + case 5 : + fprintf(stderr, "K=%d C=%d M=%d Y=%d\n", levels[0], + levels[1], levels[2], levels[3]); + break; + case 6 : + fprintf(stderr, "K=%d C=%d M=%d Y=%d LC=%d LM=%d\n", + levels[0], levels[1], levels[2], levels[3], + levels[4], levels[5]); + break; + } + } + else + fprintf(stderr, "INFO: %s\n", buffer); + } + } + else if (argc > 6) + fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes); + } + } + + /* + * Close the socket connection or parallel/USB device and input file and + * return... + */ + + close(fd); + if (fp != stdin) + fclose(fp); + + return (0); +} + + +/* + * 'list_devices()' - List all parallel devices. + */ + +void +list_devices(void) +{ +#ifdef __linux + int i; /* Looping var */ + int fd; /* File descriptor */ + char device[255]; /* Device filename */ + FILE *probe; /* /proc/parport/n/autoprobe file */ + char line[1024], /* Line from file */ + *delim, /* Delimiter in file */ + make[IPP_MAX_NAME], /* Make from file */ + model[IPP_MAX_NAME]; /* Model from file */ + + + /* + * Probe for parallel devices... + */ + + for (i = 0; i < 4; i ++) + { + sprintf(device, "/proc/parport/%d/autoprobe", i); + if ((probe = fopen(device, "r")) != NULL) + { + memset(make, 0, sizeof(make)); + memset(model, 0, sizeof(model)); + strcpy(model, "CANON"); + + while (fgets(line, sizeof(line), probe) != NULL) + { + /* + * Strip trailing ; and/or newline. + */ + + if ((delim = strrchr(line, ';')) != NULL) + *delim = '\0'; + else if ((delim = strrchr(line, '\n')) != NULL) + *delim = '\0'; + + /* + * Look for MODEL and MANUFACTURER lines... + */ + + if (strncmp(line, "MODEL:", 6) == 0 && + strncmp(line, "MODEL:CANON", 13) != 0) + strncpy(model, line + 6, sizeof(model) - 1); + else if (strncmp(line, "MANUFACTURER:", 13) == 0 && + strncmp(line, "MANUFACTURER:CANON", 20) != 0) + strncpy(make, line + 13, sizeof(make) - 1); + } + + fclose(probe); + + if (strcmp(make, "CANON") == 0) + printf("direct canon:/dev/lp%d \"%s %s\" \"Parallel Port #%d\"\n", + i, make, model, i + 1); + } + else + { + sprintf(device, "/dev/lp%d", i); + if ((fd = open(device, O_RDWR)) >= 0) + { + close(fd); + printf("direct canon:%s \"CANON\" \"Parallel Port #%d\"\n", device, i + 1); + } + } + } + + /* + * Probe for USB devices... + */ + + if ((probe = fopen("/proc/bus/usb/devices", "r")) != NULL) + { + i = 0; + + memset(make, 0, sizeof(make)); + memset(model, 0, sizeof(model)); + + while (fgets(line, sizeof(line), probe) != NULL) + { + /* + * Strip trailing newline. + */ + + if ((delim = strrchr(line, '\n')) != NULL) + *delim = '\0'; + + /* + * See if it is a printer device ("P: ...") + */ + + if (strncmp(line, "S:", 2) == 0) + { + /* + * String attribute... + */ + + if (strncmp(line, "S: Manufacturer=", 17) == 0) + { + strncpy(make, line + 17, sizeof(make) - 1); + if (strcmp(make, "Hewlett-Packard") == 0) + strcpy(make, "HP"); + } + else if (strncmp(line, "S: Product=", 12) == 0) + strncpy(model, line + 12, sizeof(model) - 1); + } + else if (strncmp(line, "I:", 2) == 0 && + strstr(line, "Driver=printer") != NULL && + make[0] && model[0]) + { + /* + * We were processing a printer device; send the info out... + */ + + if (strcmp(make, "CANON") == 0) + { + sprintf(device, "/dev/usb/lp%d", i); + if (access(device, 0)) + { + sprintf(device, "/dev/usb/usblp%d", i); + + if (access(device, 0)) + sprintf(device, "/dev/usblp%d", i); + } + + printf("direct canon:%s \"%s %s\" \"USB Printer #%d\"\n", + device, make, model, i + 1); + } + + i ++; + + memset(make, 0, sizeof(make)); + memset(model, 0, sizeof(model)); + } + } + + fclose(probe); + } + else + { + for (i = 0; i < 8; i ++) + { + sprintf(device, "/dev/usb/lp%d", i); + if ((fd = open(device, O_RDWR)) >= 0) + { + close(fd); + printf("direct canon:%s \"CANON\" \"USB Printer #%d\"\n", device, i + 1); + } + + sprintf(device, "/dev/usb/usblp%d", i); + if ((fd = open(device, O_RDWR)) >= 0) + { + close(fd); + printf("direct canon:%s \"CANON\" \"USB Printer #%d\"\n", device, i + 1); + } + + sprintf(device, "/dev/usblp%d", i); + if ((fd = open(device, O_RDWR)) >= 0) + { + close(fd); + printf("direct canon:%s \"CANON\" \"USB Printer #%d\"\n", device, i + 1); + } + } + } +#elif defined(__sgi) + int i, j, n; /* Looping vars */ + char device[255]; /* Device filename */ + inventory_t *inv; /* Hardware inventory info */ + + + /* + * IRIX maintains a hardware inventory of most devices... + */ + + setinvent(); + + while ((inv = getinvent()) != NULL) + { + if (inv->inv_class == INV_PARALLEL && inv->inv_type == INV_EPP_ECP_PLP) + { + /* + * Standard parallel port... + */ + + puts("direct canon:/dev/plpbi \"CANON\" \"Onboard Parallel Port\""); + } + } + + endinvent(); +#elif defined(__sun) + int i, j, n; /* Looping vars */ + char device[255]; /* Device filename */ + + + /* + * Standard parallel ports... + */ + + for (i = 0; i < 10; i ++) + { + sprintf(device, "/dev/ecpp%d", i); + if (access(device, 0) == 0) + printf("direct canon:%s \"CANON\" \"Sun IEEE-1284 Parallel Port #%d\"\n", + device, i + 1); + } + + for (i = 0; i < 3; i ++) + { + sprintf(device, "/dev/lp%d", i); + + if (access(device, 0) == 0) + printf("direct canon:%s \"CANON\" \"PC Parallel Port #%d\"\n", + device, i + 1); + } +#elif defined(FreeBSD) || defined(OpenBSD) || defined(NetBSD) + int i; /* Looping var */ + int fd; /* File descriptor */ + char device[255]; /* Device filename */ + + + /* + * Probe for parallel devices... + */ + + for (i = 0; i < 3; i ++) + { + sprintf(device, "/dev/lpt%d", i); + if ((fd = open(device, O_RDWR)) >= 0) + { + close(fd); + printf("direct canon:%s \"CANON\" \"Parallel Port #%d\"\n", device, i + 1); + } + } + + /* + * Probe for USB devices... + */ + + for (i = 0; i < 3; i ++) + { + sprintf(device, "/dev/ulpt%d", i); + if ((fd = open(device, O_RDWR)) >= 0) + { + close(fd); + printf("direct canon:%s \"CANON\" \"USB Port #%d\"\n", device, i + 1); + } + } +#endif +} + + +/* + */ diff --git a/src/cups/command.txt b/src/cups/command.txt new file mode 100644 index 0000000..ac9c3e9 --- /dev/null +++ b/src/cups/command.txt @@ -0,0 +1,76 @@ +command.txt - 09/10/2000 - CUPS Drivers +--------------------------------------- + +This file describes the experimental CUPS command file format, +used to send printer commands to a printer in a device- +independent way. + + +FILE FORMAT INFORMATION + +CUPS command files are ASCII text files. The first line of a +CUPS command file MUST contain: + + #CUPS-COMMAND + +After that, each line is either a command or a comment. +Comments begin with the # character, e.g.: + + # This is a comment + +The printer commands are described below. Printer commands are +case- insensitive, so "PRINTSELFTESTPAGE", "printselftestpage", +and "PrintSelfTestPage" are equivalent. Commands that accept +arguments have their arguments on the same line separated by +spaces. + + +PRINTER COMMANDS + +The following commands are currently recognized: + + Clean all + Clean black + Clean color + Clean cyan + Clean light-cyan + Clean light-magenta + Clean magenta + Clean yellow + + Do a standard print head cleaning. If a printer does + not support cleaning of individual colors or cartridges, + then all print heads are cleaned. + + PrintAlignmentPage phase + + Print an alignment page on the printer. Typically this + page shows the horizontal and vertical alignment of the + print heads with numbers for each. The phase number can + be omitted. + + PrintSelfTestPage + + Print a self-test page on the printer. Typically this + page shows if all jets on a print head are functioning + properly. + + ReportLevels + + Reports the levels of each marking color in the + printer-state-message attribute. The format of the + report string is one of: + + K=### + C=### M=### Y=### + K=### C=### M=### Y=### + K=### C=### M=### Y=### LC=### LM=### + + depending on the marking colors available. + + SetAlignment phase x y + + Sets the alignment of the print heads in the X and Y + directions. The phase number must match that specified + by the PrintAlignmentPage command or be 0. The Y + direction is not used by some printers. diff --git a/src/cups/command.types b/src/cups/command.types new file mode 100644 index 0000000..5b33d45 --- /dev/null +++ b/src/cups/command.types @@ -0,0 +1,36 @@ +# +# "$Id: command.types,v 1.1 2001/01/22 20:22:54 rleigh Exp $" +# +# MIME types file for the CUPS drivers. +# +# Copyright 1993-2000 by Easy Software Products. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License, +# version 2, as published by the Free Software Foundation. +# +# 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, please contact Easy Software +# Products at: +# +# Attn: CUPS Licensing Information +# Easy Software Products +# 44141 Airport View Drive, Suite 204 +# Hollywood, Maryland 20636-3111 USA +# +# Voice: (301) 373-9603 +# EMail: cups-info@cups.org +# WWW: http://www.cups.org +# + +# Define the new application/vnd.cups-command filetype... +application/vnd.cups-command string(0,'#CUPS-COMMAND') + +# +# End of "$Id: command.types,v 1.1 2001/01/22 20:22:54 rleigh Exp $". +# diff --git a/src/cups/commands/CleanAll.cmd b/src/cups/commands/CleanAll.cmd new file mode 100644 index 0000000..ceb52f8 --- /dev/null +++ b/src/cups/commands/CleanAll.cmd @@ -0,0 +1,6 @@ +#CUPS-COMMAND +# +# This file cleans all print heads. +# + +Clean all diff --git a/src/cups/commands/PrintAligmentPage.cmd b/src/cups/commands/PrintAligmentPage.cmd new file mode 100644 index 0000000..218f0b5 --- /dev/null +++ b/src/cups/commands/PrintAligmentPage.cmd @@ -0,0 +1,6 @@ +#CUPS-COMMAND +# +# This file prints the primary alignment page. +# + +PrintAlignmentPage 0 diff --git a/src/cups/commands/PrintSelfTestPage.cmd b/src/cups/commands/PrintSelfTestPage.cmd new file mode 100644 index 0000000..8a557a1 --- /dev/null +++ b/src/cups/commands/PrintSelfTestPage.cmd @@ -0,0 +1,6 @@ +#CUPS-COMMAND +# +# This file prints the printer self-test page. +# + +PrintSelfTestPage diff --git a/src/cups/commands/ReportLevels.cmd b/src/cups/commands/ReportLevels.cmd new file mode 100644 index 0000000..5d740cb --- /dev/null +++ b/src/cups/commands/ReportLevels.cmd @@ -0,0 +1,6 @@ +#CUPS-COMMAND +# +# This file tells the printer to report the ink/toner levels. +# + +ReportLevels diff --git a/src/cups/commands/SetAlignment.cmd b/src/cups/commands/SetAlignment.cmd new file mode 100644 index 0000000..943a3f0 --- /dev/null +++ b/src/cups/commands/SetAlignment.cmd @@ -0,0 +1,7 @@ +#CUPS-COMMAND +# +# This file sets the print head alignment. Adjust the parameters accordingly. +# + +SetAlignment 0 8 0 + diff --git a/src/cups/commandtocanon.c b/src/cups/commandtocanon.c new file mode 100644 index 0000000..db5bc92 --- /dev/null +++ b/src/cups/commandtocanon.c @@ -0,0 +1,196 @@ +/* + * CANON BJ command filter for the Common UNIX Printing System. + * + * + * Contents: + * + * main() - Main entry and command processing. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include + + +/* + * Macros... + */ + +#define pwrite(s,n) fwrite((s), 1, (n), stdout) + + +/* + * 'main()' - Main entry and processing of driver. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + FILE *fp; /* Command file */ + char line[1024], /* Line from file */ + *lineptr; /* Pointer into line */ + int feedpage; /* Feed the page */ + + + /* + * Check for valid arguments... + */ + + if (argc < 6 || argc > 7) + { + /* + * We don't have the correct number of arguments; write an error message + * and return. + */ + + fputs("ERROR: commandtocanon job-id user title copies options [file]\n", stderr); + return (1); + } + + /* + * Open the command file as needed... + */ + + if (argc == 7) + { + if ((fp = fopen(argv[6], "r")) == NULL) + { + perror("ERROR: Unable to open command file - "); + return (1); + } + } + else + fp = stdin; + + /* + * Reset the printer and initiate BJL mode + */ + + pwrite("\x1b\x5b\x4b\x02\x00\x00\x1f" "BJLSTART\x0a", 16); + feedpage = 0; + + /* + * Read the commands from the file and send the appropriate commands... + */ + + while (fgets(line, sizeof(line), fp) != NULL) + { + /* + * Drop trailing newline... + */ + + lineptr = line + strlen(line) - 1; + if (*lineptr == '\n') + *lineptr = '\0'; + + /* + * Skip leading whitespace... + */ + + for (lineptr = line; isspace(*lineptr); lineptr ++); + + /* + * Skip comments and blank lines... + */ + + if (*lineptr == '#' || !*lineptr) + continue; + + /* + * Parse the command... + */ + + if (strncasecmp(lineptr, "Clean", 5) == 0) + { + /* + * Clean heads... + */ + + char *what; + + for (what = lineptr + 6; isspace(*what); what ++); + + if (*what == 0) pwrite("@Cleaning=1ALL\x0a", 15); + if (!strncasecmp(what,"all",3)) pwrite("@Cleaning=1ALL\x0a", 15); + if (!strncasecmp(what,"black",5)) pwrite("@Cleaning=1K\x0a", 13); + + } + else if (strncasecmp(lineptr, "PrintAlignmentPage", 18) == 0) + { + /* + * Print alignment page... + */ + + int phase; + + phase = atoi(lineptr + 18); + + if (phase==0) pwrite("@TestPrint=Auto\x0a", 16); + if (phase==1) pwrite("@TestPrint=Manual1\x0a", 19); + if (phase==2) pwrite("@TestPrint=Manual2\x0a", 19); + + feedpage = 0; + } + else if (strncasecmp(lineptr, "PrintSelfTestPage", 17) == 0) + { + /* + * Print version info and nozzle check... + */ + + pwrite("@TestPrint=NozzleCheck\x0a", 23); + + feedpage = 0; + } + else if (strncasecmp(lineptr, "ReportLevels", 12) == 0) + { + /* + * Report ink levels... + */ + + } + else if (strncasecmp(lineptr, "SetAlignment", 12) == 0) + { + /* + * Set head alignment... + */ + + } + else + fprintf(stderr, "ERROR: Invalid printer command \"%s\"!\n", lineptr); + } + + /* + * Exit remote mode... + */ + + pwrite("BJLEND\x0a", 7); + + /* + * Eject the page as needed... + */ + + if (feedpage) + { + putchar(13); + putchar(10); + putchar(12); + } + + /* + * Close the command file and return... + */ + + if (fp != stdin) + fclose(fp); + + return (0); +} + + +/* + */ diff --git a/src/cups/commandtoepson.c b/src/cups/commandtoepson.c new file mode 100644 index 0000000..c63f51d --- /dev/null +++ b/src/cups/commandtoepson.c @@ -0,0 +1,241 @@ +/* + * "$Id: commandtoepson.c,v 1.2 2001/06/03 20:53:24 rlk Exp $" + * + * EPSON ESC/P2 command filter for the Common UNIX Printing System. + * + * Copyright 1993-2000 by Easy Software Products. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * 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, please contact Easy Software + * Products at: + * + * Attn: CUPS Licensing Information + * Easy Software Products + * 44141 Airport View Drive, Suite 204 + * Hollywood, Maryland 20636-3111 USA + * + * Voice: (301) 373-9603 + * EMail: cups-info@cups.org + * WWW: http://www.cups.org + * + * Contents: + * + * main() - Main entry and command processing. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include + +/* + * Macros... + */ + +#define pwrite(s,n) fwrite((s), 1, (n), stdout) + + +/* + * 'main()' - Main entry and processing of driver. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + FILE *fp; /* Command file */ + char line[1024], /* Line from file */ + *lineptr; /* Pointer into line */ + int feedpage; /* Feed the page */ + + + /* + * Check for valid arguments... + */ + + if (argc < 6 || argc > 7) + { + /* + * We don't have the correct number of arguments; write an error message + * and return. + */ + + fputs("ERROR: commandtoepson job-id user title copies options [file]\n", stderr); + return (1); + } + + /* + * Open the command file as needed... + */ + + if (argc == 7) + { + if ((fp = fopen(argv[6], "r")) == NULL) + { + perror("ERROR: Unable to open command file - "); + return (1); + } + } + else + fp = stdin; + + /* + * Reset the printer... + */ + + pwrite("\033@", 2); + + /* + * Enter remote mode... + */ + + pwrite("\033(R\010\000\000REMOTE1", 13); + feedpage = 0; + + /* + * Read the commands from the file and send the appropriate commands... + */ + + while (fgets(line, sizeof(line), fp) != NULL) + { + /* + * Drop trailing newline... + */ + + lineptr = line + strlen(line) - 1; + if (*lineptr == '\n') + *lineptr = '\0'; + + /* + * Skip leading whitespace... + */ + + for (lineptr = line; isspace(*lineptr); lineptr ++); + + /* + * Skip comments and blank lines... + */ + + if (*lineptr == '#' || !*lineptr) + continue; + + /* + * Parse the command... + */ + + if (strncasecmp(lineptr, "Clean", 5) == 0) + { + /* + * Clean heads... + */ + + pwrite("CH\002\000\000\000", 6); + } + else if (strncasecmp(lineptr, "PrintAlignmentPage", 18) == 0) + { + /* + * Print alignment page... + */ + + int phase; + + phase = atoi(lineptr + 18); + + pwrite("DT\003\000\000", 5); + putchar(phase & 255); + putchar(phase >> 8); + feedpage = 1; + } + else if (strncasecmp(lineptr, "PrintSelfTestPage", 17) == 0) + { + /* + * Print version info and nozzle check... + */ + + pwrite("VI\002\000\000\000", 6); + pwrite("NC\002\000\000\000", 6); + feedpage = 1; + } + else if (strncasecmp(lineptr, "ReportLevels", 12) == 0) + { + /* + * Report ink levels... + */ + + pwrite("IQ\001\000\001", 5); + } + else if (strncasecmp(lineptr, "SetAlignment", 12) == 0) + { + /* + * Set head alignment... + */ + + int phase, x; + + if (sscanf(lineptr + 12, "%d%d", &phase, &x) != 2) + { + fprintf(stderr, "ERROR: Invalid printer command \"%s\"!\n", lineptr); + continue; + } + + pwrite("DA\004\000", 4); + putchar(0); + putchar(phase); + putchar(0); + putchar(x); + pwrite("SV\000\000", 4); + } + else + fprintf(stderr, "ERROR: Invalid printer command \"%s\"!\n", lineptr); + } + + /* + * Exit remote mode... + */ + + pwrite("\033\000\000\000", 4); + + /* + * Eject the page as needed... + */ + + if (feedpage) + { + putchar(13); + putchar(10); + putchar(12); + } + + /* + * Reset the printer... + */ + + pwrite("\033@", 2); + + /* + * Close the command file and return... + */ + + if (fp != stdin) + fclose(fp); + + return (0); +} + + +/* + * End of "$Id: commandtoepson.c,v 1.2 2001/06/03 20:53:24 rlk Exp $". + */ diff --git a/src/cups/cups-calibrate.c b/src/cups/cups-calibrate.c new file mode 100644 index 0000000..bf0c089 --- /dev/null +++ b/src/cups/cups-calibrate.c @@ -0,0 +1,839 @@ +/* + * "$Id: cups-calibrate.c,v 1.2 2001/08/13 23:59:12 rlk Exp $" + * + * Super simple color calibration program for the Common UNIX + * Printing System. + * + * Copyright 1993-2000 by Easy Software Products. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * 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, please contact Easy Software + * Products at: + * + * Attn: CUPS Licensing Information + * Easy Software Products + * 44141 Airport View Drive, Suite 204 + * Hollywood, Maryland 20636-3111 USA + * + * Voice: (301) 373-9603 + * EMail: cups-info@cups.org + * WWW: http://www.cups.org + * + * Contents: + * + */ + +#include +#include +#include +#include +#include +#include +#include + +/* + * min/max/abs macros... + */ + +#ifndef max +# define max(a,b) ((a) > (b) ? (a) : (b)) +#endif /* !max */ +#ifndef min +# define min(a,b) ((a) < (b) ? (a) : (b)) +#endif /* !min */ +#ifndef abs +# define abs(a) ((a) < 0 ? -(a) : (a)) +#endif /* !abs */ + + +/* + * Prototypes... + */ + +float get_calibration(const char *prompt, float minval, float maxval); +char *safe_gets(const char *prompt, char *s, int size); +int safe_geti(const char *prompt, int defval); +void send_prolog(FILE *fp); +void send_pass1(FILE *fp); +void send_pass2(FILE *fp, float kd, float rd, float yellow); +void send_pass3(FILE *fp, float kd, float rd, float g, float yellow); +void send_pass4(FILE *fp, float red, float green, float blue, const char *p); + + +/* + * 'main()' - Main entry for calibration program. + */ + +int +main(int argc, + char *argv[]) +{ + char printer[255]; + char resolution[255]; + char mediatype[255]; + char *profile; + char cupsProfile[1024]; + char command[1024]; + char lpoptionscommand[1024]; + char line[255]; + char junk[255]; + FILE *fp; + float kd, rd, g; + float color; + float red, green, blue; + float cyan, magenta, yellow; + float m[3][3]; + + + puts("ESP Printer Calibration Tool v1.0"); + puts("Copyright 1999-2000 by Easy Software Products, All Rights Reserved."); + puts(""); + puts("This program allows you to calibrate the color output of printers"); + puts("using the GIMP-Print CUPS or ESP Print Pro drivers."); + puts(""); + puts("Please note that this program ONLY works with the GIMP-Print CUPS or"); + puts("ESP Print Pro drivers. If you are using the GIMP-Print stp driver of"); + puts("GhostScript or the drivers of the GIMP-Print plug-in of GIMP, this"); + puts("calibration will not work."); + puts(""); + puts("These drivers by the text \"CUPS+GIMP-print\" or \"ESP Print Pro\" in"); + puts("the model description displayed by the CUPS web interface, KUPS,"); + puts("the ESP Print Pro Printer Manager, or printerdrake."); + puts(""); + puts("If you are not using the correct driver, press CTRL+C now and"); + puts("reinstall your printer queue with the appropriate driver first."); + puts(""); + puts("To make a calibration profile for all users, run this program as"); + puts("the \"root\" user."); + puts(""); + puts(""); + + safe_gets("Printer name [default]?", printer, sizeof(printer)); + safe_gets("Resolution [default]?", resolution, sizeof(resolution)); + safe_gets("Media type [default]?", mediatype, sizeof(mediatype)); + + strcpy(command, "lp -s"); + if (printer[0]) + { + strcat(command, " -d "); + strcat(command, printer); + } + if (resolution[0]) + { + strcat(command, " -o resolution="); + strcat(command, resolution); + } + if (mediatype[0]) + { + strcat(command, " -o media="); + strcat(command, mediatype); + } + + strcat(command, " -o profile="); + + profile = command + strlen(command); + + strcpy(profile, "1000,1000,1000,0,0,0,1000,0,0,0,1000"); + + safe_gets("Press ENTER to print pass #1 or N to skip...", junk, sizeof(junk)); + + if (!junk[0]) + { + puts("Sending calibration pass #1 for density/saturation levels..."); + + fp = popen(command, "w"); + send_prolog(fp); + send_pass1(fp); + fputs("showpage\n", fp); + pclose(fp); + + puts("Calibration pass #1 sent."); + } + + puts(""); + puts("Please select the character that corresponds to the black block that"); + puts("is 100% saturated (dark) while not bleeding through the paper. If"); + puts("the saturation point appears to occur between two characters, enter"); + puts("both characters."); + puts(""); + + kd = get_calibration("Black density?", 0.25f, 1.0f); + + puts(""); + puts("Now select the character that corresponds to the yellow block that is"); + puts("100% saturated (dark) while not bleeding through the paper. If the"); + puts("saturation point appears to occur between two characters, enter both"); + puts("characters."); + puts(""); + + cyan = kd; + magenta = kd; + yellow = get_calibration("Yellow density?", 0.25f, 1.0f); + + puts(""); + puts("Now select the character that corresponds to the red block that is"); + puts("100% saturated (dark) while not bleeding through the paper. If the"); + puts("saturation point appears to occur between two characters, enter both"); + puts("characters."); + puts(""); + + rd = get_calibration("Red density?", 0.5f, 2.0f); + + puts(""); + puts("Thank you. Now insert the page back into the printer and press the"); + puts("ENTER key to print calibration pass #2."); + puts(""); + + safe_gets("Press ENTER to print pass #2 or N to skip...", junk, sizeof(junk)); + + if (!junk[0]) + { + puts("Sending calibration pass #2 for gamma levels..."); + + fp = popen(command, "w"); + send_prolog(fp); + send_pass2(fp, kd, rd, yellow); + fputs("showpage\n", fp); + pclose(fp); + + puts("Calibration pass #2 sent."); + } + + puts(""); + puts("Please select the character that corresponds to the column of gray"); + puts("blocks that appear to be 1/2 and 1/4 as dark as the black blocks,"); + puts("respectively. If the transition point appears to occur between two"); + puts("characters, enter both characters."); + puts(""); + + g = get_calibration("Gamma?", 1.0f, 4.0f); + + puts(""); + puts("Thank you. Now insert the page back into the printer and press the"); + puts("ENTER key to print calibration pass #3."); + puts(""); + + safe_gets("Press ENTER to print pass #3 or N to skip...", junk, sizeof(junk)); + + if (!junk[0]) + { + puts("Sending calibration pass #3 for red, green, and blue adjustment..."); + + fp = popen(command, "w"); + send_prolog(fp); + send_pass3(fp, kd, rd, g, yellow); + fputs("showpage\n", fp); + pclose(fp); + + puts("Calibration pass #3 sent."); + } + + puts(""); + puts("Please select the character that corresponds to the correct red,"); + puts("green, and blue colors. If the transition point appears to occur"); + puts("between two characters, enter both characters."); + puts(""); + + red = get_calibration("Red color?", 0.35f, -0.40f); + green = get_calibration("Green color?", 0.35f, -0.40f); + blue = get_calibration("Blue color?", 0.35f, -0.40f); + + color = 0.5f * rd / kd - kd; + + cyan /= kd; + magenta /= kd; + yellow /= kd; + + m[0][0] = cyan; /* C */ + m[0][1] = cyan * (color + blue); /* C + M (blue) */ + m[0][2] = cyan * (color - green); /* C + Y (green) */ + m[1][0] = magenta * (color - blue); /* M + C (blue) */ + m[1][1] = magenta; /* M */ + m[1][2] = magenta * (color + red); /* M + Y (red) */ + m[2][0] = yellow * (color + green); /* Y + C (green) */ + m[2][1] = yellow * (color - red); /* Y + M (red) */ + m[2][2] = yellow; /* Y */ + + if (m[0][1] > 0.0f) + { + m[1][0] -= m[0][1]; + m[0][1] = 0.0f; + } + else if (m[1][0] > 0.0f) + { + m[0][1] -= m[1][0]; + m[1][0] = 0.0f; + } + + if (m[0][2] > 0.0f) + { + m[2][0] -= m[0][2]; + m[0][2] = 0.0f; + } + else if (m[2][0] > 0.0f) + { + m[0][2] -= m[2][0]; + m[2][0] = 0.0f; + } + + if (m[1][2] > 0.0f) + { + m[2][1] -= m[1][2]; + m[1][2] = 0.0f; + } + else if (m[2][1] > 0.0f) + { + m[1][2] -= m[2][1]; + m[2][1] = 0.0f; + } + + sprintf(profile, "%.0f,%.0f,%.0f,%.0f,%.0f,%.0f,%.0f,%.0f,%.0f,%.0f,%.0f", + kd * 1000.0f, g * 1000.0f, + m[0][0] * 1000.0f, m[0][1] * 1000.0f, m[0][2] * 1000.0f, + m[1][0] * 1000.0f, m[1][1] * 1000.0f, m[1][2] * 1000.0f, + m[2][0] * 1000.0f, m[2][1] * 1000.0f, m[2][2] * 1000.0f); + + sprintf(cupsProfile, " *cupsColorProfile %s/%s: \"%.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f\"\n", + resolution[0] ? resolution : "-", mediatype[0] ? mediatype : "-", + kd, g, m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2], + m[2][0], m[2][1], m[2][2]); + + puts(""); + puts("Thank you. Now insert the page back into the printer and press the"); + puts("ENTER key to print the final calibration pass."); + puts(""); + + safe_gets("Press ENTER to continue...", junk, sizeof(junk)); + + puts("Sending calibration pass #4 for visual confirmation..."); + + fp = popen(command, "w"); + send_prolog(fp); + send_pass4(fp, red, green, blue, cupsProfile); + fputs("showpage\n", fp); + pclose(fp); + + puts("Calibration pass #4 sent."); + + puts(""); + puts("The basic color profile for these values is:"); + puts(""); + printf(" %s\n", cupsProfile); + puts(""); + puts("You can add this to the PPD file for this printer to make this change"); + puts("permanent, or use the following option with a printing command:"); + puts(""); + printf(" -o profile=%s\n", profile); + puts(""); + puts("to use the profile for this job only."); + puts(""); + puts("Calibration is complete."); + puts(""); + + if (getuid() == 0) + { + do + safe_gets("Would you like to save the profile as a system-wide default (y/n)? ", + line, sizeof(line)); + while (tolower(line[0]) != 'n' && tolower(line[0]) != 'y'); + } + else + line[0] = 'n'; + + if (line[0] == 'n') + { + do + safe_gets("Would you like to save the profile as a personal default (y/n)? ", + line, sizeof(line)); + while (tolower(line[0]) != 'n' && tolower(line[0]) != 'y'); + } + + puts(""); + if (tolower(line[0]) == 'n') + { + puts("Calibration profile NOT saved."); + return (0); + } + + strcpy(lpoptionscommand, "lpoptions"); + if (printer[0]) + { + strcat(lpoptionscommand, " -p "); + strcat(lpoptionscommand, printer); + } + + strcat(lpoptionscommand, " -o profile="); + + strcat(lpoptionscommand, profile); + + if (system(lpoptionscommand) == 0) + puts("Calibration profile successfully saved."); + else + puts("An error occured while saving the calibration profile."); + + return (0); +} + + +float +get_calibration(const char *prompt, + float minval, + float maxval) +{ + char line[4]; /* Input from user */ + int val1, val2; /* Calibration values */ + + + do + { + if (safe_gets(prompt, line, sizeof(line)) == NULL) + return (minval); + } + while (!isxdigit(line[0]) || (line[1] && !isxdigit(line[1]))); + + if (isdigit(line[0])) + val1 = line[0] - '0'; + else + val1 = tolower(line[0]) - 'a' + 10; + + if (!line[1]) + val2 = val1; + else if (isdigit(line[1])) + val2 = line[1] - '0'; + else + val2 = tolower(line[1]) - 'a' + 10; + + return (minval + (maxval - minval) * (val1 + val2) / 30.0f); +} + + +int +safe_geti(const char *prompt, + int defval) +{ + char line[255]; + + + do + { + safe_gets(prompt, line, sizeof(line)); + + if (defval && !line[0]) + return (defval); + } + while (!line[0] || !isdigit(line[0])); + + return (atoi(line)); +} + + +/* + * 'safe_gets()' - Get a string from the user. + */ + +char * +safe_gets(const char *prompt, + char *s, + int size) +{ + printf("%s ", prompt); + + if (fgets(s, size, stdin) == NULL) + return (NULL); + + if (s[0]) + s[strlen(s) - 1] = '\0'; + + return (s); +} + + +void +send_prolog(FILE *fp) +{ + fputs("%!\n", fp); + fputs("/Helvetica findfont 12 scalefont setfont\n", fp); + fputs("/BLOCK {\n" + " 14.4 mul neg 720 add exch\n" + " 14.4 mul 72 add exch\n" + " 14.4 14.4 rectfill\n" + "} bind def\n", fp); + fputs("/DIAMOND {\n" + " 14.4 mul neg 720 add 7.2 add exch\n" + " 14.4 mul 72 add exch\n" + " newpath\n" + " moveto\n" + " 7.2 7.2 rlineto\n" + " 7.2 -7.2 rlineto\n" + " -7.2 -7.2 rlineto\n" + " closepath\n" + " 0 ne { fill } { stroke } ifelse\n" + "} bind def\n", fp); + fputs("/PLUS {\n" + " 14.4 mul neg 720 add 7.2 add exch\n" + " 14.4 mul 72 add exch\n" + " newpath\n" + " moveto\n" + " 14.4 0 rlineto\n" + " -7.2 -7.2 rmoveto\n" + " 0 14.4 rlineto\n" + " closepath\n" + " fill\n" + "} bind def\n", fp); + fputs("/TEXT {\n" + " 14.4 mul neg 720 add 4 add exch\n" + " 14.4 mul 72 add 7.2 add exch\n" + " moveto\n" + " dup stringwidth pop 0.5 mul neg 0 rmoveto\n" + " show\n" + "} bind def\n", fp); +} + + +void +send_pass1(FILE *fp) +{ + int i; + float p; + static const char *hex = "FEDCBA9876543210"; + + + fputs("0 setgray", fp); + fputs("(K) 0 1 TEXT\n", fp); + fputs("(Y) 0 2 TEXT\n", fp); + fputs("(R) 0 4 TEXT\n", fp); + + for (i = 0; i < 16; i ++) + { + fprintf(fp, "(%d) %d 0 TEXT\n", 100 - i * 5, i * 2 + 2); + fprintf(fp, "(%c) %d 3 TEXT\n", hex[i], i * 2 + 2); + fprintf(fp, "(%d) %d 5 TEXT\n", 200 - i * 10, i * 2 + 2); + } + + for (i = 0; i < 16; i ++) + { + p = 0.01f * (100 - i * 5); + + fprintf(fp, "%.2f setgray %d 1 BLOCK\n", 1.0 - p, i * 2 + 2); + fprintf(fp, "0 0 %.2f 0 setcmykcolor %d 2 BLOCK\n", p, i * 2 + 2); + fprintf(fp, "0 %.2f %.2f 0 setcmykcolor %d 4 BLOCK\n", p, p, i * 2 + 2); + } +} + + +void +send_pass2(FILE *fp, + float kd, + float rd, + float yellow) +{ + int i; + float p; + float g; + static const char *hex = "FEDCBA9876543210"; + + + rd *= 0.5f; + + fprintf(fp, "0 0 %.2f 0 setcmykcolor\n", yellow); + fprintf(fp, "1 %.2f 6 DIAMOND\n", 2.0f + 30.0f * (1.0f - yellow) / 0.75f); + + fprintf(fp, "0 %.2f %.2f 0 setcmykcolor\n", rd, rd); + fprintf(fp, "%d %.2f 6 DIAMOND\n", rd != yellow, + 2.0f + 30.0f * (1.0f - rd) / 0.75f); + + p = 1.0f - kd; + fprintf(fp, "%.2f setgray\n", p); + + if (kd == rd && kd == yellow) + fprintf(fp, "%.2f 6 PLUS\n", 2.0f + 30.0f * (1.0f - kd) / 0.75f); + else + fprintf(fp, "%d %.2f 6 DIAMOND\n", kd != yellow && kd != rd, + 2.0f + 30.0f * (1.0f - kd) / 0.75f); + + fputs("(100%) 0 9 TEXT\n", fp); + fputs("(50%) 0 10 TEXT\n", fp); + fputs("(25%) 0 11 TEXT\n", fp); + + for (i = 0; i < 16; i ++) + { + fprintf(fp, "(%.1f) %d 8 TEXT\n", 0.2f * (20 - i), i * 2 + 2); + fprintf(fp, "(%c) %d 12 TEXT\n", hex[i], i * 2 + 2); + } + + for (i = 0; i < 16; i ++) + { + g = 0.2f * (20 - i); + + p = 1.0f - kd * (float)pow(1.0f, g); + fprintf(fp, "%.2f setgray %d 9 BLOCK\n", p, i * 2 + 2); + + p = 1.0f - kd * (float)pow(0.5f, g); + fprintf(fp, "%.2f setgray %d 10 BLOCK\n", p, i * 2 + 2); + + p = 1.0f - kd * (float)pow(0.25f, g); + fprintf(fp, "%.2f setgray %d 11 BLOCK\n", p, i * 2 + 2); + } +} + + +void +send_pass3(FILE *fp, + float kd, + float rd, + float g, + float yellow) +{ + int i; + float p; + float color; + float c, m, y; + float adj; + static const char *hex = "FEDCBA9876543210"; + + + p = 1.0f - kd; + fprintf(fp, "%.2f setgray\n", p); + fprintf(fp, "1 %.2f 13 DIAMOND\n", 2.0f + 30.0f * (4.0f - g) / 3.0f); + + color = 0.5f * rd / kd - kd; + yellow /= kd; + + fputs("(R) 2 16 TEXT\n", fp); + fputs("(G) 2 17 TEXT\n", fp); + fputs("(B) 2 18 TEXT\n", fp); + + for (i = 1; i < 16; i ++) + { + fprintf(fp, "(%+d) %d 15 TEXT\n", i * 5 - 40, i * 2 + 2); + fprintf(fp, "(%c) %d 19 TEXT\n", hex[i], i * 2 + 2); + } + + for (i = 1; i < 16; i ++) + { + /* Adjustment value */ + adj = i * 0.05f - 0.40f; + + /* RED */ + c = 0.0f; + m = color + adj; + y = color - adj; + if (m > 0) + { + y -= m; + m = 0; + } + else if (y > 0) + { + m -= y; + y = 0; + } + + m += 1.0f; + y = yellow * (1.0f + y); + + if (c <= 0.0f) + c = 0.0f; + else if (c >= 1.0f) + c = 1.0f; + else + c = (float)pow(c, g); + + if (m <= 0.0f) + m = 0.0f; + else if (m >= 1.0f) + m = 1.0f; + else + m = (float)pow(m, g); + + if (y <= 0.0f) + y = 0.0f; + else if (y >= 1.0f) + y = 1.0f; + else + y = (float)pow(y, g); + + fprintf(fp, "%.2f %.2f %.2f 0 setcmykcolor %d 16 BLOCK\n", + c * kd, m * kd, y * kd, i * 2 + 2); + + /* GREEN */ + c = color - adj; + m = 0.0f; + y = color + adj; + + if (c > 0) + { + y -= c; + c = 0; + } + else if (y > 0) + { + c -= y; + y = 0; + } + + c += 1.0f; + y = yellow * (1.0f + y); + + if (c <= 0.0f) + c = 0.0f; + else if (c >= 1.0f) + c = 1.0f; + else + c = (float)pow(c, g); + + if (m <= 0.0f) + m = 0.0f; + else if (m >= 1.0f) + m = 1.0f; + else + m = (float)pow(m, g); + + if (y <= 0.0f) + y = 0.0f; + else if (y >= 1.0f) + y = 1.0f; + else + y = (float)pow(y, g); + + fprintf(fp, "%.2f %.2f %.2f 0 setcmykcolor %d 17 BLOCK\n", + c * kd, m * kd, y * kd, i * 2 + 2); + + /* BLUE */ + c = color + adj; + m = color - adj; + y = 0.0f; + + if (c > 0) + { + m -= c; + c = 0; + } + else if (m > 0) + { + c -= m; + m = 0; + } + + c += 1.0f; + m += 1.0f; + + if (c <= 0.0f) + c = 0.0f; + else if (c >= 1.0f) + c = 1.0f; + else + c = (float)pow(c, g); + + if (m <= 0.0f) + m = 0.0f; + else if (m >= 1.0f) + m = 1.0f; + else + m = (float)pow(m, g); + + if (y <= 0.0f) + y = 0.0f; + else if (y >= 1.0f) + y = 1.0f; + else + y = (float)pow(y, g); + + fprintf(fp, "%.2f %.2f %.2f 0 setcmykcolor %d 18 BLOCK\n", + c * kd, m * kd, y * kd, i * 2 + 2); + } +} + + +void +send_pass4(FILE *fp, + float red, + float green, + float blue, + const char *profile) +{ + FILE *ppm; + int x, y, col, width, height; + int r, g, b; + char line[255]; + + + fprintf(fp, "0 0 1 setrgbcolor 1 %.2f 20 DIAMOND\n", /* BLUE */ + 2.0f + 30.0f * (0.40f + blue) / 0.75f); + fprintf(fp, "1 0 0 setrgbcolor %d %.2f 20 DIAMOND\n", /* RED */ + red != blue, 2.0f + 30.0f * (0.40f + red) / 0.75f); + if (green == red && green == blue) + fprintf(fp, "0 1 0 setrgbcolor %.2f 20 PLUS\n", /* GREEN */ + 2.0f + 30.0f * (0.40f + green) / 0.75f); + else + fprintf(fp, "0 1 0 setrgbcolor %d %.2f 20 DIAMOND\n", /* GREEN */ + green != red && green != blue, + 2.0f + 30.0f * (0.40f + green) / 0.75f); + + fputs("0 setgray\n", fp); + fputs("currentfont 0.8 scalefont setfont\n", fp); + + fprintf(fp, "(%s) 16 22 TEXT\n", profile); + + if ((ppm = fopen(CUPS_DATADIR "/calibrate.ppm", "rb")) == NULL) + if ((ppm = fopen("calibrate.ppm", "rb")) == NULL) + return; + + fgets(line, sizeof(line), ppm); + while (fgets(line, sizeof(line), ppm)) + if (line[0] != '#') + break; + + sscanf(line, "%d%d", &width, &height); + + fgets(line, sizeof(line), ppm); + + fputs("gsave\n", fp); + fprintf(fp, "72 %d translate\n", 504 * height / width + 72); + fprintf(fp, "504 -%d scale\n", 504 * height / width); + + fprintf(fp, "/scanline %d string def\n", width * 3); + + fprintf(fp, "%d %d 8\n", width, height); + fprintf(fp, "[%d 0 0 %d 0 0]\n", width, height); + fputs("{ currentfile scanline readhexstring pop } false 3 colorimage\n", fp); + + for (y = 0, col = 0; y < height; y ++) + { + printf("Sending scanline %d of %d...\r", y + 1, height); + fflush(stdout); + + for (x = 0; x < width; x ++) + { + r = getc(ppm); + g = getc(ppm); + b = getc(ppm); + + fprintf(fp, "%02X%02X%02X", r, g, b); + col ++; + if (col >= 12) + { + col = 0; + putc('\n', fp); + } + } + } + + if (col) + putc('\n', fp); + + printf(" \r"); + + fclose(ppm); + + fputs("grestore\n", fp); +} diff --git a/src/cups/epson.c b/src/cups/epson.c new file mode 100644 index 0000000..eb50a79 --- /dev/null +++ b/src/cups/epson.c @@ -0,0 +1,705 @@ +/* + * "$Id: epson.c,v 1.3 2001/10/29 01:52:10 rlk Exp $" + * + * EPSON backend for the Common UNIX Printing System. + * + * Copyright 1993-2000 by Easy Software Products. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * 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, please contact Easy Software + * Products at: + * + * Attn: CUPS Licensing Information + * Easy Software Products + * 44141 Airport View Drive, Suite 204 + * Hollywood, Maryland 20636-3111 USA + * + * Voice: (301) 373-9603 + * EMail: cups-info@cups.org + * WWW: http://www.cups.org + * + * Contents: + * + * main() - Send a file to the specified parallel port. + * list_devices() - List all parallel devices. + */ + +/* + * Include necessary headers. + */ + +#include +#include +#include +#include +#include + +#if defined(WIN32) || defined(__EMX__) +# include +#else +# include +# include +# include +#endif /* WIN32 || __EMX__ */ + +#if defined(WIN32) || defined(__EMX__) +# include +#else +# include +# include +# include +# include +#endif /* WIN32 || __EMX__ */ + +#ifdef __sgi +# include +# ifndef INV_EPP_ECP_PLP +# define INV_EPP_ECP_PLP 6 /* From 6.3/6.4/6.5 sys/invent.h */ +# define INV_ASO_SERIAL 14 /* serial portion of SGI ASO board */ +# define INV_IOC3_DMA 16 /* DMA mode IOC3 serial */ +# define INV_IOC3_PIO 17 /* PIO mode IOC3 serial */ +# define INV_ISA_DMA 19 /* DMA mode ISA serial -- O2 */ +# endif /* !INV_EPP_ECP_PLP */ +#endif /* __sgi */ + + +/* + * Local functions... + */ + +void list_devices(void); + + +/* + * 'main()' - Send a file to the specified parallel port. + * + * Usage: + * + * printer-uri job-id user title copies options [file] + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments (6 or 7) */ + char *argv[]) /* I - Command-line arguments */ +{ + char method[1024], /* Method in URI */ + hostname[1024], /* Hostname */ + username[1024], /* Username info (not used) */ + resource[1024], /* Resource info (device and options) */ + *options; /* Pointer to options */ + int port; /* Port number (not used) */ + FILE *fp; /* Print file */ + int copies; /* Number of copies to print */ + int fd, /* Parallel/USB device or socket */ + error, /* Last error */ + backchannel; /* Read backchannel data? */ + struct sockaddr_in addr; /* Socket address */ + struct hostent *hostaddr; /* Host address */ + int wbytes; /* Number of bytes written */ + int nbytes, /* Number of bytes read */ + tbytes; /* Total number of bytes written */ + char buffer[8192], /* Output buffer */ + *bufptr; /* Pointer into buffer */ + struct timeval timeout; /* Timeout for select() */ + fd_set input; /* Input set for select() */ + struct termios opts; /* Parallel port options */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + if (argc == 1) + { + list_devices(); + return (0); + } + else if (argc < 6 || argc > 7) + { + fputs("Usage: epson job-id user title copies options [file]\n", stderr); + return (1); + } + + /* + * If we have 7 arguments, print the file named on the command-line. + * Otherwise, send stdin instead... + */ + + if (argc == 6) + { + fp = stdin; + copies = 1; + } + else + { + /* + * Try to open the print file... + */ + + if ((fp = fopen(argv[6], "rb")) == NULL) + { + perror("ERROR: unable to open print file"); + return (1); + } + + copies = atoi(argv[4]); + } + + /* + * Extract the device name and options from the URI... + */ + + httpSeparate(argv[0], method, username, hostname, &port, resource); + + /* + * See if there are any options... + */ + + if ((options = strchr(resource, '?')) != NULL) + { + /* + * Yup, terminate the device name string and move to the first + * character of the options... + */ + + *options++ = '\0'; + } + + if (hostname[0]) + { + /* + * Lookup the IP address... + */ + + if ((hostaddr = gethostbyname(hostname)) == NULL) + { + fprintf(stderr, "ERROR: Unable to locate printer \'%s\' - %s", + hostname, strerror(errno)); + return (1); + } + + if (port == 0) + port = 9100; /* Default for EPSON NIC */ + + fprintf(stderr, "INFO: Attempting to connect to printer %s on port %d\n", + hostname, port); + + memset(&addr, 0, sizeof(addr)); + memcpy(&(addr.sin_addr), hostaddr->h_addr, hostaddr->h_length); + addr.sin_family = hostaddr->h_addrtype; + addr.sin_port = htons(port); + + /* + * Try to connect... + */ + + for (;;) + { + if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + perror("ERROR: Unable to create socket"); + return (1); + } + + if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) + { + error = errno; + close(fd); + fd = -1; + + if (error == ECONNREFUSED) + { + fprintf(stderr, "INFO: Network printer \'%s\' is busy; will retry in 30 seconds...\n", + hostname); + sleep(30); + } + else + { + perror("ERROR: Unable to connect to printer"); + sleep(30); + } + } + else + break; + } + + fputs("INFO: Connected to printer, sending print job...\n", stderr); + } + else + { + /* + * Open the parallel or USB port device... + */ + + do + { + if ((fd = open(resource, O_RDWR | O_EXCL)) == -1) + { + if (errno == EBUSY) + { + fputs("INFO: Parallel port busy; will retry in 30 seconds...\n", stderr); + sleep(30); + } + else + { + perror("ERROR: Unable to open parallel port device file"); + return (1); + } + } + } + while (fd < 0); + + /* + * Set any options provided... + */ + + tcgetattr(fd, &opts); + + opts.c_cflag |= CREAD; /* Enable reading */ + opts.c_lflag &= ~(ICANON | ECHO | ISIG); /* Raw mode */ + + /**** No options supported yet ****/ + + tcsetattr(fd, TCSANOW, &opts); + } + + /* + * Now that we are "connected" to the port, ignore SIGTERM so that we + * can finish out any page data the driver sends (e.g. to eject the + * current page... + */ + +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGTERM, SIG_IGN); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = SIG_IGN; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGTERM, SIG_IGN); +#endif /* HAVE_SIGSET */ + + /* + * Finally, send the print file... + */ + + backchannel = 1; + + while (copies > 0) + { + copies --; + + if (fp != stdin) + { + fputs("PAGE: 1 1\n", stderr); + rewind(fp); + } + + tbytes = 0; + while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0) + { + /* + * Write the print data to the printer... + */ + + tbytes += nbytes; + bufptr = buffer; + + while (nbytes > 0) + { + if ((wbytes = write(fd, bufptr, nbytes)) < 0) + { + perror("ERROR: Unable to send print file to printer"); + break; + } + + nbytes -= wbytes; + bufptr += wbytes; + } + + if (nbytes > 0) + break; + + /* + * Check for possible data coming back from the printer... + */ + + if (!backchannel) + continue; + + timeout.tv_sec = 0; + timeout.tv_usec = 0; + FD_ZERO(&input); + FD_SET(fd, &input); + if (select(fd + 1, &input, NULL, NULL, &timeout) > 0) + { + /* + * Grab the data coming back and spit it out to stderr... + */ + + if ((nbytes = read(fd, buffer, sizeof(buffer) - 1)) < 0) + { + fprintf(stderr, "ERROR: Back-channel read error - %s!\n", + strerror(errno)); + backchannel = 0; + continue; + } + + buffer[nbytes] = '\0'; + if (strncmp(buffer, "@BDC ", 5) != 0) + fprintf(stderr, "WARNING: Received %d bytes of unknown back-channel data!\n", + nbytes); + else + { + /* + * Skip initial report line... + */ + + for (bufptr = buffer; *bufptr && *bufptr != '\n'; bufptr ++); + + if (*bufptr == '\n') + bufptr ++; + + /* + * Get status data... + */ + + strcpy(buffer, bufptr); + for (bufptr = buffer; *bufptr && *bufptr != ';'; bufptr ++); + *bufptr = '\0'; + + if (strncmp(buffer, "IQ:", 3) == 0) + { + /* + * Report ink level... + */ + + int i; + int levels[6]; + + buffer[12] = '\0'; /* Limit to 6 inks */ + for (i = 0, bufptr = buffer; i < 6; i ++, bufptr += 2) + { + if (isalpha(bufptr[0])) + levels[i] = (tolower(bufptr[0]) - 'a' + 10) << 16; + else + levels[i] = (bufptr[0] - '0') << 16; + + if (isalpha(bufptr[1])) + levels[i] |= tolower(bufptr[1]) - 'a' + 10; + else + levels[i] |= bufptr[1] - '0'; + } + + switch (i) + { + case 1 : + case 2 : + fprintf(stderr, "K=%d\n", levels[0]); + break; + case 3 : + fprintf(stderr, "C=%d M=%d Y=%d\n", levels[0], levels[1], + levels[2]); + break; + case 4 : + case 5 : + fprintf(stderr, "K=%d C=%d M=%d Y=%d\n", levels[0], + levels[1], levels[2], levels[3]); + break; + case 6 : + fprintf(stderr, "K=%d C=%d M=%d Y=%d LC=%d LM=%d\n", + levels[0], levels[1], levels[2], levels[3], + levels[4], levels[5]); + break; + } + } + else + fprintf(stderr, "INFO: %s\n", buffer); + } + } + else if (argc > 6) + fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes); + } + } + + /* + * Close the socket connection or parallel/USB device and input file and + * return... + */ + + close(fd); + if (fp != stdin) + fclose(fp); + + return (0); +} + + +/* + * 'list_devices()' - List all parallel devices. + */ + +void +list_devices(void) +{ +#ifdef __linux + int i; /* Looping var */ + int fd; /* File descriptor */ + char device[255]; /* Device filename */ + FILE *probe; /* /proc/parport/n/autoprobe file */ + char line[1024], /* Line from file */ + *delim, /* Delimiter in file */ + make[IPP_MAX_NAME], /* Make from file */ + model[IPP_MAX_NAME]; /* Model from file */ + + + /* + * Probe for parallel devices... + */ + + for (i = 0; i < 4; i ++) + { + sprintf(device, "/proc/parport/%d/autoprobe", i); + if ((probe = fopen(device, "r")) != NULL) + { + memset(make, 0, sizeof(make)); + memset(model, 0, sizeof(model)); + strcpy(model, "EPSON"); + + while (fgets(line, sizeof(line), probe) != NULL) + { + /* + * Strip trailing ; and/or newline. + */ + + if ((delim = strrchr(line, ';')) != NULL) + *delim = '\0'; + else if ((delim = strrchr(line, '\n')) != NULL) + *delim = '\0'; + + /* + * Look for MODEL and MANUFACTURER lines... + */ + + if (strncmp(line, "MODEL:", 6) == 0 && + strncmp(line, "MODEL:EPSON", 13) != 0) + strncpy(model, line + 6, sizeof(model) - 1); + else if (strncmp(line, "MANUFACTURER:", 13) == 0 && + strncmp(line, "MANUFACTURER:EPSON", 20) != 0) + strncpy(make, line + 13, sizeof(make) - 1); + } + + fclose(probe); + + if (strcmp(make, "EPSON") == 0) + printf("direct epson:/dev/lp%d \"%s %s\" \"Parallel Port #%d\"\n", + i, make, model, i + 1); + } + else + { + sprintf(device, "/dev/lp%d", i); + if ((fd = open(device, O_RDWR)) >= 0) + { + close(fd); + printf("direct epson:%s \"EPSON\" \"Parallel Port #%d\"\n", device, i + 1); + } + } + } + + /* + * Probe for USB devices... + */ + + if ((probe = fopen("/proc/bus/usb/devices", "r")) != NULL) + { + i = 0; + + memset(make, 0, sizeof(make)); + memset(model, 0, sizeof(model)); + + while (fgets(line, sizeof(line), probe) != NULL) + { + /* + * Strip trailing newline. + */ + + if ((delim = strrchr(line, '\n')) != NULL) + *delim = '\0'; + + /* + * See if it is a printer device ("P: ...") + */ + + if (strncmp(line, "S:", 2) == 0) + { + /* + * String attribute... + */ + + if (strncmp(line, "S: Manufacturer=", 17) == 0) + { + strncpy(make, line + 17, sizeof(make) - 1); + if (strcmp(make, "Hewlett-Packard") == 0) + strcpy(make, "HP"); + } + else if (strncmp(line, "S: Product=", 12) == 0) + strncpy(model, line + 12, sizeof(model) - 1); + } + else if (strncmp(line, "I:", 2) == 0 && + strstr(line, "Driver=printer") != NULL && + make[0] && model[0]) + { + /* + * We were processing a printer device; send the info out... + */ + + if (strcmp(make, "EPSON") == 0) + { + sprintf(device, "/dev/usb/lp%d", i); + if (access(device, 0)) + { + sprintf(device, "/dev/usb/usblp%d", i); + + if (access(device, 0)) + sprintf(device, "/dev/usblp%d", i); + } + + printf("direct epson:%s \"%s %s\" \"USB Printer #%d\"\n", + device, make, model, i + 1); + } + + i ++; + + memset(make, 0, sizeof(make)); + memset(model, 0, sizeof(model)); + } + } + + fclose(probe); + } + else + { + for (i = 0; i < 8; i ++) + { + sprintf(device, "/dev/usb/lp%d", i); + if ((fd = open(device, O_RDWR)) >= 0) + { + close(fd); + printf("direct epson:%s \"EPSON\" \"USB Printer #%d\"\n", device, i + 1); + } + + sprintf(device, "/dev/usb/usblp%d", i); + if ((fd = open(device, O_RDWR)) >= 0) + { + close(fd); + printf("direct epson:%s \"EPSON\" \"USB Printer #%d\"\n", device, i + 1); + } + + sprintf(device, "/dev/usblp%d", i); + if ((fd = open(device, O_RDWR)) >= 0) + { + close(fd); + printf("direct epson:%s \"EPSON\" \"USB Printer #%d\"\n", device, i + 1); + } + } + } +#elif defined(__sgi) + int i, j, n; /* Looping vars */ + char device[255]; /* Device filename */ + inventory_t *inv; /* Hardware inventory info */ + + + /* + * IRIX maintains a hardware inventory of most devices... + */ + + setinvent(); + + while ((inv = getinvent()) != NULL) + { + if (inv->inv_class == INV_PARALLEL && inv->inv_type == INV_EPP_ECP_PLP) + { + /* + * Standard parallel port... + */ + + puts("direct epson:/dev/plpbi \"EPSON\" \"Onboard Parallel Port\""); + } + } + + endinvent(); +#elif defined(__sun) + int i, j, n; /* Looping vars */ + char device[255]; /* Device filename */ + + + /* + * Standard parallel ports... + */ + + for (i = 0; i < 10; i ++) + { + sprintf(device, "/dev/ecpp%d", i); + if (access(device, 0) == 0) + printf("direct epson:%s \"EPSON\" \"Sun IEEE-1284 Parallel Port #%d\"\n", + device, i + 1); + } + + for (i = 0; i < 3; i ++) + { + sprintf(device, "/dev/lp%d", i); + + if (access(device, 0) == 0) + printf("direct epson:%s \"EPSON\" \"PC Parallel Port #%d\"\n", + device, i + 1); + } +#elif defined(FreeBSD) || defined(OpenBSD) || defined(NetBSD) + int i; /* Looping var */ + int fd; /* File descriptor */ + char device[255]; /* Device filename */ + + + /* + * Probe for parallel devices... + */ + + for (i = 0; i < 3; i ++) + { + sprintf(device, "/dev/lpt%d", i); + if ((fd = open(device, O_RDWR)) >= 0) + { + close(fd); + printf("direct epson:%s \"EPSON\" \"Parallel Port #%d\"\n", device, i + 1); + } + } + + /* + * Probe for USB devices... + */ + + for (i = 0; i < 3; i ++) + { + sprintf(device, "/dev/ulpt%d", i); + if ((fd = open(device, O_RDWR)) >= 0) + { + close(fd); + printf("direct epson:%s \"EPSON\" \"USB Port #%d\"\n", device, i + 1); + } + } +#endif +} + + +/* + * End of "$Id: epson.c,v 1.3 2001/10/29 01:52:10 rlk Exp $". + */ diff --git a/src/cups/genppd.c b/src/cups/genppd.c new file mode 100644 index 0000000..d9c6060 --- /dev/null +++ b/src/cups/genppd.c @@ -0,0 +1,858 @@ +/* + * "$Id: genppd.c,v 1.36 2001/11/11 21:25:36 rlk Exp $" + * + * PPD file generation program for the CUPS drivers. + * + * Copyright 1993-2001 by Easy Software Products. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * 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, please contact Easy Software + * Products at: + * + * Attn: CUPS Licensing Information + * Easy Software Products + * 44141 Airport View Drive, Suite 204 + * Hollywood, Maryland 20636-3111 USA + * + * Voice: (301) 373-9603 + * EMail: cups-info@cups.org + * WWW: http://www.cups.org + * + * Contents: + * + * main() - Process files on the command-line... + * initialize_stp_options() - Initialize the min/max values for + * each STP numeric option. + * usage() - Show program usage... + * write_ppd() - Write a PPD file. + */ + +/* + * Include necessary headers... + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#ifdef INCLUDE_GIMP_PRINT_H +#include INCLUDE_GIMP_PRINT_H +#else +#include +#endif +#include +#include "../../lib/libprintut.h" + +#ifndef CUPS_PPD_PS_LEVEL +#define CUPS_PPD_PS_LEVEL 2 +#endif + + +/* + * File handling stuff... + */ + +#ifdef HAVE_LIBZ +# define PPDEXT ".ppd.gz" +#else +# define PPDEXT ".ppd" +# define gzFile FILE * +# define gzopen fopen +# define gzclose fclose +# define gzprintf fprintf +# define gzputs(f,s) fputs((s),(f)) +# define gzputc(f,c) putc((c),(f)) +#endif /* HAVE_LIBZ */ + + +/* + * Size data... + */ + +#define DEFAULT_SIZE "Letter" +/*#define DEFAULT_SIZE "A4"*/ + +typedef struct /**** Media size values ****/ +{ + const char *name, /* Media size name */ + *text; /* Media size text */ + int width, /* Media width */ + height, /* Media height */ + left, /* Media left margin */ + right, /* Media right margin */ + bottom, /* Media bottom margin */ + top; /* Media top margin */ +} paper_t; + + +/* + * STP option data... + */ + +static struct /**** STP numeric options ****/ +{ + const char *name, /* Name of option */ + *text; /* Human-readable text */ + int low, /* Low value (thousandths) */ + high, /* High value (thousandths) */ + defval, /* Default value */ + step; /* Step (thousandths) */ +} stp_options[] = +{ + { "stpBrightness", "Brightness" }, + { "stpContrast", "Contrast" }, + { "stpGamma", "Gamma" }, + { "stpDensity", "Density" }, + { "stpCyan", "Cyan" }, + { "stpMagenta", "Magenta" }, + { "stpYellow", "Yellow" }, + { "stpSaturation", "Saturation" } +}; + + +/* + * Local functions... + */ + +void initialize_stp_options(void); +void usage(void); +int write_ppd(const stp_printer_t p, const char *prefix, + const char *language, int verbose); + + +/* + * 'main()' - Process files on the command-line... + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + int option_index; /* Option index */ + const char *prefix; /* Directory prefix for output */ + const char *language; /* Language */ + const char *catalog = NULL;/* Catalog location */ + stp_printer_t printer; /* Pointer to printer driver */ + int verbose = 0; + static struct option long_options[] = + { /* Command-line options */ + /* name, has_arg, flag val */ + {"help", no_argument, 0, 0}, + {"verbose", no_argument, 0, 0}, + {"quiet", no_argument, 0, 0}, + {"catalog", required_argument, 0, 0}, + {"prefix", required_argument, 0, 0}, + {0, 0, 0, 0} + }; + + /* + * Parse command-line args... + */ + + prefix = "ppd"; + language = "C"; + + initialize_stp_options(); + + option_index = 0; + + for (;;) + { + if ((i = getopt_long_only(argc, argv, "", long_options, + &option_index)) == -1) + break; + + switch (i) + { + case 0: + /* option already dealt with, so skip to next argv entry */ + if (long_options[option_index].flag != 0) + break; + + if (strncmp(long_options[option_index].name, "help", 4) == 0) + { + usage(); + break; + } + if (strncmp(long_options[option_index].name, "verbose", 7) == 0) + { + verbose = 1; + break; + } + + if (strncmp(long_options[option_index].name, "quiet", 5) == 0) + { + verbose = 0; + break; + } + + if (strncmp(long_options[option_index].name, "catalog", 7) == 0) + { + catalog = optarg; +#ifdef DEBUG + fprintf (stderr, "DEBUG: catalog: %s\n", catalog); +#endif + break; + } + + if (strncmp(long_options[option_index].name, "prefix", 6) == 0) + { + prefix = optarg; +#ifdef DEBUG + fprintf (stderr, "DEBUG: prefix: %s\n", prefix); +#endif + break; + } + + default: + usage(); + break; + } + } + +/* + * Initialise libgimpprint + */ + + stp_init(); + + + /* + * Set the language... + */ + + setlocale(LC_ALL, ""); + + /* + * Set up the catalog + */ + + if (catalog) + { + if ((bindtextdomain(PACKAGE, catalog)) == NULL) + { + fprintf(stderr, "genppd: cannot load message catalog %s: %s\n", catalog, + strerror(errno)); + exit(1); + } +#ifdef DEBUG + fprintf (stderr, "DEBUG: bound textdomain: %s\n", catalog); +#endif + if ((textdomain(PACKAGE)) == NULL) + { + fprintf(stderr, "genppd: cannot select message catalog %s: %s\n", + catalog, strerror(errno)); + exit(1); + } +#ifdef DEBUG + fprintf (stderr, "DEBUG: textdomain set: %s\n", PACKAGE); +#endif + } + + + /* + * Write PPD files... + */ + + for (i = 0; i < stp_known_printers(); i++) + { + printer = stp_get_printer_by_index(i); + + if (printer && write_ppd(printer, prefix, language, verbose)) + return (1); + } + if (!verbose) + fprintf(stderr, "\n"); + + return (0); +} + + +/* + * 'initialize_stp_options()' - Initialize the min/max values for + * each STP numeric option. + */ + +void +initialize_stp_options(void) +{ + const stp_vars_t lower = stp_minimum_settings(); + const stp_vars_t upper = stp_maximum_settings(); + const stp_vars_t defvars = stp_default_settings(); + + + stp_options[0].low = 1000 * stp_get_brightness(lower); + stp_options[0].high = 1000 * stp_get_brightness(upper); + stp_options[0].defval = 1000 * stp_get_brightness(defvars); + stp_options[0].step = 50; + + stp_options[1].low = 1000 * stp_get_contrast(lower); + stp_options[1].high = 1000 * stp_get_contrast(upper); + stp_options[1].defval = 1000 * stp_get_contrast(defvars); + stp_options[1].step = 50; + + stp_options[2].low = 1000 * stp_get_gamma(lower); + stp_options[2].high = 1000 * stp_get_gamma(upper); + stp_options[2].defval = 1000 * stp_get_gamma(defvars); + stp_options[2].step = 50; + + stp_options[3].low = 1000 * stp_get_density(lower); + stp_options[3].high = 1000 * stp_get_density(upper); + stp_options[3].defval = 1000 * stp_get_density(defvars); + stp_options[3].step = 50; + + stp_options[4].low = 1000 * stp_get_cyan(lower); + stp_options[4].high = 1000 * stp_get_cyan(upper); + stp_options[4].defval = 1000 * stp_get_cyan(defvars); + stp_options[4].step = 50; + + stp_options[5].low = 1000 * stp_get_magenta(lower); + stp_options[5].high = 1000 * stp_get_magenta(upper); + stp_options[5].defval = 1000 * stp_get_magenta(defvars); + stp_options[5].step = 50; + + stp_options[6].low = 1000 * stp_get_yellow(lower); + stp_options[6].high = 1000 * stp_get_yellow(upper); + stp_options[6].defval = 1000 * stp_get_yellow(defvars); + stp_options[6].step = 50; + + stp_options[7].low = 1000 * stp_get_saturation(lower); + stp_options[7].high = 1000 * stp_get_saturation(upper); + stp_options[7].defval = 1000 * stp_get_saturation(defvars); + stp_options[7].step = 50; +} + + +/* + * 'usage()' - Show program usage... + */ + +void +usage(void) +{ + fputs("Usage: genppd [--help] [--catalog=domain] " + "[--language=locale] [--prefix=dir]\n", stderr); + + exit(EXIT_FAILURE); +} + + +/* + * 'write_ppd()' - Write a PPD file. + */ + +int /* O - Exit status */ +write_ppd(const stp_printer_t p, /* I - Printer driver */ + const char *prefix, /* I - Prefix (directory) for PPD files */ + const char *language,/* I - Language/locale */ + int verbose) +{ + int i, j; /* Looping vars */ + gzFile fp; /* File to write to */ + char filename[1024]; /* Filename */ + char manufacturer[64]; /* Manufacturer name */ + int num_opts; /* Number of printer options */ + stp_param_t *opts; /* Printer options */ + const char *defopt; /* Default printer option */ + int xdpi, ydpi; /* Resolution info */ + stp_vars_t v; /* Variable info */ + int width, height, /* Page information */ + bottom, left, + top, right; + const char *driver; /* Driver name */ + const char *long_name; /* Driver long name */ + stp_vars_t printvars; /* Printer option names */ + int model; /* Driver model number */ + const stp_printfuncs_t *printfuncs; /* Driver functions */ + paper_t *the_papers; /* Media sizes */ + int cur_opt; /* Current option */ + + + /* + * Initialize driver-specific variables... + */ + + driver = stp_printer_get_driver(p); + long_name = stp_printer_get_long_name(p); + printvars = stp_printer_get_printvars(p); + model = stp_printer_get_model(p); + printfuncs = stp_printer_get_printfuncs(p); + the_papers = NULL; + cur_opt = 0; + + /* + * Skip the PostScript drivers... + */ + + if (strcmp(driver, "ps") == 0 || + strcmp(driver, "ps2") == 0) + return (0); + + /* + * Make sure the destination directory exists... + */ + + mkdir(prefix, 0777); + sprintf(filename, "%s/%s" PPDEXT, prefix, driver); + + /* + * Open the PPD file... + */ + + if ((fp = gzopen(filename, "wb")) == NULL) + { + fprintf(stderr, "genppd: Unable to create file \"%s\" - %s.\n", + filename, strerror(errno)); + return (2); + } + + /* + * Write a standard header... + */ + + sscanf(long_name, "%63s", manufacturer); + + if (verbose) + fprintf(stderr, "Writing %s...\n", filename); + else + fprintf(stderr, "."); + + gzputs(fp, "*PPD-Adobe: \"4.3\"\n"); + gzputs(fp, "*%PPD file for CUPS/GIMP-print.\n"); + gzputs(fp, "*%Copyright 1993-2001 by Easy Software Products, All Rights Reserved.\n"); + gzputs(fp, "*%This PPD file may be freely used and distributed under the terms of\n"); + gzputs(fp, "*%the GNU GPL.\n"); + gzputs(fp, "*FormatVersion: \"4.3\"\n"); + gzputs(fp, "*FileVersion: \"" VERSION "\"\n"); + /* Specify language of PPD translation */ + /* Translators: Specify the language of the PPD translation. + * Use the English name of your language here, e.g. "Swedish" instead of + * "Svenska". + */ + gzprintf(fp, "*LanguageVersion: %s\n", _("English")); + /* Specify PPD translation encoding e.g. ISOLatin1 */ + gzprintf(fp, "*LanguageEncoding: %s\n", _("ISOLatin1")); + gzprintf(fp, "*PCFileName: \"%s.ppd\"\n", driver); + gzprintf(fp, "*Manufacturer: \"%s\"\n", manufacturer); + gzputs(fp, "*Product: \"(GIMP-print v" VERSION ")\"\n"); + gzprintf(fp, "*ModelName: \"%s\"\n", driver); + gzprintf(fp, "*ShortNickName: \"%s\"\n", long_name); + gzprintf(fp, "*NickName: \"%s, CUPS+GIMP-print v" VERSION "\"\n", long_name); + gzputs(fp, "*PSVersion: \"(3010.000) 550\"\n"); + gzprintf(fp, "*LanguageLevel: \"%d\"\n", CUPS_PPD_PS_LEVEL); + gzprintf(fp, "*ColorDevice: %s\n", + stp_get_output_type(printvars) == OUTPUT_COLOR ? "True" : "False"); + gzprintf(fp, "*DefaultColorSpace: %s\n", + stp_get_output_type(printvars) == OUTPUT_COLOR ? "RGB" : "Gray"); + gzputs(fp, "*FileSystem: False\n"); + gzputs(fp, "*LandscapeOrientation: Plus90\n"); + gzputs(fp, "*TTRasterizer: Type42\n"); + + gzputs(fp, "*cupsVersion: 1.1\n"); + gzprintf(fp, "*cupsModelNumber: \"%d\"\n", model); + gzputs(fp, "*cupsManualCopies: True\n"); + gzputs(fp, "*cupsFilter: \"application/vnd.cups-raster 100 rastertoprinter\"\n"); + if (strcasecmp(manufacturer, "EPSON") == 0) + gzputs(fp, "*cupsFilter: \"application/vnd.cups-command 33 commandtoepson\"\n"); + + /* + * Get the page sizes from the driver... + */ + + v = stp_allocate_copy(printvars); + + opts = (*(printfuncs->parameters))(p, NULL, "PageSize", &num_opts); + defopt = (*(printfuncs->default_parameters))(p, NULL, "PageSize"); + the_papers = malloc(sizeof(paper_t) * num_opts); + + for (i = 0; i < num_opts; i++) + { + const stp_papersize_t papersize = stp_get_papersize_by_name(opts[i].name); + + if (!papersize) + { + printf("Unable to lookup size %s!\n", opts[i].name); + continue; + } + + width = stp_papersize_get_width(papersize); + height = stp_papersize_get_height(papersize); + + if (width <= 0 || height <= 0) + continue; + + stp_set_media_size(v, opts[i].name); + + (*(printfuncs->media_size))(p, v, &width, &height); + (*(printfuncs->imageable_area))(p, v, &left, &right, &bottom, &top); + + the_papers[cur_opt].name = opts[i].name; + the_papers[cur_opt].text = opts[i].text; + the_papers[cur_opt].width = width; + the_papers[cur_opt].height = height; + the_papers[cur_opt].left = left; + the_papers[cur_opt].right = right; + the_papers[cur_opt].bottom = bottom; + the_papers[cur_opt].top = top; + + cur_opt++; + } + + gzputs(fp, "*OpenUI *PageSize: PickOne\n"); + gzputs(fp, "*OrderDependency: 10 AnySetup *PageSize\n"); + gzputs(fp, "*DefaultPageSize: "); + gzputs(fp, defopt); + gzputs(fp, "\n"); + for (i = 0; i < cur_opt; i ++) + { + gzprintf(fp, "*PageSize %s", the_papers[i].name); + gzprintf(fp, "/%s:\t\"<>setpagedevice\"\n", + the_papers[i].text, the_papers[i].width, the_papers[i].height); + } + gzputs(fp, "*CloseUI: *PageSize\n"); + + gzputs(fp, "*OpenUI *PageRegion: PickOne\n"); + gzputs(fp, "*OrderDependency: 10 AnySetup *PageRegion\n"); + gzputs(fp, "*DefaultPageRegion: "); + gzputs(fp, defopt); + gzputs(fp, "\n"); + for (i = 0; i < cur_opt; i ++) + { + gzprintf(fp, "*PageRegion %s", the_papers[i].name); + gzprintf(fp, "/%s:\t\"<>setpagedevice\"\n", + the_papers[i].text, the_papers[i].width, the_papers[i].height); + } + gzputs(fp, "*CloseUI: *PageRegion\n"); + + gzputs(fp, "*DefaultImageableArea: "); + gzputs(fp, defopt); + gzputs(fp, "\n"); + for (i = 0; i < cur_opt; i ++) + { + gzprintf(fp, "*ImageableArea %s", the_papers[i].name); + gzprintf(fp, "/%s:\t\"%d %d %d %d\"\n", the_papers[i].text, + the_papers[i].left, the_papers[i].bottom, + the_papers[i].right, the_papers[i].top); + } + + gzputs(fp, "*DefaultPaperDimension: "); + gzputs(fp, defopt); + gzputs(fp, "\n"); + for (i = 0; i < cur_opt; i ++) + { + gzprintf(fp, "*PaperDimension %s", the_papers[i].name); + gzprintf(fp, "/%s:\t\"%d %d\"\n", + the_papers[i].text, the_papers[i].width, the_papers[i].height); + } + + if (opts) + { + for (i = 0; i < num_opts; i++) + { + free((void *)opts[i].name); + free((void *)opts[i].text); + } + + free(opts); + } + + if (the_papers) + free(the_papers); + + /* + * Do we support color? + */ + + gzputs(fp, "*OpenUI *ColorModel: PickOne\n"); + gzputs(fp, "*OrderDependency: 10 AnySetup *ColorModel\n"); + + if (stp_get_output_type(printvars) == OUTPUT_COLOR) + gzputs(fp, "*DefaultColorModel: RGB\n"); + else + gzputs(fp, "*DefaultColorModel: Gray\n"); + + gzprintf(fp, "*ColorModel Gray/Grayscale:\t\"<<" + "/cupsColorSpace %d" + "/cupsColorOrder %d" + "/cupsBitsPerColor 8>>setpagedevice\"\n", + CUPS_CSPACE_W, CUPS_ORDER_CHUNKED); + gzprintf(fp, "*ColorModel Black/Black & White:\t\"<<" + "/cupsColorSpace %d" + "/cupsColorOrder %d" + "/cupsBitsPerColor 8>>setpagedevice\"\n", + CUPS_CSPACE_K, CUPS_ORDER_CHUNKED); + + if (stp_get_output_type(printvars) == OUTPUT_COLOR) + { + gzprintf(fp, "*ColorModel RGB/Color:\t\"<<" + "/cupsColorSpace %d" + "/cupsColorOrder %d" + "/cupsBitsPerColor 8>>setpagedevice\"\n", + CUPS_CSPACE_RGB, CUPS_ORDER_CHUNKED); + gzprintf(fp, "*ColorModel CMYK/Raw CMYK:\t\"<<" + "/cupsColorSpace %d" + "/cupsColorOrder %d" + "/cupsBitsPerColor 8>>setpagedevice\"\n", + CUPS_CSPACE_CMYK, CUPS_ORDER_CHUNKED); + } + + gzputs(fp, "*CloseUI: *ColorModel\n"); + + /* + * Media types... + */ + + opts = (*(printfuncs->parameters))(p, NULL, "MediaType", &num_opts); + defopt = (*(printfuncs->default_parameters))(p, NULL, "MediaType"); + + if (num_opts > 0) + { + gzprintf(fp, "*OpenUI *MediaType/%s: PickOne\n", _("Media Type")); + gzputs(fp, "*OrderDependency: 10 AnySetup *MediaType\n"); + gzprintf(fp, "*DefaultMediaType: %s\n", defopt); + + for (i = 0; i < num_opts; i ++) + { + gzprintf(fp, "*MediaType %s/%s:\t\"<>setpagedevice\"\n", + opts[i].name, opts[i].text, opts[i].name); + free((void *)opts[i].name); + free((void *)opts[i].text); + } + + free(opts); + + gzputs(fp, "*CloseUI: *MediaType\n"); + } + + /* + * Input slots... + */ + + opts = (*(printfuncs->parameters))(p, NULL, "InputSlot", &num_opts); + defopt = (*(printfuncs->default_parameters))(p, NULL, "InputSlot"); + + if (num_opts > 0) + { + gzprintf(fp, "*OpenUI *InputSlot/%s: PickOne\n", _("Media Source")); + gzputs(fp, "*OrderDependency: 10 AnySetup *InputSlot\n"); + gzprintf(fp, "*DefaultInputSlot: %s\n", defopt); + + for (i = 0; i < num_opts; i ++) + { + gzprintf(fp, "*InputSlot %s/%s:\t\"<>setpagedevice\"\n", + opts[i].name, opts[i].text, opts[i].name); + free((void *)opts[i].name); + free((void *)opts[i].text); + } + + free(opts); + + gzputs(fp, "*CloseUI: *InputSlot\n"); + } + + /* + * Resolutions... + */ + + opts = (*(printfuncs->parameters))(p, NULL, "Resolution", &num_opts); + defopt = (*(printfuncs->default_parameters))(p, NULL, "Resolution"); + + gzprintf(fp, "*OpenUI *Resolution/%s: PickOne\n", _("Resolution")); + gzputs(fp, "*OrderDependency: 20 AnySetup *Resolution\n"); + gzprintf(fp, "*DefaultResolution: %s\n", defopt); + + for (i = 0; i < num_opts; i ++) + { + /* + * Strip resolution name to its essentials... + */ + + (printfuncs->describe_resolution)(p, opts[i].name, &xdpi, &ydpi); + + /* This should not happen! */ + if (xdpi == -1 || ydpi == -1) + continue; + + /* + * Write the resolution option... + */ + + gzprintf(fp, "*Resolution %s/%s:\t\"<>setpagedevice\"\n", + opts[i].name, opts[i].text, xdpi, ydpi, i); + free((void *)opts[i].name); + free((void *)opts[i].text); + } + + free(opts); + + gzputs(fp, "*CloseUI: *Resolution\n"); + + /* + * STP option group... + */ + + gzputs(fp, "*OpenGroup: STP\n"); + + /* + * Image types... + */ + + gzprintf(fp, "*OpenUI *stpImageType/%s: PickOne\n", _("Image Type")); + gzputs(fp, "*OrderDependency: 10 AnySetup *stpImageType\n"); + gzputs(fp, "*DefaultstpImageType: LineArt\n"); + + gzprintf(fp, "*stpImageType LineArt/%s:\t\"<>setpagedevice\"\n", + _("Line Art")); + gzprintf(fp, "*stpImageType SolidTone/%s:\t\"<>setpagedevice\"\n", + _("Solid Colors")); + gzprintf(fp, "*stpImageType Continuous/%s:\t\"<>setpagedevice\"\n", + _("Photograph")); + + gzputs(fp, "*CloseUI: *stpImageType\n"); + + /* + * Dithering algorithms... + */ + + gzprintf(fp, "*OpenUI *stpDither/%s: PickOne\n", _("Dither Algorithm")); + gzputs(fp, "*OrderDependency: 10 AnySetup *stpDither\n"); + gzprintf(fp, "*DefaultstpDither: %s\n", stp_default_dither_algorithm()); + + for (i = 0; i < stp_dither_algorithm_count(); i ++) + gzprintf(fp, "*stpDither %s/%s: \"<>setpagedevice\"\n", + stp_dither_algorithm_name(i), stp_dither_algorithm_text(i), i); + + gzputs(fp, "*CloseUI: *stpDither\n"); + + /* + * InkTypes... + */ + + opts = (*(printfuncs->parameters))(p, NULL, "InkType", &num_opts); + defopt = (*(printfuncs->default_parameters))(p, NULL, "InkType"); + + if (num_opts > 0) + { + gzprintf(fp, "*OpenUI *stpInkType/%s: PickOne\n", _("Ink Type")); + gzputs(fp, "*OrderDependency: 20 AnySetup *stpInkType\n"); + gzprintf(fp, "*DefaultstpInkType: %s\n", defopt); + + for (i = 0; i < num_opts; i ++) + { + /* + * Write the inktype option... + */ + + gzprintf(fp, "*stpInkType %s/%s:\t\"<>setpagedevice\"\n", + opts[i].name, opts[i].text, opts[i].name); + free((void *)opts[i].name); + free((void *)opts[i].text); + } + + free(opts); + + gzputs(fp, "*CloseUI: *stpInkType\n"); + } + + /* + * Advanced STP options... + */ + + if (stp_get_output_type(printvars) == OUTPUT_COLOR) + num_opts = 8; + else + num_opts = 4; + + for (i = 0; i < num_opts; i ++) + { + gzprintf(fp, "*OpenUI *%s/%s: PickOne\n", stp_options[i].name, + stp_options[i].text); + gzprintf(fp, "*Default%s: 1000\n", stp_options[i].name); + for (j = stp_options[i].low; + j <= stp_options[i].high; + j += stp_options[i].step) + gzprintf(fp, "*%s %d/%.3f: \"\"\n", stp_options[i].name, j, j * 0.001); + gzprintf(fp, "*CloseUI *%s\n", stp_options[i].name); + } + + /* + * End of STP option group... + */ + + gzputs(fp, "*CloseGroup: STP\n"); + + /* + * Fonts... + */ + + gzputs(fp, "*DefaultFont: Courier\n"); + gzputs(fp, "*Font AvantGarde-Book: Standard \"(001.006S)\" Standard ROM\n"); + gzputs(fp, "*Font AvantGarde-BookOblique: Standard \"(001.006S)\" Standard ROM\n"); + gzputs(fp, "*Font AvantGarde-Demi: Standard \"(001.007S)\" Standard ROM\n"); + gzputs(fp, "*Font AvantGarde-DemiOblique: Standard \"(001.007S)\" Standard ROM\n"); + gzputs(fp, "*Font Bookman-Demi: Standard \"(001.004S)\" Standard ROM\n"); + gzputs(fp, "*Font Bookman-DemiItalic: Standard \"(001.004S)\" Standard ROM\n"); + gzputs(fp, "*Font Bookman-Light: Standard \"(001.004S)\" Standard ROM\n"); + gzputs(fp, "*Font Bookman-LightItalic: Standard \"(001.004S)\" Standard ROM\n"); + gzputs(fp, "*Font Courier: Standard \"(002.004S)\" Standard ROM\n"); + gzputs(fp, "*Font Courier-Bold: Standard \"(002.004S)\" Standard ROM\n"); + gzputs(fp, "*Font Courier-BoldOblique: Standard \"(002.004S)\" Standard ROM\n"); + gzputs(fp, "*Font Courier-Oblique: Standard \"(002.004S)\" Standard ROM\n"); + gzputs(fp, "*Font Helvetica: Standard \"(001.006S)\" Standard ROM\n"); + gzputs(fp, "*Font Helvetica-Bold: Standard \"(001.007S)\" Standard ROM\n"); + gzputs(fp, "*Font Helvetica-BoldOblique: Standard \"(001.007S)\" Standard ROM\n"); + gzputs(fp, "*Font Helvetica-Narrow: Standard \"(001.006S)\" Standard ROM\n"); + gzputs(fp, "*Font Helvetica-Narrow-Bold: Standard \"(001.007S)\" Standard ROM\n"); + gzputs(fp, "*Font Helvetica-Narrow-BoldOblique: Standard \"(001.007S)\" Standard ROM\n"); + gzputs(fp, "*Font Helvetica-Narrow-Oblique: Standard \"(001.006S)\" Standard ROM\n"); + gzputs(fp, "*Font Helvetica-Oblique: Standard \"(001.006S)\" Standard ROM\n"); + gzputs(fp, "*Font NewCenturySchlbk-Bold: Standard \"(001.009S)\" Standard ROM\n"); + gzputs(fp, "*Font NewCenturySchlbk-BoldItalic: Standard \"(001.007S)\" Standard ROM\n"); + gzputs(fp, "*Font NewCenturySchlbk-Italic: Standard \"(001.006S)\" Standard ROM\n"); + gzputs(fp, "*Font NewCenturySchlbk-Roman: Standard \"(001.007S)\" Standard ROM\n"); + gzputs(fp, "*Font Palatino-Bold: Standard \"(001.005S)\" Standard ROM\n"); + gzputs(fp, "*Font Palatino-BoldItalic: Standard \"(001.005S)\" Standard ROM\n"); + gzputs(fp, "*Font Palatino-Italic: Standard \"(001.005S)\" Standard ROM\n"); + gzputs(fp, "*Font Palatino-Roman: Standard \"(001.005S)\" Standard ROM\n"); + gzputs(fp, "*Font Symbol: Special \"(001.007S)\" Special ROM\n"); + gzputs(fp, "*Font Times-Bold: Standard \"(001.007S)\" Standard ROM\n"); + gzputs(fp, "*Font Times-BoldItalic: Standard \"(001.009S)\" Standard ROM\n"); + gzputs(fp, "*Font Times-Italic: Standard \"(001.007S)\" Standard ROM\n"); + gzputs(fp, "*Font Times-Roman: Standard \"(001.007S)\" Standard ROM\n"); + gzputs(fp, "*Font ZapfChancery-MediumItalic: Standard \"(001.007S)\" Standard ROM\n"); + gzputs(fp, "*Font ZapfDingbats: Special \"(001.004S)\" Standard ROM\n"); + + gzprintf(fp, "*%%End of %s.ppd\n", driver); + + gzclose(fp); + + stp_free_vars(v); + return (0); +} + +/* + * End of "$Id: genppd.c,v 1.36 2001/11/11 21:25:36 rlk Exp $". + */ diff --git a/src/cups/rastertoprinter.c b/src/cups/rastertoprinter.c new file mode 100644 index 0000000..63d1676 --- /dev/null +++ b/src/cups/rastertoprinter.c @@ -0,0 +1,759 @@ +/* + * "$Id: rastertoprinter.c,v 1.19 2001/09/02 13:30:26 rlk Exp $" + * + * GIMP-print based raster filter for the Common UNIX Printing System. + * + * Copyright 1993-2001 by Easy Software Products. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * 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, please contact Easy Software + * Products at: + * + * Attn: CUPS Licensing Information + * Easy Software Products + * 44141 Airport View Drive, Suite 204 + * Hollywood, Maryland 20636-3111 USA + * + * Voice: (301) 373-9603 + * EMail: cups-info@cups.org + * WWW: http://www.cups.org + * + * Contents: + * + * main() - Main entry and processing of driver. + * cups_writefunc() - Write data to a file... + * cancel_job() - Cancel the current job... + * Image_bpp() - Return the bytes-per-pixel of an image. + * Image_get_appname() - Get the application we are running. + * Image_get_row() - Get one row of the image. + * Image_height() - Return the height of an image. + * Image_init() - Initialize an image. + * Image_note_progress() - Notify the user of our progress. + * Image_progress_conclude() - Close the progress display. + * Image_progress_init() - Initialize progress display. + * Image_rotate_ccw() - Rotate the image counter-clockwise + * (unsupported). + * Image_width() - Return the width of an image. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef INCLUDE_GIMP_PRINT_H +#include INCLUDE_GIMP_PRINT_H +#else +#include +#endif +#include "../../lib/libprintut.h" + +/* + * Structure for page raster data... + */ + +typedef struct +{ + cups_raster_t *ras; /* Raster stream to read from */ + int page; /* Current page number */ + int row; /* Current row number */ + cups_page_header_t header; /* Page header from file */ +} cups_image_t; + +static void cups_writefunc(void *file, const char *buf, size_t bytes); +static void cancel_job(int sig); +static const char *Image_get_appname(stp_image_t *image); +static void Image_progress_conclude(stp_image_t *image); +static void Image_note_progress(stp_image_t *image, + double current, double total); +static void Image_progress_init(stp_image_t *image); +static stp_image_status_t Image_get_row(stp_image_t *image, + unsigned char *data, int row); +static int Image_height(stp_image_t *image); +static int Image_width(stp_image_t *image); +static int Image_bpp(stp_image_t *image); +static void Image_rotate_180(stp_image_t *image); +static void Image_rotate_cw(stp_image_t *image); +static void Image_rotate_ccw(stp_image_t *image); +static void Image_init(stp_image_t *image); + +static stp_image_t theImage = +{ + Image_init, + NULL, /* reset */ + NULL, /* transpose */ + NULL, /* hflip */ + NULL, /* vflip */ + NULL, /* crop */ + Image_rotate_ccw, + Image_rotate_cw, + Image_rotate_180, + Image_bpp, + Image_width, + Image_height, + Image_get_row, + Image_get_appname, + Image_progress_init, + Image_note_progress, + Image_progress_conclude, + NULL +}; + +static volatile stp_image_status_t Image_status; + +/* + * 'main()' - Main entry and processing of driver. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int fd; /* File descriptor */ + cups_image_t cups; /* CUPS image */ + const char *ppdfile; /* PPD environment variable */ + ppd_file_t *ppd; /* PPD file */ + ppd_option_t *option; /* PPD option */ + stp_printer_t printer; /* Printer driver */ + stp_vars_t v; /* Printer driver variables */ + stp_papersize_t size; /* Paper size */ + char *buffer; /* Overflow buffer */ + int num_options; /* Number of CUPS options */ + cups_option_t *options; /* CUPS options */ + const char *val; /* CUPS option value */ + int num_res; /* Number of printer resolutions */ + stp_param_t *res; /* Printer resolutions */ + float stp_gamma, /* STP options */ + stp_brightness, + stp_cyan, + stp_magenta, + stp_yellow, + stp_contrast, + stp_saturation, + stp_density; + + + /* + * Initialise libgimpprint + */ + + theImage.rep = ∪︀ + + stp_init(); + + /* + * Check for valid arguments... + */ + + if (argc < 6 || argc > 7) + { + /* + * We don't have the correct number of arguments; write an error message + * and return. + */ + + fputs("ERROR: rastertoprinter job-id user title copies options [file]\n", stderr); + return (1); + } + + Image_status = STP_IMAGE_OK; + + /* + * Get the PPD file... + */ + + if ((ppdfile = getenv("PPD")) == NULL) + { + fputs("ERROR: Fatal error: PPD environment variable not set!\n", stderr); + return (1); + } + + if ((ppd = ppdOpenFile(ppdfile)) == NULL) + { + fprintf(stderr, "ERROR: Fatal error: Unable to load PPD file \"%s\"!\n", + ppdfile); + return (1); + } + + if (ppd->modelname == NULL) + { + fprintf(stderr, "ERROR: Fatal error: No ModelName attribute in PPD file \"%s\"!\n", + ppdfile); + ppdClose(ppd); + return (1); + } + + /* + * Get the STP options, if any... + */ + + num_options = cupsParseOptions(argv[5], 0, &options); + + if ((val = cupsGetOption("stpGamma", num_options, options)) != NULL) + stp_gamma = atof(val) * 0.001; + else if ((option = ppdFindOption(ppd, "stpGamma")) != NULL) + stp_gamma = atof(option->defchoice) * 0.001; + else + stp_gamma = 1.0; + + if ((val = cupsGetOption("stpBrightness", num_options, options)) != NULL) + stp_brightness = atof(val) * 0.001; + else if ((option = ppdFindOption(ppd, "stpBrightness")) != NULL) + stp_brightness = atof(option->defchoice) * 0.001; + else + stp_brightness = 1.0; + + if ((val = cupsGetOption("stpCyan", num_options, options)) != NULL) + stp_cyan = atof(val) * 0.001; + else if ((option = ppdFindOption(ppd, "stpCyan")) != NULL) + stp_cyan = atof(option->defchoice) * 0.001; + else + stp_cyan = 1.0; + + if ((val = cupsGetOption("stpMagenta", num_options, options)) != NULL) + stp_magenta = atof(val) * 0.001; + else if ((option = ppdFindOption(ppd, "stpMagenta")) != NULL) + stp_magenta = atof(option->defchoice) * 0.001; + else + stp_magenta = 1.0; + + if ((val = cupsGetOption("stpYellow", num_options, options)) != NULL) + stp_yellow = atof(val) * 0.001; + else if ((option = ppdFindOption(ppd, "stpYellow")) != NULL) + stp_yellow = atof(option->defchoice) * 0.001; + else + stp_yellow = 1.0; + + if ((val = cupsGetOption("stpContrast", num_options, options)) != NULL) + stp_contrast = atof(val) * 0.001; + else if ((option = ppdFindOption(ppd, "stpContrast")) != NULL) + stp_contrast = atof(option->defchoice) * 0.001; + else + stp_contrast = 1.0; + + if ((val = cupsGetOption("stpSaturation", num_options, options)) != NULL) + stp_saturation = atof(val) * 0.001; + else if ((option = ppdFindOption(ppd, "stpSaturation")) != NULL) + stp_saturation = atof(option->defchoice) * 0.001; + else + stp_saturation = 1.0; + + if ((val = cupsGetOption("stpDensity", num_options, options)) != NULL) + stp_density = atof(val) * 0.001; + else if ((option = ppdFindOption(ppd, "stpDensity")) != NULL) + stp_density = atof(option->defchoice) * 0.001; + else + stp_density = 1.0; + + /* + * Figure out which driver to use... + */ + + if ((printer = stp_get_printer_by_driver(ppd->modelname)) == NULL) + { + fprintf(stderr, "ERROR: Fatal error: Unable to find driver named \"%s\"!\n", + ppd->modelname); + ppdClose(ppd); + return (1); + } + + ppdClose(ppd); + + /* + * Get the resolution options... + */ + + res = stp_printer_get_printfuncs(printer)->parameters(printer, NULL, + "Resolution", &num_res); + + /* + * Open the page stream... + */ + + if (argc == 7) + { + if ((fd = open(argv[6], O_RDONLY)) == -1) + { + perror("ERROR: Unable to open raster file - "); + sleep(1); + return (1); + } + } + else + fd = 0; + + cups.ras = cupsRasterOpen(fd, CUPS_RASTER_READ); + + /* + * Process pages as needed... + */ + + cups.page = 0; + + while (cupsRasterReadHeader(cups.ras, &cups.header)) + { + /* + * Update the current page... + */ + + cups.page ++; + cups.row = 0; + + /* + * Debugging info... + */ + + fprintf(stderr, "DEBUG: StartPage...\n"); + fprintf(stderr, "DEBUG: MediaClass = \"%s\"\n", cups.header.MediaClass); + fprintf(stderr, "DEBUG: MediaColor = \"%s\"\n", cups.header.MediaColor); + fprintf(stderr, "DEBUG: MediaType = \"%s\"\n", cups.header.MediaType); + fprintf(stderr, "DEBUG: OutputType = \"%s\"\n", cups.header.OutputType); + + fprintf(stderr, "DEBUG: AdvanceDistance = %d\n", cups.header.AdvanceDistance); + fprintf(stderr, "DEBUG: AdvanceMedia = %d\n", cups.header.AdvanceMedia); + fprintf(stderr, "DEBUG: Collate = %d\n", cups.header.Collate); + fprintf(stderr, "DEBUG: CutMedia = %d\n", cups.header.CutMedia); + fprintf(stderr, "DEBUG: Duplex = %d\n", cups.header.Duplex); + fprintf(stderr, "DEBUG: HWResolution = [ %d %d ]\n", cups.header.HWResolution[0], + cups.header.HWResolution[1]); + fprintf(stderr, "DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n", + cups.header.ImagingBoundingBox[0], cups.header.ImagingBoundingBox[1], + cups.header.ImagingBoundingBox[2], cups.header.ImagingBoundingBox[3]); + fprintf(stderr, "DEBUG: InsertSheet = %d\n", cups.header.InsertSheet); + fprintf(stderr, "DEBUG: Jog = %d\n", cups.header.Jog); + fprintf(stderr, "DEBUG: LeadingEdge = %d\n", cups.header.LeadingEdge); + fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", cups.header.Margins[0], + cups.header.Margins[1]); + fprintf(stderr, "DEBUG: ManualFeed = %d\n", cups.header.ManualFeed); + fprintf(stderr, "DEBUG: MediaPosition = %d\n", cups.header.MediaPosition); + fprintf(stderr, "DEBUG: MediaWeight = %d\n", cups.header.MediaWeight); + fprintf(stderr, "DEBUG: MirrorPrint = %d\n", cups.header.MirrorPrint); + fprintf(stderr, "DEBUG: NegativePrint = %d\n", cups.header.NegativePrint); + fprintf(stderr, "DEBUG: NumCopies = %d\n", cups.header.NumCopies); + fprintf(stderr, "DEBUG: Orientation = %d\n", cups.header.Orientation); + fprintf(stderr, "DEBUG: OutputFaceUp = %d\n", cups.header.OutputFaceUp); + fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", cups.header.PageSize[0], + cups.header.PageSize[1]); + fprintf(stderr, "DEBUG: Separations = %d\n", cups.header.Separations); + fprintf(stderr, "DEBUG: TraySwitch = %d\n", cups.header.TraySwitch); + fprintf(stderr, "DEBUG: Tumble = %d\n", cups.header.Tumble); + fprintf(stderr, "DEBUG: cupsWidth = %d\n", cups.header.cupsWidth); + fprintf(stderr, "DEBUG: cupsHeight = %d\n", cups.header.cupsHeight); + fprintf(stderr, "DEBUG: cupsMediaType = %d\n", cups.header.cupsMediaType); + fprintf(stderr, "DEBUG: cupsBitsPerColor = %d\n", cups.header.cupsBitsPerColor); + fprintf(stderr, "DEBUG: cupsBitsPerPixel = %d\n", cups.header.cupsBitsPerPixel); + fprintf(stderr, "DEBUG: cupsBytesPerLine = %d\n", cups.header.cupsBytesPerLine); + fprintf(stderr, "DEBUG: cupsColorOrder = %d\n", cups.header.cupsColorOrder); + fprintf(stderr, "DEBUG: cupsColorSpace = %d\n", cups.header.cupsColorSpace); + fprintf(stderr, "DEBUG: cupsCompression = %d\n", cups.header.cupsCompression); + fprintf(stderr, "DEBUG: cupsRowCount = %d\n", cups.header.cupsRowCount); + fprintf(stderr, "DEBUG: cupsRowFeed = %d\n", cups.header.cupsRowFeed); + fprintf(stderr, "DEBUG: cupsRowStep = %d\n", cups.header.cupsRowStep); + + /* + * Setup printer driver variables... + */ + + v = stp_allocate_copy(stp_printer_get_printvars(printer)); + + stp_set_app_gamma(v, 1.0); + stp_set_brightness(v, stp_brightness); + stp_set_contrast(v, stp_contrast); + stp_set_cyan(v, stp_cyan); + stp_set_magenta(v, stp_magenta); + stp_set_yellow(v, stp_yellow); + stp_set_saturation(v, stp_saturation); + stp_set_density(v, stp_density); + stp_set_scaling(v, 0); /* No scaling */ + stp_set_cmap(v, NULL); + stp_set_page_width(v, cups.header.PageSize[0]); + stp_set_page_height(v, cups.header.PageSize[1]); + stp_set_orientation(v, ORIENT_PORTRAIT); + stp_set_gamma(v, stp_gamma); + stp_set_image_type(v, cups.header.cupsRowCount); + stp_set_outfunc(v, cups_writefunc); + stp_set_errfunc(v, cups_writefunc); + stp_set_outdata(v, stdout); + stp_set_errdata(v, stderr); + + switch (cups.header.cupsColorSpace) + { + case CUPS_CSPACE_W : + stp_set_output_type(v, OUTPUT_GRAY); + break; + case CUPS_CSPACE_K : + stp_set_output_type(v, OUTPUT_MONOCHROME); + break; + case CUPS_CSPACE_RGB : + stp_set_output_type(v, OUTPUT_COLOR); + break; + case CUPS_CSPACE_CMYK : + stp_set_output_type(v, OUTPUT_RAW_CMYK); + break; + default : + fprintf(stderr, "ERROR: Bad colorspace %d!", + cups.header.cupsColorSpace); + break; + } + + if (cups.header.cupsRowStep >= stp_dither_algorithm_count()) + fprintf(stderr, "ERROR: Unable to set dither algorithm!\n"); + else + stp_set_dither_algorithm(v, + stp_dither_algorithm_name(cups.header.cupsRowStep)); + + stp_set_media_source(v, cups.header.MediaClass); + stp_set_media_type(v, cups.header.MediaType); + stp_set_ink_type(v, cups.header.OutputType); + + fprintf(stderr, "DEBUG: PageSize = %dx%d\n", cups.header.PageSize[0], + cups.header.PageSize[1]); + + if ((size = stp_get_papersize_by_size(cups.header.PageSize[1], + cups.header.PageSize[0])) != NULL) + stp_set_media_size(v, stp_papersize_get_name(size)); + else + fprintf(stderr, "ERROR: Unable to get media size!\n"); + + if (cups.header.cupsCompression >= num_res) + fprintf(stderr, "ERROR: Unable to set printer resolution!\n"); + else + stp_set_resolution(v, res[cups.header.cupsCompression].name); + + /* + * Print the page... + */ + + stp_merge_printvars(v, stp_printer_get_printvars(printer)); + fprintf(stderr, "DEBUG: stp_get_output_to(v) |%s|\n", stp_get_output_to(v)); + fprintf(stderr, "DEBUG: stp_get_driver(v) |%s|\n", stp_get_driver(v)); + fprintf(stderr, "DEBUG: stp_get_ppd_file(v) |%s|\n", stp_get_ppd_file(v)); + fprintf(stderr, "DEBUG: stp_get_resolution(v) |%s|\n", stp_get_resolution(v)); + fprintf(stderr, "DEBUG: stp_get_media_size(v) |%s|\n", stp_get_media_size(v)); + fprintf(stderr, "DEBUG: stp_get_media_type(v) |%s|\n", stp_get_media_type(v)); + fprintf(stderr, "DEBUG: stp_get_media_source(v) |%s|\n", stp_get_media_source(v)); + fprintf(stderr, "DEBUG: stp_get_ink_type(v) |%s|\n", stp_get_ink_type(v)); + fprintf(stderr, "DEBUG: stp_get_dither_algorithm(v) |%s|\n", stp_get_dither_algorithm(v)); + fprintf(stderr, "DEBUG: stp_get_output_type(v) |%d|\n", stp_get_output_type(v)); + fprintf(stderr, "DEBUG: stp_get_orientation(v) |%d|\n", stp_get_orientation(v)); + fprintf(stderr, "DEBUG: stp_get_left(v) |%d|\n", stp_get_left(v)); + fprintf(stderr, "DEBUG: stp_get_top(v) |%d|\n", stp_get_top(v)); + fprintf(stderr, "DEBUG: stp_get_image_type(v) |%d|\n", stp_get_image_type(v)); + fprintf(stderr, "DEBUG: stp_get_unit(v) |%d|\n", stp_get_unit(v)); + fprintf(stderr, "DEBUG: stp_get_page_width(v) |%d|\n", stp_get_page_width(v)); + fprintf(stderr, "DEBUG: stp_get_page_height(v) |%d|\n", stp_get_page_height(v)); + fprintf(stderr, "DEBUG: stp_get_input_color_model(v) |%d|\n", stp_get_input_color_model(v)); + fprintf(stderr, "DEBUG: stp_get_output_color_model(v) |%d|\n", stp_get_output_color_model(v)); + fprintf(stderr, "DEBUG: stp_get_brightness(v) |%.3f|\n", stp_get_brightness(v)); + fprintf(stderr, "DEBUG: stp_get_scaling(v) |%.3f|\n", stp_get_scaling(v)); + fprintf(stderr, "DEBUG: stp_get_gamma(v) |%.3f|\n", stp_get_gamma(v)); + fprintf(stderr, "DEBUG: stp_get_contrast(v) |%.3f|\n", stp_get_contrast(v)); + fprintf(stderr, "DEBUG: stp_get_cyan(v) |%.3f|\n", stp_get_cyan(v)); + fprintf(stderr, "DEBUG: stp_get_magenta(v) |%.3f|\n", stp_get_magenta(v)); + fprintf(stderr, "DEBUG: stp_get_yellow(v) |%.3f|\n", stp_get_yellow(v)); + fprintf(stderr, "DEBUG: stp_get_saturation(v) |%.3f|\n", stp_get_saturation(v)); + fprintf(stderr, "DEBUG: stp_get_density(v) |%.3f|\n", stp_get_density(v)); + fprintf(stderr, "DEBUG: stp_get_app_gamma(v) |%.3f|\n", stp_get_app_gamma(v)); + if (stp_printer_get_printfuncs(printer)->verify(printer, v)) + { + signal(SIGTERM, cancel_job); + stp_printer_get_printfuncs(printer)->print(printer, &theImage, v); + } + else + fputs("ERROR: Invalid printer settings!\n", stderr); + + /* + * Purge any remaining bitmap data... + */ + + if (cups.row < cups.header.cupsHeight) + { + if ((buffer = xmalloc(cups.header.cupsBytesPerLine)) == NULL) + break; + + while (cups.row < cups.header.cupsHeight) + { + cupsRasterReadPixels(cups.ras, (unsigned char *)buffer, + cups.header.cupsBytesPerLine); + cups.row ++; + } + } + + stp_free_vars(v); + } + + /* + * Close the raster stream... + */ + + cupsRasterClose(cups.ras); + if (fd != 0) + close(fd); + + /* + * If no pages were printed, send an error message... + */ + + if (cups.page == 0) + fputs("ERROR: No pages found!\n", stderr); + else + fputs("INFO: Ready to print.\n", stderr); + + return (cups.page == 0); +} + + +/* + * 'cups_writefunc()' - Write data to a file... + */ + +static void +cups_writefunc(void *file, const char *buf, size_t bytes) +{ + FILE *prn = (FILE *)file; + fwrite(buf, 1, bytes, prn); +} + + +/* + * 'cancel_job()' - Cancel the current job... + */ + +void +cancel_job(int sig) /* I - Signal */ +{ + (void)sig; + + Image_status = STP_IMAGE_ABORT; +} + + +/* + * 'Image_bpp()' - Return the bytes-per-pixel of an image. + */ + +static int /* O - Bytes per pixel */ +Image_bpp(stp_image_t *image) /* I - Image */ +{ + cups_image_t *cups; /* CUPS image */ + + + if ((cups = (cups_image_t *)(image->rep)) == NULL) + return (0); + + /* + * For now, we only support RGB and grayscale input from the + * raster filters. + */ + + switch (cups->header.cupsColorSpace) + { + default : + return (1); + case CUPS_CSPACE_RGB : + return (3); + case CUPS_CSPACE_CMYK : + return (4); + } +} + + +/* + * 'Image_get_appname()' - Get the application we are running. + */ + +static const char * /* O - Application name */ +Image_get_appname(stp_image_t *image) /* I - Image */ +{ + (void)image; + + return ("CUPS 1.1.x driver based on GIMP-print"); +} + + +/* + * 'Image_get_row()' - Get one row of the image. + */ + +stp_image_status_t +Image_get_row(stp_image_t *image, /* I - Image */ + unsigned char *data, /* O - Row */ + int row) /* I - Row number (unused) */ +{ + cups_image_t *cups; /* CUPS image */ + int i; /* Looping var */ + + + if ((cups = (cups_image_t *)(image->rep)) == NULL) + return STP_IMAGE_ABORT; + + if (cups->row < cups->header.cupsHeight) + { + cupsRasterReadPixels(cups->ras, data, cups->header.cupsBytesPerLine); + cups->row ++; + + /* + * Invert black data for monochrome output... + */ + + if (cups->header.cupsColorSpace == CUPS_CSPACE_K) + for (i = cups->header.cupsBytesPerLine; i > 0; i --, data ++) + *data = 255 - *data; + } + else + memset(data, 255, cups->header.cupsBytesPerLine); + return Image_status; +} + + +/* + * 'Image_height()' - Return the height of an image. + */ + +static int /* O - Height in pixels */ +Image_height(stp_image_t *image) /* I - Image */ +{ + cups_image_t *cups; /* CUPS image */ + + + if ((cups = (cups_image_t *)(image->rep)) == NULL) + return (0); + + return (cups->header.cupsHeight); +} + + +/* + * 'Image_init()' - Initialize an image. + */ + +static void +Image_init(stp_image_t *image) /* I - Image */ +{ + (void)image; +} + + +/* + * 'Image_note_progress()' - Notify the user of our progress. + */ + +void +Image_note_progress(stp_image_t *image, /* I - Image */ + double current, /* I - Current progress */ + double total) /* I - Maximum progress */ +{ + cups_image_t *cups; /* CUPS image */ + + + if ((cups = (cups_image_t *)(image->rep)) == NULL) + return; + + fprintf(stderr, "INFO: Printing page %d, %.0f%%\n", + cups->page, 100.0 * current / total); +} + + +/* + * 'Image_progress_conclude()' - Close the progress display. + */ + +static void +Image_progress_conclude(stp_image_t *image) /* I - Image */ +{ + cups_image_t *cups; /* CUPS image */ + + + if ((cups = (cups_image_t *)(image->rep)) == NULL) + return; + + fprintf(stderr, "INFO: Finished page %d...\n", cups->page); +} + + +/* + * 'Image_progress_init()' - Initialize progress display. + */ + +static void +Image_progress_init(stp_image_t *image)/* I - Image */ +{ + cups_image_t *cups; /* CUPS image */ + + + if ((cups = (cups_image_t *)(image->rep)) == NULL) + return; + + fprintf(stderr, "INFO: Starting page %d...\n", cups->page); +} + + +/* + * 'Image_rotate_180()' - Rotate the image 180 degrees (unsupported). + */ + +static void +Image_rotate_180(stp_image_t *image) /* I - Image */ +{ + (void)image; +} + + +/* + * 'Image_rotate_ccw()' - Rotate the image counter-clockwise (unsupported). + */ + +static void +Image_rotate_ccw(stp_image_t *image) /* I - Image */ +{ + (void)image; +} + + +/* + * 'Image_rotate_cw()' - Rotate the image clockwise (unsupported). + */ + +static void +Image_rotate_cw(stp_image_t *image) /* I - Image */ +{ + (void)image; +} + + +/* + * 'Image_width()' - Return the width of an image. + */ + +static int /* O - Width in pixels */ +Image_width(stp_image_t *image) /* I - Image */ +{ + cups_image_t *cups; /* CUPS image */ + + + if ((cups = (cups_image_t *)(image->rep)) == NULL) + return (0); + + return (cups->header.cupsWidth); +} + + +/* + * End of "$Id: rastertoprinter.c,v 1.19 2001/09/02 13:30:26 rlk Exp $". + */ diff --git a/src/escputil/.cvsignore b/src/escputil/.cvsignore new file mode 100644 index 0000000..5da45ee --- /dev/null +++ b/src/escputil/.cvsignore @@ -0,0 +1,5 @@ +.deps +.libs +Makefile +Makefile.in +escputil diff --git a/src/escputil/Makefile.am b/src/escputil/Makefile.am new file mode 100644 index 0000000..d730545 --- /dev/null +++ b/src/escputil/Makefile.am @@ -0,0 +1,48 @@ +## $id: makefile.am,v 1.9 2001/06/03 18:35:03 rleigh Exp $ +## Copyright (C) 2000 Roger Leigh +## +## 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, or (at your option) +## any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +## Process this file with automake to produce Makefile.in. + +AUTOMAKE_OPTIONS = 1.4 gnu + +@SET_MAKE@ + +MAINT_CHARSET = latin1 + + +## Variables + +AM_CFLAGS = $(GNUCFLAGS) +INCLUDES = @INCLUDES@ +LIBS = @LIBS@ ../../lib/libprintut.la $(INTLLIBS) ../../lib/libprintut.la + + +## Programs + +ESCPUTIL_BIN = escputil + +bin_PROGRAMS = @ESCPUTIL_BIN@ + +EXTRA_PROGRAMS = escputil + +escputil_LDADD = $(LIBREADLINE_DEPS) + + +## Clean + +CLEANFILES = $(EXTRA_PROGRAMS) +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/escputil/escputil.c b/src/escputil/escputil.c new file mode 100644 index 0000000..954ff3c --- /dev/null +++ b/src/escputil/escputil.c @@ -0,0 +1,1277 @@ +/* + * "$Id: escputil.c,v 1.39 2001/10/27 17:16:38 rlk Exp $" + * + * Printer maintenance utility for EPSON Stylus (R) printers + * + * Copyright 2000 Robert Krawitz (rlk@alum.mit.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include "../../lib/libprintut.h" +#include +#include +#include +#include +#include +#include +#if defined(HAVE_VARARGS_H) && !defined(HAVE_STDARG_H) +#include +#else +#include +#endif +#ifdef HAVE_POLL +#include +#endif +#ifdef __GNU_LIBRARY__ +#include +#endif +#ifdef HAVE_READLINE_READLINE_H +#include +#endif +#ifdef HAVE_READLINE_HISTORY_H +#include +#endif +#include + +void do_align(void); +void do_align_color(void); +char *do_get_input (const char *prompt); +void do_head_clean(void); +void do_help(int code); +void do_identify(void); +void do_ink_level(void); +void do_nozzle_check(void); +void do_status(void); +int do_print_cmd(void); + + +const char *banner = N_("\ +Escputil version " VERSION ", Copyright (C) 2000-2001 Robert Krawitz\n\ +Escputil comes with ABSOLUTELY NO WARRANTY; for details type 'escputil -l'\n\ +This is free software, and you are welcome to redistribute it\n\ +under certain conditions; type 'escputil -l' for details.\n"); + +const char *license = N_("\ +Copyright 2000 Robert Krawitz (rlk@alum.mit.edu)\n\ +\n\ +This program is free software; you can redistribute it and/or modify it\n\ +under the terms of the GNU General Public License as published by the Free\n\ +Software Foundation; either version 2 of the License, or (at your option)\n\ +any later version.\n\ +\n\ +This program is distributed in the hope that it will be useful, but\n\ +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n\ +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\n\ +for more details.\n\ +\n\ +You should have received a copy of the GNU General Public License\n\ +along with this program; if not, write to the Free Software\n\ +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n"); + + +#ifdef __GNU_LIBRARY__ + +struct option optlist[] = +{ + { "printer-name", 1, NULL, (int) 'P' }, + { "raw-device", 1, NULL, (int) 'r' }, + { "ink-level", 0, NULL, (int) 'i' }, + { "clean-head", 0, NULL, (int) 'c' }, + { "nozzle-check", 0, NULL, (int) 'n' }, + { "align-head", 0, NULL, (int) 'a' }, + { "align-color", 0, NULL, (int) 'o' }, + { "status", 0, NULL, (int) 's' }, + { "new", 0, NULL, (int) 'u' }, + { "help", 0, NULL, (int) 'h' }, + { "identify", 0, NULL, (int) 'd' }, + { "model", 1, NULL, (int) 'm' }, + { "quiet", 0, NULL, (int) 'q' }, + { "license", 0, NULL, (int) 'l' }, + { "list-models", 0, NULL, (int) 'M' }, + { NULL, 0, NULL, 0 } +}; + +const char *help_msg = N_("\ +Usage: escputil [-c | -n | -a | -i | -o | -s | -d | -l | -M]\n\ + [-P printer | -r device] [-u] [-q] [-m model]\n\ +Perform maintenance on EPSON Stylus (R) printers.\n\ +Examples: escputil --clean-head --printer stpex-on-third-floor\n\ + escputil --ink-level --new --raw-device /dev/lp0\n\ +\n\ + Commands:\n\ + -c|--clean-head Clean the print head.\n\ + -n|--nozzle-check Print a nozzle test pattern.\n\ + Dirty or clogged nozzles will show as gaps in the\n\ + pattern. If you see any gaps, you should clean\n\ + the print head.\n\ + -a|--align-head Align the print head. CAUTION: Misuse of this\n\ + utility may result in poor print quality and/or\n\ + damage to the printer.\n\ + -o|--align-color Align the color print head (Stylus Color 480 and 580\n\ + only). CAUTION: Misuse of this utility may result in\n\ + poor print quality and/or damage to the printer.\n\ + -s|--status Retrieve printer status.\n\ + -i|--ink-level Obtain the ink level from the printer. This requires\n\ + read/write access to the raw printer device.\n\ + -d|--identify Query the printer for make and model information.\n\ + This requires read/write access to the raw printer\n\ + device.\n\ + -l|--license Display the license/warranty terms of this program.\n\ + -M|--list-models List the available printer models.\n\ + -h|--help Print this help message.\n\ + Options:\n\ + -P|--printer-name Specify the name of the printer queue to operate on.\n\ + Default is the default system printer.\n\ + -r|--raw-device Specify the name of the device to write to directly\n\ + rather than going through a printer queue.\n\ + -u|--new The printer is a new printer (Stylus Color 740 or\n\ + newer).\n\ + -q|--quiet Suppress the banner.\n\ + -m|--model Specify the precise printer model for head alignment.\n"); +#else +const char *help_msg = N_("\ +Usage: escputil [OPTIONS] [COMMAND]\n\ +Usage: escputil [-c | -n | -a | -i | -o | -s | -d | -l | -M]\n\ + [-P printer | -r device] [-u] [-q] [-m model]\n\ +Perform maintenance on EPSON Stylus (R) printers.\n\ +Examples: escputil -c -P stpex-on-third-floor\n\ + escputil -i -u -r /dev/lp0\n\ +\n\ + Commands:\n\ + -c Clean the print head.\n\ + -n Print a nozzle test pattern.\n\ + Dirty or clogged nozzles will show as gaps in the\n\ + pattern. If you see any gaps, you should clean\n\ + the print head.\n\ + -a Align the print head. CAUTION: Misuse of this\n\ + utility may result in poor print quality and/or\n\ + damage to the printer.\n\ + -o Align the color print head (Stylus Color 480 and 580\n\ + only). CAUTION: Misuse of this utility may result in\n\ + poor print quality and/or damage to the printer.\n\ + -s Retrieve printer status.\n\ + -i Obtain the ink level from the printer. This requires\n\ + read/write access to the raw printer device.\n\ + -d Query the printer for make and model information. This\n\ + requires read/write access to the raw printer device.\n\ + -l Display the license/warranty terms of this program.\n\ + -M List the available printer models.\n\ + -h Print this help message.\n\ + Options:\n\ + -P Specify the name of the printer queue to operate on.\n\ + Default is the default system printer.\n\ + -r Specify the name of the device to write to directly\n\ + rather than going through a printer queue.\n\ + -u The printer is a new printer (Stylus Color 740 or newer).\n\ + -q Suppress the banner.\n\ + -m Specify the precise printer model for head alignment.\n"); +#endif + +typedef struct +{ + const char *short_name; + const char *long_name; + int passes; + int choices; + int ink_change; + int color_passes; + int color_choices; +} stp_printer_t; + +stp_printer_t printer_list[] = +{ + { "C20sx", N_("Stylus C20sx"), 3, 15, 0, 2, 9 }, + { "C20ux", N_("Stylus C20ux"), 3, 15, 0, 2, 9 }, + { "C40sx", N_("Stylus C40sx"), 3, 15, 0, 2, 9 }, + { "C40ux", N_("Stylus C40ux"), 3, 15, 0, 2, 9 }, + { "C60", N_("Stylus C60"), 3, 15, 0, 0, 0 }, + { "C70", N_("Stylus C70"), 3, 15, 0, 2, 9 }, + { "C80", N_("Stylus C80"), 3, 15, 0, 2, 9 }, + { "color", N_("Stylus Color"), 1, 7, 0, 0, 0 }, + { "pro", N_("Stylus Color Pro"), 1, 7, 0, 0, 0 }, + { "pro-xl", N_("Stylus Color Pro XL"),1, 7, 0, 0, 0 }, + { "400", N_("Stylus Color 400"), 1, 7, 0, 0, 0 }, + { "440", N_("Stylus Color 440"), 1, 15, 0, 0, 0 }, + { "460", N_("Stylus Color 460"), 1, 15, 0, 0, 0 }, + { "480", N_("Stylus Color 480"), 3, 15, 1, 2, 9 }, + { "500", N_("Stylus Color 500"), 1, 7, 0, 0, 0 }, + { "580", N_("Stylus Color 580"), 3, 15, 1, 2, 9 }, + { "600", N_("Stylus Color 600"), 1, 7, 0, 0, 0 }, + { "640", N_("Stylus Color 640"), 1, 15, 0, 0, 0 }, + { "660", N_("Stylus Color 660"), 1, 15, 0, 0, 0 }, + { "670", N_("Stylus Color 670"), 3, 15, 0, 0, 0 }, + { "680", N_("Stylus Color 680"), 3, 15, 0, 0, 0 }, + { "740", N_("Stylus Color 740"), 3, 15, 0, 0, 0 }, + { "760", N_("Stylus Color 760"), 3, 15, 0, 0, 0 }, + { "777", N_("Stylus Color 777"), 3, 15, 0, 0, 0 }, + { "800", N_("Stylus Color 800"), 1, 7, 0, 0, 0 }, + { "850", N_("Stylus Color 850"), 1, 7, 0, 0, 0 }, + { "860", N_("Stylus Color 860"), 3, 15, 0, 0, 0 }, + { "880", N_("Stylus Color 880"), 3, 15, 0, 0, 0 }, + { "83", N_("Stylus Color 83"), 3, 15, 0, 0, 0 }, + { "900", N_("Stylus Color 900"), 3, 15, 0, 0, 0 }, + { "980", N_("Stylus Color 980"), 3, 15, 0, 0, 0 }, + { "1160", N_("Stylus Color 1160"),3, 15, 0, 0, 0 }, + { "1500", N_("Stylus Color 1500"),1, 7, 0, 0, 0 }, + { "1520", N_("Stylus Color 1520"),1, 7, 0, 0, 0 }, + { "3000", N_("Stylus Color 3000"),1, 7, 0, 0, 0 }, + { "photo", N_("Stylus Photo"), 1, 7, 0, 0, 0 }, + { "700", N_("Stylus Photo 700"), 1, 7, 0, 0, 0 }, + { "ex", N_("Stylus Photo EX"), 1, 7, 0, 0, 0 }, + { "720", N_("Stylus Photo 720"), 3, 15, 0, 0, 0 }, + { "750", N_("Stylus Photo 750"), 3, 15, 0, 0, 0 }, + { "780", N_("Stylus Photo 780"), 3, 15, 0, 0, 0 }, + { "785", N_("Stylus Photo 785"), 3, 15, 0, 0, 0 }, + { "790", N_("Stylus Photo 790"), 3, 15, 0, 0, 0 }, + { "810", N_("Stylus Photo 810"), 3, 15, 0, 0, 0 }, + { "820", N_("Stylus Photo 820"), 3, 15, 0, 0, 0 }, + { "870", N_("Stylus Photo 870"), 3, 15, 0, 0, 0 }, + { "875", N_("Stylus Photo 875"), 3, 15, 0, 0, 0 }, + { "890", N_("Stylus Photo 890"), 3, 15, 0, 0, 0 }, + { "895", N_("Stylus Photo 895"), 3, 15, 0, 0, 0 }, + { "1200", N_("Stylus Photo 1200"),3, 15, 0, 0, 0 }, + { "1270", N_("Stylus Photo 1270"),3, 15, 0, 0, 0 }, + { "1280", N_("Stylus Photo 1280"),3, 15, 0, 0, 0 }, + { "1290", N_("Stylus Photo 1290"),3, 15, 0, 0, 0 }, + { "2000", N_("Stylus Photo 2000P"),2, 15, 0, 0, 0 }, + { "5000", N_("Stylus Pro 5000"), 1, 7, 0, 0, 0 }, + { "5500", N_("Stylus Pro 5500"), 1, 7, 0, 0, 0 }, + { "7000", N_("Stylus Pro 7000"), 1, 7, 0, 0, 0 }, + { "7500", N_("Stylus Pro 7500"), 1, 7, 0, 0, 0 }, + { "9000", N_("Stylus Pro 9000"), 1, 7, 0, 0, 0 }, + { "9500", N_("Stylus Pro 9500"), 1, 7, 0, 0, 0 }, + { "10000", N_("Stylus Pro 10000"), 3, 15, 0, 0, 0 }, + { "scan2000", N_("Stylus Scan 2000"), 3, 15, 0, 0, 0 }, + { "scan2500", N_("Stylus Scan 2500"), 3, 15, 0, 0, 0 }, + { NULL, NULL, 0, 0, 0, 0, 0 }, +}; + +char *printer = NULL; +char *raw_device = NULL; +char *printer_model = NULL; +char printer_cmd[1025]; +int bufpos = 0; +int isnew = 0; + +static void +print_models(void) +{ + stp_printer_t *printer = &printer_list[0]; + while (printer->short_name) + { + printf("%10s %s\n", printer->short_name, _(printer->long_name)); + printer++; + } +} + +void +do_help(int code) +{ + printf("%s", _(help_msg)); + exit(code); +} + +static void +exit_packet_mode(void) +{ + static char hdr[] = "\000\000\000\033\001@EJL 1284.4\n@EJL \n\033@"; + memcpy(printer_cmd + bufpos, hdr, sizeof(hdr) - 1); /* DON'T include null! */ + bufpos += sizeof(hdr) - 1; +} + +static void +initialize_print_cmd(void) +{ + bufpos = 0; + if (isnew) + exit_packet_mode(); +} + +int +main(int argc, char **argv) +{ + int quiet = 0; + int operation = 0; + int c; + while (1) + { +#ifdef __GNU_LIBRARY__ + int option_index = 0; + c = getopt_long(argc, argv, "P:r:icnaosduqm:hlM", optlist, &option_index); +#else + c = getopt(argc, argv, "P:r:icnaosduqm:hlM"); +#endif + if (c == -1) + break; + switch (c) + { + case 'q': + quiet = 1; + break; + case 'c': + case 'i': + case 'n': + case 'a': + case 'd': + case 's': + case 'o': + if (operation) + do_help(1); + operation = c; + break; + case 'P': + if (printer || raw_device) + { + printf(_("You may only specify one printer or raw device.")); + do_help(1); + } + printer = xmalloc(strlen(optarg) + 1); + strcpy(printer, optarg); + break; + case 'r': + if (printer || raw_device) + { + printf(_("You may only specify one printer or raw device.")); + do_help(1); + } + raw_device = xmalloc(strlen(optarg) + 1); + strcpy(raw_device, optarg); + break; + case 'm': + if (printer_model) + { + printf(_("You may only specify one printer model.")); + do_help(1); + } + printer_model = xmalloc(strlen(optarg) + 1); + strcpy(printer_model, optarg); + break; + case 'u': + isnew = 1; + break; + case 'h': + do_help(0); + break; + case 'l': + printf("%s\n", _(license)); + exit(0); + case 'M': + print_models(); + exit(0); + default: + printf("%s\n", _(banner)); + fprintf(stderr, _("Unknown option %c\n"), c); + do_help(1); + } + } + if (!quiet) + printf("%s\n", banner); + if (operation == 0) + { + fprintf(stderr, "Usage: %s [OPTIONS] command\n", argv[0]); +#ifdef __GNU_LIBRARY__ + fprintf(stderr, "Type `%s --help' for more information.\n", argv[0]); +#else + fprintf(stderr, "Type `%s -h' for more information.\n", argv[0]); +#endif + exit(1); + } + initialize_print_cmd(); + switch(operation) + { + case 'c': + do_head_clean(); + break; + case 'n': + do_nozzle_check(); + break; + case 'i': + do_ink_level(); + break; + case 'a': + do_align(); + break; + case 'o': + do_align_color(); + break; + case 'd': + do_identify(); + break; + case 's': + do_status(); + break; + default: + do_help(1); + } + exit(0); +} + +int +do_print_cmd(void) +{ + FILE *pfile; + int bytes = 0; + int retries = 0; + char command[1024]; + memcpy(printer_cmd + bufpos, "\f\033\000\033\000", 5); + bufpos += 5; + if (raw_device) + { + pfile = fopen(raw_device, "wb"); + if (!pfile) + { + fprintf(stderr, _("Cannot open device %s: %s\n"), raw_device, + strerror(errno)); + return 1; + } + } + else + { + if (!access("/bin/lpr", X_OK) || + !access("/usr/bin/lpr", X_OK) || + !access("/usr/bsd/lpr", X_OK)) + { + if (printer == NULL) + strcpy(command, "lpr -l"); + else + sprintf(command, "lpr -P%s -l", printer); + } + else if (printer == NULL) + strcpy(command, "lp -s -oraw"); + else + sprintf(command, "lp -s -oraw -d%s", printer); + + if ((pfile = popen(command, "w")) == NULL) + { + fprintf(stderr, _("Cannot print to printer %s with %s\n"), printer, + command); + return 1; + } + } + while (bytes < bufpos) + { + int status = fwrite(printer_cmd + bytes, 1, bufpos - bytes, pfile); + if (status == 0) + { + retries++; + if (retries > 2) + { + fprintf(stderr, _("Unable to send command to printer\n")); + if (raw_device) + fclose(pfile); + else + pclose(pfile); + return 1; + } + } + else if (status == -1) + { + fprintf(stderr, _("Unable to send command to printer\n")); + if (raw_device) + fclose(pfile); + else + pclose(pfile); + return 1; + } + else + { + bytes += status; + retries = 0; + } + } + if (raw_device) + fclose(pfile); + else + pclose(pfile); + return 0; +} + +static int +read_from_printer(int fd, char *buf, int bufsize) +{ +#ifdef HAVE_POLL + struct pollfd ufds; +#endif + int status; + int retry = 5; + memset(buf, 0, bufsize); + do + { +#ifdef HAVE_POLL + ufds.fd = fd; + ufds.events = POLLIN; + ufds.revents = 0; + (void) poll(&ufds, 1, 1000); +#endif + status = read(fd, buf, bufsize - 1); + if (status <= 0) + sleep(1); + } + while ((status == 0) && (--retry != 0)); + return status; +} + +static void +do_remote_cmd(const char *cmd, int nargs, ...) +{ + static char remote_hdr[] = "\033@\033(R\010\000\000REMOTE1"; + static char remote_trailer[] = "\033\000\000\000\033\000"; + int i; + va_list args; + va_start(args, nargs); + + memcpy(printer_cmd + bufpos, remote_hdr, sizeof(remote_hdr) - 1); + bufpos += sizeof(remote_hdr) - 1; + memcpy(printer_cmd + bufpos, cmd, 2); + bufpos += 2; + printer_cmd[bufpos] = nargs % 256; + printer_cmd[bufpos + 1] = (nargs >> 8) % 256; + if (nargs > 0) + for (i = 0; i < nargs; i++) + printer_cmd[bufpos + 2 + i] = va_arg(args, int); + bufpos += 2 + nargs; + memcpy(printer_cmd + bufpos, remote_trailer, sizeof(remote_trailer) - 1); + bufpos += sizeof(remote_trailer) - 1; +} + +static void +add_newlines(int count) +{ + int i; + for (i = 0; i < count; i++) + { + printer_cmd[bufpos++] = '\r'; + printer_cmd[bufpos++] = '\n'; + } +} + +static void +add_resets(int count) +{ + int i; + for (i = 0; i < count; i++) + { + printer_cmd[bufpos++] = '\033'; + printer_cmd[bufpos++] = '\000'; + } +} + +const char *colors[] = +{ + N_("Black"), + N_("Cyan"), + N_("Magenta"), + N_("Yellow"), + N_("Light Cyan"), + N_("Light Magenta"), + 0 +}; + +void +do_ink_level(void) +{ + int fd; + int status; + char buf[1024]; + char *ind; + int i; + if (!raw_device) + { + fprintf(stderr,_("Obtaining ink levels requires using a raw device.\n")); + exit(1); + } + fd = open(raw_device, O_RDWR, 0666); + if (fd == -1) + { + fprintf(stderr, _("Cannot open %s read/write: %s\n"), raw_device, + strerror(errno)); + exit(1); + } + initialize_print_cmd(); + do_remote_cmd("ST", 2, 0, 1); + add_resets(2); + if (write(fd, printer_cmd, bufpos) < bufpos) + { + fprintf(stderr, _("Cannot write to %s: %s\n"), raw_device, + strerror(errno)); + exit(1); + } + status = read_from_printer(fd, buf, 1024); + if (status < 0) + { + fprintf(stderr, _("Cannot read from %s: %s\n"), + raw_device,strerror(errno)); + exit(1); + } + ind = buf; + do + ind = strchr(ind, 'I'); + while (ind && ind[1] != 'Q' && (ind[1] != '\0' && ind[2] != ':')); + if (!ind || ind[1] != 'Q' || ind[2] != ':') + { + fprintf(stderr, _("Cannot parse output from printer\n")); + exit(1); + } + ind += 3; + printf("%20s %s\n", _("Ink color"), _("Percent remaining")); + for (i = 0; i < 6; i++) + { + int val, j; + if (!ind[0] || ind[0] == ';') + exit(0); + for (j = 0; j < 2; j++) + { + if (ind[j] >= '0' && ind[j] <= '9') + ind[j] -= '0'; + else if (ind[j] >= 'A' && ind[j] <= 'F') + ind[j] = ind[j] - 'A' + 10; + else if (ind[j] >= 'a' && ind[j] <= 'f') + ind[j] = ind[j] - 'a' + 10; + else + exit(1); + } + val = (ind[0] << 4) + ind[1]; + printf("%20s %3d\n", _(colors[i]), val); + ind += 2; + } + initialize_print_cmd(); + do_remote_cmd("ST", 2, 0, 0); + add_resets(2); + (void) write(fd, printer_cmd, bufpos); + (void) read(fd, buf, 1024); + (void) close(fd); + exit(0); +} + +void +do_identify(void) +{ + int fd; + int status; + char buf[1024]; + if (!raw_device) + { + fprintf(stderr, + _("Printer identification requires using a raw device.\n")); + exit(1); + } + fd = open(raw_device, O_RDWR, 0666); + if (fd == -1) + { + fprintf(stderr, _("Cannot open %s read/write: %s\n"), raw_device, + strerror(errno)); + exit(1); + } + initialize_print_cmd(); + add_resets(2); + (void) write(fd, printer_cmd, bufpos); + bufpos = 0; + sprintf(printer_cmd, "\033\001@EJL ID\r\n"); + if (write(fd, printer_cmd, strlen(printer_cmd)) < strlen(printer_cmd)) + { + fprintf(stderr, _("Cannot write to %s: %s\n"), + raw_device, strerror(errno)); + exit(1); + } + status = read_from_printer(fd, buf, 1024); + if (status < 0) + { + fprintf(stderr, _("Cannot read from %s: %s\n"), + raw_device, strerror(errno)); + exit(1); + } + printf("%s\n", buf); + (void) close(fd); + exit(0); +} + +void +do_status(void) +{ + int fd; + int status; + char buf[1024]; + char *where; + memset(buf, 0, 1024); + if (!raw_device) + { + fprintf(stderr, _("Printer status requires using a raw device.\n")); + exit(1); + } + fd = open(raw_device, O_RDWR, 0666); + if (fd == -1) + { + fprintf(stderr, _("Cannot open %s read/write: %s\n"), raw_device, + strerror(errno)); + exit(1); + } + bufpos = 0; + initialize_print_cmd(); + do_remote_cmd("ST", 2, 0, 1); + if (write(fd, printer_cmd, bufpos) < bufpos) + { + fprintf(stderr, _("Cannot write to %s: %s\n"), + raw_device, strerror(errno)); + exit(1); + } + status = read_from_printer(fd, buf, 1024); + if (status < 0) + { + fprintf(stderr, _("Cannot read from %s: %s\n"), + raw_device, strerror(errno)); + exit(1); + } + initialize_print_cmd(); + do_remote_cmd("ST", 2, 0, 0); + add_resets(2); + (void) write(fd, printer_cmd, bufpos); + (void) read(fd, buf, 1024); + while ((where = strchr(buf, ';')) != NULL) + *where = '\n'; + printf("%s\n", buf); + (void) close(fd); + exit(0); +} + + +void +do_head_clean(void) +{ + do_remote_cmd("CH", 2, 0, 0); + printf(_("Cleaning heads...\n")); + exit(do_print_cmd()); +} + +void +do_nozzle_check(void) +{ + do_remote_cmd("VI", 2, 0, 0); + do_remote_cmd("NC", 2, 0, 0); + printf(_("Running nozzle check, please ensure paper is in the printer.\n")); + exit(do_print_cmd()); +} + +const char *new_align_help = N_("\ +Please read these instructions very carefully before proceeding.\n\ +\n\ +This utility lets you align the print head of your Epson Stylus inkjet\n\ +printer. Misuse of this utility may cause your print quality to degrade\n\ +and possibly damage your printer. This utility has not been reviewed by\n\ +Seiko Epson for correctness, and is offered with no warranty at all. The\n\ +entire risk of using this utility lies with you.\n\ +\n\ +This utility prints %d test patterns. Each pattern looks very similar.\n\ +The patterns consist of a series of pairs of vertical lines that overlap.\n\ +Below each pair of lines is a number between %d and %d.\n\ +\n\ +When you inspect the pairs of lines, you should find the pair of lines that\n\ +is best in alignment, that is, that best forms a single vertical line.\n\ +Inspect the pairs very carefully to find the best match. Using a loupe\n\ +or magnifying glass is recommended for the most critical inspection.\n\ +It is also suggested that you use a good quality paper for the test,\n\ +so that the lines are well-formed and do not spread through the paper.\n\ +After picking the number matching the best pair, place the paper back in\n\ +the paper input tray before typing it in.\n\ +\n\ +Each pattern is similar, but later patterns use finer dots for more\n\ +critical alignment. You must run all of the passes to correctly align your\n\ +printer. After running all the alignment passes, the alignment\n\ +patterns will be printed once more. You should find that the middle-most\n\ +pair (#%d out of the %d) is the best for all patterns.\n\ +\n\ +After the passes are printed once more, you will be offered the\n\ +choices of (s)aving the result in the printer, (r)epeating the process,\n\ +or (q)uitting without saving. Quitting will not restore the previous\n\ +settings, but powering the printer off and back on will. If you quit,\n\ +you must repeat the entire process if you wish to later save the results.\n\ +It is essential that you not turn your printer off during this procedure.\n\n"); + +const char *old_align_help = N_("\ +Please read these instructions very carefully before proceeding.\n\ +\n\ +This utility lets you align the print head of your Epson Stylus inkjet\n\ +printer. Misuse of this utility may cause your print quality to degrade\n\ +and possibly damage your printer. This utility has not been reviewed by\n\ +Seiko Epson for correctness, and is offered with no warranty at all. The\n\ +entire risk of using this utility lies with you.\n\ +\n\ +This utility prints a test pattern that consist of a series of pairs of\n\ +vertical lines that overlap. Below each pair of lines is a number between\n\ +%d and %d.\n\ +\n\ +When you inspect the pairs of lines, you should find the pair of lines that\n\ +is best in alignment, that is, that best forms a single vertical align.\n\ +Inspect the pairs very carefully to find the best match. Using a loupe\n\ +or magnifying glass is recommended for the most critical inspection.\n\ +It is also suggested that you use a good quality paper for the test,\n\ +so that the lines are well-formed and do not spread through the paper.\n\ +After picking the number matching the best pair, place the paper back in\n\ +the paper input tray before typing it in.\n\ +\n\ +After running the alignment pattern, it will be printed once more. You\n\ +should find that the middle-most pair (#%d out of the %d) is the best.\n\ +You will then be offered the choices of (s)aving the result in the printer,\n\ +(r)epeating the process, or (q)uitting without saving. Quitting will not\n\ +restore the previous settings, but powering the printer off and back on will.\n\ +If you quit, you must repeat the entire process if you wish to later save\n\ +the results. It is essential that you not turn off your printer during\n\ +this procedure.\n\n"); + +static void +do_align_help(int passes, int choices) +{ + if (passes > 1) + printf(_(new_align_help), passes, 1, choices, (choices + 1) / 2, choices); + else + printf(_(old_align_help), 1, choices, (choices + 1) / 2, choices); + fflush(stdout); +} + +static void +printer_error(void) +{ + printf(_("Unable to send command to the printer, exiting.\n")); + exit(1); +} + +static stp_printer_t * +get_printer(void) +{ + stp_printer_t *printer = &printer_list[0]; + if (!printer_model) + { + char buf[1024]; + int fd; + int status; + char *pos = NULL; + char *spos = NULL; + if (!raw_device) + { + fprintf(stderr, + _("Printer alignment must be done with a raw device or else\n" + "the -m option must be used to specify a printer.\n")); + do_help(1); + } + printf(_("Attempting to detect printer model...")); + fflush(stdout); + fd = open(raw_device, O_RDWR, 0666); + if (fd == -1) + { + printf(_("\nCannot open %s read/write: %s\n"), raw_device, + strerror(errno)); + exit(1); + } + bufpos = 0; + sprintf(printer_cmd, "\033\001@EJL ID\r\n"); + if (write(fd, printer_cmd, strlen(printer_cmd)) < strlen(printer_cmd)) + { + printf(_("\nCannot write to %s: %s\n"), raw_device, strerror(errno)); + exit(1); + } + status = read_from_printer(fd, buf, 1024); + if (status < 0) + { + printf(_("\nCannot read from %s: %s\n"), raw_device,strerror(errno)); + exit(1); + } + (void) close(fd); + pos = strchr(buf, (int) ';'); + if (pos) + pos = strchr(pos + 1, (int) ';'); + if (pos) + pos = strchr(pos, (int) ':'); + if (pos) + spos = strchr(pos, (int) ';'); + if (!pos) + { + printf(_("\nCannot detect printer type.\n" + "Please use -m to specify your printer model.\n")); + do_help(1); + } + if (spos) + *spos = '\000'; + printer_model = pos + 1; + printf("%s\n\n", printer_model); + } + while (printer->short_name) + { + if (!strcasecmp(printer_model, printer->short_name) || + !strcasecmp(printer_model, printer->long_name)) + return printer; + else + printer++; + } + printf(_("Printer model %s is not known.\n"), printer_model); + do_help(1); + return 0; +} + +static int +do_final_alignment(void) +{ + while (1) + { + char *inbuf; + printf(_("Please inspect the final output very carefully to ensure that your\n" + "printer is in proper alignment. You may now:\n" + " (s)ave the results in the printer,\n" + " (q)uit without saving the results, or\n" + " (r)epeat the entire process from the beginning.\n" + "You will then be asked to confirm your choice.\n" + "What do you want to do (s, q, r)?\n")); + fflush(stdout); + inbuf = do_get_input(_("> ")); + switch (inbuf[0]) + { + case 'q': + case 'Q': + printf(_("Please confirm by typing 'q' again that you wish to quit without saving:\n")); + fflush(stdout); + inbuf = do_get_input (_("> ")); + if (inbuf[0] == 'q' || inbuf[0] == 'Q') + { + printf(_("OK, your printer is aligned, but the alignment has not been saved.\n" + "If you wish to save the alignment, you must repeat this process.\n")); + return 1; + } + break; + case 'r': + case 'R': + printf(_("Please confirm by typing 'r' again that you wish to repeat the\n" + "alignment process:\n")); + fflush(stdout); + inbuf = do_get_input(_("> ")); + if (inbuf[0] == 'r' || inbuf[0] == 'R') + { + printf(_("Repeating the alignment process.\n")); + return 0; + } + break; + case 's': + case 'S': + printf(_("This will permanently alter the configuration of your printer.\n" + "WARNING: this procedure has not been approved by Seiko Epson, and\n" + "it may damage your printer. Proceed?\n" + "Please confirm by typing 's' again that you wish to save the settings\n" + "to your printer:\n")); + + fflush(stdout); + inbuf = do_get_input(_("> ")); + if (inbuf[0] == 's' || inbuf[0] == 'S') + { + printf(_("Please insert your alignment test page in the printer once more\n" + "for the final save of your alignment settings. When the printer\n" + "feeds the page through, your settings have been saved.\n")); + fflush(stdout); + initialize_print_cmd(); + add_newlines(2); + do_remote_cmd("SV", 0); + add_newlines(2); + if (do_print_cmd()) + printer_error(); + return 1; + } + break; + default: + printf(_("Unrecognized command.\n")); + continue; + } + printf(_("Final command was not confirmed.\n")); + } +} + +const char *printer_msg = +N_("This procedure assumes that your printer is an Epson %s.\n" + "If this is not your printer model, please type control-C now and\n" + "choose your actual printer model.\n\n" + "Please place a sheet of paper in your printer to begin the head\n" + "alignment procedure.\n"); + +/* + * This is the thorny one. + */ +void +do_align(void) +{ + char *inbuf; + long answer; + char *endptr; + int curpass; + const stp_printer_t *printer = get_printer(); + int passes = printer->passes; + int choices = printer->choices; + const char *printer_name = printer->long_name; + + do + { + do_align_help(passes, choices); + printf(_(printer_msg), _(printer_name)); + inbuf = do_get_input(_("Press enter to continue > ")); + initialize_print_cmd(); + for (curpass = 1; curpass <= passes; curpass ++) + { + top: + add_newlines(7 * (curpass - 1)); + do_remote_cmd("DT", 3, 0, curpass - 1, 0); + if (do_print_cmd()) + printer_error(); + reread: + if (curpass == passes) + printf(_("Please inspect the print, and choose the best pair of lines\n" + "in pattern #%d, and then insert a fresh page in the input tray.\n" + "Type a pair number, '?' for help, or 'r' to retry this pattern.\n"), + curpass); + else + printf(_("Please inspect the print, and choose the best pair of lines\n" + "in pattern #%d, and then reinsert the page in the input tray.\n" + "Type a pair number, '?' for help, or 'r' to retry this pattern.\n"), + curpass); + fflush(stdout); + inbuf = do_get_input(_("> ")); + switch (inbuf[0]) + { + case 'r': + case 'R': + printf(_("Please insert a fresh sheet of paper.\n")); + fflush(stdout); + initialize_print_cmd(); + (void) do_get_input(_("Press enter to continue > ")); + /* Ick. Surely there's a cleaner way? */ + goto top; + case 'h': + case '?': + do_align_help(passes, choices); + fflush(stdout); + case '\n': + case '\000': + goto reread; + default: + break; + } + answer = strtol(inbuf, &endptr, 10); + if (errno == ERANGE) + { + printf(_("Number out of range!\n")); + goto reread; + } + if (endptr == inbuf) + { + printf(_("I cannot understand what you typed!\n")); + fflush(stdout); + goto reread; + } + if (answer < 1 || answer > choices) + { + printf(_("The best pair of lines should be numbered between 1 and %d.\n"), + choices); + fflush(stdout); + goto reread; + } + if (curpass == passes) + { + printf(_("Aligning phase %d, and performing final test.\n" + "Please insert a fresh sheet of paper.\n"), curpass); + (void) do_get_input(_("Press enter to continue > ")); + } + else + printf(_("Aligning phase %d, and starting phase %d.\n"), curpass, + curpass + 1); + fflush(stdout); + initialize_print_cmd(); + do_remote_cmd("DA", 4, 0, curpass - 1, 0, answer); + } + for (curpass = 0; curpass < passes; curpass++) + do_remote_cmd("DT", 3, 0, curpass, 0); + if (do_print_cmd()) + printer_error(); + } while (!do_final_alignment()); + exit(0); +} + +const char *color_align_help = N_("\ +Please read these instructions very carefully before proceeding.\n\ +\n\ +This utility lets you align the color print head of your Epson Stylus inkjet\n\ +printer. Misuse of this utility may cause your print quality to degrade\n\ +and possibly damage your printer. This utility has not been reviewed by\n\ +Seiko Epson for correctness, and is offered with no warranty at all. The\n\ +entire risk of using this utility lies with you.\n\ +\n\ +This utility prints %d overprinting test patterns on one piece of paper.\n\ +That is, it prints one pattern and ejects the page. You must then reinsert\n\ +the same page, and it will print another pattern. Each pattern consists of\n\ +a set of choices numbered between %d and %d.\n\ +\n\ +When you inspect the patterns, you should find one patch to have the\n\ +smoothest texture (least ``grain''). You should inspect the patches very\n\ +carefully to choose the best one. We suggest using Photo Quality Inkjet\n\ +Paper or a similar high quality paper for this test. If you do not find\n\ +a smooth pattern, you should repeat the test.\n\ +\n\ +After you inspect the choices and select a patch, you will be offered the\n\ +choices of (s)aving the result in the printer, (r)epeating the process,\n\ +or (q)uitting without saving. Quitting will not restore the previous\n\ +settings, but powering the printer off and back on will. If you quit,\n\ +you must repeat the entire process if you wish to later save the results.\n\ +It is essential that you not turn your printer off during this procedure.\n\ +\n\ +WARNING: THIS FUNCTION IS NOT YET TESTED! It may not work, and it may\n\ +damage your printer!\n"); + +static void +do_align_color_help(int passes, int choices) +{ + printf(color_align_help, 1, choices); + fflush(stdout); +} + +void +do_align_color(void) +{ + char *inbuf; + long answer; + char *endptr; + int curpass; + const stp_printer_t *printer = get_printer(); + int passes = printer->color_passes; + int choices = printer->color_choices; + const char *printer_name = printer->long_name; + if (passes == 0) + { + printf(_("Printer %s does not require color head alignment.\n"), + printer_model); + exit(0); + } + + do + { + do_align_color_help(passes, choices); + printf(_(printer_msg), _(printer_name)); + inbuf = do_get_input(_("Press enter to continue > ")); + for (curpass = 1; curpass <= passes; curpass ++) + { + initialize_print_cmd(); + do_remote_cmd("DU", 6, 0, curpass, 0, 9, 0, curpass - 1); + if (do_print_cmd()) + printer_error(); + if (curpass < passes) + { + printf(_("Please re-insert the same alignment sheet in the printer when it is\n" + "finished printing.\n")); + (void) do_get_input(_("Press enter to continue > ")); + } + } + reread: + printf(_("Inspect the alignment sheet, and determine which pattern is the smoothest.\n" + "This pattern will appear to have the least ``grain''.\n" + "If you cannot find a smooth pattern, please select the number for the\n" + "best pattern, and repeat the procedure.\n" + "Type a pattern number, or '?' for help.\n")); + fflush(stdout); + inbuf = do_get_input(_("> ")); + if (!inbuf) + exit(1); + switch (inbuf[0]) + { + case 'h': + case '?': + do_align_color_help(passes, choices); + fflush(stdout); + /* FALLTHROUGH */ + case '\n': + case '\000': + goto reread; + default: + break; + } + answer = strtol(inbuf, &endptr, 10); + if (errno == ERANGE) + { + printf(_("Number out of range!\n")); + goto reread; + } + if (endptr == inbuf) + { + printf(_("I cannot understand what you typed!\n")); + fflush(stdout); + goto reread; + } + if (answer < 1 || answer > choices) + { + printf(_("The best pattern should be numbered between 1 and %d.\n"), + choices); + fflush(stdout); + goto reread; + } + initialize_print_cmd(); + do_remote_cmd("DA", 6, 0, 0, 0, answer, 9, 0); + if (do_print_cmd()) + printer_error(); + } while (!do_final_alignment()); + exit (0); +} + +char * +do_get_input (const char *prompt) +{ + static char *input = NULL; +#if (HAVE_LIBREADLINE == 0 || !defined HAVE_READLINE_READLINE_H) + char *fgets_status; +#endif + /* free only if previously allocated */ + if (input) + { + free (input); + input = NULL; + } +#if (HAVE_LIBREADLINE > 0 && defined HAVE_READLINE_READLINE_H) + /* get input with libreadline, if present */ + input = readline ((char *) prompt); + /* if input, add to history list */ +#ifdef HAVE_READLINE_HISTORY_H + if (input && *input) + { + add_history (input); + } +#endif +#else + /* no libreadline; use fgets instead */ + input = xmalloc (sizeof (char) * BUFSIZ); + memset(input, 0, BUFSIZ); + printf ("%s", prompt); + fgets_status = fgets (input, BUFSIZ, stdin); + if (fgets_status == NULL) + { + fprintf (stderr, _("Error in input\n")); + return (NULL); + } + else if (strlen (input) == 1 && input[0] == '\n') + { + /* user just hit enter: empty input buffer */ + /* remove line feed */ + input[0] = '\0'; + } + else + { + /* remove line feed */ + input[strlen (input) - 1] = '\0'; + } +#endif + return (input); +} diff --git a/src/foomatic/.cvsignore b/src/foomatic/.cvsignore new file mode 100644 index 0000000..2f604f5 --- /dev/null +++ b/src/foomatic/.cvsignore @@ -0,0 +1,12 @@ +Makefile.in +Makefile +.deps +.libs +printer_options +foomatic-db +foomatic-generator +paper_sizes +gimp-print-version +stp_limits +foomatic-stamp +printers diff --git a/src/foomatic/Makefile.am b/src/foomatic/Makefile.am new file mode 100644 index 0000000..3c876ba --- /dev/null +++ b/src/foomatic/Makefile.am @@ -0,0 +1,101 @@ +## $Id: Makefile.am,v 1.16 2001/11/19 12:40:46 rlk Exp $ +## Copyright (C) 2000 Roger Leigh +## +## 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, or (at your option) +## any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +## Process this file with automake to produce Makefile.in. + +AUTOMAKE_OPTIONS = 1.4 gnu + +@SET_MAKE@ + +MAINT_CHARSET = latin1 + + +## Variables + +AM_CFLAGS = $(GNUCFLAGS) +INCLUDES = @INCLUDES@ $(LIBGIMPPRINT_CFLAGS) -I$(top_srcdir)/src/main +LIBS = @LIBS@ ../../lib/libprintut.la $(INTLLIBS) ../../lib/libprintut.la + + +## Programs + +FOOMATIC_NOINST_BIN = printer_options paper_sizes gimp-print-version \ + stp_limits printers + +noinst_PROGRAMS = @FOOMATIC_NOINST_BIN@ + +EXTRA_PROGRAMS = printer_options gimp-print-version paper_sizes \ + stp_limits printers + +printer_options_SOURCES = printer_options.c +printer_options_LDADD = $(LIBGIMPPRINT_LIBS) +printer_options_DEPENDENCIES = $(LIBGIMPPRINT_LIBS) + +gimp_print_version_SOURCES = gimp-print-version.c +gimp_print_version_LDADD = $(LIBGIMPPRINT_LIBS) +gimp_print_version_DEPENDENCIES = $(LIBGIMPPRINT_LIBS) + +paper_sizes_SOURCES = paper_sizes.c +paper_sizes_LDADD = $(LIBGIMPPRINT_LIBS) +paper_sizes_DEPENDENCIES = $(LIBGIMPPRINT_LIBS) + +stp_limits_SOURCES = stp_limits.c +stp_limits_LDADD = $(LIBGIMPPRINT_LIBS) +stp_limits_DEPENDENCIES = $(LIBGIMPPRINT_LIBS) + +printers_SOURCES = printers.c +printers_LDADD = $(LIBGIMPPRINT_LIBS) +printers_DEPENDENCIES = $(LIBGIMPPRINT_LIBS) + + +## Rules + +if BUILD_FOOMATIC +INSTALL_DATA_LOCAL_DEPS = foomatic-data +else +INSTALL_DATA_LOCAL_DEPS = +endif + +all-local: $(INSTALL_DATA_LOCAL_DEPS) + +install-data-local: $(INSTALL_DATA_LOCAL_DEPS) + if test -n "$(INSTALL_DATA_LOCAL_DEPS)" ; then \ + foomatic-kitload -k foomatic-db ; \ + fi + +clean-local: + -$(RM) -r foomatic-db + +foomatic-data: foomatic-stamp + +foomatic-stamp: foomatic-generator foomatic-printermap $(EXTRA_PROGRAMS) + -$(RM) -r foomatic-db + ./foomatic-generator + touch foomatic-stamp + +$(LIBGIMPPRINT_LIBS): + cd ../main ; \ + $(MAKE) + + +## Clean + +CLEANFILES = $(noinst_PROGRAMS) +MAINTAINERCLEANFILES = Makefile.in + +EXTRA_DIST = foomatic-printermap foomatic-templates/*.xml + diff --git a/src/foomatic/foomatic-generator.in b/src/foomatic/foomatic-generator.in new file mode 100644 index 0000000..57950aa --- /dev/null +++ b/src/foomatic/foomatic-generator.in @@ -0,0 +1,671 @@ +#!@PERL@ + +# Wherever we put it... +my $mapfile; +# $mapfile = "../main/printers.xml"; +$mapfile = "foomatic-printermap"; + + +# The following substitutions happen to the template XML files: +# @@STPVER@@ - the version number (ie '4.1.5') +# @@DRVNAME@@ - driver name (ie gimp-print) +# @@STPRINTERS@@ - ... clause for the driver +# @@OPTCONSTRAINTS@@ - ... object for the option +# @@ENUMVALS@@ - ... section for the enum option +# @@MINVAL@@ - minimum value for numeric setting +# @@MAXVAL@@ - maximum value for numeric setting +# @@DEFVAL@@ - default value for numeric setting + +# For some things, there are option-specific root-around-n-writer +# functions. So we have a dispatch table: +# +# function arguments are: ('StpDriverOptionName') + +my $funcs = { 'InputSlot' => { 'OPTCONSTRAINTS' => \&build_cons, + 'ENUMVALS' => \&build_ev, }, + 'InkType' => { 'OPTCONSTRAINTS' => \&build_cons, + 'ENUMVALS' => \&build_ev }, + 'MediaType' => { 'OPTCONSTRAINTS' => \&build_cons, + 'ENUMVALS' => \&build_ev }, + 'Model' => { 'OPTCONSTRAINTS' => \&build_model_cons, + 'ENUMVALS' => \&build_model_ev }, + 'PageSize' => { 'OPTCONSTRAINTS' => \&build_cons, + 'ENUMVALS' => \&build_ev }, + 'Quality' => { 'OPTCONSTRAINTS' => \&build_cons, + 'ENUMVALS' => \&build_ev }, + 'Dither' => { 'OPTCONSTRAINTS' => \&build_cons, + 'ENUMVALS' => \&build_ev }, + 'Color' => { 'OPTCONSTRAINTS' => \&build_cons, + 'ENUMVALS' => \&build_ev }, + 'Resolution' => { 'OPTCONSTRAINTS' => \&build_resolution_cons, + 'ENUMVALS' => \&build_resolution_ev }, + }; + +my $drivervals = { 'PageSize' => \&optmap_pagesize, + 'Color' => \&optmap_color + }; + +my $debug = 0; + +# Foomatic name => Gimp-print name +%argnamemap = ('Quality' => 'Resolution'); + +%colormap = ('Grayscale' => 0, + 'Color' => 1, + 'BlackAndWhite' => 2); + +use Data::Dumper; + +open PIPE, "./printer_options|" or die "Cannot run printer_options: $!\n"; +print STDERR "Loading options from ./printer_options..."; +while() { + next if m!^#!; + eval $_; +} +close PIPE or die "Cannot run printer_options: $!\n"; +print STDERR "done.\n"; + +open PIPE, "./stp_limits|" or die "Cannot run stp_limits: $!\n"; +print STDERR "Loading options from ./stp_limits..."; +while() { + next if m!^#!; + eval $_; +} +close PIPE or die "Cannot run stp_limits: $!\n"; +print STDERR "done.\n"; + +open PIPE, "./printers|" or die "Cannot run printers: $!\n"; +print STDERR "Loading options from ./printers..."; +while() { + next if m!^#!; + eval $_; +} +close PIPE or die "Cannot run printers: $!\n"; +print STDERR "done.\n"; + +# OK, now %stpdata is a big honking thing, and %defaults is in there, too. + +# Invert, to build %bar{$optionname} = [ choice1, choice2 ]; +my ($a, $otmp, $vtmp); +for $a (keys(%stpdata)) { + for $otmp (keys %{$stpdata{$a}}) { + for $vtmp (keys (%{$stpdata{$a}{$otmp}})) { + if (!$seen_evchoice{$otmp}{$vtmp}++) { + push (@{$ev_choices{$otmp}}, [ $vtmp, + $stpdata{$a}{$otmp}{$vtmp}]); + } + } + } +} + + +# Step 1: construct a map from Model= values to Foomatic model id's +# this map is %mapstp. The inverse from model to Model is %mapdb +# +# Foomatic is supposed to be a superset, so + +open PRINTERS, $mapfile or die "Cannot open mapfile $mapfile: $!\n"; +for () { + if (m!^#\s*gptofoo\s+([^\s]+)\s+([^\s]+)!) { + push (@{$mapstp{$1}}, $2); + $mapfoo{$2} = $1; # do we need? + } +} + +$missing_drivers = 0; + +# Are we missing any stp printers? +for (keys(%stpdata)) { + if (!defined($mapstp{$_})) { + $missing_drivers = 1; + warn "No foomatic printer IDs for gimp-print printer $_.\n"; + } +} + +if ($missing_drivers) { + die "Cannot continue\n"; +} + +# Figure out version etc +open PIPE, "./gimp-print-version|" or die "Cannot run gimp-print-version: $!\n"; +my $stpvers = ; +close PIPE or die "Cannot run gimp-print-version: $!\n"; +chomp $stpvers; +print STDERR "Using drivername gimp-print\n"; + +# Build clause... +my @printerlist = (); +push (@printerlist, " \n"); +my $p1; +for $p1 (keys(%mapstp)) { + push (@printerlist, " \n"); + for (@{$mapstp{$p1}}) { + push(@printerlist, " $_\n"); + } +} +push (@printerlist, " \n"); + +my $generalsubs = { 'STPVER' => $stpvers, + 'DRVNAME' => "gimp-print", + 'STPRINTERS' => join('', @printerlist) }; + +my @numericsubs = ('MINVAL', 'MAXVAL', 'DEFVAL'); + +opendir TDIR, "foomatic-templates" or die "Cannot open templates directory: $!\n"; + +# OK, make the db heirarchy alongside the templates one... +mkdir 'foomatic-db', 0755 or die "Cannot create directory foomatic-db: $!\n" + unless -d 'foomatic-db'; +mkdir 'foomatic-db/opt', 0755 or die "Cannot create directory foomatic-db/opt: $!\n" + unless -d 'foomatic-db/opt'; +mkdir 'foomatic-db/driver', 0755 or die "Cannot create directory foomatic-db/driver: $!\n" + unless -d 'foomatic-db/driver'; + +# Now do stuff, already. Do the substitution into each file... +my $tmpl; +while ($tmpl=readdir(TDIR)) { + next if ($tmpl !~ m!.+\.xml$!); + + my $fooopt = $tmpl; + $fooopt =~ s!\.xml$!!; + my $stpopt = $argnamemap{$fooopt}; + $stpopt = $fooopt if ! defined ($stpopt); + +# print STDERR "Argnamemap '$fooopt' => '$stpopt'\n"; + + open TMPL, "foomatic-templates/$tmpl"; + my @datafile = ; + close TMPL; + + print STDERR "Processing $tmpl..."; + + my $template = join('',@datafile); + + # First, do the generic substitutions. + + my ($substr); + for $substr (keys(%$generalsubs)) { + my $substitution = $generalsubs->{$substr}; + $template =~ s!\@\@$substr\@\@!$substitution!g; + } + + # Now do the numeric substitutions + + for $substr (@numericsubs) { + my $substitution = $stp_values{$substr}{$stpopt}; + $template =~ s!\@\@$substr\@\@!$substitution!g; + } + + # Now do special-purpose substitutions + + for $substr (keys(%{$funcs->{$fooopt}})) { + my $substitution = &{$funcs->{$fooopt}{$substr}}($stpopt); + if (defined($substitution)) { + $template =~ s!\@\@$substr\@\@!$substitution!g; + } + } + + # Any more? + grep (m!\@\@([^\@]+)\@\@!g + && do { warn " Unknown substitution $1 in $tmpl!\n"; }, + split("\n",$template)); + + # Finally, write out the new file + + # Options are under opt/ + my $dbfilename = lc("foomatic-db/opt/gimp-print-$tmpl"); + + # Special case the actual driver file under driver/ + $dbfilename = "foomatic-db/driver/gimp-print.xml" + if ($tmpl eq 'gimp-print.xml'); + + open NEWF, "> $dbfilename" or die "Cannot create $dbfilename: $!"; + print STDERR "writing $dbfilename..."; + print NEWF $template; + print STDERR "done.\n"; + close NEWF; + +} + + + +sub get_ev_shortname { + my ($val) = @_; + $val =~ s/ //g; + $val =~ s/\///g; + $val =~ s/\://g; + return $val; +} + +sub get_ev_key { + my ($val, $drv) = @_; + return ("ev/$drv-" . get_ev_shortname($val)); +} + +sub build_ev { + my ($stpopt) = @_; + my $drvname = $generalsubs->{'DRVNAME'}; + + my @vals = (); + + # OK, now for each enum_val + my $ev; + for $ev (@{$ev_choices{$stpopt}}) { + # Put in the basic choice info: ev names, etc + my $ev_longname = @$ev[1]; + my $ev_shortname = @$ev[0]; + my $ev_id = get_ev_key($ev_shortname, $drvname); + my $ev_driverval; + + # Either call a per-option function to get the driverval, or + # just use the string choice name. + if (defined($drivervals->{$stpopt})) { + $ev_driverval = &{$drivervals->{$stpopt}}($ev_shortname); + die "Undefined driverval for option $stpopt value $ev_shortname!\n" + if (! defined($ev)); + } else { + $ev_driverval = $ev_shortname; + } + push (@vals, + " \n", + " $ev_longname\n", + " $ev_shortname\n", + " $ev_driverval\n", + " \n", + " \n", + " \n", + " $drvname\n", + " \n"); + + # Build constraints for this particular ev + my $stpprn; + for $stpprn (keys(%stpdata)) { + my $fooprn; + for $fooprn (@{$mapstp{$stpprn}}) { + if ($stpdata{$stpprn}{$stpopt}{$ev_shortname}) { + # OK, this choice applies to this enum + push (@vals, + " \n", + " \n", + " $drvname\n", + " $fooprn\n", + " \n"); + } + } + } + + push (@vals, + " \n", + " \n"); + } + + return join('', + "\n", + @vals, + " \n"); +} + +sub build_cons { + + my ($stpopt) = @_; + + my $drvname = $generalsubs->{'DRVNAME'}; + + my @PNCONS = (); + + # For each stp printer... + my $stpname; + for $stpname (keys(%stpdata)) { + + if (0) { + print STDERR " Processing gimp-print printer $stpname...\n"; + print STDERR + " There are no foomatic printers mapped to $stpname!?\n" + if !$mapstp{$stpname}; + print STDERR " \%stpdata key is {$stpname}{$stpopt}\n"; + } + + # Add to this printer to argument constraints? + if ($stpdata{$stpname}{$stpopt}) { + + # What's the default value? + my $stpdef = $defaults{$stpname}{$stpopt}; + + # If there's no default, then this option doesn't apply to + # this printer. + if (defined($stpdef)) { + + my $foodefval = get_ev_key($stpdef, $drvname); + + if (0) { + print STDERR + " Default for $stpname/$stpopt is $stpdef aka $foodefval\n"; + } + + my $fooname; + for $fooname (@{$mapstp{$stpname}}) { + + if (0) { + print STDERR + " Printer $fooname takes option $stpopt.\n"; + } + + push (@PNCONS, + " \n", + " gimp-print\n", + " $fooname\n", + " $foodefval\n", + " \n"); + } + } + } + + } + + return join('', + "\n", + @PNCONS, + " \n"); +} + +sub optmap_pagesize { + my ($value) = @_; + + if (!defined $pagemap) { + open PUTIL, "./paper_sizes |" or die "Cannot run paper_sizes: $!\n"; + while () { + chomp; + $_ =~ m!^\s*(.+\S)\s+([0-9]+)\s+([0-9]+)\s*$!; + my ($name, $width, $height) = ($1, $2, $3); + if ($width >= 0 and $height >= 0) { + $pagemap->{$name} = "$width $height"; +# print STDERR "PageSize '$name' driverval '$width $height'\n"; + } + } + close PUTIL; + } + + return $pagemap->{$value} +} + +sub optmap_color { + my ($value) = @_; + if (defined $colormap{$value}) { + return $colormap{$value}; + } else { + die "Cannot map output type '$value'\n"; + } +} + +sub build_model_cons { + my ($stpopt) = @_; + my $drvname = $generalsubs->{'DRVNAME'}; + + + # OK, this is funky. For each stp model, we have a choice. That + # choice is valid for only the foo printers that correspond. For + # any given foo printer, there is *exactly one* available choice. + # The defval is the one available choice. Backends and + # applications do not show choices with only one option; they just + # select that option. So we don't bother to make pretty option + # names or anything. + # + # See also build_model_ev() + + my @PNCONS = (); + + # For each stp printer... + my $stpname; + for $stpname (keys(%mapstp)) { + + # For each possible foo name + my $fooname; + for $fooname (@{$mapstp{$stpname}}) { + + # What's the default value? + my $foodefval = get_ev_key($stpname, $drvname); + + push (@PNCONS, + " \n", + " $drvname\n", + " $fooname\n", + " $foodefval\n", + " \n"); + } + } + + return join('', + "\n", + @PNCONS, + " \n"); + + +} + +# See build_model_cons, above. +sub build_model_ev { + my ($stpopt) = @_; + my $drvname = $generalsubs->{'DRVNAME'}; + + my @vals = (); + + # OK, now for each enum_val + my $ev; + for $ev (keys(%mapstp)) { + # Put in the basic choice info: ev names, etc + my $ev_shortname = $ev; + my $ev_longname = $printer_name{$ev}; + my $ev_shortname = get_ev_shortname($ev); + my $ev_id = get_ev_key($ev, $drvname); + my $ev_driverval = $ev; + + push (@vals, + " \n", + " $ev_longname\n", + " $ev_shortname\n", + " $ev_driverval\n", + " \n", + " \n", + " \n", + " $drvname\n", + " \n", + " \n", + ); + + # This stp Model value applies only to mapped foo printers + my $fooprn; + for $fooprn (@{$mapstp{$ev}}) { + + # OK, this choice applies to this enum + push (@vals, + " \n", + " \n", + " $drvname\n", + " $fooprn\n", + " \n"); + } + + push (@vals, + " \n", + " \n"); + } + + return join('', + "\n", + @vals, + " \n"); +} + + +# Stuff for Resolution. +# +# printer_options gives us Quality information. We examine this to +# determine what to do for the gs resolution argument: +# +# - Is this a 180/360/720 printer or a 150/300/600 printer? +# +# - What are the legal resolutions? Sort of parse and compute these +# from the Resolution values. +# +# The driverval is "x y", and gets passedin a /HWResolution ps clause + +sub compute_resolutions { + my ($stpname) = @_; + + if (!defined($rescache{$stpname})) { + + my @reslist = (); + my %hash; + my $defval; + + my $qual; + for $qual (keys(%{$stpdata{$stpname}{'Resolution'}})) { + $qual =~ m!(\d+)\s*(x\s*(\d+))?!; + my ($x, $y) = ($1, $3); + $y = $x if !defined($y); + + my $r = {'x' => $x, + 'y' => $y, + 'driverval' => "$x $y", + 'ev_key' => get_ev_key("res-$x-$y", "gimp-print") + }; + push (@reslist, $r); + + # Default? + $defval = get_ev_key("res-$x-$y", "gimp-print") + if ($qual eq $defaults{$stpname}{'Resolution'}); + + # Note that this resolution value exists + $resolutions{"$x $y"} = { 'x' => $x, + 'y' => $y }; + + # Note that this printer takes this resolution + $hash{$x}{$y} = 1; + + } + + $rescache{$stpname}{'list'} = \@reslist; + $rescache{$stpname}{'defval'} = $defval; + $rescache{$stpname}{'takesit'} = \%hash; + + die "No default gsResolution found for printer $stpname!?\n" + if ! defined($defval); + } + + return $rescache{$stpname}; +} + +sub do_all_res { + my $n; + for $n (keys(%mapstp)) { + compute_resolutions($n); + } +} + +sub build_resolution_ev { + my ($stpopt) = @_; + my $drvname = $generalsubs->{'DRVNAME'}; + + my @vals = (); + + do_all_res(); + + # OK, now for each possible resolution... + my $ev; + for $ev (keys(%resolutions)) { + + my ($x, $y) = ($resolutions{$ev}{'x'}, $resolutions{$ev}{'y'}); + + # Put in the basic choice info: ev names, etc + my $ev_longname = "$x x $y DPI"; + my $ev_shortname = get_ev_shortname($ev_longname); + my $ev_id = get_ev_key("res-$x-$y", $drvname); + my $ev_driverval = "$x $y"; + + push (@vals, + " \n", + " $ev_longname\n", + " $ev_shortname\n", + " $ev_driverval\n", + " \n", + " \n", + " \n", + " $drvname\n", + " \n", + " \n", + ); + + # Now, for each printer, put in a constraint if this + # resolution makes sense or not... + my $stpprn; + for $stpprn (keys(%mapstp)) { + + my $resobj = compute_resolutions($stpprn); + my $takesit = $resobj->{'takesit'}{$x}{$y}; + + if ($takesit) { + my $fooprn; + for $fooprn (@{$mapstp{$stpprn}}) { + +# print STDERR "Printer $fooprn $stpprn uses ${x}x$y\n"; + + # OK, this choice applies to this enum + push (@vals, + " \n", + " $drvname\n", + " $fooprn\n", + " \n"); + } + } + + } + + push (@vals, + " \n", + " \n"); + } + + return join('', + "\n", + @vals, + " \n"); +} + +sub build_resolution_cons { + my ($stpopt) = @_; + my $drvname = $generalsubs->{'DRVNAME'}; + + my @PNCONS = (); + + # For each stp printer... + my $stpname; + for $stpname (keys(%mapstp)) { + + # Get some resolution info + my $r = compute_resolutions($stpname); + + # For each possible foo name + my $fooname; + for $fooname (@{$mapstp{$stpname}}) { + + # What's the default value? + my $foodefval = $r->{'defval'}; + + push (@PNCONS, + " \n", + " $drvname\n", + " $fooname\n", + " $foodefval\n", + " \n"); + } + } + + return join('', + "\n", + @PNCONS, + " \n"); +} + + +exit(0); + diff --git a/src/foomatic/foomatic-printermap b/src/foomatic/foomatic-printermap new file mode 100644 index 0000000..55d5faf --- /dev/null +++ b/src/foomatic/foomatic-printermap @@ -0,0 +1,294 @@ +#gptofoo bjc-30 printer/423826 +#gptofoo bjc-50 printer/551346 +#gptofoo bjc-55 printer/551282 +#gptofoo bjc-80 printer/96512 +#gptofoo bjc-85 printer/551410 +#gptofoo bjc-210 printer/58752 +#gptofoo bjc-240 printer/58816 +#gptofoo bjc-250 printer/60384 +#gptofoo bjc-1000 printer/139017 +#gptofoo bjc-2000 printer/89152 +#gptofoo bjc-3000 printer/129472 +#gptofoo bjc-4300 printer/60544 +#gptofoo bjc-4400 printer/62240 +#gptofoo bjc-6000 printer/71392 +#gptofoo bjc-6100 printer/317225 +#gptofoo bjc-6200 printer/413673 +#gptofoo bjc-6500 printer/272681 +#gptofoo bjc-7000 printer/60672 +#gptofoo bjc-7100 printer/114656 +#gptofoo bjc-8200 printer/123776 +#gptofoo bjc-s400 printer/602258 +#gptofoo bjc-s450 printer/479986 +#gptofoo bjc-s800 printer/Canon-S800 +#gptofoo bjc-s4500 printer/602386 +#gptofoo escp2-c20sx printer/Epson-Stylus_C20SX +#gptofoo escp2-c20ux printer/Epson-Stylus_C20UX +#gptofoo escp2-c40sx printer/Epson-Stylus_C40SX +#gptofoo escp2-c40ux printer/Epson-Stylus_C40UX +#gptofoo escp2-c60 printer/Epson-Stylus_C60 +#gptofoo escp2-c70 printer/Epson-Stylus_C70 +#gptofoo escp2-c80 printer/Epson-Stylus_C80 +#gptofoo escp2 printer/61184 +#gptofoo escp2-pro printer/25824 +#gptofoo escp2-pro-xl printer/65856 +#gptofoo escp2-400 printer/62912 +#gptofoo escp2-440 printer/75296 +#gptofoo escp2-460 printer/73472 +#gptofoo escp2-480 printer/317321 +#gptofoo escp2-500 printer/214153 +#gptofoo escp2-580 printer/607474 +#gptofoo escp2-600 printer/26016 +#gptofoo escp2-640 printer/66016 +#gptofoo escp2-660 printer/244361 +#gptofoo escp2-670 printer/266313 +#gptofoo escp2-680 printer/517810 +#gptofoo escp2-740 printer/62112 +#gptofoo escp2-760 printer/96288 +#gptofoo escp2-777 printer/464242 +#gptofoo escp2-800 printer/61344 +#gptofoo escp2-850 printer/63840 +#gptofoo escp2-860 printer/80896 +#gptofoo escp2-880 printer/317801 +#gptofoo escp2-83 printer/Epson-Stylus_Color_8_3 +#gptofoo escp2-900 printer/92192 +#gptofoo escp2-980 printer/317865 +#gptofoo escp2-1160 printer/317481 +#gptofoo escp2-1500 printer/317385 +#gptofoo escp2-1520 printer/20672 +#gptofoo escp2-3000 printer/208969 +#gptofoo escp2-photo printer/83520 +#gptofoo escp2-700 printer/71424 +#gptofoo escp2-ex printer/75808 +#gptofoo escp2-720 printer/317545 +#gptofoo escp2-750 printer/60128 +#gptofoo escp2-780 printer/Epson-Stylus_Photo_780 +#gptofoo escp2-785 printer/Epson-Stylus_Photo_785 +#gptofoo escp2-790 printer/Epson-Stylus_Photo_790 +#gptofoo escp2-810 printer/Epson-Stylus_Photo_810 +#gptofoo escp2-820 printer/Epson-Stylus_Photo_820 +#gptofoo escp2-870 printer/284105 +#gptofoo escp2-875 printer/Epson-Stylus_Photo_875 +#gptofoo escp2-890 printer/Epson-Stylus_Photo_890 +#gptofoo escp2-895 printer/Epson-Stylus_Photo_895 +#gptofoo escp2-1200 printer/167008 +#gptofoo escp2-1270 printer/284169 +#gptofoo escp2-1280 printer/Epson-Stylus_Photo_1280 +#gptofoo escp2-1290 printer/Epson-Stylus_Photo_1290 +#gptofoo escp2-2000 printer/317609 +#gptofoo escp2-5000 printer/Epson-Stylus_Pro_5000 +#gptofoo escp2-5500 printer/Epson-Stylus_Pro_5500 +#gptofoo escp2-7000 printer/Epson-Stylus_Pro_7000 +#gptofoo escp2-7500 printer/Epson-Stylus_Pro_7500 +#gptofoo escp2-9000 printer/Epson-Stylus_Pro_9000 +#gptofoo escp2-9500 printer/Epson-Stylus_Pro_9500 +#gptofoo escp2-10000 printer/Epson-Stylus_Pro_10000 +#gptofoo escp2-scan2000 printer/Epson-Stylus_Scan_2000 +#gptofoo escp2-scan2500 printer/516274 +#gptofoo pcl-340 printer/153056 +#gptofoo pcl-400 printer/63040 +#gptofoo pcl-500 printer/58363 +#gptofoo pcl-501 printer/79840 +#gptofoo pcl-520 printer/129184 +#gptofoo pcl-540 printer/99616 +#gptofoo pcl-550 printer/58464 +#gptofoo pcl-560 printer/22624 +#gptofoo pcl-600 printer/64576 +#gptofoo pcl-601 printer/206505 +#gptofoo pcl-601 printer/219977 +#gptofoo pcl-601 printer/174249 +#gptofoo pcl-601 printer/64192 +#gptofoo pcl-601 printer/60928 +#gptofoo pcl-601 printer/68512 +#gptofoo pcl-601 printer/624114 +#gptofoo pcl-601 printer/75520 +#gptofoo pcl-601 printer/HP-DeskJet_640C +#gptofoo pcl-601 printer/448242 +#gptofoo pcl-690 printer/60960 +#gptofoo pcl-690 printer/249705 +#gptofoo pcl-690 printer/HP-DeskJet_693C +#gptofoo pcl-690 printer/70560 +#gptofoo pcl-690 printer/HP-DeskJet_695C +#gptofoo pcl-690 printer/68672 +#gptofoo pcl-750 printer/HP-DesignJet_750 +#gptofoo pcl-750 printer/122496 +#gptofoo pcl-810 printer/156105 +#gptofoo pcl-810 printer/HP-DeskJet_830C +#gptofoo pcl-810 printer/250601 +#gptofoo pcl-812 printer/161705 +#gptofoo pcl-812 printer/293641 +#gptofoo pcl-840 printer/133664 +#gptofoo pcl-842 printer/133152 +#gptofoo pcl-845 printer/HP-DeskJet_845C +#gptofoo pcl-850 printer/61024 +#gptofoo pcl-855 printer/60992 +#gptofoo pcl-870 printer/60256 +#gptofoo pcl-890 printer/226985 +#gptofoo pcl-895 printer/72000 +#gptofoo pcl-900 printer/175232 +#gptofoo pcl-900 printer/108320 +#gptofoo pcl-900 printer/273833 +#gptofoo pcl-900 printer/HP-DeskJet_952C +#gptofoo pcl-900 printer/186729 +#gptofoo pcl-900 printer/530418 +#gptofoo pcl-1100 printer/22720 +#gptofoo pcl-1120 printer/76896 +#gptofoo pcl-1200 printer/63712 +#gptofoo pcl-1220 printer/290953 +#gptofoo pcl-1600 printer/61120 +#gptofoo pcl-1600 printer/61152 +#gptofoo pcl-2000 printer/65984 +#gptofoo pcl-2500 printer/64512 +#gptofoo pcl-P1000 printer/131424 +#gptofoo pcl-P1100 printer/259689 +#gptofoo pcl-2 printer/114592 +#gptofoo pcl-2 printer/234953 +#gptofoo pcl-2 printer/48064 +#gptofoo pcl-2 printer/195529 +#gptofoo pcl-2 printer/316361 +#gptofoo pcl-2 printer/547378 +#gptofoo pcl-2 printer/110624 +#gptofoo pcl-2 printer/63200 +#gptofoo pcl-2 printer/487986 +#gptofoo pcl-2 printer/552146 +#gptofoo pcl-2 printer/114816 +#gptofoo pcl-2 printer/108896 +#gptofoo pcl-2 printer/178185 +#gptofoo pcl-2 printer/63904 +#gptofoo pcl-2 printer/204617 +#gptofoo pcl-2 printer/74592 +#gptofoo pcl-2 printer/231689 +#gptofoo pcl-2 printer/195593 +#gptofoo pcl-2 printer/365417 +#gptofoo pcl-2 printer/94016 +#gptofoo pcl-2 printer/144320 +#gptofoo pcl-2 printer/123968 +#gptofoo pcl-2 printer/81408 +#gptofoo pcl-2 printer/211017 +#gptofoo pcl-2 printer/81568 +#gptofoo pcl-2 printer/160288 +#gptofoo pcl-2 printer/23104 +#gptofoo pcl-2 printer/74176 +#gptofoo pcl-2 printer/34016 +#gptofoo pcl-2 printer/70720 +#gptofoo pcl-2 printer/117472 +#gptofoo pcl-2 printer/61824 +#gptofoo pcl-2 printer/61728 +#gptofoo pcl-2 printer/61888 +#gptofoo pcl-2 printer/70016 +#gptofoo pcl-2 printer/194601 +#gptofoo pcl-2 printer/196201 +#gptofoo pcl-2 printer/65280 +#gptofoo pcl-2 printer/312329 +#gptofoo pcl-2 printer/312393 +#gptofoo pcl-2 printer/80160 +#gptofoo pcl-3 printer/65696 +#gptofoo pcl-3 printer/48064 +#gptofoo pcl-3 printer/141417 +#gptofoo pcl-3 printer/257577 +#gptofoo pcl-3 printer/135401 +#gptofoo pcl-3 printer/67456 +#gptofoo pcl-3 printer/373513 +#gptofoo pcl-3 printer/619666 +#gptofoo pcl-3 printer/69472 +#gptofoo pcl-3 printer/78144 +#gptofoo pcl-3 printer/86176 +#gptofoo pcl-3 printer/487986 +#gptofoo pcl-3 printer/114816 +#gptofoo pcl-3 printer/65312 +#gptofoo pcl-3 printer/96480 +#gptofoo pcl-3 printer/23168 +#gptofoo pcl-4 printer/190793 +#gptofoo pcl-4 printer/63584 +#gptofoo pcl-4 printer/63552 +#gptofoo pcl-4 printer/539634 +#gptofoo pcl-4 printer/63456 +#gptofoo pcl-4 printer/73216 +#gptofoo pcl-4 printer/99840 +#gptofoo pcl-4 printer/185225 +#gptofoo pcl-4 printer/78336 +#gptofoo pcl-4 printer/165408 +#gptofoo pcl-4 printer/165536 +#gptofoo pcl-4 printer/121952 +#gptofoo pcl-4 printer/63008 +#gptofoo pcl-4 printer/56672 +#gptofoo pcl-4 printer/158569 +#gptofoo pcl-4 printer/633554 +#gptofoo pcl-4 printer/76224 +#gptofoo pcl-4 printer/116256 +#gptofoo pcl-4 printer/491506 +#gptofoo pcl-4 printer/75104 +#gptofoo pcl-4 printer/69120 +#gptofoo pcl-4 printer/69088 +#gptofoo pcl-4 printer/230377 +#gptofoo pcl-4 printer/439570 +#gptofoo pcl-4 printer/191689 +#gptofoo pcl-4 printer/128576 +#gptofoo pcl-4 printer/311113 +#gptofoo pcl-4 printer/619538 +#gptofoo pcl-4 printer/59584 +#gptofoo pcl-4 printer/63648 +#gptofoo pcl-4 printer/66496 +#gptofoo pcl-4 printer/76064 +#gptofoo pcl-4 printer/76096 +#gptofoo pcl-4 printer/66528 +#gptofoo pcl-4 printer/61856 +#gptofoo pcl-4 printer/129376 +#gptofoo pcl-4 printer/63616 +#gptofoo pcl-4 printer/194697 +#gptofoo pcl-4 printer/64032 +#gptofoo pcl-4 printer/62976 +#gptofoo pcl-4 printer/77088 +#gptofoo pcl-4 printer/188457 +#gptofoo pcl-4 printer/421586 +#gptofoo pcl-4 printer/490898 +#gptofoo pcl-4 printer/32672 +#gptofoo pcl-4 printer/210153 +#gptofoo pcl-4 printer/32768 +#gptofoo pcl-4 printer/42048 +#gptofoo pcl-4 printer/87552 +#gptofoo pcl-4 printer/77152 +#gptofoo pcl-4 printer/70752 +#gptofoo pcl-4 printer/113888 +#gptofoo pcl-4l printer/257577 +#gptofoo pcl-4l printer/59776 +#gptofoo pcl-4l printer/82496 +#gptofoo pcl-4v printer/439378 +#gptofoo pcl-5 printer/63520 +#gptofoo pcl-4 printer/62720 +#gptofoo pcl-5 printer/75168 +#gptofoo pcl-5si printer/605074 +#gptofoo pcl-6 printer/551474 +#gptofoo pcl-6 printer/77248 +#gptofoo pcl-6 printer/77216 +#gptofoo pcl-6 printer/234281 +#gptofoo pcl-6 printer/642674 +#gptofoo pcl-6 printer/102080 +#gptofoo pcl-6 printer/334409 +#gptofoo pcl-6 printer/32736 +#gptofoo pcl-6 printer/32832 +#gptofoo pcl-6 printer/212905 +#gptofoo pcl-6 printer/581554 +#gptofoo pcl-6 printer/23232 +#gptofoo pcl-6 printer/62368 +#gptofoo pcl-6 printer/64096 +#gptofoo pcl-6 printer/474610 +#gptofoo pcl-6 printer/609714 +#gptofoo pcl-6 printer/100576 +#gptofoo pcl-6 printer/62304 +#gptofoo pcl-6 printer/247625 +#gptofoo pcl-6 printer/543058 +#gptofoo pcl-6 printer/287337 +#gptofoo pcl-6 printer/62816 +#gptofoo pcl-6 printer/71680 +#gptofoo pcl-6 printer/HP-LaserJet_1200 +#gptofoo pcl-6 printer/HP-LaserJet_1220 +#gptofoo pcl-6 printer/HP-LaserJet_2200 +#gptofoo pcl-6 printer/HP-LaserJet_3200m +#gptofoo pcl-6 printer/HP-LaserJet_4100 +#gptofoo pcl-6 printer/HP-LaserJet_8150 +#gptofoo pcl-6 printer/HP-LaserJet_9000 +#gptofoo lexmark-4076 printer/Lexmark-4076 +#gptofoo lexmark-z42 printer/593266 +#gptofoo lexmark-z43 printer/Lexmark-Z43 +#gptofoo lexmark-z52 printer/328553 diff --git a/src/foomatic/foomatic-templates/Brightness.xml b/src/foomatic/foomatic-templates/Brightness.xml new file mode 100644 index 0000000..dade025 --- /dev/null +++ b/src/foomatic/foomatic-templates/Brightness.xml @@ -0,0 +1,24 @@ + diff --git a/src/foomatic/foomatic-templates/Color.xml b/src/foomatic/foomatic-templates/Color.xml new file mode 100644 index 0000000..4645b92 --- /dev/null +++ b/src/foomatic/foomatic-templates/Color.xml @@ -0,0 +1,21 @@ + diff --git a/src/foomatic/foomatic-templates/Contrast.xml b/src/foomatic/foomatic-templates/Contrast.xml new file mode 100644 index 0000000..aa5d31a --- /dev/null +++ b/src/foomatic/foomatic-templates/Contrast.xml @@ -0,0 +1,24 @@ + diff --git a/src/foomatic/foomatic-templates/Cyan.xml b/src/foomatic/foomatic-templates/Cyan.xml new file mode 100644 index 0000000..04c9fe0 --- /dev/null +++ b/src/foomatic/foomatic-templates/Cyan.xml @@ -0,0 +1,24 @@ + diff --git a/src/foomatic/foomatic-templates/Density.xml b/src/foomatic/foomatic-templates/Density.xml new file mode 100644 index 0000000..364e880 --- /dev/null +++ b/src/foomatic/foomatic-templates/Density.xml @@ -0,0 +1,24 @@ + diff --git a/src/foomatic/foomatic-templates/Dither.xml b/src/foomatic/foomatic-templates/Dither.xml new file mode 100644 index 0000000..e94694c --- /dev/null +++ b/src/foomatic/foomatic-templates/Dither.xml @@ -0,0 +1,21 @@ + diff --git a/src/foomatic/foomatic-templates/Gamma.xml b/src/foomatic/foomatic-templates/Gamma.xml new file mode 100644 index 0000000..b0cd4e4 --- /dev/null +++ b/src/foomatic/foomatic-templates/Gamma.xml @@ -0,0 +1,24 @@ + diff --git a/src/foomatic/foomatic-templates/ImageType.xml b/src/foomatic/foomatic-templates/ImageType.xml new file mode 100644 index 0000000..998fad0 --- /dev/null +++ b/src/foomatic/foomatic-templates/ImageType.xml @@ -0,0 +1,63 @@ + diff --git a/src/foomatic/foomatic-templates/InkType.xml b/src/foomatic/foomatic-templates/InkType.xml new file mode 100644 index 0000000..25f6d17 --- /dev/null +++ b/src/foomatic/foomatic-templates/InkType.xml @@ -0,0 +1,21 @@ + diff --git a/src/foomatic/foomatic-templates/InputSlot.xml b/src/foomatic/foomatic-templates/InputSlot.xml new file mode 100644 index 0000000..bd03051 --- /dev/null +++ b/src/foomatic/foomatic-templates/InputSlot.xml @@ -0,0 +1,20 @@ + diff --git a/src/foomatic/foomatic-templates/Magenta.xml b/src/foomatic/foomatic-templates/Magenta.xml new file mode 100644 index 0000000..15da1b9 --- /dev/null +++ b/src/foomatic/foomatic-templates/Magenta.xml @@ -0,0 +1,24 @@ + diff --git a/src/foomatic/foomatic-templates/MediaType.xml b/src/foomatic/foomatic-templates/MediaType.xml new file mode 100644 index 0000000..a5e1ec8 --- /dev/null +++ b/src/foomatic/foomatic-templates/MediaType.xml @@ -0,0 +1,21 @@ + diff --git a/src/foomatic/foomatic-templates/Model.xml b/src/foomatic/foomatic-templates/Model.xml new file mode 100644 index 0000000..98e081a --- /dev/null +++ b/src/foomatic/foomatic-templates/Model.xml @@ -0,0 +1,21 @@ + diff --git a/src/foomatic/foomatic-templates/PageSize.xml b/src/foomatic/foomatic-templates/PageSize.xml new file mode 100644 index 0000000..137e2e6 --- /dev/null +++ b/src/foomatic/foomatic-templates/PageSize.xml @@ -0,0 +1,21 @@ + diff --git a/src/foomatic/foomatic-templates/Quality.xml b/src/foomatic/foomatic-templates/Quality.xml new file mode 100644 index 0000000..e3ba47b --- /dev/null +++ b/src/foomatic/foomatic-templates/Quality.xml @@ -0,0 +1,21 @@ + diff --git a/src/foomatic/foomatic-templates/Resolution.xml b/src/foomatic/foomatic-templates/Resolution.xml new file mode 100644 index 0000000..f45a7f5 --- /dev/null +++ b/src/foomatic/foomatic-templates/Resolution.xml @@ -0,0 +1,21 @@ + diff --git a/src/foomatic/foomatic-templates/Saturation.xml b/src/foomatic/foomatic-templates/Saturation.xml new file mode 100644 index 0000000..781deea --- /dev/null +++ b/src/foomatic/foomatic-templates/Saturation.xml @@ -0,0 +1,24 @@ + diff --git a/src/foomatic/foomatic-templates/Yellow.xml b/src/foomatic/foomatic-templates/Yellow.xml new file mode 100644 index 0000000..7d93002 --- /dev/null +++ b/src/foomatic/foomatic-templates/Yellow.xml @@ -0,0 +1,24 @@ + diff --git a/src/foomatic/foomatic-templates/gimp-print.xml b/src/foomatic/foomatic-templates/gimp-print.xml new file mode 100644 index 0000000..e6be537 --- /dev/null +++ b/src/foomatic/foomatic-templates/gimp-print.xml @@ -0,0 +1,26 @@ + + @@DRVNAME@@ + http://gimp-print.sourceforge.net/ + + + gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=stp %A%Z -sOutputFile=- - + + + STP supports a wide variety of Epson Stylus, HP DeskJet and LaserJet, + and Canon BubbleJet printers, with the primary goal being + uncompromising quality. Epson Stylus printers in particular are + supported in all resolutions and modes, and the latest printers are + capable of producing prints that rival photographic prints in + quality. This package also offers much faster printing for high + quality text and presentation graphics when required. + <p> + The execution information currently here corresponds to driver version + @@STPVER@@. + <p> + To get a pre-patched/pre-compiled GNU-GhostScript 5.50 with this driver + (version 4.0.4) download sources and binaries of + <a href="ftp://ftp2.easysw.com/pub/ghostscript/">ESP + GhostScript</a>. + + @@STPRINTERS@@ + \ No newline at end of file diff --git a/src/foomatic/gimp-print-version.c b/src/foomatic/gimp-print-version.c new file mode 100644 index 0000000..1b10dd0 --- /dev/null +++ b/src/foomatic/gimp-print-version.c @@ -0,0 +1,44 @@ +/* + * "$Id: gimp-print-version.c,v 1.2 2001/09/02 13:30:26 rlk Exp $" + * + * Dump the per-printer options for Grant Taylor's *-omatic database + * + * Copyright 2000 Robert Krawitz (rlk@alum.mit.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#ifdef INCLUDE_GIMP_PRINT_H +#include INCLUDE_GIMP_PRINT_H +#else +#include +#endif +#include "../../lib/libprintut.h" + +int +main(int argc, char **argv) +{ +#ifdef VERSION + printf("%s\n", VERSION); + return 0; +#else + fprintf(stderr, "VERSION not defined!\n"); + return 1; +#endif +} diff --git a/src/foomatic/paper_sizes.c b/src/foomatic/paper_sizes.c new file mode 100644 index 0000000..2165875 --- /dev/null +++ b/src/foomatic/paper_sizes.c @@ -0,0 +1,46 @@ +/* + * "$Id: paper_sizes.c,v 1.4 2001/09/02 13:30:26 rlk Exp $" + * + * Dump the per-printer options for Grant Taylor's *-omatic database + * + * Copyright 2000 Robert Krawitz (rlk@alum.mit.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#ifdef INCLUDE_GIMP_PRINT_H +#include INCLUDE_GIMP_PRINT_H +#else +#include +#endif +#include "../../lib/libprintut.h" + +int +main(int argc, char **argv) +{ + int i; + for (i = 0; i < stp_known_papersizes(); i++) + { + const stp_papersize_t p = stp_get_papersize_by_index(i); + printf("%s %d %d\n", stp_papersize_get_name(p), + stp_papersize_get_width(p), + stp_papersize_get_height(p)); + } + return 0; +} diff --git a/src/foomatic/printer_options.c b/src/foomatic/printer_options.c new file mode 100644 index 0000000..462fb3a --- /dev/null +++ b/src/foomatic/printer_options.c @@ -0,0 +1,119 @@ +/* + * "$Id: printer_options.c,v 1.9 2001/09/02 13:30:26 rlk Exp $" + * + * Dump the per-printer options for Grant Taylor's *-omatic database + * + * Copyright 2000 Robert Krawitz (rlk@alum.mit.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#ifdef INCLUDE_GIMP_PRINT_H +#include INCLUDE_GIMP_PRINT_H +#else +#include +#endif +#include "../../lib/libprintut.h" + +const char *params[] = +{ + "PageSize", + "Resolution", + "InkType", + "MediaType", + "InputSlot" +}; + +int nparams = sizeof(params) / sizeof(const char *); + +int +main(int argc, char **argv) +{ + int i, j, k; + for (i = 0; i < stp_known_printers(); i++) + { + const stp_printer_t p = stp_get_printer_by_index(i); + const stp_vars_t pv = stp_printer_get_printvars(p); + stp_param_t *retval; + const char *retval1; + int count; + int tcount = 0; + printf("# Printer model %s, long name `%s'\n", + stp_printer_get_driver(p), stp_printer_get_long_name(p)); + for (k = 0; k < nparams; k++) + { + retval1 = (*stp_printer_get_printfuncs(p)->default_parameters) + (p, NULL, params[k]); + if (retval1) + printf("$defaults{'%s'}{'%s'} = '%s';\n", + stp_printer_get_driver(p), params[k], retval1); + retval = (*stp_printer_get_printfuncs(p)->parameters)(p, NULL, params[k], &count); + if (count > 0) + { + for (j = 0; j < count; j++) + { + printf("$stpdata{'%s'}{'%s'}{'%s'} = '%s';\n", + stp_printer_get_driver(p), params[k], retval[j].name, + retval[j].text); + free((void *)retval[j].name); + free((void *)retval[j].text); + } + free(retval); + } + tcount += count; + } + if (tcount > 0) + { + printf("$defaults{'%s'}{'%s'} = '%s';\n", + stp_printer_get_driver(p), "Dither", + stp_dither_algorithm_name(0)); + for (k = 0; k < stp_dither_algorithm_count(); k++) + printf("$stpdata{'%s'}{'%s'}{'%s'} = '%s';\n", + stp_printer_get_driver(p), "Dither", + stp_dither_algorithm_name(k), + stp_dither_algorithm_text(k)); + if (stp_get_output_type(pv) == OUTPUT_COLOR) + { + printf("$defaults{'%s'}{'%s'} = '%s';\n", + stp_printer_get_driver(p), "Color", "Color"); + printf("$stpdata{'%s'}{'%s'}{'%s'} = '%s';\n", + stp_printer_get_driver(p), "Color", "Color", + "Color"); + printf("$stpdata{'%s'}{'%s'}{'%s'} = '%s';\n", + stp_printer_get_driver(p), "Color", "Grayscale", + "Gray Scale"); + printf("$stpdata{'%s'}{'%s'}{'%s'} = '%s';\n", + stp_printer_get_driver(p), "Color", "BlackAndWhite", + "Black and White"); + } + else + { + printf("$defaults{'%s'}{'%s'} = '%s';\n", + stp_printer_get_driver(p), "Color", "Grayscale"); + printf("$stpdata{'%s'}{'%s'}{'%s'} = '%s';\n", + stp_printer_get_driver(p), "Color", "Grayscale", + "Grayscale"); + printf("$stpdata{'%s'}{'%s'}{'%s'} = '%s';\n", + stp_printer_get_driver(p), "Color", "BlackAndWhite", + "Black and White"); + } + } + } + return 0; +} diff --git a/src/foomatic/printers.c b/src/foomatic/printers.c new file mode 100644 index 0000000..6e7ab31 --- /dev/null +++ b/src/foomatic/printers.c @@ -0,0 +1,45 @@ +/* + * "$Id: printers.c,v 1.2 2001/09/02 13:30:26 rlk Exp $" + * + * Dump the per-printer options for Grant Taylor's *-omatic database + * + * Copyright 2000 Robert Krawitz (rlk@alum.mit.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#ifdef INCLUDE_GIMP_PRINT_H +#include INCLUDE_GIMP_PRINT_H +#else +#include +#endif +#include "../../lib/libprintut.h" + +int +main(int argc, char **argv) +{ + int i; + for (i = 0; i < stp_known_printers(); i++) + { + const stp_papersize_t p = stp_get_printer_by_index(i); + printf("$printer_name{'%s'} = '%s';\n", stp_printer_get_driver(p), + stp_printer_get_long_name(p)); + } + return 0; +} diff --git a/src/foomatic/stp_limits.c b/src/foomatic/stp_limits.c new file mode 100644 index 0000000..6015774 --- /dev/null +++ b/src/foomatic/stp_limits.c @@ -0,0 +1,98 @@ +/* + * "$Id: stp_limits.c,v 1.2 2001/09/02 13:30:26 rlk Exp $" + * + * Dump the per-printer options for Grant Taylor's *-omatic database + * + * Copyright 2000 Robert Krawitz (rlk@alum.mit.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#ifdef INCLUDE_GIMP_PRINT_H +#include INCLUDE_GIMP_PRINT_H +#else +#include +#endif +#include "../../lib/libprintut.h" + +int +main(int argc, char **argv) +{ + const stp_vars_t minimum = stp_minimum_settings(); + const stp_vars_t maximum = stp_maximum_settings(); + const stp_vars_t defvars = stp_default_settings(); + + printf("$stp_values{'MINVAL'}{'Brightness'} = %.3f\n", + stp_get_brightness(minimum)); + printf("$stp_values{'MAXVAL'}{'Brightness'} = %.3f\n", + stp_get_brightness(maximum)); + printf("$stp_values{'DEFVAL'}{'Brightness'} = %.3f\n", + stp_get_brightness(defvars)); + + printf("$stp_values{'MINVAL'}{'Contrast'} = %.3f\n", + stp_get_contrast(minimum)); + printf("$stp_values{'MAXVAL'}{'Contrast'} = %.3f\n", + stp_get_contrast(maximum)); + printf("$stp_values{'DEFVAL'}{'Contrast'} = %.3f\n", + stp_get_contrast(defvars)); + + printf("$stp_values{'MINVAL'}{'Density'} = %.3f\n", + stp_get_density(minimum)); + printf("$stp_values{'MAXVAL'}{'Density'} = %.3f\n", + stp_get_density(maximum)); + printf("$stp_values{'DEFVAL'}{'Density'} = %.3f\n", + stp_get_density(defvars)); + + printf("$stp_values{'MINVAL'}{'Gamma'} = %.3f\n", + stp_get_gamma(minimum)); + printf("$stp_values{'MAXVAL'}{'Gamma'} = %.3f\n", + stp_get_gamma(maximum)); + printf("$stp_values{'DEFVAL'}{'Gamma'} = %.3f\n", + stp_get_gamma(defvars)); + + printf("$stp_values{'MINVAL'}{'Cyan'} = %.3f\n", + stp_get_cyan(minimum)); + printf("$stp_values{'MAXVAL'}{'Cyan'} = %.3f\n", + stp_get_cyan(maximum)); + printf("$stp_values{'DEFVAL'}{'Cyan'} = %.3f\n", + stp_get_cyan(defvars)); + + printf("$stp_values{'MINVAL'}{'Magenta'} = %.3f\n", + stp_get_magenta(minimum)); + printf("$stp_values{'MAXVAL'}{'Magenta'} = %.3f\n", + stp_get_magenta(maximum)); + printf("$stp_values{'DEFVAL'}{'Magenta'} = %.3f\n", + stp_get_magenta(defvars)); + + printf("$stp_values{'MINVAL'}{'Yellow'} = %.3f\n", + stp_get_yellow(minimum)); + printf("$stp_values{'MAXVAL'}{'Yellow'} = %.3f\n", + stp_get_yellow(maximum)); + printf("$stp_values{'DEFVAL'}{'Yellow'} = %.3f\n", + stp_get_yellow(defvars)); + + printf("$stp_values{'MINVAL'}{'Saturation'} = %.3f\n", + stp_get_saturation(minimum)); + printf("$stp_values{'MAXVAL'}{'Saturation'} = %.3f\n", + stp_get_saturation(maximum)); + printf("$stp_values{'DEFVAL'}{'Saturation'} = %.3f\n", + stp_get_saturation(defvars)); + + return 0; +} diff --git a/src/ghost/.cvsignore b/src/ghost/.cvsignore new file mode 100644 index 0000000..a50caae --- /dev/null +++ b/src/ghost/.cvsignore @@ -0,0 +1,20 @@ +Makefile +Makefile.in +gdevstp-canon.c +gdevstp-color.c +gdevstp-dither.c +gdevstp-dither-matrices.c +gdevstp-escp2.c +gdevstp-lexmark.c +gdevstp-pcl.c +gdevstp-printers.c +gdevstp-ps.c +gdevstp-util.c +gdevstp-weave.c +gdevstp-print.h +gdevstp-print-internal.h +gdevstp-print-intl-internal.h +gdevstp-quickmatrix257.h +gdevstp-ran.367.179.h +gdevstp-ran.509.131.h +contrib.mak.addon diff --git a/src/ghost/COPYING b/src/ghost/COPYING new file mode 100644 index 0000000..a43ea21 --- /dev/null +++ b/src/ghost/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + 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 + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/src/ghost/Makefile.am b/src/ghost/Makefile.am new file mode 100644 index 0000000..9a34a59 --- /dev/null +++ b/src/ghost/Makefile.am @@ -0,0 +1,113 @@ +## $Id: Makefile.am,v 1.17 2001/10/17 12:12:07 rlk Exp $ +## Copyright (C) 2000 Roger Leigh +## +## 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, or (at your option) +## any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +## Process this file with automake to produce Makefile.in. + +AUTOMAKE_OPTIONS = 1.4 gnu + +@SET_MAKE@ + +MAINT_CHARSET = latin1 + +## Use old compatability method for now... + +## Variables + +MAINCODE = canon.c color.c dither.c escp2.c lexmark.c pcl.c printers.c ps.c util.c weave.c dither-matrices.c + +MAINHEADERS = print.h print-internal.h print-intl-internal.h quickmatrix257.h ran.367.179.h ran.509.131.h + +MAINFILES = $(MAINCODE) $(MAINHEADERS) + +if BUILD_GHOST +ALL_LOCAL_DEPS = $(srcdir)/$(addprefix gdevstp-,$(MAINCODE)) $(srcdir)/$(addprefix gdevstp-,$(MAINHEADERS)) +else +ALL_LOCAL_DEPS = +endif + + +## Rules + +all-local: $(ALL_LOCAL_DEPS) + +GHCODE = -e 's/print-printers.c/gdevstp-printers.c/' -e 's/^\\\#include "\(gimp\-\)*\(.*\)\.h"$$/\\\#include "gdevstp-\2.h"/' -e 's/^\\\#include $$/\\\#include "gdevstp-print\1.h"/' + +$(srcdir)/gdevstp-print.h: $(top_srcdir)/include/gimp-print/gimp-print.h + sed $(GHCODE) $< > $(srcdir)/$@ + +$(srcdir)/gdevstp-print-internal.h: $(top_srcdir)/src/main/gimp-print-internal.h + sed $(GHCODE) $< > $(srcdir)/$@ + +$(srcdir)/gdevstp-print-intl-internal.h: $(top_srcdir)/include/gimp-print/gimp-print-intl-internal.h + sed $(GHCODE) $< > $(srcdir)/$@ + +gdevstp-%.h: $(srcdir)/../main/%.h Makefile + cd $(srcdir) ; sed $(GHCODE) $< > $@ + +gdevstp-printers.c: ../main/print-printers.c + sed $(GHCODE) $< > $@ + +gdevstp-%: $(srcdir)/../main/print-% Makefile + cd $(srcdir) ; sed $(GHCODE) $< > $@ + +../main/print-printers.c: ../printdef/printdef $(srcdir)/../main/printers.xml + ../printdef/printdef < $(srcdir)/../main/printers.xml > $(top_builddir)/src/main/print-printers.c + +printdefl.o: printdefy.o + +../printdef/printdef: $(addprefix ../printdef/, printdefl.l printdefy.y printdef.h) + cd ../printdef ; \ + $(MAKE) + + +## Clean + +CLEANFILES = \ + $(srcdir)/gdevstp-printers.c \ + $(srcdir)/gdevstp-ran.367.179.h \ + $(srcdir)/gdevstp-ran.509.131.h \ + $(srcdir)/gdevstp-color.c \ + $(srcdir)/gdevstp-print.h \ + $(srcdir)/gdevstp-print-internal.h \ + $(srcdir)/gdevstp-print-intl-internal.h \ + $(srcdir)/gdevstp-quickmatrix257.h \ + $(srcdir)/gdevstp-util.c \ + $(srcdir)/gdevstp-weave.c \ + $(srcdir)/gdevstp-canon.c \ + $(srcdir)/gdevstp-dither.c \ + $(srcdir)/gdevstp-dither-matrices.c \ + $(srcdir)/gdevstp-escp2.c \ + $(srcdir)/gdevstp-lexmark.c \ + $(srcdir)/gdevstp-pcl.c \ + $(srcdir)/gdevstp-ps.c + +# End of old compatability cruft + +MAINTAINERCLEANFILES = Makefile.in + +EXTRA_DIST = \ + COPYING \ + Makefile \ + Makefile.am \ + README \ + README.bsd \ + contrib.mak.addon.in \ + contrib.mak.addon.old \ + debian-patch \ + debian-patch-stp \ + devs.mak.addon-5.10 \ + gdevstp.c \ diff --git a/src/ghost/README b/src/ghost/README new file mode 100644 index 0000000..a9193b6 --- /dev/null +++ b/src/ghost/README @@ -0,0 +1,1245 @@ +INTRODUCTION: +------------- + + Gimp-Print 4.2 includes an associated Ghostscript driver, which is + named `stp'. That name originally referred to Epson Stylus Photo + printers; this is the first Ghostscript driver which supported those + printers with high quality. The same driver now supports many Canon, + HP, and Lexmark printers. + + This driver works with GhostScript 5.10, 5.50, and 6.51. It should + work with any later releases on the 6.5x GNU Ghostscript line, such + as 6.52XS. Due to incompatibilities between the Aladdin Free Public + License (AFPL) and the GNU General Public License (GPL), this driver + may not be combined and distributed with versions of GhostScript not + covered by the GPL. We will not fix bugs reported against + combinations of this driver with AFPL-only versions of GhostScript. + + +AUTHOR: +------- + + This Ghostscript frontend was originally written by Henryk Richter + (buggs@comlab.uni-rostock.de); it since has been fully integrated + into gimp-print. Gimp-Print itself was originally written by Michael + Sweet , who released up to version 2.0; Robert + Krawitz released version 3.0. The gimp-print development team + (http://gimp-print.sourceforge.net) now maintains the entire package. + + +LICENSE: +-------- + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +BUILD AND INSTALLATION: +----- --- ------------- + +1) Get a recent Ghostscript (5.10, 5.50, or 6.51 or its successors) + and prepare the sources as described in the documentation (don`t + forget zlib, libpng and libjpeg when downloading the source) for + compiling + +2) If you are using Ghostscript 5.50 or 6.51, you have two choices. + The recommended (newer) method follows. This method builds the stp + driver by linking against the libgimpprint library that is + installed on your system. If you wish to use the older method (or + you're using Ghostscript 5.10), which actually installs all of the + Gimp-Print source files into your Ghostscript source tree, please + skip to step 7. We strongly recommend that all Ghostscript users, + except for those who cannot upgrade from 5.10, use the new method. + + +3) The recommended (newer) method requires you to build and install + Gimp-print, and links against the installed libgimpprint.so or + libgimpprint.a. Run + + ./configure + make + make install + + in the top level directory (../.. from here). + + "make install" typically needs to be run as root. You may also + need to run "ldconfig" as root following "make install". + + You may optionally run + + ./configure --without-gimp + + if you do not wish to build the Gimp Print plugin. Note that you + do *not* need to run "./configure --with-ghost" as before. + +4) Copy the file "gdevstp.c" from this directory into the Ghostscript + source directory. Depending upon the version of Ghostscript you + use, this may be either the top level of your Ghostscript source + distribution, or the "src/" subdirectory. + +5) Edit the file "contrib.mak" (in either the top level or src/ + subdirectory, depending upon your version of Ghostscript) by adding + the contents of "contrib.mak.addon", which should have been created + by running configure. Be careful to add *exactly* the contents of + this file; if you cut and paste it, you may find that the tab + characters in contrib.mak.addon get transformed into spaces, and as + a result when you run 'make' it will fail. + + If you reinstall Gimp-Print in a new location (by using configure + --prefix, configure --exec-prefix, or configure --includedir), you + must edit the contrib.mak file appropriately. The contrib.mak.addon + file in this directory is automatically updated by running configure. + +6) Skip to step 11. + + +7) If you are using Ghostscript 5.10, or prefer to use the old, tried + and true method for building the driver, run + + ./configure --with-ghost + make + + in the top level directory (../.. from here). + + You may optionally run + + ./configure --without-gimp --with-ghost + + if you do not wish to build the Gimp Print plugin. + +8) Copy all "*.c" and "*.h" files from this directory to the + Ghostscript source directory. Depending upon the version of + Ghostscript you use, this may be either the top level of your + Ghostscript source distribution, or the "src/" subdirectory. + +9) If you are using Ghostscript 5.50 or 6.51: edit the file + "contrib.mak" (in either the top level or src/ subdirectoy, + depending upon your version of Ghostscript) by adding the contents + of "contrib.mak.addon.old". Be careful to add *exactly* the + contents of this file; if you cut and paste it, you may find that + the tab characters in contrib.mak.addon get transformed into + spaces, and as a result when you run 'make' it will fail. + +10) If you are using Ghostscript 5.10: edit the file "devs.mak" (in + either the top level or src/ subdirectoy, depending upon your + version of Ghostscript) by adding the contents of + "devs.mak.addon-5.10". Be careful to add *exactly* the contents of + this file; if you cut and paste it, you may find that the tab + characters in contrib.mak.addon get transformed into spaces, and as + a result when you run 'make' it will fail. + + +11) Add "$(DD)stp.dev" to the line "DEVICE_DEVS6=..." in the makefile + used by Ghostscript (this is usually accessible as "makefile" in + the top level Ghostscript source, but that is normally just a + symbolic link to a system-specific makefile, such as unix-gcc.mak). + If there are multiple lines that start with DEVICE_DEVS6=, you may + add this to any such line. If there is no DEVICE_DEVS6= line, you + may add it to any other DEVICE_DEVSx line that is present. + +12) Compile and install gs as described in the Ghostscript + documentation. After a successful compiler run you get a new + driver named "stp". Check this by calling "gs -h" with the newly + compiled Ghostscript. + +The distribution includes a utility named "escputil" that performs +many utility functions, such as head cleaning, nozzle alignment, and +the like, for Epson Stylus printers. This is normally compiled by +"make" and installed by "make install". + + +DEBIAN: +------- + +Debian users can try the following (contributed by Stuart Miles and +updated by Dan Christensen ): versions are current +as of 5 October 2000. The Debian installation procedure is being +extensively redone as of February 2001. + +As of version 5.50 and 6.61, the current Debian packages in testing +(woody) and unstable (sid) are linked with libgimpprint, thus +saving you the effort of doing any patching yourself! Because it +uses a shared object (libgimpprint.so), you may upgrade the +gimp-print drivers simply by installing a newer version of the +libgimpprint library. + +NOTE: the script 'scripts/make-deb.sh' does the following for you. + It is probably better to upgrade to a new 5.50 or 6.51 release; + only use this if you are running stable (potato) or earlier. + +Download the debianised sources for gs-aladdin and libjpeg to the +directory containing the print-x.xxx directory: + +# apt-get source gs libjpeg62 + +(Make sure you have a deb-src entry in /etc/apt/sources.list first! +See the sources.list(5) man page for more info on setting up apt.) + +The name of the libjpeg package may vary. + +This will download the .dsc, orig.tar.gz and diff.gz files, unpack and +patch the files for you. + +Rename the libjpegxxx (currently libjpeg6b-6b) directory to libjpeg. + +To compile gs you will also need the following installed: + +# apt-get install sharutils zlib1g-dev svgalibg1-dev libpng2-dev vflib2-dev + +The name of the packages may vary. The above corresponds to + +sharutils 4.2.1-2 shar, unshar, uuencode, uudecode +zlib1g-dev 1.1.3-11 compression library - development +svgalibg1-dev 1.4.1-2 Shared, non-x, graphics library used by Ghos +libpng2-dev 1.0.8-1 PNG library - development +vflib2-dev 2.25.1-5 Vector Font Library for Japanese Character C + +but current versions (and possibly older versions) will probably +work as well. + +Next do the following: + +# mkdir gs-x.xx/contrib/stp +# cd print-x.xxx/Ghost +# cp gdevstp* *.mak.addon* ../../gs-x.xx/contrib/stp +# cp README ../../gs-x.xx/contrib/stp/README.stp +# cp debian-patch ../../gs-x.xx/debian +# cp debian-patch-stp ../../gs-x.xx/debian/patches/stp +# cd ../../gs-x.xx/debian +# patch < debian-patch [patches control and rules files] +# chmod u+x addentry [maybe this should be fixed in the tar file?] +# cd .. [now we are in gs-x.xx] +# debian/rules binary + +The rules script will copy the sourcefiles and README.stp into the +main gs directory, patch contrib.mak, add the stp entry to +unix-gcc.mak, compile gs, package it all up as a .deb package +(gs-stp_5.10-9.1_i386.deb) and put the resulting file in the directory +above gs. + +To install it: + +# cd .. +# dpkg -i gs-stp_5.10-9.1_i386.deb + +If you have gs or gs-aladdin installed, it will be removed. + +DISCLAIMER: + +This is not an official Debian package. This method works for at +least one person. To be really neat and tidy other files need +modifying to ensure that this custom package gets marked as such and +_not_ an official package. The only problem I've found is that I +the gs-pdfencrypt insists on having gs installed rather than gs-stp. +If you know how to fix this, please update this README. + + +OPTIONS: +-------- + +Overview: +--------- + +Options for the stp driver are given in normal Ghostscript +manner. The resolution of the image calculated by Ghostscript is not +bound to the resolution of the printer output. It is for example +possible to specify "-r360" to gs and print the output in 1440x720 +dpi (see below for driver parameter). The result is a somewhat faster +operation of the driver. + +The driver will not permit use of invalid settings. + +The options for this driver are very complex. We strongly recommend +use of a printer management system such as Foomatic rather than +configuring a spooler manually with this driver. + + +Printer Model Selection: +------- ----- ---------- + +-sModel=name + +This option must be supplied. There is no default. + +bjc-30 CANON BJC 30 +bjc-50 CANON BJC 50 +bjc-55 CANON BJC 55 +bjc-80 CANON BJC 80 +bjc-85 CANON BJC 85 +bjc-210 CANON BJC 210 +bjc-240 CANON BJC 240 +bjc-250 CANON BJC 250 +bjc-1000 CANON BJC 1000 +bjc-2000 CANON BJC 2000 +bjc-3000 CANON BJC 3000 +bjc-4300 CANON BJC 4300 +bjc-4400 CANON BJC 4400 photo +bjc-6000 CANON BJC 6000 +bjc-6100 CANON BJC 6100 +bjc-7000 CANON BJC 7000 +bjc-7100 CANON BJC 7100 +bjc-8200 CANON BJC 8200 +bjc-s400 CANON S400 +bjc-s450 CANON S450 +bjc-s800 CANON S800 +bjc-s4500 CANON S4500 +escp2-c20sx EPSON Stylus C20SX +escp2-c20ux EPSON Stylus C20UX +escp2-c40sx EPSON Stylus C40SX +escp2-c40ux EPSON Stylus C40UX +escp2-c60 EPSON Stylus C60 +escp2-c70 EPSON Stylus C70 +escp2-c80 EPSON Stylus C80 +escp2 EPSON Stylus Color +escp2-pro EPSON Stylus Color Pro +escp2-pro-xl EPSON Stylus Color Pro XL +escp2-400 EPSON Stylus Color 400 +escp2-440 EPSON Stylus Color 440 +escp2-460 EPSON Stylus Color 460 +escp2-480 EPSON Stylus Color 480 +escp2-500 EPSON Stylus Color 500 +escp2-580 EPSON Stylus Color 580 +escp2-600 EPSON Stylus Color 600 +escp2-640 EPSON Stylus Color 640 +escp2-660 EPSON Stylus Color 660 +escp2-670 EPSON Stylus Color 670 +escp2-680 EPSON Stylus Color 680 +escp2-740 EPSON Stylus Color 740 +escp2-760 EPSON Stylus Color 760 +escp2-777 EPSON Stylus Color 777 +escp2-800 EPSON Stylus Color 800 +escp2-850 EPSON Stylus Color 850 +escp2-860 EPSON Stylus Color 860 +escp2-880 EPSON Stylus Color 880 +escp2-83 EPSON Stylus Color 83 +escp2-900 EPSON Stylus Color 900 +escp2-980 EPSON Stylus Color 980 +escp2-1160 EPSON Stylus Color 1160 +escp2-1500 EPSON Stylus Color 1500 +escp2-1520 EPSON Stylus Color 1520 +escp2-3000 EPSON Stylus Color 3000 +escp2-photo EPSON Stylus Photo +escp2-700 EPSON Stylus Photo 700 +escp2-ex EPSON Stylus Photo EX +escp2-720 EPSON Stylus Photo 720 +escp2-750 EPSON Stylus Photo 750 +escp2-780 EPSON Stylus Photo 780 +escp2-785 EPSON Stylus Photo 785EPX +escp2-790 EPSON Stylus Photo 790 +escp2-810 EPSON Stylus Photo 810 +escp2-820 EPSON Stylus Photo 820 +escp2-870 EPSON Stylus Photo 870 +escp2-875 EPSON Stylus Photo 875 +escp2-890 EPSON Stylus Photo 890 +escp2-895 EPSON Stylus Photo 895 +escp2-1200 EPSON Stylus Photo 1200 +escp2-1270 EPSON Stylus Photo 1270 +escp2-1280 EPSON Stylus Photo 1280 +escp2-1290 EPSON Stylus Photo 1290 +escp2-2000 EPSON Stylus Photo 2000P +escp2-5000 EPSON Stylus Pro 5000 +escp2-5500 EPSON Stylus Pro 5500 +escp2-7000 EPSON Stylus Pro 7000 +escp2-7500 EPSON Stylus Pro 7500 +escp2-9000 EPSON Stylus Pro 9000 +escp2-9500 EPSON Stylus Pro 9500 +escp2-10000 EPSON Stylus Pro 10000 +escp2-scan2000 EPSON Stylus Scan 2000 +escp2-scan2500 EPSON Stylus Scan 2500 +pcl-340 HP DeskJet 340 +pcl-400 HP DeskJet 400 +pcl-500 HP DeskJet 500 +pcl-501 HP DeskJet 500C +pcl-520 HP DeskJet 520 +pcl-540 HP DeskJet 540C +pcl-550 HP DeskJet 550C +pcl-560 HP DeskJet 560C +pcl-600 HP DeskJet 600/600C (Single Cartridge) +pcl-601 HP DeskJet 600 series (2 Cartridge) +pcl-690 HP DeskJet 690 series (Photo-Ink capable) +pcl-750 HP DesignJet 750 +pcl-810 HP DeskJet 810C +pcl-812 HP DeskJet 812C +pcl-840 HP DeskJet 840C +pcl-842 HP DeskJet 842C +pcl-845 HP DeskJet 845C +pcl-850 HP DeskJet 850C +pcl-855 HP DeskJet 855C +pcl-870 HP DeskJet 870C +pcl-890 HP DeskJet 890C +pcl-895 HP DeskJet 895C +pcl-900 HP DeskJet 900 series +pcl-P1000 HP PhotoSmart P1000 +pcl-1100 HP DeskJet 1100C +pcl-P1100 HP PhotoSmart P1100 +pcl-1120 HP DeskJet 1120C +pcl-1200 HP DeskJet 1200C +pcl-1220 HP DeskJet 1220C +pcl-1600 HP DeskJet 1600C +pcl-2000 HP DeskJet 2000 series +pcl-2500 HP DeskJet 2500 series +pcl-2 HP LaserJet II series +pcl-3 HP LaserJet III series +pcl-4 HP LaserJet 4 series +pcl-4v HP LaserJet 4V, 4Si +pcl-5 HP LaserJet 5 series +pcl-5si HP LaserJet 5Si +pcl-6 HP LaserJet 6 series +lexmark-4076 Lexmark 4076 (PCL printer) +lexmark-z42 Lexmark Z42 +lexmark-z43 Lexmark Z43 +lexmark-z52 Lexmark Z52 + +Most or all of the Epson Stylus printers are fully functional. The +others vary. In particular, all of the listed Epson Stylus Photo +printers print in full 6-color photo mode; most of the others do not. +The color output has also been better tuned for Epson Stylus printers +than for others. + + +Print Resolution Selection: +----- ---------- ---------- + +-sQuality=quality + +The meaning of this is model-specific. Two names are listed for each +resolution; the first (short) name is the value that must be passed to +-sQuality, and the second (long) name is descriptive. Each printer +has its own default value; for most printers, this is a reasonable 300 +or 360 DPI resolution. + + +For Epson Stylus printers: + +Within each specified resolution, the quality is generally listed from +worst to best (and generally higher quality means lower speed). For +example, 360 DPI Unidirectional is usually better than 360 DPI. +Characteristics of specific models and individual printers may affect +the orderings to some degree; on many printers, with certain papers, +unidirectional printing will improve quality substantially more than +using an otherwise better quality printing mode. + +The difference between different quality settings lies in the number +of passes made over each line. "High" and "Highest" quality settings +perform more passes, printing fewer dots with each pass over the same +line and using different nozzles for each pass. This reduces banding +effects, but requires more time. + +"Microweave" modes use algorithms within the printer to generate the +sequence of rows printed. These algorithms generally only work well +at low printing resolutions. Many printers do not support this kind +of printing at resolutions of 720 DPI and above, and some printers +that do actually print just one row (using just one nozzle per color) +at a time. While this particular use will produce extremely high +quality (no banding whatsoever, normally), it is extremely slow and +may eventually damage the print head due to ink pooling. All printers +that we are aware of have no such trouble at 360 DPI. + +We generally recommend the following resolutions for the following +purposes: + +360x90 Fast economy draft output on plain paper (output will be very +360x120 banded and not very dark). + +180 Economy draft output on plain paper (output will not be very + dark). + +360x180 Draft output on plain paper (output will not be solidly +360x240 black); economy draft output on good quality inkjet paper. + +360 Standard quality output on plain paper (output will be + solidly black); draft output on good quality inkjet paper. + +720x360 High quality output on plain paper; standard output on good + quality inkjet paper. + +720 Maximum quality on plain paper; high quality on good inkjet + paper; proofs on photo-quality paper. On many printers, + there will be little difference between this and 720x360 on + plain paper. + +1440x720 High quality on photo paper; use 1440x720 Highest Quality to + reduce microbanding if needed. While this will work on plain + paper, it usually offers little improvement over 720 DPI. + +2880x720 Highest quality on photo paper. While this may yield + slightly improved quality, it will generally not be markedly + superior to 1440x720 Highest Quality, except on the Stylus + Color 980 and Stylus C70 and C80, where it may yield a + noticeable improvement. It takes as long to print as + 1440x720 highest quality, but twice as long to generate the + output. + +1440x1440 An unsupported mode that offers higher quality than 2880x720 + for certain types of images on very high quality paper. It + does not appear to offer any advantage on smooth tones, but + fine detail (particularly vertical, and to a lesser extent + near-horizontal) it shows noticeable improvement. It takes + as long to print as 2880x720. 1440x1440 highest quality + takes twice as long to print. + +2880x1440 An unsupported mode that may offer higher quality than + 2880x720 for certain types of images on very high quality + paper. Experiments conducted thus far demonstrate little if + any improvement over 1440x1440. It takes twice as long to + print as 2880x720 or 1440x1440, and as long to print as + 1440x1440 highest quality. + + +The following resolutions are supported on printers other than the +Stylus Pro (5000, 5500, 7000, 7500, 9000, 9500, and 10000) printers. +Resolutions for those printers are listed in a later section. Please +see the notes at the end of this section. + +360x90dpi 360 x 90 DPI Fast Economy Draft (1) + +180dpi 180 DPI Economy Draft (2) + +360x180dpi 360 x 180 DPI Draft (2) +360x180sw 360 x 180 DPI Draft (3) + +360x120dpi 360 x 120 DPI Economy Draft (4) +360x120sw 360 x 120 DPI Economy Draft (5) + +360x240dpi 360 x 240 DPI Draft (4) +360x240sw 360 x 240 DPI Draft (5) + +360dpi 360 DPI (6) +360uni 360 DPI Unidirectional (6) +360mw 360 DPI Microweave (6, *) +360mwuni 360 DPI Microweave Unidirectional (6) +360sw 360 DPI (7, *) +360swuni 360 DPI Unidirectional (7) +360hq 360 DPI High Quality (7, 8) +360hquni 360 DPI High Quality Unidirectional (7, 8) + +720x360sw 720 x 360 DPI (9, 10) +720x360swuni 720 x 360 DPI Unidirectional (9, 10) + +720mw 720 DPI Microweave (11) +720mwuni 720 DPI Microweave Unidirectional (11) +720sw 720 DPI (9) +720swuni 720 DPI Unidirectional (9) +720hq 720 DPI High Quality (9) +720hquni 720 DPI High Quality Unidirectional (9) +720hq2 720 DPI Highest Quality (9) + +1440x720mw 1440 x 720 DPI Microweave (12) +1440x720mwuni 1440 x 720 DPI Microweave Unidirectional (12) +1440x720sw 1440 x 720 DPI (13) +1440x720swuni 1440 x 720 DPI Unidirectional (13, 14) +1440x720hq 1440 x 720 DPI Highest Quality (13) + +2880x720sw 2880 x 720 DPI (15) +2880x720swuni 2880 x 720 DPI Unidirectional (15) + +1440x1440sw 1440 x 1440 DPI (16) +1440x1440hq2 1440 x 1440 DPI Highest Quality (16) + +2880x1440sw 2880 x 1440 DPI (16) + +(*) This resolution is the default on all printers supporting this + setting. + +(1) Works on printers that have a basic vertical spacing of 1/90". + This includes the Stylus Color, Stylus Color 440, 460, 600, 640, + 660, 670, and 1500, and Stylus Photo, Stylus Photo 700, 720, and + EX. + +(2) Works on printers most that have a basic vertical spacing of 1/90, + 1/180, or 1/360 inch. This includes Stylus Color, Stylus Color + 440, 460, 600, 640, 660, 670, 800, 850, 900, 980, 1500, 1520, + 3000, and Stylus Photo, Stylus Photo 700, 720 and EX. + +(3) Works on Stylus C70 and C80. + +(4) Works on older printers with dot spacing of 1/120 inch. This + includes the Stylus Color Pro, Pro XL, 400, and 500. + +(5) Works on newer printers with dot spacing of 1/120 inch. This + includes the Stylus C20, C40, and C60, the Stylus Color 480, 580, + 680, 740, 760, 777, 860, 880, 83, and 1160, and the Stylus Photo + 750, 780, 785, 790, 810, 820, 870, 875, 890, 895, 1270, 1280, + 1290, and 2000P, and the Stylus Scan 2000. + +(6) Works on all printers that do not support variable drop sizes. + This includes the Stylus Color, Stylus Color 400, 440, 460, 500, + 600, 640, 660, 800, 850, 1500, 1520, and 3000, and Stylus Color + Pro, and Stylus Photo, Stylus Photo 700, and EX. + +(7) Works on all printers that do support variable drop sizes. This + includes all supported Epson Stylus printers except for those + listed in note (6). + +(8) Recommended only on processors slower than 200 MHz, the system is + heavily loaded with a faster processor, or if problems are + experienced at 720x360. + +(9) Works on all supported printers except for Stylus Color, Stylus + Color Pro, Stylus Color Pro XL, Stylus Color 1500, 1520, and 3000. + +(10) On printers that do not support variable drop size (see note (4)), + this will print as fast as 360 DPI, and faster than 360 DPI High + Quality. It will take twice as long to generate output, which may + be important on a heavily loaded system or a processor slower than + 200 MHz. + +(11) Works on some older printers, including the Stylus Color, Stylus + Color 400, 500, 600, 800, 850, 1500, 1520, and 3000, Stylus Color + Pro, and Stylus Color Pro XL. Not recommended except for the + Stylus Color, Stylus Color 1500, 1520, and 3000. + +(12) Works on Stylus Color 600, 800, 850, 1520, and 3000. Not + recommended unless other 1440x720 modes do not work. + +(13) Works on all printers that support 1440x720 DPI. This includes + all supported printers except for the Stylus Color, Stylus Color + Pro, Pro XL, 400, 440, 460, 480, 500, and 1500, and Stylus Photo. + In addition, this may not work correctly on Stylus Color 1520 and + Stylus Color 3000. + +(14) This is identical to 1440 x 720 Highest Quality (1440x720hq) on + the Stylus Color 900. + +(15) Works on all printers that support 2880x720 DPI. This includes + the Stylus C60, C70, and C80, the Stylus Color 680, 777, 880, 83, + and 980, and Stylus Photo 780, 790, 810, 820, 890, 1280, and 1290. + +(16) Works on Stylus C70 and Stylus C80. These resolutions are not + supported by Epson and may not work on all C70 or C80 printers. + + +The Stylus Pro printers (Stylus Pro 5000, 5500, 7000, 7500, 9000, +9500, and 10000) support additional microweave modes known as Full +Overlap (FOL), Four Pass, and FOL2. The Stylus Pro 5500, 7500, 9500, +and 10000 additionally have a mode called MW2. These modes can only +be used at certain resolutions. Stylus Pro printers support the +following resolutions: + +180dpi 180 DPI + +360dpi 360 DPI +360uni 360 DPI Unidirectional +360mw 360 DPI Microweave +360mwuni 360 DPI Microweave Unidirectional +360fol 360 DPI Full Overlap +360foluni 360 DPI Full Overlap Unidirectional +360fol2 360 DPI FOL2 +360fol2uni 360 DPI FOL2 Unidirectional +360mw2 360 DPI MW2 +360mw2uni 360 DPI MW2 Unidirectional + +720x360dpi 720 x 360 DPI +720x360uni 720 x 360 DPI Unidirectional +720x360fol 720 x 360 DPI FOL +720x360foluni 720 x 360 DPI FOL Unidirectional +720x360fol2 720 x 360 DPI FOL2 +720x360fol2uni 720 x 360 DPI FOL2 Unidirectional +720x360mw2 720 x 360 DPI MW2 +720x360mw2uni 720 x 360 DPI MW2 Unidirectional + +720dpi 720 DPI +720uni 720 DPI Unidirectional +720mw 720 DPI Microweave +720mwuni 720 DPI Microweave Unidirectional +720fol 720 DPI Full Overlap +720foluni 720 DPI Full Overlap Unidirectional +720fourp 720 DPI Four Pass +720fourpuni 720 DPI Four Pass Unidirectional + +1440x720dpi 1440 x 720 DPI +1440x720uni 1440 x 720 DPI Unidirectional +1440x720mw 1440 x 720 DPI Microweave +1440x720mwuni 1440 x 720 DPI Microweave Unidirectional +1440x720fol 1440 x 720 DPI FOL +1440x720foluni 1440 x 720 DPI FOL Unidirectional +1440x720fourp 1440 x 720 DPI Four Pass +1440x720fourpuni 1440 x 720 DPI Four Pass Unidirectional + + +For PCL printers (including Hewlett-Packard and Lexmark 4076): + +150dpi 150x150 DPI (should work on all printers) +300dpi 300x300 DPI (should work on all printers, C-RET on + DJ 850/855/870/890) +600x300dpi 600x300 DPI (DJ 6xx/810/812/840/842/895) +600mono 600x600 DPI monochrome + (DJ 6xx (except 69x) /8xx/1100/1120) +600dpi 600x600 DPI (DJ 69x/840/9xx/1220/2000/2500, + PhotoSmart P1000/P1100, LJ5/5Si/6) + +Note: the higher resolutions of newer PCL printers using "Photo-Ret" are +not yet supported. + + +For Lexmark printers other than the 4076: + +300x600dpi 300 DPI x 600 DPI +600dpi 600 DPI +600hq 600 DPI high quality +600uni 600 DPI Unidirectional +1200dpi 1200 DPI +1200hq 1200 DPI high quality +1200hq2 1200 DPI highest quality +1200uni 1200 DPI Unidirectional +2400x1200dpi 2400 DPI x 1200 DPI (Z52) +2400x1200hq 2400 DPI x 1200 DPI high quality (Z52) +2400x1200hq2 2400 DPI x 1200 DPI highest quality (Z52) + + +For Canon printers: + +1200 DPI printers (BJC 7000, BJC 7100, BJC 8200, BJC 8500): + +300dpi 300x300 DPI +300dmt 300x300 DPI DMT +600dpi 600x600 DPI +600dmt 600x600 DPI DMT +1200x600dpi 1200x600 DPI +1200dpi 1200x1200 DPI + +1440 DPI printers (BJC 1000, BJC 2000, BJC 3000, BJC 4300, BJC 4400, + BJC 5100, BJC 5500, BJC 6000, BJC 6100, BJC 6500, BJC 8200): + +360dpi 360x360 DPI +360dmt 360x360 DPI DMT +720x360dpi 720x360 DPI +720dpi 720x720 DPI +1440x720dpi 1440x720 DPI +1440dpi 1440x1440 DPI + + +Ink Types +--- ----- + +This is printer type specific. The option names are case sensitive. +The option names are case sensitive. Two names are listed for each +resolution; the first (short) name is the value that must be passed to +-sInkType, and the second (long) name is descriptive. Not all ink +types are supported on all printers. + +-sInkType=inktype + + +For Epson and Lexmark (other than the 4076) printers: + +Six color printers can print using four color inks or all six colors. +Six color mode is recommended for photographs. Four color mode may be +useful when printing text with embedded graphics to reduce ink +consumption, or to print higher quality with Ordered, Fast, or Very +Fast dithering (see below). + +The "Composite" modes use only color inks (no black) to produce all +colors and black. These ink types are rarely useful, but on certain +types of paper they may produce a smoother image than that produced by +mixing black ink in. The Epson Stylus Color 1500 cannot mix black ink +with colored inks; on this printer, Three Color Composite must be +used. + +As of this writing (September 2001), no seven color printers are sold +in North America. When such a printer is sold, the Seven Color +Enhanced and Six Color Enhanced Composite modes will utilize all of +these inks. + +Photo7 Seven Color Enhanced +PhotoEnhance Six Color Enhanced Composite +PhotoCMYK Six Color Photo +PhotoCMY Five Color Photo Composite +CMYK Four Color Standard +RGB Three Color Composite + + +For Canon printers: + +Gray Black +RGB Color +CMYK Black/Color +PhotoCMY Photo/Color +PhotoCMYK Photo + + +For PCL (Hewlett-Packard and Lexmark 4076) color printers: + +CMYK Color + Black Cartridges +Photo Color + Photo Cartridges (For Deskjet 69x only) + +Black and white PCL printers (laser printers, in particular) do not +allow any value to be specified for the ink type. + + +Media Types +----- ----- + +This is printer type specific. The option names are case sensitive. +Two names are listed for each resolution; the first (short) name is +the value that must be passed to -sMediaType, and the second (long) name +is descriptive. + +-sMediaType=mediatype + + +For Epson and Lexmark (other than the 4076) inkjet printers: + +Plain Plain Paper +PlainFast Plain Paper Fast Load +Postcard Postcard +GlossyFilm Glossy Film +Transparency Transparencies +Envelope Envelopes +BackFilm Back Light Film +Matte Matte Paper +Inkjet Inkjet Paper +Coated Photo Quality Inkjet Paper +GlossyPhoto Premium Glossy Photo Paper +Luster Premium Luster Photo Paper +Photo Photo Paper +Glossy Photo Quality Glossy Paper +Ilford Ilford Heavy Paper +Other Other + +We have found that glossy photo papers not specifically designed for +Epson printers generally perform poorly in Epson printers. The ink +tends to pool on the paper, causing muddy shadows and possibly leaving +ink on the printer rollers. Use of the highest quality printing modes +(1440x720 highest quality and 2880x720 unidirectional) produces the +best result on such papers, probably because printing is slower and +there is more time for the ink to dry. + + +For Canon printers: + +Plain Plain Paper +Transparency Transparencies +BackFilm Back Print Film +Fabric Fabric Sheets +Envelope Envelope +Coated High Resolution Paper +TShirt T-Shirt Transfers +GlossyFilm High Gloss Film +GlossyPaper Glossy Photo Paper +GlossyCards Glossy Photo Cards +GlossyPro Photo Paper Pro + + +For PCL (Hewlett-Packard and Lexmark 4076) inkjet printers: + +Plain Plain +Bond Bond +Premium Premium +Glossy Glossy/Photo +Transparency Transparency +GlossyQD Quick-dry Photo +TransparencyQD Quick-dry Transparency + +PCL laser printers do not allow specification of any media type. + + +Media Sources +----- ------- + +This is printer type specific. The option names are case sensitive. + +-sInputSlot=mediasource + +For Epson printers: + +Standard Standard +Roll Roll Feed (for certain Stylus Photo and Stylus + Pro models only) + + +For Canon printers: + +Auto Auto Sheet Feeder +Manual Manual with Pause +ManualNP Manual without Pause + + +For PCL (Hewlett-Packard and Lexmark 4076) printers. Different +printers allow different choices out of this set. + +Standard Standard (Feed from printer defined source) +Manual Manual +MultiPurpose Tray 1 +Upper Tray 2 +Lower Tray 3 +LargeCapacity Tray 4 +Portable Portable Sheet Feeder +Desktop Desktop Sheet Feeder +Tray Tray +Tray2 Tray 2 +Optional Optional Source +Auto Autoselect + + +For Lexmark printers other than the 4076: + +Auto Auto Sheet Feeder +Manual Manual with Pause +ManualNP Manual without Pause + + +Media Sizes +----- ----- + +This is printer-specific; we cannot list the correct values for each +printer here. The option names are case-sensitive. Two names are +listed for each resolution; the first (short) name is the value that +must be passed to -sPaperSize, and the second (long) name is +descriptive. This option does not set GhostScript up to use a paper +size other than the default; it only tells the driver to set up the +printer for a different paper size. The default paper size is +'Letter'. + +-sPaperSize=papersize + + + * Common English paper sizes + +Letter Letter 8.5in x 11in +Legal Legal 8.5in x 14in +Tabloid Tabloid 11in x 17in +Executive Executive 7.25in x 10.5in +Postcard Postcard 100mm x 147mm +w216h360 3x5 +w288h432 4x6 +w324h495 Epson 4x6 Photo Paper +w360h504 5x7 +w360h576 5x8 +8x10 8x10 +Statement Manual 5.5in x 8.5in +TabloidExtra 12x18 +SuperB 13x19 + + * Common photographic paper sizes + +w576h864 8x12 Sometimes used for 35 mm +w792h1008 11x14 +w1152h1440 16x20 +w1152h1728 16x24 20x24 for 35 mm +w1440h1728 20x24 +w1440h2160 20x30 24x30 for 35 mm +w1728h2160 24x30 +w1728h2592 24x36 Sometimes used for 35 mm +w2160h2880 30x40 + + International Paper Sizes (mostly taken from BS4000:1968) + + * "A" series: Paper and boards, trimmed sizes + * + * "A" sizes are in the ratio 1 : sqrt(2). A0 has a total area + * of 1 square metre. Everything is rounded to the nearest + * millimetre. Thus, A0 is 841mm x 1189mm. Every other A + * size is obtained by doubling or halving another A size. + +w4768h6749 4A 1682mm x 2378mm +w3370h4768 2A 1189mm x 1682mm +A0 A0 841mm x 1189mm +A1 A1 594mm x 841mm +A2 A2 420mm x 594mm +A3 A3 297mm x 420mm +A4 A4 210mm x 297mm +A5 A5 148mm x 210mm +A6 A6 105mm x 148mm +A7 A7 74mm x 105mm +A8 A8 52mm x 74mm +A9 A9 37mm x 52mm +A10 A10 26mm x 37mm + + * Stock sizes for normal trims. + * Allowance for trim is 3 millimetres. + +w2437h3458 RA0 860mm x 1220mm +w1729h2437 RA1 610mm x 860mm +w1218h1729 RA2 430mm x 610mm +w864h1218 RA3 305mm x 430mm +w609h864 RA4 215mm x 305mm + + * Stock sizes for bled work or extra trims. + +w2551h3628 SRA0 900mm x 1280mm +w1814h2551 SRA1 640mm x 900mm +w1275h1814 SRA2 450mm x 640mm +w907h1275 SRA3 320mm x 450mm +w637h907 SRA4 225mm x 320mm + + * "B" series: Posters, wall charts and similar items. + +w5669h8016 4B ISO 2000mm x 2828mm +w4008h5669 2B ISO 1414mm x 2000mm +ISOB0 B0 ISO 1000mm x 1414mm +ISOB1 B1 ISO 707mm x 1000mm +ISOB2 B2 ISO 500mm x 707mm +ISOB3 B3 ISO 353mm x 500mm +ISOB4 B4 ISO 250mm x 353mm +ISOB5 B5 ISO 176mm x 250mm +ISOB6 B6 ISO 125mm x 176mm +ISOB7 B7 ISO 88mm x 125mm +ISOB8 B8 ISO 62mm x 88mm +ISOB9 B9 ISO 44mm x 62mm +ISOB10 B10 ISO 31mm x 44mm + +B0 B0 JIS +B1 B1 JIS +B2 B2 JIS +B3 B3 JIS +B4 B4 JIS +B5 B5 JIS +B6 B6 JIS +B7 B7 JIS +B8 B8 JIS +B9 B9 JIS +B10 B10 JIS + + * "C" series: Envelopes or folders suitable for A size stationery. + +C0 C0 917mm x 1297mm +C1 C1 648mm x 917mm +C2 C2 458mm x 648mm +C3 C3 324mm x 458mm +C4 C4 229mm x 324mm +C5 C5 162mm x 229mm +w354h918 B6-C4 125mm x 324mm +C6 C6 114mm x 162mm +DL DL 110mm x 220mm +w229h459 C7-6 81mm x 162mm +C7 C7 81mm x 114mm +C8 C8 57mm x 81mm +C9 C9 40mm x 57mm +C10 C10 28mm x 40mm + + * US CAD standard paper sizes + +ARCHA ArchA 9x12in +ARCHB ArchB 12x18in +ARCHC ArchC 18x24in +ARCHD ArchD 24x36in +ARCHE ArchE 36x48in + + * Foolscap + +w612h936 American foolscap +w648h936 European foolscap + + * Sizes for book production + * The BPIF and the Publishers Association jointly recommend ten + * standard metric sizes for case-bound titles as follows: + +w535h697 Crown Quarto 189mm x 246mm +w569h731 Large Crown Quarto 201mm x 258mm +w620h782 Demy Quarto 219mm x 276mm +w671h884 Royal Quarto 237mm x 312mm +w348h527 Crown Octavo 123mm x 186mm +w365h561 Large Crown Octavo 129mm x 198mm +w391h612 Demy Octavo 138mm x 216mm +w442h663 Royal Octavo 156mm x 234mm + + * Paperback sizes in common usage + +w314h504 Small paperback 111mm x 178mm +w314h513 Penguin small paperback 111mm x 181mm +w365h561 Penguin large paperback 129mm x 198mm + + * Miscellaneous sizes + +w283h420 Hagaki Card 100 x 148 mm +w420h567 Oufuku Card 148 x 200 mm +w340h666 Long 3 Japanese long envelope #3 +w255h581 Long 4 Japanese long envelope #4 +w680h941 Kaku Japanese Kaku envelope #4 +COM10 Commercial 10 US Commercial 10 env +w315h414 A2 Invitation US A2 invitation + + +Color Balancing Values: (min,max,default) +----- --------- ------- ----------------- + +All of the values below are interpreted as being relative to norms for +a particular printer established through testing, not "absolute" +values of any kind. + +-dCyan=xxx xxx: 0.0 ... 4.0 (1.0) +-dMagenta=xxx xxx: 0.0 ... 4.0 (1.0) +-dYellow=xxx xxx: 0.0 ... 4.0 (1.0) + + These three options allow specification of the cyan, magenta, and + yellow levels independently, for rebalancing the levels. Normally, + these should be adjusted to yield neutral gray, but they can be used + for other effects. + +-dBrightness=xxx xxx: 0.0 ... 2.0 (1.0) + + Adjust the brightness of the image. 0.0 gives a fully black image; + 2.0 gives a fully white image. Values greater than 1 will result in + black not being solid and highlights turning white; values less than + 1 will result in white not being perfectly clear and shadows turning + black. + +-dContrast=xxx xxx: 0.0 ... 4.0 (1.0) + + Adjust the contrast of the image. 0.0 gives a solid gray for the + entire image, the exact gray depending upon the brightness chosen. + +-dGamma=xxx xxx: 0.1 ... 4.0 (1.0) + + Adjust the gamma of the image, over and above the printer-specific + correction. Gamma less than 1.0 will result in a darker image; gamma + greater than 1.0 will result in a lighter image. Unlike brightness, + gamma adjustment does not change the endpoints; it merely changes the + shape of the input->output curve. + +-dDensity=xxx xxx: 0.1 ... 2.0 (1.0) + + Adjust the amount of ink deposited on the paper. If you've chosen + the correct paper type and you're getting ink bleeding through the + paper or puddling, try reducing the density to the lowest value you + can while still achieving solid black. If you're not getting solid + black, even with the contrast and brightness at 1.0, try increasing + the density. + + All of the printers supported here actually need less than 100% ink + density in most cases, so the actual density is something other than + the nominal density setting. The effective density setting cannot go + above 100%, so if a value specified will result in an excessively + high density level, it will be silently limited to 1.0. + +-dSaturation=xxx xxx: 0.0 ... 9.0 (1.0) + + Adjust the brilliance of colors. 0.0 results in pure grayscale; + using this with -dColor=1 is one way of getting grayscale (see below + under -dColor for a full discussion). Saturation of less than 1.0 + results in more muted colors; saturation of greater than 1.0 results + in more vibrant colors. Very high saturation often results in very + strange effects, including posterization and banding that might not + be expected. For normal purposes, the saturation should generally be + less than 1.5. + + +Dithering Algorithms: +--------- ----------- + +The option names are case sensitive. Two names are listed for each +resolution; the first (short) name is the value that must be passed to +-sDither, and the second (long) name is descriptive. + +-sDither=algorithm + +Adaptive Adaptive Hybrid +Ordered Ordered +Fast Fast +VeryFast Very Fast +Floyd Hybrid Floyd-Steinberg + +For highest quality, we recommend use of Adaptive Hybrid dithering. +For continuous tone images, Ordered works just as well and is somewhat +faster. Ordered dithering yields noticeably inferior results with +text and intricate line art, particularly at high resolutions. + +Fast dithering, which is a simplified version of ordered dither, is +significantly faster, but color accuracy is worse, particularly on six +color printers and printer using variable dot sizes. On simple four +color printers, the quality is quite reasonable, although color +printing will show more speckling in dark tones than Ordered dither. +For single dot size printers, printing grayscale, this algorithm +yields almost identical results to Ordered with some performance +improvement. On three color printers, the results should be very +similar to Ordered. + +Very Fast is even faster than Fast, with even more loss of quality. +It shows even more speckling, and the output is heavily patterned. On +laser printers, and possibly on certain kinds of text and line art, +Very Fast dithering may actually yield the best quality. + +Error diffusion algorithms (Hybrid Floyd-Steinberg is such an +algorithm) perform very well at high densities, and are capable of +rendering very fine detail well, but they tend to exhibit artifacts in +the form of "waves" or "worms" of dots which results in noticeable +texturing in pale areas. Furthermore, pale areas immediately adjacent +to white take a while to "build up" sufficient error to print at all. +This is sometimes called "tearing". Its use is not recommended. + + +Output Type +------ ---- + +-dColor=x x: 0 ... 2 (1 on color printers, 0 otherwise) + +0 Grayscale +1 Color +2 Black and white + + Choose color vs. grayscale output. Color output is the default. + Choosing -dColor=0 results in only black ink (no color ink) being + used, which is faster and usually results in the most accurate + grayscale, but at the expense of smoothness. If you want composite + color (using a mixture of color and black inks to produce gray), use + -dColor=1 and -dSaturation=0.0 (see -dSaturation above). + + In addition, using -dColor=0 uses luminance (perceived brightness) of + red, green, and blue to choose output levels. Blue of a given + intensity is perceived to be much darker than red, which in turn + appears darker than green. -dColor=1 and -dSaturation=0.0 does not + use luminance. + + -dColor=2 prints only black and white (thresholding). This option + always uses Fast dithering unless you specify Very Fast. + + +Image type (to optimize the dither): +----- ---- --- -------- --- -------- + +-dImageType=x x: 0 ... 2 (0) +Select the image type most representative of what's being printed. + +0 Line art (color or gray scale) +1 Primarily solid colors or smooth gradients (color or gray scale) +2 Continuous-tone photographs (color or gray scale) + +Option 0 is the fastest. It generates strong, but not particularly +accurate, colors. There may be some fairly sharp color transitions in +this mode. + +Option 1 generates more accurate colors, but is slower. + +Option 2 generates the most accurate colors, but is considerably +slower. + +Note that any of the modes may be used with either color or black & +white output. If black and white output is requested, but a color +mode used, composite color will be printed. This generally offers +smoother tone, but less purity of gray or black, than pure black ink. +Furthermore, it is possible to tune the color of the gray (to achieve +warmer or cooler effects) using the color controls in this fashion. + +Specifying a lower GhostScript resolution (with -r) results in faster +color conversion. For example, if you print at 1440x720 DPI, but +specify a Ghostscript resolution of 360 DPI (with -r360), output will +be significantly faster and there will be much less difference in +performance between the three image type options. + + +EXAMPLES: +--------- + +Example 1 (print charts to file, color, 360 dpi): +gs -sDEVICE=stp -sModel=escp2-ex -dDensity=1.6 -dGamma=1.5 -dSaturation=0.9 \ + -dBrightness=.4 -dImageType=1 -sOutputFile=itsyourchoice.prn foo.ps + +Example 2 (print color photograph to /dev/lp0 at maximum quality): +gs -q -dSAFER -dNOPAUSE -sDEVICE=stp -sModel=escp2-870 -dDensity=0.8 \ + -r1440x720 -sQuality=1440x720hq -dImageType=2 -sOutputFile=/dev/lp0 foo.ps + +Example 3 (print pure black text to stdout) +gs -q -dSAFER -dNOPAUSE -sDEVICE=stp -sModel=escp2-660 -dDensity=0.8 -r720 \ + -sQuality=720sw -dColor=2 -sOutputFile=- foo.ps diff --git a/src/ghost/README.bsd b/src/ghost/README.bsd new file mode 100644 index 0000000..c6729db --- /dev/null +++ b/src/ghost/README.bsd @@ -0,0 +1,57 @@ +stp printing with FreeBSD +========================= + +by Philipp Huber (C) 2000 + +The Ghostcsript6 Port of FreeBSD does not include the stp driver, +therefore it's necesseray to do some changes by hand :) + +First of all, the Ghostscript6 Ports has to be downloaded, extracted and +patching must be done. + + cd /usr/ports/print/ghostscript6 + make patch + +After this, download print-4.0b2 (or another version, i did it with this +one) from + + http://download.sourceforge.net/gimp-print/print-4.0b2.tar.gz + +Place the file into the workdir of the ghostscript6 port and unzip it: + + cp print-4.0b2.tar.gz /usr/ports/print/ghostscript6/work/gs6.01 + cd /usr/ports/print/ghostscript6/work/gs6.01 + tar xzf print-4.0b2.tar.gz + +Follow the directions as described in "Ghost/README": +First, copy all *.c and *.h files into the ghostscript src directory. + + cd print-4.0b2/Ghost + cp *.c ../../src/ + cp *.h ../../src/ + +Edit "contrib.mak" in the src directory of ghosts +cript (where the *.c and +*.h files where copied to in the previous step). Add the contents of the +file "contrib.mak.addon" in the "print-4.0b2/Ghost" directory at the end of the +"contrib.mak" file. +The next step is to add "$(DD)stp.dev to the line "DEVICE_DEVS6=" in +"unix-gcc.mak". + +After all these changes have been made, do a + + cd /usr/ports/print/ghostscript6 ; make install + +All should compile fine, and after that you have ghostscript6 with the +stp driver compiled in. Run "gs -h" to be absolutely sure :) + +Don't forget to update or adjust your filters! +See print-4.0b2/Ghost/README for further details and examples. + +All this should work with NetBSD and OpenBSD as well, but i didn't +test it anyway. Good luck and have fun :) + +Please note that the current Ghostscript 6 license (Aladdin Free +Public License) is not compatible with the GPL, and thus you cannot +distribute the result. However, you may apply this procedure for your +own use. diff --git a/src/ghost/contrib.mak.addon.in b/src/ghost/contrib.mak.addon.in new file mode 100644 index 0000000..b41d477 --- /dev/null +++ b/src/ghost/contrib.mak.addon.in @@ -0,0 +1,17 @@ +### --------------- Gimp-Print/stp Driver ---------------------------- ### +### Be careful to add the exact contents of this file; cut and paste ### +### may corrupt the file and cause mysterious make errors ### + +stp_=$(GLOBJ)gdevstp.$(OBJ) + +STPINCDIR=-I@includedir@ +STPLIBDIR=-L@libdir@ +STPLIB=gimpprint + +$(DD)stp.dev: $(stp_) $(DD)page.dev + $(SETPDEV) $(DD)stp $(stp_) + $(ADDMOD) $(DD)stp -link $(STPLIBDIR) + $(ADDMOD) $(DD)stp -lib $(STPLIB) + +$(GLOBJ)gdevstp.$(OBJ) : $(GLSRC)gdevstp.c $(PDEVH) + $(GLCC) $(GLO_)gdevstp.$(OBJ) $(C_) $(STPINCDIR) $(GLSRC)gdevstp.c diff --git a/src/ghost/contrib.mak.addon.old b/src/ghost/contrib.mak.addon.old new file mode 100644 index 0000000..7fd6e2f --- /dev/null +++ b/src/ghost/contrib.mak.addon.old @@ -0,0 +1,51 @@ +### --------------- Gimp-Print/stp Driver ---------------------------- ### +### Be careful to add the exact contents of this file; cut and paste ### +### may corrupt the file and cause mysterious make errors ### + +stp_=$(GLOBJ)gdevstp.$(OBJ) \ + $(GLOBJ)gdevstp-dither.$(OBJ) \ + $(GLOBJ)gdevstp-dither-matrices.$(OBJ) \ + $(GLOBJ)gdevstp-util.$(OBJ) \ + $(GLOBJ)gdevstp-color.$(OBJ) \ + $(GLOBJ)gdevstp-weave.$(OBJ) \ + $(GLOBJ)gdevstp-escp2.$(OBJ) \ + $(GLOBJ)gdevstp-lexmark.$(OBJ) \ + $(GLOBJ)gdevstp-pcl.$(OBJ) \ + $(GLOBJ)gdevstp-canon.$(OBJ) \ + $(GLOBJ)gdevstp-ps.$(OBJ) + +$(DD)stp.dev: $(stp_) $(DD)page.dev + $(SETPDEV) $(DD)stp $(stp_) + +$(GLOBJ)gdevstp.$(OBJ) : $(GLSRC)gdevstp.c $(PDEVH) $(GLSRC)gdevstp-print.h + $(GLCC) $(GLO_)gdevstp.$(OBJ) $(C_) -DDISABLE_NLS $(GLSRC)gdevstp.c + +$(GLOBJ)gdevstp-util.$(OBJ) : $(GLSRC)gdevstp-util.c $(GLSRC)gdevstp-printers.c $(PDEVH) $(GLSRC)gdevstp-print.h $(GLSRC)gdevstp-print-internal.h + $(GLCC) $(GLO_)gdevstp-util.$(OBJ) $(C_) -DDISABLE_NLS $(GLSRC)gdevstp-util.c + +$(GLOBJ)gdevstp-weave.$(OBJ) : $(GLSRC)gdevstp-weave.c $(PDEVH) $(GLSRC)gdevstp-print.h $(GLSRC)gdevstp-print-internal.h + $(GLCC) $(GLO_)gdevstp-weave.$(OBJ) $(C_) -DDISABLE_NLS $(GLSRC)gdevstp-weave.c + +$(GLOBJ)gdevstp-color.$(OBJ) : $(GLSRC)gdevstp-color.c $(PDEVH) $(GLSRC)gdevstp-print.h $(GLSRC)gdevstp-print-internal.h + $(GLCC) $(GLO_)gdevstp-color.$(OBJ) $(C_) -DDISABLE_NLS $(GLSRC)gdevstp-color.c + +$(GLOBJ)gdevstp-dither.$(OBJ) : $(GLSRC)gdevstp-dither.c $(PDEVH) $(GLSRC)gdevstp-print.h $(GLSRC)gdevstp-print-internal.h + $(GLCC) $(GLO_)gdevstp-dither.$(OBJ) $(C_) -DDISABLE_NLS $(GLSRC)gdevstp-dither.c + +$(GLOBJ)gdevstp-dither-matrices.$(OBJ) : $(GLSRC)gdevstp-dither-matrices.c $(PDEVH) $(GLSRC)gdevstp-print.h $(GLSRC)gdevstp-print-internal.h + $(GLCC) $(GLO_)gdevstp-dither-matrices.$(OBJ) $(C_) -DDISABLE_NLS $(GLSRC)gdevstp-dither-matrices.c + +$(GLOBJ)gdevstp-escp2.$(OBJ) : $(GLSRC)gdevstp-escp2.c $(PDEVH) $(GLSRC)gdevstp-print.h $(GLSRC)gdevstp-print-internal.h + $(GLCC) $(GLO_)gdevstp-escp2.$(OBJ) $(C_) -DDISABLE_NLS $(GLSRC)gdevstp-escp2.c + +$(GLOBJ)gdevstp-lexmark.$(OBJ) : $(GLSRC)gdevstp-lexmark.c $(PDEVH) $(GLSRC)gdevstp-print.h $(GLSRC)gdevstp-print-internal.h + $(GLCC) $(GLO_)gdevstp-lexmark.$(OBJ) $(C_) -DDISABLE_NLS $(GLSRC)gdevstp-lexmark.c + +$(GLOBJ)gdevstp-pcl.$(OBJ) : $(GLSRC)gdevstp-pcl.c $(PDEVH) $(GLSRC)gdevstp-print.h $(GLSRC)gdevstp-print-internal.h + $(GLCC) $(GLO_)gdevstp-pcl.$(OBJ) $(C_) -DDISABLE_NLS $(GLSRC)gdevstp-pcl.c + +$(GLOBJ)gdevstp-canon.$(OBJ) : $(GLSRC)gdevstp-canon.c $(PDEVH) $(GLSRC)gdevstp-print.h $(GLSRC)gdevstp-print-internal.h + $(GLCC) $(GLO_)gdevstp-canon.$(OBJ) $(C_) -DDISABLE_NLS $(GLSRC)gdevstp-canon.c + +$(GLOBJ)gdevstp-ps.$(OBJ) : $(GLSRC)gdevstp-ps.c $(PDEVH) $(GLSRC)gdevstp-print.h $(GLSRC)gdevstp-print-internal.h + $(GLCC) $(GLO_)gdevstp-ps.$(OBJ) $(C_) -DDISABLE_NLS $(GLSRC)gdevstp-ps.c diff --git a/src/ghost/debian-patch b/src/ghost/debian-patch new file mode 100644 index 0000000..1f654c0 --- /dev/null +++ b/src/ghost/debian-patch @@ -0,0 +1,40 @@ +diff -u -r /home/sharkey/gstemp/gs-5.10/debian/control ./control +--- /home/sharkey/gstemp/gs-5.10/debian/control Sat May 13 09:14:33 2000 ++++ ./control Sat May 13 08:48:54 2000 +@@ -36,3 +36,6 @@ + . + This package also contains the hpdj driver contributed by + Martin Lottermoser and the hp8xx driver by Uli Wortmann. ++ . ++ This package is identical to the official gs package, except the ++ Gimp-Print printer driver suite (stp) has been added. +--- gs-5.10/debian/rules Sat May 13 09:57:03 2000 ++++ /home/sharkey/gstemp/gs-5.10/debian/rules Mon May 8 23:05:00 2000 +@@ -22,6 +22,7 @@ + jpdrivers-support = $(INCLUDE_GPL) + lexmark-support = $(INCLUDE_GPL) + hpdj-support = $(INCLUDE_LGPL) ++stp-support = $(INCLUDE_GPL) + + # Uncomment following line for conflicted jpdrivers support. + # Be sure to disable hp8xx-support and enable jpdrivers support. +@@ -68,6 +69,7 @@ + include debian/patches/jpdrivers + include debian/patches/lexmark + include debian/patches/hpdj ++include debian/patches/stp + + patch-contrib: $(APPLY_PATCHES) + unpatch-contrib: $(UNAPPLY_PATCHES) +--- gs-5.10/debian/changelog Sun Nov 12 18:31:32 2000 ++++ /home/sharkey/gstemp/gs-5.10/debian/changelog Sun Nov 12 18:38:15 2000 +@@ -1,3 +1,9 @@ ++gs (5.10stp-11) unstable; urgency=low ++ ++ * Added Gimp-Print STP driver ++ ++ -- Eric Sharkey Sun, 4 Feb 2001 15:41:17 +0900 ++ + gs (5.10-11) unstable; urgency=low + + * debian/control: Added build time dependency for libfreetype2-dev diff --git a/src/ghost/debian-patch-stp b/src/ghost/debian-patch-stp new file mode 100644 index 0000000..92d0cc3 --- /dev/null +++ b/src/ghost/debian-patch-stp @@ -0,0 +1,34 @@ +#This script is to be included into the Debian gs build scripts. +#Do not execute it alone. + +ifeq ($(stp-support), yes) +APPLY_PATCHES := $(APPLY_PATCHES) patch-stp +UNAPPLY_PATCHES := unpatch-stp $(UNAPPLY_PATCHES) +INSTALL_PATCHES := $(INSTALL_PATCHES) install-stp +endif + +patch-stp: patch-stp-stamp +patch-stp-stamp: + @echo -n Adding stp support... + @cp contrib/stp/*.[ch] . + @cp devs.mak devs.mak.stp-old + @cat contrib/stp/devs.mak.addon-5.10 >>devs.mak + @debian/addentry gcc-head.mak DEVICE_DEVS6 stp.dev + @touch $@ + @echo done + +unpatch-stp: + @echo -n Removing stp support... + @if [ -f patch-stp-stamp ]; then \ + mv devs.mak.stp-old devs.mak; \ + debian/addentry --remove gcc-head.mak DEVICE_DEVS6 stp.dev; \ + cd contrib/stp; \ + for i in *.[ch]; do \ + rm -f ../../$$i; \ + done; \ + fi + @echo done + @rm -f patch-stp-stamp + +install-stp: + install -m 644 contrib/stp/README.stp $(GSDOCDIR) diff --git a/src/ghost/devs.mak.addon-5.10 b/src/ghost/devs.mak.addon-5.10 new file mode 100644 index 0000000..b855859 --- /dev/null +++ b/src/ghost/devs.mak.addon-5.10 @@ -0,0 +1,51 @@ +### --------------- Gimp-Print/stp Driver ---------------------------- ### +### Be careful to add the exact contents of this file; cut and paste ### +### may corrupt the file and cause mysterious make errors ### + +stp_=gdevstp.$(OBJ) \ + gdevstp-dither.$(OBJ) \ + gdevstp-dither-matrices.$(OBJ) \ + gdevstp-util.$(OBJ) \ + gdevstp-color.$(OBJ) \ + gdevstp-weave.$(OBJ) \ + gdevstp-escp2.$(OBJ) \ + gdevstp-lexmark.$(OBJ) \ + gdevstp-pcl.$(OBJ) \ + gdevstp-canon.$(OBJ) \ + gdevstp-ps.$(OBJ) + +$(DD)stp.dev: $(stp_) $(DD)page.dev + $(SETPDEV) $(DD)stp $(stp_) + +gdevstp.$(OBJ) : gdevstp.c $(PDEVH) gdevstp-print.h + $(CCC) -DDISABLE_NLS gdevstp.c + +gdevstp-util.$(OBJ) : gdevstp-util.c gdevstp-printers.c $(PDEVH) gdevstp-print.h gdevstp-print-internal.h + $(CCC) -DDISABLE_NLS gdevstp-util.c + +gdevstp-weave.$(OBJ) : gdevstp-weave.c $(PDEVH) gdevstp-print.h gdevstp-print-internal.h + $(CCC) -DDISABLE_NLS gdevstp-weave.c + +gdevstp-color.$(OBJ) : gdevstp-color.c $(PDEVH) gdevstp-print.h gdevstp-print-internal.h + $(CCC) -DDISABLE_NLS gdevstp-color.c + +gdevstp-dither.$(OBJ) : gdevstp-dither.c $(PDEVH) gdevstp-print.h gdevstp-print-internal.h + $(CCC) -DDISABLE_NLS gdevstp-dither.c + +gdevstp-dither-matrices.$(OBJ) : gdevstp-dither-matrices.c $(PDEVH) gdevstp-print.h gdevstp-print-internal.h + $(CCC) -DDISABLE_NLS gdevstp-dither.c + +gdevstp-escp2.$(OBJ) : gdevstp-escp2.c $(PDEVH) gdevstp-print.h gdevstp-print-internal.h + $(CCC) -DDISABLE_NLS gdevstp-escp2.c + +gdevstp-lexmark.$(OBJ) : gdevstp-lexmark.c $(PDEVH) gdevstp-print.h gdevstp-print-internal.h + $(CCC) -DDISABLE_NLS gdevstp-lexmark.c + +gdevstp-pcl.$(OBJ) : gdevstp-pcl.c $(PDEVH) gdevstp-print.h gdevstp-print-internal.h + $(CCC) -DDISABLE_NLS gdevstp-pcl.c + +gdevstp-canon.$(OBJ) : gdevstp-canon.c $(PDEVH) gdevstp-print.h gdevstp-print-internal.h + $(CCC) -DDISABLE_NLS gdevstp-canon.c + +gdevstp-ps.$(OBJ) : gdevstp-ps.c $(PDEVH) gdevstp-print.h gdevstp-print-internal.h + $(CCC) -DDISABLE_NLS gdevstp-ps.c diff --git a/src/ghost/gdevstp.c b/src/ghost/gdevstp.c new file mode 100644 index 0000000..f73ce7f --- /dev/null +++ b/src/ghost/gdevstp.c @@ -0,0 +1,735 @@ +/* + + stp driver for ghostscript + + -gs frontend derived from gdevbmp and gdevcdj + + + written in January 2000 by + Henryk Richter + for ghostscript 5.x/6.x + + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ +/*$Id: gdevstp.c,v 1.14 2001/10/27 17:16:38 rlk Exp $ */ +/* stp output driver */ +#include "gdevprn.h" +#include "gdevpccm.h" +#include "gsparam.h" +#include + +#ifdef DISABLE_NLS +#include "gdevstp-print.h" +#else +#include +#endif + +/* internal debugging output ? */ + +private int stp_debug = 0; + +#define STP_DEBUG(x) do { if (stp_debug || getenv("STP_DEBUG")) x; } while (0) + +/* ------ The device descriptors ------ */ + +#define X_DPI 360 +#define Y_DPI 360 + +private dev_proc_map_rgb_color(stp_map_16m_rgb_color); +private dev_proc_map_color_rgb(stp_map_16m_color_rgb); +private dev_proc_print_page(stp_print_page); +private dev_proc_get_params(stp_get_params); +private dev_proc_put_params(stp_put_params); +private dev_proc_open_device(stp_open); + +/* 24-bit color. ghostscript driver */ +private const gx_device_procs stpm_procs = +prn_color_params_procs( + stp_open, /*gdev_prn_open,*/ /* open file, delegated */ + gdev_prn_output_page, /* output page, delegated */ + gdev_prn_close, /* close file, delegated */ + stp_map_16m_rgb_color, /* map color (own) */ + stp_map_16m_color_rgb, /* map color (own) */ + stp_get_params, /* get params (own) */ + stp_put_params /* put params (own) */ + ); + +gx_device_printer gs_stp_device = +prn_device(stpm_procs, "stp", + DEFAULT_WIDTH_10THS, DEFAULT_HEIGHT_10THS, + X_DPI, Y_DPI, + 0, 0, 0, 0, /* margins */ + 24, stp_print_page); + +/* private data structure */ +typedef struct +{ + int topoffset; /* top offset in pixels */ + int bottom; + stp_vars_t v; +} privdata_t; + +/* global variables, RO for subfunctions */ +private privdata_t stp_data = +{ 0, 0, NULL }; + +typedef struct +{ + gx_device_printer *dev; + privdata_t *data; + uint raster; +} stp_priv_image_t; + +static const char *Image_get_appname(stp_image_t *image); +static void Image_progress_conclude(stp_image_t *image); +static void Image_note_progress(stp_image_t *image, + double current, double total); +static void Image_progress_init(stp_image_t *image); +static stp_image_status_t Image_get_row(stp_image_t *image, + unsigned char *data, int row); +static int Image_height(stp_image_t *image); +static int Image_width(stp_image_t *image); +static int Image_bpp(stp_image_t *image); +static void Image_rotate_180(stp_image_t *image); +static void Image_rotate_cw(stp_image_t *image); +static void Image_rotate_ccw(stp_image_t *image); +static void Image_init(stp_image_t *image); + +static stp_image_t theImage = +{ + Image_init, + NULL, /* reset */ + NULL, /* transpose */ + NULL, /* hflip */ + NULL, /* vflip */ + NULL, /* crop */ + Image_rotate_ccw, + Image_rotate_cw, + Image_rotate_180, + Image_bpp, + Image_width, + Image_height, + Image_get_row, + Image_get_appname, + Image_progress_init, + Image_note_progress, + Image_progress_conclude, + NULL +}; + +/* ------ Private definitions ------ */ + +/*********************************************************************** +* ghostscript driver function calls * +***********************************************************************/ + +private void +stp_dbg(const char *msg, const privdata_t *stp_data) +{ + fprintf(gs_stderr,"%s Settings: c: %f m: %f y: %f\n", + msg, stp_get_cyan(stp_data->v), stp_get_magenta(stp_data->v), + stp_get_yellow(stp_data->v)); + fprintf(gs_stderr, "Ink type %s\n", stp_get_ink_type(stp_data->v)); + + fprintf(gs_stderr,"Settings: bright: %f contrast: %f\n", + stp_get_brightness(stp_data->v), stp_get_contrast(stp_data->v)); + + fprintf(gs_stderr,"Settings: Gamma: %f Saturation: %f Density: %f\n", + stp_get_gamma(stp_data->v), stp_get_saturation(stp_data->v), + stp_get_density(stp_data->v)); + fprintf(gs_stderr, "Settings: width %d, height %d\n", + stp_get_page_width(stp_data->v), stp_get_page_height(stp_data->v)); + fprintf(gs_stderr, "Settings: output type %d image type %d\n", + stp_get_output_type(stp_data->v), stp_get_image_type(stp_data->v)); + fprintf(gs_stderr, "Settings: Quality %s\n", + stp_get_resolution(stp_data->v)); + fprintf(gs_stderr, "Settings: Dither %s\n", + stp_get_dither_algorithm(stp_data->v)); + fprintf(gs_stderr, "Settings: InputSlot %s\n", + stp_get_media_source(stp_data->v)); + fprintf(gs_stderr, "Settings: MediaType %s\n", + stp_get_media_type(stp_data->v)); + fprintf(gs_stderr, "Settings: MediaSize %s\n", + stp_get_media_size(stp_data->v)); + fprintf(gs_stderr, "Settings: Model %s\n", stp_get_driver(stp_data->v)); + fprintf(gs_stderr, "Settings: InkType %s\n", stp_get_ink_type(stp_data->v)); + fprintf(gs_stderr, "Settings: OutputTo %s\n", stp_get_output_to(stp_data->v)); +} + +private void +stp_print_dbg(const char *msg, gx_device_printer *pdev, + const privdata_t *stp_data) +{ + STP_DEBUG(if (pdev) + fprintf(gs_stderr,"%s Image: %d x %d pixels, %f x %f dpi\n", + msg, pdev->width, pdev->height, pdev->x_pixels_per_inch, + pdev->y_pixels_per_inch)); + STP_DEBUG(stp_dbg(msg, stp_data)); +} + +private void +stp_print_debug(const char *msg, gx_device *pdev, + const privdata_t *stp_data) +{ + STP_DEBUG(if (pdev) + fprintf(gs_stderr,"%s Image: %d x %d pixels, %f x %f dpi\n", + msg, pdev->width, pdev->height, pdev->x_pixels_per_inch, + pdev->y_pixels_per_inch)); + STP_DEBUG(stp_dbg(msg, stp_data)); +} + +private void +stp_init_vars(void) +{ + STP_DEBUG(fprintf(gs_stderr, "Calling ")); + if (! stp_data.v) + { + STP_DEBUG(fprintf(gs_stderr, "and initializing ")); + stp_init(); + stp_data.v = stp_allocate_vars(); + stp_set_driver(stp_data.v, ""); +/* stp_set_media_size(stp_data.v, "Letter"); */ + } + STP_DEBUG(fprintf(gs_stderr, "stp_init_vars\n")); +} + + +private void +stp_writefunc(void *file, const char *buf, size_t bytes) +{ + FILE *prn = (FILE *)file; + fwrite(buf, 1, bytes, prn); +} + +private int +stp_print_page(gx_device_printer * pdev, FILE * file) +{ + stp_priv_image_t gsImage; + private int printvars_merged = 0; + int code; /* return code */ + stp_printer_t printer = NULL; + uint stp_raster; + byte *stp_row; + stp_papersize_t p; + theImage.rep = &gsImage; + + stp_init_vars(); + stp_print_dbg("stp_print_page", pdev, &stp_data); + code = 0; + stp_raster = gdev_prn_raster(pdev); + printer = stp_get_printer_by_driver(stp_get_driver(stp_data.v)); + if (printer == NULL) + { + fprintf(gs_stderr, "Printer %s is not a known printer model\n", + stp_get_driver(stp_data.v)); + return_error(gs_error_rangecheck); + } + + if (!printvars_merged) + { + stp_merge_printvars(stp_data.v, stp_printer_get_printvars(printer)); + printvars_merged = 1; + } + stp_row = gs_alloc_bytes(pdev->memory, stp_raster, "stp file buffer"); + + if (stp_row == 0) /* can't allocate row buffer */ + return_error(gs_error_VMerror); + + if (strlen(stp_get_resolution(stp_data.v)) == 0) + stp_set_resolution(stp_data.v, + ((*stp_printer_get_printfuncs(printer)->default_parameters) + (printer, NULL, "Resolution"))); + if (strlen(stp_get_dither_algorithm(stp_data.v)) == 0) + stp_set_dither_algorithm(stp_data.v, stp_default_dither_algorithm()); + + stp_set_scaling(stp_data.v, -pdev->x_pixels_per_inch); /* resolution of image */ + + /* compute lookup table: lut_t*,float dest_gamma,float app_gamma,stp_vars_t* */ + stp_set_app_gamma(stp_data.v, 1.7); + + stp_data.topoffset = 0; + stp_set_cmap(stp_data.v, NULL); + + stp_set_page_width(stp_data.v, pdev->MediaSize[0]); + stp_set_page_height(stp_data.v, pdev->MediaSize[1]); + if ((p = stp_get_papersize_by_size(stp_get_page_height(stp_data.v), + stp_get_page_width(stp_data.v))) != NULL) + stp_set_media_size(stp_data.v, stp_papersize_get_name(p)); + stp_print_dbg("stp_print_page", pdev, &stp_data); + + gsImage.dev = pdev; + gsImage.data = &stp_data; + gsImage.raster = stp_raster; + stp_set_outfunc(stp_data.v, stp_writefunc); + stp_set_errfunc(stp_data.v, stp_writefunc); + stp_set_outdata(stp_data.v, file); + stp_set_errdata(stp_data.v, gs_stderr); + if (stp_printer_get_printfuncs(printer)->verify(printer, stp_data.v)) + (stp_printer_get_printfuncs(printer)->print) + (printer, &theImage, stp_data.v); + else + code = 1; + + gs_free_object(pdev->memory, stp_row, "stp row buffer"); + stp_row = NULL; + + if (code) + return_error(gs_error_rangecheck); + else + return 0; +} + +/* 24-bit color mappers (taken from gdevmem2.c). */ + +/* Map a r-g-b color to a color index. */ +private gx_color_index +stp_map_16m_rgb_color(gx_device * dev, gx_color_value r, gx_color_value g, + gx_color_value b) +{ + return gx_color_value_to_byte(b) + + ((uint) gx_color_value_to_byte(g) << 8) + + ((ulong) gx_color_value_to_byte(r) << 16); +} + +/* Map a color index to a r-g-b color. */ +private int +stp_map_16m_color_rgb(gx_device * dev, gx_color_index color, + gx_color_value prgb[3]) +{ + prgb[2] = gx_color_value_from_byte(color & 0xff); + prgb[1] = gx_color_value_from_byte((color >> 8) & 0xff); + prgb[0] = gx_color_value_from_byte(color >> 16); + return 0; +} + +private int +stp_write_float(gs_param_list *plist, const char *name, float value) +{ + return param_write_float(plist, name, &value); +} + +private int +stp_write_int(gs_param_list *plist, const char *name, int value) +{ + return param_write_int(plist, name, &value); +} + +private char * +c_strdup(const char *s) +{ + char *ret; + if (!s) + { + STP_DEBUG(fprintf(gs_stderr, "c_strdup null ptr\n")); + ret = malloc(1); + ret[0] = 0; + return ret; + } + else + { + STP_DEBUG(fprintf(gs_stderr, "c_strdup |%s|\n", s)); + ret = malloc(strlen(s) + 1); + strcpy(ret, s); + return ret; + } +} + +/* + * Get parameters. In addition to the standard and printer + * parameters, we supply a lot of options to play around with + * for maximum quality out of the photo printer +*/ +/* Yeah, I could have used a list for the options but... */ +private int +stp_get_params(gx_device *pdev, gs_param_list *plist) +{ + int code; + gs_param_string pinktype; + gs_param_string pmodel; + gs_param_string pmediatype; + gs_param_string pInputSlot; + gs_param_string palgorithm; + gs_param_string pquality; + char *pmediatypestr; + char *pInputSlotstr; + char *pinktypestr; + char *pmodelstr; + char *palgorithmstr; + char *pqualitystr; + stp_init_vars(); + + stp_print_debug("stp_get_params(0)", pdev, &stp_data); + code = gdev_prn_get_params(pdev, plist); + stp_print_debug("stp_get_params(1)", pdev, &stp_data); + pmodelstr = c_strdup(stp_get_driver(stp_data.v)); + pInputSlotstr = c_strdup(stp_get_media_source(stp_data.v)); + pmediatypestr = c_strdup(stp_get_media_type(stp_data.v)); + pinktypestr = c_strdup(stp_get_ink_type(stp_data.v)); + palgorithmstr = c_strdup(stp_get_dither_algorithm(stp_data.v)); + pqualitystr = c_strdup(stp_get_resolution(stp_data.v)); + + param_string_from_string(pmodel, pmodelstr); + param_string_from_string(pInputSlot, pInputSlotstr); + param_string_from_string(pmediatype, pmediatypestr); + param_string_from_string(pinktype, pinktypestr); + param_string_from_string(palgorithm, palgorithmstr); + param_string_from_string(pquality, pqualitystr); + + if (code < 0 || + (code = stp_write_float(plist, "Cyan", stp_get_cyan(stp_data.v))) < 0 || + (code = stp_write_float(plist, "Magenta", stp_get_magenta(stp_data.v))) < 0 || + (code = stp_write_float(plist, "Yellow", stp_get_yellow(stp_data.v))) < 0 || + (code = stp_write_float(plist, "Brightness", stp_get_brightness(stp_data.v))) < 0 || + (code = stp_write_float(plist, "Contrast", stp_get_contrast(stp_data.v))) < 0 || + (code = stp_write_int(plist, "Color", stp_get_output_type(stp_data.v))) < 0 || + (code = stp_write_int(plist, "ImageType", stp_get_image_type(stp_data.v))) < 0 || + (code = stp_write_float(plist, "Gamma", stp_get_gamma(stp_data.v))) < 0 || + (code = stp_write_float(plist, "Saturation", stp_get_saturation(stp_data.v))) < 0 || + (code = stp_write_float(plist, "Density", stp_get_density(stp_data.v))) < 0 || + (code = param_write_string(plist, "Model", &pmodel)) < 0 || + (code = param_write_string(plist, "Dither", &palgorithm)) < 0 || + (code = param_write_string(plist, "Quality", &pquality)) < 0 || + (code = param_write_string(plist, "InkType", &pinktype) < 0) || + (code = param_write_string(plist, "MediaType", &pmediatype)) < 0 || + (code = param_write_string(plist, "stpMediaType", &pmediatype)) < 0 || + (code = param_write_string(plist, "InputSlot", &pInputSlot)) < 0 + ) + { + free(pmodelstr); + free(pInputSlotstr); + free(pmediatypestr); + free(pinktypestr); + free(palgorithmstr); + free(pqualitystr); + STP_DEBUG(fprintf(stderr, "stp_get_params returns %d\n", code)); + return code; + } + + return 0; +} + +/* Put parameters. */ +/* Yeah, I could have used a list for the options but... */ + +#define STP_PUT_PARAM(plist, gtype, v, name, param, ecode) \ +do { \ + int code; \ + gtype value; \ + \ + code = param_read_##gtype(plist, name, &value); \ + switch (code) \ + { \ + case 0: \ + if (value < stp_get_##param(lower) || value > stp_get_##param(upper)) \ + { \ + param_signal_error(plist, name, gs_error_rangecheck); \ + ecode = -100; \ + } \ + else \ + stp_set_##param(v, value); \ + break; \ + case 1: \ + break; \ + default: \ + ecode = code; \ + break; \ + } \ +} while (0) + +private int +stp_put_params(gx_device *pdev, gs_param_list *plist) +{ + const stp_vars_t lower = stp_minimum_settings(); + const stp_vars_t upper = stp_maximum_settings(); + gs_param_string pmediatype; + gs_param_string pInputSlot; + gs_param_string pinktype; + gs_param_string pmodel; + gs_param_string palgorithm; + gs_param_string pquality; + char *pmediatypestr; + char *pInputSlotstr; + char *pinktypestr; + char *pmodelstr; + char *palgorithmstr; + char *pqualitystr; + int code = 0; + stp_printer_t printer; + stp_init_vars(); + + stp_print_debug("stp_put_params(0)", pdev, &stp_data); + + pmodelstr = c_strdup(stp_get_driver(stp_data.v)); + pInputSlotstr = c_strdup(stp_get_media_source(stp_data.v)); + pmediatypestr = c_strdup(stp_get_media_type(stp_data.v)); + pinktypestr = c_strdup(stp_get_ink_type(stp_data.v)); + palgorithmstr = c_strdup(stp_get_dither_algorithm(stp_data.v)); + pqualitystr = c_strdup(stp_get_resolution(stp_data.v)); + + param_string_from_string(pmodel, pmodelstr); + param_string_from_string(pInputSlot, pInputSlotstr); + param_string_from_string(pmediatype, pmediatypestr); + param_string_from_string(pinktype, pinktypestr); + param_string_from_string(palgorithm, palgorithmstr); + param_string_from_string(pquality, pqualitystr); + + STP_PUT_PARAM(plist, float, stp_data.v, "Cyan", cyan, code); + STP_PUT_PARAM(plist, float, stp_data.v, "Magenta", magenta, code); + STP_PUT_PARAM(plist, float, stp_data.v, "Yellow", yellow, code); + STP_PUT_PARAM(plist, float, stp_data.v, "Brightness", brightness, code); + STP_PUT_PARAM(plist, float, stp_data.v, "Contrast", contrast, code); + STP_PUT_PARAM(plist, int, stp_data.v, "Color", output_type, code); + STP_PUT_PARAM(plist, int, stp_data.v, "ImageType", image_type, code); + STP_PUT_PARAM(plist, float, stp_data.v, "Gamma", gamma, code); + STP_PUT_PARAM(plist, float, stp_data.v, "Saturation", saturation ,code); + STP_PUT_PARAM(plist, float, stp_data.v, "Density", density, code); + param_read_string(plist, "Quality", &pquality); + param_read_string(plist, "Dither", &palgorithm); + param_read_string(plist, "InputSlot", &pInputSlot); + param_read_string(plist, "stpMediaType", &pmediatype); + if (!pmediatype.data || pmediatype.size == 0) + param_read_string(plist, "MediaType", &pmediatype); + param_read_string(plist, "Model", &pmodel); + param_read_string(plist, "InkType", &pinktype); + + if (stp_get_output_type(stp_data.v) == OUTPUT_RAW_CMYK) + { + param_signal_error(plist, "Color", gs_error_rangecheck); + code = -100; + } + + if ( code < 0 ) + { + free(pmodelstr); + free(pInputSlotstr); + free(pmediatypestr); + free(pinktypestr); + free(palgorithmstr); + free(pqualitystr); + + return code; + } + + STP_DEBUG(fprintf(gs_stderr, "pmodel.size %d pmodel.data %s\n", + pmodel.size, pmodel.data)); + STP_DEBUG(fprintf(gs_stderr, "pinktype.size %d pinktype.data %s\n", + pinktype.size, pinktype.data)); + STP_DEBUG(fprintf(gs_stderr, "pquality.size %d pquality.data %s\n", + pquality.size, pquality.data)); + stp_set_driver_n(stp_data.v, pmodel.data, pmodel.size); + printer = stp_get_printer_by_driver(stp_get_driver(stp_data.v)); + if (printer) + stp_set_printer_defaults(stp_data.v, printer, NULL); + + if (pmediatype.data && pmediatype.size != 0) + stp_set_media_type_n(stp_data.v, pmediatype.data, pmediatype.size); + if (pInputSlot.data && pInputSlot.size != 0) + stp_set_media_source_n(stp_data.v, pInputSlot.data, pInputSlot.size); + if (pinktype.data && pinktype.size != 0) + stp_set_ink_type_n(stp_data.v, pinktype.data, pinktype.size); + if (palgorithm.data && palgorithm.size != 0) + stp_set_dither_algorithm_n(stp_data.v, palgorithm.data, palgorithm.size); + if (pquality.data && pquality.size != 0) + stp_set_resolution_n(stp_data.v, pquality.data, pquality.size); + stp_print_debug("stp_put_params(1)", pdev, &stp_data); + + code = gdev_prn_put_params(pdev, plist); + + free(pmodelstr); + free(pInputSlotstr); + free(pmediatypestr); + free(pinktypestr); + free(palgorithmstr); + free(pqualitystr); + + return code; +} + +private int +stp_open(gx_device *pdev) +{ + /* Change the margins if necessary. */ + float st[4]; + int left,right,bottom,top,width,height; + stp_printer_t printer; + stp_init_vars(); + stp_print_debug("stp_open", pdev, &stp_data); + printer = stp_get_printer_by_driver(stp_get_driver(stp_data.v)); + if (!printer) + { + if (strlen(stp_get_driver(stp_data.v)) == 0) + fprintf(gs_stderr, "Printer must be specified with -sModel\n"); + else + fprintf(gs_stderr, "Printer %s is not a known model\n", + stp_get_driver(stp_data.v)); + return_error(gs_error_undefined); + } + + stp_set_page_width(stp_data.v, pdev->MediaSize[0]); + stp_set_page_height(stp_data.v, pdev->MediaSize[1]); + + (*stp_printer_get_printfuncs(printer)->media_size) + (printer, stp_data.v, &width, &height); + + (*stp_printer_get_printfuncs(printer)->imageable_area) + (printer, stp_data.v, &left, &right, &bottom, &top); + + st[1] = (float)bottom / 72; /* bottom margin */ + st[3] = (float)(height-top) / 72; /* top margin */ + st[0] = (float)left / 72; /* left margin */ + st[2] = (float)(width-right) / 72; /* right margin */ + + stp_set_top(stp_data.v, 0); + stp_data.bottom = bottom + height-top; + + stp_print_debug("stp_open", pdev, &stp_data); + STP_DEBUG(fprintf(gs_stderr, "margins: l %f b %f r %f t %f\n", + st[0], st[1], st[2], st[3])); + + gx_device_set_margins(pdev, st, true); + return gdev_prn_open(pdev); +} + + +/*********************************************************************** +* driver function callback routines * +***********************************************************************/ + +/* get one row of the image */ +private stp_image_status_t +Image_get_row(stp_image_t *image, unsigned char *data, int row) +{ + stp_priv_image_t *im = (stp_priv_image_t *) (image->rep); + memset(data, 0, im->dev->width * 3); + if (im->dev->x_pixels_per_inch == im->dev->y_pixels_per_inch) + { + gdev_prn_copy_scan_lines(im->dev, im->data->topoffset+row, + data, im->raster); + } + else if (im->dev->x_pixels_per_inch > im->dev->y_pixels_per_inch) + { + /* + * If xres > yres, duplicate rows + */ + int ratio = (im->dev->x_pixels_per_inch / im->dev->y_pixels_per_inch); + gdev_prn_copy_scan_lines(im->dev, (im->data->topoffset + row) / ratio, + data, im->raster); + } + else + { + /* + * If xres < yres, skip rows + */ + int ratio = (im->dev->y_pixels_per_inch / im->dev->x_pixels_per_inch); + gdev_prn_copy_scan_lines(im->dev, (im->data->topoffset + row) * ratio, + data, im->raster); + } + return STP_IMAGE_OK; +} + +/* return bpp of picture (24 here) */ +private int +Image_bpp(stp_image_t *image) +{ + return 3; +} + +/* return width of picture */ +private int +Image_width(stp_image_t *image) +{ + stp_priv_image_t *im = (stp_priv_image_t *) (image->rep); + return im->dev->width; +} + +/* + return height of picture and + subtract margins from image size so that the + driver only reads the correct number of lines from the + input + +*/ +private int +Image_height(stp_image_t *image) +{ + stp_priv_image_t *im = (stp_priv_image_t *) (image->rep); + float tmp,tmp2; + + /* top margin + bottom margin */ + tmp = stp_get_top(im->data->v) + im->data->bottom; + + /* calculate height in 1/72 inches */ + tmp2 = (float)(im->dev->height) / (float)(im->dev->y_pixels_per_inch) * 72.; + + tmp2 -= tmp; /* subtract margins from sizes */ + + /* calculate new image height */ + tmp2 *= (float)(im->dev->x_pixels_per_inch) / 72.; + + STP_DEBUG(fprintf(gs_stderr,"corrected page height %f\n",tmp2)); + + return (int)tmp2; +} + +private void +Image_rotate_ccw(stp_image_t *image) +{ + /* dummy function, Landscape printing unsupported atm */ +} + +private void +Image_rotate_cw(stp_image_t *image) +{ + /* dummy function, Seascape printing unsupported atm */ +} + +private void +Image_rotate_180(stp_image_t *image) +{ + /* dummy function, upside down printing unsupported atm */ +} + +private void +Image_init(stp_image_t *image) +{ + /* dummy function */ +} + +private void +Image_progress_init(stp_image_t *image) +{ + /* dummy function */ +} + +/* progress display */ +private void +Image_note_progress(stp_image_t *image, double current, double total) +{ + STP_DEBUG(fprintf(gs_stderr, ".")); +} + +private void +Image_progress_conclude(stp_image_t *image) +{ + STP_DEBUG(fprintf(gs_stderr, "\n")); +} + +private const char * +Image_get_appname(stp_image_t *image) +{ + return "GhostScript/stp"; +} diff --git a/src/gimp/.cvsignore b/src/gimp/.cvsignore new file mode 100644 index 0000000..dc31214 --- /dev/null +++ b/src/gimp/.cvsignore @@ -0,0 +1,5 @@ +.deps +.libs +Makefile +Makefile.in +print diff --git a/src/gimp/Makefile.am b/src/gimp/Makefile.am new file mode 100644 index 0000000..5ec8700 --- /dev/null +++ b/src/gimp/Makefile.am @@ -0,0 +1,87 @@ +## $Id: Makefile.am,v 1.18 2001/10/10 23:05:16 rlk Exp $ +## Copyright (C) 2000 Roger Leigh +## +## 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, or (at your option) +## any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +## Process this file with automake to produce Makefile.in. + +AUTOMAKE_OPTIONS = 1.4 gnu + +@SET_MAKE@ + +MAINT_CHARSET = latin1 + + +## Variables + +AM_CFLAGS = $(GNUCFLAGS) +INCLUDES = @INCLUDES@ $(GIMP_CFLAGS) $(LIBGIMPPRINT_CFLAGS) +LIBS = @LIBS@ ../../lib/libprintut.la $(INTLLIBS) ../../lib/libprintut.la + +libexecdir = $(gimptool_prefix)/plug-ins + + +## Programs + +GIMP_BIN = print + +libexec_PROGRAMS = @GIMP_BIN@ + +EXTRA_PROGRAMS = print + +print_SOURCES = \ + print-image-gimp.c \ + print-intl.h \ + print.c \ + gimp_color_window.c \ + gimp_main_window.c \ + print_gimp.h +print_LDADD = $(GIMP_LIBS) $(LIBGIMPPRINT_LIBS) ../../lib/libprintut.la +print_DEPENDENCIES = $(LIBGIMPPRINT_LIBS) + + +## Rules + +install-libexecPROGRAMS: $(libexec_PROGRAMS) + @DESTDIR='$(DESTDIR)'; export DESTDIR;\ + list='$(libexec_PROGRAMS)'; for p in $$list; do \ + if test -f $$p; then \ + if test -f .libs/$$p; then \ + cd .libs; \ + fi; \ + echo $(GIMPTOOL) --install-@PLUG_IN_PATH@ $$p; \ + $(GIMPTOOL) --install-@PLUG_IN_PATH@ $$p; \ + else :; fi; \ + done + +uninstall-libexecPROGRAMS: + @DESTDIR='$(DESTDIR)'; export DESTDIR;\ + list='$(libexec_PROGRAMS)'; for p in $$list; do \ + echo $(GIMPTOOL) --uninstall-@PLUG_IN_PATH@ "$$p"; \ + $(GIMPTOOL) --uninstall-@PLUG_IN_PATH@ "$$p"; \ + echo $(GIMPTOOL) --uninstall-admin-bin "$$p"; \ + $(GIMPTOOL) --uninstall-admin-bin "$$p"; \ + done; \ + exit 0 + +$(LIBGIMPPRINT_LIBS): + cd ../main ; \ + $(MAKE) + + +## Clean + +CLEANFILES = $(EXTRA_PROGRAMS) +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/gimp/gimp_color_window.c b/src/gimp/gimp_color_window.c new file mode 100644 index 0000000..418f4f5 --- /dev/null +++ b/src/gimp/gimp_color_window.c @@ -0,0 +1,581 @@ +/* + * "$Id: gimp_color_window.c,v 1.19 2001/09/24 17:30:07 mitsch Exp $" + * + * Main window code for Print plug-in for the GIMP. + * + * Copyright 1997-2000 Michael Sweet (mike@easysw.com), + * Robert Krawitz (rlk@alum.mit.edu), Steve Miller (smiller@rni.net) + * and Michael Natterer (mitch@gimp.org) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include "../../lib/libprintut.h" + +#include "print_gimp.h" + +#include "print-intl.h" +#include + +gint thumbnail_w, thumbnail_h, thumbnail_bpp; +guchar *thumbnail_data; +gint adjusted_thumbnail_bpp; +guchar *adjusted_thumbnail_data; + +GtkWidget *gimp_color_adjust_dialog; + +static GtkObject *brightness_adjustment; +static GtkObject *saturation_adjustment; +static GtkObject *density_adjustment; +static GtkObject *contrast_adjustment; +static GtkObject *cyan_adjustment; +static GtkObject *magenta_adjustment; +static GtkObject *yellow_adjustment; +static GtkObject *gamma_adjustment; + +GtkWidget *dither_algo_combo = NULL; +static gint dither_algo_callback_id = -1; + +static void gimp_brightness_update (GtkAdjustment *adjustment); +static void gimp_saturation_update (GtkAdjustment *adjustment); +static void gimp_density_update (GtkAdjustment *adjustment); +static void gimp_contrast_update (GtkAdjustment *adjustment); +static void gimp_cyan_update (GtkAdjustment *adjustment); +static void gimp_magenta_update (GtkAdjustment *adjustment); +static void gimp_yellow_update (GtkAdjustment *adjustment); +static void gimp_gamma_update (GtkAdjustment *adjustment); +static void gimp_set_color_defaults (void); + +static void gimp_dither_algo_callback (GtkWidget *widget, + gpointer data); + + +void gimp_build_dither_combo (void); + +static GtkDrawingArea *swatch = NULL; + +#define SWATCH_W (128) +#define SWATCH_H (128) + +static char * +c_strdup(const char *s) +{ + char *ret = malloc(strlen(s) + 1); + if (!s) + exit(1); + strcpy(ret, s); + return ret; +} + +static void +gimp_dither_algo_callback (GtkWidget *widget, + gpointer data) +{ + const gchar *new_algo = + gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (dither_algo_combo)->entry)); + int i; + + for (i = 0; i < stp_dither_algorithm_count (); i ++) + if (strcasecmp (new_algo, stp_dither_algorithm_text (i)) == 0) + { + stp_set_dither_algorithm (*pv, stp_dither_algorithm_name (i)); + break; + } +} + +void +gimp_build_dither_combo (void) +{ + int i; + stp_param_t *vec = xmalloc(sizeof(stp_param_t) * stp_dither_algorithm_count()); + + for (i = 0; i < stp_dither_algorithm_count(); i++) + { + vec[i].name = c_strdup (stp_dither_algorithm_name (i)); + vec[i].text = c_strdup (stp_dither_algorithm_text (i)); + } + + gimp_plist_build_combo (dither_algo_combo, + stp_dither_algorithm_count (), + vec, + stp_get_dither_algorithm (*pv), + stp_default_dither_algorithm (), + &gimp_dither_algo_callback, + &dither_algo_callback_id); + + for (i = 0; i < stp_dither_algorithm_count (); i++) + { + free ((void *) vec[i].name); + free ((void *) vec[i].text); + } + free (vec); +} + +void +gimp_redraw_color_swatch (void) +{ + static GdkGC *gc = NULL; + static GdkColormap *cmap; + + if (swatch == NULL || swatch->widget.window == NULL) + return; + +#if 0 + gdk_window_clear (swatch->widget.window); +#endif + + if (gc == NULL) + { + gc = gdk_gc_new (swatch->widget.window); + cmap = gtk_widget_get_colormap (GTK_WIDGET(swatch)); + } + + (adjusted_thumbnail_bpp == 1 + ? gdk_draw_gray_image + : gdk_draw_rgb_image) (swatch->widget.window, gc, + (SWATCH_W - thumbnail_w) / 2, + (SWATCH_H - thumbnail_h) / 2, + thumbnail_w, thumbnail_h, GDK_RGB_DITHER_NORMAL, + adjusted_thumbnail_data, + adjusted_thumbnail_bpp * thumbnail_w); +} + +/* + * gimp_create_color_adjust_window (void) + * + * NOTES: + * creates the color adjuster popup, allowing the user to adjust brightness, + * contrast, saturation, etc. + */ +void +gimp_create_color_adjust_window (void) +{ + GtkWidget *table; + GtkWidget *event_box; + const stp_vars_t lower = stp_minimum_settings (); + const stp_vars_t upper = stp_maximum_settings (); + const stp_vars_t defvars = stp_default_settings (); + + /* + * Fetch a thumbnail of the image we're to print from the Gimp. This must + * + */ + + thumbnail_w = THUMBNAIL_MAXW; + thumbnail_h = THUMBNAIL_MAXH; + thumbnail_data = gimp_image_get_thumbnail_data (image_ID, &thumbnail_w, + &thumbnail_h, &thumbnail_bpp); + + /* + * thumbnail_w and thumbnail_h have now been adjusted to the actual + * thumbnail dimensions. Now initialize a color-adjusted version of + * the thumbnail. + */ + + adjusted_thumbnail_data = g_malloc (3 * thumbnail_w * thumbnail_h); + + gimp_color_adjust_dialog = + gimp_dialog_new (_("Print Color Adjust"), "print", + gimp_standard_help_func, "filters/print.html", + GTK_WIN_POS_MOUSE, FALSE, TRUE, FALSE, + + _("Set Defaults"), gimp_set_color_defaults, + NULL, NULL, NULL, FALSE, FALSE, + _("Close"), gtk_widget_hide, + NULL, 1, NULL, TRUE, TRUE, + + NULL); + + table = gtk_table_new (10, 3, FALSE); + gtk_container_set_border_width (GTK_CONTAINER (table), 6); + gtk_table_set_col_spacings (GTK_TABLE (table), 4); + gtk_table_set_row_spacings (GTK_TABLE (table), 2); + gtk_table_set_row_spacing (GTK_TABLE (table), 2, 6); + gtk_table_set_row_spacing (GTK_TABLE (table), 5, 6); + gtk_table_set_row_spacing (GTK_TABLE (table), 8, 6); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (gimp_color_adjust_dialog)->vbox), + table, FALSE, FALSE, 0); + gtk_widget_show (table); + + /* + * Drawing area for color swatch feedback display... + */ + + event_box = gtk_event_box_new (); + gtk_widget_show (GTK_WIDGET (event_box)); + gtk_table_attach (GTK_TABLE (table), GTK_WIDGET (event_box), + 0, 3, 0, 1, 0, 0, 0, 0); + + swatch = (GtkDrawingArea *) gtk_drawing_area_new (); + gtk_widget_set_events (GTK_WIDGET (swatch), GDK_EXPOSURE_MASK); + gtk_drawing_area_size (swatch, SWATCH_W, SWATCH_H); + gtk_container_add (GTK_CONTAINER (event_box), GTK_WIDGET (swatch)); + gtk_widget_show (GTK_WIDGET (swatch)); + + gimp_help_set_help_data (GTK_WIDGET (event_box), _("Image preview"), NULL); + gtk_signal_connect (GTK_OBJECT (swatch), "expose_event", + GTK_SIGNAL_FUNC (gimp_redraw_color_swatch), + NULL); + + /* + * Brightness slider... + */ + + brightness_adjustment = + gimp_scale_entry_new (GTK_TABLE (table), 0, 1, _("Brightness:"), 200, 0, + stp_get_brightness (defvars), + stp_get_brightness (lower), + stp_get_brightness (upper), + stp_get_brightness (defvars) / 100, + stp_get_brightness (defvars) / 10, + 3, TRUE, 0, 0, NULL, NULL); + set_adjustment_tooltip (brightness_adjustment, + _("Set the brightness of the print.\n" + "0 is solid black, 2 is solid white"), + NULL); + gtk_signal_connect (GTK_OBJECT (brightness_adjustment), "value_changed", + GTK_SIGNAL_FUNC (gimp_brightness_update), + NULL); + + /* + * Contrast slider... + */ + + contrast_adjustment = + gimp_scale_entry_new (GTK_TABLE (table), 0, 2, _("Contrast:"), 200, 0, + stp_get_contrast (defvars), + stp_get_contrast (lower), + stp_get_contrast (upper), + stp_get_contrast (defvars) / 100, + stp_get_contrast (defvars) / 10, + 3, TRUE, 0, 0, NULL, NULL); + set_adjustment_tooltip (contrast_adjustment, + _("Set the contrast of the print"), + NULL); + gtk_signal_connect (GTK_OBJECT (contrast_adjustment), "value_changed", + GTK_SIGNAL_FUNC (gimp_contrast_update), + NULL); + + /* + * Cyan slider... + */ + + cyan_adjustment = + gimp_scale_entry_new (GTK_TABLE (table), 0, 3, _("Cyan:"), 200, 0, + stp_get_cyan (defvars), + stp_get_cyan (lower), + stp_get_cyan (upper), + stp_get_cyan (defvars) / 100, + stp_get_cyan (defvars) / 10, + 3, TRUE, 0, 0, NULL, NULL); + set_adjustment_tooltip (cyan_adjustment, + _("Adjust the cyan balance of the print"), + NULL); + gtk_signal_connect (GTK_OBJECT (cyan_adjustment), "value_changed", + GTK_SIGNAL_FUNC (gimp_cyan_update), + NULL); + + /* + * Magenta slider... + */ + + magenta_adjustment = + gimp_scale_entry_new (GTK_TABLE (table), 0, 4, _("Magenta:"), 200, 0, + stp_get_magenta (defvars), + stp_get_magenta (lower), + stp_get_magenta (upper), + stp_get_magenta (defvars) / 100, + stp_get_magenta (defvars) / 10, + 3, TRUE, 0, 0, NULL, NULL); + set_adjustment_tooltip (magenta_adjustment, + _("Adjust the magenta balance of the print"), + NULL); + gtk_signal_connect (GTK_OBJECT (magenta_adjustment), "value_changed", + GTK_SIGNAL_FUNC (gimp_magenta_update), + NULL); + + /* + * Yellow slider... + */ + + yellow_adjustment = + gimp_scale_entry_new (GTK_TABLE (table), 0, 5, _("Yellow:"), 200, 0, + stp_get_yellow (defvars), + stp_get_yellow (lower), + stp_get_yellow (upper), + stp_get_yellow (defvars) / 100, + stp_get_yellow (defvars) / 10, + 3, TRUE, 0, 0, NULL, NULL); + set_adjustment_tooltip (yellow_adjustment, + _("Adjust the yellow balance of the print"), + NULL); + gtk_signal_connect (GTK_OBJECT (yellow_adjustment), "value_changed", + GTK_SIGNAL_FUNC (gimp_yellow_update), + NULL); + + /* + * Saturation slider... + */ + + saturation_adjustment = + gimp_scale_entry_new (GTK_TABLE (table), 0, 6, _("Saturation:"), 200, 0, + stp_get_saturation (defvars), + stp_get_saturation (lower), + stp_get_saturation (upper), + stp_get_saturation (defvars) / 1000, + stp_get_saturation (defvars) / 100, + 3, TRUE, 0, 0, NULL, NULL); + set_adjustment_tooltip (saturation_adjustment, + _("Adjust the saturation (color balance) of the print\n" + "Use zero saturation to produce grayscale output " + "using color and black inks"), + NULL); + gtk_signal_connect (GTK_OBJECT (saturation_adjustment), "value_changed", + GTK_SIGNAL_FUNC (gimp_saturation_update), + NULL); + + /* + * Density slider... + */ + + density_adjustment = + gimp_scale_entry_new (GTK_TABLE (table), 0, 7, _("Density:"), 200, 0, + stp_get_density (defvars), + stp_get_density (lower), + stp_get_density (upper), + stp_get_density (defvars) / 1000, + stp_get_density (defvars) / 100, + 3, TRUE, 0, 0, NULL, NULL); + set_adjustment_tooltip (density_adjustment, + _("Adjust the density (amount of ink) of the print. " + "Reduce the density if the ink bleeds through the " + "paper or smears; increase the density if black " + "regions are not solid."), + NULL); + gtk_signal_connect (GTK_OBJECT (density_adjustment), "value_changed", + GTK_SIGNAL_FUNC (gimp_density_update), + NULL); + + /* + * Gamma slider... + */ + + gamma_adjustment = + gimp_scale_entry_new (GTK_TABLE (table), 0, 8, _("Gamma:"), 200, 0, + stp_get_gamma (defvars), + stp_get_gamma (lower), + stp_get_gamma (upper), + stp_get_gamma (defvars) / 1000, + stp_get_gamma (defvars) / 100, + 3, TRUE, 0, 0, NULL, NULL); + set_adjustment_tooltip (gamma_adjustment, + _("Adjust the gamma of the print. Larger values will " + "produce a generally brighter print, while smaller " + "values will produce a generally darker print. " + "Black and white will remain the same, unlike with " + "the brightness adjustment."), + NULL); + gtk_signal_connect (GTK_OBJECT (gamma_adjustment), "value_changed", + GTK_SIGNAL_FUNC (gimp_gamma_update), + NULL); + + /* + * Dither algorithm option combo... + */ + + event_box = gtk_event_box_new (); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 9, + _("Dither Algorithm:"), 1.0, 0.5, + event_box, 1, TRUE); + + dither_algo_combo = gtk_combo_new (); + gtk_container_add (GTK_CONTAINER(event_box), dither_algo_combo); + gtk_widget_show (dither_algo_combo); + + gimp_help_set_help_data (GTK_WIDGET (event_box), + _("Choose the dither algorithm to be used.\n" + "Adaptive Hybrid usually produces the best " + "all-around quality.\n" + "Ordered is faster and produces almost as good " + "quality on photographs.\n" + "Fast and Very Fast are considerably faster, and " + "work well for text and line art.\n" + "Hybrid Floyd-Steinberg generally produces " + "inferior output."), + NULL); + + gimp_build_dither_combo (); +} + +static void +gimp_brightness_update (GtkAdjustment *adjustment) +{ + gimp_invalidate_preview_thumbnail (); + if (stp_get_brightness (*pv) != adjustment->value) + { + stp_set_brightness (*pv, adjustment->value); + gimp_update_adjusted_thumbnail (); + } +} + +static void +gimp_contrast_update (GtkAdjustment *adjustment) +{ + gimp_invalidate_preview_thumbnail (); + + if (stp_get_contrast (*pv) != adjustment->value) + { + stp_set_contrast (*pv, adjustment->value); + gimp_update_adjusted_thumbnail (); + } +} + +static void +gimp_cyan_update (GtkAdjustment *adjustment) +{ + gimp_invalidate_preview_thumbnail (); + + if (stp_get_cyan (*pv) != adjustment->value) + { + stp_set_cyan (*pv, adjustment->value); + gimp_update_adjusted_thumbnail (); + } +} + +static void +gimp_magenta_update (GtkAdjustment *adjustment) +{ + gimp_invalidate_preview_thumbnail (); + + if (stp_get_magenta (*pv) != adjustment->value) + { + stp_set_magenta (*pv, adjustment->value); + gimp_update_adjusted_thumbnail (); + } +} + +static void +gimp_yellow_update (GtkAdjustment *adjustment) +{ + gimp_invalidate_preview_thumbnail (); + + if (stp_get_yellow (*pv) != adjustment->value) + { + stp_set_yellow (*pv, adjustment->value); + gimp_update_adjusted_thumbnail (); + } +} + +static void +gimp_saturation_update (GtkAdjustment *adjustment) +{ + gimp_invalidate_preview_thumbnail (); + + if (stp_get_saturation (*pv) != adjustment->value) + { + stp_set_saturation (*pv, adjustment->value); + gimp_update_adjusted_thumbnail (); + } +} + +static void +gimp_density_update (GtkAdjustment *adjustment) +{ + if (stp_get_density (*pv) != adjustment->value) + { + stp_set_density (*pv, adjustment->value); + } +} + +static void +gimp_gamma_update (GtkAdjustment *adjustment) +{ + gimp_invalidate_preview_thumbnail (); + + if (stp_get_gamma (*pv) != adjustment->value) + { + stp_set_gamma (*pv, adjustment->value); + gimp_update_adjusted_thumbnail (); + } +} + +static void +gimp_set_adjustment_active (GtkObject *adj, + gboolean active) +{ + gtk_widget_set_sensitive (GTK_WIDGET (GIMP_SCALE_ENTRY_LABEL (adj)), active); + gtk_widget_set_sensitive (GTK_WIDGET (GIMP_SCALE_ENTRY_SCALE (adj)), active); + gtk_widget_set_sensitive (GTK_WIDGET (GIMP_SCALE_ENTRY_SPINBUTTON (adj)), + active); +} + +void +gimp_set_color_sliders_active (gboolean active) +{ + gimp_set_adjustment_active (cyan_adjustment, active); + gimp_set_adjustment_active (magenta_adjustment, active); + gimp_set_adjustment_active (yellow_adjustment, active); + gimp_set_adjustment_active (saturation_adjustment, active); +} + +void +gimp_do_color_updates (void) +{ + gtk_adjustment_set_value (GTK_ADJUSTMENT (brightness_adjustment), + stp_get_brightness (*pv)); + + gtk_adjustment_set_value (GTK_ADJUSTMENT (gamma_adjustment), + stp_get_gamma (*pv)); + + gtk_adjustment_set_value (GTK_ADJUSTMENT (contrast_adjustment), + stp_get_contrast (*pv)); + + gtk_adjustment_set_value (GTK_ADJUSTMENT (cyan_adjustment), + stp_get_cyan (*pv)); + + gtk_adjustment_set_value (GTK_ADJUSTMENT (magenta_adjustment), + stp_get_magenta (*pv)); + + gtk_adjustment_set_value (GTK_ADJUSTMENT (yellow_adjustment), + stp_get_yellow (*pv)); + + gtk_adjustment_set_value (GTK_ADJUSTMENT (saturation_adjustment), + stp_get_saturation (*pv)); + + gtk_adjustment_set_value (GTK_ADJUSTMENT (density_adjustment), + stp_get_density (*pv)); + + gimp_update_adjusted_thumbnail (); +} + +void +gimp_set_color_defaults (void) +{ + const stp_vars_t defvars = stp_default_settings (); + + stp_set_brightness (*pv, stp_get_brightness (defvars)); + stp_set_gamma (*pv, stp_get_gamma (defvars)); + stp_set_contrast (*pv, stp_get_contrast (defvars)); + stp_set_cyan (*pv, stp_get_cyan (defvars)); + stp_set_magenta (*pv, stp_get_magenta (defvars)); + stp_set_yellow (*pv, stp_get_yellow (defvars)); + stp_set_saturation (*pv, stp_get_saturation (defvars)); + stp_set_density (*pv, stp_get_density (defvars)); + + gimp_do_color_updates (); +} diff --git a/src/gimp/gimp_main_window.c b/src/gimp/gimp_main_window.c new file mode 100644 index 0000000..538f7e3 --- /dev/null +++ b/src/gimp/gimp_main_window.c @@ -0,0 +1,3314 @@ +/* + * "$Id: gimp_main_window.c,v 1.54 2001/10/15 23:45:37 rlk Exp $" + * + * Main window code for Print plug-in for the GIMP. + * + * Copyright 1997-2000 Michael Sweet (mike@easysw.com), + * Robert Krawitz (rlk@alum.mit.edu), Steve Miller (smiller@rni.net) + * and Michael Natterer (mitch@gimp.org) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include "../../lib/libprintut.h" + +#define MAX_PREVIEW_PPI (40) + +#include "print_gimp.h" + +#include "print-intl.h" +#include + +/* + * Constants for GUI. + */ +#define PREVIEW_SIZE_VERT 360 +#define PREVIEW_SIZE_HORIZ 260 +#define MOVE_CONSTRAIN 0 +#define MOVE_HORIZONTAL 1 +#define MOVE_VERTICAL 2 +#define MOVE_ANY (MOVE_HORIZONTAL | MOVE_VERTICAL) + +/* + * Main window widgets + */ + +static GtkWidget *main_vbox; +static GtkWidget *main_hbox; +static GtkWidget *right_vbox; +static GtkWidget *notebook; + +static GtkWidget *print_dialog; /* Print dialog window */ +static GtkWidget *recenter_button; +static GtkWidget *recenter_vertical_button; +static GtkWidget *recenter_horizontal_button; +static GtkWidget *left_entry; +static GtkWidget *right_entry; +static GtkWidget *right_border_entry; +static GtkWidget *width_entry; +static GtkWidget *top_entry; +static GtkWidget *bottom_entry; +static GtkWidget *bottom_border_entry; +static GtkWidget *height_entry; +static GtkWidget *unit_inch; +static GtkWidget *unit_cm; +static GtkWidget *media_size_combo = NULL; /* Media size combo box */ +static GtkWidget *custom_size_width = NULL; +static GtkWidget *custom_size_height = NULL; +static gint media_size_callback_id = -1; +static GtkWidget *media_type_combo = NULL; /* Media type combo box */ +static gint media_type_callback_id = -1; /* Media type calback ID */ +static GtkWidget *media_source_combo = NULL; /* Media source combo box */ +static gint media_source_callback_id = -1; /* Media source calback ID */ +static GtkWidget *ink_type_combo = NULL; /* Ink type combo box */ +static gint ink_type_callback_id = -1; /* Ink type calback ID */ +static GtkWidget *resolution_combo = NULL; /* Resolution combo box */ +static gint resolution_callback_id = -1; /* Resolution calback ID */ +static GtkWidget *orientation_menu = NULL; /* Orientation menu */ +static GtkWidget *scaling_percent; /* Scale by percent */ +static GtkWidget *scaling_ppi; /* Scale by pixels-per-inch */ +static GtkWidget *scaling_image; /* Scale to the image */ +static GtkWidget *output_gray; /* Output type toggle, black */ +static GtkWidget *output_color; /* Output type toggle, color */ +static GtkWidget *output_monochrome; +static GtkWidget *image_line_art; +static GtkWidget *image_solid_tone; +static GtkWidget *image_continuous_tone; +static GtkWidget *setup_dialog; /* Setup dialog window */ +static GtkWidget *printer_driver; /* Printer driver widget */ +static GtkWidget *printer_model_label; /* Printer model name */ +static GtkWidget *printer_crawler; /* Scrolled Window for menu */ +static GtkWidget *printer_combo; /* Combo for menu */ +static gint plist_callback_id = -1; +static GtkWidget *ppd_file; /* PPD file entry */ +static GtkWidget *ppd_label; /* PPD file entry */ +static GtkWidget *ppd_button; /* PPD file browse button */ +static GtkWidget *output_cmd; /* Output command text entry */ +static GtkWidget *ppd_browser; /* File selection dialog for PPD files */ +static GtkWidget *new_printer_dialog; /* New printer dialog window */ +static GtkWidget *new_printer_entry; /* New printer text entry */ + +static GtkWidget *file_browser; /* FSD for print files */ +static GtkWidget *adjust_color_button; +static GtkWidget *about_dialog; + +static GtkObject *scaling_adjustment; /* Adjustment object for scaling */ +static gboolean suppress_scaling_adjustment = FALSE; +static gboolean suppress_scaling_callback = FALSE; + +static gint suppress_preview_update = 0; + +static gint preview_valid = 0; +static gint frame_valid = 0; +static gint need_exposure = 0; + +static GtkDrawingArea *preview = NULL; /* Preview drawing area widget */ +static gint mouse_x; /* Last mouse X */ +static gint mouse_y; /* Last mouse Y */ +static gint old_top; /* Previous position */ +static gint old_left; /* Previous position */ +static gint buttons_pressed = 0; +static gint preview_active = 0; +static gint buttons_mask = 0; +static gint move_constraint = 0; +static gint mouse_button = -1; /* Button being dragged with */ +static gint suppress_preview_reset = 0; + +static gint printable_left; /* Left pixel column of page */ +static gint printable_top; /* Top pixel row of page */ +static gint printable_width; /* Width of page on screen */ +static gint printable_height; /* Height of page on screen */ +static gint print_width; /* Printed width of image */ +static gint print_height; /* Printed height of image */ +static gint left, right; /* Imageable area */ +static gint top, bottom; +static gint paper_width, paper_height; /* Physical width */ + +static gint num_media_sizes = 0; +static stp_param_t *media_sizes; +static gint num_media_types = 0; /* Number of media types */ +static stp_param_t *media_types; /* Media type strings */ +static gint num_media_sources = 0; /* Number of media sources */ +static stp_param_t *media_sources; /* Media source strings */ +static gint num_ink_types = 0; /* Number of ink types */ +static stp_param_t *ink_types; /* Ink type strings */ +static gint num_resolutions = 0; /* Number of resolutions */ +static stp_param_t *resolutions; /* Resolution strings */ + +static void gimp_scaling_update (GtkAdjustment *adjustment); +static void gimp_scaling_callback (GtkWidget *widget); +static void gimp_plist_callback (GtkWidget *widget, + gpointer data); +static void gimp_media_size_callback (GtkWidget *widget, + gpointer data); +static void gimp_media_type_callback (GtkWidget *widget, + gpointer data); +static void gimp_media_source_callback (GtkWidget *widget, + gpointer data); +static void gimp_ink_type_callback (GtkWidget *widget, + gpointer data); +static void gimp_resolution_callback (GtkWidget *widget, + gpointer data); +static void gimp_output_type_callback (GtkWidget *widget, + gpointer data); +static void gimp_unit_callback (GtkWidget *widget, + gpointer data); +static void gimp_orientation_callback (GtkWidget *widget, + gpointer data); +static void gimp_printandsave_callback (void); +static void gimp_about_callback (void); +static void gimp_print_callback (void); +static void gimp_save_callback (void); + +static void gimp_setup_update (void); +static void gimp_setup_open_callback (void); +static void gimp_setup_ok_callback (void); +static void gimp_new_printer_open_callback (void); +static void gimp_new_printer_ok_callback (void); +static void gimp_ppd_browse_callback (void); +static void gimp_ppd_ok_callback (void); +static void gimp_print_driver_callback (GtkWidget *widget, + gint row, + gint column, + GdkEventButton *event, + gpointer data); + +static void gimp_file_ok_callback (void); +static void gimp_file_cancel_callback (void); + +static void gimp_preview_update (void); +static void gimp_preview_expose (void); +static void gimp_preview_button_callback (GtkWidget *widget, + GdkEventButton *bevent, + gpointer data); +static void gimp_preview_motion_callback (GtkWidget *widget, + GdkEventMotion *mevent, + gpointer data); +static void gimp_position_callback (GtkWidget *widget); +static void gimp_image_type_callback (GtkWidget *widget, + gpointer data); + +static gdouble preview_ppi = 10; +stp_vars_t *pv; + +#define Combo_get_text(combo) \ + (gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry))) + +void +set_adjustment_tooltip (GtkObject *adj, + const gchar *tip, + const gchar *private) +{ + gimp_help_set_help_data (GTK_WIDGET (GIMP_SCALE_ENTRY_SCALE (adj)), + tip, private); + gimp_help_set_help_data (GTK_WIDGET (GIMP_SCALE_ENTRY_SPINBUTTON (adj)), + tip, private); +} + +static const char * +Combo_get_name(GtkWidget *combo, + gint num_options, + stp_param_t *options) +{ + gchar *text; + gint i; + + if ((text = Combo_get_text(combo)) == NULL) + return (NULL); + + if (num_options == 0) + return ((const char *)text); + + for (i = 0; i < num_options; i ++) + if (strcasecmp(options[i].text, text) == 0) + return (options[i].name); + + return (NULL); +} + + +static gchar * +c_strdup(const gchar *s) +{ + gchar *ret = xmalloc(strlen(s) + 1); + strcpy(ret, s); + return ret; +} + +static stp_param_t *printer_list = 0; +static int printer_count = 0; + +static void +reset_preview(void) +{ + if (!suppress_preview_reset) + { + gimp_help_enable_tooltips(); + buttons_pressed = preview_active = 0; + } +} + +static void +set_entry_value(GtkWidget *entry, double value, int block) +{ + gchar s[255]; + g_snprintf(s, sizeof(s), "%.2f", value); + if (block) + gtk_signal_handler_block_by_data (GTK_OBJECT (entry), NULL); + gtk_entry_set_text (GTK_ENTRY (entry), s); + if (block) + gtk_signal_handler_unblock_by_data (GTK_OBJECT (entry), NULL); +} + +static void +gimp_build_printer_combo(void) +{ + int i; + if (printer_list) + { + for (i = 0; i < printer_count; i++) + { + free((void *)printer_list[i].name); + free((void *)printer_list[i].text); + } + free(printer_list); + } + printer_list = malloc(sizeof(stp_param_t) * plist_count); + for (i = 0; i < plist_count; i++) + { + if (plist[i].active) + { + printer_list[i].name = c_strdup(plist[i].name); + printer_list[i].text = c_strdup(plist[i].name); + } + else + { + printer_list[i].name = malloc(strlen(plist[i].name) + 2); + printer_list[i].text = malloc(strlen(plist[i].name) + 2); + strcpy((char *)printer_list[i].name + 1, plist[i].name); + ((char *)printer_list[i].name)[0] = '*'; + strcpy((char *)printer_list[i].text + 1, plist[i].name); + ((char *)printer_list[i].text)[0] = '*'; + } + } + printer_count = plist_count; + gimp_plist_build_combo(printer_combo, + printer_count, + printer_list, + printer_list[plist_current].text, + NULL, + gimp_plist_callback, + &plist_callback_id); +} + +static void +create_top_level_structure(void) +{ + gchar *plug_in_name; + /* + * Create the main dialog + */ + + plug_in_name = g_strdup_printf (_("%s -- Print v%s"), + image_filename, PLUG_IN_VERSION); + + print_dialog = + gimp_dialog_new (plug_in_name, "print", + gimp_standard_help_func, "filters/print.html", + GTK_WIN_POS_MOUSE, + FALSE, TRUE, FALSE, + + _("About"), gimp_about_callback, + NULL, NULL, NULL, FALSE, FALSE, + _("Print and\nSave Settings"), gimp_printandsave_callback, + NULL, NULL, NULL, FALSE, FALSE, + _("Save\nSettings"), gimp_save_callback, + NULL, NULL, NULL, FALSE, FALSE, + _("Print"), gimp_print_callback, + NULL, NULL, NULL, FALSE, FALSE, + _("Cancel"), gtk_widget_destroy, + NULL, 1, NULL, FALSE, TRUE, + + NULL); + + g_free (plug_in_name); + + gtk_signal_connect (GTK_OBJECT (print_dialog), "destroy", + GTK_SIGNAL_FUNC (gtk_main_quit), NULL); + + /* + * Top-level containers + */ + + main_vbox = gtk_vbox_new (FALSE, 2); + gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 6); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (print_dialog)->vbox), main_vbox, + FALSE, FALSE, 0); + gtk_widget_show (main_vbox); + + main_hbox = gtk_hbox_new (FALSE, 4); + gtk_box_pack_start (GTK_BOX (main_vbox), main_hbox, FALSE, FALSE, 0); + gtk_widget_show (main_hbox); + + right_vbox = gtk_vbox_new (FALSE, 2); + gtk_box_pack_end (GTK_BOX (main_hbox), right_vbox, TRUE, TRUE, 0); + gtk_widget_show (right_vbox); + + notebook = gtk_notebook_new (); + gtk_box_pack_start (GTK_BOX (right_vbox), notebook, FALSE, FALSE, 0); + gtk_widget_show (notebook); +} + +static void +create_preview (void) +{ + GtkWidget *frame; + GtkWidget *event_box; + + frame = gtk_frame_new (_("Preview")); + gtk_box_pack_start (GTK_BOX (main_hbox), frame, FALSE, FALSE, 0); + gtk_widget_show (frame); + + preview = (GtkDrawingArea *) gtk_drawing_area_new (); + gtk_drawing_area_size (preview, PREVIEW_SIZE_HORIZ + 1, + PREVIEW_SIZE_VERT + 1); + event_box = gtk_event_box_new (); + gtk_container_add (GTK_CONTAINER (event_box), GTK_WIDGET (preview)); + gtk_container_add (GTK_CONTAINER (frame), event_box); + gtk_widget_show (event_box); + + gtk_signal_connect (GTK_OBJECT (preview), "expose_event", + GTK_SIGNAL_FUNC (gimp_preview_expose), NULL); + gtk_signal_connect (GTK_OBJECT (preview), "button_press_event", + GTK_SIGNAL_FUNC (gimp_preview_button_callback), NULL); + gtk_signal_connect (GTK_OBJECT (preview), "button_release_event", + GTK_SIGNAL_FUNC (gimp_preview_button_callback), NULL); + gtk_signal_connect (GTK_OBJECT (preview), "motion_notify_event", + GTK_SIGNAL_FUNC (gimp_preview_motion_callback), NULL); + gtk_widget_show (GTK_WIDGET (preview)); + + gimp_help_set_help_data + (event_box, + _("Position the image on the page.\n" + "Click and drag with the primary button to position the image.\n" + "Click and drag with the second button to move the image with finer precision; " + "each unit of motion moves the image one point (1/72\")\n" + "Click and drag with the third (middle) button to move the image in units of " + "the image size.\n" + "Holding down the shift key while clicking and dragging constrains the image to " + "only horizontal or vertical motion.\n" + "If you click another button while dragging the mouse, the image will return " + "to its original position."), + NULL); + + gtk_widget_set_events (GTK_WIDGET (preview), + GDK_EXPOSURE_MASK | + GDK_BUTTON_MOTION_MASK | + GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK); +} + +static void +create_positioning_frame (void) +{ + GtkWidget *frame; + GtkWidget *table; + GtkWidget *box; + GtkWidget *sep; + + frame = gtk_frame_new (_("Position")); + gtk_box_pack_start (GTK_BOX (right_vbox), frame, TRUE, TRUE, 0); + gtk_widget_show (frame); + + table = gtk_table_new (7, 4, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 2); + gtk_table_set_col_spacing (GTK_TABLE (table), 1, 4); + gtk_table_set_row_spacings (GTK_TABLE (table), 2); + gtk_container_set_border_width (GTK_CONTAINER (table), 4); + gtk_container_add (GTK_CONTAINER (frame), table); + gtk_widget_show (table); + + /* + * Orientation option menu. + */ + + orientation_menu = + gimp_option_menu_new (FALSE, + _("Auto"), gimp_orientation_callback, + (gpointer) ORIENT_AUTO, NULL, NULL, 0, + _("Portrait"), gimp_orientation_callback, + (gpointer) ORIENT_PORTRAIT, NULL, NULL, 0, + _("Landscape"), gimp_orientation_callback, + (gpointer) ORIENT_LANDSCAPE, NULL, NULL, 0, + _("Upside down"), gimp_orientation_callback, + (gpointer) ORIENT_UPSIDEDOWN, NULL, NULL, 0, + _("Seascape"), gimp_orientation_callback, + (gpointer) ORIENT_SEASCAPE, NULL, NULL, 0, + NULL); + gimp_help_set_help_data (orientation_menu, + _("Select the orientation: portrait, landscape, " + "upside down, or seascape (upside down " + "landscape)"), + NULL); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 0, + _("Orientation:"), 1.0, 0.5, + orientation_menu, 3, TRUE); + + sep = gtk_hseparator_new (); + gtk_table_attach_defaults (GTK_TABLE (table), sep, 0, 4, 1, 2); + gtk_widget_show (sep); + + /* + * Position entries + */ + + left_entry = gtk_entry_new (); + gtk_widget_set_usize (left_entry, 60, 0); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 2, + _("Left:"), 1.0, 0.5, + left_entry, 1, TRUE); + + gimp_help_set_help_data (left_entry, + _("Distance from the left of the paper to the image"), + NULL); + gtk_signal_connect (GTK_OBJECT (left_entry), "activate", + GTK_SIGNAL_FUNC (gimp_position_callback), + NULL); + + top_entry = gtk_entry_new (); + gtk_widget_set_usize (top_entry, 60, 0); + gimp_table_attach_aligned (GTK_TABLE (table), 2, 2, + _("Top:"), 1.0, + 0.5, top_entry, 1, TRUE); + + gimp_help_set_help_data (top_entry, + _("Distance from the top of the paper to the image"), + NULL); + gtk_signal_connect (GTK_OBJECT (top_entry), "activate", + GTK_SIGNAL_FUNC (gimp_position_callback), + NULL); + + right_entry = gtk_entry_new (); + gtk_widget_set_usize (right_entry, 60, 0); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 3, + _("Right:"), 1.0, 0.5, + right_entry, 1, TRUE); + + gimp_help_set_help_data (right_entry, + _("Distance from the left of the paper to " + "the right of the image"), + NULL); + gtk_signal_connect (GTK_OBJECT (right_entry), "activate", + GTK_SIGNAL_FUNC (gimp_position_callback), + NULL); + + right_border_entry = gtk_entry_new (); + gtk_widget_set_usize (right_border_entry, 60, 0); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 4, + _("Right Border:"), 1.0, 0.5, + right_border_entry, 1, TRUE); + + gimp_help_set_help_data (right_border_entry, + _("Distance from the right of the paper to " + "the image"), + NULL); + gtk_signal_connect (GTK_OBJECT (right_border_entry), "activate", + GTK_SIGNAL_FUNC (gimp_position_callback), + NULL); + + bottom_entry = gtk_entry_new (); + gtk_widget_set_usize (bottom_entry, 60, 0); + gimp_table_attach_aligned (GTK_TABLE (table), 2, 3, + _("Bottom:"), 1.0, 0.5, + bottom_entry, 1, TRUE); + + gimp_help_set_help_data (bottom_entry, + _("Distance from the top of the paper to " + "the bottom of the image"), + NULL); + gtk_signal_connect (GTK_OBJECT (bottom_entry), "activate", + GTK_SIGNAL_FUNC (gimp_position_callback), + NULL); + + bottom_border_entry = gtk_entry_new (); + gtk_widget_set_usize (bottom_border_entry, 60, 0); + gimp_table_attach_aligned (GTK_TABLE (table), 2, 4, + _("Bottom Border:"), 1.0, 0.5, + bottom_border_entry, 1, TRUE); + + gimp_help_set_help_data (bottom_border_entry, + _("Distance from the bottom of the paper to " + "the image"), + NULL); + gtk_signal_connect (GTK_OBJECT (bottom_border_entry), "activate", + GTK_SIGNAL_FUNC (gimp_position_callback), + NULL); + + sep = gtk_hseparator_new (); + gtk_table_attach_defaults (GTK_TABLE (table), sep, 0, 4, 5, 6); + gtk_widget_show (sep); + + /* + * Center options + */ + + box = gtk_hbox_new (TRUE, 4); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 6, + _("Center:"), 1.0, 0.5, + box, 3, FALSE); + + recenter_vertical_button = + gtk_button_new_with_label (_("Vertically")); + gtk_box_pack_start (GTK_BOX (box), recenter_vertical_button, FALSE, TRUE, 0); + gtk_widget_show (recenter_vertical_button); + + gimp_help_set_help_data (recenter_vertical_button, + _("Center the image vertically on the paper"), + NULL); + gtk_signal_connect (GTK_OBJECT (recenter_vertical_button), "clicked", + GTK_SIGNAL_FUNC (gimp_position_callback), + NULL); + + recenter_button = gtk_button_new_with_label (_("Both")); + gtk_box_pack_start (GTK_BOX (box), recenter_button, FALSE, TRUE, 0); + gtk_widget_show (recenter_button); + + gimp_help_set_help_data (recenter_button, + _("Center the image on the paper"), + NULL); + gtk_signal_connect (GTK_OBJECT (recenter_button), "clicked", + GTK_SIGNAL_FUNC (gimp_position_callback), + NULL); + + recenter_horizontal_button = + gtk_button_new_with_label (_("Horizontally")); + gtk_box_pack_start (GTK_BOX (box), recenter_horizontal_button, FALSE, TRUE, 0); + gtk_widget_show (recenter_horizontal_button); + + gimp_help_set_help_data (recenter_horizontal_button, + _("Center the image horizontally on the paper"), + NULL); + gtk_signal_connect (GTK_OBJECT (recenter_horizontal_button), "clicked", + GTK_SIGNAL_FUNC (gimp_position_callback), + NULL); +} + +static void +create_printer_dialog (void) +{ + GtkWidget *table; + GtkWidget *box; + GtkWidget *label; + GtkWidget *event_box; + gint i; + + setup_dialog = gimp_dialog_new (_("Setup Printer"), "print", + gimp_standard_help_func, "filters/print.html", + GTK_WIN_POS_MOUSE, FALSE, TRUE, FALSE, + + _("OK"), gimp_setup_ok_callback, + NULL, NULL, NULL, TRUE, FALSE, + _("Cancel"), gtk_widget_hide, + NULL, 1, NULL, FALSE, TRUE, + + NULL); + + /* + * Top-level table for dialog. + */ + + table = gtk_table_new (5, 2, FALSE); + gtk_container_set_border_width (GTK_CONTAINER (table), 6); + gtk_table_set_col_spacings (GTK_TABLE (table), 4); + gtk_table_set_row_spacings (GTK_TABLE (table), 8); + gtk_table_set_row_spacing (GTK_TABLE (table), 0, 100); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (setup_dialog)->vbox), table, + FALSE, FALSE, 0); + gtk_widget_show (table); + + /* + * Printer driver option menu. + */ + + label = gtk_label_new (_("Printer Model:")); + gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 2, + GTK_FILL, GTK_FILL, 0, 0); + gtk_widget_show (label); + + event_box = gtk_event_box_new (); + gtk_table_attach (GTK_TABLE (table), event_box, 1, 3, 0, 2, + GTK_FILL, GTK_FILL, 0, 0); + gtk_widget_show (event_box); + + gimp_help_set_help_data (event_box, + _("Select your printer model"), + NULL); + + printer_crawler = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (printer_crawler), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (event_box), printer_crawler); + gtk_widget_show (printer_crawler); + + printer_driver = gtk_clist_new (1); + gtk_widget_set_usize (printer_driver, 200, 0); + gtk_clist_set_selection_mode (GTK_CLIST (printer_driver), + GTK_SELECTION_SINGLE); + gtk_container_add (GTK_CONTAINER (printer_crawler), printer_driver); + gtk_widget_show (printer_driver); + + gtk_signal_connect (GTK_OBJECT (printer_driver), "select_row", + GTK_SIGNAL_FUNC (gimp_print_driver_callback), + NULL); + + for (i = 0; i < stp_known_printers (); i ++) + { + stp_printer_t the_printer = stp_get_printer_by_index (i); + + if (strcmp (stp_printer_get_long_name (the_printer), "") != 0) + { + gchar *tmp = + c_strdup (gettext (stp_printer_get_long_name (the_printer))); + + gtk_clist_insert (GTK_CLIST (printer_driver), i, &tmp); + gtk_clist_set_row_data (GTK_CLIST (printer_driver), i, (gpointer) i); + } + } + + /* + * PPD file. + */ + + ppd_label = gtk_label_new (_("PPD File:")); + gtk_misc_set_alignment (GTK_MISC (ppd_label), 1.0, 0.5); + gtk_table_attach (GTK_TABLE (table), ppd_label, 0, 1, 3, 4, + GTK_FILL, GTK_FILL, 0, 0); + gtk_widget_show (ppd_label); + + box = gtk_hbox_new (FALSE, 8); + gtk_table_attach (GTK_TABLE (table), box, 1, 2, 3, 4, + GTK_FILL, GTK_FILL, 0, 0); + gtk_widget_show (box); + + ppd_file = gtk_entry_new (); + gtk_box_pack_start (GTK_BOX (box), ppd_file, TRUE, TRUE, 0); + gtk_widget_show (ppd_file); + + gimp_help_set_help_data (ppd_file, + _("Enter the correct PPD filename for your printer"), + NULL); + + ppd_button = gtk_button_new_with_label (_("Browse")); + gtk_misc_set_padding (GTK_MISC (GTK_BIN (ppd_button)->child), 2, 0); + gtk_box_pack_start (GTK_BOX (box), ppd_button, FALSE, FALSE, 0); + gtk_widget_show (ppd_button); + + gimp_help_set_help_data (ppd_button, + _("Choose the correct PPD filename for your printer"), + NULL); + gtk_signal_connect (GTK_OBJECT (ppd_button), "clicked", + GTK_SIGNAL_FUNC (gimp_ppd_browse_callback), + NULL); + + /* + * Print command. + */ + + label = gtk_label_new (_("Command:")); + gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, + GTK_FILL, GTK_FILL, 0, 0); + gtk_widget_show (label); + + output_cmd = gtk_entry_new (); + gtk_table_attach (GTK_TABLE (table), output_cmd, 1, 2, 2, 3, + GTK_FILL, GTK_FILL, 0, 0); + gtk_widget_show (output_cmd); + + gimp_help_set_help_data + (output_cmd, + _("Enter the correct command to print to your printer. " + "Note: Please do not remove the `-l' or `-oraw' from " + "the command string, or printing will probably fail!"), + NULL); + + /* + * Output file selection dialog. + */ + + file_browser = gtk_file_selection_new (_("Print To File?")); + + gtk_signal_connect + (GTK_OBJECT (GTK_FILE_SELECTION (file_browser)->ok_button), "clicked", + GTK_SIGNAL_FUNC (gimp_file_ok_callback), + NULL); + gtk_signal_connect + (GTK_OBJECT (GTK_FILE_SELECTION (file_browser)->cancel_button), "clicked", + GTK_SIGNAL_FUNC (gimp_file_cancel_callback), + NULL); + + /* + * PPD file selection dialog. + */ + + ppd_browser = gtk_file_selection_new (_("PPD File?")); + gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (ppd_browser)); + + gtk_signal_connect + (GTK_OBJECT (GTK_FILE_SELECTION (ppd_browser)->ok_button), "clicked", + GTK_SIGNAL_FUNC (gimp_ppd_ok_callback), + NULL); + gtk_signal_connect_object + (GTK_OBJECT (GTK_FILE_SELECTION (ppd_browser)->cancel_button), "clicked", + GTK_SIGNAL_FUNC (gtk_widget_hide), + GTK_OBJECT (ppd_browser)); +} + +static void +create_new_printer_dialog (void) +{ + GtkWidget *table; + + new_printer_dialog = + gimp_dialog_new (_("Define New Printer"), "print", + gimp_standard_help_func, "filters/print.html", + GTK_WIN_POS_MOUSE, FALSE, TRUE, FALSE, + + _("OK"), gimp_new_printer_ok_callback, + NULL, NULL, NULL, TRUE, FALSE, + _("Cancel"), gtk_widget_hide, + NULL, 1, NULL, FALSE, TRUE, + + NULL); + + table = gtk_table_new (1, 2, FALSE); + gtk_container_set_border_width (GTK_CONTAINER (table), 6); + gtk_table_set_col_spacings (GTK_TABLE (table), 4); + gtk_table_set_row_spacings (GTK_TABLE (table), 8); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (new_printer_dialog)->vbox), table, + FALSE, FALSE, 0); + gtk_widget_show (table); + + new_printer_entry = gtk_entry_new (); + gtk_entry_set_max_length (GTK_ENTRY (new_printer_entry), 127); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 0, _("Printer Name:"), 1.0, + 0.5, new_printer_entry, 1, TRUE); + + gimp_help_set_help_data (new_printer_entry, + _("Enter the name you wish to give this logical printer"), + NULL); + gtk_signal_connect (GTK_OBJECT (new_printer_entry), "activate", + GTK_SIGNAL_FUNC (gimp_new_printer_ok_callback), + NULL); +} + +static void +create_about_dialog (void) +{ + GtkWidget *label; + about_dialog = + gimp_dialog_new (_("About Gimp-Print " PLUG_IN_VERSION), "print", + gimp_standard_help_func, "filters/print.html", + GTK_WIN_POS_MOUSE, FALSE, TRUE, FALSE, + + _("OK"), gtk_widget_hide, + NULL, 1, NULL, TRUE, TRUE, + + NULL); + + label = gtk_label_new + (_("Gimp-Print Version " PLUG_IN_VERSION "\n" + "\n" + "Copyright (C) 1997-2001 Michael Sweet, Robert Krawitz,\n" + "and the rest of the Gimp-Print Development Team.\n" + "\n" + "Please visit our web site at http://gimp-print.sourceforge.net.\n" + "\n" + "This program is free software; you can redistribute it and/or modify\n" + "it under the terms of the GNU General Public License as published by\n" + "the Free Software Foundation; either version 2 of the License, or\n" + "(at your option) any later version.\n" + "\n" + "This program is distributed in the hope that it will be useful,\n" + "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + "GNU General Public License for more details.\n" + "\n" + "You should have received a copy of the GNU General Public License\n" + "along with this program; if not, write to the Free Software\n" + "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 " + "USA\n")); + + gtk_misc_set_padding (GTK_MISC (label), 12, 4); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (about_dialog)->vbox), label, + FALSE, FALSE, 0); + gtk_widget_show (label); +} + +static void +create_printer_settings_frame (void) +{ + GtkWidget *table; + GtkWidget *printer_hbox; + GtkWidget *media_size_hbox; + GtkWidget *button; + GtkWidget *label; + GtkWidget *event_box; + + create_printer_dialog (); + create_about_dialog (); + create_new_printer_dialog (); + + table = gtk_table_new (9, 2, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 2); + gtk_table_set_row_spacings (GTK_TABLE (table), 2); + gtk_container_set_border_width (GTK_CONTAINER (table), 4); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), + table, + gtk_label_new (_("Printer Settings"))); + gtk_widget_show (table); + + /* + * Printer option menu. + */ + + printer_combo = gtk_combo_new (); + event_box = gtk_event_box_new (); + gtk_container_add (GTK_CONTAINER (event_box), printer_combo); + gtk_widget_show (printer_combo); + + gimp_help_set_help_data (event_box, + _("Select the name of the printer (not the type, " + "or model, of printer) that you wish to print to"), + NULL); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 0, + _("Printer Name:"), 1.0, 0.5, + event_box, 2, TRUE); + + printer_model_label = gtk_label_new (""); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 1, + _("Printer Model:"), 1.0, 0.5, + printer_model_label, 2, TRUE); + + printer_hbox = gtk_hbox_new (TRUE, 4); + gtk_table_attach_defaults (GTK_TABLE (table), printer_hbox, 1, 2, 2, 3); + gtk_widget_show (printer_hbox); + + /* + * Setup printer button + */ + + button = gtk_button_new_with_label (_("Setup Printer...")); + gimp_help_set_help_data (button, + _("Choose the printer model, PPD file, and command " + "that is used to print to this printer"), + NULL); + gtk_misc_set_padding (GTK_MISC (GTK_BIN (button)->child), 2, 0); + gtk_box_pack_start (GTK_BOX (printer_hbox), button, FALSE, TRUE, 0); + gtk_widget_show (button); + + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (gimp_setup_open_callback), + NULL); + + /* + * New printer button + */ + + button = gtk_button_new_with_label (_("New Printer...")); + gimp_help_set_help_data (button, + _("Define a new logical printer. This can be used to " + "name a collection of settings that you wish to " + "remember for future use."), + NULL); + gtk_box_pack_start (GTK_BOX (printer_hbox), button, FALSE, TRUE, 0); + gtk_widget_show (button); + + gtk_signal_connect (GTK_OBJECT (button), "clicked", + GTK_SIGNAL_FUNC (gimp_new_printer_open_callback), + NULL); + + /* + * Media size combo box. + */ + + media_size_combo = gtk_combo_new (); + event_box = gtk_event_box_new (); + gtk_container_add (GTK_CONTAINER (event_box), media_size_combo); + gtk_widget_show (media_size_combo); + + gimp_help_set_help_data (event_box, + _("Size of paper that you wish to print to"), + NULL); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 3, + _("Media Size:"), 1.0, 0.5, + event_box, 1, TRUE); + + /* + * Custom media size entries + */ + + media_size_hbox = gtk_hbox_new (FALSE, 4); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 4, + _("Dimensions:"), 1.0, 0.5, + media_size_hbox, 2, TRUE); + + label = gtk_label_new (_("Width:")); + gtk_box_pack_start (GTK_BOX (media_size_hbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); + + custom_size_width = gtk_entry_new (); + gtk_widget_set_usize (custom_size_width, 40, 0); + gtk_box_pack_start (GTK_BOX (media_size_hbox), custom_size_width, + FALSE, FALSE, 0); + gtk_widget_show (custom_size_width); + + gimp_help_set_help_data (custom_size_width, + _("Width of the paper that you wish to print to"), + NULL); + gtk_signal_connect (GTK_OBJECT (custom_size_width), "activate", + GTK_SIGNAL_FUNC (gimp_media_size_callback), + NULL); + + label = gtk_label_new (_("Height:")); + gtk_box_pack_start (GTK_BOX (media_size_hbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); + + custom_size_height = gtk_entry_new (); + gtk_widget_set_usize (custom_size_height, 50, 0); + gtk_box_pack_start (GTK_BOX (media_size_hbox), custom_size_height, + FALSE, FALSE, 0); + gtk_widget_show (custom_size_height); + + gimp_help_set_help_data (custom_size_height, + _("Height of the paper that you wish to print to"), + NULL); + gtk_signal_connect (GTK_OBJECT (custom_size_height), "activate", + GTK_SIGNAL_FUNC (gimp_media_size_callback), + NULL); + + /* + * Media type combo box. + */ + + media_type_combo = gtk_combo_new (); + event_box = gtk_event_box_new (); + gtk_container_add (GTK_CONTAINER (event_box), media_type_combo); + gtk_widget_show (media_type_combo); + + gimp_help_set_help_data (event_box, + _("Type of media you're printing to"), + NULL); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 5, + _("Media Type:"), 1.0, 0.5, + event_box, 2, TRUE); + + /* + * Media source combo box. + */ + + media_source_combo = gtk_combo_new (); + event_box = gtk_event_box_new (); + gtk_container_add (GTK_CONTAINER (event_box), media_source_combo); + gtk_widget_show (media_source_combo); + + gimp_help_set_help_data (event_box, + _("Source (input slot) of media you're printing to"), + NULL); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 6, + _("Media Source:"), 1.0, 0.5, + event_box, 2, TRUE); + + /* + * Ink type combo box. + */ + + ink_type_combo = gtk_combo_new (); + event_box = gtk_event_box_new (); + gtk_container_add (GTK_CONTAINER (event_box), ink_type_combo); + gtk_widget_show (ink_type_combo); + + gimp_help_set_help_data (event_box, + _("Type of ink in the printer"), + NULL); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 7, + _("Ink Type:"), 1.0, 0.5, + event_box, 2, TRUE); + + /* + * Resolution combo box. + */ + + resolution_combo = gtk_combo_new (); + event_box = gtk_event_box_new (); + gtk_container_add (GTK_CONTAINER (event_box), resolution_combo); + gtk_widget_show (resolution_combo); + + gimp_help_set_help_data (event_box, + _("Resolution and quality of the print"), + NULL); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 8, + _("Resolution:"), 1.0, 0.5, + event_box, 2, TRUE); +} + +static void +create_scaling_frame (void) +{ + GtkWidget *frame; + GtkWidget *vbox; + GtkWidget *table; + GtkWidget *box; + GtkWidget *label; + GtkWidget *event_box; + GtkWidget *sep; + GSList *group; + + frame = gtk_frame_new (_("Size")); + gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0); + gtk_widget_show (frame); + + vbox = gtk_vbox_new (FALSE, 2); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 4); + gtk_container_add (GTK_CONTAINER (frame), vbox); + gtk_widget_show (vbox); + + table = gtk_table_new (1, 3, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 4); + gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0); + gtk_widget_show (table); + + /* + * Create the scaling adjustment using percent. It doesn't really matter, + * since as soon as we call gimp_plist_callback at the end of initialization + * everything will be put right. + */ + scaling_adjustment = + gimp_scale_entry_new (GTK_TABLE (table), 0, 0, _("Scaling:"), 100, 75, + stp_get_scaling (stp_default_settings ()), + stp_get_scaling (stp_minimum_settings ()), + stp_get_scaling (stp_maximum_settings ()), + 1.0, 10.0, 1, TRUE, 0, 0, NULL, NULL); + set_adjustment_tooltip (scaling_adjustment, + _("Set the scale (size) of the image"), + NULL); + gtk_signal_connect (GTK_OBJECT (scaling_adjustment), "value_changed", + GTK_SIGNAL_FUNC (gimp_scaling_update), + NULL); + + sep = gtk_hseparator_new (); + gtk_box_pack_start (GTK_BOX (vbox), sep, FALSE, FALSE, 0); + gtk_widget_show (sep); + + box = gtk_hbox_new (FALSE, 4); + gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, FALSE, 0); + gtk_widget_show (box); + + /* + * The scale by percent/ppi toggles + */ + + table = gtk_table_new (2, 2, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 4); + gtk_box_pack_start (GTK_BOX (box), table, FALSE, FALSE, 0); + gtk_widget_show (table); + + event_box = gtk_event_box_new (); + gtk_table_attach (GTK_TABLE (table), event_box, 0, 1, 0, 1, + GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0); + gtk_widget_show (event_box); + + label = gtk_label_new ("Scale by:"); + gtk_container_add (GTK_CONTAINER (event_box), label); + gtk_widget_show (label); + + gimp_help_set_help_data (event_box, + _("Select whether scaling is measured as percent of " + "available page size or number of output dots per " + "inch"), + NULL); + + scaling_percent = gtk_radio_button_new_with_label (NULL, _("Percent")); + group = gtk_radio_button_group (GTK_RADIO_BUTTON (scaling_percent)); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 0, + NULL, 0.5, 0.5, + scaling_percent, 1, TRUE); + + gimp_help_set_help_data (scaling_percent, + _("Scale the print to the size of the page"), + NULL); + gtk_signal_connect (GTK_OBJECT (scaling_percent), "toggled", + GTK_SIGNAL_FUNC (gimp_scaling_callback), + NULL); + + scaling_ppi = gtk_radio_button_new_with_label (group, _("PPI")); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 1, + NULL, 0.5, 0.5, + scaling_ppi, 1, TRUE); + + gimp_help_set_help_data (scaling_ppi, + _("Scale the print to the number of dots per inch"), + NULL); + gtk_signal_connect (GTK_OBJECT (scaling_ppi), "toggled", + GTK_SIGNAL_FUNC (gimp_scaling_callback), + NULL); + + sep = gtk_vseparator_new (); + gtk_box_pack_start (GTK_BOX (box), sep, FALSE, FALSE, 8); + gtk_widget_show (sep); + + /* + * The width/height enries + */ + + table = gtk_table_new (2, 2, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 2); + gtk_box_pack_start (GTK_BOX (box), table, FALSE, FALSE, 0); + gtk_widget_show (table); + + width_entry = gtk_entry_new (); + gtk_widget_set_usize (width_entry, 60, 0); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 0, + _("Width:"), 1.0, 0.5, + width_entry, 1, TRUE); + + gimp_help_set_help_data (width_entry, + _("Set the width of the print"), + NULL); + gtk_signal_connect (GTK_OBJECT (width_entry), "activate", + GTK_SIGNAL_FUNC (gimp_position_callback), + NULL); + + height_entry = gtk_entry_new (); + gtk_widget_set_usize (height_entry, 60, 0); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 1, + _("Height:"), 1.0, 0.5, + height_entry, 1, TRUE); + + gimp_help_set_help_data (height_entry, + _("Set the height of the print"), + NULL); + gtk_signal_connect (GTK_OBJECT (height_entry), "activate", + GTK_SIGNAL_FUNC (gimp_position_callback), + NULL); + + /* + * The inch/cm toggles + */ + + table = gtk_table_new (2, 2, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 4); + gtk_box_pack_start (GTK_BOX (box), table, FALSE, FALSE, 0); + gtk_widget_show (table); + + event_box = gtk_event_box_new (); + gtk_table_attach (GTK_TABLE (table), event_box, 0, 1, 0, 1, + GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0); + gtk_widget_show (event_box); + + label = gtk_label_new (_("Units:")); + gtk_container_add (GTK_CONTAINER (event_box), label); + gtk_widget_show (label); + + gimp_help_set_help_data (event_box, + _("Select the base unit of measurement for printing"), + NULL); + + unit_inch = gtk_radio_button_new_with_label (NULL, _("Inch")); + group = gtk_radio_button_group (GTK_RADIO_BUTTON (unit_inch)); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 0, + NULL, 0.5, 0.5, + unit_inch, 1, TRUE); + + gimp_help_set_help_data (unit_inch, + _("Set the base unit of measurement to inches"), + NULL); + gtk_signal_connect (GTK_OBJECT (unit_inch), "toggled", + GTK_SIGNAL_FUNC (gimp_unit_callback), + (gpointer) 0); + + unit_cm = gtk_radio_button_new_with_label (group, _("cm")); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 1, + NULL, 0.5, 0.5, + unit_cm, 1, TRUE); + + gimp_help_set_help_data (unit_cm, + _("Set the base unit of measurement to centimetres"), + NULL); + gtk_signal_connect (GTK_OBJECT (unit_cm), "toggled", + GTK_SIGNAL_FUNC (gimp_unit_callback), + (gpointer) 1); + + /* + * The "image size" button + */ + + scaling_image = gtk_button_new_with_label (_("Use Original\nImage Size")); + gtk_misc_set_padding (GTK_MISC (GTK_BIN (scaling_image)->child), 8, 4); + gtk_box_pack_end (GTK_BOX (box), scaling_image, FALSE, TRUE, 0); + gtk_widget_show (scaling_image); + + gimp_help_set_help_data (scaling_image, + _("Set the print size to the size of the image"), + NULL); + gtk_signal_connect (GTK_OBJECT (scaling_image), "clicked", + GTK_SIGNAL_FUNC (gimp_scaling_callback), + NULL); + +} + +static void +create_image_settings_frame (void) +{ + GtkWidget *vbox; + GtkWidget *table; + GtkWidget *label; + GtkWidget *event_box; + GtkWidget *sep; + GSList *group; + + gimp_create_color_adjust_window (); + + vbox = gtk_vbox_new (FALSE, 4); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 4); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), + vbox, + gtk_label_new (_("Image / Output Settings"))); + gtk_widget_show (vbox); + + table = gtk_table_new (3, 2, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 4); + gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0); + gtk_widget_show (table); + + event_box = gtk_event_box_new (); + gtk_table_attach (GTK_TABLE (table), event_box, 0, 1, 0, 1, + GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0); + gtk_widget_show (event_box); + + label = gtk_label_new (_("Image Type:")); + gtk_container_add (GTK_CONTAINER (event_box), label); + gtk_widget_show (label); + + gimp_help_set_help_data (event_box, + _("Optimize the output for the type of image " + "being printed"), + NULL); + + image_line_art = gtk_radio_button_new_with_label (NULL, _("Line Art")); + group = gtk_radio_button_group (GTK_RADIO_BUTTON (image_line_art)); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 0, + NULL, 0.5, 0.5, + image_line_art, 1, FALSE); + + gimp_help_set_help_data (image_line_art, + _("Fastest and brightest color for text and " + "line art"), + NULL); + gtk_signal_connect (GTK_OBJECT (image_line_art), "toggled", + GTK_SIGNAL_FUNC (gimp_image_type_callback), + (gpointer) IMAGE_LINE_ART); + + image_solid_tone = gtk_radio_button_new_with_label (group, _("Solid Colors")); + group = gtk_radio_button_group (GTK_RADIO_BUTTON (image_solid_tone)); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 1, + NULL, 0.5, 0.5, + image_solid_tone, 1, FALSE); + + gimp_help_set_help_data (image_solid_tone, + _("Best for images dominated by regions of " + "solid color"), + NULL); + gtk_signal_connect (GTK_OBJECT (image_solid_tone), "toggled", + GTK_SIGNAL_FUNC (gimp_image_type_callback), + (gpointer) IMAGE_SOLID_TONE); + + image_continuous_tone = gtk_radio_button_new_with_label (group, + _("Photograph")); + group = gtk_radio_button_group (GTK_RADIO_BUTTON (image_continuous_tone)); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 2, + NULL, 0.5, 0.5, + image_continuous_tone, 1, FALSE); + gtk_widget_show (image_continuous_tone); + + gimp_help_set_help_data (image_continuous_tone, + _("Slowest, but most accurate and smoothest color " + "for continuous tone images and photographs"), + NULL); + gtk_signal_connect (GTK_OBJECT (image_continuous_tone), "toggled", + GTK_SIGNAL_FUNC (gimp_image_type_callback), + (gpointer) IMAGE_CONTINUOUS); + + sep = gtk_hseparator_new (); + gtk_box_pack_start (GTK_BOX (vbox), sep, FALSE, FALSE, 0); + gtk_widget_show (sep); + + /* + * Output type toggles. + */ + + table = gtk_table_new (4, 2, FALSE); + gtk_table_set_col_spacings (GTK_TABLE (table), 4); + gtk_table_set_row_spacing (GTK_TABLE (table), 2, 4); + gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0); + gtk_widget_show (table); + + event_box = gtk_event_box_new (); + gtk_table_attach (GTK_TABLE (table), event_box, 0, 1, 0, 1, + GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0); + gtk_widget_show (event_box); + + label = gtk_label_new (_("Output Type:")); + gtk_container_add (GTK_CONTAINER (event_box), label); + gtk_widget_show (label); + + gimp_help_set_help_data (event_box, + _("Select the desired output type"), + NULL); + + output_color = gtk_radio_button_new_with_label (NULL, _("Color")); + group = gtk_radio_button_group (GTK_RADIO_BUTTON (output_color)); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 0, + NULL, 0.5, 0.5, + output_color, 1, FALSE); + + gimp_help_set_help_data (output_color, _("Color output"), NULL); + gtk_signal_connect (GTK_OBJECT (output_color), "toggled", + GTK_SIGNAL_FUNC (gimp_output_type_callback), + (gpointer) OUTPUT_COLOR); + + output_gray = gtk_radio_button_new_with_label (group, _("Grayscale")); + group = gtk_radio_button_group (GTK_RADIO_BUTTON (output_gray)); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 1, + NULL, 0.5, 0.5, + output_gray, 1, FALSE); + + gimp_help_set_help_data (output_gray, + _("Print in shades of gray using black ink"), + NULL); + gtk_signal_connect (GTK_OBJECT (output_gray), "toggled", + GTK_SIGNAL_FUNC (gimp_output_type_callback), + (gpointer) OUTPUT_GRAY); + + output_monochrome = gtk_radio_button_new_with_label (group, + _("Black and White")); + group = gtk_radio_button_group (GTK_RADIO_BUTTON (output_monochrome)); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 2, + NULL, 0.5, 0.5, + output_monochrome, 1, FALSE); + + gimp_help_set_help_data (output_monochrome, + _("Print in black and white (no color, and no shades " + "of gray)"), + NULL); + gtk_signal_connect (GTK_OBJECT (output_monochrome), "toggled", + GTK_SIGNAL_FUNC (gimp_output_type_callback), + (gpointer) OUTPUT_MONOCHROME); + + /* + * Color adjust button + */ + + adjust_color_button = gtk_button_new_with_label (_("Adjust Output...")); + gtk_misc_set_padding (GTK_MISC (GTK_BIN (adjust_color_button)->child), 4, 0); + gimp_table_attach_aligned (GTK_TABLE (table), 0, 3, + NULL, 0.5, 0.5, + adjust_color_button, 1, TRUE); + + gimp_help_set_help_data (adjust_color_button, + _("Adjust color balance, brightness, contrast, " + "saturation, and dither algorithm"), + NULL); + gtk_signal_connect_object (GTK_OBJECT (adjust_color_button), "clicked", + GTK_SIGNAL_FUNC (gtk_widget_show), + GTK_OBJECT (gimp_color_adjust_dialog)); +} + +/* + * gimp_create_main_window() + */ +void +gimp_create_main_window (void) +{ + + pv = &(plist[plist_current].v); + /* + * Create the various dialog components. Note that we're not + * actually initializing the values at this point; that will be done after + * the UI is fully created. + */ + gimp_help_init (); + + create_top_level_structure (); + + create_preview (); + create_printer_settings_frame (); + create_positioning_frame (); + create_scaling_frame (); + create_image_settings_frame (); + + /* + * Now actually set up the correct values in the dialog + */ + + gimp_build_printer_combo (); + gimp_plist_callback (NULL, (gpointer) plist_current); + gimp_update_adjusted_thumbnail (); + + gtk_widget_show (print_dialog); +} + +/* + * gimp_scaling_update() - Update the scaling scale using the slider. + */ +static void +gimp_scaling_update (GtkAdjustment *adjustment) +{ + gimp_invalidate_preview_thumbnail (); + reset_preview (); + + if (stp_get_scaling(*pv) != adjustment->value) + { + if (GTK_TOGGLE_BUTTON (scaling_ppi)->active) + stp_set_scaling (*pv, -adjustment->value); + else + stp_set_scaling (*pv, adjustment->value); + } + + suppress_scaling_adjustment = TRUE; + gimp_preview_update (); + suppress_scaling_adjustment = FALSE; +} + +/* + * gimp_scaling_callback() - Update the scaling scale using radio buttons. + */ +static void +gimp_scaling_callback (GtkWidget *widget) +{ + const stp_vars_t lower = stp_minimum_settings (); + gdouble max_ppi_scaling; + gdouble min_ppi_scaling, min_ppi_scaling1, min_ppi_scaling2; + gdouble current_scale; + + reset_preview (); + + if (suppress_scaling_callback) + return; + + min_ppi_scaling1 = 72.0 * (gdouble) image_width / + (gdouble) printable_width; + min_ppi_scaling2 = 72.0 * (gdouble) image_height / + (gdouble) printable_height; + + if (min_ppi_scaling1 > min_ppi_scaling2) + min_ppi_scaling = min_ppi_scaling1; + else + min_ppi_scaling = min_ppi_scaling2; + + max_ppi_scaling = min_ppi_scaling * 100 / stp_get_scaling (lower); + + if (widget == scaling_ppi) + { + if (! GTK_TOGGLE_BUTTON (scaling_ppi)->active) + return; + + GTK_ADJUSTMENT (scaling_adjustment)->lower = min_ppi_scaling; + GTK_ADJUSTMENT (scaling_adjustment)->upper = max_ppi_scaling; + + /* + * Compute the correct PPI to create an image of the same size + * as the one measured in percent + */ + current_scale = GTK_ADJUSTMENT (scaling_adjustment)->value; + GTK_ADJUSTMENT (scaling_adjustment)->value = + min_ppi_scaling / (current_scale / 100); + stp_set_scaling (*pv, 0.0); + } + else if (widget == scaling_percent) + { + gdouble new_percent; + + if (! GTK_TOGGLE_BUTTON (scaling_percent)->active) + return; + + current_scale = GTK_ADJUSTMENT (scaling_adjustment)->value; + GTK_ADJUSTMENT (scaling_adjustment)->lower = stp_get_scaling (lower); + GTK_ADJUSTMENT (scaling_adjustment)->upper = 100.0; + + new_percent = 100 * min_ppi_scaling / current_scale; + + if (new_percent > 100) + new_percent = 100; + if (new_percent < stp_get_scaling(lower)) + new_percent = stp_get_scaling(lower); + + GTK_ADJUSTMENT (scaling_adjustment)->value = new_percent; + stp_set_scaling (*pv, 0.0); + } + else if (widget == scaling_image) + { + gdouble xres, yres; + + gimp_invalidate_preview_thumbnail (); + gimp_image_get_resolution (image_ID, &xres, &yres); + + GTK_ADJUSTMENT (scaling_adjustment)->lower = min_ppi_scaling; + GTK_ADJUSTMENT (scaling_adjustment)->upper = max_ppi_scaling; + + if (yres < min_ppi_scaling) + yres = min_ppi_scaling; + if (yres > max_ppi_scaling) + yres = max_ppi_scaling; + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scaling_ppi), TRUE); + GTK_ADJUSTMENT (scaling_adjustment)->value = yres; + stp_set_scaling (*pv, 0.0); + } + + gtk_adjustment_changed (GTK_ADJUSTMENT (scaling_adjustment)); + gtk_adjustment_value_changed (GTK_ADJUSTMENT (scaling_adjustment)); +} + +/**************************************************************************** + * + * gimp_plist_build_combo + * + ****************************************************************************/ +void +gimp_plist_build_combo (GtkWidget *combo, /* I - Combo widget */ + gint num_items, /* I - Number of items */ + stp_param_t *items, /* I - Menu items */ + const gchar *cur_item, /* I - Current item */ + const gchar *def_value, /* I - default item */ + GtkSignalFunc callback, /* I - Callback */ + gint *callback_id) /* IO - Callback ID (init to -1) */ +{ + gint i; /* Looping var */ + GList *list = 0; + GtkEntry *entry = GTK_ENTRY (GTK_COMBO (combo)->entry); + + if (*callback_id != -1) + gtk_signal_disconnect (GTK_OBJECT (entry), *callback_id); +#if 0 + gtk_signal_handlers_destroy (GTK_OBJECT (entry)); +#endif + gtk_entry_set_editable (entry, FALSE); + + if (num_items == 0) + { + list = g_list_append (list, _("Standard")); + gtk_combo_set_popdown_strings (GTK_COMBO (combo), list); + *callback_id = -1; + gtk_widget_set_sensitive (combo, FALSE); + gtk_widget_show (combo); + return; + } + + for (i = 0; i < num_items; i ++) + list = g_list_append (list, c_strdup(items[i].text)); + + gtk_combo_set_popdown_strings (GTK_COMBO (combo), list); + + *callback_id = gtk_signal_connect (GTK_OBJECT (entry), "changed", callback, + NULL); + + for (i = 0; i < num_items; i ++) + if (strcmp(items[i].name, cur_item) == 0) + break; + + if (i >= num_items) + { + if (def_value) + for (i = 0; i < num_items; i ++) + if (strcmp(items[i].name, def_value) == 0) + break; + + if (i >= num_items) + i = 0; + } + + gtk_entry_set_text (entry, c_strdup (items[i].text)); + + gtk_combo_set_value_in_list (GTK_COMBO (combo), TRUE, FALSE); + gtk_widget_set_sensitive (combo, TRUE); + gtk_widget_show (combo); +} + +/* + * gimp_do_misc_updates() - Build an option menu for the given parameters. + */ +static void +gimp_do_misc_updates (void) +{ + const stp_vars_t lower = stp_minimum_settings (); + + suppress_preview_update++; + gimp_invalidate_preview_thumbnail (); + gimp_preview_update (); + + if (stp_get_scaling (*pv) < 0) + { + gdouble tmp = -stp_get_scaling (*pv); + gdouble max_ppi_scaling; + gdouble min_ppi_scaling, min_ppi_scaling1, min_ppi_scaling2; + + min_ppi_scaling1 = 72.0 * (gdouble) image_width / + (gdouble) printable_width; + min_ppi_scaling2 = 72.0 * (gdouble) image_height / + (gdouble) printable_height; + + if (min_ppi_scaling1 > min_ppi_scaling2) + min_ppi_scaling = min_ppi_scaling1; + else + min_ppi_scaling = min_ppi_scaling2; + + max_ppi_scaling = min_ppi_scaling * 100 / stp_get_scaling(lower); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scaling_ppi), TRUE); + GTK_ADJUSTMENT (scaling_adjustment)->lower = min_ppi_scaling; + GTK_ADJUSTMENT (scaling_adjustment)->upper = max_ppi_scaling; + GTK_ADJUSTMENT (scaling_adjustment)->value = tmp; + gtk_adjustment_changed (GTK_ADJUSTMENT (scaling_adjustment)); + gtk_adjustment_value_changed (GTK_ADJUSTMENT (scaling_adjustment)); + } + else + { + gdouble tmp = stp_get_scaling (*pv); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scaling_percent), TRUE); + GTK_ADJUSTMENT (scaling_adjustment)->lower = stp_get_scaling (lower); + GTK_ADJUSTMENT (scaling_adjustment)->upper = 100.0; + GTK_ADJUSTMENT (scaling_adjustment)->value = tmp; + gtk_signal_emit_by_name (scaling_adjustment, "changed"); + gtk_signal_emit_by_name (scaling_adjustment, "value_changed"); + } + + switch (stp_get_output_type (*pv)) + { + case OUTPUT_GRAY: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (output_gray), TRUE); + break; + case OUTPUT_COLOR: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (output_color), TRUE); + break; + case OUTPUT_MONOCHROME: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (output_monochrome), TRUE); + break; + } + + gimp_do_color_updates (); + + gtk_option_menu_set_history (GTK_OPTION_MENU (orientation_menu), + stp_get_orientation (*pv) + 1); + + if (stp_get_unit(*pv) == 0) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (unit_inch), TRUE); + else + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (unit_cm), TRUE); + + switch (stp_get_image_type (*pv)) + { + case IMAGE_LINE_ART: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (image_line_art), TRUE); + break; + case IMAGE_SOLID_TONE: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (image_solid_tone), TRUE); + break; + case IMAGE_CONTINUOUS: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (image_continuous_tone), + TRUE); + break; + default: + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (image_continuous_tone), + TRUE); + stp_set_image_type (*pv, IMAGE_CONTINUOUS); + break; + } + + suppress_preview_update--; + gimp_preview_update (); +} + +/* + * gimp_position_callback() - callback for position entry widgets + */ +static void +gimp_position_callback (GtkWidget *widget) +{ + reset_preview (); + suppress_preview_update++; + + if (widget == recenter_button) + { + stp_set_left (*pv, -1); + stp_set_top (*pv, -1); + } + else if (widget == recenter_horizontal_button) + { + stp_set_left (*pv, -1); + } + else if (widget == recenter_vertical_button) + { + stp_set_top (*pv, -1); + } + else + { + gdouble new_value = atof (gtk_entry_get_text (GTK_ENTRY (widget))); + gdouble unit_scaler = 1.0; + gboolean was_percent = 0; + + if (stp_get_unit(*pv)) + unit_scaler /= 2.54; + new_value *= unit_scaler; + + if (widget == top_entry) + stp_set_top (*pv, ((new_value + (1.0 / 144.0)) * 72) - top); + else if (widget == bottom_entry) + stp_set_top (*pv, + ((new_value + (1.0 / 144.0)) * 72) - (top + print_height)); + else if (widget == bottom_border_entry) + stp_set_top (*pv, paper_height - print_height - top - (new_value * 72)); + else if (widget == left_entry) + stp_set_left (*pv, ((new_value + (1.0 / 144.0)) * 72) - left); + else if (widget == right_entry) + stp_set_left (*pv, + ((new_value + (1.0 / 144.0)) * 72) - (left +print_width)); + else if (widget == right_border_entry) + stp_set_left (*pv, paper_width - print_width - left - (new_value * 72)); + else if (widget == width_entry) + { + if (stp_get_scaling(*pv) >= 0) + { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scaling_ppi), + TRUE); + gimp_scaling_callback (scaling_ppi); + was_percent = 1; + } + GTK_ADJUSTMENT (scaling_adjustment)->value = + ((gdouble) image_width) / new_value; + gtk_adjustment_value_changed (GTK_ADJUSTMENT (scaling_adjustment)); + if (was_percent) + { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scaling_percent), + TRUE); + gtk_adjustment_value_changed (GTK_ADJUSTMENT (scaling_adjustment)); + } + } + else if (widget == height_entry) + { + if (stp_get_scaling(*pv) >= 0) + { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scaling_ppi), + TRUE); + gimp_scaling_callback (scaling_ppi); + was_percent = 1; + } + GTK_ADJUSTMENT (scaling_adjustment)->value = + ((gdouble) image_height) / new_value; + gtk_adjustment_value_changed (GTK_ADJUSTMENT (scaling_adjustment)); + if (was_percent) + { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scaling_percent), + TRUE); + gtk_adjustment_value_changed (GTK_ADJUSTMENT (scaling_adjustment)); + } + } + if (stp_get_left (*pv) < 0) + stp_set_left (*pv, 0); + if (stp_get_top (*pv) < 0) + stp_set_top (*pv, 0); + } + + suppress_preview_update--; + gimp_preview_update (); +} + +/* + * gimp_plist_callback() - Update the current system printer. + */ +static void +gimp_plist_callback (GtkWidget *widget, + gpointer data) +{ + gint i; + const gchar *default_parameter; + + gimp_invalidate_frame (); + gimp_invalidate_preview_thumbnail (); + reset_preview (); + + if (widget) + { + const gchar *result = Combo_get_text (printer_combo); + + for (i = 0; i < plist_count; i++) + { + if (! strcmp (result, printer_list[i].text)) + { + plist_current = i; + break; + } + } + } + else + { + plist_current = (gint) data; + } + + pv = &(plist[plist_current].v); + + if (strcmp(stp_get_driver(*pv), "")) + current_printer = stp_get_printer_by_driver (stp_get_driver (*pv)); + + suppress_preview_update++; + gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (dither_algo_combo)->entry), + stp_get_dither_algorithm (*pv)); + + gimp_setup_update (); + + gimp_do_misc_updates (); + + /* + * Now get option parameters. + */ + + if (num_media_sizes > 0) + { + for (i = 0; i < num_media_sizes; i ++) + { + free ((void *) media_sizes[i].name); + free ((void *) media_sizes[i].text); + } + free (media_sizes); + num_media_sizes = 0; + } + + media_sizes = (*(stp_printer_get_printfuncs(current_printer)->parameters)) + (current_printer, stp_get_ppd_file (*pv), "PageSize", &num_media_sizes); + default_parameter = + ((stp_printer_get_printfuncs(current_printer)->default_parameters) + (current_printer, stp_get_ppd_file (*pv), "PageSize")); + + if (stp_get_media_size(*pv)[0] == '\0') + stp_set_media_size (*pv, default_parameter); + + gimp_plist_build_combo (media_size_combo, + num_media_sizes, + media_sizes, + stp_get_media_size (*pv), + default_parameter, + gimp_media_size_callback, + &media_size_callback_id); + + if (num_media_types > 0) + { + for (i = 0; i < num_media_types; i ++) + { + free ((void *) media_types[i].name); + free ((void *) media_types[i].text); + } + free (media_types); + num_media_types = 0; + } + + media_types = (*(stp_printer_get_printfuncs (current_printer)->parameters)) + (current_printer, stp_get_ppd_file (*pv), "MediaType", &num_media_types); + default_parameter = + ((stp_printer_get_printfuncs (current_printer)->default_parameters) + (current_printer, stp_get_ppd_file (*pv), "MediaType")); + + if (stp_get_media_type (*pv)[0] == '\0' && media_types != NULL) + stp_set_media_type (*pv, default_parameter); + else if (media_types == NULL) + stp_set_media_type (*pv, NULL); + + gimp_plist_build_combo (media_type_combo, + num_media_types, + media_types, + stp_get_media_type (*pv), + default_parameter, + gimp_media_type_callback, + &media_type_callback_id); + + if (num_media_sources > 0) + { + for (i = 0; i < num_media_sources; i ++) + { + free ((void *) media_sources[i].name); + free ((void *) media_sources[i].text); + } + free (media_sources); + num_media_sources = 0; + } + + media_sources = (*(stp_printer_get_printfuncs (current_printer)->parameters)) + (current_printer, stp_get_ppd_file (*pv), "InputSlot", &num_media_sources); + default_parameter = + ((stp_printer_get_printfuncs (current_printer)->default_parameters) + (current_printer, stp_get_ppd_file (*pv), "InputSlot")); + + if (stp_get_media_source (*pv)[0] == '\0' && media_sources != NULL) + stp_set_media_source (*pv, default_parameter); + else if (media_sources == NULL) + stp_set_media_source (*pv, NULL); + + gimp_plist_build_combo (media_source_combo, + num_media_sources, + media_sources, + stp_get_media_source (*pv), + default_parameter, + gimp_media_source_callback, + &media_source_callback_id); + + if (num_ink_types > 0) + { + for (i = 0; i < num_ink_types; i ++) + { + free ((void *) ink_types[i].name); + free ((void *) ink_types[i].text); + } + free (ink_types); + num_ink_types = 0; + } + + ink_types = (*(stp_printer_get_printfuncs (current_printer)->parameters)) + (current_printer, stp_get_ppd_file (*pv), "InkType", &num_ink_types); + default_parameter = + ((stp_printer_get_printfuncs (current_printer)->default_parameters) + (current_printer, stp_get_ppd_file (*pv), "InkType")); + + if (stp_get_ink_type (*pv)[0] == '\0' && ink_types != NULL) + stp_set_ink_type (*pv, default_parameter); + else if (ink_types == NULL) + stp_set_ink_type (*pv, NULL); + + gimp_plist_build_combo (ink_type_combo, + num_ink_types, + ink_types, + stp_get_ink_type (*pv), + default_parameter, + gimp_ink_type_callback, + &ink_type_callback_id); + + if (num_resolutions > 0) + { + for (i = 0; i < num_resolutions; i ++) + { + free ((void *)resolutions[i].name); + free ((void *)resolutions[i].text); + } + free (resolutions); + num_resolutions = 0; + } + + resolutions = (*(stp_printer_get_printfuncs (current_printer)->parameters)) + (current_printer, stp_get_ppd_file (*pv), "Resolution", &num_resolutions); + default_parameter = + ((stp_printer_get_printfuncs (current_printer)->default_parameters) + (current_printer, stp_get_ppd_file (*pv), "Resolution")); + + if (stp_get_resolution (*pv)[0] == '\0' && resolutions != NULL) + stp_set_resolution (*pv, default_parameter); + else if (resolutions == NULL) + stp_set_resolution (*pv, NULL); + + gimp_plist_build_combo (resolution_combo, + num_resolutions, + resolutions, + stp_get_resolution (*pv), + default_parameter, + gimp_resolution_callback, + &resolution_callback_id); + + if (dither_algo_combo) + gimp_build_dither_combo (); + + suppress_preview_update--; + gimp_preview_update (); +} + +/* + * gimp_media_size_callback() - Update the current media size. + */ +static void +gimp_media_size_callback (GtkWidget *widget, + gpointer data) +{ + gimp_invalidate_frame (); + gimp_invalidate_preview_thumbnail (); + reset_preview (); + + if (widget == custom_size_width) + { + gint width_limit, height_limit; + gint min_width_limit, min_height_limit; + gdouble new_value = atof (gtk_entry_get_text (GTK_ENTRY (widget))); + gdouble unit_scaler = 1.0; + + new_value *= 72; + if (stp_get_unit (*pv)) + unit_scaler /= 2.54; + new_value *= unit_scaler; + (stp_printer_get_printfuncs (current_printer)->limit) + (current_printer, *pv, &width_limit, &height_limit, + &min_width_limit, &min_height_limit); + if (new_value < min_width_limit) + new_value = min_width_limit; + else if (new_value > width_limit) + new_value = width_limit; + stp_set_page_width (*pv, new_value); + stp_set_left(*pv, -1); + new_value = new_value / 72.0; + if (stp_get_unit (*pv)) + new_value *= 2.54; + set_entry_value (custom_size_width, new_value, 0); + gimp_preview_update (); + } + else if (widget == custom_size_height) + { + gint width_limit, height_limit; + gint min_width_limit, min_height_limit; + gdouble new_value = atof (gtk_entry_get_text (GTK_ENTRY (widget))); + gdouble unit_scaler = 1.0; + + new_value *= 72; + if (stp_get_unit(*pv)) + unit_scaler /= 2.54; + new_value *= unit_scaler; + (stp_printer_get_printfuncs (current_printer)->limit) + (current_printer, *pv, &width_limit, &height_limit, + &min_width_limit, &min_height_limit); + if (new_value < min_height_limit) + new_value = min_height_limit; + else if (new_value > height_limit) + new_value = height_limit; + stp_set_page_height (*pv, new_value); + stp_set_top(*pv, -1); + new_value = new_value / 72.0; + if (stp_get_unit (*pv)) + new_value *= 2.54; + set_entry_value (custom_size_height, new_value, 0); + gimp_preview_update (); + } + else + { + const gchar *new_media_size = Combo_get_name (media_size_combo, + num_media_sizes, + media_sizes); + const stp_papersize_t pap = stp_get_papersize_by_name (new_media_size); + + if (pap) + { + gint default_width, default_height; + gdouble size; + + if (stp_papersize_get_width (pap) == 0) + { + (stp_printer_get_printfuncs (current_printer)->media_size) + (current_printer, *pv, &default_width, &default_height); + size = default_width / 72.0; + if (stp_get_unit (*pv)) + size *= 2.54; + set_entry_value (custom_size_width, size, 0); + gtk_widget_set_sensitive (GTK_WIDGET (custom_size_width), TRUE); + gtk_entry_set_editable (GTK_ENTRY (custom_size_width), TRUE); + stp_set_page_width (*pv, default_width); + } + else + { + size = stp_papersize_get_width (pap) / 72.0; + if (stp_get_unit (*pv)) + size *= 2.54; + set_entry_value (custom_size_width, size, 0); + gtk_widget_set_sensitive (GTK_WIDGET (custom_size_width), FALSE); + gtk_entry_set_editable (GTK_ENTRY (custom_size_width), FALSE); + stp_set_page_width (*pv, stp_papersize_get_width (pap)); + } + + if (stp_papersize_get_height (pap) == 0) + { + (stp_printer_get_printfuncs (current_printer)->media_size) + (current_printer, *pv, &default_width, &default_height); + size = default_height / 72.0; + if (stp_get_unit (*pv)) + size *= 2.54; + set_entry_value (custom_size_height, size, 0); + gtk_widget_set_sensitive (GTK_WIDGET (custom_size_height), TRUE); + gtk_entry_set_editable (GTK_ENTRY (custom_size_height), TRUE); + stp_set_page_height (*pv, default_height); + } + else + { + size = stp_papersize_get_height (pap) / 72.0; + if (stp_get_unit (*pv)) + size *= 2.54; + set_entry_value (custom_size_height, size, 0); + gtk_widget_set_sensitive (GTK_WIDGET (custom_size_height), FALSE); + gtk_entry_set_editable (GTK_ENTRY (custom_size_height), FALSE); + stp_set_page_height (*pv, stp_papersize_get_height (pap)); + } + } + + if (strcmp (stp_get_media_size (*pv), new_media_size) != 0) + { + stp_set_media_size (*pv, new_media_size); + stp_set_left (*pv, -1); + stp_set_top (*pv, -1); + gimp_preview_update (); + } + } +} + +/* + * gimp_media_type_callback() - Update the current media type. + */ +static void +gimp_media_type_callback (GtkWidget *widget, + gpointer data) +{ + const gchar *new_media_type = + Combo_get_name (media_type_combo, num_media_types, media_types); + + gimp_invalidate_frame (); + gimp_invalidate_preview_thumbnail (); + reset_preview (); + stp_set_media_type (*pv, new_media_type); + gimp_preview_update (); +} + +/* + * gimp_media_source_callback() - Update the current media source. + */ +static void +gimp_media_source_callback (GtkWidget *widget, + gpointer data) +{ + const gchar *new_media_source = + Combo_get_name (media_source_combo, num_media_sources, media_sources); + + gimp_invalidate_frame (); + gimp_invalidate_preview_thumbnail (); + reset_preview (); + stp_set_media_source (*pv, new_media_source); + gimp_preview_update (); +} + +/* + * gimp_ink_type_callback() - Update the current ink type. + */ +static void +gimp_ink_type_callback (GtkWidget *widget, + gpointer data) +{ + const gchar *new_ink_type = + Combo_get_name (ink_type_combo, num_ink_types, ink_types); + + gimp_invalidate_frame (); + gimp_invalidate_preview_thumbnail (); + reset_preview (); + stp_set_ink_type (*pv, new_ink_type); + gimp_preview_update (); +} + +/* + * gimp_resolution_callback() - Update the current resolution. + */ +static void +gimp_resolution_callback (GtkWidget *widget, + gpointer data) +{ + const gchar *new_resolution = + Combo_get_name (resolution_combo, num_resolutions, resolutions); + + gimp_invalidate_frame(); + gimp_invalidate_preview_thumbnail(); + reset_preview(); + stp_set_resolution(*pv, new_resolution); + gimp_preview_update (); +} + +/* + * gimp_orientation_callback() - Update the current media size. + */ +static void +gimp_orientation_callback (GtkWidget *widget, + gpointer data) +{ + reset_preview (); + + if (stp_get_orientation (*pv) != (gint) data) + { + gimp_invalidate_frame (); + gimp_invalidate_preview_thumbnail (); + stp_set_orientation (*pv, (gint) data); + stp_set_left (*pv, -1); + stp_set_top (*pv, -1); + } + gimp_preview_update (); +} + +/* + * gimp_output_type_callback() - Update the current output type. + */ +static void +gimp_output_type_callback (GtkWidget *widget, + gpointer data) +{ + reset_preview (); + + if (GTK_TOGGLE_BUTTON (widget)->active) + { + stp_set_output_type (*pv, (gint) data); + gimp_invalidate_frame (); + gimp_invalidate_preview_thumbnail (); + gimp_update_adjusted_thumbnail (); + } + + if (widget == output_color) + gimp_set_color_sliders_active (TRUE); + else + gimp_set_color_sliders_active (FALSE); + + gimp_preview_update (); +} + +/* + * gimp_unit_callback() - Update the current unit. + */ +static void +gimp_unit_callback (GtkWidget *widget, + gpointer data) +{ + reset_preview (); + + if (GTK_TOGGLE_BUTTON (widget)->active) + { + stp_set_unit (*pv, (gint) data); + gimp_preview_update (); + } +} + +/* + * gimp_image_type_callback() - Update the current image type mode. + */ +static void +gimp_image_type_callback (GtkWidget *widget, + gpointer data) +{ + reset_preview (); + + if (GTK_TOGGLE_BUTTON (widget)->active) + { + stp_set_image_type (*pv, (gint) data); + gimp_invalidate_frame (); + gimp_invalidate_preview_thumbnail (); + gimp_update_adjusted_thumbnail (); + } + + gimp_preview_update (); +} + +static void +gimp_destroy_dialogs (void) +{ + gtk_widget_destroy (gimp_color_adjust_dialog); + gtk_widget_destroy (setup_dialog); + gtk_widget_destroy (print_dialog); + gtk_widget_destroy (new_printer_dialog); + gtk_widget_destroy (about_dialog); +} + +static void +gimp_dialogs_set_sensitive (gboolean sensitive) +{ + gtk_widget_set_sensitive (gimp_color_adjust_dialog, sensitive); + gtk_widget_set_sensitive (setup_dialog, sensitive); + gtk_widget_set_sensitive (print_dialog, sensitive); + gtk_widget_set_sensitive (new_printer_dialog, sensitive); + gtk_widget_set_sensitive (about_dialog, sensitive); +} + +/* + * 'print_callback()' - Start the print. + */ +static void +gimp_print_callback (void) +{ + if (plist_current > 0) + { + runme = TRUE; + gimp_destroy_dialogs (); + } + else + { + gimp_dialogs_set_sensitive (FALSE); + gtk_widget_show (file_browser); + } +} + +/* + * gimp_printandsave_callback() - + */ +static void +gimp_printandsave_callback (void) +{ + saveme = TRUE; + gimp_print_callback(); +} + +static void +gimp_about_callback (void) +{ + gtk_widget_show (about_dialog); +} + +/* + * gimp_save_callback() - save settings, don't destroy dialog + */ +static void +gimp_save_callback (void) +{ + reset_preview (); + printrc_save (); +} + +/* + * gimp_setup_update() - update widgets in the setup dialog + */ +static void +gimp_setup_update (void) +{ + GtkAdjustment *adjustment; + gint idx; + + current_printer = stp_get_printer_by_driver (stp_get_driver (*pv)); + idx = stp_get_printer_index_by_driver (stp_get_driver (*pv)); + + gtk_clist_select_row (GTK_CLIST (printer_driver), idx, 0); + + gtk_entry_set_text (GTK_ENTRY (ppd_file), stp_get_ppd_file (*pv)); + + if (strncmp (stp_get_driver (*pv),"ps", 2) == 0) + { + gtk_widget_show (ppd_label); + gtk_widget_show (ppd_file); + gtk_widget_show (ppd_button); + } + else + { + gtk_widget_hide (ppd_label); + gtk_widget_hide (ppd_file); + gtk_widget_hide (ppd_button); + } + + gtk_entry_set_text (GTK_ENTRY (output_cmd), stp_get_output_to (*pv)); + + if (plist_current == 0) + gtk_widget_hide (output_cmd); + else + gtk_widget_show (output_cmd); + + adjustment = GTK_CLIST (printer_driver)->vadjustment; + gtk_adjustment_set_value (adjustment, + adjustment->lower + + idx * (adjustment->upper - adjustment->lower) / + GTK_CLIST (printer_driver)->rows); +} + +/* + * gimp_setup_open_callback() - + */ +static void +gimp_setup_open_callback (void) +{ + static gboolean first_time = TRUE; + + reset_preview (); + gimp_setup_update (); + + gtk_widget_show (setup_dialog); + + if (first_time) + { + /* Make sure the driver scroller gets positioned correctly. */ + gimp_setup_update (); + first_time = FALSE; + } +} + +/* + * gimp_new_printer_open_callback() - + */ +static void +gimp_new_printer_open_callback (void) +{ + reset_preview (); + gtk_entry_set_text (GTK_ENTRY (new_printer_entry), ""); + gtk_widget_show (new_printer_dialog); +} + +/* + * gimp_setup_ok_callback() - + */ +static void +gimp_setup_ok_callback (void) +{ + reset_preview (); + gimp_invalidate_frame (); + gimp_invalidate_preview_thumbnail (); + stp_set_driver (*pv, stp_printer_get_driver (current_printer)); + + stp_set_output_to (*pv, gtk_entry_get_text (GTK_ENTRY (output_cmd))); + + stp_set_ppd_file (*pv, gtk_entry_get_text (GTK_ENTRY (ppd_file))); + + gimp_plist_callback (NULL, (gpointer) plist_current); + + gtk_widget_hide (setup_dialog); +} + +/* + * gimp_setup_ok_callback() - + */ +static void +gimp_new_printer_ok_callback (void) +{ + const gchar *data = gtk_entry_get_text (GTK_ENTRY (new_printer_entry)); + gp_plist_t key; + + gimp_invalidate_frame (); + gimp_invalidate_preview_thumbnail (); + reset_preview (); + initialize_printer (&key); + (void) strncpy (key.name, data, sizeof(key.name) - 1); + + if (strlen (key.name)) + { + key.active = 0; + key.v = stp_allocate_copy (*pv); + + if (add_printer (&key, 1)) + { + plist_current = plist_count - 1; + gimp_build_printer_combo (); + + stp_set_driver (*pv, stp_printer_get_driver (current_printer)); + + stp_set_output_to (*pv, gtk_entry_get_text (GTK_ENTRY (output_cmd))); + + stp_set_ppd_file (*pv, gtk_entry_get_text (GTK_ENTRY (ppd_file))); + + gimp_plist_callback (NULL, (gpointer) plist_current); + } + } + + gtk_widget_hide (new_printer_dialog); +} + +/* + * gimp_print_driver_callback() - Update the current printer driver. + */ +static void +gimp_print_driver_callback (GtkWidget *widget, /* I - Driver list */ + gint row, + gint column, + GdkEventButton *event, + gpointer data) /* I - Data */ +{ + stp_vars_t printvars; + + gimp_invalidate_frame (); + gimp_invalidate_preview_thumbnail (); + reset_preview (); + data = gtk_clist_get_row_data (GTK_CLIST (widget), row); + current_printer = stp_get_printer_by_index ((gint) data); + gtk_label_set_text (GTK_LABEL (printer_model_label), + gettext (stp_printer_get_long_name (current_printer))); + + if (strncmp (stp_printer_get_driver (current_printer), "ps", 2) == 0) + { + gtk_widget_show (ppd_label); + gtk_widget_show (ppd_file); + gtk_widget_show (ppd_button); + } + else + { + gtk_widget_hide (ppd_label); + gtk_widget_hide (ppd_file); + gtk_widget_hide (ppd_button); + } + + printvars = stp_printer_get_printvars (current_printer); + + if (stp_get_output_type (printvars) == OUTPUT_COLOR) + { + gtk_widget_set_sensitive (output_color, TRUE); + } + else + { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (output_gray), TRUE); + gtk_widget_set_sensitive (output_color, FALSE); + } +} + +/* + * gimp_ppd_browse_callback() - + */ +static void +gimp_ppd_browse_callback (void) +{ + reset_preview (); + gtk_file_selection_set_filename (GTK_FILE_SELECTION (ppd_browser), + gtk_entry_get_text (GTK_ENTRY (ppd_file))); + gtk_widget_show (ppd_browser); +} + +/* + * gimp_ppd_ok_callback() - + */ +static void +gimp_ppd_ok_callback (void) +{ + reset_preview (); + gtk_widget_hide (ppd_browser); + gtk_entry_set_text + (GTK_ENTRY (ppd_file), + gtk_file_selection_get_filename (GTK_FILE_SELECTION (ppd_browser))); +} + +/* + * gimp_file_ok_callback() - print to file and go away + */ +static void +gimp_file_ok_callback (void) +{ + gtk_widget_hide (file_browser); + stp_set_output_to (*pv, + gtk_file_selection_get_filename (GTK_FILE_SELECTION (file_browser))); + + runme = TRUE; + gimp_destroy_dialogs (); +} + +/* + * gimp_file_cancel_callback() - + */ +static void +gimp_file_cancel_callback (void) +{ + gtk_widget_hide (file_browser); + gimp_dialogs_set_sensitive (TRUE); +} + +/* + * gimp_update_adjusted_thumbnail() + */ +void +gimp_update_adjusted_thumbnail (void) +{ + gint x, y; + stp_convert_t colorfunc; + gushort out[3 * THUMBNAIL_MAXW]; + guchar *adjusted_data = adjusted_thumbnail_data; + gfloat old_density = stp_get_density(*pv); + + if (thumbnail_data == 0 || adjusted_thumbnail_data == 0) + return; + + stp_set_density (*pv, 1.0); + stp_compute_lut (*pv, 256); + colorfunc = stp_choose_colorfunc (stp_get_output_type(*pv), thumbnail_bpp, + NULL, &adjusted_thumbnail_bpp, *pv); + + for (y = 0; y < thumbnail_h; y++) + { + (*colorfunc) (*pv, thumbnail_data + thumbnail_bpp * thumbnail_w * y, + out, NULL, thumbnail_w, thumbnail_bpp, NULL, NULL, NULL, + NULL); + for (x = 0; x < adjusted_thumbnail_bpp * thumbnail_w; x++) + { + *adjusted_data++ = out[x] / 0x0101U; + } + } + + stp_free_lut (*pv); + + stp_set_density (*pv, old_density); + + gimp_redraw_color_swatch (); + gimp_preview_update (); +} + +void +gimp_invalidate_preview_thumbnail (void) +{ + preview_valid = 0; +} + +void +gimp_invalidate_frame (void) +{ + frame_valid = 0; +} + +static void +draw_arrow (GdkWindow *w, + GdkGC *gc, + gint paper_left, + gint paper_top, + gint orient) +{ + gint u = preview_ppi/2; + gint ox = paper_left + preview_ppi * paper_width / 72 / 2; + gint oy = paper_top + preview_ppi * paper_height / 72 / 2; + + if (orient == ORIENT_LANDSCAPE) + { + ox += preview_ppi * paper_width / 72 / 4; + if (ox > paper_left + preview_ppi * paper_width / 72 - u) + ox = paper_left + preview_ppi * paper_width / 72 - u; + gdk_draw_line (w, gc, ox + u, oy, ox, oy - u); + gdk_draw_line (w, gc, ox + u, oy, ox, oy + u); + gdk_draw_line (w, gc, ox + u, oy, ox - u, oy); + } + else if (orient == ORIENT_SEASCAPE) + { + ox -= preview_ppi * paper_width / 72 / 4; + if (ox < paper_left + u) + ox = paper_left + u; + gdk_draw_line (w, gc, ox - u, oy, ox, oy - u); + gdk_draw_line (w, gc, ox - u, oy, ox, oy + u); + gdk_draw_line (w, gc, ox - u, oy, ox + u, oy); + } + else if (orient == ORIENT_UPSIDEDOWN) + { + oy += preview_ppi * paper_height / 72 / 4; + if (oy > paper_top + preview_ppi * paper_height / 72 - u) + oy = paper_top + preview_ppi * paper_height / 72 - u; + gdk_draw_line (w, gc, ox, oy + u, ox - u, oy); + gdk_draw_line (w, gc, ox, oy + u, ox + u, oy); + gdk_draw_line (w, gc, ox, oy + u, ox, oy - u); + } + else /* (orient == ORIENT_PORTRAIT) */ + { + oy -= preview_ppi * paper_height / 72 / 4; + if (oy < paper_top + u) + oy = paper_top + u; + gdk_draw_line (w, gc, ox, oy - u, ox - u, oy); + gdk_draw_line (w, gc, ox, oy - u, ox + u, oy); + gdk_draw_line (w, gc, ox, oy - u, ox, oy + u); + } +} + +/* + * gimp_preview_update_callback() - + */ +static void +gimp_do_preview_thumbnail (gint paper_left, + gint paper_top, + gint orient) +{ + static GdkGC *gc = NULL; + static GdkGC *gcinv = NULL; + static GdkGC *gcset = NULL; + static guchar *preview_data = NULL; + static gint opx = 0; + static gint opy = 0; + static gint oph = 0; + static gint opw = 0; + + gint preview_x = 1 + printable_left + preview_ppi * stp_get_left (*pv) / 72; + gint preview_y = 1 + printable_top + preview_ppi * stp_get_top (*pv) / 72; + gint preview_w = MAX (1, (preview_ppi * print_width) / 72 - 1); + gint preview_h = MAX (1, (preview_ppi * print_height) / 72 - 1); + + if (gc == NULL) + { + gc = gdk_gc_new (preview->widget.window); + gcinv = gdk_gc_new (preview->widget.window); + gdk_gc_set_function (gcinv, GDK_INVERT); + gcset = gdk_gc_new (preview->widget.window); + gdk_gc_set_function (gcset, GDK_SET); + } + + if (!preview_valid) + { + gint v_denominator = preview_h > 1 ? preview_h - 1 : 1; + gint v_numerator = (thumbnail_h - 1) % v_denominator; + gint v_whole = (thumbnail_h - 1) / v_denominator; + gint h_denominator = preview_w > 1 ? preview_w - 1 : 1; + gint h_numerator = (thumbnail_w - 1) % h_denominator; + gint h_whole = (thumbnail_w - 1) / h_denominator; + gint adjusted_preview_width = adjusted_thumbnail_bpp * preview_w; + gint adjusted_thumbnail_width = adjusted_thumbnail_bpp * thumbnail_w; + gint v_cur = 0; + gint v_last = -1; + gint v_error = v_denominator / 2; + gint y; + gint i; + + if (preview_data) + free (preview_data); + preview_data = g_malloc (3 * preview_h * preview_w); + + for (y = 0; y < preview_h; y++) + { + guchar *outbuf = preview_data + adjusted_preview_width * y; + + if (v_cur == v_last) + { + memcpy (outbuf, outbuf - adjusted_preview_width, + adjusted_preview_width); + } + else + { + guchar *inbuf = adjusted_thumbnail_data - adjusted_thumbnail_bpp + + adjusted_thumbnail_width * v_cur; + + gint h_cur = 0; + gint h_last = -1; + gint h_error = h_denominator / 2; + gint x; + + v_last = v_cur; + for (x = 0; x < preview_w; x++) + { + if (h_cur == h_last) + { + for (i = 0; i < adjusted_thumbnail_bpp; i++) + outbuf[i] = outbuf[i - adjusted_thumbnail_bpp]; + } + else + { + inbuf += adjusted_thumbnail_bpp * (h_cur - h_last); + h_last = h_cur; + for (i = 0; i < adjusted_thumbnail_bpp; i++) + outbuf[i] = inbuf[i]; + } + outbuf += adjusted_thumbnail_bpp; + h_cur += h_whole; + h_error += h_numerator; + if (h_error >= h_denominator) + { + h_error -= h_denominator; + h_cur++; + } + } + } + v_cur += v_whole; + v_error += v_numerator; + if (v_error >= v_denominator) + { + v_error -= v_denominator; + v_cur++; + } + } + preview_valid = 1; + } + + if (need_exposure) + { + /* draw paper frame */ + gdk_draw_rectangle (preview->widget.window, gc, 0, + paper_left, paper_top, + MAX(2, preview_ppi * paper_width / 72), + MAX(2, preview_ppi * paper_height / 72)); + + /* draw printable frame */ + gdk_draw_rectangle (preview->widget.window, gc, 0, + printable_left, printable_top, + MAX(2, preview_ppi * printable_width / 72), + MAX(2, preview_ppi * printable_height / 72)); + need_exposure = 0; + } + else if (!frame_valid) + { + gdk_window_clear (preview->widget.window); + /* draw paper frame */ + gdk_draw_rectangle (preview->widget.window, gc, 0, + paper_left, paper_top, + MAX(2, preview_ppi * paper_width / 72), + MAX(2, preview_ppi * paper_height / 72)); + + /* draw printable frame */ + gdk_draw_rectangle (preview->widget.window, gc, 0, + printable_left, printable_top, + MAX(2, preview_ppi * printable_width / 72), + MAX(2, preview_ppi * printable_height / 72)); + frame_valid = 1; + } + else + { + if (opx + opw <= preview_x || opy + oph <= preview_y || + preview_x + preview_w <= opx || preview_y + preview_h <= opy) + { + gdk_window_clear_area (preview->widget.window, opx, opy, opw, oph); + } + else + { + if (opx < preview_x) + gdk_window_clear_area (preview->widget.window, + opx, opy, preview_x - opx, oph); + if (opy < preview_y) + gdk_window_clear_area (preview->widget.window, + opx, opy, opw, preview_y - opy); + if (opx + opw > preview_x + preview_w) + gdk_window_clear_area (preview->widget.window, + preview_x + preview_w, opy, + (opx + opw) - (preview_x + preview_w), oph); + if (opy + oph > preview_y + preview_h) + gdk_window_clear_area (preview->widget.window, + opx, preview_y + preview_h, + opw, (opy + oph) - (preview_y + preview_h)); + } + } + + draw_arrow (preview->widget.window, gcset, paper_left, paper_top, orient); + + if (adjusted_thumbnail_bpp == 1) + gdk_draw_gray_image (preview->widget.window, gc, + preview_x, preview_y, preview_w, preview_h, + GDK_RGB_DITHER_NORMAL, preview_data, preview_w); + else + gdk_draw_rgb_image (preview->widget.window, gc, + preview_x, preview_y, preview_w, preview_h, + GDK_RGB_DITHER_NORMAL, preview_data, 3 * preview_w); + + /* draw orientation arrow pointing to top-of-paper */ + draw_arrow (preview->widget.window, gcinv, paper_left, paper_top, orient); + + opx = preview_x; + opy = preview_y; + oph = preview_h; + opw = preview_w; +} + +static void +gimp_preview_expose (void) +{ + need_exposure = 1; + gimp_preview_update (); +} + +static void +gimp_preview_update (void) +{ + gint temp; + gint orient; /* True orientation of page */ + gdouble max_ppi_scaling; /* Maximum PPI for current page size */ + gdouble min_ppi_scaling; /* Minimum PPI for current page size */ + gdouble min_ppi_scaling1; /* Minimum PPI for current page size */ + gdouble min_ppi_scaling2; /* Minimum PPI for current page size */ + gint paper_left; + gint paper_top; + gdouble unit_scaler = 72.0; + + (stp_printer_get_printfuncs (current_printer)->media_size) + (current_printer, *pv, &paper_width, &paper_height); + + (stp_printer_get_printfuncs (current_printer)->imageable_area) + (current_printer, *pv, &left, &right, &bottom, &top); + + /* Rationalise things a bit by measuring everything from the top left */ + top = paper_height - top; + bottom = paper_height - bottom; + + printable_width = right - left; + printable_height = bottom - top; + + if (stp_get_orientation (*pv) == ORIENT_AUTO) + { + if ((printable_width >= printable_height && image_width>=image_height) || + (printable_height >= printable_width && image_height >= image_width)) + orient = ORIENT_PORTRAIT; + else + orient = ORIENT_LANDSCAPE; + } + else + orient = stp_get_orientation (*pv); + + /* + * Adjust page dimensions depending on the page orientation. + */ + + bottom = paper_height - bottom; + right = paper_width - right; + + if (orient == ORIENT_LANDSCAPE || orient == ORIENT_SEASCAPE) + { + temp = printable_width; + printable_width = printable_height; + printable_height = temp; + temp = paper_width; + paper_width = paper_height; + paper_height = temp; + + if (orient == ORIENT_LANDSCAPE) + { + temp = left; + left = bottom; + bottom = right; + right = top; + top = temp; + } + else + { + temp = left; + left = top; + top = right; + right = bottom; + bottom = temp; + } + } + else if (orient == ORIENT_UPSIDEDOWN) + { + temp = left; + left = right; + right = temp; + temp = top; + top = bottom; + bottom = temp; + } + + bottom = paper_height - bottom; + right = paper_width - right; + + if (stp_get_scaling (*pv) < 0) + { + gdouble twidth; + + min_ppi_scaling1 = 72.0 * (gdouble) image_width / printable_width; + min_ppi_scaling2 = 72.0 * (gdouble) image_height / printable_height; + + if (min_ppi_scaling1 > min_ppi_scaling2) + min_ppi_scaling = min_ppi_scaling1; + else + min_ppi_scaling = min_ppi_scaling2; + + max_ppi_scaling = min_ppi_scaling * 20; + if (stp_get_scaling (*pv) < 0 && + stp_get_scaling (*pv) > -min_ppi_scaling) + stp_set_scaling (*pv, -min_ppi_scaling); + + twidth = (72.0 * (gdouble) image_width / -stp_get_scaling(*pv)); + print_width = twidth + .5; + print_height = (twidth * (gdouble) image_height / image_width) + .5; + GTK_ADJUSTMENT (scaling_adjustment)->lower = min_ppi_scaling; + GTK_ADJUSTMENT (scaling_adjustment)->upper = max_ppi_scaling; + GTK_ADJUSTMENT (scaling_adjustment)->value = -stp_get_scaling(*pv); + + if (!suppress_scaling_adjustment) + { + suppress_preview_reset++; + gtk_adjustment_changed (GTK_ADJUSTMENT (scaling_adjustment)); + suppress_scaling_callback = TRUE; + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scaling_ppi), TRUE); + suppress_scaling_callback = FALSE; + gtk_adjustment_value_changed (GTK_ADJUSTMENT (scaling_adjustment)); + suppress_preview_reset--; + } + } + else + { + /* we do stp_get_scaling(*pv) % of height or width, whatever is less */ + /* this is relative to printable size */ + if (image_width * printable_height > printable_width * image_height) + /* if image_width/image_height > printable_width/printable_height */ + /* i.e. if image is wider relative to its height than the width + of the printable area relative to its height */ + { + gdouble twidth = .5 + printable_width * stp_get_scaling(*pv) / 100; + + print_width = twidth; + print_height = twidth * (gdouble) image_height / + (gdouble) image_width; + } + else + { + gdouble theight = .5 + printable_height * stp_get_scaling(*pv) /100; + + print_height = theight; + print_width = theight * (gdouble) image_width / + (gdouble) image_height; + } + } + + preview_ppi = PREVIEW_SIZE_HORIZ * 72.0 / (gdouble) paper_width; + + if (PREVIEW_SIZE_VERT * 72 / paper_height < preview_ppi) + preview_ppi = PREVIEW_SIZE_VERT * 72.0 / (gdouble) paper_height; + if (preview_ppi > MAX_PREVIEW_PPI) + preview_ppi = MAX_PREVIEW_PPI; + + paper_left = (PREVIEW_SIZE_HORIZ - preview_ppi * paper_width / 72) / 2; + paper_top = (PREVIEW_SIZE_VERT - preview_ppi * paper_height / 72) / 2; + printable_left = paper_left + preview_ppi * left / 72; + printable_top = paper_top + preview_ppi * top / 72 ; + + if (preview == NULL || preview->widget.window == NULL) + return; + + if (stp_get_left (*pv) < 0) + { + stp_set_left (*pv, (paper_width - print_width) / 2 - left); + if (stp_get_left (*pv) < 0) + stp_set_left (*pv, 0); + } + + /* we leave stp_get_left(*pv) etc. relative to printable area */ + if (stp_get_left (*pv) > (printable_width - print_width)) + stp_set_left (*pv, printable_width - print_width); + + if (stp_get_top (*pv) < 0) + { + stp_set_top (*pv, ((paper_height - print_height) / 2) - top); + if (stp_get_top (*pv) < 0) + stp_set_top (*pv, 0); + } + + if (stp_get_top (*pv) > (printable_height - print_height)) + stp_set_top (*pv, printable_height - print_height); + + if(stp_get_unit (*pv)) + unit_scaler /= 2.54; + + set_entry_value (top_entry, (top + stp_get_top (*pv)) / unit_scaler, 1); + set_entry_value (left_entry, (left + stp_get_left (*pv)) / unit_scaler, 1); + set_entry_value (bottom_entry, + (top + stp_get_top(*pv) + print_height) / unit_scaler, 1); + set_entry_value (bottom_border_entry, + (paper_height - (top + stp_get_top (*pv) + print_height)) / + unit_scaler, 1); + set_entry_value (right_entry, + (left + stp_get_left(*pv) + print_width) / unit_scaler, 1); + set_entry_value (right_border_entry, + (paper_width - (left + stp_get_left (*pv) + print_width)) / + unit_scaler, 1); + set_entry_value (width_entry, print_width / unit_scaler, 1); + set_entry_value (height_entry, print_height / unit_scaler, 1); + set_entry_value (custom_size_width, stp_get_page_width (*pv)/unit_scaler, 1); + set_entry_value (custom_size_height, stp_get_page_height (*pv)/unit_scaler, 1); + + /* draw image */ + if (! suppress_preview_update) + { + gimp_do_preview_thumbnail (paper_left, paper_top, orient); + gdk_flush (); + } +} + +/* + * gimp_preview_button_callback() - + */ +static void +gimp_preview_button_callback (GtkWidget *widget, + GdkEventButton *event, + gpointer data) +{ + if (event->type == GDK_BUTTON_PRESS) + { + if (preview_active == 0) + { + mouse_x = event->x; + mouse_y = event->y; + old_left = stp_get_left (*pv); + old_top = stp_get_top (*pv); + mouse_button = event->button; + buttons_mask = 1 << event->button; + buttons_pressed++; + preview_active = 1; + gimp_help_disable_tooltips (); + if (event->state & GDK_SHIFT_MASK) + move_constraint = MOVE_CONSTRAIN; + else + move_constraint = MOVE_ANY; + } + else if (preview_active == 1) + { + if ((buttons_mask & (1 << event->button)) == 0) + { + gimp_help_enable_tooltips (); + preview_active = -1; + stp_set_left (*pv, old_left); + stp_set_top (*pv, old_top); + gimp_preview_update (); + buttons_mask |= 1 << event->button; + buttons_pressed++; + } + } + else + { + if ((buttons_mask & (1 << event->button)) == 0) + { + buttons_mask |= 1 << event->button; + buttons_pressed++; + } + } + } + else if (event->type == GDK_BUTTON_RELEASE) + { + buttons_pressed--; + buttons_mask &= ~(1 << event->button); + if (buttons_pressed == 0) + { + gimp_help_enable_tooltips (); + preview_active = 0; + } + } +} + +/* + * gimp_preview_motion_callback() - + */ +static void +gimp_preview_motion_callback (GtkWidget *widget, + GdkEventMotion *event, + gpointer data) +{ + if (event->type != GDK_MOTION_NOTIFY) + return; + if (preview_active != 1) + return; + if (stp_get_left(*pv) < 0 || stp_get_top(*pv) < 0) + { + stp_set_left(*pv, 72 * (printable_width - print_width) / 20); + stp_set_top(*pv, 72 * (printable_height - print_height) / 20); + } + if (move_constraint == MOVE_CONSTRAIN) + { + int dx = abs(event->x - mouse_x); + int dy = abs(event->y - mouse_y); + if (dx > dy && dx > 3) + move_constraint = MOVE_HORIZONTAL; + else if (dy > dx && dy > 3) + move_constraint = MOVE_VERTICAL; + else + return; + } + + if (mouse_button == 2) + { + int changes = 0; + int y_threshold = MAX (1, (preview_ppi * print_height) / 72); + + if (move_constraint & MOVE_HORIZONTAL) + { + int x_threshold = MAX (1, (preview_ppi * print_width) / 72); + while (event->x - mouse_x >= x_threshold) + { + if (left + stp_get_left (*pv) + (print_width * 2) <= right) + { + stp_set_left (*pv, stp_get_left (*pv) + print_width); + mouse_x += x_threshold; + changes = 1; + } + else + break; + } + while (mouse_x - event->x >= x_threshold) + { + if (stp_get_left (*pv) >= print_width) + { + stp_set_left (*pv, stp_get_left (*pv) - print_width); + mouse_x -= x_threshold; + changes = 1; + } + else + break; + } + } + + if (move_constraint & MOVE_VERTICAL) + { + while (event->y - mouse_y >= y_threshold) + { + if (top + stp_get_top (*pv) + (print_height * 2) <= bottom) + { + stp_set_top (*pv, stp_get_top (*pv) + print_height); + mouse_y += y_threshold; + changes = 1; + } + else + break; + } + while (mouse_y - event->y >= y_threshold) + { + if (stp_get_top (*pv) >= print_height) + { + stp_set_top (*pv, stp_get_top (*pv) - print_height); + mouse_y -= y_threshold; + changes = 1; + } + else + break; + } + } + if (!changes) + return; + } + else + { + gint old_top = stp_get_top (*pv); + gint old_left = stp_get_left (*pv); + gint new_top = old_top; + gint new_left = old_left; + gint changes = 0; + + if (mouse_button == 1) + { + if (move_constraint & MOVE_VERTICAL) + new_top += 72 * (event->y - mouse_y) / preview_ppi; + if (move_constraint & MOVE_HORIZONTAL) + new_left += 72 * (event->x - mouse_x) / preview_ppi; + } + else + { + if (move_constraint & MOVE_VERTICAL) + new_top += event->y - mouse_y; + if (move_constraint & MOVE_HORIZONTAL) + new_left += event->x - mouse_x; + } + + if (new_top < 0) + new_top = 0; + if (new_top > (bottom - top) - print_height) + new_top = (bottom - top) - print_height; + if (new_left < 0) + new_left = 0; + if (new_left > (right - left) - print_width) + new_left = (right - left) - print_width; + + if (new_top != old_top) + { + stp_set_top (*pv, new_top); + changes = 1; + } + if (new_left != old_left) + { + stp_set_left (*pv, new_left); + changes = 1; + } + mouse_x = event->x; + mouse_y = event->y; + if (!changes) + return; + } + + gimp_preview_update (); +} diff --git a/src/gimp/print-image-gimp.c b/src/gimp/print-image-gimp.c new file mode 100644 index 0000000..f10bcc3 --- /dev/null +++ b/src/gimp/print-image-gimp.c @@ -0,0 +1,343 @@ +/* + * "$Id: print-image-gimp.c,v 1.5 2001/07/28 01:42:25 rlk Exp $" + * + * Print plug-in for the GIMP. + * + * Copyright 1997-2000 Michael Sweet (mike@easysw.com) and + * Robert Krawitz (rlk@alum.mit.edu) + * Copyright 2000 Charles Briscoe-Smith + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include "../../lib/libprintut.h" + +#include "print_gimp.h" + +#include "print-intl.h" + + +/* + * "Image" ADT + * + * This file defines an abstract data type called "Image". An Image wraps + * a Gimp drawable (or some other application-level image representation) + * for presentation to the low-level printer drivers (which do CMYK + * separation, dithering and weaving). The Image ADT has the ability + * to perform any combination of flips and rotations on the image, + * and then deliver individual rows to the driver code. + * + * Stuff which might be useful to do in this layer: + * + * - Scaling, optionally with interpolation/filtering. + * + * - Colour-adjustment. + * + * - Multiple-image composition. + * + * Also useful might be to break off a thin application-dependent + * sublayer leaving this layer (which does the interesting stuff) + * application-independent. + */ + + +/* Concrete type to represent image */ +typedef struct +{ + GimpDrawable *drawable; + GimpPixelRgn rgn; + + /* + * Transformations we can impose on the image. The transformations + * are considered to be performed in the order given here. + */ + + /* 1: Transpose the x and y axes (flip image over its leading diagonal) */ + int columns; /* Set if returning columns instead of rows. */ + + /* 2: Translate (ox,oy) to the origin */ + int ox, oy; /* Origin of image */ + + /* 3: Flip vertically about the x axis */ + int increment; /* +1 or -1 for offset of row n+1 from row n. */ + + /* 4: Crop to width w, height h */ + int w, h; /* Width and height of output image */ + + /* 5: Flip horizontally about the vertical centre-line of the image */ + int mirror; /* Set if mirroring rows end-for-end. */ + +} Gimp_Image_t; + +static const char *Image_get_appname(stp_image_t *image); +static void Image_progress_conclude(stp_image_t *image); +static void Image_note_progress(stp_image_t *image, + double current, double total); +static void Image_progress_init(stp_image_t *image); +static stp_image_status_t Image_get_row(stp_image_t *image, + unsigned char *data, int row); +static int Image_height(stp_image_t *image); +static int Image_width(stp_image_t *image); +static int Image_bpp(stp_image_t *image); +static void Image_rotate_180(stp_image_t *image); +static void Image_rotate_cw(stp_image_t *image); +static void Image_rotate_ccw(stp_image_t *image); +static void Image_crop(stp_image_t *image, + int left, int top, int right, int bottom); +static void Image_vflip(stp_image_t *image); +static void Image_hflip(stp_image_t *image); +static void Image_transpose(stp_image_t *image); +static void Image_reset(stp_image_t *image); +static void Image_init(stp_image_t *image); + +static stp_image_t theImage = +{ + Image_init, + Image_reset, + Image_transpose, + Image_hflip, + Image_vflip, + Image_crop, + Image_rotate_ccw, + Image_rotate_cw, + Image_rotate_180, + Image_bpp, + Image_width, + Image_height, + Image_get_row, + Image_get_appname, + Image_progress_init, + Image_note_progress, + Image_progress_conclude, + NULL +}; + +stp_image_t * +Image_GimpDrawable_new(GimpDrawable *drawable) +{ + Gimp_Image_t *i = xmalloc(sizeof(Gimp_Image_t)); + i->drawable = drawable; + gimp_pixel_rgn_init(&(i->rgn), drawable, 0, 0, + drawable->width, drawable->height, FALSE, FALSE); + theImage.rep = i; + theImage.reset(&theImage); + return &theImage; +} + +static void +Image_init(stp_image_t *image) +{ + /* Nothing to do. */ +} + +static void +Image_reset(stp_image_t *image) +{ + Gimp_Image_t *i = (Gimp_Image_t *) (image->rep); + i->columns = FALSE; + i->ox = 0; + i->oy = 0; + i->increment = 1; + i->w = i->drawable->width; + i->h = i->drawable->height; + i->mirror = FALSE; +} + +static void +Image_transpose(stp_image_t *image) +{ + Gimp_Image_t *i = (Gimp_Image_t *) (image->rep); + int tmp; + + if (i->mirror) i->ox += i->w - 1; + + i->columns = !i->columns; + + tmp = i->ox; + i->ox = i->oy; + i->oy = tmp; + + tmp = i->mirror; + i->mirror = i->increment < 0; + i->increment = tmp ? -1 : 1; + + tmp = i->w; + i->w = i->h; + i->h = tmp; + + if (i->mirror) i->ox -= i->w - 1; +} + +static void +Image_hflip(stp_image_t *image) +{ + Gimp_Image_t *i = (Gimp_Image_t *) (image->rep); + i->mirror = !i->mirror; +} + +static void +Image_vflip(stp_image_t *image) +{ + Gimp_Image_t *i = (Gimp_Image_t *) (image->rep); + i->oy += (i->h-1) * i->increment; + i->increment = -i->increment; +} + +/* + * Image_crop: + * + * Crop the given number of pixels off the LEFT, TOP, RIGHT and BOTTOM + * of the image. + */ + +static void +Image_crop(stp_image_t *image, int left, int top, int right, int bottom) +{ + Gimp_Image_t *i = (Gimp_Image_t *) (image->rep); + int xmax = (i->columns ? i->drawable->height : i->drawable->width) - 1; + int ymax = (i->columns ? i->drawable->width : i->drawable->height) - 1; + + int nx = i->ox + i->mirror ? right : left; + int ny = i->oy + top * (i->increment); + + int nw = i->w - left - right; + int nh = i->h - top - bottom; + + int wmax, hmax; + + if (nx < 0) nx = 0; + else if (nx > xmax) nx = xmax; + + if (ny < 0) ny = 0; + else if (ny > ymax) ny = ymax; + + wmax = xmax - nx + 1; + hmax = i->increment ? ny + 1 : ymax - ny + 1; + + if (nw < 1) nw = 1; + else if (nw > wmax) nw = wmax; + + if (nh < 1) nh = 1; + else if (nh > hmax) nh = hmax; + + i->ox = nx; + i->oy = ny; + i->w = nw; + i->h = nh; +} + +static void +Image_rotate_ccw(stp_image_t *image) +{ + Image_transpose(image); + Image_vflip(image); +} + +static void +Image_rotate_cw(stp_image_t *image) +{ + Image_transpose(image); + Image_hflip(image); +} + +static void +Image_rotate_180(stp_image_t *image) +{ + Image_vflip(image); + Image_hflip(image); +} + +static int +Image_bpp(stp_image_t *image) +{ + Gimp_Image_t *i = (Gimp_Image_t *) (image->rep); + return i->drawable->bpp; +} + +static int +Image_width(stp_image_t *image) +{ + Gimp_Image_t *i = (Gimp_Image_t *) (image->rep); + return i->w; +} + +static int +Image_height(stp_image_t *image) +{ + Gimp_Image_t *i = (Gimp_Image_t *) (image->rep); + return i->h; +} + +static stp_image_status_t +Image_get_row(stp_image_t *image, unsigned char *data, int row) +{ + Gimp_Image_t *i = (Gimp_Image_t *) (image->rep); + if (i->columns) + gimp_pixel_rgn_get_col(&(i->rgn), data, + i->oy + row * i->increment, i->ox, i->w); + else + gimp_pixel_rgn_get_row(&(i->rgn), data, + i->ox, i->oy + row * i->increment, i->w); + if (i->mirror) + { + /* Flip row -- probably inefficiently */ + int f, l, b = i->drawable->bpp; + for (f = 0, l = i->w - 1; f < l; f++, l--) + { + int c; + unsigned char tmp; + for (c = 0; c < b; c++) + { + tmp = data[f*b+c]; + data[f*b+c] = data[l*b+c]; + data[l*b+c] = tmp; + } + } + } + return STP_IMAGE_OK; +} + +static void +Image_progress_init(stp_image_t *image) +{ + gimp_progress_init(_("Printing...")); +} + +static void +Image_note_progress(stp_image_t *image, double current, double total) +{ + gimp_progress_update(current / total); +} + +static void +Image_progress_conclude(stp_image_t *image) +{ + gimp_progress_update(1); +} + +static const char * +Image_get_appname(stp_image_t *image) +{ + static char pluginname[] = PLUG_IN_NAME " plug-in V" PLUG_IN_VERSION + " for GIMP"; + return pluginname; +} + +/* + * End of "$Id: print-image-gimp.c,v 1.5 2001/07/28 01:42:25 rlk Exp $". + */ diff --git a/src/gimp/print-intl.h b/src/gimp/print-intl.h new file mode 100644 index 0000000..dfc5c12 --- /dev/null +++ b/src/gimp/print-intl.h @@ -0,0 +1,36 @@ +/* + * "$Id: print-intl.h,v 1.2 2001/09/08 17:17:34 rleigh Exp $" + * + * I18N header file for the gimp-print plugin. + * + * Copyright 1997-2000 Michael Sweet (mike@easysw.com), + * Robert Krawitz (rlk@alum.mit.edu) and Michael Natterer (mitch@gimp.org) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#ifndef __PRINT_INTL_H__ +#define __PRINT_INTL_H__ + +#include +#include + +#define INIT_LOCALE(domain) G_STMT_START{ \ + gtk_set_locale (); \ + setlocale (LC_NUMERIC, "C"); \ + bindtextdomain (domain, PACKAGE_LOCALE_DIR); \ + textdomain (domain); \ + }G_STMT_END + +#endif /* __PRINT_INTL_H__ */ diff --git a/src/gimp/print.c b/src/gimp/print.c new file mode 100644 index 0000000..31347aa --- /dev/null +++ b/src/gimp/print.c @@ -0,0 +1,1319 @@ +/* + * "$Id: print.c,v 1.22 2001/09/08 17:17:34 rleigh Exp $" + * + * Print plug-in for the GIMP. + * + * Copyright 1997-2000 Michael Sweet (mike@easysw.com) and + * Robert Krawitz (rlk@alum.mit.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include "../../lib/libprintut.h" + +#include "print_gimp.h" + +#include +#include +#include +#include +#ifdef __EMX__ +#define INCL_DOSDEVICES +#define INCL_DOSERRORS +#include +#endif + +#include +#include +#include + +#include "print-intl.h" + +/* + * Local functions... + */ + +static void printrc_load (void); +void printrc_save (void); +static int compare_printers (gp_plist_t *p1, gp_plist_t *p2); +static void get_system_printers (void); + +static void query (void); +static void run (char *, int, GimpParam *, int *, GimpParam **); +static int do_print_dialog (char *proc_name); + +/* + * Globals... + */ + +GimpPlugInInfo PLUG_IN_INFO = /* Plug-in information */ +{ + NULL, /* init_proc */ + NULL, /* quit_proc */ + query, /* query_proc */ + run, /* run_proc */ +}; + +stp_vars_t vars = NULL; + +int plist_current = 0, /* Current system printer */ + plist_count = 0; /* Number of system printers */ +gp_plist_t *plist; /* System printers */ + +int saveme = FALSE; /* True if print should proceed */ +int runme = FALSE; /* True if print should proceed */ +stp_printer_t current_printer = 0; /* Current printer index */ +gint32 image_ID; /* image ID */ + +const char *image_filename; +int image_width; +int image_height; + +static void +check_plist(int count) +{ + static int current_plist_size = 0; + if (count <= current_plist_size) + return; + else if (current_plist_size == 0) + { + current_plist_size = count; + plist = xmalloc(current_plist_size * sizeof(gp_plist_t)); + } + else + { + current_plist_size *= 2; + if (current_plist_size < count) + current_plist_size = count; + plist = realloc(plist, current_plist_size * sizeof(gp_plist_t)); + } +} + +/* + * 'main()' - Main entry - just call gimp_main()... + */ + +MAIN() + +static int print_finished = 0; + +/* + * 'query()' - Respond to a plug-in query... + */ + +static void +query (void) +{ + static const GimpParamDef args[] = + { + { GIMP_PDB_INT32, "run_mode", "Interactive, non-interactive" }, + { GIMP_PDB_IMAGE, "image", "Input image" }, + { GIMP_PDB_DRAWABLE, "drawable", "Input drawable" }, + { GIMP_PDB_STRING, "output_to", "Print command or filename (| to pipe to command)" }, + { GIMP_PDB_STRING, "driver", "Printer driver short name" }, + { GIMP_PDB_STRING, "ppd_file", "PPD file" }, + { GIMP_PDB_INT32, "output_type", "Output type (0 = gray, 1 = color)" }, + { GIMP_PDB_STRING, "resolution", "Resolution (\"300\", \"720\", etc.)" }, + { GIMP_PDB_STRING, "media_size", "Media size (\"Letter\", \"A4\", etc.)" }, + { GIMP_PDB_STRING, "media_type", "Media type (\"Plain\", \"Glossy\", etc.)" }, + { GIMP_PDB_STRING, "media_source", "Media source (\"Tray1\", \"Manual\", etc.)" }, + { GIMP_PDB_FLOAT, "brightness", "Brightness (0-400%)" }, + { GIMP_PDB_FLOAT, "scaling", "Output scaling (0-100%, -PPI)" }, + { GIMP_PDB_INT32, "orientation", "Output orientation (-1 = auto, 0 = portrait, 1 = landscape)" }, + { GIMP_PDB_INT32, "left", "Left offset (points, -1 = centered)" }, + { GIMP_PDB_INT32, "top", "Top offset (points, -1 = centered)" }, + { GIMP_PDB_FLOAT, "gamma", "Output gamma (0.1 - 3.0)" }, + { GIMP_PDB_FLOAT, "contrast", "Contrast" }, + { GIMP_PDB_FLOAT, "cyan", "Cyan level" }, + { GIMP_PDB_FLOAT, "magenta", "Magenta level" }, + { GIMP_PDB_FLOAT, "yellow", "Yellow level" }, + { GIMP_PDB_INT32, "linear", "Linear output (0 = normal, 1 = linear)" }, + { GIMP_PDB_INT32, "image_type", "Image type (0 = line art, 1 = solid tones, 2 = continuous tone, 3 = monochrome)"}, + { GIMP_PDB_FLOAT, "saturation", "Saturation (0-1000%)" }, + { GIMP_PDB_FLOAT, "density", "Density (0-200%)" }, + { GIMP_PDB_STRING, "ink_type", "Type of ink or cartridge" }, + { GIMP_PDB_STRING, "dither_algorithm", "Dither algorithm" }, + { GIMP_PDB_INT32, "unit", "Unit 0=Inches 1=Metric" }, + }; + static gint nargs = sizeof(args) / sizeof(args[0]); + + static gchar *blurb = "This plug-in prints images from The GIMP."; + static gchar *help = "Prints images to PostScript, PCL, or ESC/P2 printers."; + static gchar *auth = "Michael Sweet and Robert Krawitz "; + static gchar *copy = "Copyright 1997-2000 by Michael Sweet and Robert Krawitz"; + static gchar *types = "RGB*,GRAY*,INDEXED*"; + + gimp_plugin_domain_register (PACKAGE, PACKAGE_LOCALE_DIR); + + gimp_install_procedure ("file_print_gimp", + blurb, help, auth, copy, + PLUG_IN_VERSION, + N_("/File/Print..."), + types, + GIMP_PLUGIN, + nargs, 0, + args, NULL); +} + +#ifdef __EMX__ +static char * +get_tmp_filename() +{ + char *tmp_path, *s, filename[80]; + + tmp_path = getenv("TMP"); + if (tmp_path == NULL) + tmp_path = ""; + + sprintf(filename, "gimp_print_tmp.%d", getpid()); + s = tmp_path = g_strconcat(tmp_path, "\\", filename, NULL); + if (!s) + return NULL; + for ( ; *s; s++) + if (*s == '/') *s = '\\'; + return tmp_path; +} +#endif + +/* + * 'usr1_handler()' - Make a note when we receive SIGUSR1. + */ + +static volatile int usr1_interrupt; + +static void +usr1_handler (int signal) +{ + usr1_interrupt = 1; +} + +void +gimp_writefunc(void *file, const char *buf, size_t bytes) +{ + FILE *prn = (FILE *)file; + fwrite(buf, 1, bytes, prn); +} + +/* + * 'run()' - Run the plug-in... + */ + +/* #define DEBUG_STARTUP */ + +#ifdef DEBUG_STARTUP +volatile int SDEBUG = 1; +#endif + +static void +run (char *name, /* I - Name of print program. */ + int nparams, /* I - Number of parameters passed in */ + GimpParam *param, /* I - Parameter values */ + int *nreturn_vals, /* O - Number of return values */ + GimpParam **return_vals) /* O - Return values */ +{ + GimpDrawable *drawable; /* Drawable for image */ + GimpRunModeType run_mode; /* Current run mode */ + FILE *prn = NULL; /* Print file/command */ + int ncolors; /* Number of colors in colormap */ + GimpParam *values; /* Return values */ +#ifdef __EMX__ + char *tmpfile; /* temp filename */ +#endif + gint32 drawable_ID; /* drawable ID */ + GimpExportReturnType export = GIMP_EXPORT_CANCEL; /* return value of gimp_export_image() */ + int ppid = getpid (), /* PID of plugin */ + opid, /* PID of output process */ + cpid = 0, /* PID of control/monitor process */ + pipefd[2]; /* Fds of the pipe connecting all the above */ + int dummy; +#ifdef DEBUG_STARTUP + while (SDEBUG) + ; +#endif + + /* + * Initialise libgimpprint + */ + + stp_init(); + +#ifdef INIT_I18N_UI + INIT_I18N_UI(); +#else + INIT_LOCALE (PACKAGE); +#endif + + vars = stp_allocate_copy(stp_default_settings()); + stp_set_input_color_model(vars, COLOR_MODEL_RGB); + stp_set_output_color_model(vars, COLOR_MODEL_RGB); + /* + * Initialize parameter data... + */ + + current_printer = stp_get_printer_by_index (0); + run_mode = (GimpRunModeType)param[0].data.d_int32; + + values = g_new (GimpParam, 1); + + values[0].type = GIMP_PDB_STATUS; + values[0].data.d_status = GIMP_PDB_SUCCESS; + + *nreturn_vals = 1; + *return_vals = values; + + image_ID = param[1].data.d_int32; + drawable_ID = param[2].data.d_int32; + + image_filename = gimp_image_get_filename (image_ID); + if (strchr(image_filename, '/')) + image_filename = strrchr(image_filename, '/') + 1; + + /* eventually export the image */ + switch (run_mode) + { + case GIMP_RUN_INTERACTIVE: + case GIMP_RUN_WITH_LAST_VALS: + gimp_ui_init ("print", TRUE); + export = gimp_export_image (&image_ID, &drawable_ID, "Print", + (GIMP_EXPORT_CAN_HANDLE_RGB | + GIMP_EXPORT_CAN_HANDLE_GRAY | + GIMP_EXPORT_CAN_HANDLE_INDEXED | + GIMP_EXPORT_CAN_HANDLE_ALPHA)); + if (export == GIMP_EXPORT_CANCEL) + { + *nreturn_vals = 1; + values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR; + return; + } + break; + default: + break; + } + + /* + * Get drawable... + */ + + drawable = gimp_drawable_get (drawable_ID); + + image_width = drawable->width; + image_height = drawable->height; + + /* + * See how we will run + */ + + switch (run_mode) + { + case GIMP_RUN_INTERACTIVE: + /* + * Get information from the dialog... + */ + + if (!do_print_dialog (name)) + goto cleanup; + stp_copy_vars(vars, plist[plist_current].v); + break; + + case GIMP_RUN_NONINTERACTIVE: + /* + * Make sure all the arguments are present... + */ + if (nparams < 11) + values[0].data.d_status = GIMP_PDB_CALLING_ERROR; + else + { + stp_set_output_to(vars, param[3].data.d_string); + stp_set_driver(vars, param[4].data.d_string); + stp_set_ppd_file(vars, param[5].data.d_string); + stp_set_output_type(vars, param[6].data.d_int32); + stp_set_resolution(vars, param[7].data.d_string); + stp_set_media_size(vars, param[8].data.d_string); + stp_set_media_type(vars, param[9].data.d_string); + stp_set_media_source(vars, param[10].data.d_string); + + if (nparams > 11) + stp_set_brightness(vars, param[11].data.d_float); + + if (nparams > 12) + stp_set_scaling(vars, param[12].data.d_float); + + if (nparams > 13) + stp_set_orientation(vars, param[13].data.d_int32); + + if (nparams > 14) + stp_set_left(vars, param[14].data.d_int32); + + if (nparams > 15) + stp_set_top(vars, param[15].data.d_int32); + + if (nparams > 16) + stp_set_gamma(vars, param[16].data.d_float); + + if (nparams > 17) + stp_set_contrast(vars, param[17].data.d_float); + + if (nparams > 18) + stp_set_cyan(vars, param[18].data.d_float); + + if (nparams > 19) + stp_set_magenta(vars, param[19].data.d_float); + + if (nparams > 20) + stp_set_yellow(vars, param[20].data.d_float); + + if (nparams > 21) + stp_set_image_type(vars, param[22].data.d_int32); + + if (nparams > 22) + stp_set_saturation(vars, param[23].data.d_float); + + if (nparams > 23) + stp_set_density(vars, param[24].data.d_float); + + if (nparams > 24) + stp_set_ink_type(vars, param[25].data.d_string); + + if (nparams > 25) + stp_set_dither_algorithm(vars, param[26].data.d_string); + + if (nparams > 26) + stp_set_unit(vars, param[27].data.d_int32); + } + + current_printer = stp_get_printer_by_driver (stp_get_driver(vars)); + break; + + case GIMP_RUN_WITH_LAST_VALS: + values[0].data.d_status = GIMP_PDB_CALLING_ERROR; + break; + + default: + values[0].data.d_status = GIMP_PDB_CALLING_ERROR; + break; + } + + /* + * Print the image... + */ + if (values[0].data.d_status == GIMP_PDB_SUCCESS) + { + /* + * Set the tile cache size... + */ + + if (drawable->height > drawable->width) + gimp_tile_cache_ntiles ((drawable->height + gimp_tile_width () - 1) / + gimp_tile_width () + 1); + else + gimp_tile_cache_ntiles ((drawable->width + gimp_tile_width () - 1) / + gimp_tile_width () + 1); + + /* + * Open the file/execute the print command... + */ + + if (plist_current > 0) +#ifndef __EMX__ + { + /* + * The following IPC code is only necessary because the GIMP kills + * plugins with SIGKILL if its "Cancel" button is pressed; this + * gives the plugin no chance whatsoever to clean up after itself. + */ + usr1_interrupt = 0; + signal (SIGUSR1, usr1_handler); + if (pipe (pipefd) != 0) { + prn = NULL; + } else { + cpid = fork (); + if (cpid < 0) { + prn = NULL; + } else if (cpid == 0) { + /* LPR monitor process. Printer output is piped to us. */ + opid = fork (); + if (opid < 0) { + /* Errors will cause the plugin to get a SIGPIPE. */ + exit (1); + } else if (opid == 0) { + dup2 (pipefd[0], 0); + close (pipefd[0]); + close (pipefd[1]); + execl("/bin/sh", "/bin/sh", "-c", stp_get_output_to(vars), NULL); + /* NOTREACHED */ + exit (1); + } else { + /* + * If the print plugin gets SIGKILLed by gimp, we kill lpr + * in turn. If the plugin signals us with SIGUSR1 that it's + * finished printing normally, we close our end of the pipe, + * and go away. + */ + close (pipefd[0]); + while (usr1_interrupt == 0) { + if (kill (ppid, 0) < 0) { + /* The print plugin has been killed! */ + kill (opid, SIGTERM); + waitpid (opid, &dummy, 0); + close (pipefd[1]); + /* + * We do not want to allow cleanup before exiting. + * The exiting parent has already closed the connection + * to the X server; if we try to clean up, we'll notice + * that fact and complain. + */ + _exit (0); + } + sleep (5); + } + /* We got SIGUSR1. */ + close (pipefd[1]); + /* + * We do not want to allow cleanup before exiting. + * The exiting parent has already closed the connection + * to the X server; if we try to clean up, we'll notice + * that fact and complain. + */ + _exit (0); + } + } else { + close (pipefd[0]); + /* Parent process. We generate the printer output. */ + prn = fdopen (pipefd[1], "w"); + /* and fall through... */ + } + } + } +#else + /* OS/2 PRINT command doesn't support print from stdin, use temp file */ + prn = (tmpfile = get_tmp_filename ()) ? fopen (tmpfile, "w") : NULL; +#endif + else + prn = fopen (stp_get_output_to(vars), "wb"); + + if (prn != NULL) + { + stp_image_t *image = Image_GimpDrawable_new(drawable); + stp_set_app_gamma(vars, gimp_gamma()); + stp_merge_printvars(vars, stp_printer_get_printvars(current_printer)); + + /* + * Is the image an Indexed type? If so we need the colormap... + */ + + if (gimp_image_base_type (image_ID) == GIMP_INDEXED) + stp_set_cmap(vars, gimp_image_get_cmap (image_ID, &ncolors)); + else + stp_set_cmap(vars, NULL); + + /* + * Finally, call the print driver to send the image to the printer + * and close the output file/command... + */ + + stp_set_outfunc(vars, gimp_writefunc); + stp_set_errfunc(vars, gimp_writefunc); + stp_set_outdata(vars, prn); + stp_set_errdata(vars, stderr); + if (stp_printer_get_printfuncs(current_printer)->verify + (current_printer, vars)) + stp_printer_get_printfuncs(current_printer)->print + (current_printer, image, vars); + else + values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR; + + if (plist_current > 0) +#ifndef __EMX__ + { + fclose (prn); + kill (cpid, SIGUSR1); + waitpid (cpid, &dummy, 0); + } +#else + { /* PRINT temp file */ + char *s; + fclose (prn); + s = g_strconcat (stp_get_output_to(vars), tmpfile, NULL); + if (system(s) != 0) + values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR; + g_free (s); + remove (tmpfile); + g_free (tmpfile); + } +#endif + else + fclose (prn); + print_finished = 1; + } + else + values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR; + + /* + * Store data... + */ + + if (run_mode == GIMP_RUN_INTERACTIVE) + gimp_set_data (PLUG_IN_NAME, vars, sizeof (vars)); + } + + /* + * Detach from the drawable... + */ + gimp_drawable_detach (drawable); + + cleanup: + if (export == GIMP_EXPORT_EXPORT) + gimp_image_delete (image_ID); + stp_free_vars(vars); +} + +/* + * 'do_print_dialog()' - Pop up the print dialog... + */ + +static gint +do_print_dialog (gchar *proc_name) +{ + + /* + * Get printrc options... + */ + printrc_load (); + + /* + * Print dialog window... + */ + gimp_create_main_window(); + + gtk_main (); + gdk_flush (); + + /* + * Set printrc options... + */ + if (saveme) + printrc_save (); + + /* + * Return ok/cancel... + */ + return (runme); +} + +void +initialize_printer(gp_plist_t *printer) +{ + printer->name[0] = '\0'; + printer->active=0; + printer->v = stp_allocate_vars(); +} + +#define GET_MANDATORY_INTERNAL_STRING_PARAM(param) \ +do { \ + if ((commaptr = strchr(lineptr, ',')) == NULL) \ + continue; \ + strncpy(key.param, lineptr, commaptr - line); \ + key.param[commaptr - lineptr] = '\0'; \ + lineptr = commaptr + 1; \ +} while (0) + +#define GET_MANDATORY_STRING_PARAM(param) \ +do { \ + if ((commaptr = strchr(lineptr, ',')) == NULL) \ + continue; \ + stp_set_##param##_n(key.v, lineptr, commaptr - line); \ + lineptr = commaptr + 1; \ +} while (0) + +#define GET_MANDATORY_INT_PARAM(param) \ +do { \ + if ((commaptr = strchr(lineptr, ',')) == NULL) \ + continue; \ + stp_set_##param(key.v, atoi(lineptr)); \ + lineptr = commaptr + 1; \ +} while (0) + +#define GET_OPTIONAL_STRING_PARAM(param) \ +do { \ + if ((commaptr = strchr(lineptr, ',')) == NULL) \ + { \ + stp_set_##param(key.v, lineptr); \ + keepgoing = 0; \ + } \ + else \ + { \ + stp_set_##param##_n(key.v, lineptr, commaptr - lineptr); \ + lineptr = commaptr + 1; \ + } \ +} while (0) + +#define GET_OPTIONAL_INT_PARAM(param) \ +do { \ + if ((keepgoing == 0) || ((commaptr = strchr(lineptr, ',')) == NULL)) \ + { \ + keepgoing = 0; \ + } \ + else \ + { \ + stp_set_##param(key.v, atoi(lineptr)); \ + lineptr = commaptr + 1; \ + } \ +} while (0) + +#define IGNORE_OPTIONAL_PARAM(param) \ +do { \ + if ((keepgoing == 0) || ((commaptr = strchr(lineptr, ',')) == NULL)) \ + { \ + keepgoing = 0; \ + } \ + else \ + { \ + lineptr = commaptr + 1; \ + } \ +} while (0) + +#define GET_OPTIONAL_FLOAT_PARAM(param) \ +do { \ + if ((keepgoing == 0) || ((commaptr = strchr(lineptr, ',')) == NULL)) \ + { \ + keepgoing = 0; \ + } \ + else \ + { \ + const stp_vars_t maxvars = stp_maximum_settings(); \ + const stp_vars_t minvars = stp_minimum_settings(); \ + const stp_vars_t defvars = stp_default_settings(); \ + stp_set_##param(key.v, atof(lineptr)); \ + if (stp_get_##param(key.v) > 0 && \ + (stp_get_##param(key.v) > stp_get_##param(maxvars) || \ + stp_get_##param(key.v) < stp_get_##param(minvars))) \ + stp_set_##param(key.v, stp_get_##param(defvars)); \ + lineptr = commaptr + 1; \ + } \ +} while (0) + +static void * +psearch(const void *key, const void *base, size_t nmemb, size_t size, + int (*compar)(const void *, const void *)) +{ + int i; + const char *cbase = (const char *) base; + for (i = 0; i < nmemb; i++) + { + if ((*compar)(key, (const void *) cbase) == 0) + return (void *) cbase; + cbase += size; + } + return NULL; +} + +int +add_printer(const gp_plist_t *key, int add_only) +{ + /* + * The format of the list is the File printer followed by a qsort'ed list + * of system printers. So, if we want to update the file printer, it is + * always first in the list, else call psearch. + */ + gp_plist_t *p; + if (strcmp(_("File"), key->name) == 0 + && strcmp(plist[0].name, _("File")) == 0) + { + if (add_only) + return 0; + if (stp_get_printer_by_driver(stp_get_driver(key->v))) + { +#ifdef DEBUG + printf("Updated File printer directly\n"); +#endif + p = &plist[0]; + memcpy(p, key, sizeof(gp_plist_t)); + p->v = stp_allocate_copy(key->v); + p->active = 1; + } + return 1; + } + else if (stp_get_printer_by_driver(stp_get_driver(key->v))) + { + p = psearch(key, plist + 1, plist_count - 1, + sizeof(gp_plist_t), + (int (*)(const void *, const void *)) compare_printers); + if (p == NULL) + { +#ifdef DEBUG + fprintf(stderr, "Adding new printer from printrc file: %s\n", + key->name); +#endif + check_plist(plist_count + 1); + p = plist + plist_count; + plist_count++; + memcpy(p, key, sizeof(gp_plist_t)); + p->v = stp_allocate_copy(key->v); + p->active = 0; + } + else + { + if (add_only) + return 0; +#ifdef DEBUG + printf("Updating printer %s.\n", key->name); +#endif + memcpy(p, key, sizeof(gp_plist_t)); + stp_copy_vars(p->v, key->v); + p->active = 1; + } + } + return 1; +} + +/* + * 'printrc_load()' - Load the printer resource configuration file. + */ +void +printrc_load(void) +{ + int i; /* Looping var */ + FILE *fp; /* Printrc file */ + char *filename; /* Its name */ + char line[1024], /* Line in printrc file */ + *lineptr, /* Pointer in line */ + *commaptr; /* Pointer to next comma */ + gp_plist_t key; /* Search key */ + int format = 0; /* rc file format version */ + int system_printers; /* printer count before reading printrc */ + char * current_printer = 0; /* printer to select */ + + check_plist(1); + + /* + * Get the printer list... + */ + + get_system_printers(); + + system_printers = plist_count - 1; + + /* + * Generate the filename for the current user... + */ + + filename = gimp_personal_rc_file ("printrc"); + +#ifdef __EMX__ + _fnslashify(filename); +#endif + +#ifndef __EMX__ + if ((fp = fopen(filename, "r")) != NULL) +#else + if ((fp = fopen(filename, "rt")) != NULL) +#endif + { + /* + * File exists - read the contents and update the printer list... + */ + + (void) memset(&key, 0, sizeof(gp_plist_t)); + initialize_printer(&key); + strcpy(key.name, _("File")); + (void) memset(line, 0, 1024); + while (fgets(line, sizeof(line), fp) != NULL) + { + int keepgoing = 1; + if (line[0] == '#') + { + if (strncmp("#PRINTRCv", line, 9) == 0) + { +#ifdef DEBUG + printf("Found printrc version tag: `%s'\n", line); + printf("Version number: `%s'\n", &(line[9])); +#endif + (void) sscanf(&(line[9]), "%d", &format); + } + continue; /* Comment */ + } + if (format == 0) + { + /* + * Read old format printrc lines... + */ + + initialize_printer(&key); + lineptr = line; + + /* + * Read the command-delimited printer definition data. Note that + * we can't use sscanf because %[^,] fails if the string is empty... + */ + + GET_MANDATORY_INTERNAL_STRING_PARAM(name); + GET_MANDATORY_STRING_PARAM(output_to); + GET_MANDATORY_STRING_PARAM(driver); + + if (! stp_get_printer_by_driver(stp_get_driver(key.v))) + continue; + + GET_MANDATORY_STRING_PARAM(ppd_file); + GET_MANDATORY_INT_PARAM(output_type); + GET_MANDATORY_STRING_PARAM(resolution); + GET_MANDATORY_STRING_PARAM(media_size); + GET_MANDATORY_STRING_PARAM(media_type); + + GET_OPTIONAL_STRING_PARAM(media_source); + GET_OPTIONAL_FLOAT_PARAM(brightness); + GET_OPTIONAL_FLOAT_PARAM(scaling); + GET_OPTIONAL_INT_PARAM(orientation); + GET_OPTIONAL_INT_PARAM(left); + GET_OPTIONAL_INT_PARAM(top); + GET_OPTIONAL_FLOAT_PARAM(gamma); + GET_OPTIONAL_FLOAT_PARAM(contrast); + GET_OPTIONAL_FLOAT_PARAM(cyan); + GET_OPTIONAL_FLOAT_PARAM(magenta); + GET_OPTIONAL_FLOAT_PARAM(yellow); + IGNORE_OPTIONAL_PARAM(linear); + GET_OPTIONAL_INT_PARAM(image_type); + GET_OPTIONAL_FLOAT_PARAM(saturation); + GET_OPTIONAL_FLOAT_PARAM(density); + GET_OPTIONAL_STRING_PARAM(ink_type); + GET_OPTIONAL_STRING_PARAM(dither_algorithm); + GET_OPTIONAL_INT_PARAM(unit); + add_printer(&key, 0); + } + else if (format == 1) + { + /* + * Read new format printrc lines... + */ + + char *keyword, *end, *value; + + keyword = line; + for (keyword = line; isspace(*keyword); keyword++) + { + /* skip initial spaces... */ + } + if (!isalpha(*keyword)) + continue; + for (end = keyword; isalnum(*end) || *end == '-'; end++) + { + /* find end of keyword... */ + } + value = end; + while (isspace(*value)) { + /* skip over white space... */ + value++; + } + if (*value != ':') + continue; + value++; + *end = '\0'; + while (isspace(*value)) { + /* skip over white space... */ + value++; + } + for (end = value; *end && *end != '\n'; end++) + { + /* find end of line... */ + } + *end = '\0'; +#ifdef DEBUG + printf("Keyword = `%s', value = `%s'\n", keyword, value); +#endif + if (strcasecmp("current-printer", keyword) == 0) { + if (current_printer) + free (current_printer); + current_printer = g_strdup(value); + } else if (strcasecmp("printer", keyword) == 0) { + /* Switch to printer named VALUE */ + add_printer(&key, 0); +#ifdef DEBUG + printf("output_to is now %s\n", stp_get_output_to(p->v)); +#endif + + initialize_printer(&key); + strncpy(key.name, value, 127); + } else if (strcasecmp("destination", keyword) == 0) { + stp_set_output_to(key.v, value); + } else if (strcasecmp("driver", keyword) == 0) { + stp_set_driver(key.v, value); + } else if (strcasecmp("ppd-file", keyword) == 0) { + stp_set_ppd_file(key.v, value); + } else if (strcasecmp("output-type", keyword) == 0) { + stp_set_output_type(key.v, atoi(value)); + } else if (strcasecmp("resolution", keyword) == 0) { + stp_set_resolution(key.v, value); + } else if (strcasecmp("media-size", keyword) == 0) { + stp_set_media_size(key.v, value); + } else if (strcasecmp("media-type", keyword) == 0) { + stp_set_media_type(key.v, value); + } else if (strcasecmp("media-source", keyword) == 0) { + stp_set_media_source(key.v, value); + } else if (strcasecmp("brightness", keyword) == 0) { + stp_set_brightness(key.v, atof(value)); + } else if (strcasecmp("scaling", keyword) == 0) { + stp_set_scaling(key.v, atof(value)); + } else if (strcasecmp("orientation", keyword) == 0) { + stp_set_orientation(key.v, atoi(value)); + } else if (strcasecmp("left", keyword) == 0) { + stp_set_left(key.v, atoi(value)); + } else if (strcasecmp("top", keyword) == 0) { + stp_set_top(key.v, atoi(value)); + } else if (strcasecmp("gamma", keyword) == 0) { + stp_set_gamma(key.v, atof(value)); + } else if (strcasecmp("contrast", keyword) == 0) { + stp_set_contrast(key.v, atof(value)); + } else if (strcasecmp("cyan", keyword) == 0) { + stp_set_cyan(key.v, atof(value)); + } else if (strcasecmp("magenta", keyword) == 0) { + stp_set_magenta(key.v, atof(value)); + } else if (strcasecmp("yellow", keyword) == 0) { + stp_set_yellow(key.v, atof(value)); + } else if (strcasecmp("linear", keyword) == 0) { + /* Ignore linear */ + } else if (strcasecmp("image-type", keyword) == 0) { + stp_set_image_type(key.v, atoi(value)); + } else if (strcasecmp("saturation", keyword) == 0) { + stp_set_saturation(key.v, atof(value)); + } else if (strcasecmp("density", keyword) == 0) { + stp_set_density(key.v, atof(value)); + } else if (strcasecmp("ink-type", keyword) == 0) { + stp_set_ink_type(key.v, value); + } else if (strcasecmp("dither-algorithm", keyword) == 0) { + stp_set_dither_algorithm(key.v, value); + } else if (strcasecmp("unit", keyword) == 0) { + stp_set_unit(key.v, atoi(value)); + } else if (strcasecmp("custom-page-width", keyword) == 0) { + stp_set_page_width(key.v, atoi(value)); + } else if (strcasecmp("custom-page-height", keyword) == 0) { + stp_set_page_height(key.v, atoi(value)); + } else { + /* Unrecognised keyword; ignore it... */ + printf("Unrecognized keyword `%s' in printrc; value `%s'\n", keyword, value); + } + } + else + { + /* + * We cannot read this file format... + */ + } + } + if (format > 0) + add_printer(&key, 0); + fclose(fp); + } + + g_free (filename); + + /* + * Select the current printer as necessary... + */ + + if (format == 1) + { + if (current_printer) + { + for (i = 0; i < plist_count; i ++) + if (strcmp(current_printer, plist[i].name) == 0) + plist_current = i; + } + } + else + { + if (stp_get_output_to(vars)[0] != '\0') + { + for (i = 0; i < plist_count; i ++) + if (strcmp(stp_get_output_to(vars), stp_get_output_to(plist[i].v))== 0) + break; + + if (i < plist_count) + plist_current = i; + } + } +} + +/* + * 'printrc_save()' - Save the current printer resource configuration. + */ +void +printrc_save(void) +{ + FILE *fp; /* Printrc file */ + char *filename; /* Printrc filename */ + int i; /* Looping var */ + gp_plist_t *p; /* Current printer */ + + /* + * Generate the filename for the current user... + */ + + filename = gimp_personal_rc_file ("printrc"); + +#ifdef __EMX__ + _fnslashify(filename); +#endif + +#ifndef __EMX__ + if ((fp = fopen(filename, "w")) != NULL) +#else + if ((fp = fopen(filename, "wt")) != NULL) +#endif + { + /* + * Write the contents of the printer list... + */ + +#ifdef DEBUG + fprintf(stderr, "Number of printers: %d\n", plist_count); +#endif + + fputs("#PRINTRCv1 written by GIMP-PRINT " PLUG_IN_VERSION "\n", fp); + + fprintf(fp, "Current-Printer: %s\n", plist[plist_current].name); + + for (i = 0, p = plist; i < plist_count; i ++, p ++) + { + fprintf(fp, "\nPrinter: %s\n", p->name); + fprintf(fp, "Destination: %s\n", stp_get_output_to(p->v)); + fprintf(fp, "Driver: %s\n", stp_get_driver(p->v)); + fprintf(fp, "PPD-File: %s\n", stp_get_ppd_file(p->v)); + fprintf(fp, "Output-Type: %d\n", stp_get_output_type(p->v)); + fprintf(fp, "Resolution: %s\n", stp_get_resolution(p->v)); + fprintf(fp, "Media-Size: %s\n", stp_get_media_size(p->v)); + fprintf(fp, "Media-Type: %s\n", stp_get_media_type(p->v)); + fprintf(fp, "Media-Source: %s\n", stp_get_media_source(p->v)); + fprintf(fp, "Brightness: %.3f\n", stp_get_brightness(p->v)); + fprintf(fp, "Scaling: %.3f\n", stp_get_scaling(p->v)); + fprintf(fp, "Orientation: %d\n", stp_get_orientation(p->v)); + fprintf(fp, "Left: %d\n", stp_get_left(p->v)); + fprintf(fp, "Top: %d\n", stp_get_top(p->v)); + fprintf(fp, "Gamma: %.3f\n", stp_get_gamma(p->v)); + fprintf(fp, "Contrast: %.3f\n", stp_get_contrast(p->v)); + fprintf(fp, "Cyan: %.3f\n", stp_get_cyan(p->v)); + fprintf(fp, "Magenta: %.3f\n", stp_get_magenta(p->v)); + fprintf(fp, "Yellow: %.3f\n", stp_get_yellow(p->v)); + fprintf(fp, "Image-Type: %d\n", stp_get_image_type(p->v)); + fprintf(fp, "Saturation: %.3f\n", stp_get_saturation(p->v)); + fprintf(fp, "Density: %.3f\n", stp_get_density(p->v)); + fprintf(fp, "Ink-Type: %s\n", stp_get_ink_type(p->v)); + fprintf(fp, "Dither-Algorithm: %s\n", stp_get_dither_algorithm(p->v)); + fprintf(fp, "Unit: %d\n", stp_get_unit(p->v)); + fprintf(fp, "Custom-Page-Width: %d\n", stp_get_page_width(p->v)); + fprintf(fp, "Custom-Page-Height: %d\n", stp_get_page_height(p->v)); + +#ifdef DEBUG + fprintf(stderr, "Wrote printer %d: %s\n", i, p->name); +#endif + + } + fclose(fp); + } else { + fprintf(stderr,"could not open printrc file \"%s\"\n",filename); + } + g_free (filename); +} + +/* + * 'compare_printers()' - Compare system printer names for qsort(). + */ + +static int +compare_printers(gp_plist_t *p1, /* I - First printer to compare */ + gp_plist_t *p2) /* I - Second printer to compare */ +{ + return (strcmp(p1->name, p2->name)); +} + +/* + * 'get_system_printers()' - Get a complete list of printers from the spooler. + */ + +#define PRINTERS_NONE 0 +#define PRINTERS_LPC 1 +#define PRINTERS_LPSTAT 2 + +extern int asprintf (char **result, const char *format, ...); + +static void +get_system_printers(void) +{ + int i; /* Looping var */ + int type; /* 0 = none, 1 = lpc, 2 = lpstat */ + char command[255]; /* Command to run */ + char defname[128]; /* Default printer name */ + FILE *pfile; /* Pipe to status command */ + char line[255]; /* Line from status command */ + char *ptr; /* Pointer into line */ + char name[128]; /* Printer name from status command */ +#ifdef __EMX__ + BYTE pnum; +#endif + static const char *lpcs[] = /* Possible locations of LPC... */ + { + "/etc" + "/usr/bsd", + "/usr/etc", + "/usr/libexec", + "/usr/sbin" + }; + + /* + * Setup defaults... + */ + + defname[0] = '\0'; + + check_plist(1); + plist_count = 1; + initialize_printer(&plist[0]); + strcpy(plist[0].name, _("File")); + stp_set_driver(plist[0].v, "ps2"); + stp_set_output_type(plist[0].v, OUTPUT_COLOR); + + /* + * Figure out what command to run... We use lpstat if it is available over + * lpc since Solaris, CUPS, etc. provide both commands. No need to list + * each printer twice... + */ + + if (!access("/usr/bin/lpstat", X_OK)) + { + strcpy(command, "/usr/bin/lpstat -d -p"); + type = PRINTERS_LPSTAT; + } + else + { + for (i = 0; i < (sizeof(lpcs) / sizeof(lpcs[0])); i ++) + { + sprintf(command, "%s/lpc", lpcs[i]); + + if (!access(command, X_OK)) + break; + } + + if (i < (sizeof(lpcs) / sizeof(lpcs[0]))) + { + strcat(command, " status < /dev/null"); + type = PRINTERS_LPC; + } + else + type = PRINTERS_NONE; + } + + /* + * Run the command, if any, to get the available printers... + */ + + if (type > PRINTERS_NONE) + { + if ((pfile = popen(command, "r")) != NULL) + { + /* + * Read input as needed... + */ + + while (fgets(line, sizeof(line), pfile) != NULL) + switch (type) + { + char *result; + case PRINTERS_LPC : + if (!strncmp(line, "Press RETURN to continue", 24) && + (ptr = strchr(line, ':')) != NULL && + (strlen(ptr) - 2) < (ptr - line)) + strcpy(line, ptr + 2); + + if ((ptr = strchr(line, ':')) != NULL && + line[0] != ' ' && line[0] != '\t') + { + check_plist(plist_count + 1); + *ptr = '\0'; + initialize_printer(&plist[plist_count]); + strncpy(plist[plist_count].name, line, + sizeof(plist[plist_count].name) - 1); +#ifdef DEBUG + fprintf(stderr, "Adding new printer from lpc: <%s>\n", + line); +#endif + asprintf(&result, "lpr -P%s -l", line); + stp_set_output_to(plist[plist_count].v, result); + free(result); + stp_set_driver(plist[plist_count].v, "ps2"); + plist_count ++; + } + break; + + case PRINTERS_LPSTAT : + if ((sscanf(line, "printer %127s", name) == 1) || + (sscanf(line, "Printer: %127s", name) == 1)) + { + check_plist(plist_count + 1); + initialize_printer(&plist[plist_count]); + strncpy(plist[plist_count].name, name, + sizeof(plist[plist_count].name) - 1); +#ifdef DEBUG + fprintf(stderr, "Adding new printer from lpc: <%s>\n", + name); +#endif + asprintf(&result, "lp -s -d%s -oraw", name); + stp_set_output_to(plist[plist_count].v, result); + free(result); + stp_set_driver(plist[plist_count].v, "ps2"); + plist_count ++; + } + else + sscanf(line, "system default destination: %127s", defname); + break; + } + + pclose(pfile); + } + } + +#ifdef __EMX__ + if (DosDevConfig(&pnum, DEVINFO_PRINTER) == NO_ERROR) + { + for (i = 1; i <= pnum; i++) + { + check_plist(plist_count + 1); + initialize_printer(&plist[plist_count]); + sprintf(plist[plist_count].name, "LPT%d:", i); + sprintf(plist[plist_count].v.output_to, "PRINT /D:LPT%d /B ", i); + strcpy(plist[plist_count].v.driver, "ps2"); + plist_count ++; + } + } +#endif + + if (plist_count > 2) + qsort(plist + 1, plist_count - 1, sizeof(gp_plist_t), + (int (*)(const void *, const void *))compare_printers); + + if (defname[0] != '\0' && stp_get_output_to(vars)[0] == '\0') + { + for (i = 0; i < plist_count; i ++) + if (strcmp(defname, plist[i].name) == 0) + break; + + if (i < plist_count) + plist_current = i; + } +} + +/* + * End of "$Id: print.c,v 1.22 2001/09/08 17:17:34 rleigh Exp $". + */ diff --git a/src/gimp/print_gimp.h b/src/gimp/print_gimp.h new file mode 100644 index 0000000..cc5e682 --- /dev/null +++ b/src/gimp/print_gimp.h @@ -0,0 +1,124 @@ +/* + * "$Id: print_gimp.h,v 1.20 2001/09/05 00:39:42 rlk Exp $" + * + * Print plug-in for the GIMP. + * + * Copyright 1997-2000 Michael Sweet (mike@easysw.com), + * Robert Krawitz (rlk@alum.mit.edu). and Steve Miller (smiller@rni.net + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * Revision History: + * + * See ChangeLog + */ + +#ifndef __PRINT_GIMP_H__ +#define __PRINT_GIMP_H__ + +#ifdef __GNUC__ +#define inline __inline__ +#endif + +#include + +/* + * We define GIMP_ENABLE_COMPAT_CRUFT here because we are still using + * the old API names. This is because we have to support 1.0 as well. + * This define is required as the default in Gimp was changed 24 Aug 00. + * This should be removed when we stop supporting 1.0. + */ + +#include +#include + +#ifdef INCLUDE_GIMP_PRINT_H +#include INCLUDE_GIMP_PRINT_H +#else +#include +#endif + +/* + * All Gimp-specific code is in this file. + */ + +#define PLUG_IN_VERSION VERSION " - " RELEASE_DATE +#define PLUG_IN_NAME "Print" + +typedef struct /**** Printer List ****/ +{ + int active; /* Do we know about this printer? */ + char name[128]; /* Name of printer */ + stp_vars_t v; +} gp_plist_t; + +#define THUMBNAIL_MAXW (128) +#define THUMBNAIL_MAXH (128) + +extern gint thumbnail_w, thumbnail_h, thumbnail_bpp; +extern guchar *thumbnail_data; +extern gint adjusted_thumbnail_bpp; +extern guchar *adjusted_thumbnail_data; + +extern stp_vars_t vars; +extern gint plist_count; /* Number of system printers */ +extern gint plist_current; /* Current system printer */ +extern gp_plist_t *plist; /* System printers */ +extern gint32 image_ID; +extern const gchar *image_filename; +extern gint image_width; +extern gint image_height; +extern stp_printer_t current_printer; +extern gint runme; +extern gint saveme; + +extern GtkWidget *gimp_color_adjust_dialog; +extern GtkWidget *dither_algo_combo; +extern stp_vars_t *pv; + +/* + * Function prototypes + */ + +/* How to create an Image wrapping a Gimp drawable */ +extern void printrc_save (void); + +extern stp_image_t *Image_GimpDrawable_new(GimpDrawable *drawable); +extern int add_printer(const gp_plist_t *key, int add_only); +extern void initialize_printer(gp_plist_t *printer); +extern void gimp_update_adjusted_thumbnail (void); +extern void gimp_plist_build_combo (GtkWidget *combo, + gint num_items, + stp_param_t *items, + const gchar *cur_item, + const gchar *def_value, + GtkSignalFunc callback, + gint *callback_id); + +extern void gimp_invalidate_frame(void); +extern void gimp_invalidate_preview_thumbnail(void); +extern void gimp_do_color_updates (void); +extern void gimp_redraw_color_swatch (void); +extern void gimp_build_dither_combo (void); +extern void gimp_create_color_adjust_window (void); +extern void gimp_update_adjusted_thumbnail (void); +extern void gimp_create_main_window (void); +extern void gimp_set_color_sliders_active(int active); +extern void gimp_writefunc (void *file, const char *buf, size_t bytes); +extern void set_adjustment_tooltip(GtkObject *adjustment, + const gchar *tip, const gchar *private); + +#endif /* __PRINT_GIMP_H__ */ diff --git a/src/main/.cvsignore b/src/main/.cvsignore new file mode 100644 index 0000000..6886507 --- /dev/null +++ b/src/main/.cvsignore @@ -0,0 +1,18 @@ +.deps +.libs +Makefile +Makefile.in +libgimpprint.la +print-lexmark.lo +print-canon.lo +print-dither.lo +print-dither-matrices.lo +print-escp2.lo +print-pcl.lo +print-ps.lo +print-printers.c +print-util.lo +print-color.lo +print-weave.lo +print-version.lo +gimpprint-config diff --git a/src/main/Makefile.am b/src/main/Makefile.am new file mode 100644 index 0000000..ad673e7 --- /dev/null +++ b/src/main/Makefile.am @@ -0,0 +1,97 @@ +## $Id: Makefile.am,v 1.27 2001/09/17 20:37:57 rleigh Exp $ +## Copyright (C) 2000 Roger Leigh +## +## 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, or (at your option) +## any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +## Process this file with automake to produce Makefile.in. + +AUTOMAKE_OPTIONS = 1.4 gnu + +@SET_MAKE@ + +MAINT_CHARSET = latin1 + + +## Variables + +AM_CFLAGS = $(GNUCFLAGS) +INCLUDES = @INCLUDES@ + + +## Programs + +MAIN_BIN = libgimpprint.la +MAIN_SCR = gimpprint-config + +bin_SCRIPTS = @MAIN_SCR@ +EXTRA_SCRIPTS = gimpprint-config + +lib_LTLIBRARIES = @MAIN_BIN@ +EXTRA_LTLIBRARIES = libgimpprint.la + +libgimpprint_la_SOURCES = \ + gimp-print-internal.h \ + print-lexmark.c \ + print-canon.c \ + print-dither.c \ + print-escp2.c \ + print-pcl.c \ + print-ps.c \ + print-util.c \ + print-color.c \ + print-weave.c \ + print-version.c \ + print-dither-matrices.c \ + quickmatrix257.h \ + ran.367.179.h \ + ran.509.131.h +libgimpprint_la_LIBADD = $(GIMPPRINT_DEPLIBS) +# Uncommment to build an unversioned library (version in soname) +#libgimpprint_la_LDFLAGS = -release $(GIMPPRINT_VERSION) -rpath $(libdir) +# Uncomment to build a versioned library +libgimpprint_la_LDFLAGS = \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -rpath $(libdir) + + +## Data + +MAIN_DAT = gimpprint.m4 + +m4datadir = $(datadir)/aclocal +m4data_DATA = @MAIN_DAT@ + + +## Rules + +print-util.lo: print-printers.c $(srcdir)/print-util.c + +print-printers.c: ../printdef/printdef $(srcdir)/printers.xml + ../printdef/printdef < $(srcdir)/printers.xml > print-printers.c + +printdefl.o: printdefy.o + +../printdef/printdef: $(addprefix ../printdef/, printdefl.l printdefy.y printdef.h) + cd ../printdef ; \ + $(MAKE) + + +## Clean + +CLEANFILES = print-printers.c +DISTCLEANFILES = gimpprint-config +MAINTAINERCLEANFILES = Makefile.in + +EXTRA_DIST = gimpprint.m4 gimpprint-config.in printers.xml diff --git a/src/main/gimp-print-internal.h b/src/main/gimp-print-internal.h new file mode 100644 index 0000000..1784c50 --- /dev/null +++ b/src/main/gimp-print-internal.h @@ -0,0 +1,524 @@ +/* + * "$Id: gimp-print-internal.h,v 1.43 2001/09/08 17:19:31 rlk Exp $" + * + * Print plug-in header file for the GIMP. + * + * Copyright 1997-2000 Michael Sweet (mike@easysw.com) and + * Robert Krawitz (rlk@alum.mit.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Revision History: + * + * See ChangeLog + */ + +/* + * This file must include only standard C header files. The core code must + * compile on generic platforms that don't support glib, gimp, gtk, etc. + */ + +#ifndef _GIMP_PRINT_INTERNAL_H_ +#define _GIMP_PRINT_INTERNAL_H_ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifndef HAVE_ASPRINTF +#if defined(HAVE_VARARGS_H) && !defined(HAVE_STDARG_H) +#include +#else +#include +#endif +extern int vasprintf (char **result, const char *format, va_list args); +extern int asprintf (char **result, const char *format, ...); +#endif + +/* + * ECOLOR_K must be 0 + */ +#define ECOLOR_K 0 +#define ECOLOR_C 1 +#define ECOLOR_M 2 +#define ECOLOR_Y 3 +#define NCOLORS (4) +#define NCHANNELS (7) +#define MAX_WEAVE (8) + +typedef struct +{ + double value; + unsigned bit_pattern; + int is_dark; + unsigned dot_size; +} stp_simple_dither_range_t; + +typedef struct +{ + double value; + double lower; + double upper; + unsigned bit_pattern; + int is_dark; + unsigned dot_size; +} stp_dither_range_t; + +typedef struct +{ + double value[2]; + unsigned bits[2]; + int isdark[2]; +} stp_full_dither_range_t; + +typedef struct /* Weave parameters for a specific row */ +{ + int row; /* Absolute row # */ + int pass; /* Computed pass # */ + int jet; /* Which physical nozzle we're using */ + int missingstartrows; /* Phantom rows (nonexistent rows that */ + /* would be printed by nozzles lower than */ + /* the first nozzle we're using this pass; */ + /* with the current algorithm, always zero */ + int logicalpassstart; /* Offset in rows (from start of image) */ + /* that the printer must be for this row */ + /* to print correctly with the specified jet */ + int physpassstart; /* Offset in rows to the first row printed */ + /* in this pass. Currently always equal to */ + /* logicalpassstart */ + int physpassend; /* Offset in rows (from start of image) to */ + /* the last row that will be printed this */ + /* pass (assuming that we're printing a full */ + /* pass). */ +} stp_weave_t; + +typedef struct /* Weave parameters for a specific pass */ +{ + int pass; /* Absolute pass number */ + int missingstartrows; /* All other values the same as weave_t */ + int logicalpassstart; + int physpassstart; + int physpassend; + int subpass; +} stp_pass_t; + +typedef union { /* Offsets from the start of each line */ + unsigned long v[NCHANNELS]; /* (really pass) */ + struct { + unsigned long k; + unsigned long m; + unsigned long c; + unsigned long y; + unsigned long M; + unsigned long C; + unsigned long Y; + } p; +} stp_lineoff_t; + +typedef union { /* Is this line active? */ + char v[NCHANNELS]; /* (really pass) */ + struct { + char k; + char m; + char c; + char y; + char M; + char C; + char Y; + } p; +} stp_lineactive_t; + +typedef union { /* number of rows for a pass */ + int v[NCHANNELS]; /* (really pass) */ + struct { + int k; + int m; + int c; + int y; + int M; + int C; + int Y; + } p; +} stp_linecount_t; + + +typedef union { /* Base pointers for each pass */ + unsigned char *v[NCHANNELS]; + struct { + unsigned char *k; + unsigned char *m; + unsigned char *c; + unsigned char *y; + unsigned char *M; + unsigned char *C; + unsigned char *Y; + } p; +} stp_linebufs_t; + +typedef struct stp_softweave +{ + stp_linebufs_t *linebases; /* Base address of each row buffer */ + stp_lineoff_t *lineoffsets; /* Offsets within each row buffer */ + stp_lineactive_t *lineactive; /* Does this line have anything printed? */ + stp_linecount_t *linecounts; /* How many rows we've printed this pass */ + stp_pass_t *passes; /* Circular list of pass numbers */ + int last_pass_offset; /* Starting row (offset from the start of */ + /* the page) of the most recently printed */ + /* pass (so we can determine how far to */ + /* advance the paper) */ + int last_pass; /* Number of the most recently printed pass */ + + int jets; /* Number of jets per color */ + int virtual_jets; /* Number of jets per color, taking into */ + /* account the head offset */ + int separation; /* Offset from one jet to the next in rows */ + void *weaveparm; /* Weave calculation parameter block */ + + int horizontal_weave; /* Number of horizontal passes required */ + /* This is > 1 for some of the ultra-high */ + /* resolution modes */ + int vertical_subpasses; /* Number of passes per line (for better */ + /* quality) */ + int vmod; /* Number of banks of passes */ + int oversample; /* Excess precision per row */ + int repeat_count; /* How many times a pass is repeated */ + int ncolors; /* How many colors (1, 4, or 6) */ + int linewidth; /* Line width in input pixels */ + int vertical_height; /* Image height in output pixels */ + int firstline; /* Actual first line (referenced to paper) */ + + int bitwidth; /* Bits per pixel */ + int lineno; + int vertical_oversample; /* Vertical oversampling */ + int current_vertical_subpass; + int separation_rows; /* Vertical spacing between rows. */ + /* This is used for the 1520/3000, which */ + /* use a funny value for the "print density */ + /* in the vertical direction". */ + int horizontal_width; /* Horizontal width, in bits */ + int last_color; + int head_offset[NCHANNELS]; /* offset of printheads */ + unsigned char *s[MAX_WEAVE]; + unsigned char *fold_buf; + unsigned char *comp_buf; + stp_weave_t wcache; + int rcache; + int vcache; + stp_vars_t v; + void (*flushfunc)(struct stp_softweave *sw, int passno, int model, + int width, int hoffset, int ydpi, int xdpi, + int physical_xdpi, int vertical_subpass); + void (*fill_start)(struct stp_softweave *sw, int row, int subpass, + int width, int missingstartrows, int color); + int (*pack)(const unsigned char *in, int bytes, + unsigned char *out, unsigned char **optr); + int (*compute_linewidth)(const struct stp_softweave *sw, int n); +} stp_softweave_t; + +typedef struct stp_dither_matrix_short +{ + int x; + int y; + int bytes; + int prescaled; + const unsigned short *data; +} stp_dither_matrix_short_t; + +typedef struct stp_dither_matrix_normal +{ + int x; + int y; + int bytes; + int prescaled; + const unsigned *data; +} stp_dither_matrix_normal_t; + +typedef struct stp_dither_matrix +{ + int x; + int y; + int bytes; + int prescaled; + const void *data; +} stp_dither_matrix_t; + +extern const stp_dither_matrix_short_t stp_1_1_matrix; +extern const stp_dither_matrix_short_t stp_2_1_matrix; +extern const stp_dither_matrix_short_t stp_4_1_matrix; + +/* + * Prototypes... + */ + +extern void stp_set_driver_data (stp_vars_t vv, void * val); +extern void * stp_get_driver_data (const stp_vars_t vv); + +extern void stp_set_verified(stp_vars_t vv, int value); +extern int stp_get_verified(stp_vars_t vv); + +extern void stp_copy_options(stp_vars_t vd, const stp_vars_t vs); + +extern void stp_default_media_size(const stp_printer_t printer, + const stp_vars_t v, int *width, + int *height); + +extern void * stp_init_dither(int in_width, int out_width, + int horizontal_aspect, + int vertical_aspect, stp_vars_t vars); +extern void stp_dither_set_iterated_matrix(void *vd, size_t edge, + size_t iterations, + const unsigned *data, + int prescaled, + int x_shear, int y_shear); +extern void stp_dither_set_matrix(void *vd, const stp_dither_matrix_t *mat, + int transpose, int x_shear, int y_shear); +extern void stp_dither_set_transition(void *vd, double); +extern void stp_dither_set_density(void *vd, double); +extern void stp_dither_set_black_density(void *vd, double); +extern void stp_dither_set_black_lower(void *vd, double); +extern void stp_dither_set_black_upper(void *vd, double); +extern void stp_dither_set_black_level(void *vd, int color, double); +extern void stp_dither_set_randomizer(void *vd, int color, double); +extern void stp_dither_set_ink_darkness(void *vd, int color, double); +extern void stp_dither_set_light_ink(void *vd, int color, double, double); +extern void stp_dither_set_ranges(void *vd, int color, int nlevels, + const stp_simple_dither_range_t *ranges, + double density); +extern void stp_dither_set_ranges_full(void *vd, int color, int nlevels, + const stp_full_dither_range_t *ranges, + double density); +extern void stp_dither_set_ranges_simple(void *vd, int color, int nlevels, + const double *levels, + double density); +extern void stp_dither_set_ranges_complete(void *vd, int color, int nlevels, + const stp_dither_range_t *ranges); +extern void stp_dither_set_ink_spread(void *vd, int spread); +extern void stp_dither_set_x_oversample(void *vd, int os); +extern void stp_dither_set_y_oversample(void *vd, int os); +extern void stp_dither_set_adaptive_limit(void *vd, double limit); +extern int stp_dither_get_first_position(void *vd, int color, int dark); +extern int stp_dither_get_last_position(void *vd, int color, int dark); + + +extern void stp_free_dither(void *); + + +extern void stp_dither(const unsigned short *, int, void *, + unsigned char *, + unsigned char *, unsigned char *, + unsigned char *, unsigned char *, + unsigned char *, unsigned char *, + int duplicate_line, int zero_mask); + +extern void stp_fold(const unsigned char *line, int single_height, + unsigned char *outbuf); + +extern void stp_split_2(int height, int bits, const unsigned char *in, + unsigned char *outhi, unsigned char *outlo); + +extern void stp_split_4(int height, int bits, const unsigned char *in, + unsigned char *out0, unsigned char *out1, + unsigned char *out2, unsigned char *out3); + +extern void stp_unpack_2(int height, int bits, const unsigned char *in, + unsigned char *outlo, unsigned char *outhi); + +extern void stp_unpack_4(int height, int bits, const unsigned char *in, + unsigned char *out0, unsigned char *out1, + unsigned char *out2, unsigned char *out3); + +extern void stp_unpack_8(int height, int bits, const unsigned char *in, + unsigned char *out0, unsigned char *out1, + unsigned char *out2, unsigned char *out3, + unsigned char *out4, unsigned char *out5, + unsigned char *out6, unsigned char *out7); + +extern int stp_pack_tiff(const unsigned char *line, int height, + unsigned char *comp_buf, + unsigned char **comp_ptr); + +extern int stp_pack_uncompressed(const unsigned char *line, int height, + unsigned char *comp_buf, + unsigned char **comp_ptr); + +extern void *stp_initialize_weave(int jets, int separation, int oversample, + int horizontal, int vertical, + int ncolors, int width, int linewidth, + int lineheight, int vertical_row_separation, + int first_line, int phys_lines, int strategy, + int *head_offset, /* Get from model - used for 480/580 printers */ + stp_vars_t v, + void (*flushfunc)(stp_softweave_t *sw, + int passno, int model, + int width, int hoffset, + int ydpi, int xdpi, + int physical_xdpi, + int vertical_subpass), + void (*fill_start)(stp_softweave_t *sw, + int row, + int subpass, int width, + int missingstartrows, + int vertical_subpass), + int (*pack)(const unsigned char *in, + int bytes, unsigned char *out, + unsigned char **optr), + int (*compute_linewidth)(const stp_softweave_t *sw, + int n)); + +extern void stp_fill_tiff(stp_softweave_t *sw, int row, int subpass, + int width, int missingstartrows, int color); +extern void stp_fill_uncompressed(stp_softweave_t *sw, int row, int subpass, + int width, int missingstartrows, int color); + +extern int stp_compute_tiff_linewidth(const stp_softweave_t *sw, int n); +extern int stp_compute_uncompressed_linewidth(const stp_softweave_t *sw, int n); + + + +extern void stp_flush_all(void *, int model, int width, int hoffset, + int ydpi, int xdpi, int physical_xdpi); + +extern void +stp_write_weave(void * vsw, + int length, /* I - Length of bitmap data */ + int ydpi, /* I - Vertical resolution */ + int model, /* I - Printer model */ + int width, /* I - Printed width */ + int offset, /* I - Offset from left side of page */ + int xdpi, + int physical_xdpi, + const unsigned char *cols[]); + +extern stp_lineoff_t * +stp_get_lineoffsets_by_pass(const stp_softweave_t *sw, int pass); + +extern stp_lineactive_t * +stp_get_lineactive_by_pass(const stp_softweave_t *sw, int pass); + +extern stp_linecount_t * +stp_get_linecount_by_pass(const stp_softweave_t *sw, int pass); + +extern const stp_linebufs_t * +stp_get_linebases_by_pass(const stp_softweave_t *sw, int pass); + +extern stp_pass_t * +stp_get_pass_by_pass(const stp_softweave_t *sw, int pass); + +extern void +stp_weave_parameters_by_row(const stp_softweave_t *sw, int row, + int vertical_subpass, stp_weave_t *w); + +extern void stp_destroy_weave(void *); + +extern void stp_destroy_weave_params(void *vw); + +extern int +stp_verify_printer_params(const stp_printer_t, const stp_vars_t); + +extern void stp_zprintf(const stp_vars_t v, const char *format, ...); + +extern void stp_zfwrite(const char *buf, size_t bytes, size_t nitems, + const stp_vars_t v); + +extern void stp_putc(int ch, const stp_vars_t v); +extern void stp_erputc(int ch); + +extern void stp_puts(const char *s, const stp_vars_t v); + +extern void stp_eprintf(const stp_vars_t v, const char *format, ...); +extern void stp_erprintf(const char *format, ...); + +#define STP_DBG_LUT 0x1 +#define STP_DBG_COLORFUNC 0x2 +#define STP_DBG_INK 0x4 +#define STP_DBG_PS 0x8 +#define STP_DBG_PCL 0x10 +#define STP_DBG_ESCP2 0x20 +#define STP_DBG_CANON 0x40 +#define STP_DBG_LEXMARK 0x80 +#define STP_DBG_WEAVE_PARAMS 0x100 +#define STP_DBG_ROWS 0x200 +extern void stp_dprintf(unsigned long level, const stp_vars_t v, + const char *format, ...); +extern void stp_deprintf(unsigned long level, const char *format, ...); + +extern void *stp_malloc (size_t); +extern void stp_free(void *ptr); + +/* Uncomment the next line to get performance statistics: + * look for QUANT(#) in the code. At the end of escp2-print + * run, it will print out how long and how many time did + * certain pieces of code take. Of course, don't forget about + * overhead of call to gettimeofday - it's not zero. + * If you need more detailed performance stats, just put + * QUANT() calls in the interesting spots in the code */ +/*#define QUANTIFY*/ +#ifdef QUANTIFY +#include +#include +#include +#else +#define QUANT(n) +#endif + +#ifdef QUANTIFY +/* Used for performance analysis - to be called before and after + * the interval to be quantified */ +#define NUM_QUANTIFY_BUCKETS 1024 +extern unsigned quantify_counts[NUM_QUANTIFY_BUCKETS]; +extern struct timeval quantify_buckets[NUM_QUANTIFY_BUCKETS]; +extern int quantify_high_index; +extern int quantify_first_time; +extern struct timeval quantify_cur_time; +extern struct timeval quantify_prev_time; + +#define QUANT(number) \ +{\ + gettimeofday(&quantify_cur_time, NULL);\ + assert(number < NUM_QUANTIFY_BUCKETS);\ + quantify_counts[number]++;\ +\ + if (quantify_first_time) {\ + quantify_first_time = 0;\ + } else {\ + if (number > quantify_high_index) quantify_high_index = number;\ + if (quantify_prev_time.tv_usec > quantify_cur_time.tv_usec) {\ + quantify_buckets[number].tv_usec += ((quantify_cur_time.tv_usec + 1000000) - quantify_prev_time.tv_usec);\ + quantify_buckets[number].tv_sec += (quantify_cur_time.tv_sec - quantify_prev_time.tv_sec - 1);\ + } else {\ + quantify_buckets[number].tv_sec += quantify_cur_time.tv_sec - quantify_prev_time.tv_sec;\ + quantify_buckets[number].tv_usec += quantify_cur_time.tv_usec - quantify_prev_time.tv_usec;\ + }\ + if (quantify_buckets[number].tv_usec >= 1000000)\ + {\ + quantify_buckets[number].tv_usec -= 1000000;\ + quantify_buckets[number].tv_sec++;\ + }\ + }\ +\ + gettimeofday(&quantify_prev_time, NULL);\ +} + +extern void print_timers(void ); +#endif + +#ifdef __cplusplus + } +#endif + +#endif /* _GIMP_PRINT_INTERNAL_H_ */ +/* + * End of "$Id: gimp-print-internal.h,v 1.43 2001/09/08 17:19:31 rlk Exp $". + */ diff --git a/src/main/gimpprint-config.in b/src/main/gimpprint-config.in new file mode 100644 index 0000000..48835d8 --- /dev/null +++ b/src/main/gimpprint-config.in @@ -0,0 +1,93 @@ +#!/bin/sh + +gimpprint_libs="@gimpprint_libs@" +gimpprint_cflags="@gimpprint_cflags@" + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +exec_prefix_set=no + +usage() +{ + cat <&2 +fi + +lib_gimpprint=yes + +while test $# -gt 0; do + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + case $1 in + --prefix=*) + prefix=$optarg + if test $exec_prefix_set = no ; then + exec_prefix=$optarg + fi + ;; + --prefix) + echo_prefix=yes + ;; + --exec-prefix=*) + exec_prefix=$optarg + exec_prefix_set=yes + ;; + --exec-prefix) + echo_exec_prefix=yes + ;; + --version) + echo @GIMPPRINT_MAJOR_VERSION@.@GIMPPRINT_MINOR_VERSION@.@GIMPPRINT_MICRO_VERSION@ + ;; + --cflags) + echo_cflags=yes + ;; + --libs) + echo_libs=yes + ;; + gimpprint) + lib_gimpprint=yes + ;; + *) + usage 1 1>&2 + ;; + esac + shift +done + +if test "$echo_prefix" = "yes"; then + echo $prefix +fi + +if test "$echo_exec_prefix" = "yes"; then + echo $exec_prefix +fi + +if test "$echo_cflags" = "yes"; then + if test @includedir@ != /usr/include ; then + includes=-I@includedir@ + fi + echo $includes $gimpprint_cflags +fi + +if test "$echo_libs" = "yes"; then + libdirs=-L@libdir@ + echo $libdirs $gimpprint_libs @INTLLIBS@ +fi + diff --git a/src/main/gimpprint.m4 b/src/main/gimpprint.m4 new file mode 100644 index 0000000..c8509e9 --- /dev/null +++ b/src/main/gimpprint.m4 @@ -0,0 +1,189 @@ +# Configure paths for gimp-print +# Roger Leigh -- Sat, 10 Feb 2001 +# (based on gimpprint.m4 by Owen Taylor 97-11-3) + +dnl AM_PATH_GIMPPRINT([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) +dnl Test for GIMP-PRINT, and define GIMPPRINT_CFLAGS and GIMPPRINT_LIBS +dnl +AC_DEFUN(AM_PATH_GIMPPRINT, +[dnl +dnl Get the cflags and libraries from the gimpprint-config script +dnl +AC_ARG_WITH(gimpprint-prefix,[ --with-gimpprint-prefix=PFX Prefix where GIMP-PRINT is installed (optional)], + gimpprint_config_prefix="$withval", gimpprint_config_prefix="") +AC_ARG_WITH(gimpprint-exec-prefix,[ --with-gimpprint-exec-prefix=PFX Exec prefix where GIMP-PRINT is installed + (optional)], + gimpprint_config_exec_prefix="$withval", gimpprint_config_exec_prefix="") +AC_ARG_ENABLE(gimpprinttest, [ --disable-gimpprinttest Do not try to compile and run a test GIMP-PRINT + program], + , enable_gimpprinttest=yes) + + if test x$gimpprint_config_exec_prefix != x ; then + gimpprint_config_args="$gimpprint_config_args --exec-prefix=$gimpprint_config_exec_prefix" + if test x${GIMPPRINT_CONFIG+set} != xset ; then + GIMPPRINT_CONFIG=$gimpprint_config_exec_prefix/bin/gimpprint-config + fi + fi + if test x$gimpprint_config_prefix != x ; then + gimpprint_config_args="$gimpprint_config_args --prefix=$gimpprint_config_prefix" + if test x${GIMPPRINT_CONFIG+set} != xset ; then + GIMPPRINT_CONFIG=$gimpprint_config_prefix/bin/gimpprint-config + fi + fi + + AC_PATH_PROG(GIMPPRINT_CONFIG, gimpprint-config, no) + min_gimpprint_version=ifelse([$1], ,4.1.4,$1) + AC_MSG_CHECKING(for GIMP-PRINT - version >= $min_gimpprint_version) + no_gimpprint="" + if test "$GIMPPRINT_CONFIG" = "no" ; then + no_gimpprint=yes + else + GIMPPRINT_CFLAGS=`$GIMPPRINT_CONFIG $gimpprint_config_args --cflags` + GIMPPRINT_LIBS=`$GIMPPRINT_CONFIG $gimpprint_config_args --libs` + gimpprint_config_major_version=`$GIMPPRINT_CONFIG $gimpprint_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + gimpprint_config_minor_version=`$GIMPPRINT_CONFIG $gimpprint_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + gimpprint_config_micro_version=`$GIMPPRINT_CONFIG $gimpprint_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_gimpprinttest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GIMPPRINT_CFLAGS" + LIBS="$GIMPPRINT_LIBS $LIBS" +dnl +dnl Now check if the installed GIMP-PRINT is sufficiently new. (Also sanity +dnl checks the results of gimpprint-config to some extent +dnl + rm -f conf.gimpprinttest + AC_TRY_RUN([ +#include +#include +#include + +int +main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.gimpprinttest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = strdup("$min_gimpprint_version"); + if (!tmp_version) { + exit(1); + } + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_gimpprint_version"); + exit(1); + } + + if ((gimpprint_major_version != $gimpprint_config_major_version) || + (gimpprint_minor_version != $gimpprint_config_minor_version) || + (gimpprint_micro_version != $gimpprint_config_micro_version)) + { + printf("\n*** 'gimpprint-config --version' returned %d.%d.%d, but GIMP-PRINT (%d.%d.%d)\n", + $gimpprint_config_major_version, $gimpprint_config_minor_version, $gimpprint_config_micro_version, + gimpprint_major_version, gimpprint_minor_version, gimpprint_micro_version); + printf ("*** was found! If gimpprint-config was correct, then it is best\n"); + printf ("*** to remove the old version of GIMP-PRINT. You may also be able to fix the\n"); + printf("*** error by modifying your LD_LIBRARY_PATH enviroment variable, or by\n"); + printf("*** editing /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If gimpprint-config was wrong, set the environment variable GIMPPRINT_CONFIG\n"); + printf("*** to point to the correct copy of gimpprint-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + } +#if defined (GIMPPRINT_MAJOR_VERSION) && defined (GIMPPRINT_MINOR_VERSION) && defined (GIMPPRINT_MICRO_VERSION) + else if ((gimpprint_major_version != GIMPPRINT_MAJOR_VERSION) || + (gimpprint_minor_version != GIMPPRINT_MINOR_VERSION) || + (gimpprint_micro_version != GIMPPRINT_MICRO_VERSION)) + { + printf("\n*** GIMP-PRINT header files (version %d.%d.%d) do not match\n", + GIMPPRINT_MAJOR_VERSION, GIMPPRINT_MINOR_VERSION, GIMPPRINT_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + gimpprint_major_version, gimpprint_minor_version, gimpprint_micro_version); + } +#endif /* defined (GIMPPRINT_MAJOR_VERSION) ... */ + else + { + if ((gimpprint_major_version > major) || + ((gimpprint_major_version == major) && (gimpprint_minor_version > minor)) || + ((gimpprint_major_version == major) && (gimpprint_minor_version == minor) && (gimpprint_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of GIMP-PRINT (%d.%d.%d) was found.\n", + gimpprint_major_version, gimpprint_minor_version, gimpprint_micro_version); + printf("*** You need a version of GIMP-PRINT newer than %d.%d.%d. The latest version of\n", + major, minor, micro); + printf("*** GIMP-PRINT is always available from\n"); + printf("*** http://sourceforge.net/project/showfiles.php?group_id=1537.\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the gimpprint-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of GIMP-PRINT, but you can also set the GIMPPRINT_CONFIG environment to\n"); + printf("*** point to the correct copy of gimpprint-config. (In this case, you will have\n"); + printf("*** to modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} +],, no_gimpprint=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_gimpprint" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$GIMPPRINT_CONFIG" = "no" ; then + echo "*** The gimpprint-config script installed by GIMP-PRINT could not be found" + echo "*** If GIMP-PRINT was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the GIMPPRINT_CONFIG environment variable to the" + echo "*** full path to gimpprint-config." + else + if test -f conf.gimpprinttest ; then + : + else + echo "*** Could not run GIMP-PRINT test program, checking why..." + CFLAGS="$CFLAGS $GIMPPRINT_CFLAGS" + LIBS="$LIBS $GIMPPRINT_LIBS" + AC_TRY_LINK([ +#include +#include +#include +], [ return ((gimpprint_major_version) || (gimpprint_minor_version) || (gimpprint_micro_version)); ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GIMP-PRINT or finding the wrong" + echo "*** version of GIMP-PRINT. If it is not finding GIMP-PRINT, you'll need to set" + echo "*** your LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GIMP-PRINT was incorrectly" + echo "*** installed or that you have moved GIMP-PRINT since it was installed. In the" + echo "*** latter case, you may want to edit the gimpprint-config script:" + echo "*** $GIMPPRINT_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GIMPPRINT_CFLAGS="" + GIMPPRINT_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GIMPPRINT_CFLAGS) + AC_SUBST(GIMPPRINT_LIBS) + rm -f conf.gimpprinttest +]) diff --git a/src/main/print-canon.c b/src/main/print-canon.c new file mode 100644 index 0000000..fc5425e --- /dev/null +++ b/src/main/print-canon.c @@ -0,0 +1,3103 @@ +/* + * "$Id: print-canon.c,v 1.71 2001/10/27 17:16:39 rlk Exp $" + * + * Print plug-in CANON BJL driver for the GIMP. + * + * Copyright 1997-2000 Michael Sweet (mike@easysw.com), + * Robert Krawitz (rlk@alum.mit.edu) and + * Andy Thaller (thaller@ph.tum.de) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + * This file must include only standard C header files. The core code must + * compile on generic platforms that don't support glib, gimp, gtk, etc. + */ + +/* + * Large parts of this file (mainly the ink handling) is based on + * print-escp2.c -- refer to README.new-printer on how to adjust the colors + * for a certain model. + */ + +/* TODO-LIST + * + * * adjust the colors of all supported models + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include "gimp-print-internal.h" +#include +#include +#include +#if defined(HAVE_VARARGS_H) && !defined(HAVE_STDARG_H) +#include +#else +#include +#endif + +#if (0) +#define EXPERIMENTAL_STUFF 0 +#endif + +#define MAX_CARRIAGE_WIDTH 13 /* This really needs to go away */ + +/* + * We really need to get away from this silly static nonsense... + */ +#define MAX_PHYSICAL_BPI 1440 +#define MAX_OVERSAMPLED 8 +#define MAX_BPP 4 +#define BITS_PER_BYTE 8 +#define COMPBUFWIDTH (MAX_PHYSICAL_BPI * MAX_OVERSAMPLED * MAX_BPP * \ + MAX_CARRIAGE_WIDTH / BITS_PER_BYTE) + +#define USE_3BIT_FOLD_TYPE 323 + +/* + * For each printer, we can select from a variety of dot sizes. + * For single dot size printers, the available sizes are usually 0, + * which is the "default", and some subset of 1-4. For simple variable + * dot size printers (with only one kind of variable dot size), the + * variable dot size is specified as 0x10. For newer printers, there + * is a choice of variable dot sizes available, 0x10, 0x11, and 0x12 in + * order of increasing size. + * + * Normally, we want to specify the smallest dot size that lets us achieve + * a density of less than .8 or thereabouts (above that we start to get + * some dither artifacts). This needs to be tested for each printer and + * resolution. + * + * An entry of -1 in a slot means that this resolution is not available. + * 0 standard dot sizes are used. + * 1 drop modulation is used. + */ + +/* We know a per-model base resolution (like 180dpi or 150dpi) + * and multipliers for the base resolution in the dotsize-, densities- + * and inklist: + * for 180dpi base resolution we would have + * s_r11_4 for 4color ink @180dpi + * s_r22_4 for 4color ink @360dpi + * s_r33_4 for 4color ink @720dpi + * s_r43_4 for 4color ink @1440x720dpi + */ + +typedef struct canon_dot_sizes +{ + int dot_r11; /* 180x180 or 150x150 */ + int dot_r22; /* 360x360 or 300x300 */ + int dot_r33; /* 720x720 or 600x600 */ + int dot_r43; /* 1440x720 or 1200x600 */ + int dot_r44; /* 1440x1440 or 1200x1200 */ + int dot_r55; /* 2880x2880 or 2400x2400 */ +} canon_dot_size_t; + +/* + * Specify the base density for each available resolution. + * + */ + +typedef struct canon_densities +{ + double d_r11; /* 180x180 or 150x150 */ + double d_r22; /* 360x360 or 300x300 */ + double d_r33; /* 720x720 or 600x600 */ + double d_r43; /* 1440x720 or 1200x600 */ + double d_r44; /* 1440x1440 or 1200x1200 */ + double d_r55; /* 2880x2880 or 2400x2400 */ +} canon_densities_t; + + + +/* + * Definition of the multi-level inks available to a given printer. + * Each printer may use a different kind of ink droplet for variable + * and single drop size for each supported horizontal resolution and + * type of ink (4 or 6 color). + * + * Recall that 6 color ink is treated as simply another kind of + * multi-level ink, but the driver offers the user a choice of 4 and + * 6 color ink, so we need to define appropriate inksets for both + * kinds of ink. + * + * Stuff like the MIS 4 and 6 "color" monochrome inks doesn't fit into + * this model very nicely, so we'll either have to special case it + * or find some way of handling it in here. + */ + +typedef struct canon_variable_ink +{ + const stp_simple_dither_range_t *range; + int count; + double density; +} canon_variable_ink_t; + +typedef struct canon_variable_inkset +{ + const canon_variable_ink_t *c; + const canon_variable_ink_t *m; + const canon_variable_ink_t *y; + const canon_variable_ink_t *k; +} canon_variable_inkset_t; + +/* + * currenty unaccounted for are the 7color printers and the 3color ones + * (which use CMY only printheads) + * + */ + +typedef struct canon_variable_inklist +{ + const int bits; + const int colors; + const canon_variable_inkset_t *r11; /* 180x180 or 150x150 */ + const canon_variable_inkset_t *r22; /* 360x360 or 300x300 */ + const canon_variable_inkset_t *r33; /* 720x720 or 600x600 */ + const canon_variable_inkset_t *r43; /* 1440x720 or 1200x600 */ + const canon_variable_inkset_t *r44; /* 1440x1440 or 1200x1200 */ + const canon_variable_inkset_t *r55; /* 2880x2880 or 2400x2400 */ +} canon_variable_inklist_t; + + +#ifdef EXPERIMENTAL_STUFF +/* + * A printmode is defined by its resolution (xdpi x ydpi), the bits per pixel + * and the installed printhead. + * + * For a hereby defined printmode we specify the density and gamma multipliers + * and the ink definition with optional adjustments for lum, hue and sat + * + */ +typedef struct canon_variable_printmode +{ + const int xdpi; /* horizontal resolution */ + const int ydpi; /* vertical resolution */ + const int bits; /* bits per pixel */ + const int printhead; /* installed printhead */ + const int quality; /* maximum init-quality */ + const double density; /* density multiplier */ + const double gamma; /* gamma multiplier */ + const canon_variable_inkset_t *inks; /* ink definition */ + const double *lum_adjustment; /* optional lum adj. */ + const double *hue_adjustment; /* optional hue adj. */ + const double *sat_adjustment; /* optional sat adj. */ +} canon_variable_printmode_t; +#endif + +/* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE + * + * The following dither ranges were taken from print-escp2.c and do NOT + * represent the requirements of canon inks. Feel free to play with them + * accoring to the escp2 part of doc/README.new-printer and send me a patch + * if you get better results. Please send mail to thaller@ph.tum.de + */ + +/* + * Dither ranges specifically for Cyan/LightCyan (see NOTE above) + * + */ +static const stp_simple_dither_range_t canon_dither_ranges_Cc_1bit[] = +{ + { 0.25, 0x1, 0, 1 }, + { 1.0, 0x1, 1, 1 } +}; + +static const canon_variable_ink_t canon_ink_Cc_1bit = +{ + canon_dither_ranges_Cc_1bit, + sizeof(canon_dither_ranges_Cc_1bit) / sizeof(stp_simple_dither_range_t), + .75 +}; + +/* + * Dither ranges specifically for Magenta/LightMagenta (see NOTE above) + * + */ +static const stp_simple_dither_range_t canon_dither_ranges_Mm_1bit[] = +{ + { 0.26, 0x1, 0, 1 }, + { 1.0, 0x1, 1, 1 } +}; + +static const canon_variable_ink_t canon_ink_Mm_1bit = +{ + canon_dither_ranges_Mm_1bit, + sizeof(canon_dither_ranges_Mm_1bit) / sizeof(stp_simple_dither_range_t), + .75 +}; + + +/* + * Dither ranges specifically for any Color and 2bit/pixel (see NOTE above) + * + */ +static const stp_simple_dither_range_t canon_dither_ranges_X_2bit[] = +{ + { 0.45, 0x1, 1, 1 }, + { 0.68, 0x2, 1, 2 }, + { 1.0, 0x3, 1, 3 } +}; + +static const canon_variable_ink_t canon_ink_X_2bit = +{ + canon_dither_ranges_X_2bit, + sizeof(canon_dither_ranges_X_2bit) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + +/* + * Dither ranges specifically for any Color/LightColor and 2bit/pixel + * (see NOTE above) + */ +static const stp_simple_dither_range_t canon_dither_ranges_Xx_2bit[] = +{ + { 0.15, 0x1, 0, 1 }, + { 0.227, 0x2, 0, 2 }, +/* { 0.333, 0x3, 0, 3 }, */ + { 0.45, 0x1, 1, 1 }, + { 0.68, 0x2, 1, 2 }, + { 1.0, 0x3, 1, 3 } +}; + +static const canon_variable_ink_t canon_ink_Xx_2bit = +{ + canon_dither_ranges_Xx_2bit, + sizeof(canon_dither_ranges_Xx_2bit) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + +/* + * Dither ranges specifically for any Color and 3bit/pixel + * (see NOTE above) + * + * BIG NOTE: The bjc8200 has this kind of ink. One Byte seems to hold + * drop sizes for 3 pixels in a 3/2/2 bit fashion. + * Size values for 3bit-sized pixels range from 1 to 7, + * size values for 2bit-sized picels from 1 to 3 (kill msb). + * + * + */ +static const stp_simple_dither_range_t canon_dither_ranges_X_3bit[] = +{ + { 0.45, 0x1, 1, 1 }, + { 0.55, 0x2, 1, 2 }, + { 0.66, 0x3, 1, 3 }, + { 0.77, 0x4, 1, 4 }, + { 0.88, 0x5, 1, 5 }, + { 1.0, 0x6, 1, 6 } +}; + +static const canon_variable_ink_t canon_ink_X_3bit = +{ + canon_dither_ranges_X_3bit, + sizeof(canon_dither_ranges_X_3bit) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + +/* + * Dither ranges specifically for any Color/LightColor and 3bit/pixel + * (see NOTE above) + */ +static const stp_simple_dither_range_t canon_dither_ranges_Xx_3bit[] = +{ + { 0.15, 0x1, 0, 1 }, + { 0.227, 0x2, 0, 2 }, + { 0.333, 0x3, 0, 3 }, +/* { 0.333, 0x3, 0, 3 }, */ + { 0.45, 0x1, 1, 1 }, + { 0.55, 0x2, 1, 2 }, + { 0.66, 0x3, 1, 3 }, + { 0.77, 0x4, 1, 4 }, + { 0.88, 0x5, 1, 5 }, + { 1.0, 0x6, 1, 6 } +}; + +static const canon_variable_ink_t canon_ink_Xx_3bit = +{ + canon_dither_ranges_Xx_3bit, + sizeof(canon_dither_ranges_Xx_3bit) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + + +/* Inkset for printing in CMY and 1bit/pixel */ +static const canon_variable_inkset_t ci_CMY_1 = +{ + NULL, + NULL, + NULL, + NULL +}; + +/* Inkset for printing in CMY and 2bit/pixel */ +static const canon_variable_inkset_t ci_CMY_2 = +{ + &canon_ink_X_2bit, + &canon_ink_X_2bit, + &canon_ink_X_2bit, + NULL +}; + +/* Inkset for printing in CMYK and 1bit/pixel */ +static const canon_variable_inkset_t ci_CMYK_1 = +{ + NULL, + NULL, + NULL, + NULL +}; + +/* Inkset for printing in CcMmYK and 1bit/pixel */ +static const canon_variable_inkset_t ci_CcMmYK_1 = +{ + &canon_ink_Cc_1bit, + &canon_ink_Mm_1bit, + NULL, + NULL +}; + +/* Inkset for printing in CMYK and 2bit/pixel */ +static const canon_variable_inkset_t ci_CMYK_2 = +{ + &canon_ink_X_2bit, + &canon_ink_X_2bit, + &canon_ink_X_2bit, + &canon_ink_X_2bit +}; + +/* Inkset for printing in CcMmYK and 2bit/pixel */ +static const canon_variable_inkset_t ci_CcMmYK_2 = +{ + &canon_ink_Xx_2bit, + &canon_ink_Xx_2bit, + &canon_ink_X_2bit, + &canon_ink_X_2bit +}; + +/* Inkset for printing in CMYK and 3bit/pixel */ +static const canon_variable_inkset_t ci_CMYK_3 = +{ + &canon_ink_X_3bit, + &canon_ink_X_3bit, + &canon_ink_X_3bit, + &canon_ink_X_3bit +}; + +/* Inkset for printing in CcMmYK and 3bit/pixel */ +static const canon_variable_inkset_t ci_CcMmYK_3 = +{ + &canon_ink_Xx_3bit, + &canon_ink_Xx_3bit, + &canon_ink_X_3bit, + &canon_ink_X_3bit, +}; + + +typedef canon_variable_inklist_t* canon_variable_inklist_p; + +/* Ink set should be applicable for any CMYK based model */ +static const canon_variable_inklist_t canon_ink_standard[] = +{ + { + 1,4, + &ci_CMYK_1, &ci_CMYK_1, &ci_CMYK_1, + &ci_CMYK_1, &ci_CMYK_1, &ci_CMYK_1, + }, +}; + +/* Ink set for printers using CMY and CMY photo printing, 1 or 2bit/pixel */ +static const canon_variable_inklist_t canon_ink_oldphoto[] = +{ + { + 1,3, + &ci_CMY_1, &ci_CMY_1, &ci_CMY_1, + &ci_CMY_1, &ci_CMY_1, &ci_CMY_1, + }, + { + 2,3, + &ci_CMY_2, &ci_CMY_2, + &ci_CMY_2, &ci_CMY_2, + &ci_CMY_2, &ci_CMY_2, + }, +}; + +/* Ink set for printers using CMYK and CcMmYK printing, 1 or 2bit/pixel */ +static const canon_variable_inklist_t canon_ink_standardphoto[] = +{ + { + 1,4, + &ci_CMYK_1, &ci_CMYK_1, &ci_CMYK_1, + &ci_CMYK_1, &ci_CMYK_1, &ci_CMYK_1, + }, + { + 2,4, + &ci_CMYK_2, &ci_CMYK_2, + &ci_CMYK_2, &ci_CMYK_2, + &ci_CMYK_2, &ci_CMYK_2, + }, + { + 1,6, + &ci_CcMmYK_1, &ci_CcMmYK_1, &ci_CcMmYK_1, + &ci_CcMmYK_1, &ci_CcMmYK_1, &ci_CcMmYK_1, + }, + { + 2,6, + &ci_CcMmYK_2, &ci_CcMmYK_2, &ci_CcMmYK_2, + &ci_CcMmYK_2, &ci_CcMmYK_2, &ci_CcMmYK_2, + }, +}; + +/* Ink set for printers using CMYK and CcMmYK printing, 1 or 3bit/pixel */ +static const canon_variable_inklist_t canon_ink_superphoto[] = +{ + { + 1,4, + &ci_CMYK_1, &ci_CMYK_1, &ci_CMYK_1, + &ci_CMYK_1, &ci_CMYK_1, &ci_CMYK_1, + }, + { + 3,4, + &ci_CMYK_3, &ci_CMYK_3, &ci_CMYK_3, + &ci_CMYK_3, &ci_CMYK_3, &ci_CMYK_3, + }, + { + 3,6, + &ci_CcMmYK_3, &ci_CcMmYK_3, &ci_CcMmYK_3, + &ci_CcMmYK_3, &ci_CcMmYK_3, &ci_CcMmYK_3, + }, +}; + + +static const double standard_sat_adjustment[49] = +{ + 1.0, /* C */ + 1.1, + 1.2, + 1.3, + 1.4, + 1.5, + 1.6, + 1.7, + 1.8, /* B */ + 1.9, + 1.9, + 1.9, + 1.7, + 1.5, + 1.3, + 1.1, + 1.0, /* M */ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, /* R */ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, /* Y */ + 1.0, + 1.0, + 1.1, + 1.2, + 1.3, + 1.4, + 1.5, + 1.5, /* G */ + 1.4, + 1.3, + 1.2, + 1.1, + 1.0, + 1.0, + 1.0, + 1.0 /* C */ +}; + +static const double standard_lum_adjustment[49] = +{ + 0.50, /* C */ + 0.6, + 0.7, + 0.8, + 0.9, + 0.86, + 0.82, + 0.79, + 0.78, /* B */ + 0.8, + 0.83, + 0.87, + 0.9, + 0.95, + 1.05, + 1.15, + 1.3, /* M */ + 1.25, + 1.2, + 1.15, + 1.12, + 1.09, + 1.06, + 1.03, + 1.0, /* R */ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, /* Y */ + 0.9, + 0.8, + 0.7, + 0.65, + 0.6, + 0.55, + 0.52, + 0.48, /* G */ + 0.47, + 0.47, + 0.49, + 0.49, + 0.49, + 0.52, + 0.51, + 0.50 /* C */ +}; + +static const double standard_hue_adjustment[49] = +{ + 0.00, /* C */ + 0.05, + 0.04, + 0.01, + -0.03, + -0.10, + -0.18, + -0.26, + -0.35, /* B */ + -0.43, + -0.40, + -0.32, + -0.25, + -0.18, + -0.10, + -0.07, + 0.00, /* M */ + -0.04, + -0.09, + -0.13, + -0.18, + -0.23, + -0.27, + -0.31, + -0.35, /* R */ + -0.38, + -0.30, + -0.23, + -0.15, + -0.08, + 0.00, + -0.02, + 0.00, /* Y */ + 0.08, + 0.10, + 0.08, + 0.05, + 0.03, + -0.03, + -0.12, + -0.20, /* G */ + -0.17, + -0.20, + -0.17, + -0.15, + -0.12, + -0.10, + -0.08, + 0.00, /* C */ +}; + +typedef enum { + COLOR_MONOCHROME = 1, + COLOR_CMY = 3, + COLOR_CMYK = 4, + COLOR_CCMMYK= 6, + COLOR_CCMMYYK= 7 +} colormode_t; + +typedef struct canon_caps { + int model; /* model number as used in printers.xml */ + int model_id; /* model ID code for use in commands */ + int max_width; /* maximum printable paper size */ + int max_height; + int base_res; /* base resolution - shall be 150 or 180 */ + int max_xdpi; /* maximum horizontal resolution */ + int max_ydpi; /* maximum vertical resolution */ + int max_quality; + int border_left; /* left margin, points */ + int border_right; /* right margin, points */ + int border_top; /* absolute top margin, points */ + int border_bottom; /* absolute bottom margin, points */ + int inks; /* installable cartridges (CANON_INK_*) */ + int slots; /* available paperslots */ + unsigned long features; /* special bjl settings */ +#ifdef EXPERIMENTAL_STUFF + const canon_variable_printmode_t *printmodes; + int printmodes_cnt; +#else + int dummy; + const canon_dot_size_t dot_sizes; /* Vector of dot sizes for resolutions */ + const canon_densities_t densities; /* List of densities for each printer */ + const canon_variable_inklist_t *inxs; /* Choices of inks for this printer */ + int inxs_cnt; /* number of ink definitions in inxs */ +#endif + const double *lum_adjustment; + const double *hue_adjustment; + const double *sat_adjustment; +} canon_cap_t; + +static void canon_write_line(const stp_vars_t, const canon_cap_t *, int, + unsigned char *, int, + unsigned char *, int, + unsigned char *, int, + unsigned char *, int, + unsigned char *, int, + unsigned char *, int, + unsigned char *, int, + int, int, int, int *,int); + + +/* Codes for possible ink-tank combinations. + * Each combo is represented by the colors that can be used with + * the installed ink-tank(s) + * Combinations of the codes represent the combinations allowed for a model + * Note that only preferrable combinations should be used + */ +#define CANON_INK_K 1 +#define CANON_INK_CMY 2 +#define CANON_INK_CMYK 4 +#define CANON_INK_CcMmYK 8 +#define CANON_INK_CcMmYyK 16 + +#define CANON_INK_BLACK_MASK (CANON_INK_K|CANON_INK_CMYK|CANON_INK_CcMmYK) + +#define CANON_INK_PHOTO_MASK (CANON_INK_CcMmYK|CANON_INK_CcMmYyK) + +/* document feeding */ +#define CANON_SLOT_ASF1 1 +#define CANON_SLOT_ASF2 2 +#define CANON_SLOT_MAN1 4 +#define CANON_SLOT_MAN2 8 + +/* model peculiarities */ +#define CANON_CAP_DMT 0x01ul /* Drop Modulation Technology */ +#define CANON_CAP_MSB_FIRST 0x02ul /* how to send data */ +#define CANON_CAP_a 0x04ul +#define CANON_CAP_b 0x08ul +#define CANON_CAP_q 0x10ul +#define CANON_CAP_m 0x20ul +#define CANON_CAP_d 0x40ul +#define CANON_CAP_t 0x80ul +#define CANON_CAP_c 0x100ul +#define CANON_CAP_p 0x200ul +#define CANON_CAP_l 0x400ul +#define CANON_CAP_r 0x800ul +#define CANON_CAP_g 0x1000ul +#define CANON_CAP_ACKSHORT 0x2000ul + +#define CANON_CAP_STD0 (CANON_CAP_b|CANON_CAP_c|CANON_CAP_d|\ + CANON_CAP_l|CANON_CAP_q|CANON_CAP_t) + +#define CANON_CAP_STD1 (CANON_CAP_b|CANON_CAP_c|CANON_CAP_d|CANON_CAP_l|\ + CANON_CAP_m|CANON_CAP_p|CANON_CAP_q|CANON_CAP_t) + +#ifdef EXPERIMENTAL_STUFF +#define CANON_MODES(A) A,sizeof(A)/sizeof(canon_variable_printmode_t*) +#else +#define CANON_MODES(A) 0 +#endif + +#define CANON_INK(A) A,sizeof(A)/sizeof(canon_variable_inklist_t*) + + +#ifdef EXPERIMENTAL_STUFF + +#define BC_10 CANON_INK_K /* b/w */ +#define BC_11 CANON_INK_CMYK /* color */ +#define BC_12 CANON_INK_CMYK /* photo */ +#define BC_20 CANON_INK_K /* b/w */ +#define BC_21 CANON_INK_CMYK /* color */ +#define BC_22 CANON_INK_CMYK /* photo */ +#define BC_29 0 /* neon! */ +#define BC_3031 CANON_INK_CMYK /* color */ +#define BC_3231 CANON_INK_CcMmYK /* photo */ + + +static const canon_variable_printmode_t canon_nomodes[] = +{ + {0,0,0,0,0,0,0,0,0,0} +}; + +static const canon_variable_printmode_t canon_modes_30[] = { + { 180, 180, 1, BC_10, 2, 1.0, 1.0, &ci_CMYK_1, 0,0,0 }, + { 360, 360, 1, BC_10, 2, 1.0, 1.0, &ci_CMYK_1, 0,0,0 }, + { 720, 360, 1, BC_10, 2, 1.0, 1.0, &ci_CMYK_1, 0,0,0 }, +}; + +static const canon_variable_printmode_t canon_modes_85[] = { + { 360, 360, 1, BC_10, 2, 1.0, 1.0, &ci_CMYK_1, 0,0,0 }, + { 360, 360, 1, BC_11, 2, 1.0, 1.0, &ci_CMYK_1, 0,0,0 }, + { 360, 360, 2, BC_11, 2, 1.0, 1.0, &ci_CMYK_2, 0,0,0 }, + { 360, 360, 1, BC_21, 2, 1.0, 1.0, &ci_CMYK_1, 0,0,0 }, + { 360, 360, 2, BC_21, 2, 1.0, 1.0, &ci_CMYK_2, 0,0,0 }, +}; + +static const canon_variable_printmode_t canon_modes_2x00[] = { + { 360, 360, 1, BC_20, 2, 1.0, 1.0, &ci_CMYK_1, 0,0,0 }, + { 360, 360, 1, BC_21, 2, 1.0, 1.0, &ci_CMYK_1, 0,0,0 }, + { 360, 360, 1, BC_22, 2, 1.0, 1.0, &ci_CMYK_1, 0,0,0 }, +}; + +static const canon_variable_printmode_t canon_modes_6x00[] = { + { 360, 360, 1, BC_3031, 2, 1.8, 1.0, &ci_CMYK_1, 0,0,0 }, + { 360, 360, 2, BC_3031, 2, 1.8, 1.0, &ci_CMYK_2, 0,0,0 }, + { 720, 720, 1, BC_3031, 2, 1.0, 1.0, &ci_CMYK_1, 0,0,0 }, + { 1440, 720, 1, BC_3031, 2, 0.5, 1.0, &ci_CMYK_1, 0,0,0 }, + { 360, 360, 1, BC_3231, 2, 1.8, 1.0, &ci_CcMmYK_1, 0,0,0 }, + { 360, 360, 2, BC_3231, 2, 1.8, 1.0, &ci_CcMmYK_2, 0,0,0 }, + { 720, 720, 1, BC_3231, 2, 1.0, 1.0, &ci_CcMmYK_1, 0,0,0 }, + { 1440, 720, 1, BC_3231, 2, 0.5, 1.0, &ci_CcMmYK_1, 0,0,0 }, +}; +#endif + +static const canon_cap_t canon_model_capabilities[] = +{ + /* default settings for unkown models */ + + { -1, 8*72,11*72,180,180,20,20,20,20, CANON_INK_K, CANON_SLOT_ASF1, 0 }, + + /* ******************************** */ + /* */ + /* tested and color-adjusted models */ + /* */ + /* ******************************** */ + + + + + /* ************************************ */ + /* */ + /* tested models w/out color-adjustment */ + /* */ + /* ************************************ */ + + + { /* Canon BJ 30 *//* heads: BC-10 */ + 30, 1, + 9.5*72, 14*72, + 90, 360, 360, 2, + 11, 9, 10, 18, + CANON_INK_K, + CANON_SLOT_ASF1, + CANON_CAP_STD0 | CANON_CAP_a, + CANON_MODES(canon_modes_30), +#ifndef EXPERIMENTAL_STUFF + {-1,0,0,0,-1,-1}, /*090x090 180x180 360x360 720x360 720x720 1440x1440*/ + {1,1,1,1,1,1}, /*------- 180x180 360x360 720x360 ------- ---------*/ + CANON_INK(canon_ink_standard), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + + { /* Canon BJC 85 *//* heads: BC-20 BC-21 BC-22 */ + 85, 1, + 9.5*72, 14*72, + 90, 720, 360, 2, + 11, 9, 10, 18, + CANON_INK_K | CANON_INK_CMYK | CANON_INK_CcMmYK, + CANON_SLOT_ASF1, + CANON_CAP_STD0 | CANON_CAP_a | CANON_CAP_DMT, + CANON_MODES(canon_modes_85), +#ifndef EXPERIMENTAL_STUFF + {-1,-1,1,0,-1,-1},/*090x090 180x180 360x360 720x360 720x720 1440x1440*/ + {1,1,1,1,1,1}, /*------- ------- 360x360 720x360 ------- ---------*/ + CANON_INK(canon_ink_standard), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + + { /* Canon BJC 4300 *//* heads: BC-20 BC-21 BC-22 BC-29 */ + 4300, 1, + 618, 936, /* 8.58" x 13 " */ + 180, 1440, 720, 2, + 11, 9, 10, 18, + CANON_INK_CMYK | CANON_INK_CcMmYK, + CANON_SLOT_ASF1 | CANON_SLOT_MAN1, + CANON_CAP_STD0 | CANON_CAP_DMT, + CANON_MODES(canon_nomodes), +#ifndef EXPERIMENTAL_STUFF + {-1,1,0,0,-1,-1}, /*180x180 360x360 720x720 1440x720 1440x1440 2880x2880*/ + {1,1,1,1,1,1}, /*------- 360x360 720x720 1440x720 --------- ---------*/ + CANON_INK(canon_ink_standard), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + + { /* Canon BJC 4400 *//* heads: BC-20 BC-21 BC-22 BC-29 */ + 4400, 1, + 9.5*72, 14*72, + 90, 720, 360, 2, + 11, 9, 10, 18, + CANON_INK_K | CANON_INK_CMYK | CANON_INK_CcMmYK, + CANON_SLOT_ASF1, + CANON_CAP_STD0 | CANON_CAP_a | CANON_CAP_DMT, + CANON_MODES(canon_nomodes), +#ifndef EXPERIMENTAL_STUFF + {-1,-1,0,0,-1,-1},/*090x090 180x180 360x360 720x360 720x720 1440x1440*/ + {1,1,1,1,1,1}, /*------- ------- 360x360 720x360 ------- ---------*/ + CANON_INK(canon_ink_standard), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + + { /* Canon BJC 6000 *//* heads: BC-30/BC-31 BC-32/BC-31 */ + 6000, 3, + 618, 936, /* 8.58" x 13 " */ + 180, 1440, 720, 2, + 11, 9, 10, 18, + CANON_INK_CMYK | CANON_INK_CcMmYK, + CANON_SLOT_ASF1 | CANON_SLOT_MAN1, + CANON_CAP_STD1 | CANON_CAP_DMT | CANON_CAP_ACKSHORT, + CANON_MODES(canon_modes_6x00), +#ifndef EXPERIMENTAL_STUFF + {-1,1,0,0,-1,-1}, /*180x180 360x360 720x720 1440x720 1440x1440 2880x2880*/ + {1,1.8,1,0.5,1,1},/*------- 360x360 720x720 1440x720 --------- ---------*/ + CANON_INK(canon_ink_standardphoto), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + + { /* Canon BJC 6200 *//* heads: BC-30/BC-31 BC-32/BC-31 */ + 6200, 3, + 618, 936, /* 8.58" x 13 " */ + 180, 1440, 720, 2, + 11, 9, 10, 18, + CANON_INK_CMYK | CANON_INK_CcMmYK, + CANON_SLOT_ASF1 | CANON_SLOT_MAN1, + CANON_CAP_STD1 | CANON_CAP_DMT | CANON_CAP_ACKSHORT, + CANON_MODES(canon_modes_6x00), +#ifndef EXPERIMENTAL_STUFF + {-1,1,0,0,-1,-1}, /*180x180 360x360 720x720 1440x720 1440x1440 2880x2880*/ + {0,1.8,1,.5,0,0}, /*------- 360x360 720x720 1440x720 --------- ---------*/ + CANON_INK(canon_ink_standardphoto), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + + { /* Canon BJC 6500 *//* heads: BC-30/BC-31 BC-32/BC-31 */ + 6500, 3, + 11*72, 17*72, + 180, 1440, 720, 2, + 11, 9, 10, 18, + CANON_INK_CMYK | CANON_INK_CcMmYK, + CANON_SLOT_ASF1 | CANON_SLOT_MAN1, + CANON_CAP_STD1 | CANON_CAP_DMT, + CANON_MODES(canon_modes_6x00), +#ifndef EXPERIMENTAL_STUFF + {-1,1,0,0,-1,-1}, /*180x180 360x360 720x720 1440x720 1440x1440 2880x2880*/ + {0,1.8,1,.5,0,0}, /*------- 360x360 720x720 1440x720 --------- ---------*/ + CANON_INK(canon_ink_standardphoto), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + + { /* Canon BJC 8200 *//* heads: BC-50 */ + 8200, 3, + 11*72, 17*72, + 150, 1200,1200, 4, + 11, 9, 10, 18, + CANON_INK_CMYK, /* | CANON_INK_CcMmYK */ + CANON_SLOT_ASF1, + CANON_CAP_STD1 | CANON_CAP_r | CANON_CAP_DMT | CANON_CAP_ACKSHORT, + CANON_MODES(canon_nomodes), +#ifndef EXPERIMENTAL_STUFF + {-1,0,0,-1,0,-1}, /*150x150 300x300 600x600 1200x600 1200x1200 2400x2400*/ + {1,1,1,1,1,1}, /*------- 300x300 600x600 -------- 1200x1200 ---------*/ + CANON_INK(canon_ink_superphoto), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + + + /* *************** */ + /* */ + /* untested models */ + /* */ + /* *************** */ + + + { /* Canon BJC 210 *//* heads: BC-02 BC-05 BC-06 */ + 210, 1, + 11*72, 17*72, + 90, 720, 360, 2, + 11, 9, 10, 18, + CANON_INK_K | CANON_INK_CMY, + CANON_SLOT_ASF1 | CANON_SLOT_MAN1, + CANON_CAP_STD0, + CANON_MODES(canon_nomodes), +#ifndef EXPERIMENTAL_STUFF + {0,0,0,0,-1,-1},/*180x180 360x360 720x720 1440x720 1440x1440 2880x2880*/ + {1,1,1,1,1,1}, /*180x180 360x360 ------- -------- --------- ---------*/ + CANON_INK(canon_ink_standard), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + { /* Canon BJC 240 *//* heads: BC-02 BC-05 BC-06 */ + 240, 1, + 11*72, 17*72, + 90, 720, 360, 2, + 11, 9, 10, 18, + CANON_INK_K | CANON_INK_CMY, + CANON_SLOT_ASF1 | CANON_SLOT_MAN1, + CANON_CAP_STD0 | CANON_CAP_DMT, + CANON_MODES(canon_nomodes), +#ifndef EXPERIMENTAL_STUFF + {0,0,1,0,-1,-1},/*180x180 360x360 720x720 1440x720 1440x1440 2880x2880*/ + {1,1,1,1,1,1}, /*180x180 360x360 ------- -------- --------- ---------*/ + CANON_INK(canon_ink_oldphoto), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + { /* Canon BJC 250 *//* heads: BC-02 BC-05 BC-06 */ + 250, 1, + 11*72, 17*72, + 90, 720, 360, 2, + 11, 9, 10, 18, + CANON_INK_K | CANON_INK_CMY, + CANON_SLOT_ASF1 | CANON_SLOT_MAN1, + CANON_CAP_STD0 | CANON_CAP_DMT, + CANON_MODES(canon_nomodes), +#ifndef EXPERIMENTAL_STUFF + {0,0,1,0,-1,-1},/*180x180 360x360 720x720 1440x720 1440x1440 2880x2880*/ + {1,1,1,1,1,1}, /*180x180 360x360 ------- -------- --------- ---------*/ + CANON_INK(canon_ink_oldphoto), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + { /* Canon BJC 1000 *//* heads: BC-02 BC-05 BC-06 */ + 1000, 1, + 11*72, 17*72, + 90, 720, 360, 2, + 11, 9, 10, 18, + CANON_INK_K | CANON_INK_CMY, + CANON_SLOT_ASF1, + CANON_CAP_STD0 | CANON_CAP_DMT | CANON_CAP_a, + CANON_MODES(canon_nomodes), +#ifndef EXPERIMENTAL_STUFF + {0,0,1,0,-1,-1}, /*180x180 360x360 720x720 1440x720 1440x1440 2880x2880*/ + {1,1,1,1,1,1}, /*180x180 360x360 ------- -------- --------- ---------*/ + CANON_INK(canon_ink_oldphoto), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + { /* Canon BJC 2000 *//* heads: BC-20 BC-21 BC-22 BC-29 */ + 2000, 1, + 11*72, 17*72, + 180, 720, 360, 2, + 11, 9, 10, 18, + CANON_INK_CMYK, + CANON_SLOT_ASF1, + CANON_CAP_STD0 | CANON_CAP_a, + CANON_MODES(canon_nomodes), +#ifndef EXPERIMENTAL_STUFF + {0,0,-1,-1,-1,-1},/*180x180 360x360 720x720 1440x720 1440x1440 2880x2880*/ + {1,1,1,1,1,1}, /*180x180 360x360 ------- -------- --------- ---------*/ + CANON_INK(canon_ink_standard), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + { /* Canon BJC 3000 *//* heads: BC-30 BC-33 BC-34 */ + 3000, 3, + 11*72, 17*72, + 180, 1440, 720, 2, + 11, 9, 10, 18, + CANON_INK_CMYK | CANON_INK_CcMmYK, + CANON_SLOT_ASF1, + CANON_CAP_STD0 | CANON_CAP_a | CANON_CAP_DMT, /*FIX? should have _r? */ + CANON_MODES(canon_nomodes), +#ifndef EXPERIMENTAL_STUFF + {-1,1,0,0,-1,-1}, /*180x180 360x360 720x720 1440x720 1440x1440 2880x2880*/ + {1,1,1,1,1,1}, /*------- 360x360 720x720 1440x720 --------- ---------*/ + CANON_INK(canon_ink_standard), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + { /* Canon BJC 6100 *//* heads: BC-30/BC-31 BC-32/BC-31 */ + 6100, 3, + 11*72, 17*72, + 180, 1440, 720, 2, + 11, 9, 10, 18, + CANON_INK_CMYK | CANON_INK_CcMmYK, + CANON_SLOT_ASF1, + CANON_CAP_STD1 | CANON_CAP_a | CANON_CAP_r | CANON_CAP_DMT, + CANON_MODES(canon_modes_6x00), +#ifndef EXPERIMENTAL_STUFF + {-1,1,0,0,-1,-1}, /*180x180 360x360 720x720 1440x720 1440x1440 2880x2880*/ + {1,1,1,1,1,1}, /*------- 360x360 720x720 1440x720 --------- ---------*/ + CANON_INK(canon_ink_standard), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + { /* Canon BJC 7000 *//* heads: BC-60/BC-61 BC-60/BC-62 ??????? */ + 7000, 3, + 11*72, 17*72, + 150, 1200, 600, 2, + 11, 9, 10, 18, + CANON_INK_CMYK | CANON_INK_CcMmYyK, + CANON_SLOT_ASF1, + CANON_CAP_STD1, + CANON_MODES(canon_nomodes), +#ifndef EXPERIMENTAL_STUFF + {-1,0,0,0,-1,-1}, /*150x150 300x300 600x600 1200x600 1200x1200 2400x2400*/ + {1,3.5,1.8,1,1,1},/*------- 300x300 600x600 1200x600 --------- ---------*/ + CANON_INK(canon_ink_standard), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + { /* Canon BJC 7100 *//* heads: BC-60/BC-61 BC-60/BC-62 ??????? */ + 7100, 3, + 11*72, 17*72, + 150, 1200, 600, 2, + 11, 9, 10, 18, + CANON_INK_CMYK | CANON_INK_CcMmYyK, + CANON_SLOT_ASF1, + CANON_CAP_STD0, + CANON_MODES(canon_nomodes), +#ifndef EXPERIMENTAL_STUFF + {-1,0,0,0,-1,-1}, /*150x150 300x300 600x600 1200x600 1200x1200 2400x2400*/ + {1,1,1,1,1,1}, /*------- 300x300 600x600 1200x600 --------- ---------*/ + CANON_INK(canon_ink_standard), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + + /*****************************/ + /* */ + /* extremely fuzzy models */ + /* (might never work at all) */ + /* */ + /*****************************/ + + { /* Canon BJC 5100 *//* heads: BC-20 BC-21 BC-22 BC-23 BC-29 */ + 5100, 1, + 17*72, 22*72, + 180, 1440, 720, 2, + 11, 9, 10, 18, + CANON_INK_CMYK | CANON_INK_CcMmYK, + CANON_SLOT_ASF1, + CANON_CAP_STD0 | CANON_CAP_DMT, + CANON_MODES(canon_nomodes), +#ifndef EXPERIMENTAL_STUFF + {-1,1,0,0,-1,-1}, /*180x180 360x360 720x720 1440x720 1440x1440 2880x2880*/ + {1,1,1,1,1,1}, /*------- 360x360 720x720 1440x720 --------- ---------*/ + CANON_INK(canon_ink_standard), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + { /* Canon BJC 5500 *//* heads: BC-20 BC-21 BC-29 */ + 5500, 1, + 22*72, 34*72, + 180, 720, 360, 2, + 11, 9, 10, 18, + CANON_INK_CMYK | CANON_INK_CcMmYK, + CANON_SLOT_ASF1, + CANON_CAP_STD0 | CANON_CAP_a, + CANON_MODES(canon_nomodes), +#ifndef EXPERIMENTAL_STUFF + {0,0,-1,-1,-1,-1},/*180x180 360x360 720x720 1440x720 1440x1440 2880x2880*/ + {1,1,1,1,1,1}, /*180x180 360x360 ------- -------- --------- ---------*/ + CANON_INK(canon_ink_standard), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + { /* Canon BJC 6500 *//* heads: BC-30/BC-31 BC-32/BC-31 */ + 6500, 3, + 17*72, 22*72, + 180, 1440, 720, 2, + 11, 9, 10, 18, + CANON_INK_CMYK | CANON_INK_CcMmYK, + CANON_SLOT_ASF1, + CANON_CAP_STD1 | CANON_CAP_a | CANON_CAP_DMT, + CANON_MODES(canon_nomodes), +#ifndef EXPERIMENTAL_STUFF + {-1,1,0,0,-1,-1}, /*180x180 360x360 720x720 1440x720 1440x1440 2880x2880*/ + {1,1,1,1,1,1}, /*------- 360x360 720x720 1440x720 --------- ---------*/ + CANON_INK(canon_ink_standard), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, + { /* Canon BJC 8500 *//* heads: BC-80/BC-81 BC-82/BC-81 */ + 8500, 3, + 17*72, 22*72, + 150, 1200,1200, 2, + 11, 9, 10, 18, + CANON_INK_CMYK | CANON_INK_CcMmYK, + CANON_SLOT_ASF1, + CANON_CAP_STD0, + CANON_MODES(canon_nomodes), +#ifndef EXPERIMENTAL_STUFF + {-1,0,0,-1,0,-1}, /*150x150 300x300 600x600 1200x600 1200x1200 2400x2400*/ + {1,1,1,1,1,1}, /*------- 300x300 600x600 -------- 1200x1200 ---------*/ + CANON_INK(canon_ink_standard), +#endif + standard_lum_adjustment, + standard_hue_adjustment, + standard_sat_adjustment + }, +}; + + +static const double plain_paper_lum_adjustment[49] = +{ + 1.2, /* C */ + 1.22, + 1.28, + 1.34, + 1.39, + 1.42, + 1.45, + 1.48, + 1.5, /* B */ + 1.4, + 1.3, + 1.25, + 1.2, + 1.1, + 1.05, + 1.05, + 1.05, /* M */ + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, /* R */ + 1.05, + 1.05, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, /* Y */ + 1.15, + 1.3, + 1.45, + 1.6, + 1.75, + 1.9, + 2.0, + 2.1, /* G */ + 2.0, + 1.8, + 1.7, + 1.6, + 1.5, + 1.4, + 1.3, + 1.2 /* C */ +}; + +typedef struct { + const char *name; + const char *text; + int media_code; + double base_density; + double k_lower_scale; + double k_upper; + const double *hue_adjustment; + const double *lum_adjustment; + const double *sat_adjustment; +} paper_t; + +typedef struct { + const canon_cap_t *caps; + int output_type; + const paper_t *pt; + int print_head; + int colormode; + const char *source_str; + int xdpi; + int ydpi; + int page_width; + int page_height; + int top; + int left; + int bits; +} canon_init_t; + +static const paper_t canon_paper_list[] = { + { "Plain", N_ ("Plain Paper"), 0x00, 0.50, 0.25, 0.500, 0, 0, 0 }, + { "Transparency", N_ ("Transparencies"), 0x02, 1.00, 1.00, 0.900, 0, 0, 0 }, + { "BackPrint", N_ ("Back Print Film"), 0x03, 1.00, 1.00, 0.900, 0, 0, 0 }, + { "Fabric", N_ ("Fabric Sheets"), 0x04, 0.50, 0.25, 0.500, 0, 0, 0 }, + { "Envelope", N_ ("Envelope"), 0x08, 0.50, 0.25, 0.500, 0, 0, 0 }, + { "Coated", N_ ("High Resolution Paper"), 0x07, 0.78, 0.25, 0.500, 0, 0, 0 }, + { "TShirt", N_ ("T-Shirt Transfers"), 0x03, 0.50, 0.25, 0.500, 0, 0, 0 }, + { "GlossyFilm", N_ ("High Gloss Film"), 0x06, 1.00, 1.00, 0.999, 0, 0, 0 }, + { "GlossyPaper", N_ ("Glossy Photo Paper"), 0x05, 1.00, 1.00, 0.999, 0, 0, 0 }, + { "GlossyCard", N_ ("Glossy Photo Cards"), 0x0a, 1.00, 1.00, 0.999, 0, 0, 0 }, + { "GlossyPro", N_ ("Photo Paper Pro"), 0x09, 1.00, 1.00, 0.999, 0, 0, 0 }, + { "Other", N_ ("Other"), 0x00, 0.50, 0.25, .5, 0, 0, 0 }, +}; + +static const int paper_type_count = sizeof(canon_paper_list) / sizeof(paper_t); + +static const paper_t * +get_media_type(const char *name) +{ + int i; + for (i = 0; i < paper_type_count; i++) + { + /* translate paper_t.name */ + if (!strcmp(name, canon_paper_list[i].name)) + return &(canon_paper_list[i]); + } + return NULL; +} + + +static const canon_cap_t * canon_get_model_capabilities(int model) +{ + int i; + int models= sizeof(canon_model_capabilities) / sizeof(canon_cap_t); + for (i=0; iinks & CANON_INK_CMYK) return 2; + if (caps->inks & CANON_INK_CMY) return 1; + if (caps->inks & CANON_INK_K) return 0; + } + + stp_deprintf(STP_DBG_CANON,"canon: Unknown head combo '%s' - reverting to black",name); + return 0; +} + +static colormode_t +canon_printhead_colors(const char *name, const canon_cap_t * caps) +{ + /* used internally: do not translate */ + if (!strcmp(name,"Gray")) return COLOR_MONOCHROME; + if (!strcmp(name,"RGB")) return COLOR_CMY; + if (!strcmp(name,"CMYK")) return COLOR_CMYK; + if (!strcmp(name,"PhotoCMY")) return COLOR_CCMMYK; + if (!strcmp(name,"PhotoCMYK")) return COLOR_CCMMYYK; + + if (*name == 0) { + if (caps->inks & CANON_INK_CMYK) return COLOR_CMYK; + if (caps->inks & CANON_INK_CMY) return COLOR_CMY; + if (caps->inks & CANON_INK_K) return COLOR_MONOCHROME; + } + + stp_deprintf(STP_DBG_CANON,"canon: Unknown head combo '%s' - reverting to black",name); + return COLOR_MONOCHROME; +} + +static unsigned char +canon_size_type(const stp_vars_t v, const canon_cap_t * caps) +{ + const stp_papersize_t pp = stp_get_papersize_by_size(stp_get_page_height(v), + stp_get_page_width(v)); + if (pp) + { + const char *name = stp_papersize_get_name(pp); + /* used internally: do not translate */ + /* built ins: */ + if (!strcmp(name,"A5")) return 0x01; + if (!strcmp(name,"A4")) return 0x03; + if (!strcmp(name,"B5")) return 0x08; + if (!strcmp(name,"Letter")) return 0x0d; + if (!strcmp(name,"Legal")) return 0x0f; + if (!strcmp(name,"COM10")) return 0x16; + if (!strcmp(name,"DL")) return 0x17; + if (!strcmp(name,"LetterExtra")) return 0x2a; + if (!strcmp(name,"A4Extra")) return 0x2b; + if (!strcmp(name,"w288h144")) return 0x2d; + /* custom */ + + stp_deprintf(STP_DBG_CANON,"canon: Unknown paper size '%s' - using custom\n",name); + } else { + stp_deprintf(STP_DBG_CANON,"canon: Couldn't look up paper size %dx%d - " + "using custom\n",stp_get_page_height(v), stp_get_page_width(v)); + } + return 0; +} + +static char * +c_strdup(const char *s) +{ + char *ret = stp_malloc(strlen(s) + 1); + strcpy(ret, s); + return ret; +} + +#ifndef EXPERIMENTAL_STUFF +static int canon_res_code(const canon_cap_t * caps, int xdpi, int ydpi) +{ + int x, y, res= 0; + + for (x=1; x<6; x++) if ((xdpi/caps->base_res) == (1<<(x-1))) res= (x<<4); + for (y=1; y<6; y++) if ((ydpi/caps->base_res) == (1<<(y-1))) res|= y; + + return res; +} +#else +static const canon_variable_printmode_t *canon_printmode(const canon_cap_t * caps, + int xdpi, int ydpi, + int bpp, int head) +{ + const canon_variable_printmode_t *modes; + int modes_cnt; + int i; + if (!caps) return 0; + modes= caps->printmodes; + modes_cnt= caps->printmodes_cnt; + /* search for the right printmode: */ + for (i=0; i either return 0 or apply some policy to + * get a fallback printmode + */ + if (modes[0].xdpi) return modes; + return 0; +} +#endif + +static int +canon_ink_type(const canon_cap_t * caps, int res_code) +{ +#ifndef EXPERIMENTAL_STUFF + switch (res_code) + { + case 0x11: return caps->dot_sizes.dot_r11; + case 0x22: return caps->dot_sizes.dot_r22; + case 0x33: return caps->dot_sizes.dot_r33; + case 0x43: return caps->dot_sizes.dot_r43; + case 0x44: return caps->dot_sizes.dot_r44; + case 0x55: return caps->dot_sizes.dot_r55; + } + return -1; +#else + return -1; +#endif +} + +static const double * +canon_lum_adjustment(const stp_printer_t printer) +{ + const canon_cap_t * caps= + canon_get_model_capabilities(stp_printer_get_model(printer)); + return (caps->lum_adjustment); +} + +static const double * +canon_hue_adjustment(const stp_printer_t printer) +{ + const canon_cap_t * caps= + canon_get_model_capabilities(stp_printer_get_model(printer)); + return (caps->hue_adjustment); +} + +static const double * +canon_sat_adjustment(const stp_printer_t printer) +{ + const canon_cap_t * caps= + canon_get_model_capabilities(stp_printer_get_model(printer)); + return (caps->sat_adjustment); +} + +static double +canon_density(const canon_cap_t * caps, int res_code) +{ +#ifndef EXPERIMENTAL_STUFF + switch (res_code) + { + case 0x11: return caps->densities.d_r11; + case 0x22: return caps->densities.d_r22; + case 0x33: return caps->densities.d_r33; + case 0x43: return caps->densities.d_r43; + case 0x44: return caps->densities.d_r44; + case 0x55: return caps->densities.d_r55; + default: + stp_deprintf(STP_DBG_CANON,"no such res_code 0x%x in density of model %d\n", + res_code,caps->model); + return 0.2; + } +#else + return 0.2; +#endif +} + +static const canon_variable_inkset_t * +canon_inks(const canon_cap_t * caps, int res_code, int colors, int bits) +{ +#ifndef EXPERIMENTAL_STUFF + const canon_variable_inklist_t *inks = caps->inxs; + int i; + + if (!inks) + return NULL; + + for (i=0; iinxs_cnt; i++) { + stp_deprintf(STP_DBG_CANON,"hmm, trying ink for resolution code " + "%x, %d bits, %d colors\n",res_code,inks[i].bits,inks[i].colors); + if ((inks[i].bits==bits) && (inks[i].colors==colors)) { + stp_deprintf(STP_DBG_CANON,"wow, found ink for resolution code " + "%x, %d bits, %d colors\n",res_code,bits,colors); + switch (res_code) + { + case 0x11: return inks[i].r11; + case 0x22: return inks[i].r22; + case 0x33: return inks[i].r33; + case 0x43: return inks[i].r43; + case 0x44: return inks[i].r44; + case 0x55: return inks[i].r55; + } + } + } + stp_deprintf(STP_DBG_CANON,"ooo, found no ink for resolution code " + "%x, %d bits, %d colors in all %d defs!\n", + res_code,bits,colors,caps->inxs_cnt); + return NULL; +#else + return NULL; +#endif +} + +static void +canon_describe_resolution(const stp_printer_t printer, + const char *resolution, int *x, int *y) +{ + *x = -1; + *y = -1; + sscanf(resolution, "%dx%d", x, y); + return; +} + +static stp_param_t media_sources[] = + { + { "Auto", N_ ("Auto Sheet Feeder") }, + { "Manual", N_ ("Manual with Pause") }, + { "ManualNP", N_ ("Manual without Pause") } + }; + + +/* + * 'canon_parameters()' - Return the parameter values for the given parameter. + */ + +static stp_param_t * /* O - Parameter values */ +canon_parameters(const stp_printer_t printer, /* I - Printer model */ + const char *ppd_file, /* I - PPD file (not used) */ + const char *name, /* I - Name of parameter */ + int *count) /* O - Number of values */ +{ + int i; + stp_param_t *p= 0; + stp_param_t *valptrs= 0; + + const canon_cap_t * caps= + canon_get_model_capabilities(stp_printer_get_model(printer)); + + if (count == NULL) + return (NULL); + + *count = 0; + + if (name == NULL) + return (NULL); + + if (strcmp(name, "PageSize") == 0) + { + int height_limit, width_limit; + int papersizes = stp_known_papersizes(); + valptrs = stp_malloc(sizeof(stp_param_t) * papersizes); + *count = 0; + + width_limit = caps->max_width; + height_limit = caps->max_height; + + for (i = 0; i < papersizes; i++) { + const stp_papersize_t pt = stp_get_papersize_by_index(i); + if (strlen(stp_papersize_get_name(pt)) > 0 && + stp_papersize_get_width(pt) <= width_limit && + stp_papersize_get_height(pt) <= height_limit) + { + valptrs[*count].name = c_strdup(stp_papersize_get_name(pt)); + valptrs[*count].text = c_strdup(stp_papersize_get_text(pt)); + (*count)++; + } + } + } + else if (strcmp(name, "Resolution") == 0) + { + char tmp[100]; + int x,y; + int c= 0; + int t; + valptrs = stp_malloc(sizeof(stp_param_t) * 10); + + for (x=1; x<6; x++) { + for (y=x-1; y -1) { + sprintf(tmp,"%dx%ddpi", + (1<base_res,(1<base_res); + valptrs[c].name= c_strdup(tmp); + + sprintf(tmp,"%dx%d DPI", + (1<base_res,(1<base_res); + stp_deprintf(STP_DBG_CANON,"supports mode '%s'\n",tmp); + valptrs[c++].text= c_strdup(tmp); + + if (t==1) { + sprintf(tmp,"%dx%ddmt", + (1<base_res,(1<base_res); + valptrs[c].name= c_strdup(tmp); + sprintf(tmp,"%dx%d DPI DMT", + (1<base_res,(1<base_res); + stp_deprintf(STP_DBG_CANON,"supports mode '%s'\n",tmp); + valptrs[c++].text = c_strdup(tmp); + } + } + } + } + *count= c; + } + else if (strcmp(name, "InkType") == 0) + { + int c= 0; + valptrs = stp_malloc(sizeof(stp_param_t) * 5); + /* used internally: do not translate */ + if ((caps->inks & CANON_INK_K)) + { + valptrs[c].name = c_strdup("Gray"); + valptrs[c++].text = c_strdup(_("Black")); + } + if ((caps->inks & CANON_INK_CMY)) + { + valptrs[c].name = c_strdup("RGB"); + valptrs[c++].text = c_strdup(_("CMY Color")); + } + if ((caps->inks & CANON_INK_CMYK)) + { + valptrs[c].name = c_strdup("CMYK"); + valptrs[c++].text = c_strdup(_("CMYK Color")); + } + if ((caps->inks & CANON_INK_CcMmYK)) + { + valptrs[c].name = c_strdup("PhotoCMY"); + valptrs[c++].text = c_strdup(_("Photo CcMmY Color")); + } + if ((caps->inks & CANON_INK_CcMmYyK)) + { + valptrs[c].name = c_strdup("PhotoCMYK"); + valptrs[c++].text = c_strdup(_("Photo CcMmYK Color")); + } + + *count = c; + } + else if (strcmp(name, "MediaType") == 0) + { + *count = sizeof(canon_paper_list) / sizeof(canon_paper_list[0]); + + valptrs = stp_malloc(*count * sizeof(stp_param_t)); + + for (i = 0; i < *count; i ++) + { + valptrs[i].name = c_strdup(canon_paper_list[i].name); + valptrs[i].text = c_strdup(_(canon_paper_list[i].text)); + } + } + else if (strcmp(name, "InputSlot") == 0) + { + *count = 3; + p = media_sources; + + valptrs = stp_malloc(*count * sizeof(stp_param_t)); + for (i = 0; i < *count; i ++) + { + /* translate media_sources */ + valptrs[i].name = c_strdup(p[i].name); + valptrs[i].text = c_strdup(_(p[i].text)); + } + } + else + return (NULL); + + return (valptrs); +} + +static const char * +canon_default_parameters(const stp_printer_t printer, + const char *ppd_file, + const char *name) +{ + int i; + const canon_cap_t * caps= + canon_get_model_capabilities(stp_printer_get_model(printer)); + + if (name == NULL) + return (NULL); + + if (strcmp(name, "PageSize") == 0) + { + int height_limit, width_limit; + int papersizes = stp_known_papersizes(); + + width_limit = caps->max_width; + height_limit = caps->max_height; + + for (i = 0; i < papersizes; i++) { + const stp_papersize_t pt = stp_get_papersize_by_index(i); + if (strlen(stp_papersize_get_name(pt)) > 0 && + stp_papersize_get_width(pt) <= width_limit && + stp_papersize_get_height(pt) <= height_limit) + return (stp_papersize_get_name(pt)); + } + return NULL; + } + else if (strcmp(name, "Resolution") == 0) + { + char tmp[100]; + int x,y; + int t; + int min_res = caps->base_res; + while (min_res < 300) + min_res *= 2; + + for (x=1; x<6; x++) + { + for (y=x-1; y -1) + { + if (t == 1) + sprintf(tmp, "%dx%ddmt", min_res, min_res); + else + sprintf(tmp,"%dx%ddpi", min_res, min_res); + + stp_deprintf(STP_DBG_CANON,"supports mode '%s'\n",tmp); + return (c_strdup(tmp)); + } + } + } + return NULL; + } + else if (strcmp(name, "InkType") == 0) + { + /* used internally: do not translate */ + if ((caps->inks & CANON_INK_K)) + return ("Gray"); + if ((caps->inks & CANON_INK_CMY)) + return ("RGB"); + if ((caps->inks & CANON_INK_CMYK)) + return ("CMYK"); + if ((caps->inks & CANON_INK_CcMmYK)) + return ("PhotoCMY"); + if ((caps->inks & CANON_INK_CcMmYyK)) + return ("PhotoCMYK"); + return NULL; + } + else if (strcmp(name, "MediaType") == 0) + { + return (canon_paper_list[0].name); + } + else if (strcmp(name, "InputSlot") == 0) + { + return (media_sources[0].name); + } + else + return (NULL); +} + + +/* + * 'canon_imageable_area()' - Return the imageable area of the page. + */ + +static void +canon_imageable_area(const stp_printer_t printer, /* I - Printer model */ + const stp_vars_t v, /* I */ + int *left, /* O - Left position in points */ + int *right, /* O - Right position in points */ + int *bottom, /* O - Bottom position in points */ + int *top) /* O - Top position in points */ +{ + int width, length; /* Size of page */ + + const canon_cap_t * caps= + canon_get_model_capabilities(stp_printer_get_model(printer)); + + stp_default_media_size(printer, v, &width, &length); + + *left = caps->border_left; + *right = width - caps->border_right; + *top = length - caps->border_top; + *bottom = caps->border_bottom; +} + +static void +canon_limit(const stp_printer_t printer, /* I - Printer model */ + const stp_vars_t v, /* I */ + int *width, + int *height, + int *min_width, + int *min_height) +{ + const canon_cap_t * caps= + canon_get_model_capabilities(stp_printer_get_model(printer)); + *width = caps->max_width; + *height = caps->max_height; + *min_width = 1; + *min_height = 1; +} + +/* + * 'canon_cmd()' - Sends a command with variable args + */ +static void +canon_cmd(const stp_vars_t v, /* I - the printer */ + const char *ini, /* I - 2 bytes start code */ + const char cmd, /* I - command code */ + int num, /* I - number of arguments */ + ... /* I - the args themselves */ + ) +{ + unsigned char *buffer = stp_malloc(num + 1); + int i; + va_list ap; + + if (num) + { + va_start(ap, num); + for (i=0; i> 8 ),v); + if (num) + stp_zfwrite((const char *)buffer,num,1,v); + } + stp_free(buffer); +} + +#define PUT(WHAT,VAL,RES) stp_deprintf(STP_DBG_CANON,"canon: "WHAT\ +" is %04x =% 5d = %f\" = %f mm\n",(VAL),(VAL),(VAL)/(1.*RES),(VAL)/(RES/25.4)) + +#define ESC28 "\033\050" +#define ESC5b "\033\133" +#define ESC40 "\033\100" + +#define MIN(a,b) (((a)<(b)) ? (a) : (b)) +#define MAX(a,b) (((a)>(b)) ? (a) : (b)) + +/* ESC [K -- -- reset printer: + */ +static void +canon_init_resetPrinter(const stp_vars_t v, canon_init_t *init) +{ + unsigned long f=init->caps->features; + if (f & (CANON_CAP_ACKSHORT)) + { + canon_cmd(v,ESC5b,0x4b, 2, 0x00,0x1f); + stp_puts("BJLSTART\nControlMode=Common\n",v); + if (f & CANON_CAP_ACKSHORT) stp_puts("AckTime=Short\n",v); + stp_puts("BJLEND\n",v); + } + canon_cmd(v,ESC5b,0x4b, 2, 0x00,0x0f); +} + +/* ESC (a -- 0x61 -- cmdSetPageMode --: + */ +static void +canon_init_setPageMode(const stp_vars_t v, canon_init_t *init) +{ + if (!(init->caps->features & CANON_CAP_a)) + return; + + if (init->caps->features & CANON_CAP_a) + canon_cmd(v,ESC28,0x61, 1, 0x01); +} + +/* ESC (b -- 0x62 -- -- set data compression: + */ +static void +canon_init_setDataCompression(const stp_vars_t v, canon_init_t *init) +{ + if (!(init->caps->features & CANON_CAP_b)) + return; + + canon_cmd(v,ESC28,0x62, 1, 0x01); +} + +/* ESC (c -- 0x63 -- cmdSetColor --: + */ +static void +canon_init_setColor(const stp_vars_t v, canon_init_t *init) +{ + unsigned char + arg_63_1 = 0x00, + arg_63_2 = 0x00, /* plain paper */ + arg_63_3 = 0x00; /* output quality, hardcoded to Normal for now */ + + if (!(init->caps->features & CANON_CAP_c)) + return; + + arg_63_1 = init->caps->model_id << 4; + + if (init->output_type==OUTPUT_GRAY || init->output_type == OUTPUT_MONOCHROME) + arg_63_1|= 0x01; + + if (init->pt) arg_63_2= init->pt->media_code; + + canon_cmd(v,ESC28,0x63, 3, arg_63_1, arg_63_2, arg_63_3); +} + +/* ESC (d -- 0x64 -- -- set raster resolution: + */ +static void +canon_init_setResolution(const stp_vars_t v, canon_init_t *init) +{ + if (!(init->caps->features & CANON_CAP_d)) + return; + + canon_cmd(v,ESC28,0x64, 4, + (init->ydpi >> 8 ), (init->ydpi & 255), + (init->xdpi >> 8 ), (init->xdpi & 255)); +} + +/* ESC (g -- 0x67 -- cmdSetPageMargins --: + */ +static void +canon_init_setPageMargins(const stp_vars_t v, canon_init_t *init) +{ + /* TOFIX: what exactly is to be sent? + * Is it the printable length or the bottom border? + * Is is the printable width or the right border? + */ + + int minlength= 0; + int minwidth= 0; + int length= init->page_height*5/36; + int width= init->page_width*5/36; + + if (!(init->caps->features & CANON_CAP_g)) + return; + + if (minlength>length) length= minlength; + if (minwidth>width) width= minwidth; + + canon_cmd(v,ESC28,0x67, 4, 0, + (unsigned char)(length),1, + (unsigned char)(width)); + +} + +/* ESC (l -- 0x6c -- cmdSetTray --: + */ +static void +canon_init_setTray(const stp_vars_t v, canon_init_t *init) +{ + unsigned char + arg_6c_1 = 0x00, + arg_6c_2 = 0x00; /* plain paper */ + + /* int media= canon_media_type(media_str,caps); */ + int source= canon_source_type(init->source_str,init->caps); + + if (!(init->caps->features & CANON_CAP_l)) + return; + + arg_6c_1 = init->caps->model_id << 4; + + arg_6c_1|= (source & 0x0f); + + if (init->pt) arg_6c_2= init->pt->media_code; + + canon_cmd(v,ESC28,0x6c, 2, arg_6c_1, arg_6c_2); +} + +/* ESC (m -- 0x6d -- -- : + */ +static void +canon_init_setPrintMode(const stp_vars_t v, canon_init_t *init) +{ + unsigned char + arg_6d_1 = 0x03, /* color printhead? */ + arg_6d_2 = 0x00, /* 00=color 02=b/w */ + arg_6d_3 = 0x00, /* only 01 for bjc8200 */ + arg_6d_a = 0x03, /* A4 paper */ + arg_6d_b = 0x00; + + if (!(init->caps->features & CANON_CAP_m)) + return; + + arg_6d_a= canon_size_type(v,init->caps); + if (!arg_6d_a) + arg_6d_b= 1; + + if (init->print_head==0) + arg_6d_1= 0x03; + else if (init->print_head<=2) + arg_6d_1= 0x02; + else if (init->print_head<=4) + arg_6d_1= 0x04; + if (init->output_type==OUTPUT_GRAY || init->output_type == OUTPUT_MONOCHROME) + arg_6d_2= 0x02; + + if (init->caps->model==8200) + arg_6d_3= 0x01; + + canon_cmd(v,ESC28,0x6d,12, arg_6d_1, + 0xff,0xff,0x00,0x00,0x07,0x00, + arg_6d_a,arg_6d_b,arg_6d_2,0x00,arg_6d_3); +} + +/* ESC (p -- 0x70 -- cmdSetPageMargins2 --: + */ +static void +canon_init_setPageMargins2(const stp_vars_t v, canon_init_t *init) +{ + /* TOFIX: what exactly is to be sent? + * Is it the printable length or the bottom border? + * Is is the printable width or the right border? + */ + + int printable_width= init->page_width*5/6; + int printable_length= init->page_height*5/6; + + unsigned char arg_70_1= (printable_length >> 8) & 0xff; + unsigned char arg_70_2= (printable_length) & 0xff; + unsigned char arg_70_3= (printable_width >> 8) & 0xff; + unsigned char arg_70_4= (printable_width) & 0xff; + + if (!(init->caps->features & CANON_CAP_p)) + return; + + canon_cmd(v,ESC28,0x70, 8, + arg_70_1, arg_70_2, 0x00, 0x00, + arg_70_3, arg_70_4, 0x00, 0x00); +} + +/* ESC (q -- 0x71 -- setPageID -- : + */ +static void +canon_init_setPageID(const stp_vars_t v, canon_init_t *init) +{ + if (!(init->caps->features & CANON_CAP_q)) + return; + + canon_cmd(v,ESC28,0x71, 1, 0x01); +} + +/* ESC (r -- 0x72 -- -- : + */ +static void +canon_init_setX72(const stp_vars_t v, canon_init_t *init) +{ + if (!(init->caps->features & CANON_CAP_r)) + return; + + canon_cmd(v,ESC28,0x72, 1, 0x61); /* whatever for - 8200 needs it */ +} + +/* ESC (t -- 0x74 -- cmdSetImage --: + */ +static void +canon_init_setImage(const stp_vars_t v, canon_init_t *init) +{ + unsigned char + arg_74_1 = 0x01, /* 1 bit per pixel */ + arg_74_2 = 0x00, /* */ + arg_74_3 = 0x01; /* 01 <= 360 dpi 09 >= 720 dpi */ + + if (!(init->caps->features & CANON_CAP_t)) + return; + + if (init->xdpi==1440) arg_74_2= 0x04; + if (init->ydpi>=720) arg_74_3= 0x09; + + if (init->bits>1) { + arg_74_1= 0x02; + arg_74_2= 0x80; + arg_74_3= 0x09; + if (init->colormode == COLOR_CMY) arg_74_3= 0x02; /* for BC-06 cartridge!!! */ + } + + /* workaround for the bjc8200 in 6color mode - not really understood */ + if (init->caps->model==8200) { + if (init->colormode==COLOR_CCMMYK) { + arg_74_1= 0xff; + arg_74_2= 0x90; + arg_74_3= 0x04; + init->bits=3; + if (init->ydpi>600) arg_74_3= 0x09; + } else { + arg_74_1= 0x01; + arg_74_2= 0x00; + arg_74_3= 0x01; + if (init->ydpi>600) arg_74_3= 0x09; + } + } + + canon_cmd(v,ESC28,0x74, 3, arg_74_1, arg_74_2, arg_74_3); +} + +static void +canon_init_printer(const stp_vars_t v, canon_init_t *init) +{ + int mytop; + /* init printer */ + + canon_init_resetPrinter(v,init); /* ESC [K */ + canon_init_setPageMode(v,init); /* ESC (a */ + canon_init_setDataCompression(v,init); /* ESC (b */ + canon_init_setPageID(v,init); /* ESC (q */ + canon_init_setPrintMode(v,init); /* ESC (m */ + canon_init_setResolution(v,init); /* ESC (d */ + canon_init_setImage(v,init); /* ESC (t */ + canon_init_setColor(v,init); /* ESC (c */ + canon_init_setPageMargins(v,init); /* ESC (g */ + canon_init_setPageMargins2(v,init); /* ESC (p */ + canon_init_setTray(v,init); /* ESC (l */ + canon_init_setX72(v,init); /* ESC (r */ + + /* some linefeeds */ + + mytop= (init->top*init->ydpi)/72; + canon_cmd(v,ESC28,0x65, 2, (mytop >> 8 ),(mytop & 255)); +} + +static void +canon_deinit_printer(const stp_vars_t v, canon_init_t *init) +{ + /* eject page */ + stp_putc(0x0c,v); + + /* say goodbye */ + canon_cmd(v,ESC28,0x62,1,0); + if (init->caps->features & CANON_CAP_a) + canon_cmd(v,ESC28,0x61, 1, 0); + canon_cmd(v,ESC40,0,0); +} + + +/* + * 'alloc_buffer()' allocates buffer and fills it with 0 + */ +static unsigned char * +canon_alloc_buffer(int size) +{ + unsigned char *buf= stp_malloc(size); + if (buf) + memset(buf,0,size); + return buf; +} + +/* + * 'advance_buffer()' - Move (num) lines of length (len) down one line + * and sets first line to 0s + * accepts NULL pointers as buf + * !!! buf must contain more than (num) lines !!! + * also sets first line to 0s if num<1 + */ +static void +canon_advance_buffer(unsigned char *buf, int len, int num) +{ + if (!buf || !len) return; + if (num>0) memmove(buf+len,buf,len*num); + memset(buf,0,len); +} + +/* + * 'canon_print()' - Print an image to a CANON printer. + */ +static void +canon_print(const stp_printer_t printer, /* I - Model */ + stp_image_t *image, /* I - Image to print */ + const stp_vars_t v) +{ + int i; + const unsigned char *cmap = stp_get_cmap(v); + int model = stp_printer_get_model(printer); + const char *resolution = stp_get_resolution(v); + const char *media_source = stp_get_media_source(v); + int output_type = stp_get_output_type(v); + int orientation = stp_get_orientation(v); + const char *ink_type = stp_get_ink_type(v); + double scaling = stp_get_scaling(v); + int top = stp_get_top(v); + int left = stp_get_left(v); + int y; /* Looping vars */ + int xdpi, ydpi; /* Resolution */ + int n; /* Output number */ + unsigned short *out; /* Output pixels (16-bit) */ + unsigned char *in, /* Input pixels */ + *black, /* Black bitmap data */ + *cyan, /* Cyan bitmap data */ + *magenta, /* Magenta bitmap data */ + *yellow, /* Yellow bitmap data */ + *lcyan, /* Light cyan bitmap data */ + *lmagenta, /* Light magenta bitmap data */ + *lyellow; /* Light yellow bitmap data */ + int delay_k, + delay_c, + delay_m, + delay_y, + delay_lc, + delay_lm, + delay_ly, + delay_max; + int page_left, /* Left margin of page */ + page_right, /* Right margin of page */ + page_top, /* Top of page */ + page_bottom, /* Bottom of page */ + page_width, /* Width of page */ + page_height, /* Length of page */ + page_true_height, /* True length of page */ + out_width, /* Width of image on page */ + out_length, /* Length of image on page */ + out_bpp, /* Output bytes per pixel */ + length, /* Length of raster data */ + buf_length, /* Length of raster data buffer (dmt) */ + errdiv, /* Error dividend */ + errmod, /* Error modulus */ + errval, /* Current error value */ + errline, /* Current raster line */ + errlast; /* Last raster line loaded */ + stp_convert_t colorfunc = 0; /* Color conversion function... */ + int zero_mask; + int bits= 1; + int image_height, + image_width, + image_bpp; + int ink_spread; + void * dither; + int res_code; + int use_6color= 0; + double k_upper, k_lower; + int emptylines= 0; + stp_vars_t nv = stp_allocate_copy(v); + double lum_adjustment[49], sat_adjustment[49], hue_adjustment[49]; + int have_lum_adjustment= 0; + int have_sat_adjustment= 0; + int have_hue_adjustment= 0; + canon_init_t init; + const canon_cap_t * caps= canon_get_model_capabilities(model); + int printhead= canon_printhead_type(ink_type,caps); + colormode_t colormode = canon_printhead_colors(ink_type,caps); + const paper_t *pt; + const canon_variable_inkset_t *inks; + + if (!stp_get_verified(nv)) + { + stp_eprintf(nv, "Print options not verified; cannot print.\n"); + return; + } + + PUT("top ",top,72); + PUT("left ",left,72); + + /* + * Setup a read-only pixel region for the entire image... + */ + + image->init(image); + image_height = image->height(image); + image_width = image->width(image); + image_bpp = image->bpp(image); + + /* force grayscale if image is grayscale + * or single black cartridge installed + */ + + if ((printhead == 0 || caps->inks == CANON_INK_K) && + output_type != OUTPUT_MONOCHROME) + { + output_type = OUTPUT_GRAY; + stp_set_output_type(nv, output_type); + } + + if (output_type == OUTPUT_GRAY || output_type == OUTPUT_MONOCHROME) + colormode = COLOR_MONOCHROME; + stp_set_output_color_model(nv, COLOR_MODEL_CMY); + + /* + * Choose the correct color conversion function... + */ + + colorfunc = stp_choose_colorfunc(output_type, image_bpp, cmap, &out_bpp, nv); + + /* + * Figure out the output resolution... + */ + + switch (sscanf(resolution,"%dx%d",&xdpi,&ydpi)) { + case 1: ydpi= xdpi; if (ydpi>caps->max_ydpi) ydpi/= 2; break; + case 0: xdpi= caps->max_xdpi; ydpi= caps->max_ydpi; break; + } + + stp_deprintf(STP_DBG_CANON,"canon: resolution=%dx%d\n",xdpi,ydpi); + stp_deprintf(STP_DBG_CANON," rescode =0x%x\n",canon_res_code(caps,xdpi,ydpi)); + res_code= canon_res_code(caps,xdpi,ydpi); + + if (((!strcmp(resolution+(strlen(resolution)-3),"DMT")) || + (!strcmp(resolution+(strlen(resolution)-3),"dmt"))) && + (caps->features & CANON_CAP_DMT) && + output_type != OUTPUT_MONOCHROME) { + bits= 2; + stp_deprintf(STP_DBG_CANON,"canon: using drop modulation technology\n"); + } + + /* + * Compute the output size... + */ + + canon_imageable_area(printer, nv, &page_left, &page_right, + &page_bottom, &page_top); + + stp_compute_page_parameters(page_right, page_left, page_top, page_bottom, + scaling, image_width, image_height, image, + &orientation, &page_width, &page_height, + &out_width, &out_length, &left, &top); + + /* + * Recompute the image length and width. If the image has been + * rotated, these will change from previously. + */ + image_height = image->height(image); + image_width = image->width(image); + + stp_default_media_size(printer, nv, &n, &page_true_height); + + PUT("top ",top,72); + PUT("left ",left,72); + PUT("page_top ",page_top,72); + PUT("page_bottom",page_bottom,72); + PUT("page_left ",page_left,72); + PUT("page_right ",page_right,72); + PUT("page_width ",page_width,72); + PUT("page_height",page_height,72); + PUT("page_true_height",page_true_height,72); + PUT("out_width ", out_width,xdpi); + PUT("out_length", out_length,ydpi); + + image->progress_init(image); + + PUT("top ",top,72); + PUT("left ",left,72); + + pt = get_media_type(stp_get_media_type(nv)); + + init.caps = caps; + init.output_type = output_type; + init.pt = pt; + init.print_head = printhead; + init.colormode = colormode; + init.source_str = media_source; + init.xdpi = xdpi; + init.ydpi = ydpi; + init.page_width = page_width; + init.page_height = page_height; + init.top = top; + init.left = left; + init.bits = bits; + + canon_init_printer(nv, &init); + + /* possibly changed during initialitation + * to enforce valid modes of operation: + */ + bits= init.bits; + xdpi= init.xdpi; + ydpi= init.ydpi; + + /* + * Convert image size to printer resolution... + */ + + out_width = xdpi * out_width / 72; + out_length = ydpi * out_length / 72; + + PUT("out_width ", out_width,xdpi); + PUT("out_length", out_length,ydpi); + + left = xdpi * left / 72; + + PUT("leftskip",left,xdpi); + + if(xdpi==1440){ + delay_k= 0; + delay_c= 112; + delay_m= 224; + delay_y= 336; + delay_lc= 112; + delay_lm= 224; + delay_ly= 336; + delay_max= 336; + stp_deprintf(STP_DBG_CANON,"canon: delay on!\n"); + } else { + delay_k= delay_c= delay_m= delay_y= delay_lc= delay_lm= delay_ly=0; + delay_max=0; + stp_deprintf(STP_DBG_CANON,"canon: delay off!\n"); + } + + /* + * Allocate memory for the raster data... + */ + + length = (out_width + 7) / 8; + + buf_length= length*bits; + + stp_deprintf(STP_DBG_CANON,"canon: buflength is %d!\n",buf_length); + + if (colormode==COLOR_MONOCHROME) { + black = canon_alloc_buffer(buf_length*(delay_k+1)); + cyan = NULL; + magenta = NULL; + lcyan = NULL; + lmagenta= NULL; + yellow = NULL; + lyellow = NULL; + } else { + cyan = canon_alloc_buffer(buf_length*(delay_c+1)); + magenta = canon_alloc_buffer(buf_length*(delay_m+1)); + yellow = canon_alloc_buffer(buf_length*(delay_y+1)); + + if (colormode!=COLOR_CMY) + black = canon_alloc_buffer(buf_length*(delay_k+1)); + else + black = NULL; + + if (colormode==COLOR_CCMMYK || colormode==COLOR_CCMMYYK) { + use_6color= 1; + lcyan = canon_alloc_buffer(buf_length*(delay_lc+1)); + lmagenta = canon_alloc_buffer(buf_length*(delay_lm+1)); + if (colormode==CANON_INK_CcMmYyK) + lyellow = canon_alloc_buffer(buf_length*(delay_lc+1)); + else + lyellow = NULL; + } else { + lcyan = NULL; + lmagenta = NULL; + lyellow = NULL; + } + } + + stp_deprintf(STP_DBG_CANON,"canon: driver will use colors %s%s%s%s%s%s\n", + cyan ? "C" : "", lcyan ? "c" : "", magenta ? "M" : "", + lmagenta ? "m" : "", yellow ? "Y" : "", black ? "K" : ""); + + stp_deprintf(STP_DBG_CANON,"density is %f\n",stp_get_density(nv)); + + /* + * Compute the LUT. For now, it's 8 bit, but that may eventually + * sometimes change. + */ + if (pt) + stp_set_density(nv, stp_get_density(nv) * pt->base_density); + else /* Can't find paper type? Assume plain */ + stp_set_density(nv, stp_get_density(nv) * .5); + stp_set_density(nv, stp_get_density(nv) * canon_density(caps, res_code)); + if (stp_get_density(nv) > 1.0) + stp_set_density(nv, 1.0); + if (colormode == COLOR_MONOCHROME) + stp_set_gamma(nv, stp_get_gamma(nv) / .8); + stp_compute_lut(nv, 256); + + stp_deprintf(STP_DBG_CANON,"density is %f\n",stp_get_density(nv)); + + /* + * Output the page... + */ + + if (xdpi > ydpi) + dither = stp_init_dither(image_width, out_width, 1, xdpi / ydpi, nv); + else + dither = stp_init_dither(image_width, out_width, ydpi / xdpi, 1, nv); + + for (i = 0; i <= NCOLORS; i++) + stp_dither_set_black_level(dither, i, 1.0); + + if (use_6color) + k_lower = .4 / bits + .1; + else + k_lower = .25 / bits; + if (pt) + { + k_lower *= pt->k_lower_scale; + k_upper = pt->k_upper; + } + else + { + k_lower *= .5; + k_upper = .5; + } + stp_dither_set_black_lower(dither, k_lower); + stp_dither_set_black_upper(dither, k_upper); + stp_dither_set_adaptive_limit(dither, .75); + + if ((inks = canon_inks(caps, res_code, colormode, bits))!=0) + { + if (inks->c) + stp_dither_set_ranges(dither, ECOLOR_C, inks->c->count, inks->c->range, + inks->c->density * stp_get_density(nv)); + if (inks->m) + stp_dither_set_ranges(dither, ECOLOR_M, inks->m->count, inks->m->range, + inks->m->density * stp_get_density(nv)); + if (inks->y) + stp_dither_set_ranges(dither, ECOLOR_Y, inks->y->count, inks->y->range, + inks->y->density * stp_get_density(nv)); + if (inks->k) + stp_dither_set_ranges(dither, ECOLOR_K, inks->k->count, inks->k->range, + inks->k->density * stp_get_density(nv)); + } + + switch (stp_get_image_type(nv)) + { + case IMAGE_LINE_ART: + stp_dither_set_ink_spread(dither, 19); + break; + case IMAGE_SOLID_TONE: + stp_dither_set_ink_spread(dither, 15); + break; + case IMAGE_CONTINUOUS: + ink_spread = 13; + /* + if (ydpi > canon_max_vres(model)) + ink_spread++; + */ + if (bits > 1) + ink_spread++; + stp_dither_set_ink_spread(dither, ink_spread); + break; + } + stp_dither_set_density(dither, stp_get_density(nv)); + + in = stp_malloc(image_width * image_bpp); + out = stp_malloc(image_width * out_bpp * 2); + + errdiv = image_height / out_length; + errmod = image_height % out_length; + errval = 0; + errlast = -1; + errline = 0; + if (canon_lum_adjustment(printer)) { + int k; + for (k = 0; k < 49; k++) { + have_lum_adjustment= 1; + lum_adjustment[k] = canon_lum_adjustment(printer)[k]; + if(pt) + if (pt->lum_adjustment) + lum_adjustment[k] *= pt->lum_adjustment[k]; + } + } + if (canon_sat_adjustment(printer)) { + int k; + for (k = 0; k < 49; k++) { + have_sat_adjustment= 1; + sat_adjustment[k] = canon_sat_adjustment(printer)[k]; + if(pt) + if (pt->sat_adjustment) + sat_adjustment[k] *= pt->sat_adjustment[k]; + } + } + if (canon_hue_adjustment(printer)) { + int k; + for (k = 0; k < 49; k++) { + have_hue_adjustment= 1; + hue_adjustment[k] = canon_hue_adjustment(printer)[k]; + if(pt) + if (pt->hue_adjustment) + hue_adjustment[k] += pt->hue_adjustment[k]; + } + } + + + for (y = 0; y < out_length; y ++) + { + int duplicate_line = 1; + if ((y & 63) == 0) + image->note_progress(image, y, out_length); + + if (errline != errlast) + { + errlast = errline; + duplicate_line = 0; + if (image->get_row(image, in, errline) != STP_IMAGE_OK) + break; + (*colorfunc)(nv, in, out, &zero_mask, image_width, image_bpp, cmap, + have_hue_adjustment ? hue_adjustment : NULL, + have_lum_adjustment ? lum_adjustment : NULL, + have_sat_adjustment ? sat_adjustment : NULL); + } + + stp_dither(out, y, dither, cyan, lcyan, magenta, lmagenta, + yellow, 0, black, duplicate_line, zero_mask); + + canon_write_line(nv, caps, ydpi, + black, delay_k, + cyan, delay_c, + magenta, delay_m, + yellow, delay_y, + lcyan, delay_lc, + lmagenta, delay_lm, + lyellow, delay_ly, + length, out_width, left, &emptylines, bits); + + canon_advance_buffer(black, buf_length,delay_k); + canon_advance_buffer(cyan, buf_length,delay_c); + canon_advance_buffer(magenta, buf_length,delay_m); + canon_advance_buffer(yellow, buf_length,delay_y); + canon_advance_buffer(lcyan, buf_length,delay_lc); + canon_advance_buffer(lmagenta,buf_length,delay_lm); + canon_advance_buffer(lyellow, buf_length,delay_ly); + + errval += errmod; + errline += errdiv; + if (errval >= out_length) + { + errval -= out_length; + errline ++; + } + } + image->progress_conclude(image); + + stp_free_dither(dither); + + /* + * Flush delayed buffers... + */ + + if (delay_max) { + stp_deprintf(STP_DBG_CANON,"\ncanon: flushing %d possibly delayed buffers\n", + delay_max); + for (y= 0; y> 1) | + ((line[0] & (1 << 6)) >> 2) | + ((line[0] & (1 << 5)) >> 3) | + ((line[0] & (1 << 4)) >> 4) | + ((line[single_length] & (1 << 7)) >> 0) | + ((line[single_length] & (1 << 6)) >> 1) | + ((line[single_length] & (1 << 5)) >> 2) | + ((line[single_length] & (1 << 4)) >> 3); + outbuf[1] = + ((line[0] & (1 << 3)) << 3) | + ((line[0] & (1 << 2)) << 2) | + ((line[0] & (1 << 1)) << 1) | + ((line[0] & (1 << 0)) << 0) | + ((line[single_length] & (1 << 3)) << 4) | + ((line[single_length] & (1 << 2)) << 3) | + ((line[single_length] & (1 << 1)) << 2) | + ((line[single_length] & (1 << 0)) << 1); + line++; + outbuf += 2; + } +} + +#ifndef USE_3BIT_FOLD_TYPE +#error YOU MUST CHOOSE A VALUE FOR USE_3BIT_FOLD_TYPE +#endif + +#if USE_3BIT_FOLD_TYPE == 333 + +static void +canon_fold_3bit(const unsigned char *line, + int single_length, + unsigned char *outbuf) +{ + int i; + for (i = 0; i < single_length; i++) { + outbuf[0] = + ((line[0] & (1 << 7)) >> 2) | + ((line[0] & (1 << 6)) >> 4) | + ((line[single_length] & (1 << 7)) >> 1) | + ((line[single_length] & (1 << 6)) >> 3) | + ((line[single_length] & (1 << 5)) >> 5) | + ((line[2*single_length] & (1 << 7)) << 0) | + ((line[2*single_length] & (1 << 6)) >> 2) | + ((line[2*single_length] & (1 << 5)) >> 4); + outbuf[1] = + ((line[0] & (1 << 5)) << 2) | + ((line[0] & (1 << 4)) << 0) | + ((line[0] & (1 << 3)) >> 2) | + ((line[single_length] & (1 << 4)) << 1) | + ((line[single_length] & (1 << 3)) >> 1) | + ((line[2*single_length] & (1 << 4)) << 2) | + ((line[2*single_length] & (1 << 3)) << 0) | + ((line[2*single_length] & (1 << 2)) >> 2); + outbuf[2] = + ((line[0] & (1 << 2)) << 4) | + ((line[0] & (1 << 1)) << 2) | + ((line[0] & (1 << 0)) << 0) | + ((line[single_length] & (1 << 2)) << 5) | + ((line[single_length] & (1 << 1)) << 3) | + ((line[single_length] & (1 << 0)) << 1) | + ((line[2*single_length] & (1 << 1)) << 4) | + ((line[2*single_length] & (1 << 0)) << 2); + line++; + outbuf += 3; + } +} + +#elif USE_3BIT_FOLD_TYPE == 323 + +static void +canon_fold_3bit(const unsigned char *line, + int single_length, + unsigned char *outbuf) +{ + unsigned char A0,A1,A2,B0,B1,B2,C0,C1,C2; + const unsigned char *last= line+single_length; + + for (; line < last; line+=3, outbuf+=8) { + + A0= line[0]; B0= line[single_length]; C0= line[2*single_length]; + + if (line> 0) | + ((B0 & 0x80) >> 1) | + ((A0 & 0x80) >> 2) | + ((B0 & 0x40) >> 2) | + ((A0 & 0x40) >> 3) | + ((C0 & 0x20) >> 3) | + ((B0 & 0x20) >> 4) | + ((A0 & 0x20) >> 5); + outbuf[1] = + ((C0 & 0x10) << 3) | + ((B0 & 0x10) << 2) | + ((A0 & 0x10) << 1) | + ((B0 & 0x08) << 1) | + ((A0 & 0x08) << 0) | + ((C0 & 0x04) >> 0) | + ((B0 & 0x04) >> 1) | + ((A0 & 0x04) >> 2); + outbuf[2] = + ((C0 & 0x02) << 6) | + ((B0 & 0x02) << 5) | + ((A0 & 0x02) << 4) | + ((B0 & 0x01) << 4) | + ((A0 & 0x01) << 3) | + ((C1 & 0x80) >> 5) | + ((B1 & 0x80) >> 6) | + ((A1 & 0x80) >> 7); + outbuf[3] = + ((C1 & 0x40) << 1) | + ((B1 & 0x40) << 0) | + ((A1 & 0x40) >> 1) | + ((B1 & 0x20) >> 1) | + ((A1 & 0x20) >> 2) | + ((C1 & 0x10) >> 2) | + ((B1 & 0x10) >> 3) | + ((A1 & 0x10) >> 4); + outbuf[4] = + ((C1 & 0x08) << 4) | + ((B1 & 0x08) << 3) | + ((A1 & 0x08) << 2) | + ((B1 & 0x04) << 2) | + ((A1 & 0x04) << 1) | + ((C1 & 0x02) << 1) | + ((B1 & 0x02) >> 0) | + ((A1 & 0x02) >> 1); + outbuf[5] = + ((C1 & 0x01) << 7) | + ((B1 & 0x01) << 6) | + ((A1 & 0x01) << 5) | + ((B2 & 0x80) >> 3) | + ((A2 & 0x80) >> 4) | + ((C2 & 0x40) >> 4) | + ((B2 & 0x40) >> 5) | + ((A2 & 0x40) >> 6); + outbuf[6] = + ((C2 & 0x20) << 2) | + ((B2 & 0x20) << 1) | + ((A2 & 0x20) << 0) | + ((B2 & 0x10) >> 0) | + ((A2 & 0x10) >> 1) | + ((C2 & 0x08) >> 1) | + ((B2 & 0x08) >> 2) | + ((A2 & 0x08) >> 3); + outbuf[7] = + ((C2 & 0x04) << 5) | + ((B2 & 0x04) << 4) | + ((A2 & 0x04) << 3) | + ((B2 & 0x02) << 3) | + ((A2 & 0x02) << 2) | + ((C2 & 0x01) << 2) | + ((B2 & 0x01) << 1) | + ((A2 & 0x01) << 0); + } +} + +#else +#error 3BIT FOLD TYPE NOT IMPLEMENTED +#endif + +static void +canon_shift_buffer(unsigned char *line,int length,int bits) +{ + int i,j; + for (j=0; j0; i--) { + line[i]= (line[i] >> 1) | (line[i-1] << 7); + } + line[0] = line[0] >> 1; + } +} + +static void +canon_shift_buffer2(unsigned char *line,int length,int bits) +{ + int i; + for (i=length-1; i>0; i--) { + line[i]= (line[i] >> bits) | (line[i-1] << (8-bits)); + } + line[0] = line[0] >> bits; +} + + +/* + * 'canon_write()' - Send graphics using TIFF packbits compression. + */ + +static int +canon_write(const stp_vars_t v, /* I - Print file or command */ + const canon_cap_t * caps, /* I - Printer model */ + unsigned char *line, /* I - Output bitmap data */ + int length, /* I - Length of bitmap data */ + int coloridx, /* I - Which color */ + int ydpi, /* I - Vertical resolution */ + int *empty, /* IO- Preceeding empty lines */ + int width, /* I - Printed width */ + int offset, /* I - Offset from left side */ + int bits) +{ + unsigned char + comp_buf[COMPBUFWIDTH], /* Compression buffer */ + in_fold[COMPBUFWIDTH], + *in_ptr= line, + *comp_ptr, *comp_data; + int newlength; + int offset2,bitoffset; + unsigned char color; + + /* Don't send blank lines... */ + + if (line[0] == 0 && memcmp(line, line + 1, length - 1) == 0) + return 0; + + /* fold lsb/msb pairs if drop modulation is active */ + + + + if (bits==2) { + memset(in_fold,0,length*2); + canon_fold_2bit(line,length,in_fold); + in_ptr= in_fold; + length= (length*8/4); /* 4 pixels in 8bit */ + offset= (offset*8/4); /* 4 pixels in 8bit */ + } + if (bits==3) { + memset(in_fold,0,length*3); + canon_fold_3bit(line,length,in_fold); + in_ptr= in_fold; + length= (length*8)/3; + offset= (offset/3)*8; +#if 0 + switch(offset%3){ + case 0: offset= (offset/3)*8; break; + case 1: offset= (offset/3)*8/*+3 CAREFUL! CANNOT SHIFT _AFTER_ RECODING!!*/; break; + case 2: offset= (offset/3)*8/*+5 CAREFUL! CANNOT SHIFT _AFTER_ RECODING!!*/; break; + } +#endif + } + /* pack left border rounded to multiples of 8 dots */ + + comp_data= comp_buf; + offset2= offset/8; + bitoffset= offset%8; + while (offset2>0) { + unsigned char toffset = offset2 > 128 ? 128 : offset2; + comp_data[0] = 1 - toffset; + comp_data[1] = 0; + comp_data += 2; + offset2-= toffset; + } + if (bitoffset) { + if (bitoffset<8) + canon_shift_buffer(in_ptr,length,bitoffset); + else + stp_deprintf(STP_DBG_CANON,"SEVERE BUG IN print-canon.c::canon_write() " + "bitoffset=%d!!\n",bitoffset); + } + + stp_pack_tiff(in_ptr, length, comp_data, &comp_ptr); + newlength= comp_ptr - comp_buf; + + /* send packed empty lines if any */ + + if (*empty) { + stp_zfwrite("\033\050\145\002\000", 5, 1, v); + stp_putc((*empty) >> 8 , v); + stp_putc((*empty) & 255, v); + *empty= 0; + } + + /* Send a line of raster graphics... */ + + stp_zfwrite("\033\050\101", 3, 1, v); + stp_putc((newlength+1) & 255, v); + stp_putc((newlength+1) >> 8, v); + color= "CMYKcmy"[coloridx]; + if (!color) color= 'K'; + stp_putc(color,v); + stp_zfwrite((const char *)comp_buf, newlength, 1, v); + stp_putc('\015', v); + return 1; +} + + +static void +canon_write_line(const stp_vars_t v, /* I - Print file or command */ + const canon_cap_t * caps, /* I - Printer model */ + int ydpi, /* I - Vertical resolution */ + unsigned char *k, /* I - Output bitmap data */ + int dk, /* I - */ + unsigned char *c, /* I - Output bitmap data */ + int dc, /* I - */ + unsigned char *m, /* I - Output bitmap data */ + int dm, /* I - */ + unsigned char *y, /* I - Output bitmap data */ + int dy, /* I - */ + unsigned char *lc, /* I - Output bitmap data */ + int dlc, /* I - */ + unsigned char *lm, /* I - Output bitmap data */ + int dlm, /* I - */ + unsigned char *ly, /* I - Output bitmap data */ + int dly, /* I - */ + int l, /* I - Length of bitmap data */ + int width, /* I - Printed width */ + int offset, /* I - horizontal offset */ + int *empty, /* IO- unflushed empty lines */ + int bits) +{ + int written= 0; + + if (k) written+= + canon_write(v, caps, k+ dk*l, l, 3, ydpi, empty, width, offset, bits); + if (y) written+= + canon_write(v, caps, y+ dy*l, l, 2, ydpi, empty, width, offset, bits); + if (m) written+= + canon_write(v, caps, m+ dm*l, l, 1, ydpi, empty, width, offset, bits); + if (c) written+= + canon_write(v, caps, c+ dc*l, l, 0, ydpi, empty, width, offset, bits); + if (ly) written+= + canon_write(v, caps, ly+dly*l, l, 6, ydpi, empty, width, offset, bits); + if (lm) written+= + canon_write(v, caps, lm+dlm*l, l, 5, ydpi, empty, width, offset, bits); + if (lc) written+= + canon_write(v, caps, lc+dlc*l, l, 4, ydpi, empty, width, offset, bits); + + if (written||(empty==0)) + stp_zfwrite("\033\050\145\002\000\000\001", 7, 1, v); + else + (*empty)+= 1; +} diff --git a/src/main/print-color.c b/src/main/print-color.c new file mode 100644 index 0000000..10caa73 --- /dev/null +++ b/src/main/print-color.c @@ -0,0 +1,2146 @@ +/* + * "$Id: print-color.c,v 1.26 2001/10/21 20:18:01 rlk Exp $" + * + * Print plug-in color management for the GIMP. + * + * Copyright 1997-2000 Michael Sweet (mike@easysw.com) and + * Robert Krawitz (rlk@alum.mit.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + * This file must include only standard C header files. The core code must + * compile on generic platforms that don't support glib, gimp, gtk, etc. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include "gimp-print-internal.h" +#include +#include +#include + +#ifdef __GNUC__ +#define inline __inline__ +#endif + +typedef struct +{ + unsigned steps; + unsigned short *composite; + unsigned short *red; + unsigned short *green; + unsigned short *blue; + unsigned shiftval; + unsigned bin_size; + unsigned bin_shift; +} lut_t; + +/* + * RGB to grayscale luminance constants... + */ + +#define LUM_RED 31 +#define LUM_GREEN 61 +#define LUM_BLUE 8 + +/* rgb/hsl conversions taken from Gimp common/autostretch_hsv.c */ + +#define FMAX(a, b) ((a) > (b) ? (a) : (b)) +#define FMIN(a, b) ((a) < (b) ? (a) : (b)) + + +static inline void +calc_rgb_to_hsl(unsigned short *rgb, double *hue, double *sat, + double *lightness) +{ + double red, green, blue; + double h, s, l; + double min, max; + double delta; + int maxval; + + red = rgb[0] / 65535.0; + green = rgb[1] / 65535.0; + blue = rgb[2] / 65535.0; + + if (red > green) + { + if (red > blue) + { + max = red; + maxval = 0; + } + else + { + max = blue; + maxval = 2; + } + min = FMIN(green, blue); + } + else + { + if (green > blue) + { + max = green; + maxval = 1; + } + else + { + max = blue; + maxval = 2; + } + min = FMIN(red, blue); + } + + l = (max + min) / 2.0; + delta = max - min; + + if (delta < .000001) /* Suggested by Eugene Anikin */ + { + s = 0.0; + h = 0.0; + } + else + { + if (l <= .5) + s = delta / (max + min); + else + s = delta / (2 - max - min); + + if (maxval == 0) + h = (green - blue) / delta; + else if (maxval == 1) + h = 2 + (blue - red) / delta; + else + h = 4 + (red - green) / delta; + + if (h < 0.0) + h += 6.0; + else if (h > 6.0) + h -= 6.0; + } + + *hue = h; + *sat = s; + *lightness = l; +} + +static inline double +hsl_value(double n1, double n2, double hue) +{ + if (hue < 0) + hue += 6.0; + else if (hue > 6) + hue -= 6.0; + if (hue < 1.0) + return (n1 + (n2 - n1) * hue); + else if (hue < 3.0) + return (n2); + else if (hue < 4.0) + return (n1 + (n2 - n1) * (4.0 - hue)); + else + return (n1); +} + +static inline void +calc_hsl_to_rgb(unsigned short *rgb, double h, double s, double l) +{ + if (s < .0000001) + { + if (l > 1) + l = 1; + else if (l < 0) + l = 0; + rgb[0] = l * 65535; + rgb[1] = l * 65535; + rgb[2] = l * 65535; + } + else + { + double m1, m2; + double h1, h2; + h1 = h + 2; + h2 = h - 2; + + if (l < .5) + m2 = l * (1 + s); + else + m2 = l + s - (l * s); + m1 = (l * 2) - m2; + rgb[0] = 65535 * hsl_value(m1, m2, h1); + rgb[1] = 65535 * hsl_value(m1, m2, h); + rgb[2] = 65535 * hsl_value(m1, m2, h2); + } +} + +static inline void +update_cmyk(unsigned short *rgb) +{ + int c = 65535 - rgb[0]; + int m = 65535 - rgb[1]; + int y = 65535 - rgb[2]; + int nc, nm, ny; + int k; + if (c == m && c == y) + return; + k = FMIN(FMIN(c, m), y); + + /* + * This is an attempt to achieve better color balance. The goal + * is to weaken the pure cyan, magenta, and yellow and strengthen + * pure red, green, and blue. + * + * We also don't want S=1 V=1 cyan to be 100% cyan; it's simply + * too dark. + */ + + nc = (c * 3 + FMIN(c, FMAX(m, y)) * 4 + FMAX(m, y) * 0 + k) / 8; + nm = (m * 3 + FMIN(m, FMAX(c, y)) * 4 + FMAX(c, y) * 0 + k) / 8; + ny = (y * 3 + FMIN(y, FMAX(c, m)) * 4 + FMAX(c, m) * 0 + k) / 8; + + /* + * Make sure we didn't go overboard. We don't want to go too + * close to white unnecessarily. + */ + nc = c + (nc - c) / 3; + nm = m + (nm - m) / 3; + ny = y + (ny - y) / 3; + + if (nc > 65535) + nc = 65535; + if (nm > 65535) + nm = 65535; + if (ny > 65535) + ny = 65535; + + rgb[0] = 65535 - nc; + rgb[1] = 65535 - nm; + rgb[2] = 65535 - ny; +} + +/* + * A lot of this stuff needs to be factored out of here + */ +static inline unsigned short +lookup_value(unsigned short value, int lut_size, const unsigned short *lut, + unsigned shiftval, unsigned bin_size, unsigned bin_shift) +{ + unsigned subrange; + unsigned remainder; + unsigned below; + unsigned above; + if (lut_size == 65536) + return lut[value]; + subrange = value >> bin_shift; + remainder = value & (bin_size - 1); + below = lut[subrange]; + if (remainder == 0) + return below; + if (subrange == (bin_size - 1)) + above = lut[subrange]; + else + above = lut[subrange + 1]; + if (above == below) + return above; + else + return below + (((above - below) * remainder) >> bin_shift); +} + +/* + * 'gray_to_gray()' - Convert grayscale image data to grayscale (brightness + * adjusted). + */ + +static void +gray_to_gray(const stp_vars_t vars, + const unsigned char *grayin, + unsigned short *grayout, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + int i0 = -1; + int o0 = 0; + int nz = 0; + lut_t *lut = (lut_t *)(stp_get_lut(vars)); + double density = stp_get_density(vars); + if (width <= 0) + return; + while (width) + { + if (i0 != grayin[0]) + { + i0 = grayin[0]; + o0 = lut->composite[i0]; + if (density != 1.0) + o0 = .5 + (o0 * density); + nz |= o0; + } + grayout[0] = o0; + grayin ++; + grayout ++; + width --; + } + if (zero_mask) + *zero_mask = nz ? 0 : 1; +} + +static void +gray_alpha_to_gray(const stp_vars_t vars, + const unsigned char *grayin, + unsigned short *grayout, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + int i0 = -1; + int i1 = -1; + int o0 = 0; + int nz = 0; + lut_t *lut = (lut_t *)(stp_get_lut(vars)); + double density = stp_get_density(vars); + if (width <= 0) + return; + while (width) + { + if (i0 != grayin[0] || i1 != grayin[1]) + { + i0 = grayin[0]; + i1 = grayin[1]; + o0 = lut->composite[i0 * i1 / 255 + 255 - i1]; + if (density != 1.0) + o0 = .5 + (o0 * density); + nz |= o0; + } + grayout[0] = o0; + grayin += 2; + grayout ++; + width --; + } + if (zero_mask) + *zero_mask = nz ? 0 : 1; +} + +static void +gray_to_monochrome(const stp_vars_t vars, + const unsigned char *grayin, + unsigned short *grayout, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + int i0 = -1; + int o0 = 0; + int nz = 0; + lut_t *lut = (lut_t *)(stp_get_lut(vars)); + if (width <= 0) + return; + while (width) + { + if (i0 != grayin[0]) + { + i0 = grayin[0]; + o0 = lut->composite[grayin[0]]; + if (o0 < 32768) + o0 = 0; + else + o0 = 65535; + nz |= o0; + } + grayout[0] = o0; + grayin ++; + grayout ++; + width --; + } + if (zero_mask) + *zero_mask = nz ? 0 : 1; +} + +static void +gray_alpha_to_monochrome(const stp_vars_t vars, + const unsigned char *grayin, + unsigned short *grayout, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + int i0 = -1; + int i1 = -1; + int o0 = 0; + int nz = 0; + lut_t *lut = (lut_t *)(stp_get_lut(vars)); + if (width <= 0) + return; + while (width) + { + if (i0 != grayin[0] || i1 != grayin[1]) + { + i0 = grayin[0]; + i1 = grayin[1]; + o0 = lut->composite[i0 * i1 / 255 + 255 - i1]; + if (o0 < 32768) + o0 = 0; + else + o0 = 65535; + nz |= o0; + } + grayout[0] = o0; + grayin += 2; + grayout ++; + width --; + } + if (zero_mask) + *zero_mask = nz ? 0 : 1; +} + +/* + * 'indexed_to_gray()' - Convert indexed image data to grayscale. + */ + +static void +indexed_to_gray(const stp_vars_t vars, + const unsigned char *indexed, + unsigned short *gray, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + int i0 = -1; + int o0 = 0; + int i; + int nz = 0; + lut_t *lut = (lut_t *)(stp_get_lut(vars)); + unsigned char gray_cmap[256]; /* Grayscale colormap */ + double density = stp_get_density(vars); + if (width <= 0) + return; + + /* Really should precompute this silly thing... */ + for (i = 0; i < 256; i ++, cmap += 3) + gray_cmap[i] = (cmap[0] * LUM_RED + + cmap[1] * LUM_GREEN + + cmap[2] * LUM_BLUE) / 100; + while (width) + { + if (i0 != indexed[0]) + { + i0 = indexed[0]; + o0 = lut->composite[gray_cmap[i0]]; + if (density != 1.0) + o0 = .5 + (o0 * density); + nz |= o0; + } + gray[0] = o0; + gray ++; + indexed ++; + width --; + } + if (zero_mask) + *zero_mask = nz ? 0 : 1; +} + +static void +indexed_alpha_to_gray(const stp_vars_t vars, + const unsigned char *indexed, + unsigned short *gray, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + int i0 = -1; + int i1 = -1; + int o0 = 0; + int nz = 0; + int i; + lut_t *lut = (lut_t *)(stp_get_lut(vars)); + unsigned char gray_cmap[256]; /* Grayscale colormap */ + double density = stp_get_density(vars); + if (width <= 0) + return; + + /* Really should precompute this silly thing... */ + for (i = 0; i < 256; i ++, cmap += 3) + gray_cmap[i] = (cmap[0] * LUM_RED + + cmap[1] * LUM_GREEN + + cmap[2] * LUM_BLUE) / 100; + + while (width) + { + if (i0 != indexed[0] || i1 != indexed[1]) + { + i0 = indexed[0]; + i1 = indexed[1]; + o0 = lut->composite[gray_cmap[i0 * i1 / 255] + 255 - i1]; + if (density != 1.0) + o0 = .5 + (o0 * density); + nz |= o0; + } + gray[0] = o0; + gray ++; + indexed += 2; + width --; + } + if (zero_mask) + *zero_mask = nz ? 0 : 1; +} + +static void +indexed_to_monochrome(const stp_vars_t vars, + const unsigned char *indexed, + unsigned short *gray, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + int i0 = -1; + int o0 = 0; + int i; + int nz = 0; + lut_t *lut = (lut_t *)(stp_get_lut(vars)); + unsigned char gray_cmap[256]; /* Grayscale colormap */ + if (width <= 0) + return; + + /* Really should precompute this silly thing... */ + for (i = 0; i < 256; i ++, cmap += 3) + gray_cmap[i] = (cmap[0] * LUM_RED + + cmap[1] * LUM_GREEN + + cmap[2] * LUM_BLUE) / 100; + + while (width) + { + if (i0 != indexed[0]) + { + i0 = indexed[0]; + o0 = lut->composite[gray_cmap[i0]]; + if (o0 < 32768) + o0 = 0; + else + o0 = 65535; + nz |= o0; + } + gray[0] = o0; + indexed ++; + gray ++; + width --; + } + if (zero_mask) + *zero_mask = nz ? 0 : 1; +} + +static void +indexed_alpha_to_monochrome(const stp_vars_t vars, + const unsigned char *indexed, + unsigned short *gray, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + int i0 = -1; + int i1 = -1; + int o0 = 0; + int nz = 0; + int i; + lut_t *lut = (lut_t *)(stp_get_lut(vars)); + unsigned char gray_cmap[256]; /* Grayscale colormap */ + if (width <= 0) + return; + + /* Really should precompute this silly thing... */ + for (i = 0; i < 256; i ++, cmap += 3) + gray_cmap[i] = (cmap[0] * LUM_RED + + cmap[1] * LUM_GREEN + + cmap[2] * LUM_BLUE) / 100; + while (width) + { + if (i0 != indexed[0] || i1 != indexed[1]) + { + i0 = indexed[0]; + i1 = indexed[1]; + o0 = lut->composite[gray_cmap[i0 * i1 / 255] + 255 - i1]; + if (o0 < 32768) + o0 = 0; + else + o0 = 65535; + nz |= o0; + } + gray[0] = o0; + indexed += 2; + gray ++; + width --; + } + if (zero_mask) + *zero_mask = nz ? 0 : 1; +} + +/* + * 'rgb_to_gray()' - Convert RGB image data to grayscale. + */ + +static void +rgb_to_gray(const stp_vars_t vars, + const unsigned char *rgb, + unsigned short *gray, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + int i0 = -1; + int i1 = -1; + int i2 = -1; + int o0 = 0; + int nz = 0; + lut_t *lut = (lut_t *)(stp_get_lut(vars)); + double density = stp_get_density(vars); + if (width <= 0) + return; + while (width) + { + if (i0 != rgb[0] || i1 != rgb[1] || i2 != rgb[2]) + { + i0 = rgb[0]; + i1 = rgb[1]; + i2 = rgb[2]; + o0 = lut->composite[(i0 * LUM_RED + i1 * LUM_GREEN + + i2 * LUM_BLUE) / 100]; + if (density != 1.0) + o0 = .5 + (o0 * density); + nz |= o0; + } + gray[0] = o0; + rgb += 3; + gray ++; + width --; + } + if (zero_mask) + *zero_mask = nz ? 0 : 1; +} + +static void +rgb_alpha_to_gray(const stp_vars_t vars, + const unsigned char *rgb, + unsigned short *gray, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + int i0 = -1; + int i1 = -1; + int i2 = -1; + int i3 = -1; + int o0 = 0; + int nz = 0; + lut_t *lut = (lut_t *)(stp_get_lut(vars)); + double density = stp_get_density(vars); + if (width <= 0) + return; + while (width) + { + if (i0 != rgb[0] || i1 != rgb[1] || i2 != rgb[2] || i3 != rgb[3]) + { + i0 = rgb[0]; + i1 = rgb[1]; + i2 = rgb[2]; + i3 = rgb[3]; + o0= lut->composite[((i0 * LUM_RED + + i1 * LUM_GREEN + + i2 * LUM_BLUE) * + i3 / 25500 + 255 - i3)]; + if (density != 1.0) + o0 = .5 + (o0 * density); + nz |= o0; + } + gray[0] = o0; + rgb += 4; + gray ++; + width --; + } + if (zero_mask) + *zero_mask = nz ? 0 : 1; +} + +static void +rgb_to_monochrome(const stp_vars_t vars, + const unsigned char *rgb, + unsigned short *gray, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + int i0 = -1; + int i1 = -1; + int i2 = -1; + int o0 = 0; + int nz = 0; + lut_t *lut = (lut_t *)(stp_get_lut(vars)); + if (width <= 0) + return; + while (width) + { + if (i0 != rgb[0] || i1 != rgb[1] || i2 != rgb[2]) + { + i0 = rgb[0]; + i1 = rgb[1]; + i2 = rgb[2]; + o0 = lut->composite[(i0 * LUM_RED + i1 * LUM_GREEN + + i2 * LUM_BLUE) / 100]; + if (o0 < 32768) + o0 = 0; + else + o0 = 65535; + nz |= o0; + } + gray[0] = o0; + rgb += 3; + gray ++; + width --; + } + if (zero_mask) + *zero_mask = nz ? 0 : 1; +} + +static void +rgb_alpha_to_monochrome(const stp_vars_t vars, + const unsigned char *rgb, + unsigned short *gray, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + int i0 = -1; + int i1 = -1; + int i2 = -1; + int i3 = -1; + int o0 = 0; + int nz = 0; + lut_t *lut = (lut_t *)(stp_get_lut(vars)); + if (width <= 0) + return; + while (width) + { + if (i0 != rgb[0] || i1 != rgb[1] || i2 != rgb[2] || i3 != rgb[3]) + { + i0 = rgb[0]; + i1 = rgb[1]; + i2 = rgb[2]; + i3 = rgb[3]; + o0= lut->composite[((i0 * LUM_RED + + i1 * LUM_GREEN + + i2 * LUM_BLUE) * + i3 / 25500 + 255 - i3)]; + if (o0 < 32768) + o0 = 0; + else + o0 = 65535; + nz |= o0; + } + gray[0] = o0; + rgb += 4; + gray ++; + width --; + } + if (zero_mask) + *zero_mask = nz ? 0 : 1; +} + +/* + * 'rgb_to_rgb()' - Convert rgb image data to RGB. + */ + +static void +rgb_to_rgb(const stp_vars_t vars, + const unsigned char *rgbin, + unsigned short *rgbout, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + unsigned ld = stp_get_density(vars) * 65536; + double isat = 1.0; + double ssat = stp_get_saturation(vars); + int i0 = -1; + int i1 = -1; + int i2 = -1; + int i3 = -1; + int o0 = 0; + int o1 = 0; + int o2 = 0; + int nz0 = 0; + int nz1 = 0; + int nz2 = 0; + lut_t *lut = (lut_t *)(stp_get_lut(vars)); + int compute_saturation = ssat <= .99999 || ssat >= 1.00001; + int split_saturation = ssat > 1.4; + if (split_saturation) + ssat = sqrt(ssat); + if (ssat > 1) + isat = 1.0 / ssat; + while (width > 0) + { + double h, s, l; + switch (bpp) + { + case 1: + /* + * No alpha in image, using colormap... + */ + if (i0 == rgbin[0]) + { + rgbout[0] = o0; + rgbout[1] = o1; + rgbout[2] = o2; + goto out; + } + else + { + i0 = rgbin[0] * 3; + i1 = cmap[i0 + 1]; + i2 = cmap[i0 + 2]; + i0 = cmap[i0]; + rgbout[0] = i0 | (i0 << 8); + rgbout[1] = i1 | (i1 << 8); + rgbout[2] = i2 | (i2 << 8); + i0 = rgbin[0]; + } + break; + case 2: + if (i0 == rgbin[0] && i1 == rgbin[1]) + { + rgbout[0] = o0; + rgbout[1] = o1; + rgbout[2] = o2; + goto out; + } + else + { + i0 = rgbin[0] * 3; + i3 = rgbin[1]; + i1 = cmap[i0 + 1] * i3 / 255 + 255 - i3; + i2 = cmap[i0 + 2] * i3 / 255 + 255 - i3; + i0 = cmap[i0] * i3 / 255 + 255 - i3; + + rgbout[0] = i0 | (i0 << 8); + rgbout[1] = i1 | (i1 << 8); + rgbout[2] = i2 | (i2 << 8); + i0 = rgbin[0]; + i1 = rgbin[1]; + } + break; + case 3: + /* + * No alpha in image... + */ + if (i0 == rgbin[0] && i1 == rgbin[1] && i2 == rgbin[2]) + { + rgbout[0] = o0; + rgbout[1] = o1; + rgbout[2] = o2; + goto out; + } + else + { + i0 = rgbin[0]; + i1 = rgbin[1]; + i2 = rgbin[2]; + rgbout[0] = i0 | (i0 << 8); + rgbout[1] = i1 | (i1 << 8); + rgbout[2] = i2 | (i2 << 8); + } + break; + case 4: + if (i0 == rgbin[0] && i1 == rgbin[1] && i2 == rgbin[2] && + i3 == rgbin[3]) + { + rgbout[0] = o0; + rgbout[1] = o1; + rgbout[2] = o2; + goto out; + } + else + { + i3 = rgbin[3]; + i0 = rgbin[0] * i3 / 255 + 255 - i3; + i1 = rgbin[1] * i3 / 255 + 255 - i3; + i2 = rgbin[2] * i3 / 255 + 255 - i3; + rgbout[0] = i0 | (i0 << 8); + rgbout[1] = i1 | (i1 << 8); + rgbout[2] = i2 | (i2 << 8); + } + break; + } + if ((compute_saturation) && + (rgbout[0] != rgbout[1] || rgbout[0] != rgbout[2])) + { + calc_rgb_to_hsl(rgbout, &h, &s, &l); + if (ssat < 1) + s *= ssat; + else + { + double s1 = s * ssat; + double s2 = 1.0 - ((1.0 - s) * isat); + s = FMIN(s1, s2); + } + if (s > 1) + s = 1.0; + calc_hsl_to_rgb(rgbout, h, s, l); + } + update_cmyk(rgbout); /* Fiddle with the INPUT */ + rgbout[0] = lookup_value(rgbout[0], lut->steps, + lut->red, lut->shiftval, + lut->bin_size, lut->bin_shift); + rgbout[1] = lookup_value(rgbout[1], lut->steps, + lut->green, lut->shiftval, + lut->bin_size, lut->bin_shift); + rgbout[2] = lookup_value(rgbout[2], lut->steps, + lut->blue, lut->shiftval, + lut->bin_size, lut->bin_shift); + if ((split_saturation || hue_map || lum_map || sat_map) && + (rgbout[0] != rgbout[1] || rgbout[0] != rgbout[2])) + { + calc_rgb_to_hsl(rgbout, &h, &s, &l); + if (split_saturation) + { + if (ssat < 1) + s *= ssat; + else + { + double s1 = s * ssat; + double s2 = 1.0 - ((1.0 - s) * isat); + s = FMIN(s1, s2); + } + } + if (s > 1) + s = 1.0; + if (hue_map || lum_map || sat_map) + { + if (hue_map) + { + int ih; + double eh; + double nh = h * 8; + ih = (int) nh; + eh = nh - (double) ih; + h = (ih / 8.0) + hue_map[ih] + + eh * ((1.0 / 8.0) + hue_map[ih + 1] - hue_map[ih]); + if (h < 0.0) + h += 6.0; + else if (h >= 6.0) + h -= 6.0; + } + if (lum_map && l > .0001 && l < .9999) + { + int ih; + double eh; + double nh = h * 8; + ih = (int) nh; + eh = nh - (double) ih; + if (lum_map[ih] != 1.0 || lum_map[ih + 1] != 1.0) + { + double el = lum_map[ih] + + eh * (lum_map[ih + 1] - lum_map[ih]); + el = 1.0 + (s * (el - 1.0)); + if (l > .5) + el = 1.0 + ((2.0 * (1.0 - l)) * (el - 1.0)); + l = 1.0 - pow(1.0 - l, el); + } + } + if (sat_map) + { + int ih; + double eh; + double nh = h * 8; + ih = (int) nh; + eh = nh - (double) ih; + if (sat_map[ih] != 1.0 || sat_map[ih + 1] != 1.0) + { + double es = sat_map[ih] + + eh * (sat_map[ih + 1] - sat_map[ih]); + s = 1.0 - pow(1.0 - s, es); + } + } + } + calc_hsl_to_rgb(rgbout, h, s, l); + } + if (ld < 65536) + { + int i; + for (i = 0; i < 3; i++) + { + unsigned t = rgbout[i]; + t = t * ld / 65536; + rgbout[i] = (unsigned short) t; + } + } + o0 = rgbout[0]; + o1 = rgbout[1]; + o2 = rgbout[2]; + nz0 |= o0; + nz1 |= o1; + nz2 |= o2; + out: + rgbin += bpp; + rgbout += 3; + width --; + } + if (zero_mask) + { + *zero_mask = nz0 ? 0 : 1; + *zero_mask |= nz1 ? 0 : 2; + *zero_mask |= nz2 ? 0 : 4; + } +} + +static void +indexed_to_rgb(const stp_vars_t vars, + const unsigned char *indexed, + unsigned short *rgb, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + rgb_to_rgb(vars, indexed, rgb, zero_mask, width, bpp, cmap, + hue_map, lum_map, sat_map); +} + +static void +solid_rgb_to_rgb(const stp_vars_t vars, + const unsigned char *rgbin, + unsigned short *rgbout, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + unsigned ld = stp_get_density(vars) * 65536; + double isat = 1.0; + double ssat = stp_get_saturation(vars); + int i0 = -1; + int i1 = -1; + int i2 = -1; + int i3 = -1; + int o0 = 0; + int o1 = 0; + int o2 = 0; + int nz0 = 0; + int nz1 = 0; + int nz2 = 0; + lut_t *lut = (lut_t *)(stp_get_lut(vars)); + int compute_saturation = ssat <= .99999 || ssat >= 1.00001; + int split_saturation = ssat > 1.4; + if (split_saturation) + ssat = sqrt(ssat); + if (ssat > 1) + isat = 1.0 / ssat; + while (width > 0) + { + double h, s, l; + switch (bpp) + { + case 1: + /* + * No alpha in image, using colormap... + */ + if (i0 == rgbin[0]) + { + rgbout[0] = o0; + rgbout[1] = o1; + rgbout[2] = o2; + goto out; + } + else + { + i0 = rgbin[0] * 3; + i1 = cmap[i0 + 1]; + i2 = cmap[i0 + 2]; + i0 = cmap[i0]; + rgbout[0] = i0 | (i0 << 8); + rgbout[1] = i1 | (i1 << 8); + rgbout[2] = i2 | (i2 << 8); + i0 = rgbin[0]; + } + break; + case 2: + if (i0 == rgbin[0] && i1 == rgbin[1]) + { + rgbout[0] = o0; + rgbout[1] = o1; + rgbout[2] = o2; + goto out; + } + else + { + i0 = rgbin[0] * 3; + i3 = rgbin[1]; + i1 = cmap[i0 + 1] * i3 / 255 + 255 - i3; + i2 = cmap[i0 + 2] * i3 / 255 + 255 - i3; + i0 = cmap[i0] * i3 / 255 + 255 - i3; + + rgbout[0] = i0 | (i0 << 8); + rgbout[1] = i1 | (i1 << 8); + rgbout[2] = i2 | (i2 << 8); + i0 = rgbin[0]; + i1 = rgbin[1]; + } + break; + case 3: + /* + * No alpha in image... + */ + if (i0 == rgbin[0] && i1 == rgbin[1] && i2 == rgbin[2]) + { + rgbout[0] = o0; + rgbout[1] = o1; + rgbout[2] = o2; + goto out; + } + else + { + i0 = rgbin[0]; + i1 = rgbin[1]; + i2 = rgbin[2]; + rgbout[0] = i0 | (i0 << 8); + rgbout[1] = i1 | (i1 << 8); + rgbout[2] = i2 | (i2 << 8); + } + break; + case 4: + if (i0 == rgbin[0] && i1 == rgbin[1] && i2 == rgbin[2] && + i3 == rgbin[3]) + { + rgbout[0] = o0; + rgbout[1] = o1; + rgbout[2] = o2; + goto out; + } + else + { + i3 = rgbin[3]; + i0 = rgbin[0] * i3 / 255 + 255 - i3; + i1 = rgbin[1] * i3 / 255 + 255 - i3; + i2 = rgbin[2] * i3 / 255 + 255 - i3; + rgbout[0] = i0 | (i0 << 8); + rgbout[1] = i1 | (i1 << 8); + rgbout[2] = i2 | (i2 << 8); + } + break; + } + if ((compute_saturation) && + (rgbout[0] != rgbout[1] || rgbout[0] != rgbout[2])) + { + calc_rgb_to_hsl(rgbout, &h, &s, &l); + if (ssat < 1) + s *= ssat; + else + { + double s1 = s * ssat; + double s2 = 1.0 - ((1.0 - s) * isat); + s = FMIN(s1, s2); + } + if (s > 1) + s = 1.0; + calc_hsl_to_rgb(rgbout, h, s, l); + } + update_cmyk(rgbout); /* Fiddle with the INPUT */ + rgbout[0] = lookup_value(rgbout[0], lut->steps, + lut->red, lut->shiftval, + lut->bin_size, lut->bin_shift); + rgbout[1] = lookup_value(rgbout[1], lut->steps, + lut->green, lut->shiftval, + lut->bin_size, lut->bin_shift); + rgbout[2] = lookup_value(rgbout[2], lut->steps, + lut->blue, lut->shiftval, + lut->bin_size, lut->bin_shift); + if ((split_saturation || hue_map || lum_map || sat_map) && + (rgbout[0] != rgbout[1] || rgbout[0] != rgbout[2])) + { + calc_rgb_to_hsl(rgbout, &h, &s, &l); + if (split_saturation) + { + if (ssat < 1) + s *= ssat; + else + { + double s1 = s * ssat; + double s2 = 1.0 - ((1.0 - s) * isat); + s = FMIN(s1, s2); + } + } + if (s > 1) + s = 1.0; + if (hue_map || lum_map || sat_map) + { + if (hue_map) + { + int ih; + double eh; + double nh = h * 8; + ih = (int) nh; + eh = nh - (double) ih; + h = (ih / 8.0) + hue_map[ih] + + eh * ((1.0 / 8.0) + hue_map[ih + 1] - hue_map[ih]); + if (h < 0.0) + h += 6.0; + else if (h >= 6.0) + h -= 6.0; + } + if (sat_map) + { + int ih; + double eh; + double nh = h * 8; + ih = (int) nh; + eh = nh - (double) ih; + if (sat_map[ih] != 1.0 || sat_map[ih + 1] != 1.0) + { + double es = sat_map[ih] + + eh * (sat_map[ih + 1] - sat_map[ih]); + s = 1.0 - pow(1.0 - s, es); + } + } + } + calc_hsl_to_rgb(rgbout, h, s, l); + } + if (ld < 65536) + { + int i; + for (i = 0; i < 3; i++) + { + unsigned t = rgbout[i]; + t = t * ld / 65536; + rgbout[i] = (unsigned short) t; + } + } + o0 = rgbout[0]; + o1 = rgbout[1]; + o2 = rgbout[2]; + nz0 |= o0; + nz1 |= o1; + nz2 |= o2; + out: + rgbin += bpp; + rgbout += 3; + width --; + } + if (zero_mask) + { + *zero_mask = nz0 ? 0 : 1; + *zero_mask |= nz1 ? 0 : 2; + *zero_mask |= nz2 ? 0 : 4; + } +} + +static void +solid_indexed_to_rgb(const stp_vars_t vars, + const unsigned char *indexed, + unsigned short *rgb, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + solid_rgb_to_rgb(vars, indexed, rgb, zero_mask, width, bpp, cmap, + hue_map, lum_map, sat_map); +} + +/* + * 'gray_to_rgb()' - Convert gray image data to RGB. + */ + +static void +gray_to_rgb(const stp_vars_t vars, + const unsigned char *grayin, + unsigned short *rgbout, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + int i0 = -1; + int i1 = -1; + int o0 = 0; + int o1 = 0; + int o2 = 0; + int nz0 = 0; + int nz1 = 0; + int nz2 = 0; + lut_t *lut = (lut_t *)(stp_get_lut(vars)); + double density = stp_get_density(vars); + while (width > 0) + { + unsigned short trgb[3]; + if (bpp == 1) + { + /* + * No alpha in image... + */ + if (i0 == grayin[0]) + { + rgbout[0] = o0; + rgbout[1] = o1; + rgbout[2] = o2; + goto out; + } + else + { + i0 = grayin[0]; + trgb[0] = + trgb[1] = + trgb[2] = i0 | (i0 << 8); + } + } + else + { + if (i0 == grayin[0] && i1 == grayin[1]) + { + rgbout[0] = o0; + rgbout[1] = o1; + rgbout[2] = o2; + goto out; + } + else + { + i0 = (grayin[0] * grayin[1] / 255 + 255 - grayin[1]); + trgb[0] = + trgb[1] = + trgb[2] = i0 | (i0 << 8); + } + } + update_cmyk(trgb); + rgbout[0] = lookup_value(trgb[0], lut->steps, lut->red, lut->shiftval, + lut->bin_size, lut->bin_shift); + rgbout[1] = lookup_value(trgb[1], lut->steps, lut->green, lut->shiftval, + lut->bin_size, lut->bin_shift); + rgbout[2] = lookup_value(trgb[2], lut->steps, lut->blue, lut->shiftval, + lut->bin_size, lut->bin_shift); + if (density != 1.0) + { + int i; + for (i = 0; i < 3; i++) + rgbout[i] = .5 + (rgbout[i] * density); + } + o0 = rgbout[0]; + o1 = rgbout[1]; + o2 = rgbout[2]; + nz0 |= o0; + nz1 |= o1; + nz2 |= o2; + out: + grayin += bpp; + rgbout += 3; + width --; + } + if (zero_mask) + { + *zero_mask = nz0 ? 0 : 1; + *zero_mask |= nz1 ? 0 : 2; + *zero_mask |= nz2 ? 0 : 4; + } +} + +static void +fast_indexed_to_rgb(const stp_vars_t vars, + const unsigned char *indexed, + unsigned short *rgb, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + int i0 = -1; + int i1 = -1; + int o0 = 0; + int o1 = 0; + int o2 = 0; + int nz0 = 0; + int nz1 = 0; + int nz2 = 0; + lut_t *lut = (lut_t *)(stp_get_lut(vars)); + double isat = 1.0; + double saturation = stp_get_saturation(vars); + double density = stp_get_density(vars); + if (saturation > 1) + isat = 1.0 / saturation; + while (width > 0) + { + double h, s, l; + if (bpp == 1) + { + /* + * No alpha in image... + */ + if (i0 == indexed[0]) + { + rgb[0] = o0; + rgb[1] = o1; + rgb[2] = o2; + goto out; + } + else + { + i0 = indexed[0]; + rgb[0] = lut->red[cmap[i0 * 3 + 0]]; + rgb[1] = lut->green[cmap[i0 * 3 + 1]]; + rgb[2] = lut->blue[cmap[i0 * 3 + 2]]; + } + } + else + { + if (i0 == indexed[0] && i1 == indexed[1]) + { + rgb[0] = o0; + rgb[1] = o1; + rgb[2] = o2; + goto out; + } + else + { + i0 = indexed[0]; + i1 = indexed[1]; + rgb[0] = lut->red[cmap[i0 * 3 + 0] * i1 / 255 + 255 - i1]; + rgb[1] = lut->green[cmap[i0 * 3 + 1] * i1 / 255 + 255 -i1]; + rgb[2] = lut->blue[cmap[i0 * 3 + 2] * i1 / 255 + 255 - i1]; + } + } + if (saturation != 1.0) + { + calc_rgb_to_hsl(rgb, &h, &s, &l); + if (saturation < 1) + s *= saturation; + else if (saturation > 1) + { + double s1 = s * saturation; + double s2 = 1.0 - ((1.0 - s) * isat); + s = FMIN(s1, s2); + } + if (s > 1) + s = 1.0; + calc_hsl_to_rgb(rgb, h, s, l); + } + if (density != 1.0) + { + int i; + for (i = 0; i < 3; i++) + rgb[i] = .5 + (rgb[i] * density); + } + out: + o0 = rgb[0]; + o1 = rgb[1]; + o2 = rgb[2]; + nz0 |= o0; + nz1 |= o1; + nz2 |= o2; + indexed += bpp; + rgb += 3; + width --; + } + if (zero_mask) + { + *zero_mask = nz0 ? 0 : 1; + *zero_mask |= nz1 ? 0 : 2; + *zero_mask |= nz2 ? 0 : 4; + } +} + +/* + * 'rgb_to_rgb()' - Convert rgb image data to RGB. + */ + +static void +fast_rgb_to_rgb(const stp_vars_t vars, + const unsigned char *rgbin, + unsigned short *rgbout, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + unsigned ld = stp_get_density(vars) * 65536; + int i0 = -1; + int i1 = -1; + int i2 = -1; + int i3 = -1; + int o0 = 0; + int o1 = 0; + int o2 = 0; + int nz0 = 0; + int nz1 = 0; + int nz2 = 0; + lut_t *lut = (lut_t *)(stp_get_lut(vars)); + double isat = 1.0; + double saturation = stp_get_saturation(vars); + if (saturation > 1) + isat = 1.0 / saturation; + while (width > 0) + { + double h, s, l; + if (bpp == 3) + { + /* + * No alpha in image... + */ + if (i0 == rgbin[0] && i1 == rgbin[1] && i2 == rgbin[2]) + { + rgbout[0] = o0; + rgbout[1] = o1; + rgbout[2] = o2; + goto out; + } + else + { + i0 = rgbin[0]; + i1 = rgbin[1]; + i2 = rgbin[2]; + rgbout[0] = lut->red[rgbin[0]]; + rgbout[1] = lut->green[rgbin[1]]; + rgbout[2] = lut->blue[rgbin[2]]; + } + } + else + { + if (i0 == rgbin[0] && i1 == rgbin[1] && i2 == rgbin[2] && + i3 == rgbin[3]) + { + rgbout[0] = o0; + rgbout[1] = o1; + rgbout[2] = o2; + goto out; + } + else + { + i0 = rgbin[0]; + i1 = rgbin[1]; + i2 = rgbin[2]; + i3 = rgbin[3]; + rgbout[0] = lut->red[i0 * i3 / 255 + 255 - i3]; + rgbout[1] = lut->green[i1 * i3 / 255 + 255 - i3]; + rgbout[2] = lut->blue[i2 * i3 / 255 + 255 - i3]; + } + } + if (saturation != 1.0) + { + calc_rgb_to_hsl(rgbout, &h, &s, &l); + if (saturation < 1) + s *= saturation; + else if (saturation > 1) + { + double s1 = s * saturation; + double s2 = 1.0 - ((1.0 - s) * isat); + s = FMIN(s1, s2); + } + if (s > 1) + s = 1.0; + calc_hsl_to_rgb(rgbout, h, s, l); + } + if (ld < 65536) + { + int i; + for (i = 0; i < 3; i++) + rgbout[i] = rgbout[i] * ld / 65536; + } + o0 = rgbout[0]; + o1 = rgbout[1]; + o2 = rgbout[2]; + nz0 |= o0; + nz1 |= o1; + nz2 |= o2; + out: + rgbin += bpp; + rgbout += 3; + width --; + } + if (zero_mask) + { + *zero_mask = nz0 ? 0 : 1; + *zero_mask |= nz1 ? 0 : 2; + *zero_mask |= nz2 ? 0 : 4; + } +} + +/* + * 'gray_to_rgb()' - Convert gray image data to RGB. + */ + +static void +fast_gray_to_rgb(const stp_vars_t vars, + const unsigned char *grayin, + unsigned short *rgbout, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + int i0 = -1; + int i1 = -1; + int o0 = 0; + int o1 = 0; + int o2 = 0; + int nz0 = 0; + int nz1 = 0; + int nz2 = 0; + lut_t *lut = (lut_t *)(stp_get_lut(vars)); + double density = stp_get_density(vars); + while (width > 0) + { + if (bpp == 1) + { + /* + * No alpha in image... + */ + if (i0 == grayin[0]) + { + rgbout[0] = o0; + rgbout[1] = o1; + rgbout[2] = o2; + goto out; + } + else + { + i0 = grayin[0]; + rgbout[0] = lut->red[grayin[0]]; + rgbout[1] = lut->green[grayin[0]]; + rgbout[2] = lut->blue[grayin[0]]; + } + } + else + { + if (i0 == grayin[0] && i1 == grayin[1]) + { + rgbout[0] = o0; + rgbout[1] = o1; + rgbout[2] = o2; + goto out; + } + else + { + int lookup = (grayin[0] * grayin[1] / 255 + 255 - grayin[1]); + i0 = grayin[0]; + i1 = grayin[1]; + rgbout[0] = lut->red[lookup]; + rgbout[1] = lut->green[lookup]; + rgbout[2] = lut->blue[lookup]; + } + } + if (density != 1.0) + { + int i; + for (i = 0; i < 3; i++) + rgbout[i] = .5 + (rgbout[i] * density); + } + o0 = rgbout[0]; + o1 = rgbout[1]; + o2 = rgbout[2]; + nz0 |= o0; + nz1 |= o1; + nz2 |= o2; + out: + grayin += bpp; + rgbout += 3; + width --; + } + if (zero_mask) + { + *zero_mask = nz0 ? 0 : 1; + *zero_mask |= nz1 ? 0 : 2; + *zero_mask |= nz2 ? 0 : 4; + } +} + +static void +cmyk_8_to_cmyk(const stp_vars_t vars, + const unsigned char *cmykin, + unsigned short *cmykout, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + int i; + int j; + int nz[4]; + static unsigned short lut[256]; + static double density = -1.0; + static double print_gamma = -1.0; + + + if (density != stp_get_density(vars) || + print_gamma != stp_get_gamma(vars)) + { + density = stp_get_density(vars); + print_gamma = stp_get_gamma(vars); + + for (i = 0; i < 256; i ++) + lut[i] = 65535.0 * density * pow((double)i / 255.0, print_gamma) + 0.5; + } + + for (i = 0; i < width; i++) + { + j = *cmykin++; + nz[0] |= j; + *cmykout++ = lut[j]; + + j = *cmykin++; + nz[1] |= j; + *cmykout++ = lut[j]; + + j = *cmykin++; + nz[2] |= j; + *cmykout++ = lut[j]; + + j = *cmykin++; + nz[3] |= j; + *cmykout++ = lut[j]; + } + if (zero_mask) + { + *zero_mask = nz[0] ? 0 : 1; + *zero_mask |= nz[1] ? 0 : 2; + *zero_mask |= nz[2] ? 0 : 4; + *zero_mask |= nz[3] ? 0 : 8; + } +} + +static void +cmyk_to_cmyk(const stp_vars_t vars, + const unsigned char *cmykin, + unsigned short *cmykout, + int *zero_mask, + int width, + int bpp, + const unsigned char *cmap, + const double *hue_map, + const double *lum_map, + const double *sat_map) +{ + int i; + int j; + int nz[4]; + const unsigned short *scmykin = (const unsigned short *) cmykin; + + for (i = 0; i < width; i++) + { + for (j = 0; j < 4; j++) + { + nz[j] |= scmykin[j]; + cmykout[j] = scmykin[j]; + } + scmykin += 4; + cmykout += 4; + } + if (zero_mask) + { + *zero_mask = nz[0] ? 0 : 1; + *zero_mask |= nz[1] ? 0 : 2; + *zero_mask |= nz[2] ? 0 : 4; + *zero_mask |= nz[3] ? 0 : 8; + } +} + +static lut_t * +allocate_lut(size_t steps) +{ + int i; + lut_t *ret = stp_malloc(sizeof(lut_t)); + ret->steps = steps; + ret->composite = stp_malloc(sizeof(unsigned short) * steps); + ret->red = stp_malloc(sizeof(unsigned short) * steps); + ret->green = stp_malloc(sizeof(unsigned short) * steps); + ret->blue = stp_malloc(sizeof(unsigned short) * steps); + ret->shiftval = 0; + for (i = 1; i < steps; i += i) + ret->shiftval++; + ret->bin_size = 65536 / steps; + ret->bin_shift = 16 - ret->shiftval; + return ret; +} + +void +stp_free_lut(stp_vars_t v) +{ + if (stp_get_lut(v)) + { + lut_t *lut = (lut_t *)(stp_get_lut(v)); + if (lut->composite) + stp_free(lut->composite); + if (lut->red) + stp_free(lut->red); + if (lut->green) + stp_free(lut->green); + if (lut->blue) + stp_free(lut->blue); + lut->steps = 0; + lut->composite = NULL; + lut->red = NULL; + lut->green = NULL; + lut->blue = NULL; + stp_free(stp_get_lut(v)); + stp_set_lut(v, NULL); + } +} + +void +stp_compute_lut(stp_vars_t v, size_t steps) +{ + double pixel, /* Pixel value */ + red_pixel, /* Pixel value */ + green_pixel, /* Pixel value */ + blue_pixel; /* Pixel value */ + int i; + /* + * Got an output file/command, now compute a brightness lookup table... + */ + + double cyan = stp_get_cyan(v); + double magenta = stp_get_magenta(v); + double yellow = stp_get_yellow(v); + double print_gamma = stp_get_gamma(v); + double contrast = stp_get_contrast(v); + double app_gamma = stp_get_app_gamma(v); + double brightness = stp_get_brightness(v); + double screen_gamma = app_gamma / 4.0; /* "Empirical" */ + double pivot = .25; + double ipivot = 1.0 - pivot; + lut_t *lut; + + /* + * Monochrome mode simply thresholds the input + * to decide whether to print at all. The printer gamma + * is intended to represent the analog response of the printer. + * Using it shifts the threshold, which is not the intent + * of how this works. + */ + if (stp_get_output_type(v) == OUTPUT_MONOCHROME) + print_gamma = 1.0; + + lut = allocate_lut(steps); + stp_set_lut(v, lut); + stp_dprintf(STP_DBG_LUT, v, "stp_compute_lut\n"); + stp_dprintf(STP_DBG_LUT, v, " cyan %.3f\n", cyan); + stp_dprintf(STP_DBG_LUT, v, " magenta %.3f\n", magenta); + stp_dprintf(STP_DBG_LUT, v, " yellow %.3f\n", yellow); + stp_dprintf(STP_DBG_LUT, v, " print_gamma %.3f\n", print_gamma); + stp_dprintf(STP_DBG_LUT, v, " contrast %.3f\n", contrast); + stp_dprintf(STP_DBG_LUT, v, " brightness %.3f\n", brightness); + stp_dprintf(STP_DBG_LUT, v, " screen_gamma %.3f\n", screen_gamma); + for (i = 0; i < steps; i ++) + { + double temp_pixel; + pixel = (double) i / (double) (steps - 1); + + if (stp_get_input_color_model(v) == COLOR_MODEL_CMY) + pixel = 1.0 - pixel; + + /* + * First, correct contrast + */ + if (pixel >= .5) + temp_pixel = 1.0 - pixel; + else + temp_pixel = pixel; + if (contrast > 3.99999) + { + if (temp_pixel < .5) + temp_pixel = 0; + else + temp_pixel = 1; + } + if (temp_pixel <= .000001 && contrast <= .0001) + temp_pixel = .5; + else if (temp_pixel > 1) + temp_pixel = .5 * pow(2 * temp_pixel, pow(contrast, contrast)); + else if (temp_pixel < 1) + temp_pixel = 0.5 - + ((0.5 - .5 * pow(2 * temp_pixel, contrast)) * contrast); + if (temp_pixel > .5) + temp_pixel = .5; + else if (temp_pixel < 0) + temp_pixel = 0; + if (pixel < .5) + pixel = temp_pixel; + else + pixel = 1 - temp_pixel; + + /* + * Second, do brightness + */ + if (brightness < 1) + pixel = pixel * brightness; + else + pixel = 1 - ((1 - pixel) * (2 - brightness)); + + /* + * Third, correct for the screen gamma + */ + + pixel = 1.0 - + (1.0 / (1.0 - pow(pivot, screen_gamma))) * + (pow(pivot + ipivot * pixel, screen_gamma) - pow(pivot, screen_gamma)); + + /* + * Third, fix up cyan, magenta, yellow values + */ + if (pixel < 0.0) + pixel = 0.0; + else if (pixel > 1.0) + pixel = 1.0; + + if (pixel > .9999 && cyan < .00001) + red_pixel = 0; + else + red_pixel = 1 - pow(1 - pixel, cyan); + if (pixel > .9999 && magenta < .00001) + green_pixel = 0; + else + green_pixel = 1 - pow(1 - pixel, magenta); + if (pixel > .9999 && yellow < .00001) + blue_pixel = 0; + else + blue_pixel = 1 - pow(1 - pixel, yellow); + + /* + * Finally, fix up print gamma and scale + */ + + pixel = 65535 * pow(pixel, print_gamma) + .5; + red_pixel = 65535 * pow(red_pixel, print_gamma) + .5; + green_pixel = 65535 * pow(green_pixel, print_gamma) + .5; + blue_pixel = 65535 * pow(blue_pixel, print_gamma) + .5; + if (stp_get_output_color_model(v) == COLOR_MODEL_RGB) + { + pixel = 65535 - pixel; + red_pixel = 65535 - red_pixel; + blue_pixel = 65535 - blue_pixel; + green_pixel = 65535 - green_pixel; + } + + if (pixel <= 0.0) + lut->composite[i] = 0; + else if (pixel >= 65535.0) + lut->composite[i] = 65535; + else + lut->composite[i] = (unsigned)(pixel); + + if (red_pixel <= 0.0) + lut->red[i] = 0; + else if (red_pixel >= 65535.0) + lut->red[i] = 65535; + else + lut->red[i] = (unsigned)(red_pixel); + + if (green_pixel <= 0.0) + lut->green[i] = 0; + else if (green_pixel >= 65535.0) + lut->green[i] = 65535; + else + lut->green[i] = (unsigned)(green_pixel); + + if (blue_pixel <= 0.0) + lut->blue[i] = 0; + else if (blue_pixel >= 65535.0) + lut->blue[i] = 65535; + else + lut->blue[i] = (unsigned)(blue_pixel); + stp_dprintf(STP_DBG_LUT, v, + "%3i %5d %5d %5d %5d\n", + i, lut->composite[i], lut->red[i], + lut->green[i], lut->blue[i]); + } +} + +#define RETURN_COLORFUNC(x) \ +do \ +{ \ + stp_dprintf(STP_DBG_COLORFUNC, v, \ + "stp_choose_colorfunc(type %d bpp %d cmap %d) ==> %s, %d\n", \ + output_type, image_bpp, cmap, #x, *out_bpp); \ + return (x); \ +} while (0) \ + +stp_convert_t +stp_choose_colorfunc(int output_type, + int image_bpp, + const unsigned char *cmap, + int *out_bpp, + const stp_vars_t v) +{ + switch (stp_get_output_type(v)) + { + case OUTPUT_MONOCHROME: + *out_bpp = 1; + switch (image_bpp) + { + case 1: + if (cmap) + RETURN_COLORFUNC(indexed_to_monochrome); + else + RETURN_COLORFUNC(gray_to_monochrome); + case 2: + if (cmap) + RETURN_COLORFUNC(indexed_alpha_to_monochrome); + else + RETURN_COLORFUNC(gray_alpha_to_monochrome); + case 3: + RETURN_COLORFUNC(rgb_to_monochrome); + case 4: + RETURN_COLORFUNC(rgb_alpha_to_monochrome); + default: + RETURN_COLORFUNC(NULL); + } + break; + case OUTPUT_RAW_CMYK: + *out_bpp = 4; + switch (image_bpp) + { + case 4: + RETURN_COLORFUNC(cmyk_8_to_cmyk); + case 8: + RETURN_COLORFUNC(cmyk_to_cmyk); + default: + RETURN_COLORFUNC(NULL); + } + break; + case OUTPUT_COLOR: + *out_bpp = 3; + switch (stp_get_image_type(v)) + { + case IMAGE_CONTINUOUS: + if (image_bpp >= 3) + RETURN_COLORFUNC(rgb_to_rgb); + else if (cmap == NULL) + RETURN_COLORFUNC(gray_to_rgb); + else + RETURN_COLORFUNC(indexed_to_rgb); + case IMAGE_SOLID_TONE: + if (image_bpp >= 3) + RETURN_COLORFUNC(solid_rgb_to_rgb); + else if (cmap == NULL) + RETURN_COLORFUNC(gray_to_rgb); + else + RETURN_COLORFUNC(solid_indexed_to_rgb); + case IMAGE_LINE_ART: + if (image_bpp >= 3) + RETURN_COLORFUNC(fast_rgb_to_rgb); + else if (cmap == NULL) + RETURN_COLORFUNC(fast_gray_to_rgb); + else + RETURN_COLORFUNC(fast_indexed_to_rgb); + default: + RETURN_COLORFUNC(NULL); + } + case OUTPUT_GRAY: + default: + *out_bpp = 1; + switch (image_bpp) + { + case 1: + if (cmap) + RETURN_COLORFUNC(indexed_to_gray); + else + RETURN_COLORFUNC(gray_to_gray); + case 2: + if (cmap) + RETURN_COLORFUNC(indexed_alpha_to_gray); + else + RETURN_COLORFUNC(gray_alpha_to_gray); + case 3: + RETURN_COLORFUNC(rgb_to_gray); + case 4: + RETURN_COLORFUNC(rgb_alpha_to_gray); + default: + RETURN_COLORFUNC(NULL); + } + break; + } +} diff --git a/src/main/print-dither-matrices.c b/src/main/print-dither-matrices.c new file mode 100644 index 0000000..92ef667 --- /dev/null +++ b/src/main/print-dither-matrices.c @@ -0,0 +1,61 @@ +/* + * "$Id: print-dither-matrices.c,v 1.4 2001/09/08 17:13:48 rleigh Exp $" + * + * Print plug-in driver utility functions for the GIMP. + * + * Copyright 2001 Robert Krawitz (rlk@alum.mit.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Revision History: + * + * See ChangeLog + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include "gimp-print-internal.h" + +static const unsigned short mat_1_1[] = +{ +#include "quickmatrix257.h" +}; + +const stp_dither_matrix_short_t stp_1_1_matrix = +{ + 257, 257, 2, 1, mat_1_1 +}; + +static const unsigned short mat_2_1[] = +{ +#include "ran.367.179.h" +}; + +const stp_dither_matrix_short_t stp_2_1_matrix = +{ + 367, 179, 2, 1, mat_2_1 +}; + +static const unsigned short mat_4_1[] = +{ +#include "ran.509.131.h" +}; + +const stp_dither_matrix_short_t stp_4_1_matrix = +{ + 509, 131, 2, 1, mat_4_1 +}; diff --git a/src/main/print-dither.c b/src/main/print-dither.c new file mode 100644 index 0000000..ce48d09 --- /dev/null +++ b/src/main/print-dither.c @@ -0,0 +1,2850 @@ +/* + * "$Id: print-dither.c,v 1.44 2001/09/14 02:12:34 rlk Exp $" + * + * Print plug-in driver utility functions for the GIMP. + * + * Copyright 1997-2000 Michael Sweet (mike@easysw.com) and + * Robert Krawitz (rlk@alum.mit.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Revision History: + * + * See ChangeLog + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include "gimp-print-internal.h" +#include +#include +#include +#include + +#ifdef __GNUC__ +#define inline __inline__ +#endif + +#define D_FLOYD_HYBRID 0 +#define D_ADAPTIVE_BASE 4 +#define D_ADAPTIVE_HYBRID (D_ADAPTIVE_BASE | D_FLOYD_HYBRID) +#define D_ORDERED_BASE 8 +#define D_ORDERED (D_ORDERED_BASE) +#define D_FAST_BASE 16 +#define D_FAST (D_FAST_BASE) +#define D_VERY_FAST (D_FAST_BASE + 1) + +#define DITHER_FAST_STEPS (6) + +typedef struct +{ + const char *name; + const char *text; + int id; +} dither_algo_t; + +static const dither_algo_t dither_algos[] = +{ + { "Adaptive", N_ ("Adaptive Hybrid"), D_ADAPTIVE_HYBRID }, + { "Ordered", N_ ("Ordered"), D_ORDERED }, + { "Fast", N_ ("Fast"), D_FAST }, + { "VeryFast", N_ ("Very Fast"), D_VERY_FAST }, + { "Floyd", N_ ("Hybrid Floyd-Steinberg"), D_FLOYD_HYBRID } +}; + +static const int num_dither_algos = sizeof(dither_algos)/sizeof(dither_algo_t); + +#define ERROR_ROWS 2 + +#define MAX_SPREAD 32 + +/* + * A segment of the entire 0-65535 intensity range. + */ +typedef struct dither_segment +{ + unsigned range[2]; /* Bottom, top of range */ + unsigned value[2]; /* Value of lower, upper ink */ + unsigned bits[2]; /* Bit pattern of lower, upper */ + unsigned range_span; /* Span (to avoid calculation on the fly) */ + unsigned value_span; /* Span of values */ + unsigned dot_size[2]; /* Size of lower, upper dot */ + int isdark[2]; /* Is lower, upper value dark ink? */ + int is_same_ink; /* Are both endpoints using the same dots? */ + int is_equal; /* Are both endpoints using the same ink? */ +} dither_segment_t; + +typedef struct dither_color +{ + int nlevels; + unsigned bit_max; + unsigned signif_bits; + unsigned density; + int row_ends[2][2]; + dither_segment_t *ranges; +} dither_color_t; + +typedef struct dither_matrix +{ + int base; + int exp; + int x_size; + int y_size; + int total_size; + int last_x; + int last_x_mod; + int last_y; + int last_y_mod; + int index; + int i_own; + int x_offset; + int y_offset; + unsigned fast_mask; + unsigned *matrix; +} dither_matrix_t; + +typedef struct dither_channel +{ + unsigned randomizer; /* With Floyd-Steinberg dithering, control */ + /* how much randomness is applied to the */ + /* threshold values (0-65535). With ordered */ + /* dithering, how much randomness is added */ + /* to the matrix value. */ + int k_level; /* Amount of each ink (in 64ths) required */ + /* to create equivalent black */ + int darkness; /* Perceived "darkness" of each ink, */ + /* in 64ths, to calculate CMY-K transitions */ + dither_color_t dither; + int *errs[ERROR_ROWS]; + unsigned short *vals; + dither_matrix_t pick; + dither_matrix_t dithermat; + + int v; + int o; + int b; + int very_fast; + unsigned char *ptrs[2]; +} dither_channel_t; + +typedef struct dither +{ + int src_width; /* Input width */ + int dst_width; /* Output width */ + + int density; /* Desired density, 0-1.0 (scaled 0-65535) */ + int black_density; /* Desired density, 0-1.0 (scaled 0-65535) */ + int k_lower; /* Transition range (lower/upper) for CMY */ + int k_upper; /* vs. K */ + int density2; /* Density * 2 */ + int densityh; /* Density / 2 */ + unsigned dlb_range; + unsigned bound_range; + + int spread; /* With Floyd-Steinberg, how widely the */ + int spread_mask; /* error is distributed. This should be */ + /* between 12 (very broad distribution) and */ + /* 19 (very narrow) */ + + int dither_type; + + int d_cutoff; /* When ordered dither is used, threshold */ + /* above which no randomness is used. */ + double adaptive_input; + int adaptive_limit; + + int x_aspect; /* Aspect ratio numerator */ + int y_aspect; /* Aspect ratio denominator */ + + double transition; /* Exponential scaling for transition region */ + + int *offset0_table; + int *offset1_table; + + int oversampling; + int last_line_was_empty; + int ptr_offset; + + int dither_class; /* mono, black, or CMYK */ + + dither_matrix_t dither_matrix; + dither_matrix_t transition_matrix; + dither_channel_t channel[NCOLORS]; + + unsigned short virtual_dot_scale[65536]; + stp_vars_t v; +} dither_t; + +#define CHANNEL(d, c) ((d)->channel[(c)]) + +/* + * Bayer's dither matrix using Judice, Jarvis, and Ninke recurrence relation + * http://www.cs.rit.edu/~sxc7922/Project/CRT.htm + */ + +static const unsigned sq2[] = +{ + 0, 2, + 3, 1 +}; + +size_t +stp_dither_algorithm_count(void) +{ + return num_dither_algos; +} + +const char * +stp_dither_algorithm_name(int id) +{ + if (id < 0 || id >= num_dither_algos) + return NULL; + return (dither_algos[id].name); +} + +const char * +stp_dither_algorithm_text(int id) +{ + if (id < 0 || id >= num_dither_algos) + return NULL; + return _(dither_algos[id].text); +} + +static inline int +calc_ordered_point(unsigned x, unsigned y, int steps, int multiplier, + int size, const unsigned *map) +{ + int i, j; + unsigned retval = 0; + int divisor = 1; + int div1; + for (i = 0; i < steps; i++) + { + int xa = (x / divisor) % size; + int ya = (y / divisor) % size; + unsigned base; + base = map[ya + (xa * size)]; + div1 = 1; + for (j = i; j < steps - 1; j++) + div1 *= size * size; + retval += base * div1; + divisor *= size; + } + return retval * multiplier; +} + +static int +is_po2(size_t i) +{ + int bits = 0; + size_t j = 1; + int k; + for (k = 0; k < CHAR_BIT * sizeof(size_t); k++) + { + if (j & i) + { + bits++; + if (bits > 1) + return 0; + } + j <<= 1; + } + return bits; +} + +static void +init_iterated_matrix(dither_matrix_t *mat, size_t size, size_t exp, + const unsigned *array) +{ + int i; + int x, y; + mat->base = size; + mat->exp = exp; + mat->x_size = 1; + for (i = 0; i < exp; i++) + mat->x_size *= mat->base; + mat->y_size = mat->x_size; + mat->total_size = mat->x_size * mat->y_size; + mat->matrix = stp_malloc(sizeof(unsigned) * mat->x_size * mat->y_size); + for (x = 0; x < mat->x_size; x++) + for (y = 0; y < mat->y_size; y++) + { + mat->matrix[x + y * mat->x_size] = + calc_ordered_point(x, y, mat->exp, 1, mat->base, array); + mat->matrix[x + y * mat->x_size] = + (double) mat->matrix[x + y * mat->x_size] * 65536.0 / + (double) (mat->x_size * mat->y_size); + } + mat->last_x = mat->last_x_mod = 0; + mat->last_y = mat->last_y_mod = 0; + mat->index = 0; + mat->i_own = 1; + if (is_po2(mat->x_size)) + mat->fast_mask = mat->x_size - 1; + else + mat->fast_mask = 0; +} + +#define DITHERPOINT(m, x, y, x_size, y_size) \ + ((m)[(((x) + (x_size)) % (x_size)) + ((x_size) * (((y) + (y_size)) % (y_size)))]) + +static void +shear_matrix(dither_matrix_t *mat, int x_shear, int y_shear) +{ + int i; + int j; + int *tmp = stp_malloc(mat->x_size * mat->y_size * sizeof(int)); + for (i = 0; i < mat->x_size; i++) + for (j = 0; j < mat->y_size; j++) + DITHERPOINT(tmp, i, j, mat->x_size, mat->y_size) = + DITHERPOINT(mat->matrix, i, j * (x_shear + 1), mat->x_size, + mat->y_size); + for (i = 0; i < mat->x_size; i++) + for (j = 0; j < mat->y_size; j++) + DITHERPOINT(mat->matrix, i, j, mat->x_size, mat->y_size) = + DITHERPOINT(tmp, i * (y_shear + 1), j, mat->x_size, mat->y_size); + stp_free(tmp); +} + +static void +init_matrix(dither_matrix_t *mat, int x_size, int y_size, + const unsigned int *array, int transpose, int prescaled) +{ + int x, y; + mat->base = x_size; + mat->exp = 1; + mat->x_size = x_size; + mat->y_size = y_size; + mat->total_size = mat->x_size * mat->y_size; + mat->matrix = stp_malloc(sizeof(unsigned) * mat->x_size * mat->y_size); + for (x = 0; x < mat->x_size; x++) + for (y = 0; y < mat->y_size; y++) + { + if (transpose) + mat->matrix[x + y * mat->x_size] = array[y + x * mat->y_size]; + else + mat->matrix[x + y * mat->x_size] = array[x + y * mat->x_size]; + if (!prescaled) + mat->matrix[x + y * mat->x_size] = + (double) mat->matrix[x + y * mat->x_size] * 65536.0 / + (double) (mat->x_size * mat->y_size); + } + mat->last_x = mat->last_x_mod = 0; + mat->last_y = mat->last_y_mod = 0; + mat->index = 0; + mat->i_own = 1; + if (is_po2(mat->x_size)) + mat->fast_mask = mat->x_size - 1; + else + mat->fast_mask = 0; +} + +static void +init_matrix_short(dither_matrix_t *mat, int x_size, int y_size, + const unsigned short *array, int transpose, int prescaled) +{ + int x, y; + mat->base = x_size; + mat->exp = 1; + mat->x_size = x_size; + mat->y_size = y_size; + mat->total_size = mat->x_size * mat->y_size; + mat->matrix = stp_malloc(sizeof(unsigned) * mat->x_size * mat->y_size); + for (x = 0; x < mat->x_size; x++) + for (y = 0; y < mat->y_size; y++) + { + if (transpose) + mat->matrix[x + y * mat->x_size] = array[y + x * mat->y_size]; + else + mat->matrix[x + y * mat->x_size] = array[x + y * mat->x_size]; + if (!prescaled) + mat->matrix[x + y * mat->x_size] = + (double) mat->matrix[x + y * mat->x_size] * 65536.0 / + (double) (mat->x_size * mat->y_size); + } + mat->last_x = mat->last_x_mod = 0; + mat->last_y = mat->last_y_mod = 0; + mat->index = 0; + mat->i_own = 1; + if (is_po2(mat->x_size)) + mat->fast_mask = mat->x_size - 1; + else + mat->fast_mask = 0; +} + +static void +destroy_matrix(dither_matrix_t *mat) +{ + if (mat->i_own && mat->matrix) + stp_free(mat->matrix); + mat->matrix = NULL; + mat->base = 0; + mat->exp = 0; + mat->x_size = 0; + mat->y_size = 0; + mat->total_size = 0; + mat->i_own = 0; +} + +static void +clone_matrix(const dither_matrix_t *src, dither_matrix_t *dest, + int x_offset, int y_offset) +{ + dest->base = src->base; + dest->exp = src->exp; + dest->x_size = src->x_size; + dest->y_size = src->y_size; + dest->total_size = src->total_size; + dest->matrix = src->matrix; + dest->x_offset = x_offset; + dest->y_offset = y_offset; + dest->last_x = 0; + dest->last_x_mod = dest->x_offset % dest->x_size; + dest->last_y = 0; + dest->last_y_mod = dest->x_size * (dest->y_offset % dest->y_size); + dest->index = dest->last_x_mod + dest->last_y_mod; + dest->fast_mask = src->fast_mask; + dest->i_own = 0; +} + +static void +copy_matrix(const dither_matrix_t *src, dither_matrix_t *dest) +{ + int x; + dest->base = src->base; + dest->exp = src->exp; + dest->x_size = src->x_size; + dest->y_size = src->y_size; + dest->total_size = src->total_size; + dest->matrix = stp_malloc(sizeof(unsigned) * dest->x_size * dest->y_size); + for (x = 0; x < dest->x_size * dest->y_size; x++) + dest->matrix[x] = src->matrix[x]; + dest->x_offset = 0; + dest->y_offset = 0; + dest->last_x = 0; + dest->last_x_mod = 0; + dest->last_y = 0; + dest->last_y_mod = 0; + dest->index = 0; + dest->fast_mask = src->fast_mask; + dest->i_own = 1; +} + +static void +exponential_scale_matrix(dither_matrix_t *mat, double exponent) +{ + int i; + int mat_size = mat->x_size * mat->y_size; + for (i = 0; i < mat_size; i++) + { + double dd = mat->matrix[i] / 65535.0; + dd = pow(dd, exponent); + mat->matrix[i] = 65535 * dd; + } +} + +static void +matrix_set_row(const dither_t *d, dither_matrix_t *mat, int y) +{ + mat->last_y = y; + mat->last_y_mod = mat->x_size * ((y + mat->y_offset) % mat->y_size); + mat->index = mat->last_x_mod + mat->last_y_mod; +} + +static inline unsigned +ditherpoint(const dither_t *d, dither_matrix_t *mat, int x) +{ + if (mat->fast_mask) + return mat->matrix[(mat->last_y_mod + + ((x + mat->x_offset) & mat->fast_mask))]; + /* + * This rather bizarre code is an attempt to avoid having to compute a lot + * of modulus and multiplication operations, which are typically slow. + */ + + if (x == mat->last_x + 1) + { + mat->last_x_mod++; + mat->index++; + if (mat->last_x_mod >= mat->x_size) + { + mat->last_x_mod -= mat->x_size; + mat->index -= mat->x_size; + } + } + else if (x == mat->last_x - 1) + { + mat->last_x_mod--; + mat->index--; + if (mat->last_x_mod < 0) + { + mat->last_x_mod += mat->x_size; + mat->index += mat->x_size; + } + } + else if (x == mat->last_x) + { + } + else + { + mat->last_x_mod = (x + mat->x_offset) % mat->x_size; + mat->index = mat->last_x_mod + mat->last_y_mod; + } + mat->last_x = x; + return mat->matrix[mat->index]; +} + +static void +reverse_row_ends(dither_t *d) +{ + int i, j; + for (i = 0; i < NCOLORS; i++) + for (j = 0; j < 2; j++) + { + int tmp = CHANNEL(d, i).dither.row_ends[0][j]; + CHANNEL(d, i).dither.row_ends[0][j] = + CHANNEL(d, i).dither.row_ends[1][j]; + CHANNEL(d, i).dither.row_ends[1][j] = tmp; + } +} + +void * +stp_init_dither(int in_width, int out_width, int horizontal_aspect, + int vertical_aspect, stp_vars_t v) +{ + int i; + dither_t *d = stp_malloc(sizeof(dither_t)); + stp_simple_dither_range_t r; + memset(d, 0, sizeof(dither_t)); + d->v = v; + r.value = 1.0; + r.bit_pattern = 1; + r.is_dark = 1; + r.dot_size = 1; + for (i = 0; i < NCOLORS; i++) + stp_dither_set_ranges(d, i, 1, &r, 1.0); + d->offset0_table = NULL; + d->offset1_table = NULL; + d->x_aspect = horizontal_aspect; + d->y_aspect = vertical_aspect; + + d->dither_type = D_FLOYD_HYBRID; + for (i = 0; i < num_dither_algos; i++) + { + if (!strcmp(stp_get_dither_algorithm(v), _(dither_algos[i].name))) + { + d->dither_type = dither_algos[i].id; + break; + } + } + d->transition = 1.0; + d->adaptive_input = .75; + + if (d->dither_type == D_VERY_FAST) + stp_dither_set_iterated_matrix(d, 2, DITHER_FAST_STEPS, sq2, 0, 2, 4); + else + { + stp_dither_matrix_t *mat; + int transposed = 0; + if (d->y_aspect == d->x_aspect) + mat = (stp_dither_matrix_t *) &stp_1_1_matrix; + else if (d->y_aspect > d->x_aspect) + { + transposed = 0; + if (d->y_aspect / d->x_aspect == 2) + mat = (stp_dither_matrix_t *) &stp_2_1_matrix; + else if (d->y_aspect / d->x_aspect == 3) + mat = (stp_dither_matrix_t *) &stp_4_1_matrix; + else if (d->y_aspect / d->x_aspect == 4) + mat = (stp_dither_matrix_t *) &stp_4_1_matrix; + else + mat = (stp_dither_matrix_t *) &stp_2_1_matrix; + } + else + { + transposed = 1; + if (d->x_aspect / d->y_aspect == 2) + mat = (stp_dither_matrix_t *) &stp_2_1_matrix; + else if (d->x_aspect / d->y_aspect == 3) + mat = (stp_dither_matrix_t *) &stp_4_1_matrix; + else if (d->x_aspect / d->y_aspect == 4) + mat = (stp_dither_matrix_t *) &stp_4_1_matrix; + else + mat = (stp_dither_matrix_t *) &stp_2_1_matrix; + } + stp_dither_set_matrix(d, mat, transposed, 0, 0); + } + + d->src_width = in_width; + d->dst_width = out_width; + + stp_dither_set_ink_spread(d, 13); + stp_dither_set_black_lower(d, .4); + stp_dither_set_black_upper(d, .7); + for (i = 0; i <= NCOLORS; i++) + { + stp_dither_set_black_level(d, i, 1.0); + stp_dither_set_randomizer(d, i, 1.0); + } + stp_dither_set_ink_darkness(d, ECOLOR_C, 2); + stp_dither_set_ink_darkness(d, ECOLOR_M, 2); + stp_dither_set_ink_darkness(d, ECOLOR_Y, 1); + stp_dither_set_density(d, 1.0); + d->dither_class = stp_get_output_type(v); + return d; +} + +static void +preinit_matrix(dither_t *d) +{ + int i; + for (i = 0; i < NCOLORS; i++) + destroy_matrix(&(CHANNEL(d, i).dithermat)); + destroy_matrix(&(d->dither_matrix)); +} + +static void +postinit_matrix(dither_t *d, int x_shear, int y_shear) +{ + unsigned x_3, y_3; + if (x_shear || y_shear) + shear_matrix(&(d->dither_matrix), x_shear, y_shear); + x_3 = d->dither_matrix.x_size / 3; + y_3 = d->dither_matrix.y_size / 3; + clone_matrix(&(d->dither_matrix), &(CHANNEL(d, ECOLOR_C).dithermat), + 2 * x_3, y_3); + clone_matrix(&(d->dither_matrix), &(CHANNEL(d, ECOLOR_M).dithermat), + x_3, 2 * y_3); + clone_matrix(&(d->dither_matrix), &(CHANNEL(d, ECOLOR_Y).dithermat), 0, y_3); + clone_matrix(&(d->dither_matrix), &(CHANNEL(d, ECOLOR_K).dithermat), 0, 0); + stp_dither_set_transition(d, d->transition); +} + +void +stp_dither_set_iterated_matrix(void *vd, size_t edge, size_t iterations, + const unsigned *data, int prescaled, + int x_shear, int y_shear) +{ + dither_t *d = (dither_t *) vd; + preinit_matrix(d); + init_iterated_matrix(&(d->dither_matrix), edge, iterations, data); + postinit_matrix(d, x_shear, y_shear); +} + +void +stp_dither_set_matrix(void *vd, const stp_dither_matrix_t *matrix, + int transposed, int x_shear, int y_shear) +{ + dither_t *d = (dither_t *) vd; + int x = transposed ? matrix->y : matrix->x; + int y = transposed ? matrix->x : matrix->y; + preinit_matrix(d); + if (matrix->bytes == 2) + init_matrix_short(&(d->dither_matrix), x, y, + (const unsigned short *) matrix->data, + transposed, matrix->prescaled); + else if (matrix->bytes == 4) + init_matrix(&(d->dither_matrix), x, y, (const unsigned *)matrix->data, + transposed, matrix->prescaled); + postinit_matrix(d, x_shear, y_shear); +} + +void +stp_dither_set_transition(void *vd, double exponent) +{ + int i; + dither_t *d = (dither_t *) vd; + int x_3 = d->dither_matrix.x_size / 3; + int y_3 = d->dither_matrix.y_size / 3; + for (i = 0; i < NCOLORS; i++) + destroy_matrix(&(CHANNEL(d, i).pick)); + destroy_matrix(&(d->transition_matrix)); + copy_matrix(&(d->dither_matrix), &(d->transition_matrix)); + d->transition = exponent; + if (exponent < .999 || exponent > 1.001) + exponential_scale_matrix(&(d->transition_matrix), exponent); + clone_matrix(&(d->transition_matrix), &(CHANNEL(d, ECOLOR_C).pick), + 2 * x_3, y_3); + clone_matrix(&(d->transition_matrix), &(CHANNEL(d, ECOLOR_M).pick), + x_3, 2 * y_3); + clone_matrix(&(d->transition_matrix), &(CHANNEL(d, ECOLOR_Y).pick), 0, y_3); + clone_matrix(&(d->transition_matrix), &(CHANNEL(d, ECOLOR_K).pick), 0, 0); + if (exponent < .999 || exponent > 1.001) + for (i = 0; i < 65536; i++) + { + double dd = i / 65535.0; + dd = pow(dd, 1.0 / exponent); + d->virtual_dot_scale[i] = dd * 65535; + } + else + for (i = 0; i < 65536; i++) + d->virtual_dot_scale[i] = i; +} + +void +stp_dither_set_density(void *vd, double density) +{ + dither_t *d = (dither_t *) vd; + if (density > 1) + density = 1; + else if (density < 0) + density = 0; + d->k_upper = d->k_upper * density; + d->k_lower = d->k_lower * density; + d->density = (int) ((65535 * density) + .5); + d->density2 = 2 * d->density; + d->densityh = d->density / 2; + d->dlb_range = d->density - d->k_lower; + d->bound_range = d->k_upper - d->k_lower; + d->d_cutoff = d->density / 16; + d->adaptive_limit = d->density * d->adaptive_input; + stp_dither_set_black_density(vd, density); +} + +void +stp_dither_set_black_density(void *vd, double density) +{ + dither_t *d = (dither_t *) vd; + if (density > 1) + density = 1; + else if (density < 0) + density = 0; + d->black_density = (int) ((65535 * density) + .5); +} + +void +stp_dither_set_adaptive_limit(void *vd, double limit) +{ + dither_t *d = (dither_t *) vd; + d->adaptive_input = limit; + d->adaptive_limit = d->density * limit; +} + +void +stp_dither_set_black_lower(void *vd, double k_lower) +{ + dither_t *d = (dither_t *) vd; + d->k_lower = (int) (k_lower * 65535); +} + +void +stp_dither_set_black_upper(void *vd, double k_upper) +{ + dither_t *d = (dither_t *) vd; + d->k_upper = (int) (k_upper * 65535); +} + +void +stp_dither_set_ink_spread(void *vd, int spread) +{ + dither_t *d = (dither_t *) vd; + if (d->offset0_table) + { + stp_free(d->offset0_table); + d->offset0_table = NULL; + } + if (d->offset1_table) + { + stp_free(d->offset1_table); + d->offset1_table = NULL; + } + if (spread >= 16) + { + d->spread = 16; + } + else + { + int max_offset; + int i; + d->spread = spread; + max_offset = (1 << (16 - spread)) + 1; + d->offset0_table = stp_malloc(sizeof(int) * max_offset); + d->offset1_table = stp_malloc(sizeof(int) * max_offset); + for (i = 0; i < max_offset; i++) + { + d->offset0_table[i] = (i + 1) * (i + 1); + d->offset1_table[i] = ((i + 1) * i) / 2; + } + } + d->spread_mask = (1 << d->spread) - 1; + d->adaptive_limit = d->density * d->adaptive_input; +} + +void +stp_dither_set_black_level(void *vd, int i, double v) +{ + dither_t *d = (dither_t *) vd; + if (i < 0 || i >= NCOLORS) + return; + CHANNEL(d, i).k_level = (int) v * 64; +} + +void +stp_dither_set_randomizer(void *vd, int i, double v) +{ + dither_t *d = (dither_t *) vd; + if (i < 0 || i >= NCOLORS) + return; + CHANNEL(d, i).randomizer = v * 65535; +} + +void +stp_dither_set_ink_darkness(void *vd, int i, double v) +{ + dither_t *d = (dither_t *) vd; + if (i < 0 || i >= NCOLORS) + return; + CHANNEL(d, i).darkness = (int) (v * 64); +} + +void +stp_dither_set_light_ink(void *vd, int i, double v, double density) +{ + stp_simple_dither_range_t range[2]; + if (i < 0 || i >= NCOLORS || v <= 0 || v > 1) + return; + range[0].bit_pattern = 1; + range[0].is_dark = 0; + range[1].value = 1; + range[1].bit_pattern = 1; + range[1].is_dark = 1; + range[1].dot_size = 1; + range[0].value = v; + range[0].dot_size = 1; + stp_dither_set_ranges(vd, i, 2, range, density); +} + +static void +stp_dither_set_generic_ranges(dither_t *d, dither_color_t *s, int nlevels, + const stp_simple_dither_range_t *ranges, + double density) +{ + int i; + unsigned lbit; + if (s->ranges) + stp_free(s->ranges); + s->nlevels = nlevels > 1 ? nlevels + 1 : nlevels; + s->ranges = (dither_segment_t *) + stp_malloc(s->nlevels * sizeof(dither_segment_t)); + s->bit_max = 0; + s->density = density * 65535; + stp_dprintf(STP_DBG_INK, d->v, + "stp_dither_set_generic_ranges nlevels %d density %f\n", + nlevels, density); + for (i = 0; i < nlevels; i++) + stp_dprintf(STP_DBG_INK, d->v, + " level %d value %f pattern %x is_dark %d\n", i, + ranges[i].value, ranges[i].bit_pattern, ranges[i].is_dark); + s->ranges[0].range[0] = 0; + s->ranges[0].value[0] = ranges[0].value * 65535.0; + s->ranges[0].bits[0] = ranges[0].bit_pattern; + s->ranges[0].isdark[0] = ranges[0].is_dark; + s->ranges[0].dot_size[0] = ranges[0].dot_size; + if (nlevels == 1) + s->ranges[0].range[1] = 65535; + else + s->ranges[0].range[1] = ranges[0].value * 65535.0 * density; + if (s->ranges[0].range[1] > 65535) + s->ranges[0].range[1] = 65535; + s->ranges[0].value[1] = ranges[0].value * 65535.0; + if (s->ranges[0].value[1] > 65535) + s->ranges[0].value[1] = 65535; + s->ranges[0].bits[1] = ranges[0].bit_pattern; + if (ranges[0].bit_pattern > s->bit_max) + s->bit_max = ranges[0].bit_pattern; + s->ranges[0].isdark[1] = ranges[0].is_dark; + s->ranges[0].dot_size[1] = ranges[0].dot_size; + s->ranges[0].range_span = s->ranges[0].range[1]; + s->ranges[0].value_span = 0; + if (s->nlevels > 1) + { + for (i = 0; i < nlevels - 1; i++) + { + int l = i + 1; + s->ranges[l].range[0] = s->ranges[i].range[1]; + s->ranges[l].value[0] = s->ranges[i].value[1]; + s->ranges[l].bits[0] = s->ranges[i].bits[1]; + s->ranges[l].isdark[0] = s->ranges[i].isdark[1]; + s->ranges[l].dot_size[0] = s->ranges[i].dot_size[1]; + if (i == nlevels - 1) + s->ranges[l].range[1] = 65535; + else + s->ranges[l].range[1] = + (ranges[l].value + ranges[l].value) * 32768.0 * density; + if (s->ranges[l].range[1] > 65535) + s->ranges[l].range[1] = 65535; + s->ranges[l].value[1] = ranges[l].value * 65535.0; + if (s->ranges[l].value[1] > 65535) + s->ranges[l].value[1] = 65535; + s->ranges[l].bits[1] = ranges[l].bit_pattern; + if (ranges[l].bit_pattern > s->bit_max) + s->bit_max = ranges[l].bit_pattern; + s->ranges[l].isdark[1] = ranges[l].is_dark; + s->ranges[l].dot_size[1] = ranges[l].dot_size; + s->ranges[l].range_span = + s->ranges[l].range[1] - s->ranges[l].range[0]; + s->ranges[l].value_span = + s->ranges[l].value[1] - s->ranges[l].value[0]; + } + i++; + s->ranges[i].range[0] = s->ranges[i - 1].range[1]; + s->ranges[i].value[0] = s->ranges[i - 1].value[1]; + s->ranges[i].bits[0] = s->ranges[i - 1].bits[1]; + s->ranges[i].isdark[0] = s->ranges[i - 1].isdark[1]; + s->ranges[i].dot_size[0] = s->ranges[i - 1].dot_size[1]; + s->ranges[i].range[1] = 65535; + s->ranges[i].value[1] = s->ranges[i].value[0]; + s->ranges[i].bits[1] = s->ranges[i].bits[0]; + s->ranges[i].isdark[1] = s->ranges[i].isdark[0]; + s->ranges[i].dot_size[1] = s->ranges[i].dot_size[0]; + s->ranges[i].range_span = s->ranges[i].range[1] - s->ranges[i].range[0]; + s->ranges[i].value_span = s->ranges[i].value[1] - s->ranges[i].value[0]; + } + lbit = s->bit_max; + s->signif_bits = 0; + while (lbit > 0) + { + s->signif_bits++; + lbit >>= 1; + } + for (i = 0; i < s->nlevels; i++) + { + if (s->ranges[i].isdark[0] == s->ranges[i].isdark[1] && + s->ranges[i].dot_size[0] == s->ranges[i].dot_size[1]) + s->ranges[i].is_same_ink = 1; + else + s->ranges[i].is_same_ink = 0; + if (s->ranges[i].range_span > 0 && + (s->ranges[i].value_span > 0 || + s->ranges[i].isdark[0] != s->ranges[i].isdark[1])) + s->ranges[i].is_equal = 0; + else + s->ranges[i].is_equal = 1; + stp_dprintf(STP_DBG_INK, d->v, + " level %d value[0] %d value[1] %d range[0] %d range[1] %d\n", + i, s->ranges[i].value[0], s->ranges[i].value[1], + s->ranges[i].range[0], s->ranges[i].range[1]); + stp_dprintf(STP_DBG_INK, d->v, + " bits[0] %d bits[1] %d isdark[0] %d isdark[1] %d\n", + s->ranges[i].bits[0], s->ranges[i].bits[1], + s->ranges[i].isdark[0], s->ranges[i].isdark[1]); + stp_dprintf(STP_DBG_INK, d->v, + " rangespan %d valuespan %d same_ink %d equal %d\n", + s->ranges[i].range_span, s->ranges[i].value_span, + s->ranges[i].is_same_ink, s->ranges[i].is_equal); + } + stp_dprintf(STP_DBG_INK, d->v, + " bit_max %d signif_bits %d\n", s->bit_max, s->signif_bits); +} + +static void +stp_dither_set_generic_ranges_full(dither_t *d, dither_color_t *s, int nlevels, + const stp_full_dither_range_t *ranges, + double density) +{ + int i, j, k; + unsigned lbit; + if (s->ranges) + stp_free(s->ranges); + s->nlevels = nlevels > 1 ? nlevels + 1 : nlevels; + s->nlevels = nlevels+1; + s->ranges = (dither_segment_t *) + stp_malloc(s->nlevels * sizeof(dither_segment_t)); + s->bit_max = 0; + s->density = density * 65535; + stp_dprintf(STP_DBG_INK, d->v, + "stp_dither_set_ranges nlevels %d density %f\n", + nlevels, density); + for (i = 0; i < nlevels; i++) + stp_dprintf(STP_DBG_INK, d->v, + " level %d value: low %f high %f pattern low %x " + "high %x is_dark low %d high %d\n", i, + ranges[i].value[0], ranges[i].value[1], + ranges[i].bits[0], ranges[i].bits[1],ranges[i].isdark[0], + ranges[i].isdark[1]); + for(i=j=0; i < nlevels; i++) + { + for (k = 0; k < 2; k++) + { + if (ranges[i].bits[k] > s->bit_max) + s->bit_max = ranges[i].bits[k]; + s->ranges[j].dot_size[k] = ranges[i].bits[k]; /* FIXME */ + s->ranges[j].value[k] = ranges[i].value[k] * 65535; + s->ranges[j].range[k] = s->ranges[j].value[k]*density; + s->ranges[j].bits[k] = ranges[i].bits[k]; + s->ranges[j].isdark[k] = ranges[i].isdark[k]; + } + s->ranges[j].range_span = s->ranges[j].range[1]-s->ranges[j].range[0]; + s->ranges[j].value_span = s->ranges[j].value[1]-s->ranges[j].value[0]; + j++; + } + s->ranges[j].range[0] = s->ranges[j - 1].range[1]; + s->ranges[j].value[0] = s->ranges[j - 1].value[1]; + s->ranges[j].bits[0] = s->ranges[j - 1].bits[1]; + s->ranges[j].isdark[0] = s->ranges[j - 1].isdark[1]; + s->ranges[j].dot_size[0] = s->ranges[j - 1].dot_size[1]; + s->ranges[j].range[1] = 65535; + s->ranges[j].value[1] = 65535; + s->ranges[j].bits[1] = s->ranges[j].bits[0]; + s->ranges[j].isdark[1] = s->ranges[j].isdark[0]; + s->ranges[j].dot_size[1] = s->ranges[j].dot_size[0]; + s->ranges[j].range_span = s->ranges[j].range[1] - s->ranges[j].range[0]; + s->ranges[j].value_span = 0; + s->nlevels = j+1; + lbit = s->bit_max; + s->signif_bits = 0; + while (lbit > 0) + { + s->signif_bits++; + lbit >>= 1; + } + for (i = 0; i < s->nlevels; i++) + { + if (s->ranges[i].isdark[0] == s->ranges[i].isdark[1] && + s->ranges[i].dot_size[0] == s->ranges[i].dot_size[1]) + s->ranges[i].is_same_ink = 1; + else + s->ranges[i].is_same_ink = 0; + if (s->ranges[i].range_span > 0 && + (s->ranges[i].value_span > 0 || + s->ranges[i].isdark[0] != s->ranges[i].isdark[1])) + s->ranges[i].is_equal = 0; + else + s->ranges[i].is_equal = 1; + stp_dprintf(STP_DBG_INK, d->v, + " level %d value[0] %d value[1] %d range[0] %d range[1] %d\n", + i, s->ranges[i].value[0], s->ranges[i].value[1], + s->ranges[i].range[0], s->ranges[i].range[1]); + stp_dprintf(STP_DBG_INK, d->v, + " bits[0] %d bits[1] %d isdark[0] %d isdark[1] %d\n", + s->ranges[i].bits[0], s->ranges[i].bits[1], + s->ranges[i].isdark[0], s->ranges[i].isdark[1]); + stp_dprintf(STP_DBG_INK, d->v, + " rangespan %d valuespan %d same_ink %d equal %d\n", + s->ranges[i].range_span, s->ranges[i].value_span, + s->ranges[i].is_same_ink, s->ranges[i].is_equal); + } + stp_dprintf(STP_DBG_INK, d->v, + " bit_max %d signif_bits %d\n", s->bit_max, s->signif_bits); +} + +void +stp_dither_set_ranges(void *vd, int color, int nlevels, + const stp_simple_dither_range_t *ranges, double density) +{ + dither_t *d = (dither_t *) vd; + if (color < 0 || color >= NCOLORS) + return; + stp_dither_set_generic_ranges(d, &(CHANNEL(d, color).dither), nlevels, + ranges, density); +} + +void +stp_dither_set_ranges_simple(void *vd, int color, int nlevels, + const double *levels, double density) +{ + stp_simple_dither_range_t *r = + stp_malloc(nlevels * sizeof(stp_simple_dither_range_t)); + int i; + for (i = 0; i < nlevels; i++) + { + r[i].bit_pattern = i + 1; + r[i].dot_size = i + 1; + r[i].value = levels[i]; + r[i].is_dark = 1; + } + stp_dither_set_ranges(vd, color, nlevels, r, density); + stp_free(r); +} + +void +stp_dither_set_ranges_full(void *vd, int color, int nlevels, + const stp_full_dither_range_t *ranges, + double density) +{ + dither_t *d = (dither_t *) vd; + stp_dither_set_generic_ranges_full(d, &(CHANNEL(d, color).dither), nlevels, + ranges, density); +} + +void +stp_free_dither(void *vd) +{ + dither_t *d = (dither_t *) vd; + int i; + int j; + for (j = 0; j < NCOLORS; j++) + { + if (CHANNEL(d, j).vals) + { + stp_free(CHANNEL(d, j).vals); + CHANNEL(d, j).vals = NULL; + } + for (i = 0; i < ERROR_ROWS; i++) + { + if (CHANNEL(d, j).errs[i]) + { + stp_free(CHANNEL(d, j).errs[i]); + CHANNEL(d, j).errs[i] = NULL; + } + } + stp_free(CHANNEL(d, i).dither.ranges); + CHANNEL(d, i).dither.ranges = NULL; + destroy_matrix(&(CHANNEL(d, i).pick)); + destroy_matrix(&(CHANNEL(d, i).dithermat)); + } + if (d->offset0_table) + { + stp_free(d->offset0_table); + d->offset0_table = NULL; + } + if (d->offset1_table) + { + stp_free(d->offset1_table); + d->offset1_table = NULL; + } + destroy_matrix(&(d->dither_matrix)); + destroy_matrix(&(d->transition_matrix)); + stp_free(d); +} + +int +stp_dither_get_first_position(void *vd, int color, int is_dark) +{ + dither_t *d = (dither_t *) vd; + if (color < 0 || color >= NCOLORS) + return -1; + if (is_dark) + return CHANNEL(d, color).dither.row_ends[0][0]; + else + return CHANNEL(d, color).dither.row_ends[0][1]; +} + +int +stp_dither_get_last_position(void *vd, int color, int is_dark) +{ + dither_t *d = (dither_t *) vd; + if (color < 0 || color >= NCOLORS) + return -1; + if (is_dark) + return CHANNEL(d, color).dither.row_ends[1][0]; + else + return CHANNEL(d, color).dither.row_ends[1][1]; +} + +static int * +get_errline(dither_t *d, int row, int color) +{ + if (row < 0 || color < 0 || color >= NCOLORS) + return NULL; + if (CHANNEL(d, color).errs[row & 1]) + return CHANNEL(d, color).errs[row & 1] + MAX_SPREAD; + else + { + int size = 2 * MAX_SPREAD + (16 * ((d->dst_width + 7) / 8)); + CHANNEL(d, color).errs[row & 1] = stp_malloc(size * sizeof(int)); + memset(CHANNEL(d, color).errs[row & 1], 0, size * sizeof(int)); + return CHANNEL(d, color).errs[row & 1] + MAX_SPREAD; + } +} + +static unsigned short * +get_valueline(dither_t *d, int color) +{ + if (color < 0 || color >= NCOLORS) + return NULL; + if (CHANNEL(d, color).vals) + return CHANNEL(d, color).vals; + else + { + int size = (8 * ((d->dst_width + 7) / 8)); + CHANNEL(d, color).vals = stp_malloc(size * sizeof(unsigned short)); + return CHANNEL(d, color).vals; + } +} + +#define ADVANCE_UNIDIRECTIONAL(d, bit, input, width, xerror, xmod) \ +do \ +{ \ + bit >>= 1; \ + if (bit == 0) \ + { \ + d->ptr_offset++; \ + bit = 128; \ + } \ + if (d->src_width == d->dst_width) \ + input += (width); \ + else \ + { \ + input += xstep; \ + xerror += xmod; \ + if (xerror >= d->dst_width) \ + { \ + xerror -= d->dst_width; \ + input += (width); \ + } \ + } \ +} while (0) + +#define ADVANCE_BIDIRECTIONAL(d, bit, in, dir, width, xer, xmod, err, N, S) \ +do \ +{ \ + int i; \ + int j; \ + if (dir == 1) \ + { \ + bit >>= 1; \ + if (bit == 0) \ + { \ + d->ptr_offset++; \ + bit = 128; \ + } \ + if (d->src_width == d->dst_width) \ + in += (width); \ + else \ + { \ + in += xstep; \ + xer += xmod; \ + if (xer >= d->dst_width) \ + { \ + xer -= d->dst_width; \ + in += (width); \ + } \ + } \ + } \ + else \ + { \ + if (bit == 128) \ + { \ + d->ptr_offset--; \ + bit = 1; \ + } \ + else \ + bit <<= 1; \ + if (d->src_width == d->dst_width) \ + in -= (width); \ + else \ + { \ + in -= xstep; \ + xer -= xmod; \ + if (xer < 0) \ + { \ + xer += d->dst_width; \ + in -= (width); \ + } \ + } \ + } \ + for (i = 0; i < N; i++) \ + for (j = 0; j < S; j++) \ + err[i][j] += direction; \ +} while (0) + +/* + * Add the error to the input value. Notice that we micro-optimize this + * to save a division when appropriate. + */ + +#define UPDATE_COLOR(color, dither) (\ + ((dither) >= 0)? \ + (color) + ((dither) >> 3): \ + (color) - ((-(dither)) >> 3)) + +/* + * For Floyd-Steinberg, distribute the error residual. We spread the + * error to nearby points, spreading more broadly in lighter regions to + * achieve more uniform distribution of color. The actual distribution + * is a triangular function. + */ + +static inline int +update_dither(dither_t *d, int channel, int width, + int direction, int *error0, int *error1) +{ + int r = CHANNEL(d, channel).v; + int o = CHANNEL(d, channel).o; + int tmp = r; + int i, dist, dist1; + int delta, delta1; + int offset; + if (tmp == 0) + return error0[direction]; + if (tmp > 65535) + tmp = 65535; + if (d->spread >= 16 || o >= 2048) + { + tmp += tmp; + tmp += tmp; + error1[0] += tmp; + return error0[direction] + tmp; + } + else + { + int tmpo = o << 5; + offset = ((65535 - tmpo) >> d->spread) + + ((tmp & d->spread_mask) > (tmpo & d->spread_mask)); + } + switch (offset) + { + case 0: + tmp += tmp; + tmp += tmp; + error1[0] += tmp; + return error0[direction] + tmp; + case 1: + error1[-1] += tmp; + error1[1] += tmp; + tmp += tmp; + error1[0] += tmp; + tmp += tmp; + return error0[direction] + tmp; + default: + tmp += tmp; + tmp += tmp; + dist = tmp / d->offset0_table[offset]; + dist1 = tmp / d->offset1_table[offset]; + delta = dist; + delta1 = dist1; + for (i = -offset; i; i++) + { + error1[i] += delta; + error1[-i] += delta; + error0[i] += delta1; + error0[-i] += delta1; + delta1 += dist1; + delta += dist; + } + error1[0] += delta; + return error0[direction]; + } +} + +#define USMIN(a, b) ((a) < (b) ? (a) : (b)) + +static inline int +compute_black(const dither_t *d) +{ + int answer = INT_MAX; + int i; + for (i = 1; i < NCOLORS; i++) + answer = USMIN(answer, CHANNEL(d, i).v); + return answer; +} + +/* + * Print a single dot. This routine has become awfully complicated + * awfully fast! + */ + +static inline int +print_color(const dither_t *d, dither_channel_t *dc, int x, int y, + unsigned char bit, int length, int dontprint, int dither_type) +{ + int base = dc->b; + int density = dc->o; + int adjusted = dc->v; + dither_color_t *rv = &(dc->dither); + unsigned randomizer = dc->randomizer; + dither_matrix_t *pick_matrix = &(dc->pick); + dither_matrix_t *dither_matrix = &(dc->dithermat); + unsigned rangepoint = 32768; + unsigned virtual_value; + unsigned vmatrix; + int i; + int j; + int isdark; + unsigned char *tptr; + unsigned bits; + unsigned v; + unsigned dot_size; + int levels = rv->nlevels - 1; + int dither_value = adjusted; + dither_segment_t *dd; + + if (base <= 0 || density <= 0 || + (adjusted <= 0 && !(dither_type & D_ADAPTIVE_BASE))) + return adjusted; + if (density > 65535) + density = 65535; + + /* + * Look for the appropriate range into which the input value falls. + * Notice that we use the input, not the error, to decide what dot type + * to print (if any). We actually use the "density" input to permit + * the caller to use something other that simply the input value, if it's + * desired to use some function of overall density, rather than just + * this color's input, for this purpose. + */ + for (i = levels; i >= 0; i--) + { + dd = &(rv->ranges[i]); + + if (density <= dd->range[0]) + continue; + + /* + * If we're using an adaptive dithering method, decide whether + * to use the Floyd-Steinberg or the ordered method based on the + * input value. + */ + if (dither_type & D_ADAPTIVE_BASE) + { + dither_type -= D_ADAPTIVE_BASE; + + if (base <= d->adaptive_limit) + { + dither_type = D_ORDERED; + dither_value = base; + } + else if (adjusted <= 0) + return adjusted; + } + + /* + * Where are we within the range. If we're going to print at + * all, this determines the probability of printing the darker + * vs. the lighter ink. If the inks are identical (same value + * and darkness), it doesn't matter. + * + * We scale the input linearly against the top and bottom of the + * range. + */ + if (!dd->is_equal) + rangepoint = + ((unsigned) (density - dd->range[0])) * 65535 / dd->range_span; + + /* + * Compute the virtual dot size that we're going to print. + * This is somewhere between the two candidate dot sizes. + * This is scaled between the high and low value. + */ + + if (dd->value_span == 0) + virtual_value = dd->value[1]; + else if (dd->range_span == 0) + virtual_value = (dd->value[1] + dd->value[0]) / 2; + else + virtual_value = dd->value[0] + + (dd->value_span * d->virtual_dot_scale[rangepoint] / 65535); + + /* + * Reduce the randomness as the base value increases, to get + * smoother output in the midtones. Idea suggested by + * Thomas Tonino. + */ + if (dither_type & D_ORDERED_BASE) + randomizer = 65535; /* With ordered dither, we need this */ + else if (randomizer > 0) + { + if (base > d->d_cutoff) + randomizer = 0; + else if (base > d->d_cutoff / 2) + randomizer = randomizer * 2 * (d->d_cutoff - base) / d->d_cutoff; + } + + /* + * Compute the comparison value to decide whether to print at + * all. If there is no randomness, simply divide the virtual + * dotsize by 2 to get standard "pure" Floyd-Steinberg (or "pure" + * matrix dithering, which degenerates to a threshold). + */ + if (randomizer == 0) + vmatrix = virtual_value / 2; + else + { + /* + * First, compute a value between 0 and 65535 that will be + * scaled to produce an offset from the desired threshold. + */ + vmatrix = ditherpoint(d, dither_matrix, x); + /* + * Now, scale the virtual dot size appropriately. Note that + * we'll get something evenly distributed between 0 and + * the virtual dot size, centered on the dot size / 2, + * which is the normal threshold value. + */ + vmatrix = vmatrix * virtual_value / 65535; + if (randomizer != 65535) + { + /* + * We want vmatrix to be scaled between 0 and + * virtual_value when randomizer is 65535 (fully random). + * When it's less, we want it to scale through part of + * that range. In all cases, it should center around + * virtual_value / 2. + * + * vbase is the bottom of the scaling range. + */ + unsigned vbase = virtual_value * (65535u - randomizer) / + 131070u; + vmatrix = vmatrix * randomizer / 65535; + vmatrix += vbase; + } + } /* randomizer != 0 */ + + /* + * After all that, printing is almost an afterthought. + * Pick the actual dot size (using a matrix here) and print it. + */ + if (dither_value >= vmatrix) + { + int subchannel; + + if (dd->is_same_ink) + subchannel = 1; + else + { + rangepoint = rangepoint * rv->density / 65535u; + if (rangepoint >= ditherpoint(d, pick_matrix, x)) + subchannel = 1; + else + subchannel = 0; + } + isdark = dd->isdark[subchannel]; + bits = dd->bits[subchannel]; + v = dd->value[subchannel]; + dot_size = dd->dot_size[subchannel]; + tptr = dc->ptrs[1 - isdark] + d->ptr_offset; + + /* + * Lay down all of the bits in the pixel. + */ + if (dontprint < v) + { + if (rv->row_ends[0][1 - isdark] == -1) + rv->row_ends[0][1 - isdark] = x; + rv->row_ends[1][1 - isdark] = x; + for (j = 1; j <= bits; j += j, tptr += length) + { + if (j & bits) + tptr[0] |= bit; + } + } + if (dither_type & D_ORDERED_BASE) + adjusted = -(int) v / 2; + else + adjusted -= v; + } + return adjusted; + } + return adjusted; +} + +static inline int +print_color_ordered(const dither_t *d, dither_channel_t *dc, int x, int y, + unsigned char bit, int length, int dontprint) +{ + int density = dc->o; + int adjusted = dc->v; + dither_color_t *rv = &(dc->dither); + dither_matrix_t *pick_matrix = &(dc->pick); + dither_matrix_t *dither_matrix = &(dc->dithermat); + unsigned rangepoint; + unsigned virtual_value; + unsigned vmatrix; + int i; + int j; + int isdark; + unsigned char *tptr; + unsigned bits; + unsigned v; + unsigned dot_size; + int levels = rv->nlevels - 1; + int dither_value = adjusted; + dither_segment_t *dd; + + if (adjusted <= 0 || density <= 0) + return 0; + if (density > 65535) + density = 65535; + + /* + * Look for the appropriate range into which the input value falls. + * Notice that we use the input, not the error, to decide what dot type + * to print (if any). We actually use the "density" input to permit + * the caller to use something other that simply the input value, if it's + * desired to use some function of overall density, rather than just + * this color's input, for this purpose. + */ + for (i = levels; i >= 0; i--) + { + dd = &(rv->ranges[i]); + + if (density <= dd->range[0]) + continue; + + /* + * Where are we within the range. If we're going to print at + * all, this determines the probability of printing the darker + * vs. the lighter ink. If the inks are identical (same value + * and darkness), it doesn't matter. + * + * We scale the input linearly against the top and bottom of the + * range. + */ + if (dd->is_equal) + rangepoint = 32768; + else + rangepoint = + ((unsigned) (density - dd->range[0])) * 65535 / dd->range_span; + + /* + * Compute the virtual dot size that we're going to print. + * This is somewhere between the two candidate dot sizes. + * This is scaled between the high and low value. + */ + + if (dd->value_span == 0) + virtual_value = dd->value[1]; + else if (dd->range_span == 0) + virtual_value = (dd->value[1] + dd->value[0]) / 2; + else + virtual_value = dd->value[0] + + (dd->value_span * d->virtual_dot_scale[rangepoint] / 65535); + + /* + * Compute the comparison value to decide whether to print at + * all. If there is no randomness, simply divide the virtual + * dotsize by 2 to get standard "pure" Floyd-Steinberg (or "pure" + * matrix dithering, which degenerates to a threshold). + */ + /* + * First, compute a value between 0 and 65535 that will be + * scaled to produce an offset from the desired threshold. + */ + vmatrix = ditherpoint(d, dither_matrix, x); + /* + * Now, scale the virtual dot size appropriately. Note that + * we'll get something evenly distributed between 0 and + * the virtual dot size, centered on the dot size / 2, + * which is the normal threshold value. + */ + vmatrix = vmatrix * virtual_value / 65535; + + /* + * After all that, printing is almost an afterthought. + * Pick the actual dot size (using a matrix here) and print it. + */ + if (dither_value >= vmatrix) + { + int subchannel; + + if (dd->is_same_ink) + subchannel = 1; + else + { + rangepoint = rangepoint * rv->density / 65535u; + if (rangepoint >= ditherpoint(d, pick_matrix, x)) + subchannel = 1; + else + subchannel = 0; + } + isdark = dd->isdark[subchannel]; + bits = dd->bits[subchannel]; + v = dd->value[subchannel]; + dot_size = dd->dot_size[subchannel]; + tptr = dc->ptrs[1 - isdark] + d->ptr_offset; + + /* + * Lay down all of the bits in the pixel. + */ + if (dontprint < v) + { + if (rv->row_ends[0][1 - isdark] == -1) + rv->row_ends[0][1 - isdark] = x; + rv->row_ends[1][1 - isdark] = x; + for (j = 1; j <= bits; j += j, tptr += length) + { + if (j & bits) + tptr[0] |= bit; + } + return v; + } + } + return 0; + } + return 0; +} + +static inline void +print_color_fast(const dither_t *d, dither_channel_t *dc, int x, int y, + unsigned char bit, int length) +{ + int density = dc->o; + int adjusted = dc->v; + dither_color_t *rv = &(dc->dither); + dither_matrix_t *dither_matrix = &(dc->dithermat); + + if (density <= 0 || adjusted <= 0) + return; + if (dc->very_fast) + { + if (adjusted >= ditherpoint(d, dither_matrix, x)) + { + if (rv->row_ends[0][0] == -1) + rv->row_ends[0][0] = x; + rv->row_ends[1][0] = x; + dc->ptrs[0][d->ptr_offset] |= bit; + } + } + else + { + int i; + int levels = rv->nlevels - 1; + int j; + unsigned char *tptr; + unsigned bits; + for (i = levels; i >= 0; i--) + { + dither_segment_t *dd = &(rv->ranges[i]); + unsigned vmatrix; + unsigned rangepoint; + unsigned dpoint; + unsigned subchannel; + if (density <= dd->range[0]) + continue; + dpoint = ditherpoint(d, dither_matrix, x); + + if (dd->is_same_ink) + subchannel = 1; + else + { + rangepoint = ((density - dd->range[0]) << 16) / dd->range_span; + rangepoint = (rangepoint * rv->density) >> 16; + if (rangepoint >= dpoint) + subchannel = 1; + else + subchannel = 0; + } + vmatrix = (dd->value[subchannel] * dpoint) >> 16; + + /* + * After all that, printing is almost an afterthought. + * Pick the actual dot size (using a matrix here) and print it. + */ + if (adjusted >= vmatrix) + { + int isdark = dd->isdark[subchannel]; + bits = dd->bits[subchannel]; + tptr = dc->ptrs[1 - isdark] + d->ptr_offset; + if (rv->row_ends[0][1 - isdark] == -1) + rv->row_ends[0][1 - isdark] = x; + rv->row_ends[1][1 - isdark] = x; + + /* + * Lay down all of the bits in the pixel. + */ + if (bits == 1) + { + tptr[0] |= bit; + } + else + { + for (j = 1; j <= bits; j += j, tptr += length) + { + if (j & bits) + tptr[0] |= bit; + } + } + } + return; + } + } +} + +static inline void +update_cmyk(dither_t *d) +{ + int ak; + int i; + int kdarkness = 0; + unsigned ks, kl; + int ub, lb; + int ok; + int bk; + unsigned density; + int k = CHANNEL(d, ECOLOR_K).o; + + ub = d->k_upper; + lb = d->k_lower; + density = d->density; + + /* + * Calculate total ink amount. + * If there is a lot of ink, black gets added sooner. Saves ink + * and with a lot of ink the black doesn't show as speckles. + * + * k already contains the grey contained in CMY. + * First we find out if the color is darker than the K amount + * suggests, and we look up where is value is between + * lowerbound and density: + */ + + for (i = 1; i < NCOLORS; i++) + kdarkness += CHANNEL(d, i).o * CHANNEL(d, i).darkness / 64; + kdarkness -= d->density2; + + if (kdarkness > (k + k + k)) + ok = kdarkness / 3; + else + ok = k; + if (ok <= lb) + kl = 0; + else if (ok >= density) + kl = density; + else + kl = (unsigned) ( ok - lb ) * density / d->dlb_range; + + /* + * We have a second value, ks, that will be the scaler. + * ks is initially showing where the original black + * amount is between upper and lower bounds: + */ + + if (k >= ub) + ks = density; + else if (k <= lb) + ks = 0; + else + ks = (unsigned) (k - lb) * density / d->bound_range; + + /* + * ks is then processed by a second order function that produces + * an S curve: 2ks - ks^2. This is then multiplied by the + * darkness value in kl. If we think this is too complex the + * following line can be tried instead: + * ak = ks; + */ + ak = ks; + if (kl == 0 || ak == 0) + k = 0; + else if (ak == density) + k = kl; + else + k = (unsigned) kl * (unsigned) ak / density; + ok = k; + bk = k; + if (bk > 0 && density != d->black_density) + bk = (unsigned) bk * (unsigned) d->black_density / density; + if (bk > 65535) + bk = 65535; + + if (k && ak && ok > 0) + { + int i; + /* + * Because black is always fairly neutral, we do not have to + * calculate the amount to take out of CMY. The result will + * be a bit dark but that is OK. If things are okay CMY + * cannot go negative here - unless extra K is added in the + * previous block. We multiply by ak to prevent taking out + * too much. This prevents dark areas from becoming very + * dull. + */ + + if (ak == density) + ok = k; + else + ok = (unsigned) k * (unsigned) ak / density; + + for (i = 1; i < NCOLORS; i++) + { + if (CHANNEL(d, i).k_level == 64) + CHANNEL(d, i).v -= ok; + else + CHANNEL(d, i).v -= (ok * CHANNEL(d, i).k_level) >> 6; + if (CHANNEL(d, i).v < 0) + CHANNEL(d, i).v = 0; + } + } + else + for (i = 1; i < NCOLORS; i++) + CHANNEL(d, i).v = CHANNEL(d, i).o; + CHANNEL(d, ECOLOR_K).b = bk; + CHANNEL(d, ECOLOR_K).v = k; +} + +/* + * Dithering functions! + * + * Documentation moved to README.dither + */ + +/* + * 'stp_dither_monochrome()' - Dither grayscale pixels to black using a hard + * threshold. This is for use with predithered output, or for text + * or other pure black and white only. + */ + +static void +stp_dither_monochrome(const unsigned short *gray, + int row, + void *vd, + int duplicate_line, + int zero_mask) +{ + int x, + xerror, + xstep, + xmod, + length; + unsigned char bit, + *kptr; + dither_t *d = (dither_t *) vd; + dither_matrix_t *kdither = &(CHANNEL(d, ECOLOR_K).dithermat); + unsigned bits = CHANNEL(d, ECOLOR_K).dither.signif_bits; + dither_color_t *rv = &(CHANNEL(d, ECOLOR_K).dither); + int j; + unsigned char *tptr; + int dst_width = d->dst_width; + if (zero_mask) + return; + + kptr = CHANNEL(d, ECOLOR_K).ptrs[0]; + length = (d->dst_width + 7) / 8; + + bit = 128; + x = 0; + + xstep = d->src_width / d->dst_width; + xmod = d->src_width % d->dst_width; + xerror = 0; + for (x = 0; x < dst_width; x++) + { + if (gray[0] && (d->density >= ditherpoint(d, kdither, x))) + { + tptr = kptr + d->ptr_offset; + if (rv->row_ends[0][0] == -1) + rv->row_ends[0][0] = x; + rv->row_ends[1][0] = x; + for (j = 0; j < bits; j++, tptr += length) + tptr[0] |= bit; + } + ADVANCE_UNIDIRECTIONAL(d, bit, gray, 1, xerror, xmod); + } +} + +/* + * 'stp_dither_black()' - Dither grayscale pixels to black. + * This is for grayscale output. + */ + +static void +stp_dither_black_fast(const unsigned short *gray, + int row, + void *vd, + int duplicate_line, + int zero_mask) +{ + int x, + length; + unsigned char bit; + dither_t *d = (dither_t *) vd; + int dst_width = d->dst_width; + int xerror, xstep, xmod; + + if (zero_mask) + return; + length = (d->dst_width + 7) / 8; + + bit = 128; + xstep = d->src_width / d->dst_width; + xmod = d->src_width % d->dst_width; + xerror = 0; + + for (x = 0; x < dst_width; x++) + { + CHANNEL(d, ECOLOR_K).v = gray[0]; + CHANNEL(d, ECOLOR_K).o = gray[0]; + print_color_fast(d, &(CHANNEL(d, ECOLOR_K)), x, row, bit, length); + ADVANCE_UNIDIRECTIONAL(d, bit, gray, 1, xerror, xmod); + } +} + +static void +stp_dither_black_ordered(const unsigned short *gray, + int row, + void *vd, + int duplicate_line, + int zero_mask) +{ + + int x, + length; + unsigned char bit; + dither_t *d = (dither_t *) vd; + int terminate; + int xerror, xstep, xmod; + + if (zero_mask) + return; + + length = (d->dst_width + 7) / 8; + + bit = 128; + x = 0; + terminate = d->dst_width; + xstep = d->src_width / d->dst_width; + xmod = d->src_width % d->dst_width; + xerror = 0; + + for (x = 0; x < terminate; x ++) + { + CHANNEL(d, ECOLOR_K).o = CHANNEL(d, ECOLOR_K).v = gray[0]; + print_color_ordered(d, &(CHANNEL(d, ECOLOR_K)), x, row, bit, length, 0); + ADVANCE_UNIDIRECTIONAL(d, bit, gray, 1, xerror, xmod); + } +} + +static void +stp_dither_black_ed(const unsigned short *gray, + int row, + void *vd, + int duplicate_line, + int zero_mask) +{ + + int x, + length; + unsigned char bit; + int *error[1][ERROR_ROWS]; + int ditherk; + dither_t *d = (dither_t *) vd; + int terminate; + int direction = row & 1 ? 1 : -1; + int xerror, xstep, xmod; + + if (!duplicate_line) + { + if (!zero_mask) + d->last_line_was_empty = 0; + else + d->last_line_was_empty++; + } + else if (d->last_line_was_empty) + d->last_line_was_empty++; + if (d->last_line_was_empty >= 5) + return; + + error[ECOLOR_K][0] = get_errline(d, row, ECOLOR_K); + error[ECOLOR_K][1] = get_errline(d, row + 1, ECOLOR_K); + + memset(error[ECOLOR_K][1], 0, d->dst_width * sizeof(int)); + + if (d->last_line_was_empty >= 4) + { + if (d->last_line_was_empty == 4) + memset(error[ECOLOR_K][0], 0, d->dst_width * sizeof(int)); + return; + } + + length = (d->dst_width + 7) / 8; + + x = (direction == 1) ? 0 : d->dst_width - 1; + bit = 1 << (7 - (x & 7)); + xstep = d->src_width / d->dst_width; + xmod = d->src_width % d->dst_width; + xerror = (xmod * x) % d->dst_width; + terminate = (direction == 1) ? d->dst_width : -1; + if (direction == -1) + { + gray += d->src_width - 1; + error[ECOLOR_K][0] += x; + error[ECOLOR_K][1] += x; + d->ptr_offset = length - 1; + } + ditherk = error[ECOLOR_K][0][0]; + + for (; x != terminate; x += direction) + { + CHANNEL(d, ECOLOR_K).b = gray[0]; + CHANNEL(d, ECOLOR_K).o = gray[0]; + CHANNEL(d, ECOLOR_K).v = UPDATE_COLOR(gray[0], ditherk); + CHANNEL(d, ECOLOR_K).v = print_color(d, &(CHANNEL(d, ECOLOR_K)), x, row, + bit, length, 0, d->dither_type); + ditherk = update_dither(d, ECOLOR_K, d->src_width, direction, + error[ECOLOR_K][0], error[ECOLOR_K][1]); + ADVANCE_BIDIRECTIONAL(d, bit, gray, direction, 1, xerror, xmod, error, + 1, ERROR_ROWS); + } + if (direction == -1) + reverse_row_ends(d); +} + +static void +stp_dither_cmy_fast(const unsigned short *cmy, + int row, + void *vd, + int duplicate_line, + int zero_mask) +{ + int x, + length; + unsigned char bit; + dither_t *d = (dither_t *) vd; + int i; + int dst_width = d->dst_width; + int xerror, xstep, xmod; + + if ((zero_mask & 7) == 7) + return; + + length = (d->dst_width + 7) / 8; + + bit = 128; + xstep = 3 * (d->src_width / d->dst_width); + xmod = d->src_width % d->dst_width; + xerror = 0; + x = 0; + + QUANT(14); + for (; x != dst_width; x++) + { + CHANNEL(d, ECOLOR_C).v = CHANNEL(d, ECOLOR_C).o = cmy[0]; + CHANNEL(d, ECOLOR_M).v = CHANNEL(d, ECOLOR_M).o = cmy[1]; + CHANNEL(d, ECOLOR_Y).v = CHANNEL(d, ECOLOR_Y).o = cmy[2]; + + for (i = 1; i < NCOLORS; i++) + print_color_fast(d, &(CHANNEL(d, i)), x, row, bit, length); + QUANT(16); + ADVANCE_UNIDIRECTIONAL(d, bit, cmy, 3, xerror, xmod); + QUANT(17); + } +} + +static void +stp_dither_cmy_ordered(const unsigned short *cmy, + int row, + void *vd, + int duplicate_line, + int zero_mask) +{ + int x, + length; + unsigned char bit; + dither_t *d = (dither_t *) vd; + int i; + + int terminate; + int xerror, xstep, xmod; + + if ((zero_mask & 7) == 7) + return; + length = (d->dst_width + 7) / 8; + + bit = 128; + xstep = 3 * (d->src_width / d->dst_width); + xmod = d->src_width % d->dst_width; + xerror = 0; + x = 0; + terminate = d->dst_width; + + QUANT(6); + for (; x != terminate; x ++) + { + CHANNEL(d, ECOLOR_C).v = CHANNEL(d, ECOLOR_C).o = cmy[0]; + CHANNEL(d, ECOLOR_M).v = CHANNEL(d, ECOLOR_M).o = cmy[1]; + CHANNEL(d, ECOLOR_Y).v = CHANNEL(d, ECOLOR_Y).o = cmy[2]; + QUANT(9); + for (i = 1; i < NCOLORS; i++) + print_color_ordered(d, &(CHANNEL(d, i)), x, row, bit, length, 0); + QUANT(12); + ADVANCE_UNIDIRECTIONAL(d, bit, cmy, 3, xerror, xmod); + QUANT(13); + } +} + +static void +stp_dither_cmy_ed(const unsigned short *cmy, + int row, + void *vd, + int duplicate_line, + int zero_mask) +{ + int x, + length; + unsigned char bit; + int i, j; + int ndither[NCOLORS]; + int *error[NCOLORS][ERROR_ROWS]; + dither_t *d = (dither_t *) vd; + + int terminate; + int direction = row & 1 ? 1 : -1; + int xerror, xstep, xmod; + if (!duplicate_line) + { + if ((zero_mask & 7) != 7) + d->last_line_was_empty = 0; + else + d->last_line_was_empty++; + } + else if (d->last_line_was_empty) + d->last_line_was_empty++; + if (d->last_line_was_empty >= 5) + return; + + for (i = 1; i < NCOLORS; i++) + { + for (j = 0; j < ERROR_ROWS; j++) + error[i][j] = get_errline(d, row + j, i); + memset(error[i][j - 1], 0, d->dst_width * sizeof(int)); + } + if (d->last_line_was_empty >= 4) + { + if (d->last_line_was_empty == 4) + { + for (i = 1; i < NCOLORS; i++) + { + for (j = 0; j < ERROR_ROWS - 1; j++) + memset(error[i][j], 0, d->dst_width * sizeof(int)); + } + } + return; + } + + length = (d->dst_width + 7) / 8; + + x = (direction == 1) ? 0 : d->dst_width - 1; + bit = 1 << (7 - (x & 7)); + xstep = 3 * (d->src_width / d->dst_width); + xmod = d->src_width % d->dst_width; + xerror = (xmod * x) % d->dst_width; + terminate = (direction == 1) ? d->dst_width : -1; + if (direction == -1) + { + cmy += (3 * (d->src_width - 1)); + for (i = 1; i < NCOLORS; i++) + { + for (j = 0; j < ERROR_ROWS; j++) + error[i][j] += d->dst_width - 1; + } + d->ptr_offset = length - 1; + } + for (i = 1; i < NCOLORS; i++) + ndither[i] = error[i][0][0]; + QUANT(6); + for (; x != terminate; x += direction) + { + CHANNEL(d, ECOLOR_C).v = cmy[0]; + CHANNEL(d, ECOLOR_M).v = cmy[1]; + CHANNEL(d, ECOLOR_Y).v = cmy[2]; + + for (i = 1; i < NCOLORS; i++) + { + QUANT(9); + CHANNEL(d, i).o = CHANNEL(d, i).b = CHANNEL(d, i).v; + CHANNEL(d, i).v = UPDATE_COLOR(CHANNEL(d, i).v, ndither[i]); + CHANNEL(d, i).v = print_color(d, &(CHANNEL(d, i)), x, row, bit, + length, 0, d->dither_type); + ndither[i] = update_dither(d, i, d->src_width, + direction, error[i][0], error[i][1]); + QUANT(10); + } + + QUANT(12); + ADVANCE_BIDIRECTIONAL(d, bit, cmy, direction, 3, xerror, xmod, error, + NCOLORS, ERROR_ROWS); + QUANT(13); + } + if (direction == -1) + reverse_row_ends(d); +} + +static void +stp_dither_cmyk_fast(const unsigned short *cmy, + int row, + void *vd, + int duplicate_line, + int zero_mask) +{ + int x, + length; + unsigned char bit; + dither_t *d = (dither_t *) vd; + int i; + + int dst_width = d->dst_width; + int xerror, xstep, xmod; + + if ((zero_mask & 7) == 7) + return; + + length = (d->dst_width + 7) / 8; + + bit = 128; + xstep = 3 * (d->src_width / d->dst_width); + xmod = d->src_width % d->dst_width; + xerror = 0; + x = 0; + + QUANT(14); + for (; x != dst_width; x++) + { + int nonzero = 0; + nonzero |= CHANNEL(d, ECOLOR_C).v = cmy[0]; + nonzero |= CHANNEL(d, ECOLOR_M).v = cmy[1]; + nonzero |= CHANNEL(d, ECOLOR_Y).v = cmy[2]; + CHANNEL(d, ECOLOR_C).o = cmy[0]; + CHANNEL(d, ECOLOR_M).o = cmy[1]; + CHANNEL(d, ECOLOR_Y).o = cmy[2]; + + if (nonzero) + { + int ok; + unsigned lb = d->k_lower; + unsigned ub = d->k_upper; + int k = compute_black(d); + if (d->dither_type != D_VERY_FAST) + { + if (k < lb) + k = 0; + else if (k < ub) + k = (k - lb) * ub / d->bound_range; + } + for (i = 1; i < NCOLORS; i++) + CHANNEL(d, i).v -= k; + ok = k; + if (d->dither_type != D_VERY_FAST) + { + if (ok > 0 && d->density != d->black_density) + ok = (unsigned) ok * (unsigned) d->black_density / d->density; + if (ok > 65535) + ok = 65535; + } + QUANT(15); + CHANNEL(d, ECOLOR_K).v = k; + CHANNEL(d, ECOLOR_K).o = ok; + + for (i = 0; i < NCOLORS; i++) + print_color_fast(d, &(CHANNEL(d, i)), x, row, bit, length); + QUANT(16); + } + ADVANCE_UNIDIRECTIONAL(d, bit, cmy, 3, xerror, xmod); + QUANT(17); + } +} + +static void +stp_dither_cmyk_ordered(const unsigned short *cmy, + int row, + void *vd, + int duplicate_line, + int zero_mask) +{ + int x, + length; + unsigned char bit; + dither_t *d = (dither_t *) vd; + int i; + + int terminate; + int xerror, xstep, xmod; + + if ((zero_mask & 7) == 7) + return; + + length = (d->dst_width + 7) / 8; + + bit = 128; + xstep = 3 * (d->src_width / d->dst_width); + xmod = d->src_width % d->dst_width; + xerror = 0; + x = 0; + terminate = d->dst_width; + + QUANT(6); + for (; x != terminate; x ++) + { + int nonzero = 0; + int printed_black = 0; + CHANNEL(d, ECOLOR_C).v = cmy[0]; + CHANNEL(d, ECOLOR_M).v = cmy[1]; + CHANNEL(d, ECOLOR_Y).v = cmy[2]; + for (i = 0; i < NCOLORS; i++) + nonzero |= CHANNEL(d, i).o = CHANNEL(d, i).v; + + if (nonzero) + { + QUANT(7); + + CHANNEL(d, ECOLOR_K).o = CHANNEL(d, ECOLOR_K).v = compute_black(d); + + if (CHANNEL(d, ECOLOR_K).v > 0) + update_cmyk(d); + + QUANT(9); + + if (d->density != d->black_density) + CHANNEL(d, ECOLOR_K).v = + CHANNEL(d, ECOLOR_K).v * d->black_density / d->density; + + for (i = 0; i < NCOLORS; i++) + { + int tmp = print_color_ordered(d, &(CHANNEL(d, i)), x, row, bit, + length, printed_black); + if (i == ECOLOR_K && d->density <= 45000) + printed_black = CHANNEL(d, i).v - tmp; + } + QUANT(12); + } + ADVANCE_UNIDIRECTIONAL(d, bit, cmy, 3, xerror, xmod); + QUANT(13); + } +} + +static void +stp_dither_cmyk_ed(const unsigned short *cmy, + int row, + void *vd, + int duplicate_line, + int zero_mask) +{ + int x, + length; + unsigned char bit; + int i, j; + int ndither[NCOLORS]; + int *error[NCOLORS][ERROR_ROWS]; + dither_t *d = (dither_t *) vd; + + int terminate; + int direction = row & 1 ? 1 : -1; + int xerror, xstep, xmod; + + if (!duplicate_line) + { + if ((zero_mask & 7) != 7) + d->last_line_was_empty = 0; + else + d->last_line_was_empty++; + } + else if (d->last_line_was_empty) + d->last_line_was_empty++; + if (d->last_line_was_empty >= 5) + return; + length = (d->dst_width + 7) / 8; + + for (i = 0; i < NCOLORS; i++) + { + for (j = 0; j < ERROR_ROWS; j++) + error[i][j] = get_errline(d, row + j, i); + memset(error[i][j - 1], 0, d->dst_width * sizeof(int)); + } + if (d->last_line_was_empty >= 4) + { + if (d->last_line_was_empty == 4) + { + for (i = 0; i < NCOLORS; i++) + { + for (j = 0; j < ERROR_ROWS - 1; j++) + memset(error[i][j], 0, d->dst_width * sizeof(int)); + } + } + return; + } + + x = (direction == 1) ? 0 : d->dst_width - 1; + bit = 1 << (7 - (x & 7)); + xstep = 3 * (d->src_width / d->dst_width); + xmod = d->src_width % d->dst_width; + xerror = (xmod * x) % d->dst_width; + terminate = (direction == 1) ? d->dst_width : -1; + if (direction == -1) + { + cmy += (3 * (d->src_width - 1)); + for (i = 0; i < NCOLORS; i++) + for (j = 0; j < ERROR_ROWS; j++) + error[i][j] += d->dst_width - 1; + d->ptr_offset = length - 1; + } + for (i = 0; i < NCOLORS; i++) + ndither[i] = error[i][0][0]; + QUANT(6); + for (; x != terminate; x += direction) + { + int nonzero = 0; + int printed_black = 0; + CHANNEL(d, ECOLOR_C).v = cmy[0]; + CHANNEL(d, ECOLOR_M).v = cmy[1]; + CHANNEL(d, ECOLOR_Y).v = cmy[2]; + for (i = 0; i < NCOLORS; i++) + nonzero |= (CHANNEL(d, i).o = CHANNEL(d, i).v); + + if (nonzero) + { + QUANT(7); + + CHANNEL(d, ECOLOR_K).v = compute_black(d); + CHANNEL(d, ECOLOR_K).o = CHANNEL(d, ECOLOR_K).v; + CHANNEL(d, ECOLOR_K).b = 0; + + /* + * At this point we've computed the basic CMYK separations. + * Now we adjust the levels of each to improve the print quality. + */ + + if (CHANNEL(d, ECOLOR_K).v > 0) + update_cmyk(d); + + for (i = 1; i < NCOLORS; i++) + CHANNEL(d, i).b = CHANNEL(d, i).v; + + QUANT(8); + /* + * We've done all of the cmyk separations at this point. + * Now to do the dithering. + * + * At this point: + * + * bk = Amount of black printed with black ink + * ak = Adjusted "raw" K value + * k = raw K value derived from CMY + * oc, om, oy = raw CMY values assuming no K component + * c, m, y = CMY values adjusted for the presence of K + * + * The main reason for this rather elaborate setup, where we have + * 8 channels at this point, is to handle variable intensities + * (in particular light and dark variants) of inks. Very dark regions + * with slight color tints should be printed with dark inks, not with + * the light inks that would be implied by the small amount of + * remnant CMY. + * + * It's quite likely that for simple four-color printers ordinary + * CMYK separations would work. It's possible that they would work + * for variable dot sizes, too. + */ + + QUANT(9); + + if (d->density != d->black_density) + CHANNEL(d, ECOLOR_K).v = + CHANNEL(d, ECOLOR_K).v * d->black_density / d->density; + + CHANNEL(d, ECOLOR_K).o = CHANNEL(d, ECOLOR_K).b; + + for (i = 0; i < NCOLORS; i++) + { + int tmp; + CHANNEL(d, i).v = UPDATE_COLOR(CHANNEL(d, i).v, ndither[i]); + tmp = print_color(d, &(CHANNEL(d, i)), x, row, bit, length, + printed_black, d->dither_type); + if (i == ECOLOR_K && d->density <= 45000) + printed_black = CHANNEL(d, i).v - tmp; + CHANNEL(d, i).v = tmp; + } + } + else + for (i = 0; i < NCOLORS; i++) + CHANNEL(d, i).v = UPDATE_COLOR(CHANNEL(d, i).v, ndither[i]); + + QUANT(11); + for (i = 0; i < NCOLORS; i++) + ndither[i] = update_dither(d, i, d->src_width, + direction, error[i][0], error[i][1]); + + QUANT(12); + ADVANCE_BIDIRECTIONAL(d, bit, cmy, direction, 3, xerror, xmod, error, + NCOLORS, ERROR_ROWS); + QUANT(13); + } + if (direction == -1) + reverse_row_ends(d); +} + +static void +stp_dither_raw_cmyk_fast(const unsigned short *cmyk, + int row, + void *vd, + int duplicate_line, + int zero_mask) +{ + int x, + length; + unsigned char bit; + dither_t *d = (dither_t *) vd; + int i; + + int dst_width = d->dst_width; + int xerror, xstep, xmod; + if ((zero_mask & 7) == 7) + return; + + length = (d->dst_width + 7) / 8; + + bit = 128; + xstep = 4 * (d->src_width / d->dst_width); + xmod = d->src_width % d->dst_width; + xerror = 0; + x = 0; + + QUANT(14); + for (; x != dst_width; x++) + { + int extra_k; + CHANNEL(d, ECOLOR_C).v = cmyk[0]; + CHANNEL(d, ECOLOR_M).v = cmyk[1]; + CHANNEL(d, ECOLOR_Y).v = cmyk[2]; + CHANNEL(d, ECOLOR_K).v = cmyk[3]; + extra_k = compute_black(d) + CHANNEL(d, ECOLOR_K).v; + for (i = 0; i < NCOLORS; i++) + { + CHANNEL(d, i).o = CHANNEL(d, i).v; + if (i != ECOLOR_K) + CHANNEL(d, i).o += extra_k; + if (CHANNEL(d, i).ptrs[0]) + print_color_fast(d, &(CHANNEL(d, i)), x, row, bit, length); + } + QUANT(16); + ADVANCE_UNIDIRECTIONAL(d, bit, cmyk, 4, xerror, xmod); + QUANT(17); + } +} + +static void +stp_dither_raw_cmyk_ordered(const unsigned short *cmyk, + int row, + void *vd, + int duplicate_line, + int zero_mask) +{ + int x, + length; + unsigned char bit; + dither_t *d = (dither_t *) vd; + int i; + + int terminate; + int xerror, xstep, xmod; + + if ((zero_mask & 7) == 7) + return; + + length = (d->dst_width + 7) / 8; + + bit = 128; + xstep = 4 * (d->src_width / d->dst_width); + xmod = d->src_width % d->dst_width; + xerror = 0; + x = 0; + terminate = d->dst_width; + + QUANT(6); + for (; x != terminate; x ++) + { + int extra_k; + CHANNEL(d, ECOLOR_K).v = cmyk[3]; + CHANNEL(d, ECOLOR_C).v = cmyk[0]; + CHANNEL(d, ECOLOR_M).v = cmyk[1]; + CHANNEL(d, ECOLOR_Y).v = cmyk[2]; + extra_k = compute_black(d) + CHANNEL(d, ECOLOR_K).v; + for (i = 0; i < NCOLORS; i++) + { + CHANNEL(d, i).o = CHANNEL(d, i).v; + if (i != ECOLOR_K) + CHANNEL(d, i).o += extra_k; + print_color_ordered(d, &(CHANNEL(d, i)), x, row, bit, length, 0); + } + + QUANT(11); + ADVANCE_UNIDIRECTIONAL(d, bit, cmyk, 4, xerror, xmod); + QUANT(13); + } +} + + +static void +stp_dither_raw_cmyk_ed(const unsigned short *cmyk, + int row, + void *vd, + int duplicate_line, + int zero_mask) +{ + int x, + length; + unsigned char bit; + int i, j; + int ndither[NCOLORS]; + int *error[NCOLORS][ERROR_ROWS]; + dither_t *d = (dither_t *) vd; + + int terminate; + int direction = row & 1 ? 1 : -1; + int xerror, xstep, xmod; + + if (!duplicate_line) + { + if ((zero_mask & 7) != 7) + d->last_line_was_empty = 0; + else + d->last_line_was_empty++; + } + else if (d->last_line_was_empty) + d->last_line_was_empty++; + if (d->last_line_was_empty >= 5) + return; + + for (i = 0; i < NCOLORS; i++) + { + for (j = 0; j < ERROR_ROWS; j++) + error[i][j] = get_errline(d, row + j, i); + memset(error[i][j - 1], 0, d->dst_width * sizeof(int)); + } + if (d->last_line_was_empty >= 4) + { + if (d->last_line_was_empty == 4) + for (i = 0; i < NCOLORS; i++) + for (j = 0; j < ERROR_ROWS - 1; j++) + memset(error[i][j], 0, d->dst_width * sizeof(int)); + return; + } + + length = (d->dst_width + 7) / 8; + + x = (direction == 1) ? 0 : d->dst_width - 1; + bit = 1 << (7 - (x & 7)); + xstep = 4 * (d->src_width / d->dst_width); + xmod = d->src_width % d->dst_width; + xerror = (xmod * x) % d->dst_width; + terminate = (direction == 1) ? d->dst_width : -1; + if (direction == -1) + { + cmyk += (4 * (d->src_width - 1)); + for (i = 0; i < NCOLORS; i++) + { + for (j = 0; j < ERROR_ROWS; j++) + error[i][j] += d->dst_width - 1; + } + d->ptr_offset = length - 1; + } + for (i = 0; i < NCOLORS; i++) + ndither[i] = error[i][0][0]; + + QUANT(6); + for (; x != terminate; x += direction) + { + int extra_k; + CHANNEL(d, ECOLOR_K).v = cmyk[3]; + CHANNEL(d, ECOLOR_C).v = cmyk[0]; + CHANNEL(d, ECOLOR_M).v = cmyk[1]; + CHANNEL(d, ECOLOR_Y).v = cmyk[2]; + extra_k = compute_black(d) + CHANNEL(d, ECOLOR_K).v; + for (i = 0; i < NCOLORS; i++) + { + CHANNEL(d, i).o = CHANNEL(d, i).v; + if (i != ECOLOR_K) + CHANNEL(d, i).o += extra_k; + CHANNEL(d, i).b = CHANNEL(d, i).v; + CHANNEL(d, i).v = UPDATE_COLOR(CHANNEL(d, i).v, ndither[i]); + CHANNEL(d, i).v = print_color(d, &(CHANNEL(d, i)), x, row, bit, + length, 0, d->dither_type); + ndither[i] = update_dither(d, i, d->src_width, + direction, error[i][0], error[i][1]); + } + QUANT(12); + ADVANCE_BIDIRECTIONAL(d, bit, cmyk, direction, 4, xerror, xmod, error, + NCOLORS, ERROR_ROWS); + QUANT(13); + } + if (direction == -1) + reverse_row_ends(d); +} + +void +stp_dither(const unsigned short *input, + int row, + void *vd, + unsigned char *cyan, + unsigned char *lcyan, + unsigned char *magenta, + unsigned char *lmagenta, + unsigned char *yellow, + unsigned char *lyellow, + unsigned char *black, + int duplicate_line, + int zero_mask) +{ + int i, j; + dither_t *d = (dither_t *) vd; + CHANNEL(d, ECOLOR_K).ptrs[0] = black; + CHANNEL(d, ECOLOR_K).ptrs[1] = NULL; + CHANNEL(d, ECOLOR_C).ptrs[0] = cyan; + CHANNEL(d, ECOLOR_C).ptrs[1] = lcyan; + CHANNEL(d, ECOLOR_M).ptrs[0] = magenta; + CHANNEL(d, ECOLOR_M).ptrs[1] = lmagenta; + CHANNEL(d, ECOLOR_Y).ptrs[0] = yellow; + CHANNEL(d, ECOLOR_Y).ptrs[1] = lyellow; + for (i = 0; i < NCOLORS; i++) + { + for (j = 0; j < 2; j++) + if (CHANNEL(d, i).ptrs[j]) + memset(CHANNEL(d, i).ptrs[j], 0, + (d->dst_width + 7) / 8 * CHANNEL(d, i).dither.signif_bits); + CHANNEL(d, i).dither.row_ends[0][1] = -1; + CHANNEL(d, i).dither.row_ends[0][0] = -1; + CHANNEL(d, i).dither.row_ends[1][1] = -1; + CHANNEL(d, i).dither.row_ends[1][0] = -1; + if (CHANNEL(d, i).dither.nlevels == 1 && + CHANNEL(d, i).dither.ranges[0].bits[1] == 1 && + CHANNEL(d, i).dither.ranges[0].isdark[1]) + CHANNEL(d, i).very_fast = 1; + matrix_set_row(d, &(CHANNEL(d, i).dithermat), row); + matrix_set_row(d, &(CHANNEL(d, i).pick), row); + } + d->ptr_offset = 0; + switch (d->dither_class) + { + case OUTPUT_MONOCHROME: + stp_dither_monochrome(input, row, vd, duplicate_line, zero_mask); + break; + case OUTPUT_GRAY: + if (d->dither_type & D_FAST_BASE) + stp_dither_black_fast(input, row, vd, duplicate_line, zero_mask); + else if (d->dither_type & D_ORDERED_BASE) + stp_dither_black_ordered(input, row, vd, duplicate_line, zero_mask); + else + stp_dither_black_ed(input, row, vd, duplicate_line, zero_mask); + break; + case OUTPUT_COLOR: + if (black) + { + if (d->dither_type & D_FAST_BASE) + stp_dither_cmyk_fast(input, row, vd, duplicate_line, zero_mask); + else if (d->dither_type & D_ORDERED_BASE) + stp_dither_cmyk_ordered(input, row, vd, duplicate_line, zero_mask); + else + stp_dither_cmyk_ed(input, row, vd, duplicate_line, zero_mask); + } + else + { + if (d->dither_type & D_FAST_BASE) + stp_dither_cmy_fast(input, row, vd, duplicate_line, zero_mask); + else if (d->dither_type & D_ORDERED_BASE) + stp_dither_cmy_ordered(input, row, vd, duplicate_line, zero_mask); + else + stp_dither_cmy_ed(input, row, vd, duplicate_line, zero_mask); + } + break; + case OUTPUT_RAW_CMYK: + if (d->dither_type & D_FAST_BASE) + stp_dither_raw_cmyk_fast(input, row, vd, duplicate_line, zero_mask); + else if (d->dither_type & D_ORDERED_BASE) + stp_dither_raw_cmyk_ordered(input, row, vd, duplicate_line, zero_mask); + else + stp_dither_raw_cmyk_ed(input, row, vd, duplicate_line, zero_mask); + break; + } +} diff --git a/src/main/print-escp2.c b/src/main/print-escp2.c new file mode 100644 index 0000000..324768d --- /dev/null +++ b/src/main/print-escp2.c @@ -0,0 +1,4571 @@ +/* + * "$Id: print-escp2.c,v 1.147 2001/11/17 14:12:56 rlk Exp $" + * + * Print plug-in EPSON ESC/P2 driver for the GIMP. + * + * Copyright 1997-2000 Michael Sweet (mike@easysw.com) and + * Robert Krawitz (rlk@alum.mit.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + * This file must include only standard C header files. The core code must + * compile on generic platforms that don't support glib, gimp, gtk, etc. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include "gimp-print-internal.h" +#include +#include + +#ifdef __GNUC__ +#define inline __inline__ +#endif + +#ifdef TEST_UNCOMPRESSED +#define COMPRESSION (0) +#define FILLFUNC stp_fill_uncompressed +#define COMPUTEFUNC stp_compute_uncompressed_linewidth +#define PACKFUNC stp_pack_uncompressed +#else +#define COMPRESSION (1) +#define FILLFUNC stp_fill_tiff +#define COMPUTEFUNC stp_compute_tiff_linewidth +#define PACKFUNC stp_pack_tiff +#endif + +static void flush_pass(stp_softweave_t *sw, int passno, int model, int width, + int hoffset, int ydpi, int xdpi, int physical_xdpi, + int vertical_subpass); + +/* + * Printer capabilities. + * + * Various classes of printer capabilities are represented by bitmasks. + */ + +typedef unsigned long model_cap_t; +typedef unsigned long model_featureset_t; + + +/* + * For each printer, we can select from a variety of dot sizes. + * For single dot size printers, the available sizes are usually 0, + * which is the "default", and some subset of 1-4. For simple variable + * dot size printers (with only one kind of variable dot size), the + * variable dot size is specified as 0x10. For newer printers, there + * is a choice of variable dot sizes available, 0x10, 0x11, and 0x12 in + * order of increasing size. + * + * Normally, we want to specify the smallest dot size that lets us achieve + * a density of less than .8 or thereabouts (above that we start to get + * some dither artifacts). This needs to be tested for each printer and + * resolution. + * + * An entry of -1 in a slot means that this resolution is not available. + */ + +typedef int escp2_dot_size_t[13]; + +/* + * Specify the base density for each available resolution. + * This obviously depends upon the dot size. + */ + +typedef double escp2_densities_t[13]; + +/* + * Definition of the multi-level inks available to a given printer. + * Each printer may use a different kind of ink droplet for variable + * and single drop size for each supported horizontal resolution and + * type of ink (4 or 6 color). + * + * Recall that 6 color ink is treated as simply another kind of + * multi-level ink, but the driver offers the user a choice of 4 and + * 6 color ink, so we need to define appropriate inksets for both + * kinds of ink. + * + * Stuff like the MIS 4 and 6 "color" monochrome inks doesn't fit into + * this model very nicely, so we'll either have to special case it + * or find some way of handling it in here. + */ + +typedef struct escp2_variable_ink +{ + const stp_simple_dither_range_t *range; + int count; + double density; +} escp2_variable_ink_t; + +typedef const escp2_variable_ink_t *escp2_variable_inkset_t[NCOLORS]; + +#define INKTYPE_SINGLE 0 +#define INKTYPE_VARIABLE 1 +#define INKTYPE_N 2 + +#define INKSET_4 0 +#define INKSET_6 1 +#define INKSET_7 2 +#define INKSET_N 3 + +#define RES_120_M 0 +#define RES_120 1 +#define RES_180_M 2 +#define RES_180 3 +#define RES_360_M 4 +#define RES_360 5 +#define RES_720_360_M 6 +#define RES_720_360 7 +#define RES_720_M 8 +#define RES_720 9 +#define RES_1440_720_M 10 +#define RES_1440_720 11 +#define RES_1440_1440_M 12 +#define RES_1440_1440 13 +#define RES_2880_720_M 14 +#define RES_2880_720 15 +#define RES_2880_1440_M 16 +#define RES_2880_1440 17 +#define RES_N 18 + +static const int dotidmap[] = +{ 0, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 10, 11, 12, 12 }; + +static int +resid2dotid(int resid) +{ + if (resid < 0 || resid >= RES_N) + return -1; + return dotidmap[resid]; +} + +static const int densidmap[] = +{ 0, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 10, 11, 12, 12 }; + +static int +resid2densid(int resid) +{ + if (resid < 0 || resid >= RES_N) + return -1; + return densidmap[resid]; +} + +static int +bits2inktype(int bits) +{ + if (bits == 1) + return INKTYPE_SINGLE; + else + return INKTYPE_VARIABLE; +} + +static int +colors2inkset(int colors) +{ + switch (colors) + { + case 1: + case 2: + case 3: + case 4: + return INKSET_4; + case 5: + case 6: + return INKSET_6; + case 7: + return INKSET_7; + default: + return -1; + } +} + +/* + * Mapping between color and linear index. The colors are + * black, magenta, cyan, yellow, light magenta, light cyan + */ + +static const int color_indices[16] = { 0, 1, 2, -1, + 3, -1, -1, -1, + -1, 4, 5, -1, + 6, -1, -1, -1 }; +static const int colors[7] = { 0, 1, 2, 4, 1, 2, 4}; +static const int densities[7] = { 0, 0, 0, 0, 1, 1, 1 }; + +static inline int +get_color_by_params(int plane, int density) +{ + if (plane > 4 || plane < 0 || density > 1 || density < 0) + return -1; + return color_indices[density * 8 + plane]; +} + +typedef const escp2_variable_inkset_t *escp2_variable_inklist_t[INKTYPE_N][INKSET_N][RES_N / 2]; + + +static const stp_simple_dither_range_t photo_cyan_dither_ranges[] = +{ + { 0.27, 0x1, 0, 1 }, + { 1.0, 0x1, 1, 1 } +}; + +static const escp2_variable_ink_t photo_cyan_ink = +{ + photo_cyan_dither_ranges, + sizeof(photo_cyan_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1 +}; + +static const stp_simple_dither_range_t photo_magenta_dither_ranges[] = +{ + { 0.35, 0x1, 0, 1 }, + { 1.0, 0x1, 1, 1 } +}; + +static const escp2_variable_ink_t photo_magenta_ink = +{ + photo_magenta_dither_ranges, + sizeof(photo_magenta_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1 +}; + + +static const stp_simple_dither_range_t photo_6pl_dither_ranges[] = +{ + { 0.065, 0x1, 0, 1 }, + { 0.13, 0x2, 0, 2 }, +/* { 0.26, 0x3, 0, 3 }, */ + { 0.25, 0x1, 1, 1 }, + { 0.5, 0x2, 1, 2 }, + { 1.0, 0x3, 1, 3 } +}; + +static const escp2_variable_ink_t photo_6pl_ink = +{ + photo_6pl_dither_ranges, + sizeof(photo_6pl_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + + +static const stp_simple_dither_range_t photo_6pl_1440_dither_ranges[] = +{ + { 0.13, 0x1, 0, 1 }, + { 0.26, 0x2, 0, 2 }, +/* { 0.52, 0x3, 0, 3 }, */ + { 0.5, 0x1, 1, 1 }, + { 1.0, 0x2, 1, 2 }, +}; + +static const escp2_variable_ink_t photo_6pl_1440_ink = +{ + photo_6pl_1440_dither_ranges, + sizeof(photo_6pl_1440_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + + +static const stp_simple_dither_range_t photo_pigment_dither_ranges[] = +{ /* MRS: Not calibrated! */ + { 0.15, 0x1, 0, 1 }, + { 0.227, 0x2, 0, 2 }, + { 0.5, 0x1, 1, 1 }, + { 1.0, 0x2, 1, 2 } +}; + +static const escp2_variable_ink_t photo_pigment_ink = +{ + photo_pigment_dither_ranges, + sizeof(photo_pigment_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + + +static const stp_simple_dither_range_t photo_4pl_dither_ranges[] = +{ + { 0.17, 0x1, 0, 1 }, + { 0.26, 0x2, 0, 2 }, + { 0.661, 0x1, 1, 1 }, + { 1.00, 0x2, 1, 2 } +}; + +static const escp2_variable_ink_t photo_4pl_ink = +{ + photo_4pl_dither_ranges, + sizeof(photo_4pl_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + +static const stp_simple_dither_range_t spro10000_photo_dither_ranges[] = +{ + { 0.17, 0x1, 0, 1 }, + { 0.26, 0x2, 0, 2 }, + { 0.661, 0x1, 1, 1 }, + { 1.00, 0x2, 1, 2 } +}; + +static const escp2_variable_ink_t spro10000_photo_ink = +{ + spro10000_photo_dither_ranges, + sizeof(spro10000_photo_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + +static const stp_simple_dither_range_t spro10000_standard_dither_ranges[] = +{ + { 0.661, 0x1, 1, 1 }, + { 1.00, 0x2, 1, 2 } +}; + +static const escp2_variable_ink_t spro10000_standard_ink = +{ + spro10000_standard_dither_ranges, + sizeof(spro10000_standard_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + +static const stp_simple_dither_range_t photo_4pl_2880_dither_ranges[] = +{ + { 0.35, 0x1, 0, 1 }, + { 1.00, 0x1, 1, 1 }, +}; + +static const escp2_variable_ink_t photo_4pl_2880_ink = +{ + photo_4pl_2880_dither_ranges, + sizeof(photo_4pl_2880_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + + +static const stp_simple_dither_range_t standard_6pl_dither_ranges[] = +{ + { 0.25, 0x1, 1, 1 }, + { 0.5, 0x2, 1, 2 }, + { 1.0, 0x3, 1, 3 } +}; + +static const escp2_variable_ink_t standard_6pl_ink = +{ + standard_6pl_dither_ranges, + sizeof(standard_6pl_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + + +static const stp_simple_dither_range_t standard_x80_6pl_dither_ranges[] = +{ + { 0.325, 0x1, 1, 1 }, + { 0.5, 0x2, 1, 2 }, + { 1.0, 0x3, 1, 3 } +}; + +static const escp2_variable_ink_t standard_x80_6pl_ink = +{ + standard_x80_6pl_dither_ranges, + sizeof(standard_x80_6pl_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + +static const stp_simple_dither_range_t standard_x80_multishot_dither_ranges[] = +{ + { 0.163, 0x1, 1, 1 }, + { 0.5, 0x2, 1, 2 }, + { 1.0, 0x3, 1, 3 } +}; + +static const escp2_variable_ink_t standard_x80_multishot_ink = +{ + standard_x80_multishot_dither_ranges, + sizeof(standard_x80_multishot_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + +static const stp_simple_dither_range_t standard_x80_1440_6pl_dither_ranges[] = +{ + { 0.65, 0x1, 1, 1 }, + { 1.0, 0x2, 1, 2 }, +}; + +static const escp2_variable_ink_t standard_x80_1440_6pl_ink = +{ + standard_x80_1440_6pl_dither_ranges, + sizeof(standard_x80_1440_6pl_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + + +static stp_simple_dither_range_t standard_980_6pl_dither_ranges[] = +{ + { 0.40, 0x1, 1, 1 }, + { 0.675, 0x2, 1, 2 }, + { 1.0, 0x3, 1, 3 } +}; + +static escp2_variable_ink_t standard_980_6pl_ink = +{ + standard_980_6pl_dither_ranges, + sizeof(standard_6pl_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + + +static const stp_simple_dither_range_t standard_6pl_1440_dither_ranges[] = +{ + { 0.5, 0x1, 1, 1 }, + { 1.0, 0x2, 1, 2 }, +}; + +static const escp2_variable_ink_t standard_6pl_1440_ink = +{ + standard_6pl_1440_dither_ranges, + sizeof(standard_6pl_1440_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + + +static const stp_simple_dither_range_t standard_pigment_dither_ranges[] = +{ /* MRS: Not calibrated! */ + { 0.55, 0x1, 1, 1 }, + { 1.0, 0x2, 1, 2 } +}; + +static const escp2_variable_ink_t standard_pigment_ink = +{ + standard_pigment_dither_ranges, + sizeof(standard_pigment_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + + +static const stp_simple_dither_range_t standard_4pl_dither_ranges[] = +{ + { 0.661, 0x1, 1, 1 }, + { 1.00, 0x2, 1, 2 } +}; + +static const escp2_variable_ink_t standard_4pl_ink = +{ + standard_4pl_dither_ranges, + sizeof(standard_4pl_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + +static const stp_simple_dither_range_t standard_4pl_2880_dither_ranges[] = +{ + { 1.00, 0x1, 1, 1 }, +}; + +static const escp2_variable_ink_t standard_4pl_2880_ink = +{ + standard_4pl_2880_dither_ranges, + sizeof(standard_4pl_2880_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + + +static const stp_simple_dither_range_t standard_3pl_dither_ranges[] = +{ + { 0.25, 0x1, 1, 1 }, + { 0.61, 0x2, 1, 2 }, + { 1.0, 0x3, 1, 3 } +}; + +static const escp2_variable_ink_t standard_3pl_ink = +{ + standard_3pl_dither_ranges, + sizeof(standard_3pl_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + + +static const stp_simple_dither_range_t standard_3pl_1440_dither_ranges[] = +{ + { 0.39, 0x1, 1, 1 }, + { 1.0, 0x2, 1, 2 } +}; + +static const escp2_variable_ink_t standard_3pl_1440_ink = +{ + standard_3pl_1440_dither_ranges, + sizeof(standard_3pl_1440_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + + +static const stp_simple_dither_range_t standard_3pl_2880_dither_ranges[] = +{ + { 1.0, 0x1, 1, 1 } +}; + +static const escp2_variable_ink_t standard_3pl_2880_ink = +{ + standard_3pl_2880_dither_ranges, + sizeof(standard_3pl_2880_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + + +static const stp_simple_dither_range_t standard_economy_pigment_dither_ranges[] = +{ + { 1.0, 0x3, 1, 3 } +}; + +static const escp2_variable_ink_t standard_economy_pigment_ink = +{ + standard_economy_pigment_dither_ranges, + sizeof(standard_economy_pigment_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + +static const stp_simple_dither_range_t standard_multishot_pigment_dither_ranges[] = +{ + { 0.410, 0x1, 1, 1 }, + { 1.0, 0x3, 1, 3 } +}; + +static const escp2_variable_ink_t standard_multishot_pigment_ink = +{ + standard_multishot_pigment_dither_ranges, + sizeof(standard_multishot_pigment_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + +static stp_simple_dither_range_t standard_6pl_pigment_dither_ranges[] = +{ + { 0.300, 0x1, 1, 1 }, + { 1.0, 0x3, 1, 3 } +}; + +static escp2_variable_ink_t standard_6pl_pigment_ink = +{ + standard_6pl_pigment_dither_ranges, + sizeof(standard_6pl_pigment_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + +static const stp_simple_dither_range_t standard_3pl_pigment_dither_ranges[] = +{ + { 0.650, 0x1, 1, 1 }, + { 1.000, 0x2, 1, 2 }, +}; + +static const escp2_variable_ink_t standard_3pl_pigment_ink = +{ + standard_3pl_pigment_dither_ranges, + sizeof(standard_3pl_pigment_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + + +static const stp_simple_dither_range_t standard_3pl_pigment_2880_dither_ranges[] = +{ + { 1.0, 0x1, 1, 1 } +}; + +static const escp2_variable_ink_t standard_3pl_pigment_2880_ink = +{ + standard_3pl_pigment_2880_dither_ranges, + sizeof(standard_3pl_pigment_2880_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + + +static const stp_simple_dither_range_t photo_multishot_dither_ranges[] = +{ + { 0.0728, 0x1, 0, 1 }, + { 0.151, 0x2, 0, 2 }, + { 0.26, 0x3, 0, 3 }, + { 1.0, 0x3, 1, 3 } +}; + +static const escp2_variable_ink_t photo_multishot_ink = +{ + photo_multishot_dither_ranges, + sizeof(photo_multishot_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + + +static const stp_simple_dither_range_t standard_multishot_dither_ranges[] = +{ + { 0.28, 0x1, 1, 1 }, + { 0.58, 0x2, 1, 2 }, + { 1.0, 0x3, 1, 3 } +}; + +static const escp2_variable_ink_t standard_multishot_ink = +{ + standard_multishot_dither_ranges, + sizeof(standard_multishot_dither_ranges) / sizeof(stp_simple_dither_range_t), + 1.0 +}; + + +static const escp2_variable_inkset_t standard_inks = +{ + NULL, + NULL, + NULL, + NULL +}; + +static const escp2_variable_inkset_t photo_inks = +{ + NULL, + &photo_cyan_ink, + &photo_magenta_ink, + NULL +}; + +static const escp2_variable_inkset_t escp2_6pl_standard_inks = +{ + &standard_6pl_ink, + &standard_6pl_ink, + &standard_6pl_ink, + &standard_6pl_ink +}; + +static const escp2_variable_inkset_t escp2_x80_multishot_standard_inks = +{ + &standard_x80_multishot_ink, + &standard_x80_multishot_ink, + &standard_x80_multishot_ink, + &standard_x80_multishot_ink +}; + +static const escp2_variable_inkset_t escp2_x80_6pl_standard_inks = +{ + &standard_x80_6pl_ink, + &standard_x80_6pl_ink, + &standard_x80_6pl_ink, + &standard_x80_6pl_ink +}; + +static const escp2_variable_inkset_t escp2_x80_1440_6pl_standard_inks = +{ + &standard_x80_1440_6pl_ink, + &standard_x80_1440_6pl_ink, + &standard_x80_1440_6pl_ink, + &standard_x80_1440_6pl_ink +}; + +static const escp2_variable_inkset_t escp2_6pl_standard_980_inks = +{ + &standard_980_6pl_ink, + &standard_980_6pl_ink, + &standard_980_6pl_ink, + &standard_980_6pl_ink +}; + +static const escp2_variable_inkset_t escp2_6pl_photo_inks = +{ + &standard_6pl_ink, + &photo_6pl_ink, + &photo_6pl_ink, + &standard_6pl_ink +}; + +static const escp2_variable_inkset_t escp2_6pl_1440_standard_inks = +{ + &standard_6pl_1440_ink, + &standard_6pl_1440_ink, + &standard_6pl_1440_ink, + &standard_6pl_1440_ink +}; + +static const escp2_variable_inkset_t escp2_6pl_1440_photo_inks = +{ + &standard_6pl_1440_ink, + &photo_6pl_1440_ink, + &photo_6pl_1440_ink, + &standard_6pl_1440_ink +}; + +static const escp2_variable_inkset_t escp2_pigment_standard_inks = +{ + &standard_pigment_ink, + &standard_pigment_ink, + &standard_pigment_ink, + &standard_pigment_ink +}; + +static const escp2_variable_inkset_t escp2_pigment_photo_inks = +{ + &standard_pigment_ink, + &photo_pigment_ink, + &photo_pigment_ink, + &standard_pigment_ink +}; + +static const escp2_variable_inkset_t escp2_4pl_standard_inks = +{ + &standard_4pl_ink, + &standard_4pl_ink, + &standard_4pl_ink, + &standard_4pl_ink +}; + +static const escp2_variable_inkset_t escp2_4pl_photo_inks = +{ + &standard_4pl_ink, + &photo_4pl_ink, + &photo_4pl_ink, + &standard_4pl_ink +}; + +static const escp2_variable_inkset_t spro10000_standard_inks = +{ + &spro10000_standard_ink, + &spro10000_standard_ink, + &spro10000_standard_ink, + &spro10000_standard_ink +}; + +static const escp2_variable_inkset_t spro10000_photo_inks = +{ + &spro10000_standard_ink, + &spro10000_photo_ink, + &spro10000_photo_ink, + &spro10000_standard_ink +}; + +static const escp2_variable_inkset_t escp2_4pl_2880_standard_inks = +{ + &standard_4pl_2880_ink, + &standard_4pl_2880_ink, + &standard_4pl_2880_ink, + &standard_4pl_2880_ink +}; + +static const escp2_variable_inkset_t escp2_4pl_2880_photo_inks = +{ + &standard_4pl_2880_ink, + &photo_4pl_2880_ink, + &photo_4pl_2880_ink, + &standard_4pl_2880_ink +}; + +static const escp2_variable_inkset_t escp2_3pl_standard_inks = +{ + &standard_3pl_ink, + &standard_3pl_ink, + &standard_3pl_ink, + &standard_3pl_ink +}; + +static const escp2_variable_inkset_t escp2_3pl_1440_standard_inks = +{ + &standard_3pl_1440_ink, + &standard_3pl_1440_ink, + &standard_3pl_1440_ink, + &standard_3pl_1440_ink +}; + +static const escp2_variable_inkset_t escp2_3pl_2880_standard_inks = +{ + &standard_3pl_2880_ink, + &standard_3pl_2880_ink, + &standard_3pl_2880_ink, + &standard_3pl_2880_ink +}; + +static const escp2_variable_inkset_t escp2_multishot_standard_inks = +{ + &standard_multishot_ink, + &standard_multishot_ink, + &standard_multishot_ink, + &standard_multishot_ink +}; + +static const escp2_variable_inkset_t escp2_multishot_photo_inks = +{ + &standard_multishot_ink, + &photo_multishot_ink, + &photo_multishot_ink, + &standard_multishot_ink +}; + +static const escp2_variable_inkset_t escp2_economy_pigment_standard_inks = +{ + &standard_economy_pigment_ink, + &standard_economy_pigment_ink, + &standard_economy_pigment_ink, + &standard_economy_pigment_ink +}; + +static const escp2_variable_inkset_t escp2_multishot_pigment_standard_inks = +{ + &standard_multishot_pigment_ink, + &standard_multishot_pigment_ink, + &standard_multishot_pigment_ink, + &standard_multishot_pigment_ink +}; + +static const escp2_variable_inkset_t escp2_6pl_pigment_standard_inks = +{ + &standard_6pl_pigment_ink, + &standard_6pl_pigment_ink, + &standard_6pl_pigment_ink, + &standard_6pl_pigment_ink +}; + +static const escp2_variable_inkset_t escp2_3pl_pigment_standard_inks = +{ + &standard_3pl_pigment_ink, + &standard_3pl_pigment_ink, + &standard_3pl_pigment_ink, + &standard_3pl_pigment_ink +}; + +static const escp2_variable_inkset_t escp2_3pl_pigment_2880_standard_inks = +{ + &standard_3pl_pigment_2880_ink, + &standard_3pl_pigment_2880_ink, + &standard_3pl_pigment_2880_ink, + &standard_3pl_pigment_2880_ink +}; + + +static const escp2_variable_inklist_t simple_4color_inks = +{ + { + { + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks + }, + }, +}; + +static const escp2_variable_inklist_t simple_6color_inks = +{ + { + { + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + }, + { + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + } + } +}; + +static const escp2_variable_inklist_t variable_6pl_4color_inks = +{ + { + { + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + } + }, + { + { + &escp2_6pl_standard_inks, + &escp2_6pl_standard_inks, + &escp2_6pl_standard_inks, + &escp2_6pl_standard_inks, + &escp2_6pl_standard_inks, + &escp2_6pl_1440_standard_inks, + &escp2_6pl_1440_standard_inks, + &escp2_6pl_standard_inks, + &escp2_6pl_standard_inks, + } + } +}; + +static const escp2_variable_inklist_t variable_x80_6pl_4color_inks = +{ + { + { + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + } + }, + { + { + &escp2_x80_multishot_standard_inks, + &escp2_x80_multishot_standard_inks, + &escp2_x80_multishot_standard_inks, + &escp2_x80_multishot_standard_inks, + &escp2_x80_6pl_standard_inks, + &escp2_x80_1440_6pl_standard_inks, + &escp2_x80_1440_6pl_standard_inks, + &escp2_x80_1440_6pl_standard_inks, + &escp2_x80_1440_6pl_standard_inks, + } + } +}; + +static const escp2_variable_inklist_t variable_6pl_6color_inks = +{ + { + { + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks + }, + { + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks + } + }, + { + { + &escp2_6pl_standard_inks, + &escp2_6pl_standard_inks, + &escp2_6pl_standard_inks, + &escp2_6pl_standard_inks, + &escp2_6pl_standard_inks, + &escp2_6pl_1440_standard_inks, + &escp2_6pl_1440_standard_inks, + &escp2_6pl_standard_inks, + &escp2_6pl_standard_inks + }, + { + &escp2_6pl_photo_inks, + &escp2_6pl_photo_inks, + &escp2_6pl_photo_inks, + &escp2_6pl_photo_inks, + &escp2_6pl_photo_inks, + &escp2_6pl_1440_photo_inks, + &escp2_6pl_1440_photo_inks, + &escp2_6pl_photo_inks, + &escp2_6pl_photo_inks + } + } +}; + +static const escp2_variable_inklist_t variable_pigment_6color_inks = +{ + { + { + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks + }, + { + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks + } + }, + { + { + &escp2_pigment_standard_inks, + &escp2_pigment_standard_inks, + &escp2_pigment_standard_inks, + &escp2_pigment_standard_inks, + &escp2_pigment_standard_inks, + &escp2_pigment_standard_inks, + &escp2_pigment_standard_inks, + &escp2_pigment_standard_inks, + &escp2_pigment_standard_inks + }, + { + &escp2_pigment_photo_inks, + &escp2_pigment_photo_inks, + &escp2_pigment_photo_inks, + &escp2_pigment_photo_inks, + &escp2_pigment_photo_inks, + &escp2_pigment_photo_inks, + &escp2_pigment_photo_inks, + &escp2_pigment_photo_inks, + &escp2_pigment_photo_inks + } + } +}; + +static const escp2_variable_inklist_t spro10000_inks = +{ + { + { + &spro10000_standard_inks, + &spro10000_standard_inks, + &spro10000_standard_inks, + &spro10000_standard_inks, + &spro10000_standard_inks, + &spro10000_standard_inks, + &spro10000_standard_inks, + &spro10000_standard_inks, + &spro10000_standard_inks + }, + { + &spro10000_photo_inks, + &spro10000_photo_inks, + &spro10000_photo_inks, + &spro10000_photo_inks, + &spro10000_photo_inks, + &spro10000_photo_inks, + &spro10000_photo_inks, + &spro10000_photo_inks, + &spro10000_photo_inks + } + }, + { + { + &spro10000_standard_inks, + &spro10000_standard_inks, + &spro10000_standard_inks, + &spro10000_standard_inks, + &spro10000_standard_inks, + &spro10000_standard_inks, + &spro10000_standard_inks, + &spro10000_standard_inks, + &spro10000_standard_inks + }, + { + &spro10000_photo_inks, + &spro10000_photo_inks, + &spro10000_photo_inks, + &spro10000_photo_inks, + &spro10000_photo_inks, + &spro10000_photo_inks, + &spro10000_photo_inks, + &spro10000_photo_inks, + &spro10000_photo_inks + } + } +}; + +static const escp2_variable_inklist_t variable_3pl_4color_inks = +{ + { + { + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + } + }, + { + { + &escp2_multishot_standard_inks, + &escp2_multishot_standard_inks, + &escp2_6pl_standard_980_inks, + &escp2_6pl_standard_980_inks, + &escp2_3pl_standard_inks, + &escp2_3pl_1440_standard_inks, + &escp2_3pl_1440_standard_inks, + &escp2_3pl_2880_standard_inks, + &escp2_3pl_2880_standard_inks, + } + } +}; + +static const escp2_variable_inklist_t variable_3pl_pigment_4color_inks = +{ + { + { + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + } + }, + { + { + &escp2_economy_pigment_standard_inks, + &escp2_economy_pigment_standard_inks, + &escp2_multishot_pigment_standard_inks, + &escp2_multishot_pigment_standard_inks, + &escp2_6pl_pigment_standard_inks, + &escp2_3pl_pigment_standard_inks, + &escp2_3pl_pigment_2880_standard_inks, + &escp2_3pl_pigment_2880_standard_inks, + &escp2_3pl_pigment_2880_standard_inks, + } + } +}; + +static const escp2_variable_inklist_t variable_4pl_4color_inks = +{ + { + { + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + } + }, + { + { + &escp2_multishot_standard_inks, + &escp2_multishot_standard_inks, + &escp2_multishot_standard_inks, + &escp2_multishot_standard_inks, + &escp2_6pl_standard_inks, + &escp2_4pl_standard_inks, + &escp2_4pl_2880_standard_inks, + &escp2_4pl_2880_standard_inks, + &escp2_4pl_2880_standard_inks, + } + } +}; + +static const escp2_variable_inklist_t variable_4pl_6color_inks = +{ + { + { + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks, + &standard_inks + }, + { + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks, + &photo_inks + } + }, + { + { + &escp2_multishot_standard_inks, + &escp2_multishot_standard_inks, + &escp2_multishot_standard_inks, + &escp2_multishot_standard_inks, + &escp2_6pl_standard_inks, + &escp2_4pl_standard_inks, + &escp2_4pl_2880_standard_inks, + &escp2_4pl_2880_standard_inks, + &escp2_4pl_2880_standard_inks, + }, + { + &escp2_multishot_photo_inks, + &escp2_multishot_photo_inks, + &escp2_multishot_photo_inks, + &escp2_multishot_photo_inks, + &escp2_6pl_photo_inks, + &escp2_4pl_photo_inks, + &escp2_4pl_2880_photo_inks, + &escp2_4pl_2880_photo_inks, + &escp2_4pl_2880_photo_inks + } + } +}; + +static const double standard_sat_adjustment[49] = +{ + 1.0, /* C */ + 1.1, + 1.2, + 1.3, + 1.4, + 1.5, + 1.6, + 1.7, + 1.8, /* B */ + 1.9, + 1.9, + 1.9, + 1.7, + 1.5, + 1.3, + 1.1, + 1.0, /* M */ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, /* R */ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, /* Y */ + 1.0, + 1.0, + 1.1, + 1.2, + 1.3, + 1.4, + 1.5, + 1.5, /* G */ + 1.4, + 1.3, + 1.2, + 1.1, + 1.0, + 1.0, + 1.0, + 1.0 /* C */ +}; + +static const double standard_lum_adjustment[49] = +{ + 0.50, /* C */ + 0.6, + 0.7, + 0.8, + 0.9, + 0.86, + 0.82, + 0.79, + 0.78, /* B */ + 0.8, + 0.83, + 0.87, + 0.9, + 0.95, + 1.05, + 1.15, + 1.3, /* M */ + 1.25, + 1.2, + 1.15, + 1.12, + 1.09, + 1.06, + 1.03, + 1.0, /* R */ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, /* Y */ + 0.9, + 0.8, + 0.7, + 0.65, + 0.6, + 0.55, + 0.52, + 0.48, /* G */ + 0.47, + 0.47, + 0.49, + 0.49, + 0.49, + 0.52, + 0.51, + 0.50 /* C */ +}; + +static const double standard_hue_adjustment[49] = +{ + 0.00, /* C */ + 0.05, + 0.04, + 0.01, + -0.03, + -0.10, + -0.18, + -0.26, + -0.35, /* B */ + -0.43, + -0.40, + -0.32, + -0.25, + -0.18, + -0.10, + -0.07, + 0.00, /* M */ + -0.04, + -0.09, + -0.13, + -0.18, + -0.23, + -0.27, + -0.31, + -0.35, /* R */ + -0.38, + -0.30, + -0.23, + -0.15, + -0.08, + 0.00, + -0.02, + 0.00, /* Y */ + 0.08, + 0.10, + 0.08, + 0.05, + 0.03, + -0.03, + -0.12, + -0.20, /* G */ + -0.17, + -0.20, + -0.17, + -0.15, + -0.12, + -0.10, + -0.08, + 0.00, /* C */ +}; + +static const double plain_paper_lum_adjustment[49] = +{ + 1.2, /* C */ + 1.22, + 1.28, + 1.34, + 1.39, + 1.42, + 1.45, + 1.48, + 1.5, /* B */ + 1.4, + 1.3, + 1.25, + 1.2, + 1.1, + 1.05, + 1.05, + 1.05, /* M */ + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, /* R */ + 1.05, + 1.05, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, /* Y */ + 1.15, + 1.3, + 1.45, + 1.6, + 1.75, + 1.9, + 2.0, + 2.1, /* G */ + 2.0, + 1.8, + 1.7, + 1.6, + 1.5, + 1.4, + 1.3, + 1.2 /* C */ +}; + +static const double pgpp_sat_adjustment[49] = +{ + 1.00, /* C */ + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, /* B */ + 1.00, + 1.00, + 1.03, + 1.05, + 1.07, + 1.09, + 1.11, + 1.13, /* M */ + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, /* R */ + 1.10, + 1.05, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, /* Y */ + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, /* G */ + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, /* C */ +}; + +static const double pgpp_lum_adjustment[49] = +{ + 1.00, /* C */ + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, /* B */ + 1.00, + 1.00, + 1.03, + 1.05, + 1.07, + 1.09, + 1.11, + 1.13, /* M */ + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, + 1.13, /* R */ + 1.10, + 1.05, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, /* Y */ + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, /* G */ + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, + 1.00, /* C */ +}; + +static const double pgpp_hue_adjustment[49] = +{ + 0.00, /* C */ + 0.00, + 0.00, + 0.00, + 0.00, + 0.01, + 0.02, + 0.03, + 0.05, /* B */ + 0.05, + 0.05, + 0.04, + 0.04, + 0.03, + 0.02, + 0.01, + 0.00, /* M */ + -.03, + -.05, + -.07, + -.09, + -.11, + -.13, + -.14, + -.15, /* R */ + -.13, + -.10, + -.06, + -.04, + -.02, + -.01, + 0.00, + 0.00, /* Y */ + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, /* G */ + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, /* C */ +}; + +typedef struct +{ + const char *name; + const char *text; + int paper_feed_sequence; + int platen_gap; + double base_density; + double k_lower_scale; + double k_upper; + double cyan; + double magenta; + double yellow; + double p_cyan; + double p_magenta; + double p_yellow; + double saturation; + double gamma; + int feed_adjustment; + int vacuum_intensity; + int paper_thickness; + const double *hue_adjustment; + const double *lum_adjustment; + const double *sat_adjustment; +} paper_t; + +typedef struct +{ + int paper_count; + const paper_t *papers; +} paperlist_t; + +static const paper_t standard_papers[] = +{ + { "Plain", N_("Plain Paper"), + 1, 0, 0.80, .1, .5, 1.0, 1.0, 1.0, .9, 1.05, 1.15, + 1, 1.0, 0x6b, 0x1a, 0x01, NULL, plain_paper_lum_adjustment, NULL}, + { "PlainFast", N_("Plain Paper Fast Load"), + 5, 0, 0.80, .1, .5, 1.0, 1.0, 1.0, .9, 1.05, 1.15, + 1, 1.0, 0x6b, 0x1a, 0x01, NULL, plain_paper_lum_adjustment, NULL}, + { "Postcard", N_("Postcard"), + 2, 0, 0.83, .2, .6, 1.0, 1.0, 1.0, .9, 1.0, 1.1, + 1, 1.0, 0x00, 0x00, 0x02, NULL, plain_paper_lum_adjustment, NULL}, + { "GlossyFilm", N_("Glossy Film"), + 3, 0, 1.00 ,1, .999, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1, 1.0, 0x6d, 0x00, 0x01, NULL, plain_paper_lum_adjustment, NULL}, + { "Transparency", N_("Transparencies"), + 3, 0, 1.00, 1, .999, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, 0x6d, 0x00, 0x02, NULL, plain_paper_lum_adjustment, NULL}, + { "Envelope", N_("Envelopes"), + 4, 0, 0.80, .125, .5, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1, 1.0, 0x6b, 0x1a, 0x01, NULL, plain_paper_lum_adjustment, NULL}, + { "BackFilm", N_("Back Light Film"), + 6, 0, 1.00, 1, .999, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1, 1.0, 0x6d, 0x00, 0x01, NULL, NULL, NULL}, + { "Matte", N_("Matte Paper"), + 7, 0, 0.85, 1.0, .999, 1.05, .9, 1.05, .9, 1.0, 1.1, + 1, 1.0, 0x00, 0x00, 0x02, NULL, NULL, NULL}, + { "Inkjet", N_("Inkjet Paper"), + 7, 0, 0.85, .25, .6, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1, 1.0, 0x6b, 0x1a, 0x01, NULL, plain_paper_lum_adjustment, NULL}, + { "Coated", N_("Photo Quality Inkjet Paper"), + 7, 0, 1.00, 1.0, .999, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1, 1.0, 0x6b, 0x1a, 0x01, NULL, NULL, NULL}, + { "Photo", N_("Photo Paper"), + 8, 0, 1.00, 1.0, .9, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1, 1.0, 0x67, 0x00, 0x02, NULL, NULL, NULL}, + { "GlossyPhoto", N_("Premium Glossy Photo Paper"), + 8, 0, 1.10, 1, .999, 1.0, 1.0, 1.0, 1.0, 1.03, 1.0, + 1, 1.0, 0x80, 0x00, 0x02, + pgpp_hue_adjustment, pgpp_lum_adjustment, pgpp_sat_adjustment}, + { "Luster", N_("Premium Luster Photo Paper"), + 8, 0, 1.00, 1, .999, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, 0x80, 0x00, 0x02, NULL, NULL, NULL}, + { "GlossyPaper", N_("Photo Quality Glossy Paper"), + 6, 0, 1.00, 1, .999, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, 0x6b, 0x1a, 0x01, NULL, NULL, NULL}, + { "Ilford", N_("Ilford Heavy Paper"), + 8, 0, .85, .5, 1.35, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1, 1.0, 0x80, 0x00, 0x02, NULL, NULL, NULL }, + { "Other", N_("Other"), + 0, 0, 0.80, 0.125, .5, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1, 1.0, 0x6b, 0x1a, 0x01, NULL, plain_paper_lum_adjustment, NULL}, +}; + +static const paperlist_t standard_paper_list = +{ + sizeof(standard_papers) / sizeof(paper_t), + standard_papers +}; + +static const paper_t c80_papers[] = +{ + { "Plain", N_("Plain Paper"), + 1, 0, 0.80, .1, .5, 1.0, 1.0, 1.0, .9, 1.05, 1.15, + 1, 1.0, 0x6b, 0x1a, 0x01, NULL, plain_paper_lum_adjustment, NULL}, + { "PlainFast", N_("Plain Paper Fast Load"), + 5, 0, 0.80, .1, .5, 1.0, 1.0, 1.0, .9, 1.05, 1.15, + 1, 1.0, 0x6b, 0x1a, 0x01, NULL, plain_paper_lum_adjustment, NULL}, + { "Postcard", N_("Postcard"), + 2, 0, 0.83, .2, .6, 1.0, 1.0, 1.0, .9, 1.0, 1.1, + 1, 1.0, 0x00, 0x00, 0x02, NULL, plain_paper_lum_adjustment, NULL}, + { "GlossyFilm", N_("Glossy Film"), + 3, 0, 1.00 ,1, .999, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1, 1.0, 0x6d, 0x00, 0x01, NULL, plain_paper_lum_adjustment, NULL}, + { "Transparency", N_("Transparencies"), + 3, 0, 1.00, 1, .999, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, 0x6d, 0x00, 0x02, NULL, plain_paper_lum_adjustment, NULL}, + { "Envelope", N_("Envelopes"), + 4, 0, 0.80, .125, .5, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1, 1.0, 0x6b, 0x1a, 0x01, NULL, plain_paper_lum_adjustment, NULL}, + { "BackFilm", N_("Back Light Film"), + 6, 0, 1.00, 1, .999, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1, 1.0, 0x6d, 0x00, 0x01, NULL, NULL, NULL}, + { "Matte", N_("Matte Paper"), + 7, 0, 0.9, 1.0, .999, 1.0, 1.0, 1.0, .9, 1.0, 1.1, + 1, 1.0, 0x00, 0x00, 0x02, NULL, NULL, NULL}, + { "Inkjet", N_("Inkjet Paper"), + 7, 0, 0.85, .25, .6, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1, 1.0, 0x6b, 0x1a, 0x01, NULL, plain_paper_lum_adjustment, NULL}, + { "Coated", N_("Photo Quality Inkjet Paper"), + 7, 0, 1.00, 1.0, .999, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1, 1.0, 0x6b, 0x1a, 0x01, NULL, NULL, NULL}, + { "Photo", N_("Photo Paper"), + 8, 0, 1.20, 1.0, .9, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1, 1.0, 0x67, 0x00, 0x02, NULL, NULL, NULL}, + { "GlossyPhoto", N_("Premium Glossy Photo Paper"), + 8, 0, 1.00, 1, .999, 1.0, 1.0, 1.0, 1.0, 1.03, 1.0, + 1, 1.0, 0x80, 0x00, 0x02, + pgpp_hue_adjustment, pgpp_lum_adjustment, pgpp_sat_adjustment}, + { "Luster", N_("Premium Luster Photo Paper"), + 8, 0, 1.00, 1, .999, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, 0x80, 0x00, 0x02, NULL, NULL, NULL}, + { "GlossyPaper", N_("Photo Quality Glossy Paper"), + 6, 0, 1.00, 1, .999, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, 0x6b, 0x1a, 0x01, NULL, NULL, NULL}, + { "Ilford", N_("Ilford Heavy Paper"), + 8, 0, .85, .5, 1.35, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1, 1.0, 0x80, 0x00, 0x02, NULL, NULL, NULL }, + { "Other", N_("Other"), + 0, 0, 0.80, 0.125, .5, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1, 1.0, 0x6b, 0x1a, 0x01, NULL, plain_paper_lum_adjustment, NULL}, +}; + +static const paperlist_t c80_paper_list = +{ + sizeof(c80_papers) / sizeof(paper_t), + c80_papers +}; + +/* + * Dot sizes are for: + * + * 0: 120/180 DPI micro + * 1: 120/180 DPI soft + * 2: 360 micro + * 3: 360 soft + * 4: 720x360 micro + * 5: 720x360 soft + * 6: 720 micro + * 7: 720 soft + * 8: 1440x720 micro + * 9: 1440x720 soft + * 10: 2880x720 micro + * 11: 2880x720 soft + * 12: 2880x1440 + */ + +/* 0 1 2 3 4 5 6 7 8 9 10 11 12 */ + +static const escp2_dot_size_t g1_dotsizes = +{ -2, -1, -2, -1, -1, -2, -2, -1, -1, -1, -1, -1, -1 }; + +static const escp2_dot_size_t g2_dotsizes = +{ -2, -1, -2, -1, -2, -2, -2, -2, -1, -1, -1, -1, -1 }; + +static const escp2_dot_size_t sc600_dotsizes = +{ 4, -1, 4, -1, -1, 3, 2, 2, -1, 1, -1, -1, -1 }; + +static const escp2_dot_size_t g3_dotsizes = +{ 3, -1, 3, -1, -1, 2, 1, 1, -1, 4, -1, -1, -1 }; + +static const escp2_dot_size_t photo_dotsizes = +{ 3, -1, 3, -1, -1, 2, -1, 1, -1, 4, -1, -1, -1 }; + +static const escp2_dot_size_t sc440_dotsizes = +{ 3, -1, 3, -1, -1, 2, -1, 1, -1, -1, -1, -1, -1 }; + +static const escp2_dot_size_t sc640_dotsizes = +{ 3, -1, 3, -1, -1, 2, 1, 1, -1, 1, -1, -1, -1 }; + +static const escp2_dot_size_t c6pl_dotsizes = +{ -1, 0x10, -1, 0x10, -1, 0x10, -1, 0x10, -1, 0x10, -1, -1, -1 }; + +static const escp2_dot_size_t c3pl_dotsizes = +{ -1, 0x11, -1, 0x11, -1, 0x11, -1, 0x10, -1, 0x10, -1, 0x10, 0x10 }; + +static const escp2_dot_size_t c4pl_dotsizes = +{ -1, 0x12, -1, 0x12, -1, 0x12, -1, 0x11, -1, 0x10, -1, 0x10, 0x10 }; + +static const escp2_dot_size_t sc720_dotsizes = +{ -1, 0x12, -1, 0x12, -1, 0x11, -1, 0x11, -1, 0x11, -1, -1, -1 }; + +static const escp2_dot_size_t sc660_dotsizes = +{ -1, 3, 3, -1, 3, 0, -1, 0, -1, 0, -1, -1, -1 }; + +static const escp2_dot_size_t sc480_dotsizes = +{ -1, 0x13, -1, 0x13, -1, 0x13, -1, 0x10, -1, 0x10, -1, -1, -1 }; + +static const escp2_dot_size_t sc670_dotsizes = +{ -1, 0x12, -1, 0x12, -1, 0x12, -1, 0x11, -1, 0x11, -1, -1, -1 }; + +static const escp2_dot_size_t sp2000_dotsizes = +{ -1, 0x11, -1, 0x11, -1, 0x11, -1, 0x10, -1, 0x10, -1, -1, -1 }; + +static const escp2_dot_size_t spro_dotsizes = +{ 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, -1, -1 }; + +static const escp2_dot_size_t spro10000_dotsizes = +{ 4, -1, 0x11, -1, 0x11, -1, 0x10, -1, 0x10, -1, -1, -1, -1 }; + +static const escp2_dot_size_t c3pl_pigment_dotsizes = +{ -1, 0x10, -1, 0x10, -1, 0x10, -1, 0x11, -1, 0x12, -1, 0x12, 0x12 }; + +/* + * Densities are for: + * + * 0: 120/180 DPI micro + * 1: 120/180 DPI soft + * 2: 360 micro + * 3: 360 soft + * 4: 720x360 micro + * 5: 720x360 soft + * 6: 720 micro + * 7: 720 soft + * 8: 1440x720 micro + * 9: 1440x720 soft + * 10: 2880x720 micro + * 11: 2880x720 soft + * 12: 2880x1440 + */ + +/* 0 1 2 3 4 5 6 7 8 9 10 11 12 */ + +static const escp2_densities_t g1_densities = +{ 2.0, 2.0, 1.3, 1.3, 1.3, 1.3, 0.568, 0.568, 0.0, 0.0, 0.0, 0.0, 0.0 }; + +static const escp2_densities_t sc1500_densities = +{ 2.0, 2.0, 1.3, 1.3, 1.3, 1.3, 0.631, 0.631, 0.0, 0.0, 0.0, 0.0, 0.0 }; + +static const escp2_densities_t g3_densities = +{ 2.0, 2.0, 1.3, 1.3, 1.3, 1.3, 0.775, 0.775, 0.55, 0.55, 0.275, 0.275, 0.138 }; + +static const escp2_densities_t sc440_densities = +{ 3.0, 3.0, 2.0, 2.0, 1.0, 1.0, 0.900, 0.900, 0.45, 0.45, 0.45, 0.45, 0.113 }; + +static const escp2_densities_t sc480_densities = +{ 2.0, 2.0, 0.0, 1.4, 0.0, 0.7, 0.0, 0.710, 0.0, 0.710, 0.0, 0.355, 0.0 }; + +static const escp2_densities_t sc980_densities = +{ 2.0, 2.0, 1.3, 1.3, 0.65, 0.65, 0.646, 0.511, 0.49, 0.49, 0.637, 0.637, 0.455 }; + +static const escp2_densities_t c6pl_densities = +{ 2.0, 2.0, 1.3, 2.0, 0.65, 1.0, 0.646, 0.568, 0.323, 0.568, 0.284, 0.284, 0.142 }; + +static const escp2_densities_t c3pl_densities = +{ 2.0, 2.0, 1.3, 1.3, 0.65, 0.65, 0.646, 0.73, 0.7, 0.7, 0.91, 0.91, 0.455 }; + +static const escp2_densities_t c4pl_densities = +{ 2.0, 2.0, 1.3, 1.3, 0.65, 0.65, 0.431, 0.568, 0.784, 0.784, 0.593, 0.593, 0.297 }; + +static const escp2_densities_t sc660_densities = +{ 3.0, 3.0, 2.0, 2.0, 1.0, 1.0, 0.646, 0.646, 0.323, 0.323, 0.162, 0.162, 0.081 }; + +static const escp2_densities_t sp2000_densities = +{ 2.0, 2.0, 1.3, 1.3, 0.65, 0.65, 0.775, 0.852, 0.388, 0.438, 0.219, 0.219, 0.110 }; + +static const escp2_densities_t spro_densities = +{ 2.0, 2.0, 1.3, 1.3, 0.65, 0.65, 0.646, 0.646, 0.323, 0.323, 0.162, 0.162, 0.081 }; + +static const escp2_densities_t spro10000_densities = +{ 2.0, 2.0, 1.3, 1.3, 0.65, 0.65, 0.431, 0.710, 0.216, 0.784, 0.392, 0.392, 0.196 }; + +static const escp2_densities_t c3pl_pigment_densities = +{ 2.0, 2.0, 1.3, 1.3, 0.69, 0.69, 0.511, 0.511, 0.765, 0.765, 0.585, 0.585, 0.293 }; + +/* + For each printhead (=color), the offset in escp2_base_separation (1/360") + units is defined here. + */ + +static const int default_head_offset[] = +{0, 0, 0, 0, 0, 0, 0}; + +static const int x80_head_offset[] = +{48, 48, 96, 0, 0, 0, 0}; + +static const int c80_head_offset[] = +{0, 120, 0, 240, 0, 0, 0}; + + +typedef struct escp2_printer +{ + model_cap_t flags; /* Bitmask of flags, see below */ +/*****************************************************************************/ + int nozzles; /* Number of nozzles per color */ + int min_nozzles; /* Minimum number of nozzles per color */ + int nozzle_separation; /* Separation between rows, in 1/360" */ + int black_nozzles; /* Number of black nozzles (may be extra) */ + int min_black_nozzles; /* # of black nozzles (may be extra) */ + int black_nozzle_separation; /* Separation between rows */ +/*****************************************************************************/ + int xres; /* Normal distance between dots in */ + /* softweave mode (inverse inches) */ + int enhanced_xres; /* Distance between dots in highest */ + /* quality modes */ + int base_separation; /* Basic unit of row separation */ + int base_resolution; /* Base hardware spacing (above this */ + /* always requires multiple passes) */ + int enhanced_resolution;/* Above this we use the */ + /* enhanced_xres rather than xres */ + int resolution_scale; /* Scaling factor for ESC(D command */ + int max_black_resolution; /* Above this resolution, we */ + /* must use color parameters */ + /* rather than (faster) black */ + /* only parameters*/ + int max_hres; + int max_vres; + int min_hres; + int min_vres; +/*****************************************************************************/ + int max_paper_width; /* Maximum paper width, in points */ + int max_paper_height; /* Maximum paper height, in points */ + int min_paper_width; /* Maximum paper width, in points */ + int min_paper_height; /* Maximum paper height, in points */ + /* Softweave: */ + int left_margin; /* Left margin, points */ + int right_margin; /* Right margin, points */ + int top_margin; /* Absolute top margin, points */ + int bottom_margin; /* Absolute bottom margin, points */ + /* "Micro"weave: */ + int m_left_margin; /* Left margin, points */ + int m_right_margin; /* Right margin, points */ + int m_top_margin; /* Absolute top margin, points */ + int m_bottom_margin; /* Absolute bottom margin, points */ +/*****************************************************************************/ + int extra_feed; /* Extra distance the paper can be spaced */ + /* beyond the bottom margin, in 1/360". */ + /* (maximum useful value is */ + /* nozzles * nozzle_separation) */ + int separation_rows; /* Some printers require funky spacing */ + /* arguments in microweave mode. */ + int pseudo_separation_rows;/* Some printers require funky */ + /* spacing arguments in softweave mode */ + + int zero_margin_offset; /* Offset to use to achieve */ + /* zero-margin printing */ +/*****************************************************************************/ + /* The stylus 480 and 580 have an unusual arrangement of + color jets that need special handling */ + const int *head_offset; + int initial_vertical_offset; + int black_initial_vertical_offset; + +/*****************************************************************************/ + const int *dot_sizes; /* Vector of dot sizes for resolutions */ + const double *densities; /* List of densities for each printer */ + const escp2_variable_inklist_t *inks; /* Choices of inks for this printer */ +/*****************************************************************************/ + const double *lum_adjustment; + const double *hue_adjustment; + const double *sat_adjustment; + const paperlist_t *paperlist; +} escp2_stp_printer_t; + +typedef struct escp2_printer_attribute +{ + const char *attr_name; + int shift; + int bits; +} escp2_printer_attr_t; + +#define MODEL_INIT_MASK 0xful /* Is a special init sequence */ +#define MODEL_INIT_STANDARD 0x0ul /* required for this printer, and if */ +#define MODEL_INIT_NEW 0x1ul /* so, what */ + +#define MODEL_HASBLACK_MASK 0x10ul /* Can this printer print black ink */ +#define MODEL_HASBLACK_YES 0x00ul /* when it is also printing color? */ +#define MODEL_HASBLACK_NO 0x10ul + +#define MODEL_COLOR_MASK 0x60ul /* Is this a 6-color printer? */ +#define MODEL_COLOR_4 0x00ul +#define MODEL_COLOR_6 0x20ul +#define MODEL_COLOR_7 0x40ul + +#define MODEL_GRAYMODE_MASK 0x80ul /* Does this printer support special */ +#define MODEL_GRAYMODE_NO 0x00ul /* fast black printing? */ +#define MODEL_GRAYMODE_YES 0x80ul + +#define MODEL_720DPI_MODE_MASK 0x300ul /* Does this printer require old */ +#define MODEL_720DPI_DEFAULT 0x000ul /* or new setting for printing */ +#define MODEL_720DPI_600 0x100ul /* 720 dpi? Only matters for */ + /* single dot size printers */ + +#define MODEL_VARIABLE_DOT_MASK 0xc00ul /* Does this printer support var */ +#define MODEL_VARIABLE_NORMAL 0x000ul /* dot size printing? The newest */ +#define MODEL_VARIABLE_4 0x400ul /* printers support multiple modes */ +#define MODEL_VARIABLE_MULTI 0x800ul /* of variable dot sizes. */ + +#define MODEL_COMMAND_MASK 0xf000ul /* What general command set does */ +#define MODEL_COMMAND_1998 0x0000ul +#define MODEL_COMMAND_1999 0x1000ul /* The 1999 series printers */ +#define MODEL_COMMAND_2000 0x2000ul /* The 2000 series printers */ +#define MODEL_COMMAND_PRO 0x3000ul /* Stylus Pro printers */ + +#define MODEL_INK_MASK 0x10000ul /* Does this printer support */ +#define MODEL_INK_NORMAL 0x00000ul /* different types of inks? */ +#define MODEL_INK_SELECTABLE 0x10000ul /* Only the Stylus Pro's do */ + +#define MODEL_ROLLFEED_MASK 0x20000ul /* Does this printer support */ +#define MODEL_ROLLFEED_NO 0x00000ul /* a roll feed? */ +#define MODEL_ROLLFEED_YES 0x20000ul + +#define MODEL_XZEROMARGIN_MASK 0x40000ul /* Does this printer support */ +#define MODEL_XZEROMARGIN_NO 0x00000ul /* zero margin mode? */ +#define MODEL_XZEROMARGIN_YES 0x40000ul /* (print to the edge of the paper) */ + +#define MODEL_YZEROMARGIN_MASK 0x80000ul /* Does this printer support */ +#define MODEL_YZEROMARGIN_NO 0x00000ul /* zero margin mode? */ +#define MODEL_YZEROMARGIN_YES 0x80000ul /* (print to the edge of the paper) */ + +#define MODEL_MICROWEAVE_MASK 0x700000ul +#define MODEL_MICROWEAVE_NO 0x000000ul +#define MODEL_MICROWEAVE_YES 0x100000ul +#define MODEL_MICROWEAVE_ENHANCED 0x200000ul + +#define MODEL_VACUUM_MASK 0x800000ul +#define MODEL_VACUUM_NO 0x000000ul +#define MODEL_VACUUM_YES 0x800000ul + +#define MODEL_MICROWEAVE_EXCEPTION_MASK 0x3000000ul +#define MODEL_MICROWEAVE_EXCEPTION_NORMAL 0x0000000ul +#define MODEL_MICROWEAVE_EXCEPTION_360 0x1000000ul +#define MODEL_MICROWEAVE_EXCEPTION_BLACK 0x2000000ul + +#define MODEL_INIT (0) +#define MODEL_HASBLACK (1) +#define MODEL_COLOR (2) +#define MODEL_GRAYMODE (3) +#define MODEL_720DPI_MODE (4) +#define MODEL_VARIABLE_DOT (5) +#define MODEL_COMMAND (6) +#define MODEL_INK (7) +#define MODEL_ROLLFEED (8) +#define MODEL_XZEROMARGIN (9) +#define MODEL_YZEROMARGIN (10) +#define MODEL_MICROWEAVE (11) +#define MODEL_VACUUM (12) +#define MODEL_MICROWEAVE_EXCEPTION (13) +#define MODEL_LIMIT (14) + +static const escp2_printer_attr_t escp2_printer_attrs[] = +{ + { "init_sequence", 0, 4 }, + { "has_black", 4, 1 }, + { "color", 5, 2 }, + { "graymode", 7, 1 }, + { "720dpi_mode", 8, 2 }, + { "variable_mode", 10, 2 }, + { "command_mode", 12, 4 }, + { "ink_types", 16, 1 }, + { "rollfeed", 17, 1 }, + { "horizontal_zero_margin", 18, 1 }, + { "vertical_zero_margin", 19, 1 }, + { "microweave", 20, 3 }, + { "vacuum", 23, 1 }, + { "microweave_exception", 24, 2 }, +}; + +#define INCH(x) (72 * x) + +static const escp2_stp_printer_t model_capabilities[] = +{ + /* FIRST GENERATION PRINTERS */ + /* 0: Stylus Color */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_1998 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 15, 1, 4, 15, 1, 4, + 720, 720, 360, 720, 720, 14400, -1, 720, 720, 90, 90, + INCH(17 / 2), INCH(44), INCH(2), INCH(4), 14, 14, 9, 49, 14, 14, 9, 49, + 0, 1, 0, 0, default_head_offset, 0, 0, + g1_dotsizes, g1_densities, &simple_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 1: Stylus Color 400/500 */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 48, 1, 3, 48, 1, 3, + 720, 720, 360, 720, 720, 14400, -1, 720, 720, 90, 90, + INCH(17 / 2), INCH(44), INCH(2), INCH(4), 14, 14, 0, 40, 14, 14, 0, 40, + 0, 1, 0, 0, default_head_offset, 0, 0, + g2_dotsizes, g1_densities, &simple_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 2: Stylus Color 1500 */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_NO | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 1, 1, 1, 1, 1, 1, + 720, 720, 360, 720, 720, 14400, -1, 720, 720, 90, 90, + INCH(17), INCH(44), INCH(2), INCH(4), 14, 14, 9, 49, 14, 14, 9, 49, + 0, 1, 0, 0, default_head_offset, 0, 0, + g1_dotsizes, sc1500_densities, &simple_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 3: Stylus Color 600 */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_600 | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 32, 1, 4, 32, 1, 4, + 720, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(17 / 2), INCH(44), INCH(2), INCH(4), 8, 9, 0, 30, 8, 9, 0, 30, + 0, 1, 0, 0, default_head_offset, 0, 0, + sc600_dotsizes, g3_densities, &simple_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 4: Stylus Color 800 */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 64, 1, 2, 64, 1, 2, + 720, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(17 / 2), INCH(44), INCH(2), INCH(4), 8, 9, 9, 40, 8, 9, 9, 40, + 0, 1, 4, 0, default_head_offset, 0, 0, + g3_dotsizes, g3_densities, &simple_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 5: Stylus Color 850 */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 64, 1, 2, 128, 1, 1, + 720, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(17 / 2), INCH(44), INCH(2), INCH(4), 9, 9, 9, 40, 9, 9, 9, 40, + 0, 1, 4, 0, default_head_offset, 0, 0, + g3_dotsizes, g3_densities, &simple_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 6: Stylus Color 1520 */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 64, 1, 2, 64, 1, 2, + 720, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(17), INCH(44), INCH(2), INCH(4), 8, 9, 9, 40, 8, 9, 9, 40, + 0, 1, 4, 0, default_head_offset, 0, 0, + g3_dotsizes, g3_densities, &simple_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + + /* SECOND GENERATION PRINTERS */ + /* 7: Stylus Photo 700 */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_6 | MODEL_720DPI_600 | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 32, 1, 4, 32, 1, 4, + 720, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(17 / 2), INCH(44), INCH(2), INCH(4), 9, 9, 0, 30, 9, 9, 0, 30, + 0, 1, 0, 0, default_head_offset, 0, 0, + photo_dotsizes, g3_densities, &simple_6color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 8: Stylus Photo EX */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_6 | MODEL_720DPI_600 | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 32, 1, 4, 32, 1, 4, + 720, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(118 / 10), INCH(44), INCH(2), INCH(4), 9, 9, 0, 30, 9, 9, 0, 30, + 0, 1, 0, 0, default_head_offset, 0, 0, + photo_dotsizes, g3_densities, &simple_6color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 9: Stylus Photo */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_6 | MODEL_720DPI_600 | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 32, 1, 4, 32, 1, 4, + 720, 360, 360, 720, 720, 14400, -1, 720, 720, 90, 90, + INCH(17 / 2), INCH(44), INCH(2), INCH(4), 9, 9, 0, 30, 9, 9, 0, 30, + 0, 1, 0, 0, default_head_offset, 0, 0, + photo_dotsizes, g3_densities, &simple_6color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + + /* THIRD GENERATION PRINTERS */ + /* 10: Stylus Color 440/460 */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_600 | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_1999 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_NO | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 21, 1, 4, 21, 1, 4, + 720, 720, 360, 720, 720, 14400, -1, 720, 720, 90, 90, + INCH(17 / 2), INCH(44), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + sc440_dotsizes, sc440_densities, &simple_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 11: Stylus Color 640 */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_600 | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_1999 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 32, 1, 4, 64, 1, 2, + 720, 720, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(17 / 2), INCH(44), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + sc640_dotsizes, sc440_densities, &simple_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 12: Stylus Color 740 */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_4 | + MODEL_COMMAND_1999 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 48, 1, 3, 144, 1, 1, + 360, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(17 / 2), INCH(44), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + c6pl_dotsizes, c6pl_densities, &variable_6pl_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 13: Stylus Color 900 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_4 | + MODEL_COMMAND_1999 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 96, 1, 2, 192, 1, 1, + 360, 180, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(17 / 2), INCH(44), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + c3pl_dotsizes, c3pl_densities, &variable_3pl_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 14: Stylus Photo 750 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_6 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_4 | + MODEL_COMMAND_1999 | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 48, 1, 3, 48, 1, 3, + 360, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(17 / 2), INCH(44), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + c6pl_dotsizes, c6pl_densities, &variable_6pl_6color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 15: Stylus Photo 1200 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_6 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_4 | + MODEL_COMMAND_1999 | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 48, 1, 3, 48, 1, 3, + 360, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(13), INCH(44), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + c6pl_dotsizes, c6pl_densities, &variable_6pl_6color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 16: Stylus Color 860 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_MULTI | + MODEL_COMMAND_1999 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 48, 1, 3, 144, 1, 1, + 360, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(17 / 2), INCH(44), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + c4pl_dotsizes, c4pl_densities, &variable_4pl_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 17: Stylus Color 1160 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_MULTI | + MODEL_COMMAND_1999 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 48, 1, 3, 144, 1, 1, + 360, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(13), INCH(44), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + c4pl_dotsizes, c4pl_densities, &variable_4pl_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 18: Stylus Color 660 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_600 | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 32, 1, 4, 32, 1, 4, + 720, 720, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(17 / 2), INCH(44), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 0, 26, + 0, 1, 8, 0, default_head_offset, 0, 0, + sc660_dotsizes,sc660_densities, &simple_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 19: Stylus Color 760 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_MULTI | + MODEL_COMMAND_1999 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 48, 1, 3, 144, 1, 1, + 360, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(17 / 2), INCH(44), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + c4pl_dotsizes, c4pl_densities, &variable_4pl_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 20: Stylus Photo 720 (Australia) */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_6 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_4 | + MODEL_COMMAND_1999 | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 32, 1, 4, 32, 1, 4, + 360, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(17 / 2), INCH(44), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + sc720_dotsizes, c6pl_densities, &variable_6pl_6color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 21: Stylus Color 480 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_4 | + MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 15, 15, 3, 48, 48, 3, + 360, 360, 360, 720, 720, 14400, 360, 720, 720, 90, 90, + INCH(17 / 2), INCH(1200), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, x80_head_offset, -99, 0, + sc480_dotsizes, sc480_densities, &variable_x80_6pl_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 22: Stylus Photo 870 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_6 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_MULTI | + MODEL_COMMAND_2000 | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_YES | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 48, 1, 3, 48, 1, 3, + 360, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(17 / 2), INCH(1200), INCH(2), INCH(4), 0, 0, 0, 9, 0, 0, 0, 9, + 0, 1, 0, 97, default_head_offset, 0, 0, + c4pl_dotsizes, c4pl_densities, &variable_4pl_6color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 23: Stylus Photo 1270 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_6 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_MULTI | + MODEL_COMMAND_2000 | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_YES | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 48, 1, 3, 48, 1, 3, + 360, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(13), INCH(1200), INCH(2), INCH(4), 0, 0, 0, 9, 0, 0, 0, 9, + 0, 1, 0, 97, default_head_offset, 0, 0, + c4pl_dotsizes, c4pl_densities, &variable_4pl_6color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 24: Stylus Color 3000 */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_1998 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 64, 1, 2, 128, 1, 1, + 720, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(17), INCH(44), INCH(2), INCH(4), 8, 9, 9, 40, 8, 9, 9, 40, + 0, 1, 4, 0, default_head_offset, 0, 0, + g3_dotsizes, g3_densities, &simple_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 25: Stylus Color 670 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_MULTI | + MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 32, 1, 4, 64, 1, 2, + 360, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(17 / 2), INCH(1200), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + sc670_dotsizes, c6pl_densities, &variable_6pl_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 26: Stylus Photo 2000P */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_6 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_4 | + MODEL_COMMAND_2000 | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 48, 1, 3, 144, 1, 1, + 360, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(13), INCH(1200), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + sp2000_dotsizes, sp2000_densities, &variable_pigment_6color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 27: Stylus Pro 5000 */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_6 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_PRO | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_ENHANCED | + MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 1, 1, 1, 1, 1, 1, + 1440, 1440, 360, 1440, 1440, 14400, -1, 1440, 720, 90, 90, + INCH(13), INCH(1200), INCH(11), INCH(17), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + spro_dotsizes, spro_densities, &simple_6color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 28: Stylus Pro 7000 */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_6 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_PRO | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_ENHANCED | + MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 1, 1, 1, 1, 1, 1, + 1440, 1440, 360, 1440, 1440, 14400, -1, 1440, 720, 90, 90, + INCH(24), INCH(1200), INCH(11), INCH(17), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + spro_dotsizes, spro_densities, &simple_6color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 29: Stylus Pro 7500 */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_SELECTABLE | + MODEL_COLOR_6 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_PRO | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_ENHANCED | + MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_YES | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 1, 1, 1, 1, 1, 1, + 1440, 1440, 360, 1440, 1440, 14400, -1, 1440, 720, 90, 90, + INCH(24), INCH(1200), INCH(11), INCH(17), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + spro_dotsizes, spro_densities, &simple_6color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 30: Stylus Pro 9000 */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_6 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_PRO | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_ENHANCED | + MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 1, 1, 1, 1, 1, 1, + 1440, 1440, 360, 1440, 1440, 14400, -1, 1440, 720, 90, 90, + INCH(44), INCH(1200), INCH(11), INCH(17), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + spro_dotsizes, spro_densities, &simple_6color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 31: Stylus Pro 9500 */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_SELECTABLE | + MODEL_COLOR_6 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_PRO | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_ENHANCED | + MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_YES | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 1, 1, 1, 1, 1, 1, + 1440, 1440, 360, 1440, 1440, 14400, -1, 1440, 720, 90, 90, + INCH(44), INCH(1200), INCH(11), INCH(17), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + spro_dotsizes, spro_densities, &simple_6color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 32: Stylus Color 777/680 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_MULTI | + MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 48, 1, 3, 144, 1, 1, + 360, 360, 360, 720, 720, 14400, -1, 2880, 720, 90, 90, + INCH(17 / 2), INCH(1200), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 9, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + c4pl_dotsizes, c4pl_densities, &variable_4pl_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 33: Stylus Color 880/83/C60 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_MULTI | + MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 48, 1, 3, 144, 1, 1, + 360, 360, 360, 720, 720, 14400, -1, 2880, 720, 90, 90, + INCH(17 / 2), INCH(1200), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 9, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + c4pl_dotsizes, c4pl_densities, &variable_4pl_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 34: Stylus Color 980 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_4 | + MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 96, 1, 2, 192, 1, 1, + 360, 360, 360, 720, 720, 14400, -1, 2880, 720, 90, 90, + INCH(17 / 2), INCH(1200), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 9, 9, + 192, 1, 0, 0, default_head_offset, 0, 0, + c3pl_dotsizes, sc980_densities, &variable_3pl_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 35: Stylus Photo 780/790/785 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_6 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_MULTI | + MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_YES | MODEL_YZEROMARGIN_YES | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 48, 1, 3, 48, 1, 3, + 360, 360, 360, 720, 720, 14400, -1, 2880, 720, 90, 90, + INCH(17 / 2), INCH(1200), INCH(2), INCH(4), 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 55, default_head_offset, 0, 0, + c4pl_dotsizes, c4pl_densities, &variable_4pl_6color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 36: Stylus Photo 890/895 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_6 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_MULTI | + MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_YES | MODEL_YZEROMARGIN_YES | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 48, 1, 3, 48, 1, 3, + 360, 360, 360, 720, 720, 14400, -1, 2880, 720, 90, 90, + INCH(17 / 2), INCH(1200), INCH(2), INCH(4), 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 55, default_head_offset, 0, 0, + c4pl_dotsizes, c4pl_densities, &variable_4pl_6color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 37: Stylus Photo 1280/1290 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_6 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_MULTI | + MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_YES | MODEL_YZEROMARGIN_YES | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 48, 1, 3, 48, 1, 3, + 360, 360, 360, 720, 720, 14400, -1, 2880, 720, 90, 90, + INCH(13), INCH(1200), INCH(2), INCH(4), 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 55, default_head_offset, 0, 0, + c4pl_dotsizes, c4pl_densities, &variable_4pl_6color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 38: Stylus Color 580 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_4 | + MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 15, 15, 3, 48, 48, 3, + 360, 360, 360, 720, 720, 14400, 360, 1440, 720, 90, 90, + INCH(17 / 2), INCH(1200), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 9, 9, + 0, 1, 0, 0, x80_head_offset, -99, 0, + sc480_dotsizes, sc480_densities, &variable_x80_6pl_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 39: Stylus Color Pro XL */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_360), + 48, 1, 3, 48, 1, 3, + 720, 720, 360, 720, 720, 14400, -1, 720, 720, 90, 90, + INCH(13), INCH(1200), INCH(2), INCH(4), 14, 14, 0, 40, 14, 14, 0, 40, + 0, 1, 0, 0, default_head_offset, 0, 0, + g1_dotsizes, g1_densities, &simple_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 40: Stylus Pro 5500 */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_SELECTABLE | + MODEL_COLOR_6 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_PRO | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_ENHANCED | + MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_YES | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 1, 1, 1, 1, 1, 1, + 1440, 1440, 360, 1440, 1440, 14400, -1, 1440, 720, 90, 90, + INCH(13), INCH(1200), INCH(11), INCH(17), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + spro_dotsizes, spro_densities, &simple_6color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 41: Stylus Pro 10000 */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_SELECTABLE | + MODEL_COLOR_6 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_PRO | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_ENHANCED | + MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_YES | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 1, 1, 1, 1, 1, 1, + 1440, 1440, 360, 1440, 1440, 14400, -1, 1440, 720, 90, 90, + INCH(44), INCH(1200), INCH(11), INCH(17), 9, 9, 0, 9, 9, 9, 0, 9, + 0, 1, 0, 0, default_head_offset, 0, 0, + spro10000_dotsizes, spro10000_densities, &spro10000_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 42: Stylus C20SX/C20UX */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_4 | + MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 15, 15, 3, 48, 48, 3, + 360, 360, 360, 720, 720, 14400, -1, 720, 720, 90, 90, + INCH(17 / 2), INCH(1200), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 9, 9, + 0, 1, 0, 0, x80_head_offset, -99, 0, + sc480_dotsizes, sc480_densities, &variable_x80_6pl_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 43: Stylus C40SX/C40UX */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_4 | + MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 15, 15, 3, 48, 48, 3, + 360, 360, 360, 720, 720, 14400, -1, 1440, 720, 90, 90, + INCH(17 / 2), INCH(1200), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 9, 9, + 0, 1, 0, 0, x80_head_offset, -99, 0, + sc480_dotsizes, sc480_densities, &variable_x80_6pl_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, + /* 44: Stylus C80 */ + { + (MODEL_INIT_NEW | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_4 | + MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 60, 60, 2, 180, 180, 2, + 360, 360, 360, 720, 720, 14400, -1, 2880, 1440, 360, 180, + INCH(17 / 2), INCH(1200), INCH(2), INCH(4), 9, 9, 0, 9, 9, 9, 9, 9, + 0, 1, 0, 0, c80_head_offset, -240, 0, + c3pl_pigment_dotsizes, c3pl_pigment_densities, &variable_3pl_pigment_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &c80_paper_list + }, + /* 45: Stylus Color Pro */ + { + (MODEL_INIT_STANDARD | MODEL_HASBLACK_YES | MODEL_INK_NORMAL | + MODEL_COLOR_4 | MODEL_720DPI_DEFAULT | MODEL_VARIABLE_NORMAL | + MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO | MODEL_MICROWEAVE_YES | + MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_YZEROMARGIN_NO | + MODEL_VACUUM_NO | MODEL_MICROWEAVE_EXCEPTION_NORMAL), + 48, 1, 3, 48, 1, 3, + 720, 720, 360, 720, 720, 14400, -1, 720, 720, 90, 90, + INCH(17 / 2), INCH(44), INCH(2), INCH(4), 14, 14, 0, 40, 14, 14, 0, 40, + 0, 1, 0, 0, default_head_offset, 0, 0, + g1_dotsizes, g1_densities, &simple_4color_inks, + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment, + &standard_paper_list + }, +}; + +typedef struct +{ + const char *name; + const char *text; + int hres; + int vres; + int softweave; + int microweave; + int vertical_passes; + int vertical_oversample; + int unidirectional; + int vertical_undersample; + int vertical_denominator; + int resid; +} res_t; + +static const res_t *escp2_find_resolution(const char *resolution); + +typedef struct +{ + int undersample; + int initial_vertical_offset; + int min_nozzles; +} escp2_privdata_t; + +static const res_t escp2_reslist[] = +{ + { "360x90dpi", N_("360 x 90 DPI Fast Economy Draft"), + 360, 90, 0, 0, 1, 1, 0, 1, 1, RES_120_M }, + { "360x90sw", N_("360 x 90 DPI Fast Economy Draft"), + 360, 90, 1, 0, 1, 1, 0, 1, 1, RES_120 }, + + { "360x120dpi", N_("360 x 120 DPI Economy Draft"), + 360, 120, 0, 0, 1, 1, 0, 3, 1, RES_120_M }, + { "360x120sw", N_("360 x 120 DPI Economy Draft"), + 360, 120, 1, 0, 1, 1, 0, 3, 1, RES_120 }, + + { "180dpi", N_("180 DPI Economy Draft"), + 180, 180, 0, 0, 1, 1, 0, 1, 1, RES_180_M }, + { "180sw", N_("180 DPI Economy Draft"), + 180, 180, 1, 0, 1, 1, 0, 1, 1, RES_180 }, + + { "360x240dpi", N_("360 x 240 DPI Draft"), + 360, 240, 0, 0, 1, 1, 0, 3, 2, RES_180_M }, + { "360x240sw", N_("360 x 240 DPI Draft"), + 360, 240, 1, 0, 1, 1, 0, 3, 2, RES_180 }, + + { "360x180dpi", N_("360 x 180 DPI Draft"), + 360, 180, 0, 0, 1, 1, 0, 1, 1, RES_180_M }, + { "360x180sw", N_("360 x 180 DPI Draft"), + 360, 180, 1, 0, 1, 1, 0, 1, 1, RES_180 }, + + { "360sw", N_("360 DPI"), + 360, 360, 1, 0, 1, 1, 0, 1, 1, RES_360 }, + { "360swuni", N_("360 DPI Unidirectional"), + 360, 360, 1, 0, 1, 1, 1, 1, 1, RES_360 }, + { "360mw", N_("360 DPI Microweave"), + 360, 360, 0, 1, 1, 1, 0, 1, 1, RES_360_M }, + { "360mwuni", N_("360 DPI Microweave Unidirectional"), + 360, 360, 0, 1, 1, 1, 1, 1, 1, RES_360_M }, + { "360dpi", N_("360 DPI"), + 360, 360, 0, 0, 1, 1, 0, 1, 1, RES_360_M }, + { "360uni", N_("360 DPI Unidirectional"), + 360, 360, 0, 0, 1, 1, 1, 1, 1, RES_360_M }, + { "360fol", N_("360 DPI Full Overlap"), + 360, 360, 0, 2, 1, 1, 0, 1, 1, RES_360_M }, + { "360foluni", N_("360 DPI Full Overlap Unidirectional"), + 360, 360, 0, 2, 1, 1, 1, 1, 1, RES_360_M }, + { "360fol2", N_("360 DPI FOL2"), + 360, 360, 0, 4, 1, 1, 0, 1, 1, RES_360_M }, + { "360fol2uni", N_("360 DPI FOL2 Unidirectional"), + 360, 360, 0, 4, 1, 1, 1, 1, 1, RES_360_M }, + { "360mw2", N_("360 DPI MW2"), + 360, 360, 0, 5, 1, 1, 0, 1, 1, RES_360_M }, + { "360mw2uni", N_("360 DPI MW2 Unidirectional"), + 360, 360, 0, 5, 1, 1, 1, 1, 1, RES_360_M }, + + { "720x360sw", N_("720 x 360 DPI"), + 720, 360, 1, 0, 1, 1, 0, 2, 1, RES_720_360 }, + { "720x360swuni", N_("720 x 360 DPI Unidirectional"), + 720, 360, 1, 0, 1, 1, 1, 2, 1, RES_720_360 }, + { "720x360dpi", N_("720 x 360 DPI"), + 720, 360, 0, 48, 1, 1, 0, 2, 1, RES_720_360_M }, + { "720x360uni", N_("720 x 360 DPI Unidirectional"), + 720, 360, 0, 48, 1, 1, 1, 2, 1, RES_720_360_M }, + { "720x360mw", N_("720 x 360 DPI Microweave"), + 720, 360, 0, 49, 1, 1, 0, 2, 1, RES_720_360_M }, + { "720x360mwuni", N_("720 x 360 DPI Microweave Unidirectional"), + 720, 360, 0, 49, 1, 1, 1, 2, 1, RES_720_360_M }, + { "720x360fol", N_("720 x 360 DPI FOL"), + 720, 360, 0, 2, 1, 1, 0, 2, 1, RES_720_360_M }, + { "720x360foluni", N_("720 x 360 DPI FOL Unidirectional"), + 720, 360, 0, 2, 1, 1, 1, 2, 1, RES_720_360_M }, + { "720x360fol2", N_("720 x 360 DPI FOL2"), + 720, 360, 0, 4, 1, 1, 0, 2, 1, RES_720_360_M }, + { "720x360fol2uni", N_("720 x 360 DPI FOL2 Unidirectional"), + 720, 360, 0, 4, 1, 1, 1, 2, 1, RES_720_360_M }, + { "720x360mw2", N_("720 x 360 DPI MW2"), + 720, 360, 0, 5, 1, 1, 0, 2, 1, RES_720_360_M }, + { "720x360mw2uni", N_("720 x 360 DPI MW2 Unidirectional"), + 720, 360, 0, 5, 1, 1, 1, 2, 1, RES_720_360_M }, + + { "720dpi", N_("720 DPI"), + 720, 720, 1, 48, 1, 1, 0, 1, 1, RES_720_M }, + { "720uni", N_("720 DPI Unidirectional"), + 720, 720, 1, 48, 1, 1, 1, 1, 1, RES_720_M }, + { "720mw", N_("720 DPI Microweave"), + 720, 720, 0, 1, 1, 1, 0, 1, 1, RES_720_M }, + { "720mwuni", N_("720 DPI Microweave Unidirectional"), + 720, 720, 0, 1, 1, 1, 1, 1, 1, RES_720_M }, + { "720fol", N_("720 DPI Full Overlap"), + 720, 720, 0, 2, 1, 1, 0, 1, 1, RES_720_M }, + { "720foluni", N_("720 DPI Full Overlap Unidirectional"), + 720, 720, 0, 2, 1, 1, 1, 1, 1, RES_720_M }, + { "720fourp", N_("720 DPI Four Pass"), + 720, 720, 0, 3, 1, 1, 0, 1, 1, RES_720_M }, + { "720fourpuni", N_("720 DPI Four Pass Unidirectional"), + 720, 720, 0, 3, 1, 1, 1, 1, 1, RES_720_M }, + { "720sw", N_("720 DPI"), + 720, 720, 1, 0, 1, 1, 0, 1, 1, RES_720 }, + { "720swuni", N_("720 DPI Unidirectional"), + 720, 720, 1, 0, 1, 1, 1, 1, 1, RES_720 }, + { "720hq", N_("720 DPI High Quality"), + 720, 720, 1, 0, 2, 1, 0, 1, 1, RES_720 }, + { "720hquni", N_("720 DPI High Quality Unidirectional"), + 720, 720, 1, 0, 2, 1, 1, 1, 1, RES_720 }, + { "720hq2", N_("720 DPI Highest Quality"), + 720, 720, 1, 0, 4, 1, 1, 1, 1, RES_720 }, + + { "1440x720dpi", N_("1440 x 720 DPI"), + 1440, 720, 1, 48, 1, 1, 0, 1, 1, RES_1440_720_M }, + { "1440x720uni", N_("1440 x 720 DPI Unidirectional"), + 1440, 720, 1, 48, 1, 1, 1, 1, 1, RES_1440_720_M }, + { "1440x720mw", N_("1440 x 720 DPI Microweave"), + 1440, 720, 0, 1, 1, 1, 0, 1, 1, RES_1440_720_M }, + { "1440x720mwuni", N_("1440 x 720 DPI Microweave Unidirectional"), + 1440, 720, 0, 1, 1, 1, 1, 1, 1, RES_1440_720_M }, + { "1440x720fol", N_("1440 x 720 DPI FOL"), + 1440, 720, 0, 2, 1, 1, 0, 1, 1, RES_1440_720_M }, + { "1440x720foluni", N_("1440 x 720 DPI FOL Unidirectional"), + 1440, 720, 0, 2, 1, 1, 1, 1, 1, RES_1440_720_M }, + { "1440x720fourp", N_("1440 x 720 DPI Four Pass"), + 1440, 720, 0, 3, 1, 1, 0, 1, 1, RES_1440_720_M }, + { "1440x720fourpuni", N_("1440 x 720 DPI Four Pass Unidirectional"), + 1440, 720, 0, 3, 1, 1, 1, 1, 1, RES_1440_720_M }, + { "1440x720sw", N_("1440 x 720 DPI"), + 1440, 720, 1, 0, 1, 1, 0, 1, 1, RES_1440_720 }, + { "1440x720swuni", N_("1440 x 720 DPI Unidirectional"), + 1440, 720, 1, 0, 1, 1, 1, 1, 1, RES_1440_720 }, + { "1440x720hq2", N_("1440 x 720 DPI Highest Quality"), + 1440, 720, 1, 0, 2, 1, 1, 1, 1, RES_1440_720 }, + + { "2880x720sw", N_("2880 x 720 DPI"), + 2880, 720, 1, 0, 1, 1, 0, 1, 1, RES_2880_720}, + { "2880x720swuni", N_("2880 x 720 DPI Unidirectional"), + 2880, 720, 1, 0, 1, 1, 1, 1, 1, RES_2880_720}, + + /* + * Nothing thus far supports 1440 DPI vertical resolution + */ + { "1440x1440sw", N_("1440 x 1440 DPI"), + 1440, 1440, 1, 0, 1, 1, 1, 1, 1, RES_1440_1440}, + { "1440x1440hq2", N_("1440 x 1440 DPI Highest Quality"), + 1440, 1440, 1, 0, 2, 1, 1, 1, 1, RES_1440_1440}, + + { "2880x1440sw", N_("2880 x 1440 DPI"), + 2880, 1440, 1, 0, 1, 1, 1, 1, 1, RES_2880_1440}, +#ifdef HAVE_MAINTAINER_MODE + /* + * These resolutions have no practical use; they're neither as good as + * nor any faster than 720x720 DPI. They exist to permit testing + * 2880x720 (4:1 aspect) on 1440x720 printers. + */ + { "1440x360sw", N_("1440 x 360 DPI"), + 1440, 360, 1, 0, 1, 1, 0, 1, 1, RES_720 }, + { "1440x360swuni", N_("1440 x 360 DPI Unidirectional"), + 1440, 360, 1, 0, 1, 1, 1, 1, 1, RES_720 }, + { "1440x360hq", N_("1440 x 360 DPI High Quality"), + 1440, 360, 1, 0, 2, 1, 0, 1, 1, RES_720 }, + { "1440x360hquni", N_("1440 x 360 DPI High Quality Uni"), + 1440, 360, 1, 0, 2, 1, 1, 1, 1, RES_720 }, + { "1440x360hq2", N_("1440 x 360 DPI Highest Quality"), + 1440, 360, 1, 0, 4, 1, 1, 1, 1, RES_720 }, +#endif + { "", "", 0, 0, 0, 0, 0, 0, 1, -1 } +}; + +typedef struct +{ + const char *name; + const char *text; + int hasblack; + int ncolors; +} escp2_inkname_t; + +static const escp2_inkname_t ink_types[] = +{ + { "Photo7", N_ ("Seven Color Enhanced"), 1, 7 }, + { "PhotoEnhance", N_ ("Six Color Enhanced Composite"), 0, 7 }, + { "PhotoCMYK", N_ ("Six Color Photo"), 1, 6 }, + { "PhotoCMY", N_ ("Five Color Photo Composite"), 0, 6 }, + { "CMYK", N_ ("Four Color Standard"), 1, 4 }, + { "RGB", N_ ("Three Color Composite"), 0, 4 } +}; + +static const int escp2_ninktypes = sizeof(ink_types) / sizeof(escp2_inkname_t); + +typedef struct escp2_init +{ + int model; + int output_type; + int ydpi; + int xdpi; + int use_softweave; + int use_microweave; + int page_height; + int page_width; + int page_top; + int page_bottom; + int nozzles; + int nozzle_separation; + int horizontal_passes; + int vertical_passes; + int vertical_oversample; + int bits; + int unidirectional; + int resid; + int initial_vertical_offset; + const char *paper_type; + const char *media_source; + stp_vars_t v; +} escp2_init_t; + + +static int +escp2_has_cap(int model, int feature, + model_featureset_t class, const stp_vars_t v) +{ + if (feature < 0 || feature >= MODEL_LIMIT) + return -1; + else + { + model_featureset_t featureset = + (((1ul << escp2_printer_attrs[feature].bits) - 1ul) << + escp2_printer_attrs[feature].shift); + return ((model_capabilities[model].flags & featureset) == class); + } +} + +#define DEF_SIMPLE_ACCESSOR(f, t) \ +static t \ +escp2_##f(int model, const stp_vars_t v) \ +{ \ + return (model_capabilities[model].f); \ +} + +#define DEF_MICROWEAVE_ACCESSOR(f, t) \ +static t \ +escp2_##f(int model, const stp_vars_t v) \ +{ \ + const res_t *res = escp2_find_resolution(stp_get_resolution(v)); \ + if (res && !(res->softweave)) \ + return (model_capabilities[model].m_##f); \ + else \ + return (model_capabilities[model].f); \ +} + +DEF_SIMPLE_ACCESSOR(max_hres, int) +DEF_SIMPLE_ACCESSOR(max_vres, int) +DEF_SIMPLE_ACCESSOR(min_hres, int) +DEF_SIMPLE_ACCESSOR(min_vres, int) +DEF_SIMPLE_ACCESSOR(nozzles, unsigned) +DEF_SIMPLE_ACCESSOR(black_nozzles, unsigned) +DEF_SIMPLE_ACCESSOR(min_nozzles, unsigned) +DEF_SIMPLE_ACCESSOR(min_black_nozzles, unsigned) +DEF_SIMPLE_ACCESSOR(nozzle_separation, unsigned) +DEF_SIMPLE_ACCESSOR(black_nozzle_separation, unsigned) +DEF_SIMPLE_ACCESSOR(separation_rows, unsigned) +DEF_SIMPLE_ACCESSOR(xres, unsigned) +DEF_SIMPLE_ACCESSOR(enhanced_xres, unsigned) +DEF_SIMPLE_ACCESSOR(max_paper_width, unsigned) +DEF_SIMPLE_ACCESSOR(max_paper_height, unsigned) +DEF_SIMPLE_ACCESSOR(min_paper_width, unsigned) +DEF_SIMPLE_ACCESSOR(min_paper_height, unsigned) +DEF_SIMPLE_ACCESSOR(extra_feed, unsigned) +DEF_SIMPLE_ACCESSOR(pseudo_separation_rows, int) +DEF_SIMPLE_ACCESSOR(base_separation, int) +DEF_SIMPLE_ACCESSOR(base_resolution, int) +DEF_SIMPLE_ACCESSOR(enhanced_resolution, int) +DEF_SIMPLE_ACCESSOR(resolution_scale, int) +DEF_SIMPLE_ACCESSOR(lum_adjustment, const double *) +DEF_SIMPLE_ACCESSOR(hue_adjustment, const double *) +DEF_SIMPLE_ACCESSOR(sat_adjustment, const double *) +DEF_SIMPLE_ACCESSOR(head_offset, const int *) +DEF_SIMPLE_ACCESSOR(initial_vertical_offset, int) +DEF_SIMPLE_ACCESSOR(black_initial_vertical_offset, int) +DEF_SIMPLE_ACCESSOR(max_black_resolution, int) +DEF_SIMPLE_ACCESSOR(zero_margin_offset, int) +DEF_SIMPLE_ACCESSOR(paperlist, const paperlist_t *) + +DEF_MICROWEAVE_ACCESSOR(left_margin, unsigned) +DEF_MICROWEAVE_ACCESSOR(right_margin, unsigned) +DEF_MICROWEAVE_ACCESSOR(top_margin, unsigned) +DEF_MICROWEAVE_ACCESSOR(bottom_margin, unsigned) + +static int +escp2_ink_type(int model, int resid, const stp_vars_t v) +{ + int dotid = resid2dotid(resid); + return model_capabilities[model].dot_sizes[dotid]; +} + +static double +escp2_density(int model, int resid, const stp_vars_t v) +{ + int densid = resid2densid(resid); + return model_capabilities[model].densities[densid]; +} + +static const escp2_variable_inkset_t * +escp2_inks(int model, int resid, int colors, int bits, const stp_vars_t v) +{ + const escp2_variable_inklist_t *inks = model_capabilities[model].inks; + int inktype = bits2inktype(bits); + int inkset = colors2inkset(colors); + resid /= 2; + return (*inks)[inktype][inkset][resid]; +} + +static const paper_t * +get_media_type(int model, const char *name, const stp_vars_t v) +{ + int i; + const paperlist_t *p = escp2_paperlist(model, v); + int paper_type_count = p->paper_count; + for (i = 0; i < paper_type_count; i++) + { + if (!strcmp(name, p->papers[i].name)) + return &(p->papers[i]); + } + return NULL; +} + +static int +escp2_has_advanced_command_set(int model, const stp_vars_t v) +{ + return (escp2_has_cap(model, MODEL_COMMAND, MODEL_COMMAND_PRO,v) || + escp2_has_cap(model, MODEL_COMMAND, MODEL_COMMAND_1999,v) || + escp2_has_cap(model, MODEL_COMMAND, MODEL_COMMAND_2000,v)); +} + +static void * +xzmalloc(size_t bytes) +{ + void *retval = stp_malloc(bytes); + if (retval) + memset(retval, 0, bytes); + return (retval); +} + +static char * +c_strdup(const char *s) +{ + char *ret = stp_malloc(strlen(s) + 1); + strcpy(ret, s); + return ret; +} + +static int +verify_resolution(const res_t *res, + int model, + const stp_vars_t v) +{ + int nozzle_width = + (escp2_base_separation(model, v) / escp2_nozzle_separation(model, v)); + int nozzles = escp2_nozzles(model, v); + if (escp2_ink_type(model, res->resid, v) != -1 && + res->vres <= escp2_max_vres(model, v) && + res->hres <= escp2_max_hres(model, v) && + res->vres >= escp2_min_vres(model, v) && + res->hres >= escp2_min_hres(model, v) && + (res->microweave == 0 || + !escp2_has_cap(model, MODEL_MICROWEAVE, + MODEL_MICROWEAVE_NO, v)) && + (res->microweave <= 1 || + escp2_has_cap(model, MODEL_MICROWEAVE, + MODEL_MICROWEAVE_ENHANCED, v)) && + (nozzles == 1 || + ((res->vres / nozzle_width) * nozzle_width) == res->vres)) + { + int xdpi = res->hres; + int physical_xdpi = + xdpi > escp2_enhanced_resolution(model, v) ? + escp2_enhanced_xres(model, v) : + escp2_xres(model, v); + int horizontal_passes = xdpi / physical_xdpi; + int oversample = horizontal_passes * res->vertical_passes + * res->vertical_oversample; + if (horizontal_passes < 1) + horizontal_passes = 1; + if (oversample < 1) + oversample = 1; + if (((horizontal_passes * res->vertical_passes) <= 8) && + (! res->softweave || (nozzles > 1 && nozzles > oversample))) + return 1; + } + return 0; +} + + +/* + * 'escp2_parameters()' - Return the parameter values for the given parameter. + */ + +static stp_param_t * /* O - Parameter values */ +escp2_parameters(const stp_printer_t printer, /* I - Printer model */ + const char *ppd_file, /* I - PPD file (not used) */ + const char *name, /* I - Name of parameter */ + int *count) /* O - Number of values */ +{ + int i; + stp_param_t *valptrs; + int model = stp_printer_get_model(printer); + const stp_vars_t v = stp_printer_get_printvars(printer); + + if (count == NULL) + return (NULL); + + *count = 0; + + if (name == NULL) + return (NULL); + + if (strcmp(name, "PageSize") == 0) + { + unsigned int height_limit, width_limit; + unsigned int min_height_limit, min_width_limit; + int papersizes = stp_known_papersizes(); + valptrs = stp_malloc(sizeof(stp_param_t) * papersizes); + *count = 0; + width_limit = escp2_max_paper_width(model, v); + height_limit = escp2_max_paper_height(model, v); + min_width_limit = escp2_min_paper_width(model, v); + min_height_limit = escp2_min_paper_height(model, v); + + for (i = 0; i < papersizes; i++) + { + const stp_papersize_t pt = stp_get_papersize_by_index(i); + unsigned int pwidth = stp_papersize_get_width(pt); + unsigned int pheight = stp_papersize_get_height(pt); + if (strlen(stp_papersize_get_name(pt)) > 0 && + pwidth <= width_limit && pheight <= height_limit && + (pheight >= min_height_limit || pheight == 0) && + (pwidth >= min_width_limit || pwidth == 0) && + (pwidth == 0 || pheight > 0 || + escp2_has_cap(model, MODEL_ROLLFEED, MODEL_ROLLFEED_YES, v))) + { + valptrs[*count].name = c_strdup(stp_papersize_get_name(pt)); + valptrs[*count].text = c_strdup(stp_papersize_get_text(pt)); + (*count)++; + } + } + + return (valptrs); + } + else if (strcmp(name, "Resolution") == 0) + { + const res_t *res = &(escp2_reslist[0]); + valptrs = + stp_malloc(sizeof(stp_param_t) * sizeof(escp2_reslist) / sizeof(res_t)); + *count = 0; + while (res->hres) + { + if (verify_resolution(res, model, v)) + { + valptrs[*count].name = c_strdup(res->name); + valptrs[*count].text = c_strdup(_(res->text)); + (*count)++; + } + res++; + } + return (valptrs); + } + else if (strcmp(name, "InkType") == 0) + { + valptrs = stp_malloc(sizeof(stp_param_t) * escp2_ninktypes); + *count = 0; + for (i = 0; i < escp2_ninktypes; i++) + { + if (ink_types[i].hasblack && + (escp2_has_cap(model, MODEL_HASBLACK, MODEL_HASBLACK_NO, v))) + continue; + if ((ink_types[i].ncolors > 4) && + (escp2_has_cap(model, MODEL_COLOR, MODEL_COLOR_4, v))) + continue; + if (ink_types[i].ncolors == 7 && + !(escp2_has_cap(model, MODEL_COLOR, MODEL_COLOR_7, v))) + continue; + valptrs[*count].name = c_strdup(ink_types[i].name); + valptrs[*count].text = c_strdup(_(ink_types[i].text)); + (*count)++; + } + return valptrs; + } + else if (strcmp(name, "MediaType") == 0) + { + const paperlist_t *p = escp2_paperlist(model, v); + int nmediatypes = p->paper_count; + valptrs = stp_malloc(sizeof(stp_param_t) * nmediatypes); + for (i = 0; i < nmediatypes; i++) + { + valptrs[i].name = c_strdup(p->papers[i].name); + valptrs[i].text = c_strdup(_(p->papers[i].text)); + } + *count = nmediatypes; + return valptrs; + } + else if (strcmp(name, "InputSlot") == 0) + { + if (escp2_has_cap(model, MODEL_ROLLFEED, MODEL_ROLLFEED_NO, v)) + return NULL; + else + { /* Roll Feed capable printers */ + valptrs = stp_malloc(sizeof(stp_param_t) * 2); + valptrs[0].name = c_strdup("Standard"); + valptrs[0].text = c_strdup(_("Standard")); + valptrs[1].name = c_strdup("Roll"); + valptrs[1].text = c_strdup(_("Roll Feed")); + *count = 2; + return valptrs; + } + } + else + return (NULL); +} + +static const res_t * +escp2_find_resolution(const char *resolution) +{ + const res_t *res; + if (!resolution || !strcmp(resolution, "")) + return NULL; + for (res = &escp2_reslist[0];;res++) + { + if (!strcmp(resolution, res->name)) + return res; + else if (!strcmp(res->name, "")) + return NULL; + } +} + +/* + * 'escp2_imageable_area()' - Return the imageable area of the page. + */ + +static void +escp2_imageable_area(const stp_printer_t printer, /* I - Printer model */ + const stp_vars_t v, /* I */ + int *left, /* O - Left position in points */ + int *right, /* O - Right position in points */ + int *bottom, /* O - Bottom position in points */ + int *top) /* O - Top position in points */ +{ + int width, height; /* Size of page */ + int rollfeed; /* Roll feed selected */ + int model = stp_printer_get_model(printer); + + rollfeed = (strcmp(stp_get_media_source(v), "Roll") == 0); + + stp_default_media_size(printer, v, &width, &height); + + *left = escp2_left_margin(model, v); + *right = width - escp2_right_margin(model, v); + + /* + * All printers should have 0 vertical margin capability in Roll Feed + * mode -- They waste any paper they need automatically, and the + * driver should print as much as the user wants + */ + + if (rollfeed) + { + *top = height - 0; + *bottom = 0; + } + else + { + *top = height - escp2_top_margin(model, v); + *bottom = escp2_bottom_margin(model, v); + } +} + +static void +escp2_limit(const stp_printer_t printer, /* I - Printer model */ + const stp_vars_t v, /* I */ + int *width, + int *height, + int *min_width, + int *min_height) +{ + int model = stp_printer_get_model(printer); + *width = escp2_max_paper_width(model, v); + *height = escp2_max_paper_height(model, v); + *min_width = escp2_min_paper_width(model, v); + *min_height = escp2_min_paper_height(model, v); +} + +static const char * +escp2_default_parameters(const stp_printer_t printer, + const char *ppd_file, + const char *name) +{ + int i; + int model = stp_printer_get_model(printer); + const stp_vars_t v = stp_printer_get_printvars(printer); + if (name == NULL) + return NULL; + if (strcmp(name, "PageSize") == 0) + { + unsigned int height_limit, width_limit; + unsigned int min_height_limit, min_width_limit; + int papersizes = stp_known_papersizes(); + width_limit = escp2_max_paper_width(model, v); + height_limit = escp2_max_paper_height(model, v); + min_width_limit = escp2_min_paper_width(model, v); + min_height_limit = escp2_min_paper_height(model, v); + for (i = 0; i < papersizes; i++) + { + const stp_papersize_t pt = stp_get_papersize_by_index(i); + if (strlen(stp_papersize_get_name(pt)) > 0 && + stp_papersize_get_width(pt) >= min_width_limit && + stp_papersize_get_height(pt) >= min_height_limit && + stp_papersize_get_width(pt) <= width_limit && + stp_papersize_get_height(pt) <= height_limit) + return (stp_papersize_get_name(pt)); + } + return NULL; + } + else if (strcmp(name, "Resolution") == 0) + { + int model = stp_printer_get_model(printer); + stp_vars_t v = stp_printer_get_printvars(printer); + const res_t *res = &(escp2_reslist[0]); + while (res->hres) + { + if (res->vres >= 360 && res->hres >= 360 && + verify_resolution(res, model, v)) + { + return (res->name); + } + res++; + } + return NULL; + } + else if (strcmp(name, "InkType") == 0) + { + for (i = 0; i < escp2_ninktypes; i++) + { + if (ink_types[i].hasblack && + (escp2_has_cap(model, MODEL_HASBLACK, MODEL_HASBLACK_NO, v))) + continue; + if ((ink_types[i].ncolors > 4) && + (escp2_has_cap(model, MODEL_COLOR, MODEL_COLOR_4, v))) + continue; + if (ink_types[i].ncolors == 7 && + !(escp2_has_cap(model, MODEL_COLOR, MODEL_COLOR_7, v))) + continue; + return ink_types[i].name; + } + return NULL; + } + else if (strcmp(name, "MediaType") == 0) + { + const paperlist_t *p = escp2_paperlist(model, v); + return (p->papers[0].name); + } + else if (strcmp(name, "InputSlot") == 0) + { + if (escp2_has_cap(model, MODEL_ROLLFEED, MODEL_ROLLFEED_NO, v)) + return NULL; + else + return "Standard"; + } + else + return (NULL); + +} + +static void +escp2_describe_resolution(const stp_printer_t printer, + const char *resolution, int *x, int *y) +{ + int model = stp_printer_get_model(printer); + stp_vars_t v = stp_printer_get_printvars(printer); + const res_t *res = &(escp2_reslist[0]); + int nozzle_width = + escp2_base_separation(model, v) / escp2_nozzle_separation(model, v); + while (res->hres) + { + if (escp2_ink_type(model, res->resid, v) != -1 && + res->vres <= escp2_max_vres(model, v) && + res->hres <= escp2_max_hres(model, v) && + (res->microweave == 0 || + !escp2_has_cap(model, MODEL_MICROWEAVE, + MODEL_MICROWEAVE_NO, v)) && + (res->microweave <= 1 || + escp2_has_cap(model, MODEL_MICROWEAVE, + MODEL_MICROWEAVE_ENHANCED, v)) && + ((res->vres / nozzle_width) * nozzle_width) == res->vres && + !strcmp(resolution, res->name)) + { + *x = res->hres; + *y = res->vres; + return; + } + res++; + } + *x = -1; + *y = -1; +} + +static void +escp2_reset_printer(const escp2_init_t *init) +{ + /* + * Magic initialization string that's needed to take printer out of + * packet mode. + */ + if (escp2_has_cap(init->model, MODEL_INIT, MODEL_INIT_NEW, init->v)) + stp_zprintf(init->v, "%c%c%c\033\001@EJL 1284.4\n@EJL \n\033@", 0, 0, 0); + + stp_puts("\033@", init->v); /* ESC/P2 reset */ +} + +static void +escp2_set_remote_sequence(const escp2_init_t *init) +{ + /* Magic remote mode commands, whatever they do */ + +#if 0 + stp_zprintf(init->v, "\033(R%c%c%c%s", 1 + strlen(PACKAGE), 0, 0, PACKAGE); + stp_zprintf(init->v, "\033%c%c%c", 0, 0, 0); + stp_zprintf(init->v, "\033(R%c%c%c%s", 1 + strlen(VERSION), 0, 0, VERSION); + stp_zprintf(init->v, "\033%c%c%c", 0, 0, 0); + stp_zprintf(init->v, "\033(R%c%c%c%s", 1 + strlen(stp_get_driver(init->v)), + 0, 0, stp_get_driver(init->v)); + stp_zprintf(init->v, "\033%c%c%c", 0, 0, 0); + stp_puts("\033@", init->v); +#endif + if (escp2_has_advanced_command_set(init->model, init->v)) + { + int feed_sequence = 0; + const paper_t *p = + get_media_type(init->model, init->paper_type, init->v); + /* Enter remote mode */ + stp_zprintf(init->v, "\033(R%c%c%cREMOTE1", 8, 0, 0); + if (escp2_has_cap(init->model, MODEL_COMMAND, + MODEL_COMMAND_PRO, init->v)) + { + /* Set Roll Feed mode */ + if (strcmp(init->media_source,"Roll") == 0) + stp_zprintf(init->v, "PP%c%c%c%c%c", 3, 0, 0, 3, 0); + else + stp_zprintf(init->v, "PP%c%c%c%c%c", 3, 0, 0, 2, 0); + if (p) + { + stp_zprintf(init->v, "PH%c%c%c%c", 2, 0, 0, p->paper_thickness); + if (escp2_has_cap(init->model, MODEL_VACUUM, MODEL_VACUUM_YES, + init->v)) + stp_zprintf(init->v, "SN%c%c%c%c%c", 3, 0, 0, 5,p->vacuum_intensity); + stp_zprintf(init->v, "SN%c%c%c%c%c", 3, 0, 0, 4, p->feed_adjustment); + } + } + else + { + if (p) + feed_sequence = p->paper_feed_sequence; + /* Function unknown */ + stp_zprintf(init->v, "PM%c%c%c%c", 2, 0, 0, 0); + /* Set mechanism sequence */ + stp_zprintf(init->v, "SN%c%c%c%c%c", 3, 0, 0, 0, feed_sequence); + if (escp2_has_cap(init->model, MODEL_XZEROMARGIN, + MODEL_XZEROMARGIN_YES, init->v)) + stp_zprintf(init->v, "FP%c%c%c\260\377", 3, 0, 0); + + /* set up Roll-Feed options on appropriate printers + (tested for STP 870, which has no cutter) */ + if (escp2_has_cap(init->model, MODEL_ROLLFEED, + MODEL_ROLLFEED_YES, init->v)) + { + if (strcmp(init->media_source,"Roll") == 0) + stp_zprintf(init->v, /* Set Roll Feed mode */ + "IR%c%c%c%c" + "EX%c%c%c%c%c%c%c%c", + 2, 0, 0, 1, + 6, 0, 0, 0, 0, 0, 5, 1); + else + stp_zprintf(init->v, /* Set non-Roll Feed mode */ + "IR%c%c%c%c" + "EX%c%c%c%c%c%c%c%c", + 2, 0, 0, 3, + 6, 0, 0, 0, 0, 0, 5, 0); + } + } + /* Exit remote mode */ + stp_zprintf(init->v, "\033%c%c%c", 0, 0, 0); + } +} + +static void +escp2_set_graphics_mode(const escp2_init_t *init) +{ + stp_zfwrite("\033(G\001\000\001", 6, 1, init->v); /* Enter graphics mode */ +} + +static void +escp2_set_resolution(const escp2_init_t *init) +{ + if (escp2_has_cap(init->model, MODEL_COMMAND, MODEL_COMMAND_PRO, init->v) || + (!(escp2_has_cap(init->model, MODEL_VARIABLE_DOT, + MODEL_VARIABLE_NORMAL, init->v)) && + init->use_softweave)) + { + int hres = escp2_max_hres(init->model, init->v); + stp_zprintf(init->v, "\033(U\005%c%c%c%c%c%c", 0, hres / init->ydpi, + hres / init->ydpi, hres / init->xdpi, + hres % 256, hres / 256); + } + else + stp_zprintf(init->v, "\033(U\001%c%c", 0, 3600 / init->ydpi); +} + +static void +escp2_set_color(const escp2_init_t *init) +{ + if (escp2_has_cap(init->model, MODEL_GRAYMODE, MODEL_GRAYMODE_YES, + init->v)) + stp_zprintf(init->v, "\033(K\002%c%c%c", 0, 0, + (init->output_type == OUTPUT_GRAY ? 1 : 2)); +} + +static void +escp2_set_microweave(const escp2_init_t *init) +{ + stp_zprintf(init->v, "\033(i\001%c%c", 0, init->use_microweave); +} + +static void +escp2_set_printhead_speed(const escp2_init_t *init) +{ + if (init->unidirectional) + { + stp_zprintf(init->v, "\033U%c", 1); + if (init->xdpi > escp2_enhanced_resolution(init->model, init->v)) + stp_zprintf(init->v, "\033(s%c%c%c", 1, 0, 2); + } + else + stp_zprintf(init->v, "\033U%c", 0); +} + +static void +escp2_set_dot_size(const escp2_init_t *init) +{ + /* Dot size */ + int drop_size = escp2_ink_type(init->model, init->resid, init->v); + if (drop_size >= 0) + stp_zprintf(init->v, "\033(e\002%c%c%c", 0, 0, drop_size); +} + +static void +escp2_set_page_height(const escp2_init_t *init) +{ + int l = init->ydpi * init->page_height / 72; + if (escp2_has_cap(init->model, MODEL_COMMAND, MODEL_COMMAND_PRO, init->v) || + (!(escp2_has_cap(init->model, MODEL_VARIABLE_DOT, + MODEL_VARIABLE_NORMAL, init->v)) && + init->use_softweave)) + stp_zprintf(init->v, "\033(C\004%c%c%c%c%c", 0, + l & 0xff, (l >> 8) & 0xff, (l >> 16) & 0xff, (l >> 24) & 0xff); + else + stp_zprintf(init->v, "\033(C\002%c%c%c", 0, l & 255, l >> 8); +} + +static void +escp2_set_margins(const escp2_init_t *init) +{ + int l = init->ydpi * (init->page_height - init->page_bottom) / 72; + int t = init->ydpi * (init->page_height - init->page_top) / 72; + + t += init->initial_vertical_offset; + if (escp2_has_cap(init->model, MODEL_COMMAND, MODEL_COMMAND_PRO, init->v) || + (!(escp2_has_cap(init->model, MODEL_VARIABLE_DOT, + MODEL_VARIABLE_NORMAL, init->v)) && + init->use_softweave)) + { + if (escp2_has_cap(init->model, MODEL_COMMAND,MODEL_COMMAND_2000,init->v)) + stp_zprintf(init->v, "\033(c\010%c%c%c%c%c%c%c%c%c", 0, + t & 0xff, t >> 8, (t >> 16) & 0xff, (t >> 24) & 0xff, + l & 0xff, l >> 8, (l >> 16) & 0xff, (l >> 24) & 0xff); + else + stp_zprintf(init->v, "\033(c\004%c%c%c%c%c", 0, + t & 0xff, t >> 8, l & 0xff, l >> 8); + } + else + stp_zprintf(init->v, "\033(c\004%c%c%c%c%c", 0, + t & 0xff, t >> 8, l & 0xff, l >> 8); +} + +static void +escp2_set_form_factor(const escp2_init_t *init) +{ + if (escp2_has_advanced_command_set(init->model, init->v)) + { + int page_width = init->page_width * init->ydpi / 72; + int page_height = init->page_height * init->ydpi / 72; + + if (escp2_has_cap(init->model, MODEL_XZEROMARGIN, MODEL_XZEROMARGIN_YES, + init->v)) + /* Make the page 2/10" wider (probably ignored by the printer) */ + page_width += 144 * init->xdpi / 720; + + stp_zprintf(init->v, "\033(S\010%c%c%c%c%c%c%c%c%c", 0, + ((page_width >> 0) & 0xff), ((page_width >> 8) & 0xff), + ((page_width >> 16) & 0xff), ((page_width >> 24) & 0xff), + ((page_height >> 0) & 0xff), ((page_height >> 8) & 0xff), + ((page_height >> 16) & 0xff), ((page_height >> 24) & 0xff)); + } +} + +static void +escp2_set_printhead_resolution(const escp2_init_t *init) +{ + if (escp2_has_cap(init->model, MODEL_COMMAND, MODEL_COMMAND_PRO, init->v) || + (!(escp2_has_cap(init->model, MODEL_VARIABLE_DOT, + MODEL_VARIABLE_NORMAL, init->v)) && + init->use_softweave)) + { + int xres; + int yres; + int nozzle_separation; + + if (escp2_has_cap(init->model, MODEL_COMMAND, MODEL_COMMAND_PRO,init->v)) + xres = init->xdpi; + else if (init->xdpi > escp2_enhanced_resolution(init->model, init->v)) + xres = escp2_enhanced_xres(init->model, init->v); + else + xres = escp2_xres(init->model, init->v); + if (init->xdpi < xres) + xres = init->xdpi; + xres = escp2_resolution_scale(init->model, init->v) / xres; + + if (init->output_type == OUTPUT_GRAY && + (escp2_max_black_resolution(init->model, init->v) < 0 || + init->ydpi <= escp2_max_black_resolution(init->model, init->v))) + nozzle_separation = escp2_black_nozzle_separation(init->model, + init->v); + else + nozzle_separation = escp2_nozzle_separation(init->model, init->v); + + if (escp2_has_cap(init->model, MODEL_COMMAND, MODEL_COMMAND_PRO, + init->v) && !init->use_softweave) + yres = escp2_resolution_scale(init->model, init->v) / init->ydpi; + else + yres = (nozzle_separation * + escp2_resolution_scale(init->model, init->v) / + escp2_base_separation(init->model, init->v)); + + /* Magic resolution cookie */ + stp_zprintf(init->v, "\033(D%c%c%c%c%c%c", 4, 0, + escp2_resolution_scale(init->model, init->v) % 256, + escp2_resolution_scale(init->model, init->v) / 256, + yres, xres); + } +} + +static void +escp2_init_printer(const escp2_init_t *init) +{ + escp2_reset_printer(init); + escp2_set_remote_sequence(init); + escp2_set_graphics_mode(init); + escp2_set_resolution(init); + escp2_set_color(init); + escp2_set_microweave(init); + escp2_set_printhead_speed(init); + escp2_set_dot_size(init); + escp2_set_printhead_resolution(init); + escp2_set_page_height(init); + escp2_set_margins(init); + escp2_set_form_factor(init); +} + +static void +escp2_deinit_printer(const escp2_init_t *init) +{ + stp_puts(/* Eject page */ + "\014" + /* ESC/P2 reset */ + "\033@", init->v); + if (escp2_has_advanced_command_set(init->model, init->v)) + { + stp_zprintf(init->v, /* Enter remote mode */ + "\033(R\010%c%cREMOTE1", 0, 0); + /* set up Roll-Feed options on appropriate printers + (tested for STP 870, which has no cutter) */ + if (escp2_has_cap(init->model, MODEL_ROLLFEED, + MODEL_ROLLFEED_YES, init->v)) + { + if(strcmp(init->media_source,"Roll") == 0) + stp_zprintf(init->v, /* End Roll Feed mode */ + "IR\002%c%c%c", 0, 0, 0); + else + stp_zprintf(init->v, /* End non-Roll Feed mode */ + "IR\002%c%c%c", 0, 0, 2); + } + stp_zprintf(init->v, /* Load settings from NVRAM */ + "LD%c%c" + /* Exit remote mode */ + "\033%c%c%c", 0, 0, 0, 0, 0); + + } +} + +/* + * 'escp2_print()' - Print an image to an EPSON printer. + */ +static void +escp2_print(const stp_printer_t printer, /* I - Model */ + stp_image_t *image, /* I - Image to print */ + const stp_vars_t v) +{ + unsigned char *cmap = stp_get_cmap(v); + int model = stp_printer_get_model(printer); + const char *resolution = stp_get_resolution(v); + const char *media_type = stp_get_media_type(v); + int output_type = stp_get_output_type(v); + int orientation = stp_get_orientation(v); + const char *ink_type = stp_get_ink_type(v); + double scaling = stp_get_scaling(v); + const char *media_source = stp_get_media_source(v); + int top = stp_get_top(v); + int left = stp_get_left(v); + int y; /* Looping vars */ + int xdpi, ydpi; /* Resolution */ + int undersample; + int undersample_denominator; + int resid; + int physical_ydpi; + int physical_xdpi; + int i; + int n; /* Output number */ + unsigned short *out; /* Output pixels (16-bit) */ + unsigned char *in, /* Input pixels */ + *black = NULL, /* Black bitmap data */ + *cyan = NULL, /* Cyan bitmap data */ + *magenta = NULL, /* Magenta bitmap data */ + *yellow = NULL, /* Yellow bitmap data */ + *lcyan = NULL, /* Light cyan bitmap data */ + *lmagenta = NULL, /* Light magenta bitmap data */ + *dyellow = NULL; /* Dark yellow bitmap data */ + int page_left, /* Left margin of page */ + page_right, /* Right margin of page */ + page_top, /* Top of page */ + page_bottom, /* Bottom of page */ + page_width, /* Width of page */ + page_height, /* Height of page */ + page_true_height, /* True height of page */ + out_width, /* Width of image on page */ + out_height, /* Height of image on page */ + out_bpp, /* Output bytes per pixel */ + length, /* Length of raster data */ + errdiv, /* Error dividend */ + errmod, /* Error modulus */ + errval, /* Current error value */ + errline, /* Current raster line */ + errlast; /* Last raster line loaded */ + stp_convert_t colorfunc = 0; /* Color conversion function... */ + int zero_mask; + int image_height, + image_width, + image_bpp; + int use_softweave = 0; + int use_microweave = 0; + int nozzles = 1; + int nozzle_separation = 1; + int horizontal_passes = 1; + int vertical_passes = 1; + int vertical_oversample = 1; + int unidirectional = 0; + int hasblack = 0; + const res_t *res; + int bits = 1; + void * weave = NULL; + void * dither; + int separation_rows; + int ink_spread; + stp_vars_t nv = stp_allocate_copy(v); + escp2_init_t init; + const escp2_variable_inkset_t *inks; + const paper_t *pt; + double k_upper, k_lower; + int max_vres; + const unsigned char *cols[7]; + int head_offset[8]; + const int *offset_ptr; + int max_head_offset; + double lum_adjustment[49], sat_adjustment[49], hue_adjustment[49]; + int ncolors = 0; + escp2_privdata_t privdata; + int drop_size; + int min_nozzles; + + if (!stp_get_verified(nv)) + { + stp_eprintf(nv, "Print options not verified; cannot print.\n"); + return; + } + + privdata.undersample = 1; + privdata.initial_vertical_offset = 0; + stp_set_driver_data(nv, &privdata); + + separation_rows = escp2_separation_rows(model, nv); + max_vres = escp2_max_vres(model, nv); + + if (output_type == OUTPUT_GRAY || output_type == OUTPUT_MONOCHROME) + ncolors = 1; + else + for (i = 0; i < escp2_ninktypes; i++) + { + if (strcmp(ink_type, ink_types[i].name) == 0) + { + hasblack = ink_types[i].hasblack; + ncolors = ink_types[i].ncolors; + break; + } + } + if (ncolors == 0) + { + ink_type = escp2_default_parameters(printer, NULL, "InkType"); + for (i = 0; i < escp2_ninktypes; i++) + { + if (strcmp(ink_type, ink_types[i].name) == 0) + { + hasblack = ink_types[i].hasblack; + ncolors = ink_types[i].ncolors; + break; + } + } + } + stp_set_output_color_model(nv, COLOR_MODEL_CMY); + + /* + * Setup a read-only pixel region for the entire image... + */ + + image->init(image); + image_height = image->height(image); + image_width = image->width(image); + image_bpp = image->bpp(image); + + /* + * Choose the correct color conversion function... + */ + + colorfunc = stp_choose_colorfunc(output_type, image_bpp, cmap, &out_bpp, nv); + + /* + * Compute the output size... + */ + escp2_imageable_area(printer, nv, &page_left, &page_right, + &page_bottom, &page_top); + + stp_compute_page_parameters(page_right, page_left, page_top, page_bottom, + scaling, image_width, image_height, image, + &orientation, &page_width, &page_height, + &out_width, &out_height, &left, &top); + + /* + * Recompute the image height and width. If the image has been + * rotated, these will change from previously. + */ + image_height = image->height(image); + image_width = image->width(image); + + /* + * Figure out the output resolution... + */ + res = escp2_find_resolution(resolution); + if (!res) + return; + use_softweave = res->softweave; + use_microweave = res->microweave; + if (!use_softweave) + max_vres = escp2_base_resolution(model, nv); + xdpi = res->hres; + ydpi = res->vres; + resid = res->resid; + undersample = res->vertical_undersample; + undersample_denominator = res->vertical_denominator; + privdata.undersample = res->vertical_undersample; + vertical_passes = res->vertical_passes; + vertical_oversample = res->vertical_oversample; + unidirectional = res->unidirectional; + drop_size = escp2_ink_type(model, resid, nv); + + if (use_microweave && + (escp2_has_cap(model, MODEL_MICROWEAVE_EXCEPTION, + MODEL_MICROWEAVE_EXCEPTION_360, nv))) + { + if (ydpi == 360) + use_microweave = 0; + } + if (use_softweave) + { + physical_xdpi = (xdpi > escp2_enhanced_resolution(model, nv)) ? + escp2_enhanced_xres(model, nv) : escp2_xres(model, nv); + horizontal_passes = xdpi / physical_xdpi; + if ((output_type == OUTPUT_GRAY || output_type == OUTPUT_MONOCHROME) && + (escp2_max_black_resolution(model, nv) < 0 || + ydpi <= escp2_max_black_resolution(model, nv)) && + escp2_black_nozzles(model, nv)) + { + nozzles = escp2_black_nozzles(model, nv); + nozzle_separation = escp2_black_nozzle_separation(model, nv); + min_nozzles = escp2_min_black_nozzles(model, nv); + } + else + { + nozzles = escp2_nozzles(model, nv); + nozzle_separation = escp2_nozzle_separation(model, nv); + min_nozzles = escp2_min_nozzles(model, nv); + } + nozzle_separation = + nozzle_separation * ydpi / escp2_base_separation(model, nv); + } + else + { + physical_xdpi = (xdpi <= escp2_base_resolution(model, nv)) ? + xdpi : escp2_base_resolution(model, nv); + horizontal_passes = xdpi / escp2_base_resolution(model, nv); + nozzles = 1; + min_nozzles = 1; + nozzle_separation = 1; + } + if (drop_size > 0 && drop_size & 0x10) + bits = 2; + else + bits = 1; + if (horizontal_passes == 0) + horizontal_passes = 1; + privdata.min_nozzles = min_nozzles; + + physical_ydpi = ydpi; + if (ydpi > max_vres) + physical_ydpi = max_vres; + + offset_ptr = escp2_head_offset(model, nv); + max_head_offset = 0; + if (ncolors > 1) + for (i = 0; i < NCHANNELS; i++) + { + head_offset[i] = offset_ptr[i] * ydpi / + escp2_base_separation(model, nv); + if (head_offset[i] > max_head_offset) + max_head_offset = head_offset[i]; + } + + + /* + * Let the user know what we're doing... + */ + + image->progress_init(image); + + /* + * Send ESC/P2 initialization commands... + */ + stp_default_media_size(printer, nv, &n, &page_true_height); + init.model = model; + init.output_type = output_type; + if (init.output_type == OUTPUT_MONOCHROME) + init.output_type = OUTPUT_GRAY; + init.ydpi = ydpi * undersample; + if (init.ydpi > escp2_max_vres(init.model, init.v)) + init.ydpi = escp2_max_vres(init.model, init.v); + init.xdpi = xdpi; + init.use_softweave = use_softweave; + init.use_microweave = use_microweave; + init.page_height = page_true_height; + init.page_width = page_width; + init.page_top = page_top; + if (init.output_type == OUTPUT_GRAY) + { + if (escp2_max_black_resolution(model, nv) < 0 || + ydpi <= escp2_max_black_resolution(init.model, init.v)) + init.initial_vertical_offset = + escp2_black_initial_vertical_offset(init.model, init.v) * init.ydpi / + escp2_base_separation(model, nv); + else + init.initial_vertical_offset = + (escp2_initial_vertical_offset(init.model, init.v) + offset_ptr[0]) * + init.ydpi / escp2_base_separation(model, nv); + } + else + init.initial_vertical_offset = + escp2_initial_vertical_offset(init.model, init.v) * init.ydpi / + escp2_base_separation(model, nv); + + /* adjust bottom margin for a 480 like head configuration */ + init.page_bottom = page_bottom - max_head_offset * 72 / ydpi; + if ((max_head_offset * 72 % ydpi) != 0) + init.page_bottom -= 1; + if (init.page_bottom < 0) + init.page_bottom = 0; + + init.horizontal_passes = horizontal_passes; + init.vertical_passes = vertical_passes; + init.vertical_oversample = vertical_oversample; + init.unidirectional = unidirectional; + init.resid = resid; + init.bits = bits; + init.paper_type = media_type; + init.media_source = media_source; + init.v = nv; + + escp2_init_printer(&init); + + /* + * Convert image size to printer resolution... + */ + + out_width = xdpi * out_width / 72; + out_height = ydpi * out_height / 72; + + left = physical_ydpi * undersample * left / 72 / undersample_denominator; + + /* + * Adjust for zero-margin printing... + */ + + if (escp2_has_cap(model, MODEL_XZEROMARGIN, MODEL_XZEROMARGIN_YES, nv)) + { + /* + * In zero-margin mode, the origin is about 3/20" to the left of the + * paper's left edge. + */ + left += escp2_zero_margin_offset(model, nv) * physical_ydpi * + undersample / max_vres / undersample_denominator; + } + + /* + * Allocate memory for the raster data... + */ + + length = (out_width + 7) / 8; + + if (output_type == OUTPUT_GRAY || output_type == OUTPUT_MONOCHROME) + black = xzmalloc(length * bits); + else + { + cyan = xzmalloc(length * bits); + magenta = xzmalloc(length * bits); + yellow = xzmalloc(length * bits); + + if (ncolors == 7) + dyellow = xzmalloc(length * bits); + if (ncolors >= 6) + { + lcyan = xzmalloc(length * bits); + lmagenta = xzmalloc(length * bits); + } + if (hasblack) + black = xzmalloc(length * bits); + } + cols[0] = black; + cols[1] = magenta; + cols[2] = cyan; + cols[3] = yellow; + cols[4] = lmagenta; + cols[5] = lcyan; + cols[6] = dyellow; + + /* Epson printers are currently all 720 physical dpi vertically */ + weave = stp_initialize_weave(nozzles, nozzle_separation, + horizontal_passes, vertical_passes, + vertical_oversample, ncolors, bits, + out_width, out_height, separation_rows, + top * physical_ydpi / 72, + (page_height * physical_ydpi / 72 + + escp2_extra_feed(model, nv) * physical_ydpi / + escp2_base_resolution(model, nv)), + 1, head_offset, nv, flush_pass, + FILLFUNC, PACKFUNC, COMPUTEFUNC); + + /* + * Compute the LUT. For now, it's 8 bit, but that may eventually + * sometimes change. + */ + if (ncolors > 4) + k_lower = .5; + else + k_lower = .25; + + pt = get_media_type(model, stp_get_media_type(nv), nv); + if (pt) + { + stp_set_density(nv, stp_get_density(nv) * pt->base_density); + if (ncolors >= 5) + { + stp_set_cyan(nv, stp_get_cyan(nv) * pt->p_cyan); + stp_set_magenta(nv, stp_get_magenta(nv) * pt->p_magenta); + stp_set_yellow(nv, stp_get_yellow(nv) * pt->p_yellow); + } + else + { + stp_set_cyan(nv, stp_get_cyan(nv) * pt->cyan); + stp_set_magenta(nv, stp_get_magenta(nv) * pt->magenta); + stp_set_yellow(nv, stp_get_yellow(nv) * pt->yellow); + } + stp_set_saturation(nv, stp_get_saturation(nv) * pt->saturation); + stp_set_gamma(nv, stp_get_gamma(nv) * pt->gamma); + k_lower *= pt->k_lower_scale; + k_upper = pt->k_upper; + } + else /* Can't find paper type? Assume plain */ + { + stp_set_density(nv, stp_get_density(nv) * .8); + k_lower *= .1; + k_upper = .5; + } + stp_set_density(nv, stp_get_density(nv) * escp2_density(model, resid, nv)); + if (stp_get_density(nv) > 1.0) + stp_set_density(nv, 1.0); + if (ncolors == 1) + stp_set_gamma(nv, stp_get_gamma(nv) / .8); + stp_compute_lut(nv, 256); + + /* + * Output the page... + */ + + if (xdpi > ydpi) + dither = stp_init_dither(image_width, out_width, 1, xdpi / ydpi, nv); + else + dither = stp_init_dither(image_width, out_width, ydpi / xdpi, 1, nv); + + for (i = 0; i <= NCOLORS; i++) + stp_dither_set_black_level(dither, i, 1.0); + stp_dither_set_black_lower(dither, k_lower); + stp_dither_set_black_upper(dither, k_upper); + + inks = escp2_inks(model, resid, ncolors, bits, nv); + if (inks) + for (i = 0; i < NCOLORS; i++) + if ((*inks)[i]) + stp_dither_set_ranges(dither, i, (*inks)[i]->count, (*inks)[i]->range, + (*inks)[i]->density * k_upper * + stp_get_density(nv)); + + switch (stp_get_image_type(nv)) + { + case IMAGE_LINE_ART: + stp_dither_set_ink_spread(dither, 19); + break; + case IMAGE_SOLID_TONE: + stp_dither_set_ink_spread(dither, 15); + break; + case IMAGE_CONTINUOUS: + ink_spread = 13; + if (ydpi > escp2_max_vres(model, nv)) + ink_spread++; + if (bits > 1) + ink_spread++; + stp_dither_set_ink_spread(dither, ink_spread); + break; + } + stp_dither_set_density(dither, stp_get_density(nv)); + + in = stp_malloc(image_width * image_bpp); + out = stp_malloc(image_width * out_bpp * 2); + + errdiv = image_height / out_height; + errmod = image_height % out_height; + errval = 0; + errlast = -1; + errline = 0; + if (escp2_lum_adjustment(model, nv)) + { + for (i = 0; i < 49; i++) + { + lum_adjustment[i] = escp2_lum_adjustment(model, nv)[i]; + if (pt && pt->lum_adjustment) + lum_adjustment[i] *= pt->lum_adjustment[i]; + } + } + if (escp2_sat_adjustment(model, nv)) + { + for (i = 0; i < 49; i++) + { + sat_adjustment[i] = escp2_sat_adjustment(model, nv)[i]; + if (pt && pt->sat_adjustment) + sat_adjustment[i] *= pt->sat_adjustment[i]; + } + } + if (escp2_hue_adjustment(model, nv)) + { + for (i = 0; i < 49; i++) + { + hue_adjustment[i] = escp2_hue_adjustment(model, nv)[i]; + if (pt && pt->hue_adjustment) + hue_adjustment[i] += pt->hue_adjustment[i]; + } + } + + QUANT(0); + for (y = 0; y < out_height; y ++) + { + int duplicate_line = 1; + if ((y & 63) == 0) + image->note_progress(image, y, out_height); + + if (errline != errlast) + { + errlast = errline; + duplicate_line = 0; + if (image->get_row(image, in, errline) != STP_IMAGE_OK) + break; + (*colorfunc)(nv, in, out, &zero_mask, image_width, image_bpp, cmap, + escp2_hue_adjustment(model, nv) ? hue_adjustment : NULL, + escp2_lum_adjustment(model, nv) ? lum_adjustment : NULL, + escp2_sat_adjustment(model, nv) ? sat_adjustment :NULL); + } + QUANT(1); + + stp_dither(out, y, dither, cyan, lcyan, magenta, lmagenta, + yellow, dyellow, black, duplicate_line, zero_mask); + QUANT(2); + + stp_write_weave(weave, length, ydpi, model, out_width, left, + xdpi, physical_xdpi, cols); + QUANT(3); + errval += errmod; + errline += errdiv; + if (errval >= out_height) + { + errval -= out_height; + errline ++; + } + QUANT(4); + } + image->progress_conclude(image); + stp_flush_all(weave, model, out_width, left, ydpi, xdpi, physical_xdpi); + QUANT(5); + + stp_free_dither(dither); + + /* + * Cleanup... + */ + escp2_deinit_printer(&init); + + stp_free_lut(nv); + stp_free(in); + stp_free(out); + stp_destroy_weave(weave); + + for (i = 0; i < 7; i++) + if (cols[i]) + stp_free((unsigned char *) cols[i]); + +#ifdef QUANTIFY + print_timers(nv); +#endif + stp_free_vars(nv); +} + +const stp_printfuncs_t stp_escp2_printfuncs = +{ + escp2_parameters, + stp_default_media_size, + escp2_imageable_area, + escp2_limit, + escp2_print, + escp2_default_parameters, + escp2_describe_resolution, + stp_verify_printer_params +}; + +static void +flush_pass(stp_softweave_t *sw, int passno, int model, int width, + int hoffset, int ydpi, int xdpi, int physical_xdpi, + int vertical_subpass) +{ + int j; + const stp_vars_t v = (sw->v); + escp2_privdata_t *pd = + (escp2_privdata_t *) stp_get_driver_data(v); + stp_lineoff_t *lineoffs = stp_get_lineoffsets_by_pass(sw, passno); + stp_lineactive_t *lineactive = stp_get_lineactive_by_pass(sw, passno); + const stp_linebufs_t *bufs = stp_get_linebases_by_pass(sw, passno); + stp_pass_t *pass = stp_get_pass_by_pass(sw, passno); + stp_linecount_t *linecount = stp_get_linecount_by_pass(sw, passno); + int lwidth = (width + (sw->horizontal_weave - 1)) / sw->horizontal_weave; + int microoffset = vertical_subpass & (sw->horizontal_weave - 1); + int advance = pass->logicalpassstart - sw->last_pass_offset - + (sw->separation_rows - 1); + int pos; + + advance *= pd->undersample; + ydpi *= pd->undersample; + + if (ydpi > escp2_max_vres(model, v)) + ydpi = escp2_max_vres(model, v); + for (j = 0; j < sw->ncolors; j++) + { + if (lineactive[0].v[j] > 0 || + escp2_has_cap(model, MODEL_MICROWEAVE_EXCEPTION, + MODEL_MICROWEAVE_EXCEPTION_BLACK, v)) + { + int nlines = linecount[0].v[j]; + int minlines = pd->min_nozzles; + int extralines = 0; + if (nlines < minlines) + { + extralines = minlines - nlines; + nlines = minlines; + } + /* + * Set vertical position + */ + if (pass->logicalpassstart > sw->last_pass_offset || + pd->initial_vertical_offset != 0) + { + int a0, a1, a2, a3; + advance += pd->initial_vertical_offset; + pd->initial_vertical_offset = 0; + a0 = advance & 0xff; + a1 = (advance >> 8) & 0xff; + a2 = (advance >> 16) & 0xff; + a3 = (advance >> 24) & 0xff; + if (!escp2_has_cap(model, MODEL_COMMAND, MODEL_COMMAND_PRO, v) && + (sw->jets == 1 || escp2_has_cap(model, MODEL_VARIABLE_DOT, + MODEL_VARIABLE_NORMAL, v))) + stp_zprintf(v, "\033(v%c%c%c%c", 2, 0, a0, a1); + else + stp_zprintf(v, "\033(v%c%c%c%c%c%c", 4, 0, a0, a1, a2, a3); + sw->last_pass_offset = pass->logicalpassstart; + } + + /* + * Set color where appropriate + */ + if (sw->last_color != j && + !escp2_has_cap(model, MODEL_COMMAND, MODEL_COMMAND_PRO, v) && + (sw->jets == 1 || escp2_has_cap(model, MODEL_VARIABLE_DOT, + MODEL_VARIABLE_NORMAL, v))) + { + if (!escp2_has_cap(model, MODEL_COLOR, MODEL_COLOR_4, v)) + stp_zprintf(v, "\033(r%c%c%c%c", 2, 0, densities[j],colors[j]); + else + stp_zprintf(v, "\033r%c", colors[j]); + sw->last_color = j; + } + + /* + * Set horizontal position + */ + if (!escp2_has_advanced_command_set(model, v) && + (xdpi <= escp2_base_resolution(model, v) || + escp2_max_hres(model, v) < 1440)) + { + pos = (hoffset + microoffset); + if (pos > 0) + stp_zprintf(v, "\033\\%c%c", pos & 255, pos >> 8); + } + else if (escp2_has_cap(model, MODEL_COMMAND, MODEL_COMMAND_PRO,v) || + (escp2_has_advanced_command_set(model, v) && + !(escp2_has_cap(model, MODEL_VARIABLE_DOT, + MODEL_VARIABLE_NORMAL, v)))) + { + pos = ((hoffset * xdpi / ydpi) + microoffset); + if (pos > 0) + stp_zprintf(v, "\033($%c%c%c%c%c%c", 4, 0, + pos & 255, (pos >> 8) & 255, + (pos >> 16) & 255, (pos >> 24) & 255); + } + else + { + pos = ((hoffset * escp2_max_hres(model, v) / ydpi) + + microoffset); + if (pos > 0) + stp_zprintf(v, "\033(\\%c%c%c%c%c%c", 4, 0, 160, 5, + pos & 255, pos >> 8); + } + + /* + * Issue print command + */ + if (!escp2_has_cap(model, MODEL_COMMAND, MODEL_COMMAND_PRO,v) && + sw->jets == 1 && sw->bitwidth == 1) + { + int ygap = 3600 / ydpi; + int xgap = 3600 / xdpi; + if (ydpi == 720 && + escp2_has_cap(model, MODEL_720DPI_MODE, MODEL_720DPI_600, v)) + ygap *= 8; + stp_zprintf(v, "\033.%c%c%c%c%c%c", COMPRESSION, ygap, xgap, + 1, lwidth & 255, (lwidth >> 8) & 255); + } + else if (!escp2_has_cap(model, MODEL_COMMAND, MODEL_COMMAND_PRO,v) && + escp2_has_cap(model, MODEL_VARIABLE_DOT, + MODEL_VARIABLE_NORMAL,v)) + { + int ygap = 3600 / ydpi; + int xgap = 3600 / physical_xdpi; + if (escp2_has_cap(model, MODEL_720DPI_MODE, MODEL_720DPI_600, v)) + ygap *= 8; + else if (escp2_pseudo_separation_rows(model, v) > 0) + ygap *= escp2_pseudo_separation_rows(model, v); + else + ygap *= sw->separation_rows; + stp_zprintf(v, "\033.%c%c%c%c%c%c", COMPRESSION, ygap, xgap, + nlines, lwidth & 255, (lwidth >> 8) & 255); + } + else + { + int ncolor = (densities[j] << 4) | colors[j]; + int nwidth = sw->bitwidth * ((lwidth + 7) / 8); + stp_zprintf(v, "\033i%c%c%c%c%c%c%c", ncolor, COMPRESSION, + sw->bitwidth, nwidth & 255, (nwidth >> 8) & 255, + nlines & 255, (nlines >> 8) & 255); + } + + /* + * Send the data + */ + stp_zfwrite((const char *)bufs[0].v[j], lineoffs[0].v[j], 1, v); + if (extralines) + { + int k = 0; + for (k = 0; k < extralines; k++) + { + int bytes_to_fill = sw->bitwidth * ((lwidth + 7) / 8); + int full_blocks = bytes_to_fill / 128; + int leftover = bytes_to_fill % 128; + int l = 0; + while (l < full_blocks) + { + stp_putc(129, v); + stp_putc(0, v); + l++; + } + if (leftover == 1) + { + stp_putc(1, v); + stp_putc(0, v); + } + else if (leftover > 0) + { + stp_putc(257 - leftover, v); + stp_putc(0, v); + } + } + } + stp_putc('\r', v); + } + lineoffs[0].v[j] = 0; + linecount[0].v[j] = 0; + } + + sw->last_pass = pass->pass; + pass->pass = -1; +} diff --git a/src/main/print-lexmark.c b/src/main/print-lexmark.c new file mode 100644 index 0000000..4e39314 --- /dev/null +++ b/src/main/print-lexmark.c @@ -0,0 +1,3055 @@ +/* + * "$Id: print-lexmark.c,v 1.65 2001/11/08 12:55:01 rlk Exp $" + * + * Print plug-in Lexmark driver for the GIMP. + * + * Copyright 2000 Richard Wisenoecker (richard.wisenoecker@gmx.at) and + * Alwin Stolk (p.a.stolk@tmx.nl) + * + * The plug-in is based on the code of the CANON BJL plugin for the GIMP + * of Michael Sweet (mike@easysw.com) and Robert Krawitz (rlk@alum.mit.edu). + * + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + * This file must include only standard C header files. The core code must + * compile on generic platforms that don't support glib, gimp, gtk, etc. + */ + +/* + * !!! IMPORTANT !!! Some short information: Border and page offsets + * are defined in 1/72 DPI. This mean, that the parameter defined at + * lexmark_cap_t which defines positions are in 1/72 DPI. At + * lexmark_print the unit will be changed dependent on the printer, + * according to the value defined at lexmark_cap_t.x_raster_res and + * lexmark_cap_t.y_raster_res. These two parameters are specifing the + * resolution used for positioning the printer head (it is not the + * resolution used for printing!). + */ + +/* TODO-LIST + * + * * implement the left border + * + */ + +/*#define DEBUG 1*/ +#define USEEPSEWAVE 1 + +#ifdef __GNUC__ +#define inline __inline__ +#endif + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include "gimp-print-internal.h" +#include +#include +#ifdef DEBUG +#include +#endif + + +#define false 0 +#define true 1 + +#define max(a, b) ((a > b) ? a : b) +#define INCH(x) (72 * x) + + + +typedef enum Lex_model { m_lex7500, m_z52=10052, m_z42=10042, m_3200=3200 } Lex_model; + + + + +#ifdef DEBUG +typedef struct testdata { + FILE *ifile; + int x, y, cols, deep; + char colchar[16]; + char *input_line; +} testdata; + +const stp_vars_t *dbgfileprn; +int lex_show_lcount, lex_show_length; + +const stp_vars_t lex_open_tmp_file(); +const stp_vars_t lex_write_tmp_file(const stp_vars_t ofile, void *data,int length); +static void testprint(testdata *td); +static void readtestprintline(testdata *td, stp_linebufs_t *linebufs); +#endif + +static void +flush_pass(stp_softweave_t *sw, int passno, int model, int width, + int hoffset, int ydpi, int xdpi, int physical_xdpi, + int vertical_subpass); + +/*** resolution specific parameters */ +#define DPI300 0 +#define DPI600 1 +#define DPI1200 2 +#define DPI2400 3 +#define DPItest 4 + +#define V_NOZZLE_MASK 0x3 +#define H_NOZZLE_MASK 0xc +#define NOZZLE_MASK 0xf + +#define PRINT_MODE_300 0x100 +#define PRINT_MODE_600 0x200 +#define PRINT_MODE_1200 0x300 +#define PRINT_MODE_2400 0x400 + +#define COLOR_MODE_K 0x1000 +#define COLOR_MODE_C 0x2000 +#define COLOR_MODE_Y 0x4000 +#define COLOR_MODE_M 0x8000 +#define COLOR_MODE_LC 0x10000 +#define COLOR_MODE_LY 0x20000 +#define COLOR_MODE_LM 0x40000 +#define COLOR_MODE_CMYK (COLOR_MODE_C | COLOR_MODE_M | COLOR_MODE_Y | COLOR_MODE_K) +#define COLOR_MODE_CMY (COLOR_MODE_C | COLOR_MODE_M | COLOR_MODE_Y) +#define COLOR_MODE_CcMcYK (COLOR_MODE_C | COLOR_MODE_LC | COLOR_MODE_M | COLOR_MODE_LM | COLOR_MODE_Y | COLOR_MODE_K) +#define COLOR_MODE_CcMcY (COLOR_MODE_C | COLOR_MODE_LC | COLOR_MODE_M | COLOR_MODE_LM | COLOR_MODE_Y) + +#define COLOR_MODE_MASK 0x7f000 +#define PRINT_MODE_MASK 0xf00 +#define COLOR_MODE_PHOTO (COLOR_MODE_LC | COLOR_MODE_LM) + +#define BWR 0 +#define BWL 1 +#define CR 2 +#define CL 3 + + + +static const double standard_sat_adjustment[49] = +{ + 1.0, /* C */ + 1.1, + 1.2, + 1.3, + 1.4, + 1.5, + 1.6, + 1.7, + 1.8, /* B */ + 1.9, + 1.9, + 1.9, + 1.7, + 1.5, + 1.3, + 1.1, + 1.0, /* M */ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, /* R */ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, /* Y */ + 1.0, + 1.0, + 1.1, + 1.2, + 1.3, + 1.4, + 1.5, + 1.5, /* G */ + 1.4, + 1.3, + 1.2, + 1.1, + 1.0, + 1.0, + 1.0, + 1.0 /* C */ +}; + +static const double standard_lum_adjustment[49] = +{ + 0.50, /* C */ + 0.6, + 0.7, + 0.8, + 0.9, + 0.86, + 0.82, + 0.79, + 0.78, /* B */ + 0.8, + 0.83, + 0.87, + 0.9, + 0.95, + 1.05, + 1.15, + 1.3, /* M */ + 1.25, + 1.2, + 1.15, + 1.12, + 1.09, + 1.06, + 1.03, + 1.0, /* R */ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, /* Y */ + 0.9, + 0.8, + 0.7, + 0.65, + 0.6, + 0.55, + 0.52, + 0.48, /* G */ + 0.47, + 0.47, + 0.49, + 0.49, + 0.49, + 0.52, + 0.51, + 0.50 /* C */ +}; + +static const double standard_hue_adjustment[49] = +{ + 0.00, /* C */ + 0.05, + 0.04, + 0.01, + -0.03, + -0.10, + -0.18, + -0.26, + -0.35, /* B */ + -0.43, + -0.40, + -0.32, + -0.25, + -0.18, + -0.10, + -0.07, + 0.00, /* M */ + -0.04, + -0.09, + -0.13, + -0.18, + -0.23, + -0.27, + -0.31, + -0.35, /* R */ + -0.38, + -0.30, + -0.23, + -0.15, + -0.08, + 0.00, + -0.02, + 0.00, /* Y */ + 0.08, + 0.10, + 0.08, + 0.05, + 0.03, + -0.03, + -0.12, + -0.20, /* G */ + -0.17, + -0.20, + -0.17, + -0.15, + -0.12, + -0.10, + -0.08, + 0.00, /* C */ +}; + + +static const double plain_paper_lum_adjustment[49] = +{ + 1.2, /* C */ + 1.22, + 1.28, + 1.34, + 1.39, + 1.42, + 1.45, + 1.48, + 1.5, /* B */ + 1.4, + 1.3, + 1.25, + 1.2, + 1.1, + 1.05, + 1.05, + 1.05, /* M */ + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, + 1.05, /* R */ + 1.05, + 1.05, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, + 1.1, /* Y */ + 1.15, + 1.3, + 1.45, + 1.6, + 1.75, + 1.9, + 2.0, + 2.1, /* G */ + 2.0, + 1.8, + 1.7, + 1.6, + 1.5, + 1.4, + 1.3, + 1.2 /* C */ +}; + + +/* Codes for possible ink-tank combinations. + * Each combo is represented by the colors that can be used with + * the installed ink-tank(s) + * Combinations of the codes represent the combinations allowed for a model + */ +#define LEXMARK_INK_K 1 +#define LEXMARK_INK_CMY 2 +#define LEXMARK_INK_CMYK 4 +#define LEXMARK_INK_CcMmYK 8 +#define LEXMARK_INK_CcMmYy 16 +#define LEXMARK_INK_CcMmYyK 32 + +#define LEXMARK_INK_BLACK_MASK (LEXMARK_INK_K|LEXMARK_INK_CMYK|\ + LEXMARK_INK_CcMmYK|LEXMARK_INK_CcMmYyK) + +#define LEXMARK_INK_PHOTO_MASK (LEXMARK_INK_CcMmYy|LEXMARK_INK_CcMmYK|\ + LEXMARK_INK_CcMmYyK) + +/* document feeding */ +#define LEXMARK_SLOT_ASF1 1 +#define LEXMARK_SLOT_ASF2 2 +#define LEXMARK_SLOT_MAN1 4 +#define LEXMARK_SLOT_MAN2 8 + +/* model peculiarities */ +#define LEXMARK_CAP_DMT 1<<0 /* Drop Modulation Technology */ +#define LEXMARK_CAP_MSB_FIRST 1<<1 /* how to send data */ +#define LEXMARK_CAP_CMD61 1<<2 /* uses command #0x61 */ +#define LEXMARK_CAP_CMD6d 1<<3 /* uses command #0x6d */ +#define LEXMARK_CAP_CMD70 1<<4 /* uses command #0x70 */ +#define LEXMARK_CAP_CMD72 1<<5 /* uses command #0x72 */ + + +static const int lr_shift_color[10] = { 9, 18, 2*18 }; /* vertical distance between ever 2nd inkjet (related to resolution) */ +static const int lr_shift_black[10] = { 9, 18, 2*18 }; /* vertical distance between ever 2nd inkjet (related to resolution) */ + +/* returns the offset of the first jet when printing in the other direction */ +static int get_lr_shift(int mode) +{ + + const int *ptr_lr_shift; + + /* K could only be present if black is printed only. */ + if((mode & COLOR_MODE_K) == (mode & COLOR_MODE_MASK)) { + ptr_lr_shift = lr_shift_black; + } else { + ptr_lr_shift = lr_shift_color; + } + + switch(mode & PRINT_MODE_MASK) { + case PRINT_MODE_300: + return ptr_lr_shift[0]; + break; + case PRINT_MODE_600: + return ptr_lr_shift[1]; + break; + case PRINT_MODE_1200: + return ptr_lr_shift[2]; + break; + case PRINT_MODE_2400: + return ptr_lr_shift[2]; + break; + } + return 0; +} + + +/* + * head offsets for z52: + * + * black black color photo + * cartridge cartridge cartridge cartridge + * mode I mode II + * + * v +-----+ -- +-----+ --- + * --- +-----+ --- v | | ^ | | ^ + * ^ | | --- +-----+ --- -- | C | 64 | LC | | + * | | | ^ | | ^ 40 | | v v | | | + * | | | | | | -- +-----+ -- -- +-----+ | + * | | | | | | ^ 28 | + * | | | | | | +-----+ -- -- +-----+ | + * | | | | | | | ^ ^ | | | + * 208 | K | | K | 192 | M | 64 | LM | 240 + * | | | | | | | v v | | | + * | | | | | | +-----+ -- -- +-----+ | + * | | | | | | v 28 | + * | | | | | | -- +-----+ -- -- +-----+ | + * | | | | | v 40 | | ^ ^ | | | + * v | | +-----+ --- -- | Y | 64 | K | | + * --- +-----+ ^ | | v | | v + * +-----+ -- +-----+ --- + * + */ + +static const int head_offset_cmyk[] = +{70, 184, 368, 0, 184, 368, 0}; /* k, m, c, y, M, C, Y */ +/* the head_offset_cmy is needed because the dithering code is going into troubles if there is an offset different from 0 for the unused black color */ +static const int head_offset_cmy[] = +{0, 184, 368, 0, 184, 368, 0}; /* k, m, c, y, M, C, Y */ +static const int head_offset_cCmMyk[] = +{0, 184, 368, 0, 184, 368, 0}; /* k, m, c, y, M, C, Y */ + + + + +/**************************************************************************/ +/**** Data structures which are describing printer specific parameters ****/ + +/* resolution specific parameters (substructure of lexmark_cap_t) */ +typedef struct { + const char *name; + const char *text; + int hres; + int vres; + int softweave; + int vertical_passes; + int vertical_oversample; + int unidirectional; /* print bi/unidirectional */ + int resid; /* resolution id */ +} lexmark_res_t; + +#define LEXM_RES_COUNT 30 +typedef lexmark_res_t lexmark_res_t_array[LEXM_RES_COUNT]; + + +/* ink type parameters (substructure of lexmark_cap_t) */ +typedef struct { + unsigned int output_type; /* type of output */ + int ncolors; + unsigned int used_colors; /* specifies the head colors to be used (e.g. COLOR_MODE_K */ + unsigned int pass_length; /* avaliable jets for one color */ + int v_top_head_offset; /* offset from top, wehere the first jet will be found */ + int h_catridge_offset; /* horizontal offset of cartridges */ + int h_direction_offset; /* Offset when printing in the other direction */ + const int *head_offset; /* specifies the offset of head colors */ +} lexmark_inkparam_t; + +typedef struct +{ + const char *name; + const char *text; + lexmark_inkparam_t ink_parameter[4]; +} lexmark_inkname_t; + + +/* main structure which describes all printer specific parameters */ +typedef struct { + Lex_model model; /* printer model */ + int max_paper_width; /* maximum printable paper size in 1/72 inch */ + int max_paper_height; + int min_paper_width; /* Maximum paper width, in points */ + int min_paper_height; /* Maximum paper height, in points */ + int max_xdpi; + int max_ydpi; + int max_quality; + int border_left; /* unit is 72 DPI */ + int border_right; + int border_top; + int border_bottom; + int inks; /* installable cartridges (LEXMARK_INK_*) */ + int slots; /* available paperslots */ + int features; /* special bjl settings */ + /*** printer internal parameters ***/ + /* the unit of the following parameters is identical with max phys unit of the printer */ + int offset_left_border; /* Offset to the left paper border (== border_left=0) */ + int offset_top_border; /* Offset to the top paper border (== border_top=0) */ + int x_raster_res; /* horizontal resolution for positioning of the printer head in DPI */ + int y_raster_res; /* vertical resolution for positioning of the printer head in DPI */ + const lexmark_res_t_array *res_parameters; /* resolution specific parameters; last entry has resid = -1 */ + const lexmark_inkname_t *ink_types; /* type of supported inks */ + const double *lum_adjustment; + const double *hue_adjustment; + const double *sat_adjustment; +} lexmark_cap_t; + + +/*****************************************************************/ +/**** initialize printer specific data structures ****/ + +/* + * z52 specific parameters + */ +#define LX_Z52_300_DPI 1 +#define LX_Z52_600_DPI 3 +#define LX_Z52_1200_DPI 4 +#define LX_Z52_2400_DPI 5 + +#define LX_Z52_COLOR_PRINT 0 +#define LX_Z52_BLACK_PRINT 1 + +#define LX_PSHIFT 0x13 +#define LX_Z52_COLOR_MODE_POS 0x9 +#define LX_Z52_RESOLUTION_POS 0x7 +#define LX_Z52_PRINT_DIRECTION_POS 0x8 + +/*static const int IDX_Z52ID =2;*/ +static const int IDX_SEQLEN=3; + +/* + head: + 1 .. black, + 0 .. color + + resolution: + 1 .. 300 dpi (for black ?) + 2 .. like 1 + 3 .. 600 dpi (color&black) + 4 .. 1200 dpi + 5 .. ? like 1 +*/ + +#define LXM_Z52_HEADERSIZE 34 +static const unsigned char outbufHeader_z52[LXM_Z52_HEADERSIZE]= +{ + 0x1B,0x2A,0x24,0x00,0x00,0xFF,0xFF, /* number of packets ---- vvvvvvvvv */ + 0x01,0x01,0x01,0x1a,0x03,0x01, /* 0x7-0xc: resolution, direction, head */ + 0x03,0x60, /* 0xd-0xe HE */ + 0x04,0xe0, /* 0xf-0x10 HS vertical pos */ + 0x19,0x5c, /* 0x11-0x12 */ + 0x0,0x0, /* 0x13-0x14 VO between packges*/ + 0x0,0x80, /* 0x15-0x16 */ + 0x0,0x0,0x0,0x0,0x1,0x2,0x0,0x0,0x0,0x0,0x0 /* 0x17-0x21 */ +}; + +#define LXM_Z42_HEADERSIZE 34 +static const unsigned char outbufHeader_z42[LXM_Z42_HEADERSIZE]= +{ + 0x1B,0x2A,0x24,0x00,0x00,0x00,0x00, + 0x01,0x01,0x01,0x18,0x00,0x01,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00 +}; + + +static const lexmark_res_t_array lexmark_reslist_z52 = /* LEXM_RES_COUNT entries are allowed !! */ +{ + /* name hres vres softw v_pass overs unidir resid */ + { "300x600dpi", N_ ("300 DPI x 600 DPI"), 300, 600, 0, 1, 1, 0, DPI300 }, + { "600dpi", N_ ("600 DPI"), 600, 600, 0, 1, 1, 0, DPI600 }, + { "600hq", N_ ("600 DPI high quality"), 600, 600, 1, 4, 1, 0, DPI600 }, + { "600uni", N_ ("600 DPI Unidirectional"), 600, 600, 0, 1, 1, 1, DPI600 }, + { "1200dpi", N_ ("1200 DPI"), 1200, 1200, 1, 1, 1, 0, DPI1200}, + { "1200hq", N_ ("1200 DPI high quality"), 1200, 1200, 1, 1, 1, 0, DPI300 }, + { "1200hq2", N_ ("1200 DPI highest quality"), 1200, 1200, 1, 1, 1, 0, DPI600 }, + { "1200uni", N_ ("1200 DPI Unidirectional"), 1200, 1200, 0, 1, 1, 1, DPI1200}, + { "2400x1200dpi", N_ ("2400 DPI x 1200 DPI"), 2400, 1200, 1, 1, 1, 0, DPI1200}, + { "2400x1200hq", N_ ("2400 DPI x 1200 DPI high quality"), 2400, 1200, 1, 1, 1, 0, DPI600 }, + { "2400x1200hq2", N_ ("2400 DPI x 1200 DPI highest quality"),2400, 1200, 1, 1, 1, 0, DPI300}, +#ifdef DEBUG + { "testprint", N_ ("test print"), 1200, 1200, 1, 1, 1, 0, DPItest}, +#endif + { "", "", 0, 0, 0, 0, 0, -1 } +}; + + +static const lexmark_inkname_t ink_types_z52[] = +{ + /* output_type ncolors used_colors pass_length v_top_head_offset + * h_catridge_offset + * h_direction_offset + * head_offset */ + { "CMYK", N_("Four Color Standard"), + {{ OUTPUT_GRAY, 1, COLOR_MODE_K, 208, 324, 0, 10, head_offset_cmyk }, + { OUTPUT_COLOR, 4, COLOR_MODE_CMYK, 192/3, 0, 0, 10, head_offset_cmyk }, + { OUTPUT_MONOCHROME, 1, COLOR_MODE_K, 208, 324, 0, 10, head_offset_cmyk }, + { OUTPUT_RAW_CMYK, 4, COLOR_MODE_CMYK, 192/3, 0, 0, 10, head_offset_cmyk }}}, + { "RGB", N_("Three Color Composite"), + {{ OUTPUT_GRAY, 1, COLOR_MODE_K, 208, 324, 0, 10, head_offset_cmyk }, /* we ignor CMY, use black */ + { OUTPUT_COLOR, 4, COLOR_MODE_CMY, 192/3, 0, 0, 10, head_offset_cmy }, + { OUTPUT_MONOCHROME, 1, COLOR_MODE_K, 208, 324, 0, 10, head_offset_cmyk }, /* we ignor CMY, use black */ + { OUTPUT_RAW_CMYK, 4, COLOR_MODE_CMY, 192/3, 0, 0, 10, head_offset_cmy }}}, + { "PhotoCMYK", N_("Six Color Photo"), + {{OUTPUT_MONOCHROME, 1, COLOR_MODE_K, 192/3, 0, 0, 10, head_offset_cCmMyk }, + { OUTPUT_COLOR, 6, COLOR_MODE_CcMcYK, 192/3, 0, 0, 10, head_offset_cCmMyk }, + { OUTPUT_GRAY, 1, COLOR_MODE_K, 192/3, 0, 0, 10, head_offset_cCmMyk }, + { OUTPUT_RAW_CMYK, 6, COLOR_MODE_CcMcYK, 192/3, 0, 0, 10, head_offset_cCmMyk }}}, + { "PhotoCMY", N_("Five Color Photo Composite"), + {{ OUTPUT_MONOCHROME, 1, COLOR_MODE_K, 208, 324, 0, 10, head_offset_cCmMyk }, /* we ignor CMY, use black */ + { OUTPUT_COLOR, 5, COLOR_MODE_CcMcY, 192/3, 0, 0, 10, head_offset_cCmMyk }, + { OUTPUT_GRAY, 1, COLOR_MODE_K, 208, 324, 0, 10, head_offset_cCmMyk }, /* we ignor CMY, use black */ + { OUTPUT_RAW_CMYK, 5, COLOR_MODE_CcMcY, 192/3, 0, 0, 10, head_offset_cCmMyk }}}, + { "Gray", N_("Black"), + {{ OUTPUT_GRAY, 1, COLOR_MODE_K, 208, 324, 0, 10, head_offset_cmyk }, + { OUTPUT_COLOR, 1, COLOR_MODE_K, 208, 324, 0, 10, head_offset_cmyk }, + { OUTPUT_MONOCHROME, 1, COLOR_MODE_K, 208, 324, 0, 10, head_offset_cmyk }, + { OUTPUT_RAW_CMYK, 1, COLOR_MODE_K, 208, 324, 0, 10, head_offset_cmyk }}}, + { NULL, NULL } +}; + + + +/* + * 3200 sepecific stuff + */ +#define LXM3200_LEFTOFFS 6254 +#define LXM3200_RIGHTOFFS (LXM3200_LEFTOFFS-2120) + +static int lxm3200_headpos = 0; +static int lxm3200_linetoeject = 0; + +#define LXM_3200_HEADERSIZE 24 +static const char outbufHeader_3200[LXM_3200_HEADERSIZE] = +{ + 0x1b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1b, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1b, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static inline int +lexmark_calc_3200_checksum(unsigned char *data) +{ + int ck, i; + + ck = 0; + for(i=1; i<7; i++)ck += data[i]; + + return(ck & 255); +} + + +static const lexmark_res_t_array lexmark_reslist_3200 = /* LEXM_RES_COUNT entries are allowed !! */ +{ + /* name hres vres softw v_pass overs unidir resid */ + { "300x600dpi", N_ ("300 DPI x 600 DPI"), 300, 600, 0, 1, 1, 0, DPI300 }, + { "600dpi", N_ ("600 DPI"), 600, 600, 0, 1, 1, 0, DPI600 }, + { "600hq", N_ ("600 DPI high quality"), 600, 600, 1, 4, 1, 0, DPI600 }, + { "600uni", N_ ("600 DPI Unidirectional"), 600, 600, 0, 1, 1, 1, DPI600 }, + { "1200dpi", N_ ("1200 DPI"), 1200, 1200, 1, 1, 1, 0, DPI1200}, + { "1200hq", N_ ("1200 DPI high quality"), 1200, 1200, 1, 1, 1, 0, DPI300 }, + { "1200hq2", N_ ("1200 DPI highest quality"), 1200, 1200, 1, 1, 1, 0, DPI600 }, + { "1200uni", N_ ("1200 DPI Unidirectional"), 1200, 1200, 0, 1, 1, 1, DPI1200}, + { "", "", 0, 0, 0, 0, 0, -1 } +}; + + +static const lexmark_inkname_t ink_types_3200[] = +{ + /* output_type ncolors used_colors pass_length v_top_head_offset + * h_catridge_offset + * h_direction_offset + * head_offset */ + { "CMYK", N_("Four Color Standard"), + {{ OUTPUT_GRAY, 1, COLOR_MODE_K, 208, 20, 0, 12, head_offset_cmyk }, + { OUTPUT_COLOR, 4, COLOR_MODE_CMYK, 192/3, 0, 0, 12, head_offset_cmyk }, + { OUTPUT_MONOCHROME, 1, COLOR_MODE_K, 208, 20, 0, 12, head_offset_cmyk }, + { OUTPUT_RAW_CMYK, 4, COLOR_MODE_CMYK, 192/3, 0, 0, 12, head_offset_cmyk }}}, + { "RGB", N_("Three Color Composite"), + {{ OUTPUT_GRAY, 1, COLOR_MODE_K, 208, 20, 0, 12, head_offset_cmyk }, /* we ignor CMY, use black */ + { OUTPUT_COLOR, 4, COLOR_MODE_CMY, 192/3, 0, 0, 12, head_offset_cmy }, + { OUTPUT_MONOCHROME, 1, COLOR_MODE_K, 208, 20, 0, 12, head_offset_cmyk }, /* we ignor CMY, use black */ + { OUTPUT_RAW_CMYK, 4, COLOR_MODE_CMY, 192/3, 0, 0, 12, head_offset_cmy }}}, + { "PhotoCMYK", N_("Six Color Photo"), + {{OUTPUT_MONOCHROME, 1, COLOR_MODE_K, 192/3, 0, 0, 12, head_offset_cCmMyk }, + { OUTPUT_COLOR, 6, COLOR_MODE_CcMcYK, 192/3, 0, 0, 12, head_offset_cCmMyk }, + { OUTPUT_GRAY, 1, COLOR_MODE_K, 192/3, 0, 0, 12, head_offset_cCmMyk }, + { OUTPUT_RAW_CMYK, 6, COLOR_MODE_CcMcYK, 192/3, 0, 0, 12, head_offset_cCmMyk }}}, + { "PhotoCMY", N_("Five Color Photo Composite"), + {{ OUTPUT_MONOCHROME, 1, COLOR_MODE_K, 208, 20, 0, 12, head_offset_cCmMyk }, /* we ignor CMY, use black */ + { OUTPUT_COLOR, 5, COLOR_MODE_CcMcY, 192/3, 0, 0, 12, head_offset_cCmMyk }, + { OUTPUT_GRAY, 1, COLOR_MODE_K, 208, 20, 0, 12, head_offset_cCmMyk }, /* we ignor CMY, use black */ + { OUTPUT_RAW_CMYK, 5, COLOR_MODE_CcMcY, 192/3, 0, 0, 12, head_offset_cCmMyk }}}, + { NULL, NULL } +}; + + + + + +/* main structure */ +static const lexmark_cap_t lexmark_model_capabilities[] = +{ + /* default settings for unkown models */ + + { (Lex_model)-1, 8*72,11*72,180,180,20,20,20,20, LEXMARK_INK_K, LEXMARK_SLOT_ASF1, 0 }, + + /* tested models */ + + { /* Lexmark z52 */ + m_z52, + 618, 936, /* max paper size *//* 8.58" x 13 " */ + INCH(2), INCH(4), /* min paper size */ + 2400, 1200, 2, /* max resolution */ + 0, 0, 5, 15, /* 15 36 border l,r,t,b unit is 1/72 DPI */ + LEXMARK_INK_CMY | LEXMARK_INK_CMYK | LEXMARK_INK_CcMmYK, + LEXMARK_SLOT_ASF1 | LEXMARK_SLOT_MAN1, + LEXMARK_CAP_DMT, + /*** printer internal parameters ***/ + 20, /* real left paper border */ + 123, /* real top paper border */ + 2400, /* horizontal resolution of 2400 dpi for positioning */ + 1200, /* use a vertical resolution of 1200 dpi for positioning */ + &lexmark_reslist_z52, /* resolution specific parameters of z52 */ + ink_types_z52, /* supported inks */ + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment + }, + { /* Lexmark z42 */ + m_z42, + 618, 936, /* max paper size *//* 8.58" x 13 " */ + INCH(2), INCH(4), /* min paper size */ + 2400, 1200, 2, /* max resolution */ + 0, 0, 5, 15, /* 15 36 border l,r,t,b unit is 1/72 DPI */ + LEXMARK_INK_CMY | LEXMARK_INK_CMYK | LEXMARK_INK_CcMmYK, + LEXMARK_SLOT_ASF1 | LEXMARK_SLOT_MAN1, + LEXMARK_CAP_DMT, + /*** printer internal parameters ***/ + 20, /* real left paper border */ + 123, /* real top paper border */ + 2400, /* horizontal resolution of 2400 dpi for positioning */ + 1200, /* use a vertical resolution of 1200 dpi for positioning */ + &lexmark_reslist_z52, /* resolution specific parameters of z52 */ + ink_types_z52, /* supported inks */ + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment + }, + { /* Lexmark 3200 */ + m_3200, + 618, 936, /* 8.58" x 13 " */ + INCH(2), INCH(4), /* min paper size */ + 1200, 1200, 2, + 11, 9, 10, 18, + LEXMARK_INK_CMYK | LEXMARK_INK_CcMmYK, + LEXMARK_SLOT_ASF1 | LEXMARK_SLOT_MAN1, + LEXMARK_CAP_DMT, + /*** printer internal parameters ***/ + 0, /* real left paper border */ + 300, /* real top paper border */ + 1200, /* horizontal resolution of ?? dpi for positioning */ + 1200, /* use a vertical resolution of 1200 dpi for positioning */ + &lexmark_reslist_3200, /* resolution specific parameters of 3200 */ + ink_types_3200, /* supported inks */ + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment + }, + { /* */ + m_lex7500, + 618, 936, /* 8.58" x 13 " */ + INCH(2), INCH(4), /* min paper size */ + 2400, 1200, 2, + 11, 9, 10, 18, + LEXMARK_INK_CMY | LEXMARK_INK_CMYK | LEXMARK_INK_CcMmYK, + LEXMARK_SLOT_ASF1 | LEXMARK_SLOT_MAN1, + LEXMARK_CAP_DMT, + /*** printer internal parameters ***/ + 0, /* real left paper border */ + 300, /* real top paper border */ + 1200, /* horizontal resolutio of ??? dpi for positioning */ + 1200, /* use a vertical resolution of 1200 dpi for positioning */ + &lexmark_reslist_3200, /* resolution specific parameters of ?? */ + ink_types_3200, /* supported inks */ + standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment + }, +}; + + + + + +typedef struct lexm_privdata_weave { + const lexmark_inkparam_t *ink_parameter; + int bidirectional; /* tells us if we are allowed to print bidirectional */ + int direction; /* stores the last direction or print head */ + unsigned char *outbuf; +} lexm_privdata_weave; + + +/* + * internal functions + */ +static int model_to_index(int model) +{ + int i; + int models= sizeof(lexmark_model_capabilities) / sizeof(lexmark_cap_t); + for (i=0; iink_types; + + for (i=0; ((ink_type[i].name != NULL) && + (strcmp(name, ink_type[i].name) != 0)); i++) ; + return &(ink_type[i]); +} + +static const lexmark_inkparam_t * +lexmark_get_ink_parameter(const char *name, int output_type, const lexmark_cap_t * caps, stp_vars_t nv) +{ + int i; + const lexmark_inkname_t *ink_type = lexmark_get_ink_type(name, output_type, caps); + + if (ink_type->name == NULL) { + return (NULL); /* not found ! */ + } + + for (i=0; (ink_type->ink_parameter[i].output_type != output_type); i++) ; + return &(ink_type->ink_parameter[i]); +} + + +static const paper_t * +get_media_type(const char *name, const lexmark_cap_t * caps) +{ + int i; + for (i = 0; i < paper_type_count; i++) + { + if (!strcmp(name, lexmark_paper_list[i].name)) + return &(lexmark_paper_list[i]); + } + return NULL; +} + +static int +lexmark_source_type(const char *name, const lexmark_cap_t * caps) +{ + if (!strcmp(name,"Auto")) return 4; + if (!strcmp(name,"Manual")) return 0; + if (!strcmp(name,"ManualNP")) return 1; + +#ifdef DEBUG + stp_erprintf("lexmark: Unknown source type '%s' - reverting to auto\n",name); +#endif + return 4; +} + + + +/******************************* +lexmark_head_offset +*******************************/ +static const stp_lineoff_t * +lexmark_head_offset(int ydpi, /* i */ + const char *ink_type, /* i */ + const lexmark_cap_t * caps, /* i */ + const lexmark_inkparam_t *ink_parameter, /* i */ + stp_lineoff_t *lineoff_buffer) /* o */ +{ + int i; + +#ifdef DEBUG + stp_erprintf(" sizie %d, size_v %d, size_v[0] %d\n", sizeof(*lineoff_buffer), sizeof(lineoff_buffer->v), sizeof(lineoff_buffer->v[0])); +#endif + memcpy(lineoff_buffer, ink_parameter->head_offset, sizeof(*lineoff_buffer)); + + for (i=0; i < (sizeof(lineoff_buffer->v) / sizeof(lineoff_buffer->v[0])); i++) { + lineoff_buffer->v[i] /= (caps->y_raster_res / ydpi); + } + return (lineoff_buffer); +} + + +#if 0 +/******************************* +lexmark_size_type +*******************************/ +/* This method is actually not used. + Is there a possibility to set such value ???????????? */ +static unsigned char +lexmark_size_type(const stp_vars_t v, const lexmark_cap_t * caps) +{ + const stp_papersize_t pp = stp_get_papersize_by_size(stp_get_page_height(v), + stp_get_page_width(v)); + if (pp) + { + const char *name = stp_papersize_get_name(pp); + /* built ins: */ + if (!strcmp(name,"A5")) return 0x01; + if (!strcmp(name,"A4")) return 0x03; + if (!strcmp(name,"B5")) return 0x08; + if (!strcmp(name,"Letter")) return 0x0d; + if (!strcmp(name,"Legal")) return 0x0f; + if (!strcmp(name,"COM10")) return 0x16; + if (!strcmp(name,"DL")) return 0x17; + if (!strcmp(name,"LetterExtra")) return 0x2a; + if (!strcmp(name,"A4Extra")) return 0x2b; + if (!strcmp(name,"w288h144")) return 0x2d; + /* custom */ + +#ifdef DEBUG + stp_erprintf("lexmark: Unknown paper size '%s' - using custom\n",name); + } else { + stp_erprintf("lexmark: Couldn't look up paper size %dx%d - " + "using custom\n",stp_get_page_height(v), stp_get_page_width(v)); +#endif + } + return 0; +} +#endif + + +static int lexmark_get_phys_resolution_vertical(const stp_printer_t printer) +{ + return 600; +} + +#if 0 +static int lexmark_get_phys_resolution_horizontal(const stp_printer_t printer) +{ + return 1200; +} +#endif + +static char * +c_strdup(const char *s) +{ + char *ret = stp_malloc(strlen(s) + 1); + strcpy(ret, s); + return ret; +} + + +static const lexmark_res_t +*lexmark_get_resolution_para(const stp_printer_t printer, + const char *resolution) +{ + const lexmark_cap_t * caps= lexmark_get_model_capabilities(stp_printer_get_model(printer)); + + const lexmark_res_t *res = *(caps->res_parameters); /* get the resolution specific parameters of printer */ + + + while (res->hres) + { + if (res->vres <= caps->max_ydpi != -1 && + res->hres <= caps->max_xdpi != -1 && + !strcmp(resolution, res->name)) + { + return res; + } + res++; + } + stp_erprintf("lexmark_get_resolution_para: resolution not found (%s)\n", resolution); + return NULL; +} + + +static int +lexmark_print_bidirectional(const stp_printer_t printer, + const char *resolution) +{ + const lexmark_res_t *res_para = lexmark_get_resolution_para(printer, resolution); + return !res_para->unidirectional; +} + +static const double * +lexmark_lum_adjustment(const lexmark_cap_t * caps, const stp_vars_t v) +{ + return (caps->lum_adjustment); +} + +static const double * +lexmark_hue_adjustment(const lexmark_cap_t * caps, const stp_vars_t v) +{ + return (caps->hue_adjustment); +} + +static const double * +lexmark_sat_adjustment(const lexmark_cap_t * caps, const stp_vars_t v) +{ + return (caps->sat_adjustment); +} + + +static void +lexmark_describe_resolution(const stp_printer_t printer, + const char *resolution, int *x, int *y) +{ + const lexmark_res_t *res = lexmark_get_resolution_para(printer, resolution); + + if (res) + { + *x = res->hres; + *y = res->vres; + return; + } + *x = -1; + *y = -1; +} + + + +static stp_param_t media_sources[] = +{ + { "Auto", N_("Auto Sheet Feeder") }, + { "Manual", N_("Manual with Pause") }, + { "ManualNP", N_("Manual without Pause") } +}; + + +/* + * 'lexmark_parameters()' - Return the parameter values for the given parameter. + */ + +static stp_param_t * /* O - Parameter values */ +lexmark_parameters(const stp_printer_t printer, /* I - Printer model */ + const char *ppd_file, /* I - PPD file (not used) */ + const char *name, /* I - Name of parameter */ + int *count) /* O - Number of values */ +{ + int i; + stp_param_t *p= 0; + stp_param_t *valptrs= 0; + + const lexmark_cap_t * caps= lexmark_get_model_capabilities(stp_printer_get_model(printer)); + + if (count == NULL) + return (NULL); + + *count = 0; + + if (name == NULL) + return (NULL); + + if (strcmp(name, "PageSize") == 0) + { + unsigned int height_limit, width_limit; + unsigned int min_height_limit, min_width_limit; + int papersizes = stp_known_papersizes(); + valptrs = stp_malloc(sizeof(stp_param_t) * papersizes); + *count = 0; + + width_limit = caps->max_paper_width; + height_limit = caps->max_paper_height; + min_width_limit = caps->min_paper_width; + min_height_limit = caps->min_paper_height; + + for (i = 0; i < papersizes; i++) { + const stp_papersize_t pt = stp_get_papersize_by_index(i); + unsigned int pwidth = stp_papersize_get_width(pt); + unsigned int pheight = stp_papersize_get_height(pt); + if (strlen(stp_papersize_get_name(pt)) > 0 && + pwidth <= width_limit && pheight <= height_limit && + (pheight >= min_height_limit || pheight == 0) && + (pwidth >= min_width_limit || pwidth == 0)) + { + valptrs[*count].name = c_strdup(stp_papersize_get_name(pt)); + valptrs[*count].text = c_strdup(stp_papersize_get_text(pt)); + (*count)++; + } + } + return (valptrs); + } + else if (strcmp(name, "Resolution") == 0) + { + int c= 0; + const lexmark_res_t *res; + + res = *(caps->res_parameters); /* get resolution specific parameters of printer */ + for (i=0; res[i].hres; i++); /* get number of entries */ + valptrs = stp_malloc(sizeof(stp_param_t) * i); + + /* check for allowed resolutions */ + while (res->hres) + { + valptrs[c].name = c_strdup(res->name); + valptrs[c++].text = c_strdup(_(res->text)); + res++; + } + *count= c; + return (valptrs); + } + else if (strcmp(name, "InkType") == 0) + { + for (i = 0; caps->ink_types[i].name != NULL; i++); /* get number of entries */ + valptrs = stp_malloc(sizeof(stp_param_t) * i); + + *count = 0; + for (i = 0; caps->ink_types[i].name != NULL; i++) + { + valptrs[*count].name = c_strdup(caps->ink_types[i].name); + valptrs[*count].text = c_strdup(_(caps->ink_types[i].text)); + (*count)++; + } + return valptrs; + } + else if (strcmp(name, "MediaType") == 0) + { + int nmediatypes = paper_type_count; + valptrs = stp_malloc(sizeof(stp_param_t) * nmediatypes); + for (i = 0; i < nmediatypes; i++) + { + valptrs[i].name = c_strdup(lexmark_paper_list[i].name); + valptrs[i].text = c_strdup(_(lexmark_paper_list[i].text)); + } + *count = nmediatypes; + return valptrs; + } + else if (strcmp(name, "InputSlot") == 0) + { + *count = 3; + p = media_sources; + } + else + return (NULL); + + valptrs = stp_malloc(*count * sizeof(stp_param_t)); + for (i = 0; i < *count; i ++) + { + /* translate media_types and media_sources */ + valptrs[i].name = c_strdup(p[i].name); + valptrs[i].text = c_strdup(_(p[i].text)); + } + + return (valptrs); +} + +static const char * +lexmark_default_parameters(const stp_printer_t printer, + const char *ppd_file, + const char *name) +{ + int i; + + const lexmark_cap_t * caps= lexmark_get_model_capabilities(stp_printer_get_model(printer)); + + if (name == NULL) + return (NULL); + + if (strcmp(name, "PageSize") == 0) + { + unsigned int height_limit, width_limit; + unsigned int min_height_limit, min_width_limit; + int papersizes = stp_known_papersizes(); + + width_limit = caps->max_paper_width; + height_limit = caps->max_paper_height; + min_width_limit = caps->min_paper_width; + min_height_limit = caps->min_paper_height; + + for (i = 0; i < papersizes; i++) + { + const stp_papersize_t pt = stp_get_papersize_by_index(i); + if (strlen(stp_papersize_get_name(pt)) > 0 && + stp_papersize_get_width(pt) >= min_width_limit && + stp_papersize_get_height(pt) >= min_height_limit && + stp_papersize_get_width(pt) <= width_limit && + stp_papersize_get_height(pt) <= height_limit) + { + return (stp_papersize_get_name(pt)); + } + } + return NULL; + } + else if (strcmp(name, "Resolution") == 0) + { + const lexmark_res_t *res = NULL; + + res = *(caps->res_parameters); /* get resolution specific parameters of printer */ + /* check for allowed resolutions */ + if (res->hres) + { + return (res->name); + } + return NULL; + } + else if (strcmp(name, "InkType") == 0) + { + return (caps->ink_types[0].name); + } + else if (strcmp(name, "MediaType") == 0) + { + return (lexmark_paper_list[0].name); + } + else if (strcmp(name, "InputSlot") == 0) + { + return (media_sources[0].name); + } + else + return (NULL); +} + + +/* + * 'lexmark_imageable_area()' - Return the imageable area of the page. + */ + +static void +lexmark_imageable_area(const stp_printer_t printer, /* I - Printer model */ + const stp_vars_t v, /* I */ + int *left, /* O - Left position in points */ + int *right, /* O - Right position in points */ + int *bottom, /* O - Bottom position in points */ + int *top) /* O - Top position in points */ +{ + int width, length; /* Size of page */ + + const lexmark_cap_t * caps= lexmark_get_model_capabilities(stp_printer_get_model(printer)); + + stp_default_media_size(printer, v, &width, &length); + + *left = caps->border_left; + *right = width - caps->border_right; + *top = length - caps->border_top; + *bottom = caps->border_bottom; + + lxm3200_linetoeject = (length * 1200) / 72; +} + +static void +lexmark_limit(const stp_printer_t printer, /* I - Printer model */ + const stp_vars_t v, /* I */ + int *width, + int *height, + int *min_width, + int *min_height) +{ + const lexmark_cap_t * caps= lexmark_get_model_capabilities(stp_printer_get_model(printer)); + *width = caps->max_paper_width; + *height = caps->max_paper_height; + *min_width = caps->min_paper_width; + *min_height = caps->min_paper_height; +} + + + +static int +lexmark_init_printer(const stp_vars_t v, const lexmark_cap_t * caps, + int output_type, + const char *source_str, + int xdpi, int ydpi, + int page_width, int page_height, + int top, int left, + int use_dmt) +{ + + /* because the details of the header sequence are not known, we simply write it as one image. */ + +#define LXM_Z52_STARTSIZE 0x35 + /* 300 dpi */ + unsigned char startHeader_z52[LXM_Z52_STARTSIZE]={0x1b,0x2a,0x81,0x00,0x1c,0x56,0x49,0x00, + 0x01,0x00,0x2c,0x01,0x00,0x00,0x60,0x09, + 0xe4,0x0c,0x01,0x00,0x34,0x00,0x00,0x00, + 0x08,0x00,0x08,0x00,0x1b,0x2a,0x07,0x76, + 0x01,0x1b,0x2a,0x07,0x73,0x30,0x1b,0x2a, + 0x6d,0x00,0x14,0x01,0xf4,0x02,0x00,0x01, + 0xf0,0x1b,0x2a,0x07,0x63}; + +#define LXM_Z42_STARTSIZE 0x30 + /* 600 dpi */ + unsigned char startHeader_z42[LXM_Z42_STARTSIZE]={0x1B,0x2A,0x81,0x00,0x1C,0x50,0x41,0x00, + 0x01,0x00,0x58,0x02,0x04,0x00,0xC0,0x12, + 0xC8,0x19,0x02,0x00,0x50,0x00,0x14,0x00, + 0x07,0x00,0x08,0x00,0x1B,0x2A,0x07,0x73, + 0x30,0x1B,0x2A,0x6D,0x00,0x14,0x01,0xC0, + 0x02,0x00,0x01,0xBE,0x1B,0x2A,0x07,0x63}; + + #define ESC2a "\033\052" + + + +#define LXM_3200_STARTSIZE 32 + + unsigned char startHeader_3200[LXM_3200_STARTSIZE] = + { + 0x1b, 0x2a, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1b, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, + 0x1b, 0x30, 0x80, 0x0C, 0x02, 0x00, 0x00, 0xbe, + 0x1b, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21 + }; + + /* write init sequence */ + switch(caps->model) + { + case m_z52: + stp_zfwrite((const char *) startHeader_z52, + LXM_Z52_STARTSIZE,1,v); +#ifdef DEBUG + lex_write_tmp_file(dbgfileprn, (void *)startHeader_z52, LXM_Z52_STARTSIZE); +#endif + case m_z42: + stp_zfwrite((const char *) startHeader_z42, + LXM_Z42_STARTSIZE,1,v); +#ifdef DEBUG + lex_write_tmp_file(dbgfileprn, (void *)startHeader_z42, LXM_Z42_STARTSIZE); +#endif + break; + + case m_3200: + stp_zfwrite((const char *) startHeader_3200, + LXM_3200_STARTSIZE, 1, v); + break; + + default: + stp_erprintf("Unknown printer !! %i\n", caps->model); + return 0; + } + + + + /* +#ifdef DEBUG + stp_erprintf("lexmark: printable size = %dx%d (%dx%d) %02x%02x %02x%02x\n", + page_width,page_height,printable_width,printable_length, + arg_70_1,arg_70_2,arg_70_3,arg_70_4); +#endif + */ + return 1; +} + +static void lexmark_deinit_printer(const stp_vars_t v, const lexmark_cap_t * caps) +{ + + switch(caps->model) { + case m_z52: + { + char buffer[40]; + + memcpy(buffer, ESC2a, 2); + buffer[2] = 0x7; + buffer[3] = 0x65; + +#ifdef DEBUG + stp_erprintf("lexmark: <> %x %x %x %x %lx\n", buffer[0], buffer[1], buffer[2], buffer[3], dbgfileprn); + lex_write_tmp_file(dbgfileprn, (void *)&(buffer[0]), 4); +#endif + /* eject page */ + stp_zfwrite(buffer, 1, 4, v); + } + break; + + case m_z42: + { + unsigned char buffer[12] = {0x1B,0x2A,0x07,0x65,0x1B,0x2A,0x82,0x00,0x00,0x00,0x00,0xAC}; +#ifdef DEBUG + stp_erprintf("lexmark: <>\n"); + lex_write_tmp_file(dbgfileprn, (void *)&(buffer[0]), 12); +#endif + /* eject page */ + stp_zfwrite((char *)buffer, 1, 12, v); + } + break; + + case m_3200: + { + unsigned char buffer[24] = + { + 0x1b, 0x22, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1b, 0x31, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1b, 0x33, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33 + }; + +#ifdef DEBUG + stp_erprintf("Headpos: %d\n", lxm3200_headpos); +#endif + + lxm3200_linetoeject += 2400; + buffer[3] = lxm3200_linetoeject >> 8; + buffer[4] = lxm3200_linetoeject & 0xff; + buffer[7] = lexmark_calc_3200_checksum(&buffer[0]); + buffer[11] = lxm3200_headpos >> 8; + buffer[12] = lxm3200_headpos & 0xff; + buffer[15] = lexmark_calc_3200_checksum(&buffer[8]); + + stp_zfwrite((const char *)buffer, 24, 1, v); + } + break; + + case m_lex7500: + break; + } + +} + + +/* paper_shift() -- shift paper in printer -- units are unknown :-) + */ +static void paper_shift(const stp_vars_t v, int offset, const lexmark_cap_t * caps) +{ + switch(caps->model) { + case m_z52: + case m_z42: + { + unsigned char buf[5] = {0x1b, 0x2a, 0x3, 0x0, 0x0}; + if(offset == 0)return; + buf[3] = (unsigned char)(offset >> 8); + buf[4] = (unsigned char)(offset & 0xFF); + stp_zfwrite((const char *)buf, 1, 5, v); +#ifdef DEBUG + lex_write_tmp_file(dbgfileprn, (void *)buf, 5); +#endif + } + break; + + case m_3200: + { + unsigned char buf[8] = {0x1b, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00}; + if(offset == 0)return; + lxm3200_linetoeject -= offset; + buf[3] = (unsigned char)(offset >> 8); + buf[4] = (unsigned char)(offset & 0xff); + buf[7] = lexmark_calc_3200_checksum(buf); + stp_zfwrite((const char *)buf, 1, 8, v); + } + break; + + case m_lex7500: + break; + } + +#ifdef DEBUG + stp_erprintf("Lines to eject: %d\n", lxm3200_linetoeject); +#endif +} + + +/* + * 'alloc_buffer()' allocates buffer and fills it with 0 + */ +static unsigned char * +lexmark_alloc_buffer(int size) +{ + unsigned char *buf= stp_malloc(size); + if (buf) memset(buf,0,size); + return buf; +} + +/* + * 'advance_buffer()' - Move (num) lines of length (len) down one line + * and sets first line to 0s + * accepts NULL pointers as buf + * !!! buf must contain more than (num) lines !!! + * also sets first line to 0s if num<1 + */ +#if 0 +static void +lexmark_advance_buffer(unsigned char *buf, int len, int num) +{ + if (!buf || !len) return; + if (num>0) memmove(buf+len,buf,len*num); + memset(buf,0,len); +} +#endif + + +static int +clean_color(unsigned char *line, int len) +{ + return 0; +} + + + + + +/********************************************************** + * lexmark_print() - Print an image to a LEXMARK printer. + **********************************************************/ +/* This method should not be printer dependent (mybe it is because of nozzle count and other things) */ +/* The method will set the printing method depending on the selected printer. + It will define the colors to be used and the resolution. + Additionally the pass_length will be defined. + The method lexmark_write() is responsible to handle the received lines + in a correct way. +*/ +static void +lexmark_print(const stp_printer_t printer, /* I - Model */ + stp_image_t *image, /* I - Image to print */ + const stp_vars_t v) +{ + int i; + int y; /* Looping vars */ + int xdpi, ydpi; /* Resolution */ + int n; /* Output number */ + unsigned short *out; /* Output pixels (16-bit) */ + unsigned char *in; /* Input pixels */ + int page_left, /* Left margin of page */ + page_right, /* Right margin of page */ + page_top, /* Top of page */ + page_bottom, /* Bottom of page */ + page_width, /* Width of page */ + page_height, /* Length of page */ + page_true_height, /* True length of page */ + out_width, /* Width of image on page in pixles */ + out_height, /* Length of image on page */ + out_bpp, /* Output bytes per pixel */ + length, /* Length of raster data in bytes*/ + buf_length, /* Length of raster data buffer (dmt) */ + errdiv, /* Error dividend */ + errmod, /* Error modulus */ + errval, /* Current error value */ + errline, /* Current raster line */ + errlast; /* Last raster line loaded */ + stp_convert_t colorfunc = 0; /* Color conversion function... */ + int zero_mask; + int image_height, + image_width, + image_bpp; + int use_dmt = 0; + void * dither; + int pass_length=0; /* count of inkjets for one pass */ + int add_top_offset=0; /* additional top offset */ + int printMode = 0; + int source; + /* Lexmark do not have differnet pixel sizes. We have to correct the density according the print resolution. */ + double densityDivisor; /* This parameter is will adapt the density according the resolution */ + double k_lower, k_upper; + int physical_xdpi = 0; + int physical_ydpi = 0; + + double lum_adjustment[49], sat_adjustment[49], hue_adjustment[49]; + + /* weave parameters */ + stp_linebufs_t cols; + int nozzle_separation; + int horizontal_passes; + int ncolors; + lexm_privdata_weave privdata; + void * weave = NULL; + + stp_lineoff_t lineoff_buffer; /* holds the line offsets of each color */ + int doTestPrint = 0; +#ifdef DEBUG + testdata td; +#endif + + + const unsigned char *cmap = stp_get_cmap(v); + int model = stp_printer_get_model(printer); + const char *resolution = stp_get_resolution(v); + const char *media_type = stp_get_media_type(v); + const char *media_source = stp_get_media_source(v); + int output_type = stp_get_output_type(v); + int orientation = stp_get_orientation(v); + const char *ink_type = stp_get_ink_type(v); + double scaling = stp_get_scaling(v); + int top = stp_get_top(v); + int left = stp_get_left(v); + stp_vars_t nv = stp_allocate_copy(v); + + const lexmark_cap_t * caps= lexmark_get_model_capabilities(model); + const lexmark_res_t *res_para_ptr = lexmark_get_resolution_para(printer, resolution); + const paper_t *media = get_media_type(media_type,caps); + const lexmark_inkparam_t *ink_parameter = lexmark_get_ink_parameter(ink_type, output_type, caps, nv); + + +#ifdef DEBUG + dbgfileprn = lex_open_tmp_file(); /* open file with xx */ +#endif + + if (ink_parameter == NULL) + { + stp_eprintf(nv, "Illegal Ink Type specified; cannot print.\n"); + return; + } + + if (!stp_get_verified(nv)) + { + stp_eprintf(nv, "Print options not verified; cannot print.\n"); + return; + } + + + /* + * Setup a read-only pixel region for the entire image... + */ + + image->init(image); + image_height = image->height(image); + image_width = image->width(image); + image_bpp = image->bpp(image); + + + source= lexmark_source_type(media_source,caps); + + /* force grayscale if image is grayscale + * or single black cartridge installed + */ + + if ((ink_parameter->used_colors == COLOR_MODE_K) || + ((caps->inks == LEXMARK_INK_K) && + output_type != OUTPUT_MONOCHROME)) + { + output_type = OUTPUT_GRAY; + stp_set_output_type(nv, OUTPUT_GRAY); + } + stp_set_output_color_model(nv, COLOR_MODEL_CMY); + + /* + * Choose the correct color conversion function... + */ + + colorfunc = stp_choose_colorfunc(output_type, image_bpp, cmap, &out_bpp, nv); + + + ncolors = ink_parameter->ncolors; + printMode = ink_parameter->used_colors; + pass_length = ink_parameter->pass_length; + add_top_offset = ink_parameter->v_top_head_offset; + + + /* + * Figure out the output resolution... + */ + + lexmark_describe_resolution(printer, + resolution, &xdpi,&ydpi); +#ifdef DEBUG + stp_erprintf("lexmark: resolution=%dx%d\n",xdpi,ydpi); +#endif + + switch (res_para_ptr->resid) { + case DPI300: + physical_xdpi = 300; + physical_ydpi = lexmark_get_phys_resolution_vertical(printer); + break; + case DPI600: + physical_xdpi = 600; + physical_ydpi = lexmark_get_phys_resolution_vertical(printer); + break; + case DPI1200: + case DPItest: + physical_xdpi = 1200; + physical_ydpi = lexmark_get_phys_resolution_vertical(printer); + break; + default: + return; + break; + } + /* adapt the density */ + densityDivisor = ((xdpi / 300)*(ydpi/ 600)); + +#ifdef DEBUG + if (res_para_ptr->resid == DPItest) { + stp_erprintf("Start test print1\n"); + doTestPrint = 1; + } +#endif + + if ((printMode & COLOR_MODE_PHOTO) == COLOR_MODE_PHOTO) { + /* in case of photo mode we have to go a bit ligther */ +densityDivisor /= 1.2; + } + + nozzle_separation = ydpi / physical_ydpi; + + horizontal_passes = xdpi / physical_xdpi; +#ifdef DEBUG + stp_erprintf("lexmark: horizontal_passes %i, xdpi %i, physical_xdpi %i\n", + horizontal_passes, xdpi, physical_xdpi); +#endif + + + + + if (!strcmp(resolution+(strlen(resolution)-3),"DMT") && + (caps->features & LEXMARK_CAP_DMT) && + stp_get_output_type(nv) != OUTPUT_MONOCHROME && + output_type != OUTPUT_MONOCHROME) { + use_dmt= 1; +#ifdef DEBUG + stp_erprintf("lexmark: using drop modulation technology\n"); +#endif + } + + /* + * Compute the output size... + */ + + lexmark_imageable_area(printer, nv, &page_left, &page_right, + &page_bottom, &page_top); + + stp_compute_page_parameters(page_right, page_left, page_top, page_bottom, + scaling, image_width, image_height, image, + &orientation, &page_width, &page_height, + &out_width, &out_height, &left, &top); + +#ifdef DEBUG + stp_erprintf("page_right %d, page_left %d, page_top %d, page_bottom %d, left %d, top %d\n",page_right, page_left, page_top, page_bottom,left, top); +#endif + + /* + * Recompute the image length and width. If the image has been + * rotated, these will change from previously. + */ + image_height = image->height(image); + image_width = image->width(image); + + stp_default_media_size(printer, nv, &n, &page_true_height); + + + image->progress_init(image); + + + if (!lexmark_init_printer(nv, caps, output_type, + media_source, + xdpi, ydpi, page_width, page_height, + top,left,use_dmt)) + return; + + /* + * Convert image size to printer resolution... + */ + + out_width = xdpi * out_width / 72; + out_height = ydpi * out_height / 72; + +#ifdef DEBUG + + stp_erprintf("border: left %ld, x_raster_res %d, offser_left %ld\n", left, caps->x_raster_res, caps->offset_left_border); +#endif + + left = ((caps->x_raster_res * left) / 72) + caps->offset_left_border; + +#ifdef DEBUG + stp_erprintf("border: left %d\n", left); +#endif + + + +#ifdef DEBUG + if (doTestPrint == 1) { + stp_erprintf("Start test print\n"); + testprint(&td); + out_width = td.x; + out_height = td.y; + if (td.cols != 7) { + printMode = COLOR_MODE_K | COLOR_MODE_M | COLOR_MODE_C | COLOR_MODE_Y; + } else { + printMode = COLOR_MODE_K | COLOR_MODE_M | COLOR_MODE_C | COLOR_MODE_Y | COLOR_MODE_LM | COLOR_MODE_LC; + } + } +#endif + + /* + * Allocate memory for the raster data... + */ + + length = (out_width + 7) / 8; + + + + if (use_dmt) { + /* buf_length= length*2; */ + buf_length= length; + } else { + buf_length= length; + } + +#ifdef DEBUG + stp_erprintf("lexmark: buflength is %d!\n",buf_length); +#endif + + + /* Now we know the color which are used, let's get the memory for every color image */ + cols.p.k = NULL; + cols.p.c = NULL; + cols.p.y = NULL; + cols.p.m = NULL; + cols.p.C = NULL; + cols.p.M = NULL; + cols.p.Y = NULL; + + + if ((printMode & COLOR_MODE_C) == COLOR_MODE_C) { + cols.p.c = lexmark_alloc_buffer(buf_length+10); + } + if ((printMode & COLOR_MODE_Y) == COLOR_MODE_Y) { + cols.p.y = lexmark_alloc_buffer(buf_length+10); + } + if ((printMode & COLOR_MODE_M) == COLOR_MODE_M) { + cols.p.m = lexmark_alloc_buffer(buf_length+10); + } + if ((printMode & COLOR_MODE_K) == COLOR_MODE_K) { + cols.p.k = lexmark_alloc_buffer(buf_length+10); + } + if ((printMode & COLOR_MODE_LC) == COLOR_MODE_LC) { + cols.p.C = lexmark_alloc_buffer(buf_length+10); + } + if ((printMode & COLOR_MODE_LY) == COLOR_MODE_LY) { + cols.p.Y = lexmark_alloc_buffer(buf_length+10); + } + if ((printMode & COLOR_MODE_LM) == COLOR_MODE_LM) { + cols.p.M = lexmark_alloc_buffer(buf_length+10); + } + + +#ifdef DEBUG + stp_erprintf("lexmark: driver will use colors "); + if (cols.p.c) stp_erputc('c'); + if (cols.p.C) stp_erputc('C'); + if (cols.p.m) stp_erputc('m'); + if (cols.p.M) stp_erputc('M'); + if (cols.p.y) stp_erputc('y'); + if (cols.p.Y) stp_erputc('Y'); + if (cols.p.k) stp_erputc('k'); + stp_erprintf("\n"); +#endif + + /* initialize soft weaveing */ + privdata.ink_parameter = ink_parameter; + privdata.bidirectional = lexmark_print_bidirectional(printer, resolution); + privdata.outbuf = stp_malloc((((((pass_length/8)*11))+40) * out_width)+2000); + stp_set_driver_data(nv, &privdata); + /* lxm_nozzles_used = 1;*/ + + weave = stp_initialize_weave(pass_length, /* jets */ + nozzle_separation, /* separation */ + horizontal_passes, /* h overample */ + res_para_ptr->vertical_passes, /* v passes */ + res_para_ptr->vertical_oversample, /* v oversample */ + ncolors, /* colors */ + 1, /* bits/pixel */ + out_width, /* line width */ + out_height, 0, + ((top * ydpi) / 72)+(((caps->offset_top_border+add_top_offset)*ydpi) + /caps->y_raster_res), + (page_height * ydpi) / 72, + 1, /* weave_strategy */ + (int *)lexmark_head_offset(ydpi, ink_type, caps, ink_parameter, &lineoff_buffer), + nv, flush_pass, + stp_fill_uncompressed, /* fill_start */ + stp_pack_uncompressed, /* pack */ + stp_compute_uncompressed_linewidth); /* compute_linewidth */ + + + + +#ifdef DEBUG + stp_erprintf("density is %f\n",stp_get_density(nv)); +#endif + +#ifdef DEBUG + stp_erprintf("density is %f and will be changed to %f (%f)\n",stp_get_density(nv), stp_get_density(nv)/densityDivisor, densityDivisor); +#endif + + /* Lexmark do not have differnet pixel sizes. We have to correct the density according the print resolution. */ + stp_set_density(nv, stp_get_density(nv) / densityDivisor); + + + + /* + * Compute the LUT. For now, it's 8 bit, but that may eventually + * sometimes change. + */ + if (ncolors > 4) + k_lower = .5; + else + k_lower = .25; + + + + + + + if (media) + { + stp_set_density(nv, stp_get_density(nv) * media->base_density); + stp_set_cyan(nv, stp_get_cyan(nv) * media->p_cyan); + stp_set_magenta(nv, stp_get_magenta(nv) * media->p_magenta); + stp_set_yellow(nv, stp_get_yellow(nv) * media->p_yellow); + k_lower *= media->k_lower_scale; + k_upper = media->k_upper; + } + else + { + stp_set_density(nv, stp_get_density(nv) * .8); + k_lower *= .1; + k_upper = .5; + } + if (stp_get_density(nv) > 1.0) + stp_set_density(nv, 1.0); + + stp_compute_lut(nv, 256); + +#ifdef DEBUG + stp_erprintf("density is %f\n",stp_get_density(nv)); +#endif + + if (xdpi > ydpi) + dither = stp_init_dither(image_width, out_width, 1, xdpi / ydpi, nv); + else + dither = stp_init_dither(image_width, out_width, ydpi / xdpi, 1, nv); + + for (i = 0; i <= NCOLORS; i++) + stp_dither_set_black_level(dither, i, 1.0); + stp_dither_set_black_lower(dither, k_lower); + stp_dither_set_black_upper(dither, k_upper); + + /* + stp_dither_set_black_lower(dither, .8 / ((1 << (use_dmt+1)) - 1));*/ + /*stp_dither_set_black_levels(dither, 0.5, 0.5, 0.5); + stp_dither_set_black_lower(dither, 0.4);*/ + /* + if (use_glossy_film) + */ + stp_dither_set_black_upper(dither, .8); + + if (!use_dmt) { + if (cols.p.C) + stp_dither_set_light_ink(dither, ECOLOR_C, .3333, stp_get_density(nv)); + if (cols.p.M) + stp_dither_set_light_ink(dither, ECOLOR_M, .3333, stp_get_density(nv)); + if (cols.p.Y) + stp_dither_set_light_ink(dither, ECOLOR_Y, .3333, stp_get_density(nv)); + } + + switch (stp_get_image_type(nv)) + { + case IMAGE_LINE_ART: + stp_dither_set_ink_spread(dither, 19); + break; + case IMAGE_SOLID_TONE: + stp_dither_set_ink_spread(dither, 15); + break; + case IMAGE_CONTINUOUS: + stp_dither_set_ink_spread(dither, 14); + break; + } + stp_dither_set_density(dither, stp_get_density(nv)); + + /* + * Output the page... + */ + + + in = stp_malloc(image_width * image_bpp); + out = stp_malloc(image_width * out_bpp * 2); + + /* calculate the memory we need for one line of the printer image (hopefully we are right) */ +#ifdef DEBUG + stp_erprintf("---------- buffer mem size = %d\n", (((((pass_length/8)*11)/10)+40) * out_width)+200); +#endif + + errdiv = image_height / out_height; + errmod = image_height % out_height; + errval = 0; + errlast = -1; + errline = 0; + + if (lexmark_lum_adjustment(caps, nv)) + { + for (i = 0; i < 49; i++) + { + lum_adjustment[i] = lexmark_lum_adjustment(caps, nv)[i]; + if (media && media->lum_adjustment) { + lum_adjustment[i] *= media->lum_adjustment[i]; + } + } + } + if (lexmark_sat_adjustment(caps, nv)) + { + for (i = 0; i < 49; i++) + { + sat_adjustment[i] = lexmark_sat_adjustment(caps, nv)[i]; + if (media && media->sat_adjustment) + sat_adjustment[i] *= media->sat_adjustment[i]; + } + } + if (lexmark_hue_adjustment(caps, nv)) + { + for (i = 0; i < 49; i++) + { + hue_adjustment[i] = lexmark_hue_adjustment(caps, nv)[i]; + if (media && media->hue_adjustment) + hue_adjustment[i] += media->hue_adjustment[i]; + } + } + + + + for (y = 0; y < out_height; y ++) /* go through every pixle line of image */ + { + int duplicate_line = 1; + +#ifdef DEBUGyy + stp_erprintf("print y %i\n", y); +#endif + + if ((y & 63) == 0) + image->note_progress(image, y, out_height); + + if (errline != errlast) + { + errlast = errline; + duplicate_line = 0; + if (image->get_row(image, in, errline) != STP_IMAGE_OK) + break; + /* stp_erprintf("errline %d , image height %d\n", errline, image_height);*/ +#if 1 + (*colorfunc)(nv, in, out, &zero_mask, image_width, image_bpp, cmap, + hue_adjustment, lum_adjustment, sat_adjustment); +#else + (*colorfunc)(nv, in, out, &zero_mask, image_width, image_bpp, cmap, + NULL, NULL, NULL); +#endif + } + /* stp_erprintf("Let's dither %d %d %d\n", ((y)), buf_length, length);*/ + if (doTestPrint == 0) { + stp_dither(out, y, dither, cols.p.c, cols.p.C, cols.p.m, cols.p.M, + cols.p.y, cols.p.Y, cols.p.k, duplicate_line, zero_mask); + } else { +#ifdef DEBUG + readtestprintline(&td, &cols); +#endif + } + clean_color(cols.p.c, length); + clean_color(cols.p.m, length); + clean_color(cols.p.y, length); + + +#ifdef DEBUGyy + stp_erprintf("Let's go stp_write_weave\n"); + stp_erprintf("length %d\n", length); +#endif + + stp_write_weave(weave, length, ydpi, model, out_width, left, + xdpi, physical_xdpi, (const unsigned char **)cols.v); + + errval += errmod; + errline += errdiv; + if (errval >= out_height) + { + errval -= out_height; + errline ++; + } + + } + image->progress_conclude(image); + + stp_flush_all(weave, model, out_width, left, + ydpi, xdpi, physical_xdpi); + + + + lexmark_deinit_printer(nv, caps); + + + if (doTestPrint == 0) { + stp_free_dither(dither); + } + + + + /* + * Cleanup... + */ + stp_free_lut(nv); + stp_free(in); + stp_free(out); + stp_destroy_weave(weave); + if (privdata.outbuf != NULL) { + stp_free(privdata.outbuf);/* !!!!!!!!!!!!!! */ + } + + if (cols.p.k != NULL) stp_free(cols.p.k); + if (cols.p.c != NULL) stp_free(cols.p.c); + if (cols.p.m != NULL) stp_free(cols.p.m); + if (cols.p.y != NULL) stp_free(cols.p.y); + if (cols.p.C != NULL) stp_free(cols.p.C); + if (cols.p.M != NULL) stp_free(cols.p.M); + if (cols.p.Y != NULL) stp_free(cols.p.Y); + + + +#ifdef DEBUG + lex_tmp_file_deinit(dbgfileprn); +#endif + + stp_free_vars(nv); +} + +const stp_printfuncs_t stp_lexmark_printfuncs = +{ + lexmark_parameters, + stp_default_media_size, + lexmark_imageable_area, + lexmark_limit, + lexmark_print, + lexmark_default_parameters, + lexmark_describe_resolution, + stp_verify_printer_params +}; + + + +/* lexmark_init_line + This method is printer type dependent code. + + This method initializes the line to be printed. It will set + the printer specific initialization which has to be done bofor + the pixels of the image could be printed. +*/ +static unsigned char * +lexmark_init_line(int mode, unsigned char *prnBuf, + int pass_length, + int offset, /* offset from left in 1/"x_raster_res" DIP (printer resolution)*/ + int width, int direction, + const lexmark_inkparam_t *ink_parameter, + const lexmark_cap_t * caps /* I - Printer model */ + ) +{ + int pos1 = 0; + int pos2 = 0; + int abspos, disp; + int hend = 0; + int header_size = 0; + + + /* stp_erprintf("#### width %d, length %d, pass_length %d\n", width, length, pass_length);*/ + /* first, we wirte the line header */ + switch(caps->model) { + case m_z52: + case m_z42: + if (caps->model == m_z52) + { + header_size = LXM_Z52_HEADERSIZE; + memcpy(prnBuf, outbufHeader_z52, header_size); + } + if (caps->model == m_z42) + { + header_size = LXM_Z42_HEADERSIZE; + memcpy(prnBuf, outbufHeader_z42, LXM_Z42_HEADERSIZE); + } + + /* K could only be present if black is printed only. */ + if ((mode & COLOR_MODE_K) || (mode & (COLOR_MODE_K | COLOR_MODE_LC | COLOR_MODE_LM))) { +#ifdef DEBUG + stp_erprintf("set photo/black catridge \n"); +#endif + prnBuf[LX_Z52_COLOR_MODE_POS] = LX_Z52_BLACK_PRINT; + + if (direction) { + } else { + offset += ink_parameter->h_direction_offset; + } + } else { +#ifdef DEBUG + stp_erprintf("set color cartridge \n"); +#endif + prnBuf[LX_Z52_COLOR_MODE_POS] = LX_Z52_COLOR_PRINT; + + if (direction) { + offset += ink_parameter->h_catridge_offset; + } else { + offset += ink_parameter->h_catridge_offset + ink_parameter->h_direction_offset; + } + } + + switch (mode & PRINT_MODE_MASK) { + case PRINT_MODE_300: + prnBuf[LX_Z52_RESOLUTION_POS] = LX_Z52_300_DPI; + break; + case PRINT_MODE_600: + prnBuf[LX_Z52_RESOLUTION_POS] = LX_Z52_600_DPI; + break; + case PRINT_MODE_1200: + prnBuf[LX_Z52_RESOLUTION_POS] = LX_Z52_1200_DPI; + break; + case PRINT_MODE_2400: + prnBuf[LX_Z52_RESOLUTION_POS] = LX_Z52_2400_DPI; + break; + } + + + if (direction) { + prnBuf[LX_Z52_PRINT_DIRECTION_POS] = 1; + } else { + prnBuf[LX_Z52_PRINT_DIRECTION_POS] = 2; + } + + /* set package count */ + prnBuf[13] = (unsigned char)((width) >> 8); + prnBuf[14] = (unsigned char)((width) & 0xFF); + /* set horizontal offset */ + prnBuf[15] =(unsigned char)(offset >> 8); + prnBuf[16] =(unsigned char)(offset & 0xFF); + + if (caps->model == m_z42) { + switch(mode & PRINT_MODE_MASK) { + case PRINT_MODE_300: + hend = (width-1)*(2400/300); + break; + case PRINT_MODE_600: + hend = (width-1)*(2400/600); + break; + case PRINT_MODE_1200: + hend = (width-1)*(2400/1200); + break; + case PRINT_MODE_2400: + hend = (width-1)*(2400/2400); + break; + } + prnBuf[17] = (unsigned char)(hend >> 8); + prnBuf[18] = (unsigned char)(hend & 0xFF); + } + + return prnBuf + header_size; /* return the position where the pixels have to be written */ + break; + case m_3200: + memcpy(prnBuf, outbufHeader_3200, LXM_3200_HEADERSIZE); + + offset = (offset - 60) * 4; + + /* K could only be present if black is printed only. */ + if((mode & COLOR_MODE_K) || + (mode & (COLOR_MODE_K | COLOR_MODE_LC | COLOR_MODE_LM))) + { + disp = LXM3200_LEFTOFFS; + prnBuf[2] = 0x00; + } + else + { + disp = LXM3200_RIGHTOFFS; + prnBuf[2] = 0x80; + } + + if(pass_length == 208) + { + prnBuf[2] |= 0x10; + } + + switch(mode & PRINT_MODE_MASK) { + case PRINT_MODE_300: + prnBuf[2] |= 0x20; + pos1 = offset + disp; + pos2 = offset + (width * 4) + disp; + break; + + case PRINT_MODE_600: + prnBuf[2] |= 0x00; + pos1 = offset + disp; + pos2 = offset + (width * 2) + disp; + break; + + case PRINT_MODE_1200: + prnBuf[2] |= 0x40; + pos1 = offset + disp; + pos2 = (offset + width) + disp; + break; + } + + if(direction) + prnBuf[2] |= 0x01; + else + prnBuf[2] |= 0x00; + + /* set package count */ + prnBuf[3] = (unsigned char)((width) >> 8); + prnBuf[4] = (unsigned char)((width) & 0xff); + + /* set horizontal offset */ + prnBuf[21] = (unsigned char)(pos1 >> 8); + prnBuf[22] = (unsigned char)(pos1 & 0xFF); + + abspos = ((((pos2 - 3600) >> 3) & 0xfff0) + 9); + prnBuf[5] = (abspos-lxm3200_headpos) >> 8; + prnBuf[6] = (abspos-lxm3200_headpos) & 0xff; + + lxm3200_headpos = abspos; + + if(LXM3200_RIGHTOFFS > 4816) + abspos = (((LXM3200_RIGHTOFFS - 4800) >> 3) & 0xfff0); + else + abspos = (((LXM3200_RIGHTOFFS - 3600) >> 3) & 0xfff0); + + prnBuf[11] = (lxm3200_headpos-abspos) >> 8; + prnBuf[12] = (lxm3200_headpos-abspos) & 0xff; + + lxm3200_headpos = abspos; + + prnBuf[7] = (unsigned char)lexmark_calc_3200_checksum(&prnBuf[0]); + prnBuf[15] = (unsigned char)lexmark_calc_3200_checksum(&prnBuf[8]); + prnBuf[23] = (unsigned char)lexmark_calc_3200_checksum(&prnBuf[16]); + + /* return the position where the pixels have to be written */ + return prnBuf + LXM_3200_HEADERSIZE; + break; + + case m_lex7500: + stp_erprintf("Lexmark 7500 not supported !\n"); + return NULL; + break; + } + return NULL; +} + + +typedef struct Lexmark_head_colors { + int v_start; + unsigned char *line; + int head_nozzle_start; + int head_nozzle_end; + int used_jets; +} Lexmark_head_colors; + +/* lexmark_write + This method is has NO printer type dependent code. + This method writes a single line of the print. The line consits of "pass_length" + pixel lines (pixels, which could be printed with one pass by the printer. +*/ + + +static int +lexmark_write(const stp_vars_t v, /* I - Print file or command */ + unsigned char *prnBuf, /* mem block to buffer output */ + int *paperShift, + int direction, + int pass_length, /* num of inks to print */ + const lexmark_cap_t * caps, /* I - Printer model */ + const lexmark_inkparam_t *ink_parameter, + int xdpi, + int yCount, + Lexmark_head_colors *head_colors, + int length, /* I - Length of bitmap data in bytes */ + int mode, /* I - Which color */ + int ydpi, /* I - Vertical resolution */ + int width, /* I - Printed width in pixles */ + int offset, /* I - Offset from left side in lexmark_cap_t.x_raster_res DPI */ + int dmt) +{ + unsigned char *tbits=NULL, *p=NULL; + int clen; + int x; /* actual vertical position */ + int y; /* actual horizontal position */ + int dy; /* horiz. inkjet posintion */ + int x1; + unsigned short pixelline; /* byte to be written */ + unsigned int valid_bytes; /* bit list which tells the present bytes */ + int xStart=0; /* count start for horizontal line */ + int xEnd=0; + int xIter=0; /* count direction for horizontal line */ + int anyCol=0; + int colIndex; + int rwidth; /* real with used at printing (includes shift between even & odd nozzles) */ +#ifdef DEBUG + /* stp_erprintf("<%c>",("CMYKcmy"[coloridx])); */ + stp_erprintf("pass length %d\n", pass_length); +#endif + + + /* first, we check the length of the line an cut it if necessary. */ + if ((((width*caps->x_raster_res)/xdpi)+offset) > ((caps->max_paper_width*caps->x_raster_res)/72)) { + /* line too long !! Cut the line */ +#ifdef DEBUG + stp_erprintf("!! Line too long !! reduce it from %d", width); +#endif + width = ((((caps->max_paper_width*caps->x_raster_res)/72) - offset)*xdpi)/caps->x_raster_res; +#ifdef DEBUG + stp_erprintf(" down to %d\n", width); +#endif + } + + + /* we have to write the initial sequence for a line */ + +#ifdef DEBUG + stp_erprintf("lexmark: printer line initialized.\n"); +#endif + + if (direction) { + /* left to right */ + xStart = -get_lr_shift(mode); + xEnd = width-1; + xIter = 1; + rwidth = xEnd - xStart; + } else { + /* right to left ! */ + xStart = width-1; + xEnd = -get_lr_shift(mode); + rwidth = xStart - xEnd; + xIter = -1; + } + + p = lexmark_init_line(mode, prnBuf, pass_length, offset, rwidth, + direction, /* direction */ + ink_parameter, caps); + + +#ifdef DEBUG + stp_erprintf("lexmark: xStart %d, xEnd %d, xIter %d.\n", xStart, xEnd, xIter); +#endif + + /* now we can start to write the pixels */ + yCount = 2; + + + for (x=xStart; x != xEnd; x+=xIter) { + int anyDots=0; /* tells us if there was any dot to print */ + + switch(caps->model) { + case m_z52: + tbits = p; + *(p++) = 0x3F; + tbits[1] = 0; /* here will be nice bitmap */ + p++; + break; + + case m_3200: + case m_z42: + tbits = p; + p += 4; + break; + + case m_lex7500: + break; + } + + + pixelline =0; /* here we store 16 pixels */ + valid_bytes = 0; /* for every valid word (16 bits) a corresponding bit will be set to 1. */ + + anyDots =0; + x1 = x+get_lr_shift(mode); + + for (colIndex=0; colIndex < 3; colIndex++) { + for (dy=head_colors[colIndex].head_nozzle_start,y=head_colors[colIndex].v_start*yCount; + (dy < head_colors[colIndex].head_nozzle_end); + y+=yCount, dy++) { /* we start counting with 1 !!!! */ + if (head_colors[colIndex].line != NULL) { + pixelline = pixelline << 1; + if ((x >= 0) && + ((dy - head_colors[colIndex].head_nozzle_start) < (head_colors[colIndex].used_jets/2))) + pixelline = pixelline | ((head_colors[colIndex].line[(y*length)+(x/8)] >> (7-(x%8))) & 0x1); + pixelline = pixelline << 1; + if ((x1 < width) && + (((dy - head_colors[colIndex].head_nozzle_start)+1) < (head_colors[colIndex].used_jets/2))) + pixelline = pixelline | ((head_colors[colIndex].line[(((yCount>>1)+y)*length)+ (x1/8)] >> (7-(x1%8))) & 0x1); + + } else { + pixelline = pixelline << 2; + } + switch(caps->model) { + case m_z52: + if ((dy%8) == 7) { + /* we have two bytes, write them */ + anyDots |= pixelline; + if (pixelline) { + /* we have some dots */ + valid_bytes = valid_bytes >> 1; + *((p++)) = (unsigned char)(pixelline >> 8); + *((p++)) = (unsigned char)(pixelline & 0xff); + } else { + /* there are no dots ! */ + valid_bytes = valid_bytes >> 1; + valid_bytes |= 0x1000; + } + pixelline =0; + } + break; + + case m_3200: + case m_z42: + if((dy % 4) == 3) + { + anyDots |= pixelline; + valid_bytes <<= 1; + + if(pixelline) + *(p++) = (unsigned char)(pixelline & 0xff); + else + valid_bytes |= 0x01; + + pixelline = 0; + } + break; + + case m_lex7500: + break; + } + } + } + + switch(caps->model) { + case m_z52: + if (pass_length != 208) { + valid_bytes = valid_bytes >> 1; + valid_bytes |= 0x1000; + } + tbits[0] = 0x20 | ((unsigned char)((valid_bytes >> 8) & 0x1f)); + tbits[1] = (unsigned char)(valid_bytes & 0xff); + break; + + case m_z42: + if ((p-tbits) & 1) *(p++)=0; /* z42 packets always have even length */ + /* fall through */ + case m_3200: + tbits[0] = 0x80 | ((unsigned char)((valid_bytes >> 24) & 0x1f)); + tbits[1] = (unsigned char)((valid_bytes >> 16) & 0xff); + tbits[2] = (unsigned char)((valid_bytes >> 8) & 0xff); + tbits[3] = (unsigned char)(valid_bytes & 0xff); + break; + + case m_lex7500: + break; + } + + + if (anyDots) { + anyCol = 1; + } else { + /* there are no dots, make empy package */ +#ifdef DEBUG + /* stp_erprintf("-- empty col %i\n", x); */ +#endif + } + } + +#ifdef DEBUG + stp_erprintf("lexmark: 4\n"); +#endif + + clen=((unsigned char *)p)-prnBuf; + + switch(caps->model) { + case m_z52: + case m_z42: + prnBuf[IDX_SEQLEN] =(unsigned char)(clen >> 24); + prnBuf[IDX_SEQLEN+1] =(unsigned char)(clen >> 16); + prnBuf[IDX_SEQLEN+2] =(unsigned char)(clen >> 8); + prnBuf[IDX_SEQLEN+3]=(unsigned char)(clen & 0xFF); + break; + + case m_3200: + prnBuf[18] = (unsigned char)((clen - LXM_3200_HEADERSIZE) >> 16); + prnBuf[19] = (unsigned char)((clen - LXM_3200_HEADERSIZE) >> 8); + prnBuf[20] = (unsigned char)((clen - LXM_3200_HEADERSIZE) & 0xff); + prnBuf[23] = (unsigned char)lexmark_calc_3200_checksum(&prnBuf[16]); + break; + + default: + break; + } + + if (anyCol) { + /* fist, move the paper */ + paper_shift(v, (*paperShift), caps); + *paperShift=0; + + /* now we write the image line */ + stp_zfwrite((const char *)prnBuf,1,clen,v); +#ifdef DEBUG + lex_write_tmp_file(dbgfileprn, (void *)prnBuf,clen); + stp_erprintf("lexmark: line written.\n"); +#endif + return 1; + } else { +#ifdef DEBUG + stp_erprintf("-- empty line\n"); +#endif + return 0; + } + + /* Send a line of raster graphics... */ + + return 0; +} + + + +#ifdef DEBUG +const stp_vars_t lex_open_tmp_file() { + int i; + const stp_vars_t ofile; + char tmpstr[256]; + + stp_erprintf(" create file !\n"); + for (i=0, sprintf(tmpstr, "/tmp/xx%d.prn", i), ofile = fopen(tmpstr, "r"); + ofile != NULL; + i++, sprintf(tmpstr, "/tmp/xx%d.prn", i), ofile = fopen(tmpstr, "r")) { + if (ofile != NULL) + { + fclose(ofile); + } + } + stp_erprintf("Create file %s !\n", tmpstr); + ofile = fopen(tmpstr, "wb"); + if (ofile == NULL) + { + stp_erprintf("Can't create file !\n"); + exit(2); + } + return ofile; +} + +void lex_tmp_file_deinit(const stp_vars_t file) { + stp_erprintf("Close file %lx\n", file); + fclose(file); +} + +const stp_vars_t lex_write_tmp_file(const stp_vars_t ofile, void *data,int length) { + fwrite(data, 1, length, ofile); +} + + +#endif + + + +static void +flush_pass(stp_softweave_t *sw, int passno, int model, int width, + int hoffset, int ydpi, int xdpi, int physical_xdpi, + int vertical_subpass) +{ + const stp_vars_t nv = (sw->v); + stp_lineoff_t *lineoffs = stp_get_lineoffsets_by_pass(sw, passno); + stp_lineactive_t *lineactive = stp_get_lineactive_by_pass(sw, passno); + const stp_linebufs_t *bufs = stp_get_linebases_by_pass(sw, passno); + stp_pass_t *pass = stp_get_pass_by_pass(sw, passno); + stp_linecount_t *linecount = stp_get_linecount_by_pass(sw, passno); + int lwidth = (width + (sw->horizontal_weave - 1)) / sw->horizontal_weave; + int microoffset = vertical_subpass & (sw->horizontal_weave - 1); + + int prn_mode; + int j; /* color counter */ + lexm_privdata_weave *privdata_weave = stp_get_driver_data(nv); + const lexmark_cap_t * caps= lexmark_get_model_capabilities(model); + int paperShift; + Lexmark_head_colors head_colors[3]={{0, NULL, 0, 64/2, 64}, + {0, NULL, 64/2, 128/2, 64}, + {0, NULL, 128/2, 192/2, 64}}; + + + + +#ifdef DEBUG + stp_erprintf("Lexmark: flush_pass, here we are !\n"); + stp_erprintf(" passno %i, sw->ncolors %i, width %d, lwidth %d, linecount k %d, linecount m %d, bitwidth %d, separation_rows %d\n", passno, sw->ncolors, width, lwidth, linecount[0].p.k, linecount[0].p.m, sw->bitwidth, sw->separation_rows); + stp_erprintf("microoffset %d, vertical_subpass %d, sw->horizontal_weave %d\n", microoffset,vertical_subpass, sw->horizontal_weave); + + stp_erprintf("Lexmark: last_pass_offset %d, last_pass %d, logicalpassstart %d\n", sw->last_pass_offset, sw->last_pass, pass->logicalpassstart); + stp_erprintf("Lexmark: vertical adapt: caps->y_raster_res %d, ydpi %d, \n", caps->y_raster_res, ydpi); + +#endif + + if (1) { /* wisi */ + +#ifdef DEBUG + stp_erprintf("1\n"); + stp_erprintf("\n"); + stp_erprintf("lineoffs[0].v[j] %d\n", lineoffs[0].v[0]); + stp_erprintf("lineoffs[0].v[j] %d\n", lineoffs[0].v[1]); + +#endif + + switch (physical_xdpi) { + case 300: + prn_mode = PRINT_MODE_300; + break; + case 600: + prn_mode = PRINT_MODE_600; + break; + case 1200: + prn_mode = PRINT_MODE_1200; + break; + default: +#ifdef DEBUG + stp_erprintf("Eror: Unsupported phys resolution (%d)\n", physical_xdpi); +#endif + return; + break; + } + /* calculate paper shift and adapt actual resoution to physical positioning resolution */ + paperShift = (pass->logicalpassstart - sw->last_pass_offset) * (caps->y_raster_res/ydpi); + + /*** do we have to print something with the color cartridge ? ***/ + if (lineactive[0].p.c || lineactive[0].p.m || lineactive[0].p.y) + { + if (lineactive[0].p.c) + { + head_colors[0].line = bufs[0].p.c; + head_colors[0].used_jets = linecount[0].p.c; + } + else + { + head_colors[0].line = NULL; + head_colors[0].used_jets = 0; + } + + if (lineactive[0].p.m) + { + head_colors[1].line = bufs[0].p.m; + head_colors[1].used_jets = linecount[0].p.m; + } + else + { + head_colors[1].line = 0; + head_colors[1].used_jets = 0; + } + + if (lineactive[0].p.y) + { + head_colors[2].line = bufs[0].p.y; + head_colors[2].used_jets = linecount[0].p.y; + } + else + { + head_colors[2].line = 0; + head_colors[2].used_jets = 0; + } + + + + +#ifdef DEBUG + stp_erprintf("lexmark_write: lwidth %d\n", lwidth); +#endif + lexmark_write(nv, /* I - Print file or command */ + privdata_weave->outbuf,/*unsigned char *prnBuf, mem block to buffer output */ + &paperShift, /* int *paperShift, */ + privdata_weave->direction, /* int direction, */ + sw->jets, /* num of inks to print */ + caps, /* const lexmark_cap_t * caps, I - Printer model */ + privdata_weave->ink_parameter, + xdpi, /* int xresolution, */ + 2, /* yCount,*/ + head_colors, /* Lexmark_head_colors *head_colors, */ + (lwidth+7)/8, /* length, I - Length of bitmap data of one line in bytes */ + prn_mode | COLOR_MODE_C | COLOR_MODE_Y | COLOR_MODE_M, /* mode, I - Which color */ + ydpi, /* ydpi, I - Vertical resolution */ + lwidth, /* width, I - Printed width in pixles*/ + hoffset+microoffset, /* offset I - Offset from left side in x_raster_res DPI */ + 0 /* dmt */); + if (privdata_weave->bidirectional) + privdata_weave->direction = (privdata_weave->direction +1) & 1; + } + + /*** do we have to print somthing with black or photo cartridge ? ***/ + if (lineactive[0].p.C || lineactive[0].p.M || lineactive[0].p.k) + { + /* we print with the photo or black cartidge */ + + if (sw->jets != 208) + { + /* we have photo or black cartridge */ + if (lineactive[0].p.C) + { + head_colors[0].line = bufs[0].p.C; + head_colors[0].used_jets = linecount[0].p.C; + } + else + { + head_colors[0].line = 0; + head_colors[0].used_jets = 0; + } + + if (lineactive[0].p.M) + { + head_colors[1].line = bufs[0].p.M; + head_colors[1].used_jets = linecount[0].p.M; + } + else + { + head_colors[1].line = 0; + head_colors[1].used_jets = 0; + } + + if (lineactive[0].p.k) + { + head_colors[2].line = bufs[0].p.k; + head_colors[2].used_jets = linecount[0].p.k; + } + else + { + head_colors[2].line = 0; + head_colors[2].used_jets = 0; + } + } + else + { + /* we have black cartridge; we have to print with all 208 jets at once */ + head_colors[0].line = bufs[0].p.k; + head_colors[0].used_jets = linecount[0].p.k; + head_colors[0].head_nozzle_start = 0; + head_colors[0].head_nozzle_end = sw->jets/2; + head_colors[2].line = NULL; + head_colors[2].used_jets = 0; + head_colors[2].head_nozzle_start = 0; + head_colors[2].head_nozzle_end = 0; + head_colors[1].line = NULL; + head_colors[1].used_jets = 0; + head_colors[1].head_nozzle_start = 0; + head_colors[1].head_nozzle_end = 0; + } + + + + lexmark_write(nv, /* I - Print file or command */ + privdata_weave->outbuf,/*unsigned char *prnBuf, mem block to buffer output */ + &paperShift, /* int *paperShift, */ + privdata_weave->direction, /* int direction, */ + sw->jets, /* num of inks to print */ + caps, /* const lexmark_cap_t * caps, I - Printer model */ + privdata_weave->ink_parameter, + xdpi, /* int xresolution, */ + 2, /* yCount,*/ + head_colors, /* Lexmark_head_colors *head_colors, */ + (lwidth+7)/8, /* length, I - Length of bitmap data of one line in bytes */ + prn_mode | COLOR_MODE_LC | COLOR_MODE_LM | COLOR_MODE_K, /* mode, I - Which color */ + ydpi, /* ydpi, I - Vertical resolution */ + lwidth, /* width, I - Printed width in pixles*/ + hoffset+microoffset, /* offset I - Offset from left side in x_raster_res DPI */ + 0 /* dmt */); + if (privdata_weave->bidirectional) + { + privdata_weave->direction = (privdata_weave->direction +1) & 1; + } + } + /* store paper position in respect if there was a paper shift */ + sw->last_pass_offset = pass->logicalpassstart - (paperShift / (caps->y_raster_res/ydpi)); + } + + for (j = 0; j < sw->ncolors; j++) + { + lineoffs[0].v[j] = 0; + linecount[0].v[j] = 0; + } + +#ifdef DEBUG + stp_erprintf("lexmark_write finished\n"); +#endif + + sw->last_pass = pass->pass; + pass->pass = -1; +} + + + +#ifdef DEBUG + +static void testprint(testdata *td) +{ + int icol, i; + char dummy1[256], dummy2[256]; + stp_linebufs_t linebufs; + + /* init */ + for (i=0; i < (sizeof(linebufs.v)/sizeof(linebufs.v[0])); i++) { + linebufs.v[i] = NULL; + } + + /*let's go */ + td->ifile = fopen("/t1.ppm", "rb"); + if (td->ifile != NULL) { + /* find "{" */ + fscanf(td->ifile, "%[^{]{%[^\"]\"%d %d %d %d\",", dummy1, dummy2, &(td->x), &(td->y), &(td->cols), &(td->deep)); + td->cols -= 1; /* we reduce it by one because fist color will be ignored */ + td->input_line = (char *)malloc(td->x+10); + stp_erprintf("<%s> <%s>\n", dummy1, dummy2); + stp_erprintf("%d %d %d %d\n", td->x, td->y, td->cols, td->deep); + if (td->cols > 16) { + stp_erprintf("too many colors !!\n"); + return; + } + + /* read the colors */ + fscanf(td->ifile, "%[^\"]\"%c c %[^\"]\",", dummy1, dummy2, dummy2); /* jump over first color */ + for (icol=0; icol < td->cols; icol++) { /* we ignor the first color. It is "no dot". */ + fscanf(td->ifile, "%[^\"]\"%c c %[^\"]\",", dummy1, &(td->colchar[icol]), dummy2); + stp_erprintf("colchar %d <%c>\n", i, td->colchar[icol]); + } + + + if (td->cols > 5) { + td->cols = 7; + for (icol=0; icol < td->cols; icol++) { /* we ignor the first color. It is "no dot". */ + linebufs.v[icol] = (char *)malloc((td->x+7)/8); /* allocate the color */ + } + } else if (td->cols > 4) { + td->cols = 5; + for (icol=0; icol < td->cols; icol++) { /* we ignor the first color. It is "no dot". */ + linebufs.v[icol] = (char *)malloc((td->x+7)/8); /* allocate the color */ + } + } else { + td->cols = 1; + linebufs.v[0] = (char *)malloc((td->x+7)/8); /* allocate the color */ + } + } else { + stp_erprintf("can't open file !\n"); + } +} + + +static void readtestprintline(testdata *td, stp_linebufs_t *linebufs) +{ + char dummy1[256]; + int icol, ix; + + stp_erprintf("start readtestprintline\n"); + for (icol=0; icol < 7; icol++) { + if (linebufs->v[icol] != NULL) { + memset(linebufs->v[icol], 0, (td->x+7)/8); /* clean line */ + } + } + stp_erprintf("1 readtestprintline cols %d\n", td->cols); + + + fscanf(td->ifile, "%[^\"]\"%[^\"]\",", dummy1, td->input_line); + for (icol=0; icol < td->cols; icol++) { + for (ix=0; ix < td->x; ix++) { + if (td->input_line[ix] == td->colchar[icol]) { + /* set the dot */ + if (icol != 0) { + linebufs->v[icol-1][ix/8] |= 1 << (ix%8); + } else { + /* this is specific, we set ymc */ + linebufs->p.y[ix/8] |= 1 << (ix%8); + linebufs->p.m[ix/8] |= 1 << (ix%8); + linebufs->p.c[ix/8] |= 1 << (ix%8); + } + } + } + } + /* stp_erprintf("pixchar <%s><%s>\n",dummy1, td->input_line);*/ +} + +#endif diff --git a/src/main/print-pcl.c b/src/main/print-pcl.c new file mode 100644 index 0000000..52fbfbe --- /dev/null +++ b/src/main/print-pcl.c @@ -0,0 +1,2722 @@ +/* + * "$Id: print-pcl.c,v 1.47 2001/10/15 18:39:12 davehill Exp $" + * + * Print plug-in HP PCL driver for the GIMP. + * + * Copyright 1997-2000 Michael Sweet (mike@easysw.com), + * Robert Krawitz (rlk@alum.mit.edu) and + * Dave Hill (dave@minnie.demon.co.uk) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + * This file must include only standard C header files. The core code must + * compile on generic platforms that don't support glib, gimp, gtk, etc. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include "gimp-print-internal.h" +#include +#include +#include + +/* #define DEBUG */ +/* #define PCL_DEBUG_DISABLE_COMPRESSION */ +/* #define PCL_DEBUG_DISABLE_BLANKLINE_REMOVAL */ + +/* + * Local functions... + */ +static void pcl_mode0(const stp_vars_t, unsigned char *, int, int); +static void pcl_mode2(const stp_vars_t, unsigned char *, int, int); + +/* + * Generic define for a name/value set + */ + +typedef struct +{ + const char *pcl_name; + const char *pcl_text; + int pcl_code; + int p0; + int p1; +} pcl_t; + +/* + * Media size to PCL media size code table + * + * Note, you can force the list of papersizes given in the GUI to be only those + * supported by defining PCL_NO_CUSTOM_PAPERSIZES + */ + +/* #define PCL_NO_CUSTOM_PAPERSIZES */ + +#define PCL_PAPERSIZE_EXECUTIVE 1 +#define PCL_PAPERSIZE_LETTER 2 +#define PCL_PAPERSIZE_LEGAL 3 +#define PCL_PAPERSIZE_TABLOID 6 /* "Ledger" */ +#define PCL_PAPERSIZE_STATEMENT 15 /* Called "Manual" in print-util */ +#define PCL_PAPERSIZE_SUPER_B 16 /* Called "13x19" in print-util */ +#define PCL_PAPERSIZE_A5 25 +#define PCL_PAPERSIZE_A4 26 +#define PCL_PAPERSIZE_A3 27 +#define PCL_PAPERSIZE_JIS_B5 45 +#define PCL_PAPERSIZE_JIS_B4 46 +#define PCL_PAPERSIZE_HAGAKI_CARD 71 +#define PCL_PAPERSIZE_OUFUKU_CARD 72 +#define PCL_PAPERSIZE_A6_CARD 73 +#define PCL_PAPERSIZE_4x6 74 +#define PCL_PAPERSIZE_5x8 75 +#define PCL_PAPERSIZE_3x5 78 +#define PCL_PAPERSIZE_MONARCH_ENV 80 +#define PCL_PAPERSIZE_COMMERCIAL10_ENV 81 +#define PCL_PAPERSIZE_DL_ENV 90 +#define PCL_PAPERSIZE_C5_ENV 91 +#define PCL_PAPERSIZE_C6_ENV 92 +#define PCL_PAPERSIZE_CUSTOM 101 /* Custom size */ +#define PCL_PAPERSIZE_INVITATION_ENV 109 +#define PCL_PAPERSIZE_JAPANESE_3_ENV 110 +#define PCL_PAPERSIZE_JAPANESE_4_ENV 111 +#define PCL_PAPERSIZE_KAKU_ENV 113 +#define PCL_PAPERSIZE_HP_CARD 114 /* HP Greeting card!?? */ + +/* + * This data comes from the HP documentation "Deskjet 1220C and 1120C + * PCL reference guide 2.0, Nov 1999". NOTE: The names *must* match + * those in print-util.c for the lookups to work properly! + */ + +static const pcl_t pcl_media_sizes[] = +{ + { "Executive", N_ ("Executive"), PCL_PAPERSIZE_EXECUTIVE}, /* US Exec (7.25 x 10.5 in) */ + { "Letter", N_ ("Letter"), PCL_PAPERSIZE_LETTER}, /* US Letter (8.5 x 11 in) */ + { "Legal", N_ ("Legal"), PCL_PAPERSIZE_LEGAL}, /* US Legal (8.5 x 14 in) */ + { "Tabloid", N_ ("Tabloid"), PCL_PAPERSIZE_TABLOID}, /* US Tabloid (11 x 17 in) */ + { "Statement", N_ ("Manual"), PCL_PAPERSIZE_STATEMENT}, /* US Manual/Statement (5.5 x 8.5 in) */ + { "SuperB", N_ ("13x19"), PCL_PAPERSIZE_SUPER_B}, /* US 13x19/Super B (13 x 19 in) */ + { "A5", N_ ("A5"), PCL_PAPERSIZE_A5}, /* ISO/JIS A5 (148 x 210 mm) */ + { "A4", N_ ("A4"), PCL_PAPERSIZE_A4}, /* ISO/JIS A4 (210 x 297 mm) */ + { "A3", N_ ("A3"), PCL_PAPERSIZE_A3}, /* ISO/JIS A3 (297 x 420 mm) */ + { "B5", N_ ("B5 JIS"), PCL_PAPERSIZE_JIS_B5}, /* JIS B5 (182 x 257 mm). */ + { "B4", N_ ("B4 JIS"), PCL_PAPERSIZE_JIS_B4}, /* JIS B4 (257 x 364 mm). */ + { "w283h420", N_ ("Hagaki Card"), PCL_PAPERSIZE_HAGAKI_CARD}, /* Japanese Hagaki Card (100 x 148 mm) */ + { "w420h567", N_ ("Oufuku Card"), PCL_PAPERSIZE_OUFUKU_CARD}, /* Japanese Oufuku Card (148 x 200 mm) */ + { "A6", N_ ("A6"), PCL_PAPERSIZE_A6_CARD}, /* ISO/JIS A6 card */ + { "w288h432", N_ ("4x6"), PCL_PAPERSIZE_4x6}, /* US Index card (4 x 6 in) */ + { "w360h576", N_ ("5x8"), PCL_PAPERSIZE_5x8}, /* US Index card (5 x 8 in) */ + { "w216h360", N_ ("3x5"), PCL_PAPERSIZE_3x5}, /* US Index card (3 x 5 in) */ + { "Monarch", N_ ("Monarch"), PCL_PAPERSIZE_MONARCH_ENV}, /* Monarch Envelope (3 7/8 x 7 1/2 in) */ + { "COM10", N_ ("Commercial 10"), PCL_PAPERSIZE_COMMERCIAL10_ENV}, /* US Commercial 10 Envelope (4.125 x 9.5 in) Portrait */ + { "DL", N_ ("DL"), PCL_PAPERSIZE_DL_ENV}, /* DL envelope (110 x 220 mm) Portrait */ + { "C5", N_ ("C5"), PCL_PAPERSIZE_C5_ENV}, /* C5 envelope (162 x 229 mm) */ + { "C6", N_ ("C6"), PCL_PAPERSIZE_C6_ENV}, /* C6 envelope (114 x 162 mm) */ + { "ENVA2", N_ ("A2 Invitation"), PCL_PAPERSIZE_INVITATION_ENV}, /* US A2 Invitation envelope (4 3/8 x 5 3/4 in) */ + { "w340h666", N_ ("Long 3"), PCL_PAPERSIZE_JAPANESE_3_ENV}, /* Japanese Long Envelope #3 (120 x 235 mm) */ + { "w255h581", N_ ("Long 4"), PCL_PAPERSIZE_JAPANESE_4_ENV}, /* Japanese Long Envelope #4 (90 x 205 mm) */ + { "w680h941", N_ ("Kaku"), PCL_PAPERSIZE_KAKU_ENV}, /* Japanese Kaku Envelope (240 x 332.1 mm) */ +/**** MRS: this size not supported by print-util funcs! ****/ + { "w612h792", N_ ("HP Greeting Card"), PCL_PAPERSIZE_HP_CARD}, /* Hp greeting card (size?? */ +}; +#define NUM_PRINTER_PAPER_SIZES (sizeof(pcl_media_sizes) / sizeof(pcl_t)) + +/* + * Media type to code table + */ + +#define PCL_PAPERTYPE_PLAIN 0 +#define PCL_PAPERTYPE_BOND 1 +#define PCL_PAPERTYPE_PREMIUM 2 +#define PCL_PAPERTYPE_GLOSSY 3 /* or photo */ +#define PCL_PAPERTYPE_TRANS 4 +#define PCL_PAPERTYPE_QPHOTO 5 /* Quick dry photo (2000 only) */ +#define PCL_PAPERTYPE_QTRANS 6 /* Quick dry transparency (2000 only) */ + +static const pcl_t pcl_media_types[] = +{ + { "Plain", N_ ("Plain"), PCL_PAPERTYPE_PLAIN}, + { "Bond", N_ ("Bond"), PCL_PAPERTYPE_BOND}, + { "Premium", N_ ("Premium"), PCL_PAPERTYPE_PREMIUM}, + { "Glossy", N_ ("Glossy Photo"), PCL_PAPERTYPE_GLOSSY}, + { "Transparency", N_ ("Transparency"), PCL_PAPERTYPE_TRANS}, + { "GlossyQD", N_ ("Quick-dry Photo"), PCL_PAPERTYPE_QPHOTO}, + { "TransparencyQD", N_ ("Quick-dry Transparency"), PCL_PAPERTYPE_QTRANS}, +}; +#define NUM_PRINTER_PAPER_TYPES (sizeof(pcl_media_types) / sizeof(pcl_t)) + +/* + * Media feed to code table. There are different names for the same code, + * so we encode them by adding "lumps" of "PAPERSOURCE_MOD". + * This is removed later to get back to the main codes. + */ + +#define PAPERSOURCE_MOD 16 + +#define PCL_PAPERSOURCE_STANDARD 0 /* Don't output code */ +#define PCL_PAPERSOURCE_MANUAL 2 +#define PCL_PAPERSOURCE_ENVELOPE 3 /* Not used */ + +/* LaserJet types */ +#define PCL_PAPERSOURCE_LJ_TRAY2 1 +#define PCL_PAPERSOURCE_LJ_TRAY3 4 +#define PCL_PAPERSOURCE_LJ_TRAY4 5 +#define PCL_PAPERSOURCE_LJ_TRAY1 8 + +/* Deskjet 340 types */ +#define PCL_PAPERSOURCE_340_PCSF 1 + PAPERSOURCE_MOD + /* Portable sheet feeder for 340 */ +#define PCL_PAPERSOURCE_340_DCSF 4 + PAPERSOURCE_MOD + /* Desktop sheet feeder for 340 */ + +/* Other Deskjet types */ +#define PCL_PAPERSOURCE_DJ_TRAY 1 + PAPERSOURCE_MOD + PAPERSOURCE_MOD +#define PCL_PAPERSOURCE_DJ_TRAY2 4 + PAPERSOURCE_MOD + PAPERSOURCE_MOD + /* Tray 2 for 2500 */ +#define PCL_PAPERSOURCE_DJ_OPTIONAL 5 + PAPERSOURCE_MOD + PAPERSOURCE_MOD + /* Optional source for 2500 */ +#define PCL_PAPERSOURCE_DJ_AUTO 7 + PAPERSOURCE_MOD + PAPERSOURCE_MOD + /* Autoselect for 2500 */ + +static const pcl_t pcl_media_sources[] = +{ + { "Standard", N_ ("Standard"), PCL_PAPERSOURCE_STANDARD}, + { "Manual", N_ ("Manual"), PCL_PAPERSOURCE_MANUAL}, +/* {"Envelope", PCL_PAPERSOURCE_ENVELOPE}, */ + { "MultiPurpose", N_ ("Tray 1"), PCL_PAPERSOURCE_LJ_TRAY1}, + { "Upper", N_ ("Tray 2"), PCL_PAPERSOURCE_LJ_TRAY2}, + { "Lower", N_ ("Tray 3"), PCL_PAPERSOURCE_LJ_TRAY3}, + { "LargeCapacity", N_ ("Tray 4"), PCL_PAPERSOURCE_LJ_TRAY4}, + { "Portable", N_ ("Portable Sheet Feeder"), PCL_PAPERSOURCE_340_PCSF}, + { "Desktop", N_ ("Desktop Sheet Feeder"), PCL_PAPERSOURCE_340_DCSF}, + { "Tray", N_ ("Tray"), PCL_PAPERSOURCE_DJ_TRAY}, + { "Tray2", N_ ("Tray 2"), PCL_PAPERSOURCE_DJ_TRAY2}, + { "Optional", N_ ("Optional Source"), PCL_PAPERSOURCE_DJ_OPTIONAL}, + { "Auto", N_ ("Autoselect"), PCL_PAPERSOURCE_DJ_AUTO}, +}; +#define NUM_PRINTER_PAPER_SOURCES (sizeof(pcl_media_sources) / sizeof(pcl_t)) + +#define PCL_RES_150_150 1 +#define PCL_RES_300_300 2 +#define PCL_RES_600_300 4 /* DJ 600 series */ +#define PCL_RES_600_600_MONO 8 /* DJ 600/800/1100/2000 b/w only */ +#define PCL_RES_600_600 16 /* DJ 9xx/1220C/PhotoSmart */ +#define PCL_RES_1200_600 32 /* DJ 9xx/1220C/PhotoSmart */ +#define PCL_RES_2400_600 64 /* DJ 9xx/1220C/PhotoSmart */ + +static const pcl_t pcl_resolutions[] = +{ + { "150dpi", N_("150x150 DPI"), PCL_RES_150_150, 150, 150}, + { "300dpi", N_("300x300 DPI"), PCL_RES_300_300, 300, 300}, + { "600x300dpi", N_("600x300 DPI"), PCL_RES_600_300, 600, 300}, + { "600mono", N_("600x600 DPI monochrome"), PCL_RES_600_600_MONO, 600, 600}, + { "600dpi", N_("600x600 DPI"), PCL_RES_600_600, 600, 600}, + { "1200x600dpi", N_("1200x600 DPI"), PCL_RES_1200_600, 1200, 600}, + { "2400x600dpi", N_("2400x600 DPI"), PCL_RES_2400_600, 2400, 600}, +}; +#define NUM_RESOLUTIONS (sizeof(pcl_resolutions) / sizeof (pcl_t)) + +static void +pcl_describe_resolution(const stp_printer_t printer, + const char *resolution, int *x, int *y) +{ + int i; + for (i = 0; i < NUM_RESOLUTIONS; i++) + { + if (!strcmp(resolution, pcl_resolutions[i].pcl_name)) + { + *x = pcl_resolutions[i].p0; + *y = pcl_resolutions[i].p1; + return; + } + } + *x = -1; + *y = -1; +} + +/* + * Printer capability data + */ + +typedef struct { + int model; + int custom_max_width; + int custom_max_height; + int custom_min_width; + int custom_min_height; + int resolutions; + int top_margin; + int bottom_margin; + int left_margin; + int right_margin; + int color_type; /* 2 print head or one, 2 level or 4 */ + int stp_printer_type; /* Deskjet/Laserjet and quirks */ +/* The paper size, paper type and paper source codes cannot be combined */ + const int paper_sizes[NUM_PRINTER_PAPER_SIZES + 1]; + /* Paper sizes */ + const int paper_types[NUM_PRINTER_PAPER_TYPES + 1]; + /* Paper types */ + const int paper_sources[NUM_PRINTER_PAPER_SOURCES + 1]; + /* Paper sources */ + } pcl_cap_t; + +#define PCL_COLOR_NONE 0 +#define PCL_COLOR_CMY 1 /* One print head */ +#define PCL_COLOR_CMYK 2 /* Two print heads */ +#define PCL_COLOR_CMYK4 4 /* CRet printing */ +#define PCL_COLOR_CMYKcm 8 /* CMY + Photo Cart */ +#define PCL_COLOR_CMYK4b 16 /* CRet for HP840c */ + +#define PCL_PRINTER_LJ 1 +#define PCL_PRINTER_DJ 2 +#define PCL_PRINTER_NEW_ERG 4 /* use "\033*rC" to end raster graphics, + instead of "\033*rB" */ +#define PCL_PRINTER_TIFF 8 /* Use TIFF compression */ +#define PCL_PRINTER_MEDIATYPE 16 /* Use media type & print quality */ +#define PCL_PRINTER_CUSTOM_SIZE 32 /* Custom sizes supported */ +#define PCL_PRINTER_BLANKLINE 64 /* Blank line removal supported */ + +/* + * FIXME - the 520 shouldn't be lumped in with the 500 as it supports + * more paper sizes. + * + * The following models use depletion, raster quality and shingling:- + * 500, 500c, 510, 520, 550c, 560c. + * The rest use Media Type and Print Quality. + * + * This data comes from the HP documentation "Deskjet 1220C and 1120C + * PCL reference guide 2.0, Nov 1999". + */ + +static const pcl_cap_t pcl_model_capabilities[] = +{ + /* Default/unknown printer - assume laserjet */ + { 0, + 17 * 72 / 2, 14 * 72, /* Max paper size */ + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300, /* Resolutions */ + 12, 12, 18, 18, /* Margins */ + PCL_COLOR_NONE, + PCL_PRINTER_LJ, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_STATEMENT, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A4, + 0, + }, + { -1, /* No selectable paper types */ + }, + { -1, /* No selectable paper sources */ + }, + }, + /* DesignJet 750C */ + { 750, + 36 * 72, 100 * 12 * 72, /* Length limited to 51" in sheet mode */ + 5 * 72, 583 * 72 / 100, /* Min paper size */ + PCL_RES_300_300 | PCL_RES_600_600_MONO, + 30, 30, 15, 15, + PCL_COLOR_CMYK, + PCL_PRINTER_DJ | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE | PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_NEW_ERG, + { + PCL_PAPERSIZE_LETTER, + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + -1, + }, + { + PCL_PAPERSOURCE_STANDARD, + -1, + }, + }, + /* Deskjet 340 */ + { 340, + 17 * 72 / 2, 14 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300, + 7, 41, 18, 18, + PCL_COLOR_CMY, + PCL_PRINTER_DJ | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A4, + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + -1, + }, + { + PCL_PAPERSOURCE_STANDARD, + PCL_PAPERSOURCE_MANUAL, + PCL_PAPERSOURCE_340_PCSF, + PCL_PAPERSOURCE_340_DCSF, + -1, + }, + }, + /* Deskjet 400 */ + { 400, + 17 * 72 / 2, 14 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300, + 7, 41, 18, 18, + PCL_COLOR_CMY, + PCL_PRINTER_DJ | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_JIS_B5, + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + -1, + }, + { -1, /* No selectable paper sources */ + }, + }, + /* Deskjet 500, 520. Lexmark 4076 */ + { 500, + 17 * 72 / 2, 14 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300, + 7, 41, 18, 18, + PCL_COLOR_NONE, + PCL_PRINTER_DJ | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE, + { +/* PCL_PAPERSIZE_EXECUTIVE, The 500 doesn't support this, the 520 does */ + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_COMMERCIAL10_ENV, +/* PCL_PAPERSIZE_DL_ENV, The 500 doesn't support this, the 520 does */ + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + -1, + }, + { + PCL_PAPERSOURCE_STANDARD, + PCL_PAPERSOURCE_MANUAL, + PCL_PAPERSOURCE_DJ_TRAY, + -1, + }, + }, + /* Deskjet 500C */ + { 501, + 17 * 72 / 2, 14 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300, + 7, 33, 18, 18, + PCL_COLOR_CMY, + PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_COMMERCIAL10_ENV, + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + -1, + }, + { + PCL_PAPERSOURCE_STANDARD, + PCL_PAPERSOURCE_MANUAL, + PCL_PAPERSOURCE_DJ_TRAY, + -1, + }, + }, + /* Deskjet 540C */ + { 540, + 17 * 72 / 2, 14 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300, + 7, 33, 18, 18, + PCL_COLOR_CMY, + PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE | + PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_A5, + PCL_PAPERSIZE_JIS_B5, + PCL_PAPERSIZE_HAGAKI_CARD, + PCL_PAPERSIZE_A6_CARD, + PCL_PAPERSIZE_4x6, + PCL_PAPERSIZE_5x8, + PCL_PAPERSIZE_COMMERCIAL10_ENV, + PCL_PAPERSIZE_DL_ENV, + PCL_PAPERSIZE_C6_ENV, + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + -1, + }, + { + PCL_PAPERSOURCE_STANDARD, + PCL_PAPERSOURCE_MANUAL, + PCL_PAPERSOURCE_DJ_TRAY, + -1, + }, + }, + /* Deskjet 550C, 560C */ + { 550, + 17 * 72 / 2, 14 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300, + 3, 33, 18, 18, + PCL_COLOR_CMYK, + PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A4, +/* The 550/560 support COM10 and DL envelope, but the control codes + are negative, indicating landscape mode. This needs thinking about! */ + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + -1, + }, + { + PCL_PAPERSOURCE_STANDARD, + PCL_PAPERSOURCE_MANUAL, + PCL_PAPERSOURCE_DJ_TRAY, + -1, + }, + }, + /* Deskjet 600/600C */ + { 600, + 17 * 72 / 2, 14 * 72, + 5 * 72, 583 * 72 / 100, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_300 | PCL_RES_600_600_MONO, + 0, 33, 18, 18, + PCL_COLOR_CMY, + PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE | + PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A5, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_HAGAKI_CARD, + PCL_PAPERSIZE_A6_CARD, + PCL_PAPERSIZE_4x6, + PCL_PAPERSIZE_5x8, + PCL_PAPERSIZE_COMMERCIAL10_ENV, + PCL_PAPERSIZE_DL_ENV, + PCL_PAPERSIZE_C6_ENV, + PCL_PAPERSIZE_INVITATION_ENV, + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + -1, + }, + { -1, /* No selectable paper sources */ + }, + }, + /* Deskjet 6xx series */ + { 601, + 17 * 72 / 2, 14 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_300 | PCL_RES_600_600_MONO, + 0, 33, 18, 18, + PCL_COLOR_CMYK, + PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE | + PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A5, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_HAGAKI_CARD, + PCL_PAPERSIZE_A6_CARD, + PCL_PAPERSIZE_4x6, + PCL_PAPERSIZE_5x8, + PCL_PAPERSIZE_COMMERCIAL10_ENV, + PCL_PAPERSIZE_DL_ENV, + PCL_PAPERSIZE_C6_ENV, + PCL_PAPERSIZE_INVITATION_ENV, + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + -1, + }, + { + -1, + }, + }, + /* Deskjet 69x series (Photo Capable) */ + { 690, + 17 * 72 / 2, 14 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_300 | PCL_RES_600_600, + 0, 33, 18, 18, + PCL_COLOR_CMYK | PCL_COLOR_CMYKcm, + PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE | + PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A5, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_HAGAKI_CARD, + PCL_PAPERSIZE_A6_CARD, + PCL_PAPERSIZE_4x6, + PCL_PAPERSIZE_5x8, + PCL_PAPERSIZE_COMMERCIAL10_ENV, + PCL_PAPERSIZE_DL_ENV, + PCL_PAPERSIZE_C6_ENV, + PCL_PAPERSIZE_INVITATION_ENV, + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + -1, + }, + { + -1, + }, + }, + /* Deskjet 850/855/870/890 (C-RET) */ + { 800, + 17 * 72 / 2, 14 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_600_MONO, + 3, 33, 18, 18, + PCL_COLOR_CMYK | PCL_COLOR_CMYK4, + PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE | + PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A5, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_HAGAKI_CARD, + PCL_PAPERSIZE_A6_CARD, + PCL_PAPERSIZE_4x6, + PCL_PAPERSIZE_5x8, + PCL_PAPERSIZE_COMMERCIAL10_ENV, + PCL_PAPERSIZE_DL_ENV, + PCL_PAPERSIZE_C6_ENV, + PCL_PAPERSIZE_INVITATION_ENV, + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + -1, + }, + { + -1, + }, + }, + /* Deskjet 810C, 812C, 840C, 842C, 845C, 895C (C-RET) */ + { 840, + 17 * 72 / 2, 14 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_300 | PCL_RES_600_600, + 0, 33, 18, 18, + PCL_COLOR_CMYK | PCL_COLOR_CMYK4b, + PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE | + PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A5, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_HAGAKI_CARD, + PCL_PAPERSIZE_A6_CARD, + PCL_PAPERSIZE_4x6, + PCL_PAPERSIZE_5x8, + PCL_PAPERSIZE_COMMERCIAL10_ENV, + PCL_PAPERSIZE_DL_ENV, + PCL_PAPERSIZE_C6_ENV, + PCL_PAPERSIZE_INVITATION_ENV, + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + -1, + }, + { + -1, + }, + }, + /* Deskjet 900 series, 1220C, PhotoSmart P1000/P1100 */ + { 900, + 17 * 72 / 2, 14 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_600 /* | PCL_RES_1200_600 | PCL_RES_2400_600 */, + 3, 33, 18, 18, + PCL_COLOR_CMYK, + PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE | + PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A5, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_HAGAKI_CARD, + PCL_PAPERSIZE_A6_CARD, + PCL_PAPERSIZE_4x6, + PCL_PAPERSIZE_5x8, + PCL_PAPERSIZE_COMMERCIAL10_ENV, + PCL_PAPERSIZE_DL_ENV, + PCL_PAPERSIZE_C6_ENV, + PCL_PAPERSIZE_INVITATION_ENV, + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + -1, + }, + { -1, /* No selectable paper sources */ + }, + }, + /* Deskjet 1220C (or other large format 900) */ + { 901, + 13 * 72, 19 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_600 /* | PCL_RES_1200_600 | PCL_RES_2400_600 */, + 3, 33, 18, 18, + PCL_COLOR_CMYK, + PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE | + PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_TABLOID, + PCL_PAPERSIZE_STATEMENT, + PCL_PAPERSIZE_SUPER_B, + PCL_PAPERSIZE_A5, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_A3, + PCL_PAPERSIZE_JIS_B5, + PCL_PAPERSIZE_JIS_B4, + PCL_PAPERSIZE_HAGAKI_CARD, + PCL_PAPERSIZE_OUFUKU_CARD, + PCL_PAPERSIZE_A6_CARD, + PCL_PAPERSIZE_4x6, + PCL_PAPERSIZE_5x8, + PCL_PAPERSIZE_3x5, + PCL_PAPERSIZE_HP_CARD, + PCL_PAPERSIZE_MONARCH_ENV, + PCL_PAPERSIZE_COMMERCIAL10_ENV, + PCL_PAPERSIZE_DL_ENV, + PCL_PAPERSIZE_C5_ENV, + PCL_PAPERSIZE_C6_ENV, + PCL_PAPERSIZE_INVITATION_ENV, + PCL_PAPERSIZE_JAPANESE_3_ENV, + PCL_PAPERSIZE_JAPANESE_4_ENV, + PCL_PAPERSIZE_KAKU_ENV, + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + -1, + }, + { -1, /* No selectable paper sources */ + }, + }, + /* Deskjet 1100C, 1120C */ + { 1100, + 13 * 72, 19 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_600_MONO, + 3, 33, 18, 18, + PCL_COLOR_CMYK | PCL_COLOR_CMYK4, + PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE | + PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_TABLOID, + PCL_PAPERSIZE_STATEMENT, + PCL_PAPERSIZE_SUPER_B, + PCL_PAPERSIZE_A5, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_A3, + PCL_PAPERSIZE_JIS_B5, + PCL_PAPERSIZE_JIS_B4, + PCL_PAPERSIZE_HAGAKI_CARD, + PCL_PAPERSIZE_A6_CARD, + PCL_PAPERSIZE_4x6, + PCL_PAPERSIZE_5x8, + PCL_PAPERSIZE_COMMERCIAL10_ENV, + PCL_PAPERSIZE_DL_ENV, + PCL_PAPERSIZE_C6_ENV, + PCL_PAPERSIZE_INVITATION_ENV, + PCL_PAPERSIZE_JAPANESE_3_ENV, + PCL_PAPERSIZE_JAPANESE_4_ENV, + PCL_PAPERSIZE_KAKU_ENV, + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + -1, + }, + { + PCL_PAPERSOURCE_STANDARD, + PCL_PAPERSOURCE_MANUAL, + PCL_PAPERSOURCE_DJ_TRAY, + -1, + }, + }, + /* Deskjet 1200C */ + { 1200, + 17 * 72 / 2, 14 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300, + 12, 12, 18, 18, + PCL_COLOR_CMY, + PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE | + PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE, + { +/* This printer is not mentioned in the Comparison tables, + so I'll just pick some likely sizes... */ + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A5, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_4x6, + PCL_PAPERSIZE_5x8, + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + -1, + }, + { + PCL_PAPERSOURCE_STANDARD, + PCL_PAPERSOURCE_MANUAL, + PCL_PAPERSOURCE_DJ_TRAY, + -1, + }, + }, + /* Deskjet 1600C */ + { 1600, + 17 * 72 / 2, 14 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300, + 12, 12, 18, 18, + PCL_COLOR_CMYK, + PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE | + PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE, + { +/* This printer is not mentioned in the Comparison tables, + so I'll just pick some likely sizes... */ + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A5, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_4x6, + PCL_PAPERSIZE_5x8, + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + -1, + }, + { + PCL_PAPERSOURCE_STANDARD, + PCL_PAPERSOURCE_MANUAL, + PCL_PAPERSOURCE_DJ_TRAY, + -1, + }, + }, + /* Deskjet 2000 */ + { 2000, + 17 * 72 / 2, 14 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_600, + 12, 12, 18, 18, + PCL_COLOR_CMYK, + PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE | + PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A5, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_HAGAKI_CARD, + PCL_PAPERSIZE_A6_CARD, + PCL_PAPERSIZE_4x6, + PCL_PAPERSIZE_5x8, + PCL_PAPERSIZE_3x5, + PCL_PAPERSIZE_COMMERCIAL10_ENV, + PCL_PAPERSIZE_DL_ENV, + PCL_PAPERSIZE_C6_ENV, + PCL_PAPERSIZE_INVITATION_ENV, + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + PCL_PAPERTYPE_QPHOTO, + PCL_PAPERTYPE_QTRANS, + -1, + }, + { + PCL_PAPERSOURCE_STANDARD, + PCL_PAPERSOURCE_MANUAL, + PCL_PAPERSOURCE_DJ_TRAY, + -1, + }, + }, + /* Deskjet 2500 */ + { 2500, + 13 * 72, 19 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_600, + 12, 12, 18, 18, + PCL_COLOR_CMYK, + PCL_PRINTER_DJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_MEDIATYPE | + PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_TABLOID, + PCL_PAPERSIZE_STATEMENT, + PCL_PAPERSIZE_A5, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_A3, + PCL_PAPERSIZE_JIS_B5, + PCL_PAPERSIZE_JIS_B4, + PCL_PAPERSIZE_HAGAKI_CARD, + PCL_PAPERSIZE_A6_CARD, + PCL_PAPERSIZE_4x6, + PCL_PAPERSIZE_5x8, + PCL_PAPERSIZE_COMMERCIAL10_ENV, + PCL_PAPERSIZE_DL_ENV, + -1, + }, + { + PCL_PAPERTYPE_PLAIN, + PCL_PAPERTYPE_BOND, + PCL_PAPERTYPE_PREMIUM, + PCL_PAPERTYPE_GLOSSY, + PCL_PAPERTYPE_TRANS, + PCL_PAPERTYPE_QPHOTO, + PCL_PAPERTYPE_QTRANS, + -1, + }, + { + PCL_PAPERSOURCE_STANDARD, + PCL_PAPERSOURCE_MANUAL, + PCL_PAPERSOURCE_DJ_AUTO, + PCL_PAPERSOURCE_DJ_TRAY, + PCL_PAPERSOURCE_DJ_TRAY2, + PCL_PAPERSOURCE_DJ_OPTIONAL, + -1, + }, + }, + /* LaserJet II series */ + { 2, + 17 * 72 / 2, 14 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300, + 12, 12, 18, 18, + PCL_COLOR_NONE, + PCL_PRINTER_LJ, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_STATEMENT, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_MONARCH_ENV, + PCL_PAPERSIZE_COMMERCIAL10_ENV, + PCL_PAPERSIZE_DL_ENV, + PCL_PAPERSIZE_C5_ENV, + PCL_PAPERSIZE_C6_ENV, + -1, + }, + { -1, /* No selectable paper types */ + }, + { + PCL_PAPERSOURCE_STANDARD, + PCL_PAPERSOURCE_MANUAL, + PCL_PAPERSOURCE_LJ_TRAY1, + PCL_PAPERSOURCE_LJ_TRAY2, + PCL_PAPERSOURCE_LJ_TRAY3, + PCL_PAPERSOURCE_LJ_TRAY4, + -1, + }, + }, + /* LaserJet III series */ + { 3, + 17 * 72 / 2, 14 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300, + 12, 12, 18, 18, + PCL_COLOR_NONE, + PCL_PRINTER_LJ | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_STATEMENT, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_MONARCH_ENV, + PCL_PAPERSIZE_COMMERCIAL10_ENV, + PCL_PAPERSIZE_DL_ENV, + PCL_PAPERSIZE_C5_ENV, + PCL_PAPERSIZE_C6_ENV, + -1, + }, + { -1, /* No selectable paper types */ + }, + { + PCL_PAPERSOURCE_STANDARD, + PCL_PAPERSOURCE_MANUAL, + PCL_PAPERSOURCE_LJ_TRAY1, + PCL_PAPERSOURCE_LJ_TRAY2, + PCL_PAPERSOURCE_LJ_TRAY3, + PCL_PAPERSOURCE_LJ_TRAY4, + -1, + }, + }, + /* LaserJet 4L */ + { 4, + 17 * 72 / 2, 14 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300, + 12, 12, 18, 18, + PCL_COLOR_NONE, + PCL_PRINTER_LJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_STATEMENT, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_MONARCH_ENV, + PCL_PAPERSIZE_COMMERCIAL10_ENV, + PCL_PAPERSIZE_DL_ENV, + PCL_PAPERSIZE_C5_ENV, + PCL_PAPERSIZE_C6_ENV, + -1, + }, + { -1, /* No selectable paper types */ + }, + { + PCL_PAPERSOURCE_STANDARD, + PCL_PAPERSOURCE_MANUAL, + PCL_PAPERSOURCE_LJ_TRAY1, + PCL_PAPERSOURCE_LJ_TRAY2, + PCL_PAPERSOURCE_LJ_TRAY3, + PCL_PAPERSOURCE_LJ_TRAY4, + -1, + }, + }, + /* LaserJet 4V, 4Si */ + { 5, + 13 * 72, 19 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_600, + 12, 12, 18, 18, + PCL_COLOR_NONE, + PCL_PRINTER_LJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_STATEMENT, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_TABLOID, + PCL_PAPERSIZE_A5, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_A3, + PCL_PAPERSIZE_JIS_B5, + PCL_PAPERSIZE_JIS_B4, /* Guess */ + PCL_PAPERSIZE_4x6, + PCL_PAPERSIZE_5x8, + PCL_PAPERSIZE_MONARCH_ENV, + PCL_PAPERSIZE_COMMERCIAL10_ENV, + PCL_PAPERSIZE_DL_ENV, + PCL_PAPERSIZE_C5_ENV, + PCL_PAPERSIZE_C6_ENV, + -1, + }, + { -1, /* No selectable paper types */ + }, + { + PCL_PAPERSOURCE_STANDARD, + PCL_PAPERSOURCE_MANUAL, + PCL_PAPERSOURCE_LJ_TRAY1, + PCL_PAPERSOURCE_LJ_TRAY2, + PCL_PAPERSOURCE_LJ_TRAY3, + PCL_PAPERSOURCE_LJ_TRAY4, + -1, + }, + }, + /* LaserJet 4 series (except as above), 5 series, 6 series */ + { 6, + 17 * 72 / 2, 14 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_600, + 12, 12, 18, 18, + PCL_COLOR_NONE, + PCL_PRINTER_LJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_STATEMENT, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_MONARCH_ENV, + PCL_PAPERSIZE_COMMERCIAL10_ENV, + PCL_PAPERSIZE_DL_ENV, + PCL_PAPERSIZE_C5_ENV, + PCL_PAPERSIZE_C6_ENV, + -1, + }, + { -1, /* No selectable paper types */ + }, + { + PCL_PAPERSOURCE_STANDARD, + PCL_PAPERSOURCE_MANUAL, + PCL_PAPERSOURCE_LJ_TRAY1, + PCL_PAPERSOURCE_LJ_TRAY2, + PCL_PAPERSOURCE_LJ_TRAY3, + PCL_PAPERSOURCE_LJ_TRAY4, + -1, + }, + }, + /* LaserJet 5Si */ + { 7, + 13 * 72, 19 * 72, + 1, 1, /* Min paper size */ + PCL_RES_150_150 | PCL_RES_300_300 | PCL_RES_600_600, + 12, 12, 18, 18, + PCL_COLOR_NONE, + PCL_PRINTER_LJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE, + { + PCL_PAPERSIZE_EXECUTIVE, + PCL_PAPERSIZE_STATEMENT, + PCL_PAPERSIZE_LETTER, + PCL_PAPERSIZE_LEGAL, + PCL_PAPERSIZE_TABLOID, + PCL_PAPERSIZE_A5, + PCL_PAPERSIZE_A4, + PCL_PAPERSIZE_A3, + PCL_PAPERSIZE_JIS_B5, + PCL_PAPERSIZE_JIS_B4, /* Guess */ + PCL_PAPERSIZE_4x6, + PCL_PAPERSIZE_5x8, + PCL_PAPERSIZE_MONARCH_ENV, + PCL_PAPERSIZE_COMMERCIAL10_ENV, + PCL_PAPERSIZE_DL_ENV, + PCL_PAPERSIZE_C5_ENV, + PCL_PAPERSIZE_C6_ENV, + -1, + }, + { -1, /* No selectable paper types */ + }, + { + PCL_PAPERSOURCE_STANDARD, + PCL_PAPERSOURCE_MANUAL, + PCL_PAPERSOURCE_LJ_TRAY1, + PCL_PAPERSOURCE_LJ_TRAY2, + PCL_PAPERSOURCE_LJ_TRAY3, + PCL_PAPERSOURCE_LJ_TRAY4, + -1, + }, + }, +}; + + +static const double sat_adjustment[49] = +{ + 1.0, /* C */ + 1.1, + 1.2, + 1.3, + 1.4, + 1.5, + 1.6, + 1.7, + 1.8, /* B */ + 1.9, + 1.9, + 1.9, + 1.7, + 1.5, + 1.3, + 1.1, + 1.0, /* M */ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, /* R */ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, /* Y */ + 1.0, + 1.0, + 1.1, + 1.2, + 1.3, + 1.4, + 1.5, + 1.5, /* G */ + 1.4, + 1.3, + 1.2, + 1.1, + 1.0, + 1.0, + 1.0, + 1.0 /* C */ +}; + +static const double lum_adjustment[49] = +{ + 0.50, /* C */ + 0.6, + 0.7, + 0.8, + 0.9, + 0.86, + 0.82, + 0.79, + 0.78, /* B */ + 0.8, + 0.83, + 0.87, + 0.9, + 0.95, + 1.05, + 1.15, + 1.3, /* M */ + 1.25, + 1.2, + 1.15, + 1.12, + 1.09, + 1.06, + 1.03, + 1.0, /* R */ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, /* Y */ + 0.9, + 0.8, + 0.7, + 0.65, + 0.6, + 0.55, + 0.52, + 0.48, /* G */ + 0.47, + 0.47, + 0.49, + 0.49, + 0.49, + 0.52, + 0.51, + 0.50 /* C */ +}; + +static const double hue_adjustment[49] = +{ + 0.00, /* C */ + 0.05, + 0.04, + 0.01, + -0.03, + -0.10, + -0.18, + -0.26, + -0.35, /* B */ + -0.43, + -0.40, + -0.32, + -0.25, + -0.18, + -0.10, + -0.07, + 0.00, /* M */ + -0.04, + -0.09, + -0.13, + -0.18, + -0.23, + -0.27, + -0.31, + -0.35, /* R */ + -0.38, + -0.30, + -0.23, + -0.15, + -0.08, + 0.00, + -0.02, + 0.00, /* Y */ + 0.08, + 0.10, + 0.08, + 0.05, + 0.03, + -0.03, + -0.12, + -0.20, /* G */ + -0.17, + -0.20, + -0.17, + -0.15, + -0.12, + -0.10, + -0.08, + 0.00, /* C */ +}; + +/* + * Convert a name into it's option value + */ + +static int pcl_string_to_val(const char *string, /* I: String */ + const pcl_t *options, /* I: Options */ + int num_options) /* I: Num options */ +{ + + int i; + int code = -1; + + /* + * Look up the string in the table and convert to the code. + */ + + for (i=0; ipaper_sizes[i] != -1); i++) { + if (media_code == caps->paper_sizes[i]) + return(media_code); /* Is supported */ + } + + stp_deprintf(STP_DBG_PCL, "Media Code %d not supported by printer model %d.\n", + media_code, model); + return(-1); /* Not supported */ + } + else + return(-1); /* Not supported */ +} + + +static stp_param_t ink_types[] = +{ + { "CMYK", N_ ("Color + Black Cartridges") }, + { "Photo", N_ ("Color + Photo Cartridges") } +}; + + +/* + * 'pcl_papersize_valid()' - Is the paper size valid for this printer. + */ + +static const int +pcl_papersize_valid(const stp_papersize_t pt, + int model) +{ + + const pcl_cap_t *caps = pcl_get_model_capabilities(model); + +#ifdef PCL_NO_CUSTOM_PAPERSIZES + int use_custom = 0; +#else + int use_custom = ((caps->stp_printer_type & PCL_PRINTER_CUSTOM_SIZE) + == PCL_PRINTER_CUSTOM_SIZE); +#endif + + unsigned int pwidth = stp_papersize_get_width(pt); + unsigned int pheight = stp_papersize_get_height(pt); + +/* + * This function decides whether a paper size is allowed for the + * current printer. The DeskJet feed mechanisms set a minimum and + * maximum size for the paper, BUT some of the directly supported + * media sizes are less than this minimum (eg card and envelopes) + * So, we allow supported sizes though, but clamp custom sizes + * to the min and max sizes. + */ + +/* + * Is it a valid name? + */ + + if (strlen(stp_papersize_get_name(pt)) <= 0) + return(0); + +/* + * Is it a recognised supported name? + */ + + if (pcl_convert_media_size(stp_papersize_get_name(pt), model) != -1) + return(1); + +/* + * If we are not allowed to use custom paper sizes, we are done + */ + + if (use_custom == 0) + return(0); + +/* + * We are allowed custom paper sizes. Check that the size is within + * limits. + */ + + if (pwidth <= caps->custom_max_width && + pheight <= caps->custom_max_height && + (pheight >= caps->custom_min_height || pheight == 0) && + (pwidth >= caps->custom_min_width || pwidth == 0)) + return(1); + + return(0); +} + +/* + * 'pcl_parameters()' - Return the parameter values for the given parameter. + */ + +static stp_param_t * /* O - Parameter values */ +pcl_parameters(const stp_printer_t printer,/* I - Printer model */ + const char *ppd_file, /* I - PPD file (not used) */ + const char *name, /* I - Name of parameter */ + int *count) /* O - Number of values */ +{ + int model = stp_printer_get_model(printer); + int i; + stp_param_t *valptrs; + const pcl_cap_t *caps; + + if (count == NULL) + return (NULL); + + *count = 0; + + if (name == NULL) + return (NULL); + + stp_deprintf(STP_DBG_PCL, "pcl_parameters(): Name = %s\n", name); + + caps = pcl_get_model_capabilities(model); + + stp_deprintf(STP_DBG_PCL, "Printer model = %d\n", model); + stp_deprintf(STP_DBG_PCL, "PageWidth = %d, PageHeight = %d\n", caps->custom_max_width, caps->custom_max_height); + stp_deprintf(STP_DBG_PCL, "MinPageWidth = %d, MinPageHeight = %d\n", caps->custom_min_width, caps->custom_min_height); + stp_deprintf(STP_DBG_PCL, "Margins: top = %d, bottom = %d, left = %d, right = %d\n", + caps->top_margin, caps->bottom_margin, caps->left_margin, caps->right_margin); + stp_deprintf(STP_DBG_PCL, "Resolutions: %d\n", caps->resolutions); + stp_deprintf(STP_DBG_PCL, "ColorType = %d, PrinterType = %d\n", caps->color_type, caps->stp_printer_type); + + if (strcmp(name, "PageSize") == 0) + { + int papersizes = stp_known_papersizes(); + valptrs = stp_malloc(sizeof(stp_param_t) * papersizes); + *count = 0; + for (i = 0; i < papersizes; i++) + { + const stp_papersize_t pt = stp_get_papersize_by_index(i); + if (strlen(stp_papersize_get_name(pt)) > 0) + { + if (pcl_papersize_valid(pt, model)) + { + valptrs[*count].name = c_strdup(stp_papersize_get_name(pt)); + valptrs[*count].text = c_strdup(stp_papersize_get_text(pt)); + (*count)++; + } + } + } + return (valptrs); + } + else if (strcmp(name, "MediaType") == 0) + { + if (caps->paper_types[0] == -1) + { + *count = 0; + return (NULL); + } + else + { + valptrs = stp_malloc(sizeof(stp_param_t) * NUM_PRINTER_PAPER_TYPES); + *count = 0; + for (i=0; (i < NUM_PRINTER_PAPER_TYPES) && (caps->paper_types[i] != -1); i++) + { + valptrs[i].name = c_strdup(pcl_val_to_string(caps->paper_types[i], + pcl_media_types, + NUM_PRINTER_PAPER_TYPES)); + valptrs[i].text = c_strdup(pcl_val_to_text(caps->paper_types[i], + pcl_media_types, + NUM_PRINTER_PAPER_TYPES)); + (*count)++; + } + return(valptrs); + } + } + else if (strcmp(name, "InputSlot") == 0) + { + if (caps->paper_sources[0] == -1) + { + *count = 0; + return (NULL); + } + else + { + valptrs = stp_malloc(sizeof(stp_param_t) * NUM_PRINTER_PAPER_SOURCES); + *count = 0; + for (i=0; (i < NUM_PRINTER_PAPER_SOURCES) && (caps->paper_sources[i] != -1); i++) + { + valptrs[i].name = c_strdup(pcl_val_to_string(caps->paper_sources[i], + pcl_media_sources, + NUM_PRINTER_PAPER_SOURCES)); + valptrs[i].text = c_strdup(pcl_val_to_text(caps->paper_sources[i], + pcl_media_sources, + NUM_PRINTER_PAPER_SOURCES)); + (*count)++; + } + return(valptrs); + } + } + else if (strcmp(name, "Resolution") == 0) + { + *count = 0; + valptrs = stp_malloc(sizeof(stp_param_t) * NUM_RESOLUTIONS); + for (i = 0; i < NUM_RESOLUTIONS; i++) + { + if (caps->resolutions & pcl_resolutions[i].pcl_code) + { + valptrs[*count].name = c_strdup(pcl_val_to_string(pcl_resolutions[i].pcl_code, + pcl_resolutions, NUM_RESOLUTIONS)); + valptrs[*count].text = c_strdup(pcl_val_to_text(pcl_resolutions[i].pcl_code, + pcl_resolutions, NUM_RESOLUTIONS)); + (*count)++; + } + } + return(valptrs); + } + else if (strcmp(name, "InkType") == 0) + { + if (caps->color_type & PCL_COLOR_CMYKcm) + { + valptrs = stp_malloc(sizeof(stp_param_t) * 2); + valptrs[0].name = c_strdup(ink_types[0].name); + valptrs[0].text = c_strdup(_(ink_types[0].text)); + valptrs[1].name = c_strdup(ink_types[1].name); + valptrs[1].text = c_strdup(_(ink_types[1].text)); + *count = 2; + return(valptrs); + } + else + return(NULL); + } + else + return (NULL); +} + +static const char * +pcl_default_parameters(const stp_printer_t printer, + const char *ppd_file, + const char *name) +{ + int model = stp_printer_get_model(printer); + int i; + const pcl_cap_t *caps; + + if (name == NULL) + return (NULL); + + stp_deprintf(STP_DBG_PCL, "pcl_default_parameters(): Name = %s\n", name); + + caps = pcl_get_model_capabilities(model); + + stp_deprintf(STP_DBG_PCL, "Printer model = %d\n", model); + stp_deprintf(STP_DBG_PCL, "PageWidth = %d, PageHeight = %d\n", caps->custom_max_width, caps->custom_max_height); + stp_deprintf(STP_DBG_PCL, "MinPageWidth = %d, MinPageHeight = %d\n", caps->custom_min_width, caps->custom_min_height); + stp_deprintf(STP_DBG_PCL, "Margins: top = %d, bottom = %d, left = %d, right = %d\n", + caps->top_margin, caps->bottom_margin, caps->left_margin, caps->right_margin); + stp_deprintf(STP_DBG_PCL, "Resolutions: %d\n", caps->resolutions); + stp_deprintf(STP_DBG_PCL, "ColorType = %d, PrinterType = %d\n", caps->color_type, caps->stp_printer_type); + + if (strcmp(name, "PageSize") == 0) + { + int papersizes = stp_known_papersizes(); + for (i = 0; i < papersizes; i++) + { + const stp_papersize_t pt = stp_get_papersize_by_index(i); + if (strlen(stp_papersize_get_name(pt)) > 0 && + pcl_papersize_valid(pt, model)) + { + return (stp_papersize_get_name(pt)); + } + } + return NULL; + } + else if (strcmp(name, "MediaType") == 0) + { + if (caps->paper_types[0] == -1) + { + return (NULL); + } + else + { + return (pcl_val_to_string(caps->paper_types[0], pcl_media_types, + NUM_PRINTER_PAPER_TYPES)); + } + } + else if (strcmp(name, "InputSlot") == 0) + { + if (caps->paper_sources[0] == -1) + { + return (NULL); + } + else + { + return (pcl_val_to_string(caps->paper_sources[0], pcl_media_sources, + NUM_PRINTER_PAPER_SOURCES)); + } + } + else if (strcmp(name, "Resolution") == 0) + { + for (i = 0; i < NUM_RESOLUTIONS; i++) + { + if ((caps->resolutions & pcl_resolutions[i].pcl_code) && + (pcl_resolutions[i].pcl_code >= PCL_RES_300_300)) + { + return (pcl_val_to_string(pcl_resolutions[i].pcl_code, + pcl_resolutions, NUM_RESOLUTIONS)); + } + } + /* If printer can't handle at least 300x300, look for anything that */ + /* works */ + for (i = 0; i < NUM_RESOLUTIONS; i++) + { + if ((caps->resolutions & pcl_resolutions[i].pcl_code)) + { + return (pcl_val_to_string(pcl_resolutions[i].pcl_code, + pcl_resolutions, NUM_RESOLUTIONS)); + } + } + return NULL; + } + else if (strcmp(name, "InkType") == 0) + { + if (caps->color_type & PCL_COLOR_CMYKcm) + { + return (ink_types[0].name); + } + else + return(NULL); + } + else + return (NULL); +} + + +/* + * 'pcl_imageable_area()' - Return the imageable area of the page. + */ + +static void +pcl_imageable_area(const stp_printer_t printer, /* I - Printer model */ + const stp_vars_t v, /* I */ + int *left, /* O - Left position in points */ + int *right, /* O - Right position in points */ + int *bottom, /* O - Bottom position in points */ + int *top) /* O - Top position in points */ +{ + int width, height; /* Size of page */ + const pcl_cap_t *caps; /* Printer caps */ + + caps = pcl_get_model_capabilities(stp_printer_get_model(printer)); + + stp_default_media_size(printer, v, &width, &height); + +/* + * Note: The margins actually vary with paper size, but since you can + * move the image around on the page anyway, it hardly matters. + */ + + *left = caps->left_margin; + *right = width - caps->right_margin; + *top = height - caps->top_margin; + *bottom = caps->bottom_margin; +} + +static void +pcl_limit(const stp_printer_t printer, /* I - Printer model */ + const stp_vars_t v, /* I */ + int *width, + int *height, + int *min_width, + int *min_height) +{ + const pcl_cap_t *caps= pcl_get_model_capabilities(stp_printer_get_model(printer)); + *width = caps->custom_max_width; + *height = caps->custom_max_height; + *min_width = caps->custom_min_width; + *min_height = caps->custom_min_height; +} + +/* + * 'pcl_print()' - Print an image to an HP printer. + */ + +static void +pcl_print(const stp_printer_t printer, /* I - Model */ + stp_image_t *image, /* I - Image to print */ + const stp_vars_t v) +{ + int i; + unsigned char *cmap = stp_get_cmap(v); + int model = stp_printer_get_model(printer); + const char *resolution = stp_get_resolution(v); + const char *media_size; + const char *media_type = stp_get_media_type(v); + const char *media_source = stp_get_media_source(v); + const char *ink_type = stp_get_ink_type(v); + int output_type = stp_get_output_type(v); + int orientation = stp_get_orientation(v); + double scaling = stp_get_scaling(v); + int top = stp_get_top(v); + int left = stp_get_left(v); + int y; /* Looping vars */ + int xdpi, ydpi; /* Resolution */ + unsigned short *out; + unsigned char *in, /* Input pixels */ + *black, /* Black bitmap data */ + *cyan, /* Cyan bitmap data */ + *magenta, /* Magenta bitmap data */ + *yellow, /* Yellow bitmap data */ + *lcyan, /* Light Cyan bitmap data */ + *lmagenta; /* Light Magenta bitmap data */ + int page_left, /* Left margin of page */ + page_right, /* Right margin of page */ + page_top, /* Top of page */ + page_bottom, /* Bottom of page */ + page_width, /* Width of page */ + page_height, /* Height of page */ + out_width, /* Width of image on page */ + out_height, /* Height of image on page */ + out_bpp, /* Output bytes per pixel */ + height, /* Height of raster data */ + errdiv, /* Error dividend */ + errmod, /* Error modulus */ + errval, /* Current error value */ + errline, /* Current raster line */ + errlast; /* Last raster line loaded */ + stp_convert_t colorfunc; /* Color conversion function... */ + int zero_mask; + void (*writefunc)(const stp_vars_t, unsigned char *, int, int); + /* PCL output function */ + int image_height, + image_width, + image_bpp; + void * dither; + const pcl_cap_t *caps; /* Printer capabilities */ + int do_cret, /* 300 DPI CRet printing */ + do_cretb, /* 600 DPI CRet printing HP 840C*/ + do_6color, /* CMY + cmK printing */ + planes; /* # of output planes */ + int pcl_media_size, /* PCL media size code */ + pcl_media_type, /* PCL media type code */ + pcl_media_source; /* PCL media source code */ + const double *dot_sizes_use,dot_sizes_cret[]={1.0,1.0,1.0}; /* The dot size used */ + stp_vars_t nv = stp_allocate_copy(v); + stp_papersize_t pp; + int len_c, /* Active length of Cyan buffers */ + len_lc, /* Ditto Light Cyan */ + len_m, /* Ditto Magenta */ + len_lm, /* Ditto Light Magenta */ + len_y, /* Ditto Cyan */ + len_k; /* Ditto Black */ + int blank_lines, /* Accumulated blank lines */ + is_blank, /* Current line is blank */ + do_blank; /* Blank line removal required */ + + if (!stp_get_verified(nv)) + { + stp_eprintf(nv, "Print options not verified; cannot print.\n"); + return; + } + + caps = pcl_get_model_capabilities(model); + + /* + * Setup a read-only pixel region for the entire image... + */ + + image->init(image); + image_height = image->height(image); + image_width = image->width(image); + image_bpp = image->bpp(image); + + /* + * Figure out the output resolution... + */ + + xdpi = 0; + ydpi = 0; + for (i = 0; i < NUM_RESOLUTIONS; i++) + { + if (!strcmp(resolution, pcl_resolutions[i].pcl_name)) + { + xdpi = pcl_resolutions[i].p0; + ydpi = pcl_resolutions[i].p1; + break; + } + } + + stp_deprintf(STP_DBG_PCL,"pcl: resolution=%dx%d\n",xdpi,ydpi); + if (xdpi == 0 || ydpi == 0) + return; + + /* + * Choose the correct color conversion function... + */ + if (((caps->resolutions & PCL_RES_600_600_MONO) == PCL_RES_600_600_MONO) && + output_type != OUTPUT_GRAY && output_type != OUTPUT_MONOCHROME && + xdpi == 600 && ydpi == 600) + { + stp_eprintf(v, "600x600 resolution only available in MONO\n"); + output_type = OUTPUT_GRAY; + stp_set_output_type(nv, OUTPUT_GRAY); + } + + if (caps->color_type == PCL_COLOR_NONE && output_type != OUTPUT_MONOCHROME) + { + output_type = OUTPUT_GRAY; + stp_set_output_type(nv, OUTPUT_GRAY); + } + stp_set_output_color_model(nv, COLOR_MODEL_CMY); + + colorfunc = stp_choose_colorfunc(output_type, image_bpp, cmap, &out_bpp, nv); + + do_cret = (xdpi >= 300 && + ((caps->color_type & PCL_COLOR_CMYK4) == PCL_COLOR_CMYK4) && + output_type != OUTPUT_MONOCHROME); + do_cretb = (xdpi >= 600 && ydpi >= 600 && + ((caps->color_type & PCL_COLOR_CMYK4b) == PCL_COLOR_CMYK4b) && + output_type != OUTPUT_MONOCHROME && + output_type != OUTPUT_GRAY); + if (do_cretb){ + do_cret = 1; + dot_sizes_use=dot_sizes_cret; + }else{ + dot_sizes_use=dot_sizes; + } + + stp_deprintf(STP_DBG_PCL, "do_cret = %d\n", do_cret); + stp_deprintf(STP_DBG_PCL, "do_cretb = %d\n", do_cretb); + + do_6color = (strcmp(ink_type, "Photo") == 0); + stp_deprintf(STP_DBG_PCL, "do_6color = %d\n", do_6color); + + /* + * Compute the output size... + */ + + pcl_imageable_area(printer, nv, &page_left, &page_right, + &page_bottom, &page_top); + stp_deprintf(STP_DBG_PCL,"Before stp_compute_page_parameters()\n"); + stp_deprintf(STP_DBG_PCL,"page_left = %d, page_right = %d, page_top = %d, page_bottom = %d\n", + page_left, page_right, page_top, page_bottom); + stp_deprintf(STP_DBG_PCL,"top = %d, left = %d\n", top, left); + stp_deprintf(STP_DBG_PCL,"scaling = %f, image_width = %d, image_height = %d\n", scaling, + image_width, image_height); + + stp_compute_page_parameters(page_right, page_left, page_top, page_bottom, + scaling, image_width, image_height, image, + &orientation, &page_width, &page_height, + &out_width, &out_height, &left, &top); + + /* + * Recompute the image height and width. If the image has been + * rotated, these will change from previously. + */ + image_height = image->height(image); + image_width = image->width(image); + + stp_deprintf(STP_DBG_PCL,"After stp_compute_page_parameters()\n"); + stp_deprintf(STP_DBG_PCL,"page_width = %d, page_height = %d\n", page_width, page_height); + stp_deprintf(STP_DBG_PCL,"out_width = %d, out_height = %d\n", out_width, out_height); + stp_deprintf(STP_DBG_PCL,"top = %d, left = %d\n", top, left); + + /* + * Let the user know what we're doing... + */ + + image->progress_init(image); + + /* + * Send PCL initialization commands... + */ + + if (do_cretb) + { + stp_puts("\033*rbC", v); /* End raster graphics */ + } + stp_puts("\033E", v); /* PCL reset */ + if (do_cretb) + { + stp_zprintf(v, "\033%%-12345X@PJL ENTER LANGUAGE=PCL3GUI\n"); + } + + /* + * Set media size + */ + + if (strlen(stp_get_media_size(v)) > 0) + media_size = stp_get_media_size(v); + else if ((pp = stp_get_papersize_by_size(stp_get_page_height(v), + stp_get_page_width(v))) != NULL) + media_size = stp_papersize_get_name(pp); + else + media_size = ""; + + pcl_media_size = pcl_convert_media_size(media_size, model); + + stp_deprintf(STP_DBG_PCL,"pcl_media_size = %d, media_size = %s\n", pcl_media_size, media_size); + + /* + * If the media size requested is unknown, try it as a custom size. + * + * Warning: The margins may need to be fixed for this! + */ + + if (pcl_media_size == -1) { + stp_deprintf(STP_DBG_PCL, "Paper size %s is not directly supported by printer.\n", + media_size); + stp_deprintf(STP_DBG_PCL, "Trying as custom pagesize (watch the margins!)\n"); + pcl_media_size = PCL_PAPERSIZE_CUSTOM; /* Custom */ + } + + stp_zprintf(v, "\033&l%dA", pcl_media_size); + + stp_puts("\033&l0L", v); /* Turn off perforation skip */ + stp_puts("\033&l0E", v); /* Reset top margin to 0 */ + + /* + * Convert media source string to the code, if specified. + */ + + if (strlen(media_source) != 0) { + pcl_media_source = pcl_string_to_val(media_source, pcl_media_sources, + sizeof(pcl_media_sources) / sizeof(pcl_t)); + + stp_deprintf(STP_DBG_PCL,"pcl_media_source = %d, media_source = %s\n", pcl_media_source, + media_source); + + if (pcl_media_source == -1) + stp_deprintf(STP_DBG_PCL, "Unknown media source %s, ignored.\n", media_source); + else if (pcl_media_source != PCL_PAPERSOURCE_STANDARD) { + +/* Correct the value by taking the modulus */ + + pcl_media_source = pcl_media_source % PAPERSOURCE_MOD; + stp_zprintf(v, "\033&l%dH", pcl_media_source); + } + } + + /* + * Convert media type string to the code, if specified. + */ + + if (strlen(media_type) != 0) { + pcl_media_type = pcl_string_to_val(media_type, pcl_media_types, + sizeof(pcl_media_types) / sizeof(pcl_t)); + + stp_deprintf(STP_DBG_PCL,"pcl_media_type = %d, media_type = %s\n", pcl_media_type, + media_type); + + if (pcl_media_type == -1) { + stp_deprintf(STP_DBG_PCL, "Unknown media type %s, set to PLAIN.\n", media_type); + pcl_media_type = PCL_PAPERTYPE_PLAIN; + } + +/* + * The HP812C doesn't like glossy paper being selected when using 600x600 + * C-RET (PhotoRET II). So we use Premium paper instead. + * + */ + + if (do_cretb && pcl_media_type == PCL_PAPERTYPE_GLOSSY) { + stp_deprintf(STP_DBG_PCL, "Media type GLOSSY, set to PREMIUM for PhotoRET II.\n"); + pcl_media_type = PCL_PAPERTYPE_PREMIUM; + } + } + else + pcl_media_type = PCL_PAPERTYPE_PLAIN; + + /* + * Set DJ print quality to "best" if resolution >= 300 + */ + + if ((xdpi >= 300) && ((caps->stp_printer_type & PCL_PRINTER_DJ) == PCL_PRINTER_DJ)) + { + if ((caps->stp_printer_type & PCL_PRINTER_MEDIATYPE) == PCL_PRINTER_MEDIATYPE) + { + stp_puts("\033*o1M", v); /* Quality = presentation */ + stp_zprintf(v, "\033&l%dM", pcl_media_type); + } + else + { + stp_puts("\033*r2Q", v); /* Quality (high) */ + stp_puts("\033*o2Q", v); /* Shingling (4 passes) */ + + /* Depletion depends on media type and cart type. */ + + if ((pcl_media_type == PCL_PAPERTYPE_PLAIN) + || (pcl_media_type == PCL_PAPERTYPE_BOND)) { + if ((caps->color_type & PCL_COLOR_CMY) == PCL_COLOR_CMY) + stp_puts("\033*o2D", v); /* Depletion 25% */ + else + stp_puts("\033*o5D", v); /* Depletion 50% with gamma correction */ + } + + else if ((pcl_media_type == PCL_PAPERTYPE_PREMIUM) + || (pcl_media_type == PCL_PAPERTYPE_GLOSSY) + || (pcl_media_type == PCL_PAPERTYPE_TRANS)) + stp_puts("\033*o1D", v); /* Depletion none */ + } + } + + if ((xdpi != ydpi) || (do_cret) || (do_6color)) + /* Set resolution using CRD */ + { + + /* + * Send configure image data command with horizontal and + * vertical resolutions as well as a color count... + */ + + if (output_type != OUTPUT_GRAY && output_type != OUTPUT_MONOCHROME) + if ((caps->color_type & PCL_COLOR_CMY) == PCL_COLOR_CMY) + planes = 3; + else + if (do_6color) + planes = 6; + else + planes = 4; + else + planes = 1; + + stp_zprintf(v, "\033*g%dW", 2 + (planes * 6)); + stp_putc(2, v); /* Format 2 (Complex Direct Planar) */ + stp_putc(planes, v); /* # output planes */ + + if (planes != 3) { + stp_putc(xdpi >> 8, v); /* Black resolution */ + stp_putc(xdpi, v); + stp_putc(ydpi >> 8, v); + stp_putc(ydpi, v); + stp_putc(0, v); + if (do_cretb){ + stp_putc(2, v); + }else{ + stp_putc(do_cret ? 4 : 2, v); + } + } + + if (planes != 1) { + stp_putc(xdpi >> 8, v); /* Cyan resolution */ + stp_putc(xdpi, v); + stp_putc(ydpi >> 8, v); + stp_putc(ydpi, v); + stp_putc(0, v); + stp_putc(do_cret ? 4 : 2, v); + + stp_putc(xdpi >> 8, v); /* Magenta resolution */ + stp_putc(xdpi, v); + stp_putc(ydpi >> 8, v); + stp_putc(ydpi, v); + stp_putc(0, v); + stp_putc(do_cret ? 4 : 2, v); + + stp_putc(xdpi >> 8, v); /* Yellow resolution */ + stp_putc(xdpi, v); + stp_putc(ydpi >> 8, v); + stp_putc(ydpi, v); + stp_putc(0, v); + stp_putc(do_cret ? 4 : 2, v); + } + if (planes == 6) + { + stp_putc(xdpi >> 8, v); /* Light Cyan resolution */ + stp_putc(xdpi, v); + stp_putc(ydpi >> 8, v); + stp_putc(ydpi, v); + stp_putc(0, v); + stp_putc(do_cret ? 4 : 2, v); + + stp_putc(xdpi >> 8, v); /* Light Magenta resolution */ + stp_putc(xdpi, v); + stp_putc(ydpi >> 8, v); + stp_putc(ydpi, v); + stp_putc(0, v); + stp_putc(do_cret ? 4 : 2, v); + } + } + else + { + stp_zprintf(v, "\033*t%dR", xdpi); /* Simple resolution */ + if (output_type != OUTPUT_GRAY && output_type != OUTPUT_MONOCHROME) + { + if ((caps->color_type & PCL_COLOR_CMY) == PCL_COLOR_CMY) + stp_puts("\033*r-3U", v); /* Simple CMY color */ + else + stp_puts("\033*r-4U", v); /* Simple KCMY color */ + } + } + +#ifndef PCL_DEBUG_DISABLE_COMPRESSION + if ((caps->stp_printer_type & PCL_PRINTER_TIFF) == PCL_PRINTER_TIFF) + { + stp_puts("\033*b2M", v); /* Mode 2 (TIFF) */ + writefunc = pcl_mode2; + } + else +#endif + { + stp_puts("\033*b0M", v); /* Mode 0 (no compression) */ + writefunc = pcl_mode0; + } + + /* + * Convert image size to printer resolution and setup the page for printing... + */ + + out_width = xdpi * out_width / 72; + out_height = ydpi * out_height / 72; + + stp_deprintf(STP_DBG_PCL, "left %d margin %d top %d margin %d width %d height %d\n", + left, caps->left_margin, top, caps->top_margin, out_width, out_height); + + if (!do_cretb) { + stp_zprintf(v, "\033&a%dH", 10 * left); /* Set left raster position */ + stp_zprintf(v, "\033&a%dV", 10 * (top + caps->top_margin)); + /* Set top raster position */ + } + stp_zprintf(v, "\033*r%dS", out_width); /* Set raster width */ + stp_zprintf(v, "\033*r%dT", out_height); /* Set raster height */ + + if (do_cretb) + { + /* Move to top left of printed area */ + stp_zprintf(v, "\033*p%dY", (top + caps->top_margin)*4); /* Mesuret in dots. */ + stp_zprintf(v, "\033*p%dX", left*4); + } + stp_puts("\033*r1A", v); /* Start GFX */ + + /* + * Allocate memory for the raster data... + */ + + height = (out_width + 7) / 8; + if (do_cret) + height *= 2; + + if (output_type == OUTPUT_GRAY || output_type == OUTPUT_MONOCHROME) + { + black = stp_malloc(height); + cyan = NULL; + magenta = NULL; + yellow = NULL; + lcyan = NULL; + lmagenta = NULL; + } + else + { + cyan = stp_malloc(height); + magenta = stp_malloc(height); + yellow = stp_malloc(height); + + if ((caps->color_type & PCL_COLOR_CMY) == PCL_COLOR_CMY) + black = NULL; + else + black = stp_malloc(height); + if (do_6color) + { + lcyan = stp_malloc(height); + lmagenta = stp_malloc(height); + } + else + { + lcyan = NULL; + lmagenta = NULL; + } + } + + /* + * Output the page, rotating as necessary... + */ + + stp_compute_lut(nv, 256); + + if (xdpi > ydpi) + dither = stp_init_dither(image_width, out_width, 1, xdpi / ydpi, nv); + else + dither = stp_init_dither(image_width, out_width, ydpi / xdpi, 1, nv); + +/* Set up dithering for special printers. */ + +#if 1 /* Leave alone for now */ + for (i = 0; i <= NCOLORS; i++) + stp_dither_set_black_level(dither, i, 1.2); + stp_dither_set_black_lower(dither, .3); + stp_dither_set_black_upper(dither, .999); +#endif + + if (do_cret) /* 4-level printing for 800/1120 */ + { + stp_dither_set_ranges_simple(dither, ECOLOR_Y, 3, dot_sizes_use, stp_get_density(nv)); + if (!do_cretb) + stp_dither_set_ranges_simple(dither, ECOLOR_K, 3, dot_sizes_use, stp_get_density(nv)); + +/* Note: no printer I know of does both CRet (4-level) and 6 colour, but + what the heck. variable_dither_ranges copied from print-escp2.c */ + + if (do_6color) /* Photo for 69x */ + { + stp_dither_set_ranges(dither, ECOLOR_C, 6, variable_dither_ranges, + stp_get_density(nv)); + stp_dither_set_ranges(dither, ECOLOR_M, 6, variable_dither_ranges, + stp_get_density(nv)); + } + else + { + stp_dither_set_ranges_simple(dither, ECOLOR_C, 3, dot_sizes_use, stp_get_density(nv)); + stp_dither_set_ranges_simple(dither, ECOLOR_M, 3, dot_sizes_use, stp_get_density(nv)); + } + } + else if (do_6color) + { +/* Set light inks for 6 colour printers. Numbers copied from print-escp2.c */ + stp_dither_set_light_ink(dither, ECOLOR_C, .25, stp_get_density(nv)); + stp_dither_set_light_ink(dither, ECOLOR_M, .25, stp_get_density(nv)); + } + + switch (stp_get_image_type(nv)) + { + case IMAGE_LINE_ART: + stp_dither_set_ink_spread(dither, 19); + break; + case IMAGE_SOLID_TONE: + stp_dither_set_ink_spread(dither, 15); + break; + case IMAGE_CONTINUOUS: + stp_dither_set_ink_spread(dither, 14); + break; + } + stp_dither_set_density(dither, stp_get_density(nv)); + + in = stp_malloc(image_width * image_bpp); + out = stp_malloc(image_width * out_bpp * 2); + + errdiv = image_height / out_height; + errmod = image_height % out_height; + errval = 0; + errlast = -1; + errline = 0; + blank_lines = 0; + is_blank = 0; +#ifndef PCL_DEBUG_DISABLE_BLANKLINE_REMOVAL + do_blank = ((caps->stp_printer_type & PCL_PRINTER_BLANKLINE) == + PCL_PRINTER_BLANKLINE); +#else + do_blank = 0; +#endif + + for (y = 0; y < out_height; y ++) + { + int duplicate_line = 1; + stp_deprintf(STP_DBG_PCL,"pcl_print: y = %d, line = %d, val = %d, mod = %d, height = %d\n", + y, errline, errval, errmod, out_height); + if ((y & 63) == 0) + image->note_progress(image, y, out_height); + + if (errline != errlast) + { + errlast = errline; + duplicate_line = 0; + if (image->get_row(image, in, errline) != STP_IMAGE_OK) + break; + (*colorfunc)(nv, in, out, &zero_mask, image_width, image_bpp, cmap, + hue_adjustment, lum_adjustment, NULL); + } + + stp_dither(out, y, dither, cyan, lcyan, magenta, lmagenta, + yellow, NULL, black, duplicate_line, zero_mask); + + len_c = stp_dither_get_last_position(dither, ECOLOR_C, 1); + len_lc = stp_dither_get_last_position(dither, ECOLOR_C, 0); + len_m = stp_dither_get_last_position(dither, ECOLOR_M, 1); + len_lm = stp_dither_get_last_position(dither, ECOLOR_M, 0); + len_y = stp_dither_get_last_position(dither, ECOLOR_Y, 1); + len_k = stp_dither_get_last_position(dither, ECOLOR_K, 1); + +/* + * Blank line removal. If multiple lines are blank then they can be replaced + * by "Relative Vertical Pixel Movement" command. However, since there are + * apparently some faulty implementations, we always output the first line, + * then suppress the rest. This ensures that the printers's buffers are really + * empty. As suggested by Mike Sweet. + */ + + is_blank = (do_blank && (len_c == -1) && (len_lc == -1) && (len_m == -1) + && (len_lm == -1) && (len_y == -1) && (len_k == -1)); + + if (is_blank && (blank_lines != 0)) /* repeated blank line */ + { + blank_lines++; + } + else /* Not blank, or is first one */ + { + if (! is_blank) + { + if (blank_lines > 1) /* Output accumulated lines */ + { + blank_lines--; /* correct for one already output */ + stp_deprintf(STP_DBG_PCL, "Blank Lines = %d\n", blank_lines); + stp_zprintf(v, "\033*b%dY", blank_lines); + blank_lines=0; + } + else; + } + else + { + blank_lines++; + } + + if (do_cret) + { + /* + * 4-level (CRet) dithers... + */ + if (output_type == OUTPUT_GRAY || output_type == OUTPUT_MONOCHROME) + { + (*writefunc)(v, black + height / 2, height / 2, 0); + (*writefunc)(v, black, height / 2, 1); + } + else + { + if(do_cretb) + { +/* (*writefunc)(v, black + height / 2, 0, 0); */ + (*writefunc)(v, black, height/2, 0); + } + else + { + (*writefunc)(v, black + height / 2, height / 2, 0); + (*writefunc)(v, black, height / 2, 0); + } + (*writefunc)(v, cyan + height / 2, height / 2, 0); + (*writefunc)(v, cyan, height / 2, 0); + (*writefunc)(v, magenta + height / 2, height / 2, 0); + (*writefunc)(v, magenta, height / 2, 0); + (*writefunc)(v, yellow + height / 2, height / 2, 0); + if (do_6color) + { + (*writefunc)(v, yellow, height / 2, 0); + (*writefunc)(v, lcyan + height / 2, height / 2, 0); + (*writefunc)(v, lcyan, height / 2, 0); + (*writefunc)(v, lmagenta + height / 2, height / 2, 0); + (*writefunc)(v, lmagenta, height / 2, 1); /* Last plane set on light magenta */ + } + else + (*writefunc)(v, yellow, height / 2, 1); /* Last plane set on yellow */ + } + } + else + { + /* + * Standard 2-level dithers... + */ + + if (output_type == OUTPUT_GRAY || output_type == OUTPUT_MONOCHROME) + { + (*writefunc)(v, black, height, 1); + } + else + { + if (black != NULL) + (*writefunc)(v, black, height, 0); + (*writefunc)(v, cyan, height, 0); + (*writefunc)(v, magenta, height, 0); + if (do_6color) + { + (*writefunc)(v, yellow, height, 0); + (*writefunc)(v, lcyan, height, 0); + (*writefunc)(v, lmagenta, height, 1); /* Last plane set on light magenta */ + } + else + (*writefunc)(v, yellow, height, 1); /* Last plane set on yellow */ + } + } + } + + errval += errmod; + errline += errdiv; + if (errval >= out_height) + { + errval -= out_height; + errline ++; + } + } + +/* Output trailing blank lines (may not be required?) */ + + if (blank_lines > 1) + { + blank_lines--; /* correct for one already output */ + stp_deprintf(STP_DBG_PCL, "Blank Lines = %d\n", blank_lines); + stp_zprintf(v, "\033*b%dY", blank_lines); + blank_lines=0; + } + + image->progress_conclude(image); + + stp_free_dither(dither); + + + /* + * Cleanup... + */ + + stp_free_lut(nv); + stp_free(in); + stp_free(out); + + if (black != NULL) + stp_free(black); + if (cyan != NULL) + { + stp_free(cyan); + stp_free(magenta); + stp_free(yellow); + } + if (lcyan != NULL) + { + stp_free(lcyan); + stp_free(lmagenta); + } + + if ((caps->stp_printer_type & PCL_PRINTER_NEW_ERG) == PCL_PRINTER_NEW_ERG) + stp_puts("\033*rC", v); + else + stp_puts("\033*rB", v); + + stp_puts("\033&l0H", v); /* Eject page */ + if (do_cretb) + { + stp_zprintf(v, "\033%%-12345X\n"); + } + stp_puts("\033E", v); /* PCL reset */ + stp_free_vars(nv); +} + +const stp_printfuncs_t stp_pcl_printfuncs = +{ + pcl_parameters, + stp_default_media_size, + pcl_imageable_area, + pcl_limit, + pcl_print, + pcl_default_parameters, + pcl_describe_resolution, + stp_verify_printer_params +}; + + +/* + * 'pcl_mode0()' - Send PCL graphics using mode 0 (no) compression. + */ + +static void +pcl_mode0(const stp_vars_t v, /* I - Print file or command */ + unsigned char *line, /* I - Output bitmap data */ + int height, /* I - Height of bitmap data */ + int last_plane) /* I - True if this is the last plane */ +{ + stp_zprintf(v, "\033*b%d%c", height, last_plane ? 'W' : 'V'); + stp_zfwrite((const char *) line, height, 1, v); +} + + +/* + * 'pcl_mode2()' - Send PCL graphics using mode 2 (TIFF) compression. + */ + +static void +pcl_mode2(const stp_vars_t v, /* I - Print file or command */ + unsigned char *line, /* I - Output bitmap data */ + int height, /* I - Height of bitmap data */ + int last_plane) /* I - True if this is the last plane */ +{ + unsigned char comp_buf[1536], /* Compression buffer */ + *comp_ptr; /* Current slot in buffer */ + + stp_pack_tiff(line, height, comp_buf, &comp_ptr); + + /* + * Send a line of raster graphics... + */ + + stp_zprintf(v, "\033*b%d%c", (int)(comp_ptr - comp_buf), last_plane ? 'W' : 'V'); + stp_zfwrite((const char *)comp_buf, comp_ptr - comp_buf, 1, v); +} diff --git a/src/main/print-ps.c b/src/main/print-ps.c new file mode 100644 index 0000000..d7bac33 --- /dev/null +++ b/src/main/print-ps.c @@ -0,0 +1,868 @@ +/* + * "$Id: print-ps.c,v 1.26 2001/11/09 12:16:53 rlk Exp $" + * + * Print plug-in Adobe PostScript driver for the GIMP. + * + * Copyright 1997-2000 Michael Sweet (mike@easysw.com) and + * Robert Krawitz (rlk@alum.mit.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + * This file must include only standard C header files. The core code must + * compile on generic platforms that don't support glib, gimp, gtk, etc. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include "gimp-print-internal.h" +#include +#include +#include +#include +#include + +#ifdef _MSC_VER +#define strncasecmp(s,t,n) _strnicmp(s,t,n) +#define strcasecmp(s,t) _stricmp(s,t) +#endif + +/* + * Local variables... + */ + +static FILE *ps_ppd = NULL; +static const char *ps_ppd_file = NULL; + + +/* + * Local functions... + */ + +static void ps_hex(const stp_vars_t, unsigned short *, int); +static void ps_ascii85(const stp_vars_t, unsigned short *, int, int); +static char *ppd_find(const char *, const char *, const char *, int *); + + +/* + * 'ps_parameters()' - Return the parameter values for the given parameter. + */ + +static stp_param_t * /* O - Parameter values */ +ps_parameters(const stp_printer_t printer, /* I - Printer model */ + const char *ppd_file, /* I - PPD file (not used) */ + const char *name, /* I - Name of parameter */ + int *count) /* O - Number of values */ +{ + int i; + char line[1024], + lname[255], + loption[255], + *ltext; + stp_param_t *valptrs; + + + if (count == NULL) + return (NULL); + + *count = 0; + + if (ppd_file == NULL || name == NULL) + return (NULL); + + if (ps_ppd_file == NULL || strcmp(ps_ppd_file, ppd_file) != 0) + { + if (ps_ppd != NULL) + fclose(ps_ppd); + + ps_ppd = fopen(ppd_file, "r"); + + if (ps_ppd == NULL) + ps_ppd_file = NULL; + else + ps_ppd_file = ppd_file; + } + + if (ps_ppd == NULL) + { + if (strcmp(name, "PageSize") == 0) + { + int papersizes = stp_known_papersizes(); + valptrs = stp_malloc(sizeof(stp_param_t) * papersizes); + *count = 0; + for (i = 0; i < papersizes; i++) + { + const stp_papersize_t pt = stp_get_papersize_by_index(i); + if (strlen(stp_papersize_get_name(pt)) > 0) + { + valptrs[*count].name = strdup(stp_papersize_get_name(pt)); + valptrs[*count].text = strdup(stp_papersize_get_text(pt)); + (*count)++; + } + } + return (valptrs); + } + else + return (NULL); + } + + rewind(ps_ppd); + *count = 0; + + valptrs = stp_malloc(100 * sizeof(stp_param_t)); + + while (fgets(line, sizeof(line), ps_ppd) != NULL) + { + if (line[0] != '*') + continue; + + if (sscanf(line, "*%s %[^:]", lname, loption) != 2) + continue; + + if (strcasecmp(lname, name) == 0) + { + if ((ltext = strchr(loption, '/')) != NULL) + *ltext++ = '\0'; + else + ltext = loption; + + valptrs[(*count)].name = strdup(loption); + valptrs[(*count)].text = strdup(ltext); + (*count) ++; + } + } + + if (*count == 0) + { + stp_free(valptrs); + return (NULL); + } + else + return (valptrs); +} + +static const char * +ps_default_parameters(const stp_printer_t printer, + const char *ppd_file, + const char *name) +{ + int i; + char line[1024], + lname[255], + loption[255], + defname[255]; + + if (ppd_file == NULL || name == NULL) + return (NULL); + + sprintf(defname, "Default%s", name); + + if (ps_ppd_file == NULL || strcmp(ps_ppd_file, ppd_file) != 0) + { + if (ps_ppd != NULL) + fclose(ps_ppd); + + ps_ppd = fopen(ppd_file, "r"); + + if (ps_ppd == NULL) + ps_ppd_file = NULL; + else + ps_ppd_file = ppd_file; + } + + if (ps_ppd == NULL) + { + if (strcmp(name, "PageSize") == 0) + { + int papersizes = stp_known_papersizes(); + for (i = 0; i < papersizes; i++) + { + const stp_papersize_t pt = stp_get_papersize_by_index(i); + if (strlen(stp_papersize_get_name(pt)) > 0) + { + return stp_papersize_get_name(pt); + } + } + return NULL; + } + else + return (NULL); + } + + rewind(ps_ppd); + + while (fgets(line, sizeof(line), ps_ppd) != NULL) + { + if (line[0] != '*') + continue; + + if (sscanf(line, "*%[^:]:%s", lname, loption) != 2) + continue; + + if (strcasecmp(lname, defname) == 0) + { + return strdup(loption); + } + } + + if (strcmp(name, "Resolution") == 0) + { + return "default"; + } + + return NULL; +} + + +/* + * 'ps_media_size()' - Return the size of the page. + */ + +static void +ps_media_size(const stp_printer_t printer, /* I - Printer model */ + const stp_vars_t v, /* I */ + int *width, /* O - Width in points */ + int *height) /* O - Height in points */ +{ + char *dimensions; /* Dimensions of media size */ + + stp_dprintf(STP_DBG_PS, v, + "ps_media_size(%d, \'%s\', \'%s\', %08x, %08x)\n", + stp_printer_get_model(printer), stp_get_ppd_file(v), + stp_get_media_size(v), + width, height); + + if ((dimensions = ppd_find(stp_get_ppd_file(v), "PaperDimension", + stp_get_media_size(v), NULL)) + != NULL) + sscanf(dimensions, "%d%d", width, height); + else + stp_default_media_size(printer, v, width, height); +} + + +/* + * 'ps_imageable_area()' - Return the imageable area of the page. + */ + +static void +ps_imageable_area(const stp_printer_t printer, /* I - Printer model */ + const stp_vars_t v, /* I */ + int *left, /* O - Left position in points */ + int *right, /* O - Right position in points */ + int *bottom, /* O - Bottom position in points */ + int *top) /* O - Top position in points */ +{ + char *area; /* Imageable area of media */ + float fleft, /* Floating point versions */ + fright, + fbottom, + ftop; + + + if ((area = ppd_find(stp_get_ppd_file(v), "ImageableArea", + stp_get_media_size(v), NULL)) + != NULL) + { + stp_dprintf(STP_DBG_PS, v, "area = \'%s\'\n", area); + if (sscanf(area, "%f%f%f%f", &fleft, &fbottom, &fright, &ftop) == 4) + { + *left = (int)fleft; + *right = (int)fright; + *bottom = (int)fbottom; + *top = (int)ftop; + } + else + *left = *right = *bottom = *top = 0; + } + else + { + stp_default_media_size(printer, v, right, top); + *left = 18; + *right -= 18; + *top -= 36; + *bottom = 36; + } +} + +static void +ps_limit(const stp_printer_t printer, /* I - Printer model */ + const stp_vars_t v, /* I */ + int *width, + int *height, + int *min_width, + int *min_height) +{ + *width = INT_MAX; + *height = INT_MAX; + *min_width = 1; + *min_height = 1; +} + +/* + * This is really bogus... + */ +static void +ps_describe_resolution(const stp_printer_t printer, + const char *resolution, int *x, int *y) +{ + *x = -1; + *y = -1; + sscanf(resolution, "%dx%d", x, y); + return; +} + +/* + * 'ps_print()' - Print an image to a PostScript printer. + */ + +static void +ps_print(const stp_printer_t printer, /* I - Model (Level 1 or 2) */ + stp_image_t *image, /* I - Image to print */ + const stp_vars_t v) +{ + unsigned char *cmap = stp_get_cmap(v); + int model = stp_printer_get_model(printer); + const char *ppd_file = stp_get_ppd_file(v); + const char *resolution = stp_get_resolution(v); + const char *media_size = stp_get_media_size(v); + const char *media_type = stp_get_media_type(v); + const char *media_source = stp_get_media_source(v); + int output_type = stp_get_output_type(v); + int orientation = stp_get_orientation(v); + double scaling = stp_get_scaling(v); + int top = stp_get_top(v); + int left = stp_get_left(v); + int i, j; /* Looping vars */ + int y; /* Looping vars */ + unsigned char *in; /* Input pixels from image */ + unsigned short *out; /* Output pixels for printer */ + int page_left, /* Left margin of page */ + page_right, /* Right margin of page */ + page_top, /* Top of page */ + page_bottom, /* Bottom of page */ + page_width, /* Width of page */ + page_height, /* Height of page */ + out_width, /* Width of image on page */ + out_height, /* Height of image on page */ + out_bpp, /* Output bytes per pixel */ + out_ps_height, /* Output height (Level 2 output) */ + out_offset; /* Output offset (Level 2 output) */ + time_t curtime; /* Current time of day */ + stp_convert_t colorfunc; /* Color conversion function... */ + int zero_mask; + char *command; /* PostScript command */ + int order, /* Order of command */ + num_commands; /* Number of commands */ + struct /* PostScript commands... */ + { + char *command; + int order; + } commands[4]; + int image_height, + image_width, + image_bpp; + stp_vars_t nv = stp_allocate_copy(v); + + if (!stp_get_verified(nv)) + { + stp_eprintf(nv, "Print options not verified; cannot print.\n"); + return; + } + + /* + * Setup a read-only pixel region for the entire image... + */ + + image->init(image); + image_height = image->height(image); + image_width = image->width(image); + image_bpp = image->bpp(image); + + /* + * Choose the correct color conversion function... + */ + + colorfunc = stp_choose_colorfunc(output_type, image_bpp, cmap, &out_bpp, nv); + + /* + * Compute the output size... + */ + + ps_imageable_area(printer, nv, &page_left, &page_right, + &page_bottom, &page_top); + stp_compute_page_parameters(page_right, page_left, page_top, page_bottom, + scaling, image_width, image_height, image, + &orientation, &page_width, &page_height, + &out_width, &out_height, &left, &top); + + /* + * Recompute the image height and width. If the image has been + * rotated, these will change from previously. + */ + image_height = image->height(image); + image_width = image->width(image); + + /* + * Let the user know what we're doing... + */ + + image->progress_init(image); + + /* + * Output a standard PostScript header with DSC comments... + */ + + curtime = time(NULL); + + if (left < 0) + left = (page_width - out_width) / 2 + page_left; + else + left += page_left; + + if (top < 0) + top = (page_height + out_height) / 2 + page_bottom; + else + top = page_height - top + page_bottom; + + stp_dprintf(STP_DBG_PS, v, + "out_width = %d, out_height = %d\n", out_width, out_height); + stp_dprintf(STP_DBG_PS, v, + "page_left = %d, page_right = %d, page_bottom = %d, page_top = %d\n", + page_left, page_right, page_bottom, page_top); + stp_dprintf(STP_DBG_PS, v, "left = %d, top = %d\n", left, top); + + stp_puts("%!PS-Adobe-3.0\n", v); +#ifdef HAVE_CONFIG_H + stp_zprintf(v, "%%%%Creator: %s/Gimp-Print %s (%s)\n", + image->get_appname(image), VERSION, RELEASE_DATE); +#else + stp_zprintf(v, "%%%%Creator: %s/Gimp-Print\n", image->get_appname(image)); +#endif + stp_zprintf(v, "%%%%CreationDate: %s", ctime(&curtime)); + stp_zprintf(v, "%%%%BoundingBox: %d %d %d %d\n", + left, top - out_height, left + out_width, top); + stp_puts("%%DocumentData: Clean7Bit\n", v); + stp_zprintf(v, "%%%%LanguageLevel: %d\n", model + 1); + stp_puts("%%Pages: 1\n", v); + stp_puts("%%Orientation: Portrait\n", v); + stp_puts("%%EndComments\n", v); + stp_puts("%Copyright: 1997-2000 by Michael Sweet (mike@easysw.com) and Robert Krawitz (rlk@alum.mit.edu)\n", v); + stp_puts("%%EndProlog\n", v); + + /* + * Find any printer-specific commands... + */ + + num_commands = 0; + + if ((command = ppd_find(ppd_file, "PageSize", media_size, &order)) != NULL) + { + commands[num_commands].command = stp_malloc(strlen(command) + 1); + strcpy(commands[num_commands].command, command); + commands[num_commands].order = order; + num_commands ++; + } + + if ((command = ppd_find(ppd_file, "InputSlot", media_source, &order)) != NULL) + { + commands[num_commands].command = stp_malloc(strlen(command) + 1); + strcpy(commands[num_commands].command, command); + commands[num_commands].order = order; + num_commands ++; + } + + if ((command = ppd_find(ppd_file, "MediaType", media_type, &order)) != NULL) + { + commands[num_commands].command = stp_malloc(strlen(command) + 1); + strcpy(commands[num_commands].command, command); + commands[num_commands].order = order; + num_commands ++; + } + + if ((command = ppd_find(ppd_file, "Resolution", resolution, &order)) != NULL) + { + commands[num_commands].command = stp_malloc(strlen(command) + 1); + strcpy(commands[num_commands].command, command); + commands[num_commands].order = order; + num_commands ++; + } + + /* + * Sort the commands using the OrderDependency value... + */ + + for (i = 0; i < (num_commands - 1); i ++) + for (j = i + 1; j < num_commands; j ++) + if (commands[j].order < commands[i].order) + { + order = commands[i].order; + command = commands[i].command; + commands[i].command = commands[j].command; + commands[i].order = commands[j].order; + commands[j].command = command; + commands[j].order = order; + } + + /* + * Send the commands... + */ + + if (num_commands > 0) + { + stp_puts("%%BeginProlog\n", v); + + for (i = 0; i < num_commands; i ++) + { + stp_puts(commands[i].command, v); + stp_puts("\n", v); + stp_free(commands[i].command); + } + + stp_puts("%%EndProlog\n", v); + } + + /* + * Output the page... + */ + + stp_puts("%%Page: 1 1\n", v); + stp_puts("gsave\n", v); + + stp_zprintf(v, "%d %d translate\n", left, top); + stp_zprintf(v, "%.3f %.3f scale\n", + (double)out_width / ((double)image_width), + (double)out_height / ((double)image_height)); + + in = stp_malloc(image_width * image_bpp); + out = stp_malloc((image_width * out_bpp + 3) * 2); + + stp_compute_lut(nv, 256); + + if (model == 0) + { + stp_zprintf(v, "/picture %d string def\n", image_width * out_bpp); + + stp_zprintf(v, "%d %d 8\n", image_width, image_height); + + stp_puts("[ 1 0 0 -1 0 1 ]\n", v); + + if (output_type == OUTPUT_GRAY || output_type == OUTPUT_MONOCHROME) + stp_puts("{currentfile picture readhexstring pop} image\n", v); + else + stp_puts("{currentfile picture readhexstring pop} false 3 colorimage\n", v); + + for (y = 0; y < image_height; y ++) + { + if ((y & 15) == 0) + image->note_progress(image, y, image_height); + + if (image->get_row(image, in, y) != STP_IMAGE_OK) + break; + (*colorfunc)(nv, in, out, &zero_mask, image_width, image_bpp, cmap, + NULL, NULL, NULL); + + ps_hex(v, out, image_width * out_bpp); + } + } + else + { + if (output_type == OUTPUT_GRAY || output_type == OUTPUT_MONOCHROME) + stp_puts("/DeviceGray setcolorspace\n", v); + else + stp_puts("/DeviceRGB setcolorspace\n", v); + + stp_puts("<<\n", v); + stp_puts("\t/ImageType 1\n", v); + + stp_zprintf(v, "\t/Width %d\n", image_width); + stp_zprintf(v, "\t/Height %d\n", image_height); + stp_puts("\t/BitsPerComponent 8\n", v); + + if (output_type == OUTPUT_GRAY || output_type == OUTPUT_MONOCHROME) + stp_puts("\t/Decode [ 0 1 ]\n", v); + else + stp_puts("\t/Decode [ 0 1 0 1 0 1 ]\n", v); + + stp_puts("\t/DataSource currentfile /ASCII85Decode filter\n", v); + + if ((image_width * 72 / out_width) < 100) + stp_puts("\t/Interpolate true\n", v); + + stp_puts("\t/ImageMatrix [ 1 0 0 -1 0 1 ]\n", v); + + stp_puts(">>\n", v); + stp_puts("image\n", v); + + for (y = 0, out_offset = 0; y < image_height; y ++) + { + if ((y & 15) == 0) + image->note_progress(image, y, image_height); + + if (image->get_row(image, in, y) != STP_IMAGE_OK) + break; + (*colorfunc)(nv, in, out + out_offset, &zero_mask, image_width, + image_bpp, cmap, NULL, NULL, NULL); + + out_ps_height = out_offset + image_width * out_bpp; + + if (y < (image_height - 1)) + { + ps_ascii85(v, out, out_ps_height & ~3, 0); + out_offset = out_ps_height & 3; + } + else + { + ps_ascii85(v, out, out_ps_height, 1); + out_offset = 0; + } + + if (out_offset > 0) + memcpy(out, out + out_ps_height - out_offset, out_offset); + } + } + image->progress_conclude(image); + + stp_free_lut(nv); + stp_free(in); + stp_free(out); + + stp_puts("grestore\n", v); + stp_puts("showpage\n", v); + stp_puts("%%Trailer\n", v); + stp_puts("%%EOF\n", v); + stp_free_vars(nv); +} + + +/* + * 'ps_hex()' - Print binary data as a series of hexadecimal numbers. + */ + +static void +ps_hex(const stp_vars_t v, /* I - File to print to */ + unsigned short *data, /* I - Data to print */ + int length) /* I - Number of bytes to print */ +{ + int col; /* Current column */ + static const char *hex = "0123456789ABCDEF"; + + + col = 0; + while (length > 0) + { + unsigned char pixel = (*data & 0xff00) >> 8; + /* + * Put the hex chars out to the file; note that we don't use fprintf() + * for speed reasons... + */ + + stp_putc(hex[pixel >> 4], v); + stp_putc(hex[pixel & 15], v); + + data ++; + length --; + + col = (col + 1) & 31; + if (col == 0) + stp_putc('\n', v); + } + + if (col > 0) + stp_putc('\n', v); +} + + +/* + * 'ps_ascii85()' - Print binary data as a series of base-85 numbers. + */ + +static void +ps_ascii85(const stp_vars_t v, /* I - File to print to */ + unsigned short *data, /* I - Data to print */ + int length, /* I - Number of bytes to print */ + int last_line) /* I - Last line of raster data? */ +{ + int i; /* Looping var */ + unsigned b; /* Binary data word */ + unsigned char c[5]; /* ASCII85 encoded chars */ + static int column = 0; /* Current column */ + + + while (length > 3) + { + unsigned char d0 = (data[0] & 0xff00) >> 8; + unsigned char d1 = (data[1] & 0xff00) >> 8; + unsigned char d2 = (data[2] & 0xff00) >> 8; + unsigned char d3 = (data[3] & 0xff00) >> 8; + b = (((((d0 << 8) | d1) << 8) | d2) << 8) | d3; + + if (b == 0) + { + stp_putc('z', v); + column ++; + } + else + { + c[4] = (b % 85) + '!'; + b /= 85; + c[3] = (b % 85) + '!'; + b /= 85; + c[2] = (b % 85) + '!'; + b /= 85; + c[1] = (b % 85) + '!'; + b /= 85; + c[0] = b + '!'; + + stp_zfwrite((const char *)c, 5, 1, v); + column += 5; + } + + if (column > 72) + { + stp_putc('\n', v); + column = 0; + } + + data += 4; + length -= 4; + } + + if (last_line) + { + if (length > 0) + { + for (b = 0, i = length; i > 0; b = (b << 8) | data[0], data ++, i --); + + c[4] = (b % 85) + '!'; + b /= 85; + c[3] = (b % 85) + '!'; + b /= 85; + c[2] = (b % 85) + '!'; + b /= 85; + c[1] = (b % 85) + '!'; + b /= 85; + c[0] = b + '!'; + + stp_zfwrite((const char *)c, length + 1, 1, v); + } + + stp_puts("~>\n", v); + column = 0; + } +} + + +/* + * 'ppd_find()' - Find a control string with the specified name & parameters. + */ + +static char * /* O - Control string */ +ppd_find(const char *ppd_file, /* I - Name of PPD file */ + const char *name, /* I - Name of parameter */ + const char *option, /* I - Value of parameter */ + int *order) /* O - Order of the control string */ +{ + char line[1024], /* Line from file */ + lname[255], /* Name from line */ + loption[255], /* Value from line */ + *opt; /* Current control string pointer */ + static char *value = NULL; /* Current control string value */ + + + if (ppd_file == NULL || name == NULL || option == NULL) + return (NULL); + if (!value) + value = stp_malloc(32768); + + if (ps_ppd_file == NULL || strcmp(ps_ppd_file, ppd_file) != 0) + { + if (ps_ppd != NULL) + fclose(ps_ppd); + + ps_ppd = fopen(ppd_file, "r"); + + if (ps_ppd == NULL) + ps_ppd_file = NULL; + else + ps_ppd_file = ppd_file; + } + + if (ps_ppd == NULL) + return (NULL); + + if (order != NULL) + *order = 1000; + + rewind(ps_ppd); + while (fgets(line, sizeof(line), ps_ppd) != NULL) + { + if (line[0] != '*') + continue; + + if (strncasecmp(line, "*OrderDependency:", 17) == 0 && order != NULL) + { + sscanf(line, "%*s%d", order); + continue; + } + else if (sscanf(line, "*%s %[^/:]", lname, loption) != 2) + continue; + + if (strcasecmp(lname, name) == 0 && + strcasecmp(loption, option) == 0) + { + opt = strchr(line, ':') + 1; + while (*opt == ' ' || *opt == '\t') + opt ++; + if (*opt != '\"') + continue; + + strcpy(value, opt + 1); + if ((opt = strchr(value, '\"')) == NULL) + { + while (fgets(line, sizeof(line), ps_ppd) != NULL) + { + strcat(value, line); + if (strchr(line, '\"') != NULL) + { + strcpy(strchr(value, '\"'), "\n"); + break; + } + } + } + else + *opt = '\0'; + + return (value); + } + } + + return (NULL); +} + +const stp_printfuncs_t stp_ps_printfuncs = +{ + ps_parameters, + ps_media_size, + ps_imageable_area, + ps_limit, + ps_print, + ps_default_parameters, + ps_describe_resolution, + stp_verify_printer_params +}; diff --git a/src/main/print-util.c b/src/main/print-util.c new file mode 100644 index 0000000..a5d005a --- /dev/null +++ b/src/main/print-util.c @@ -0,0 +1,1649 @@ +/* + * "$Id: print-util.c,v 1.53 2001/11/10 00:12:20 rlk Exp $" + * + * Print plug-in driver utility functions for the GIMP. + * + * Copyright 1997-2000 Michael Sweet (mike@easysw.com) and + * Robert Krawitz (rlk@alum.mit.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + * This file must include only standard C header files. The core code must + * compile on generic platforms that don't support glib, gimp, gtk, etc. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include "gimp-print-internal.h" +#include +#include +#include +#if defined(HAVE_VARARGS_H) && !defined(HAVE_STDARG_H) +#include +#else +#include +#endif +#include +#include +#include + +#define FMIN(a, b) ((a) < (b) ? (a) : (b)) + +typedef struct stp_internal_option +{ + char *name; + size_t length; + char *data; + struct stp_internal_option *next; + struct stp_internal_option *prev; +} stp_internal_option_t; + +typedef struct /* Plug-in variables */ +{ + const char *output_to, /* Name of file or command to print to */ + *driver, /* Name of printer "driver" */ + *ppd_file, /* PPD file */ + *resolution, /* Resolution */ + *media_size, /* Media size */ + *media_type, /* Media type */ + *media_source, /* Media source */ + *ink_type, /* Ink or cartridge */ + *dither_algorithm; /* Dithering algorithm */ + int output_type; /* Color or grayscale output */ + float brightness; /* Output brightness */ + float scaling; /* Scaling, percent of printable area */ + int orientation, /* Orientation - 0 = port., 1 = land., + -1 = auto */ + left, /* Offset from lower-lefthand corner, points */ + top; /* ... */ + float gamma; /* Gamma */ + float contrast, /* Output Contrast */ + cyan, /* Output red level */ + magenta, /* Output green level */ + yellow; /* Output blue level */ + float saturation; /* Output saturation */ + float density; /* Maximum output density */ + int image_type; /* Image type (line art etc.) */ + int unit; /* Units for preview area 0=Inch 1=Metric */ + float app_gamma; /* Application gamma */ + int page_width; /* Width of page in points */ + int page_height; /* Height of page in points */ + int input_color_model; /* Color model for this device */ + int output_color_model; /* Color model for this device */ + void *lut; /* Look-up table */ + void *driver_data; /* Private data of the driver */ + unsigned char *cmap; /* Color map */ + void (*outfunc)(void *data, const char *buffer, size_t bytes); + void *outdata; + void (*errfunc)(void *data, const char *buffer, size_t bytes); + void *errdata; + stp_internal_option_t *options; + int verified; /* Ensure that params are OK! */ +} stp_internal_vars_t; + +typedef struct stp_internal_printer +{ + const char *long_name, /* Long name for UI */ + *driver; /* Short name for printrc file */ + int model; /* Model number */ + const stp_printfuncs_t *printfuncs; + stp_internal_vars_t printvars; +} stp_internal_printer_t; + +typedef struct +{ + const char *name; + const char *text; + unsigned width; + unsigned height; + unsigned top; + unsigned left; + unsigned bottom; + unsigned right; + stp_papersize_unit_t paper_unit; +} stp_internal_papersize_t; + +static const stp_internal_vars_t default_vars = +{ + "", /* Name of file or command to print to */ + N_ ("ps2"), /* Name of printer "driver" */ + "", /* Name of PPD file */ + "", /* Output resolution */ + "", /* Size of output media */ + "", /* Type of output media */ + "", /* Source of output media */ + "", /* Ink type */ + "", /* Dither algorithm */ + OUTPUT_COLOR, /* Color or grayscale output */ + 1.0, /* Output brightness */ + 100.0, /* Scaling (100% means entire printable area, */ + /* -XXX means scale by PPI) */ + -1, /* Orientation (-1 = automatic) */ + -1, /* X offset (-1 = center) */ + -1, /* Y offset (-1 = center) */ + 1.0, /* Screen gamma */ + 1.0, /* Contrast */ + 1.0, /* Cyan */ + 1.0, /* Magenta */ + 1.0, /* Yellow */ + 1.0, /* Output saturation */ + 1.0, /* Density */ + IMAGE_CONTINUOUS, /* Image type */ + 0, /* Unit 0=Inch */ + 1.0, /* Application gamma placeholder */ + 0, /* Page width */ + 0, /* Page height */ + COLOR_MODEL_RGB, /* Input color model */ + COLOR_MODEL_RGB /* Output color model */ +}; + +static const stp_internal_vars_t min_vars = +{ + "", /* Name of file or command to print to */ + N_ ("ps2"), /* Name of printer "driver" */ + "", /* Name of PPD file */ + "", /* Output resolution */ + "", /* Size of output media */ + "", /* Type of output media */ + "", /* Source of output media */ + "", /* Ink type */ + "", /* Dither algorithm */ + 0, /* Color or grayscale output */ + 0, /* Output brightness */ + 5.0, /* Scaling (100% means entire printable area, */ + /* -XXX means scale by PPI) */ + -1, /* Orientation (-1 = automatic) */ + -1, /* X offset (-1 = center) */ + -1, /* Y offset (-1 = center) */ + 0.1, /* Screen gamma */ + 0, /* Contrast */ + 0, /* Cyan */ + 0, /* Magenta */ + 0, /* Yellow */ + 0, /* Output saturation */ + .1, /* Density */ + 0, /* Image type */ + 0, /* Unit 0=Inch */ + 1.0, /* Application gamma placeholder */ + 0, /* Page width */ + 0, /* Page height */ + 0, /* Input color model */ + 0 /* Output color model */ +}; + +static const stp_internal_vars_t max_vars = +{ + "", /* Name of file or command to print to */ + N_ ("ps2"), /* Name of printer "driver" */ + "", /* Name of PPD file */ + "", /* Output resolution */ + "", /* Size of output media */ + "", /* Type of output media */ + "", /* Source of output media */ + "", /* Ink type */ + "", /* Dither algorithm */ + OUTPUT_RAW_CMYK, /* Color or grayscale output */ + 2.0, /* Output brightness */ + 100.0, /* Scaling (100% means entire printable area, */ + /* -XXX means scale by PPI) */ + -1, /* Orientation (-1 = automatic) */ + -1, /* X offset (-1 = center) */ + -1, /* Y offset (-1 = center) */ + 4.0, /* Screen gamma */ + 4.0, /* Contrast */ + 4.0, /* Cyan */ + 4.0, /* Magenta */ + 4.0, /* Yellow */ + 9.0, /* Output saturation */ + 2.0, /* Density */ + NIMAGE_TYPES - 1, /* Image type */ + 1, /* Unit 0=Inch */ + 1.0, /* Application gamma placeholder */ + 0, /* Page width */ + 0, /* Page height */ + NCOLOR_MODELS - 1, /* Input color model */ + NCOLOR_MODELS - 1 /* Output color model */ +}; + +stp_vars_t +stp_allocate_vars(void) +{ + void *retval = stp_malloc(sizeof(stp_internal_vars_t)); + memset(retval, 0, sizeof(stp_internal_vars_t)); + stp_copy_vars(retval, (stp_vars_t)&default_vars); + return (retval); +} + +#define SAFE_FREE(x) \ +do \ +{ \ + if ((x)) \ + stp_free((char *)(x)); \ + ((x)) = NULL; \ +} while (0) + +static char * +c_strdup(const char *s) +{ + char *ret; + if (!s) + { + ret = stp_malloc(1); + ret[0] = 0; + return ret; + } + else + { + ret = stp_malloc(strlen(s) + 1); + strcpy(ret, s); + return ret; + } +} + +static char * +c_strndup(const char *s, int n) +{ + char *ret; + if (!s || n < 0) + { + ret = stp_malloc(1); + ret[0] = 0; + return ret; + } + else + { + ret = stp_malloc(n + 1); + strncpy(ret, s, n); + ret[n] = 0; + return ret; + } +} + +void +stp_free_vars(stp_vars_t vv) +{ + stp_internal_vars_t *v = (stp_internal_vars_t *) vv; + SAFE_FREE(v->output_to); + SAFE_FREE(v->driver); + SAFE_FREE(v->ppd_file); + SAFE_FREE(v->resolution); + SAFE_FREE(v->media_size); + SAFE_FREE(v->media_type); + SAFE_FREE(v->media_source); + SAFE_FREE(v->ink_type); + SAFE_FREE(v->dither_algorithm); +} + +#define DEF_STRING_FUNCS(s) \ +void \ +stp_set_##s(stp_vars_t vv, const char *val) \ +{ \ + stp_internal_vars_t *v = (stp_internal_vars_t *) vv; \ + if (v->s == val) \ + return; \ + SAFE_FREE(v->s); \ + v->s = c_strdup(val); \ + v->verified = 0; \ +} \ + \ +void \ +stp_set_##s##_n(stp_vars_t vv, const char *val, int n) \ +{ \ + stp_internal_vars_t *v = (stp_internal_vars_t *) vv; \ + if (v->s == val) \ + return; \ + SAFE_FREE(v->s); \ + v->s = c_strndup(val, n); \ + v->verified = 0; \ +} \ + \ +const char * \ +stp_get_##s(const stp_vars_t vv) \ +{ \ + stp_internal_vars_t *v = (stp_internal_vars_t *) vv; \ + return v->s; \ +} + +#define DEF_FUNCS(s, t) \ +void \ +stp_set_##s(stp_vars_t vv, t val) \ +{ \ + stp_internal_vars_t *v = (stp_internal_vars_t *) vv; \ + v->verified = 0; \ + v->s = val; \ +} \ + \ +t \ +stp_get_##s(const stp_vars_t vv) \ +{ \ + stp_internal_vars_t *v = (stp_internal_vars_t *) vv; \ + return v->s; \ +} + +DEF_STRING_FUNCS(output_to) +DEF_STRING_FUNCS(driver) +DEF_STRING_FUNCS(ppd_file) +DEF_STRING_FUNCS(resolution) +DEF_STRING_FUNCS(media_size) +DEF_STRING_FUNCS(media_type) +DEF_STRING_FUNCS(media_source) +DEF_STRING_FUNCS(ink_type) +DEF_STRING_FUNCS(dither_algorithm) +DEF_FUNCS(output_type, int) +DEF_FUNCS(orientation, int) +DEF_FUNCS(left, int) +DEF_FUNCS(top, int) +DEF_FUNCS(image_type, int) +DEF_FUNCS(unit, int) +DEF_FUNCS(page_width, int) +DEF_FUNCS(page_height, int) +DEF_FUNCS(input_color_model, int) +DEF_FUNCS(output_color_model, int) +DEF_FUNCS(brightness, float) +DEF_FUNCS(scaling, float) +DEF_FUNCS(gamma, float) +DEF_FUNCS(contrast, float) +DEF_FUNCS(cyan, float) +DEF_FUNCS(magenta, float) +DEF_FUNCS(yellow, float) +DEF_FUNCS(saturation, float) +DEF_FUNCS(density, float) +DEF_FUNCS(app_gamma, float) +DEF_FUNCS(lut, void *) +DEF_FUNCS(outdata, void *) +DEF_FUNCS(errdata, void *) +DEF_FUNCS(driver_data, void *) +DEF_FUNCS(cmap, unsigned char *) +DEF_FUNCS(outfunc, stp_outfunc_t) +DEF_FUNCS(errfunc, stp_outfunc_t) + +void +stp_set_verified(stp_vars_t vv, int val) +{ + stp_internal_vars_t *v = (stp_internal_vars_t *) vv; + v->verified = val; +} + +int +stp_get_verified(const stp_vars_t vv) +{ + stp_internal_vars_t *v = (stp_internal_vars_t *) vv; + return v->verified; +} + +void +stp_copy_options(stp_vars_t vd, const stp_vars_t vs) +{ + const stp_internal_vars_t *src = (const stp_internal_vars_t *)vs; + stp_internal_vars_t *dest = (stp_internal_vars_t *)vd; + stp_internal_option_t *opt = (stp_internal_option_t *) src->options; + stp_internal_option_t *popt = NULL; + if (opt) + { + stp_internal_option_t *nopt = stp_malloc(sizeof(stp_internal_option_t)); + stp_set_verified(vd, 0); + dest->options = nopt; + memcpy(nopt, opt, sizeof(stp_internal_option_t)); + nopt->name = stp_malloc(strlen(opt->name) + 1); + strcpy(nopt->name, opt->name); + nopt->data = stp_malloc(opt->length); + memcpy(nopt->data, opt->data, opt->length); + opt = opt->next; + popt = nopt; + while (opt) + { + nopt = stp_malloc(sizeof(stp_internal_option_t)); + memcpy(nopt, opt, sizeof(stp_internal_option_t)); + nopt->prev = popt; + popt->next = nopt; + nopt->name = stp_malloc(strlen(opt->name) + 1); + strcpy(nopt->name, opt->name); + nopt->data = stp_malloc(opt->length); + memcpy(nopt->data, opt->data, opt->length); + opt = opt->next; + popt = nopt; + } + } +} + +void +stp_copy_vars(stp_vars_t vd, const stp_vars_t vs) +{ + if (vs == vd) + return; + stp_set_output_to(vd, stp_get_output_to(vs)); + stp_set_driver(vd, stp_get_driver(vs)); + stp_set_driver_data(vd, stp_get_driver_data(vs)); + stp_set_ppd_file(vd, stp_get_ppd_file(vs)); + stp_set_resolution(vd, stp_get_resolution(vs)); + stp_set_media_size(vd, stp_get_media_size(vs)); + stp_set_media_type(vd, stp_get_media_type(vs)); + stp_set_media_source(vd, stp_get_media_source(vs)); + stp_set_ink_type(vd, stp_get_ink_type(vs)); + stp_set_dither_algorithm(vd, stp_get_dither_algorithm(vs)); + stp_set_output_type(vd, stp_get_output_type(vs)); + stp_set_orientation(vd, stp_get_orientation(vs)); + stp_set_left(vd, stp_get_left(vs)); + stp_set_top(vd, stp_get_top(vs)); + stp_set_image_type(vd, stp_get_image_type(vs)); + stp_set_unit(vd, stp_get_unit(vs)); + stp_set_page_width(vd, stp_get_page_width(vs)); + stp_set_page_height(vd, stp_get_page_height(vs)); + stp_set_brightness(vd, stp_get_brightness(vs)); + stp_set_scaling(vd, stp_get_scaling(vs)); + stp_set_gamma(vd, stp_get_gamma(vs)); + stp_set_contrast(vd, stp_get_contrast(vs)); + stp_set_cyan(vd, stp_get_cyan(vs)); + stp_set_magenta(vd, stp_get_magenta(vs)); + stp_set_yellow(vd, stp_get_yellow(vs)); + stp_set_saturation(vd, stp_get_saturation(vs)); + stp_set_density(vd, stp_get_density(vs)); + stp_set_app_gamma(vd, stp_get_app_gamma(vs)); + stp_set_input_color_model(vd, stp_get_input_color_model(vd)); + stp_set_output_color_model(vd, stp_get_output_color_model(vd)); + stp_set_lut(vd, stp_get_lut(vs)); + stp_set_outdata(vd, stp_get_outdata(vs)); + stp_set_errdata(vd, stp_get_errdata(vs)); + stp_set_cmap(vd, stp_get_cmap(vs)); + stp_set_outfunc(vd, stp_get_outfunc(vs)); + stp_set_errfunc(vd, stp_get_errfunc(vs)); + stp_copy_options(vd, vs); + stp_set_verified(vd, stp_get_verified(vs)); +} + +stp_vars_t +stp_allocate_copy(const stp_vars_t vs) +{ + stp_vars_t vd = stp_allocate_vars(); + stp_copy_vars(vd, vs); + return (vd); +} + +#define ICLAMP(value) \ +do \ +{ \ + if (stp_get_##value(user) < stp_get_##value(min)) \ + stp_set_##value(user, stp_get_##value(min)); \ + else if (stp_get_##value(user) > stp_get_##value(max)) \ + stp_set_##value(user, stp_get_##value(max)); \ +} while (0) + +void +stp_merge_printvars(stp_vars_t user, const stp_vars_t print) +{ + const stp_vars_t max = stp_maximum_settings(); + const stp_vars_t min = stp_minimum_settings(); + stp_set_cyan(user, stp_get_cyan(user) * stp_get_cyan(print)); + ICLAMP(cyan); + stp_set_magenta(user, stp_get_magenta(user) * stp_get_magenta(print)); + ICLAMP(magenta); + stp_set_yellow(user, stp_get_yellow(user) * stp_get_yellow(print)); + ICLAMP(yellow); + stp_set_contrast(user, stp_get_contrast(user) * stp_get_contrast(print)); + ICLAMP(contrast); + stp_set_brightness(user, stp_get_brightness(user)*stp_get_brightness(print)); + ICLAMP(brightness); + stp_set_gamma(user, stp_get_gamma(user) / stp_get_gamma(print)); + ICLAMP(gamma); + stp_set_saturation(user, stp_get_saturation(user)*stp_get_saturation(print)); + ICLAMP(saturation); + stp_set_density(user, stp_get_density(user) * stp_get_density(print)); + ICLAMP(density); + if (stp_get_output_type(print) == OUTPUT_GRAY && + stp_get_output_type(user) == OUTPUT_COLOR) + stp_set_output_type(user, OUTPUT_GRAY); +} + +/* + * 'stp_default_media_size()' - Return the size of a default page size. + */ + +/* + * Sizes are converted to 1/72in, then rounded down so that we don't + * print off the edge of the paper. + */ +static stp_internal_papersize_t paper_sizes[] = +{ + /* Common imperial page sizes */ + { "Letter", N_ ("Letter"), + 612, 792, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, /* 8.5in x 11in */ + { "Legal", N_ ("Legal"), + 612, 1008, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, /* 8.5in x 14in */ + { "Tabloid", N_ ("Tabloid"), + 792, 1224, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, /* 11in x 17in */ + { "Executive", N_ ("Executive"), + 522, 756, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, /* 7.25 * 10.5in */ + { "Postcard", N_ ("Postcard"), + 283, 416, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, /* 100mm x 147mm */ + { "w216h360", N_ ("3x5"), + 216, 360, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "w288h432", N_ ("4x6"), + 288, 432, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "w324h495", N_ ("Epson 4x6 Photo Paper"), + 324, 495, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "w360h504", N_ ("5x7"), + 360, 504, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "w360h576", N_ ("5x8"), + 360, 576, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "w432h576", N_ ("6x8"), + 432, 576, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "8x10", N_ ("8x10"), + 576, 720, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "Statement", N_ ("Manual"), + 396, 612, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, /* 5.5in x 8.5in */ + { "TabloidExtra", N_ ("12x18"), + 864, 1296, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "SuperB", N_ ("Super B 13x19"), + 936, 1368, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + + /* Other common photographic paper sizes */ + { "w576h864", N_ ("8x12"), + 576, 864, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, /* Sometimes used for 35 mm */ + { "w792h1008", N_ ("11x14"), + 792, 1008, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "w1152h1440", N_ ("16x20"), + 1152, 1440, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "w1152h1728", N_ ("16x24"), + 1152, 1728, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, /* 20x24 for 35 mm */ + { "w1440h1728", N_ ("20x24"), + 1440, 1728, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "w1440h2160", N_ ("20x30"), + 1440, 2160, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, /* 24x30 for 35 mm */ + { "w1728h2160", N_ ("24x30"), + 1728, 2160, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "w1728h2592", N_ ("24x36"), + 1728, 2592, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, /* Sometimes used for 35 mm */ + { "w2160h2880", N_ ("30x40"), + 2160, 2880, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + + /* International Paper Sizes (mostly taken from BS4000:1968) */ + + /* + * "A" series: Paper and boards, trimmed sizes + * + * "A" sizes are in the ratio 1 : sqrt(2). A0 has a total area + * of 1 square metre. Everything is rounded to the nearest + * millimetre. Thus, A0 is 841mm x 1189mm. Every other A + * size is obtained by doubling or halving another A size. + */ + { "w4768h6749", N_ ("4A"), + 4768, 6749, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 1682mm x 2378mm */ + { "w3370h4768", N_ ("2A"), + 3370, 4768, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 1189mm x 1682mm */ + { "A0", N_ ("A0"), + 2384, 3370, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 841mm x 1189mm */ + { "A1", N_ ("A1"), + 1684, 2384, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 594mm x 841mm */ + { "A2", N_ ("A2"), + 1191, 1684, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 420mm x 594mm */ + { "A3", N_ ("A3"), + 842, 1191, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 297mm x 420mm */ + { "A4", N_ ("A4"), + 595, 842, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 210mm x 297mm */ + { "A5", N_ ("A5"), + 420, 595, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 148mm x 210mm */ + { "A6", N_ ("A6"), + 297, 420, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 105mm x 148mm */ + { "A7", N_ ("A7"), + 210, 297, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 74mm x 105mm */ + { "A8", N_ ("A8"), + 148, 210, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 52mm x 74mm */ + { "A9", N_ ("A9"), + 105, 148, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 37mm x 52mm */ + { "A10", N_ ("A10"), + 73, 105, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 26mm x 37mm */ + + /* + * Stock sizes for normal trims. + * Allowance for trim is 3 millimetres. + */ + { "w2437h3458", N_ ("RA0"), + 2437, 3458, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 860mm x 1220mm */ + { "w1729h2437", N_ ("RA1"), + 1729, 2437, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 610mm x 860mm */ + { "w1218h1729", N_ ("RA2"), + 1218, 1729, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 430mm x 610mm */ + { "w864h1218", N_ ("RA3"), + 864, 1218, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 305mm x 430mm */ + { "w609h864", N_ ("RA4"), + 609, 864, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 215mm x 305mm */ + + /* + * Stock sizes for bled work or extra trims. + */ + { "w2551h3628", N_ ("SRA0"), + 2551, 3628, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 900mm x 1280mm */ + { "w1814h2551", N_ ("SRA1"), + 1814, 2551, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 640mm x 900mm */ + { "w1275h1814", N_ ("SRA2"), + 1275, 1814, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 450mm x 640mm */ + { "w907h1275", N_ ("SRA3"), + 907, 1275, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 320mm x 450mm */ + { "w637h907", N_ ("SRA4"), + 637, 907, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 225mm x 320mm */ + + /* + * "B" series: Posters, wall charts and similar items. + */ + { "w5669h8016", N_ ("4B ISO"), + 5669, 8016, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 2000mm x 2828mm */ + { "w4008h5669", N_ ("2B ISO"), + 4008, 5669, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 1414mm x 2000mm */ + { "ISOB0", N_ ("B0 ISO"), + 2834, 4008, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 1000mm x 1414mm */ + { "ISOB1", N_ ("B1 ISO"), + 2004, 2834, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 707mm x 1000mm */ + { "ISOB2", N_ ("B2 ISO"), + 1417, 2004, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 500mm x 707mm */ + { "ISOB3", N_ ("B3 ISO"), + 1000, 1417, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 353mm x 500mm */ + { "ISOB4", N_ ("B4 ISO"), + 708, 1000, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 250mm x 353mm */ + { "ISOB5", N_ ("B5 ISO"), + 498, 708, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 176mm x 250mm */ + { "ISOB6", N_ ("B6 ISO"), + 354, 498, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 125mm x 176mm */ + { "ISOB7", N_ ("B7 ISO"), + 249, 354, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 88mm x 125mm */ + { "ISOB8", N_ ("B8 ISO"), + 175, 249, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 62mm x 88mm */ + { "ISOB9", N_ ("B9 ISO"), + 124, 175, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 44mm x 62mm */ + { "ISOB10", N_ ("B10 ISO"), + 87, 124, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 31mm x 44mm */ + + { "B0", N_ ("B0 JIS"), + 2919, 4127, 0, 0, 0, 0, PAPERSIZE_METRIC }, + { "B1", N_ ("B1 JIS"), + 2063, 2919, 0, 0, 0, 0, PAPERSIZE_METRIC }, + { "B2", N_ ("B2 JIS"), + 1459, 2063, 0, 0, 0, 0, PAPERSIZE_METRIC }, + { "B3", N_ ("B3 JIS"), + 1029, 1459, 0, 0, 0, 0, PAPERSIZE_METRIC }, + { "B4", N_ ("B4 JIS"), + 727, 1029, 0, 0, 0, 0, PAPERSIZE_METRIC }, + { "B5", N_ ("B5 JIS"), + 518, 727, 0, 0, 0, 0, PAPERSIZE_METRIC }, + { "B6", N_ ("B6 JIS"), + 362, 518, 0, 0, 0, 0, PAPERSIZE_METRIC }, + { "B7", N_ ("B7 JIS"), + 257, 362, 0, 0, 0, 0, PAPERSIZE_METRIC }, + { "B8", N_ ("B8 JIS"), + 180, 257, 0, 0, 0, 0, PAPERSIZE_METRIC }, + { "B9", N_ ("B9 JIS"), + 127, 180, 0, 0, 0, 0, PAPERSIZE_METRIC }, + { "B10", N_ ("B10 JIS"), + 90, 127, 0, 0, 0, 0, PAPERSIZE_METRIC }, + + /* + * "C" series: Envelopes or folders suitable for A size stationery. + */ + { "C0", N_ ("C0"), + 2599, 3676, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 917mm x 1297mm */ + { "C1", N_ ("C1"), + 1836, 2599, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 648mm x 917mm */ + { "C2", N_ ("C2"), + 1298, 1836, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 458mm x 648mm */ + { "C3", N_ ("C3"), + 918, 1298, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 324mm x 458mm */ + { "C4", N_ ("C4"), + 649, 918, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 229mm x 324mm */ + { "C5", N_ ("C5"), + 459, 649, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 162mm x 229mm */ + { "w354h918", N_ ("B6-C4"), + 354, 918, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 125mm x 324mm */ + { "C6", N_ ("C6"), + 323, 459, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 114mm x 162mm */ + { "DL", N_ ("DL"), + 311, 623, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 110mm x 220mm */ + { "w229h459", N_ ("C7-6"), + 229, 459, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 81mm x 162mm */ + { "C7", N_ ("C7"), + 229, 323, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 81mm x 114mm */ + { "C8", N_ ("C8"), + 161, 229, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 57mm x 81mm */ + { "C9", N_ ("C9"), + 113, 161, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 40mm x 57mm */ + { "C10", N_ ("C10"), + 79, 113, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 28mm x 40mm */ + + /* + * US CAD standard paper sizes + */ + { "ARCHA", N_ ("ArchA"), + 648, 864, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "ARCHB", N_ ("ArchB"), + 864, 1296, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "ARCHC", N_ ("ArchC"), + 1296, 1728, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "ARCHD", N_ ("ArchD"), + 1728, 2592, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "ARCHE", N_ ("ArchE"), + 2592, 3456, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + + /* + * Foolscap + */ + { "w612h936", N_ ("American foolscap"), + 612, 936, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, /* American foolscap */ + { "w648h936", N_ ("European foolscap"), + 648, 936, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, /* European foolscap */ + + /* + * Sizes for book production + * The BPIF and the Publishers Association jointly recommend ten + * standard metric sizes for case-bound titles as follows: + */ + { "w535h697", N_ ("Crown Quarto"), + 535, 697, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 189mm x 246mm */ + { "w569h731", N_ ("Large Crown Quarto"), + 569, 731, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 201mm x 258mm */ + { "w620h782", N_ ("Demy Quarto"), + 620, 782, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 219mm x 276mm */ + { "w671h884", N_ ("Royal Quarto"), + 671, 884, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 237mm x 312mm */ + /*{ "ISO A4", 595, + 841, PAPERSIZE_METRIC, 0, 0, 0, 0 }, 210mm x 297mm */ + { "w348h527", N_ ("Crown Octavo"), + 348, 527, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 123mm x 186mm */ + { "w365h561", N_ ("Large Crown Octavo"), + 365, 561, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 129mm x 198mm */ + { "w391h612", N_ ("Demy Octavo"), + 391, 612, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 138mm x 216mm */ + { "w442h663", N_ ("Royal Octavo"), + 442, 663, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 156mm x 234mm */ + /*{ N_ ("ISO A5"), 419, + 595, 0, 0, 0, 0, PAPERSIZE_METRIC }, 148mm x 210mm */ + + /* Paperback sizes in common usage */ + { "w314h504", N_ ("Small paperback"), + 314, 504, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 111mm x 178mm */ + { "w314h513", N_ ("Penguin small paperback"), + 314, 513, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 111mm x 181mm */ + { "w365h561", N_ ("Penguin large paperback"), + 365, 561, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 129mm x 198mm */ + + /* Miscellaneous sizes */ + { "w283h420", N_ ("Hagaki Card"), + 283, 420, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 100 x 148 mm */ + { "w420h567", N_ ("Oufuku Card"), + 420, 567, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 148 x 200 mm */ + { "w340h666", N_ ("Japanese long envelope #3"), + 340, 666, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* Japanese long envelope #3 */ + { "w255h581", N_ ("Japanese long envelope #4"), + 255, 581, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* Japanese long envelope #4 */ + { "w680h941", N_ ("Japanese Kaku envelope #4"), + 680, 941, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* Japanese Kaku envelope #4 */ + { "COM10", N_ ("Commercial 10"), + 297, 684, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, /* US Commercial 10 env */ + { "w315h414", N_ ("A2 Invitation"), + 315, 414, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, /* US A2 invitation */ + { "Custom", N_ ("Custom"), + 0, 0, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + + { "w252", N_ ("89 mm Roll Paper"), + 252, 0, 0, 0, 0, 0, PAPERSIZE_METRIC }, + { "w288", N_ ("4 Inch Roll Paper"), + 288, 0, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "w360", N_ ("5 Inch Roll Paper"), + 360, 0, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "w595", N_ ("210 mm Roll Paper"), + 595, 0, 0, 0, 0, 0, PAPERSIZE_METRIC }, + { "w936", N_ ("13 Inch Roll Paper"), + 936, 0, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "w1584", N_ ("22 Inch Roll Paper"), + 1584, 0, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "w1728", N_ ("24 Inch Roll Paper"), + 1728, 0, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "w2592", N_ ("36 Inch Roll Paper"), + 2592, 0, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + { "w3168", N_ ("44 Inch Roll Paper"), + 3168, 0, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, + + { "", "", 0, 0, 0, 0, 0, PAPERSIZE_METRIC } +}; + +int +stp_known_papersizes(void) +{ + return sizeof(paper_sizes) / sizeof(stp_internal_papersize_t) - 1; +} + +const char * +stp_papersize_get_name(const stp_papersize_t pt) +{ + const stp_internal_papersize_t *p = (const stp_internal_papersize_t *) pt; + return p->name; +} + +const char * +stp_papersize_get_text(const stp_papersize_t pt) +{ + const stp_internal_papersize_t *p = (const stp_internal_papersize_t *) pt; + return _(p->text); +} + +unsigned +stp_papersize_get_width(const stp_papersize_t pt) +{ + const stp_internal_papersize_t *p = (const stp_internal_papersize_t *) pt; + return p->width; +} + +unsigned +stp_papersize_get_height(const stp_papersize_t pt) +{ + const stp_internal_papersize_t *p = (const stp_internal_papersize_t *) pt; + return p->height; +} + +unsigned +stp_papersize_get_top(const stp_papersize_t pt) +{ + const stp_internal_papersize_t *p = (const stp_internal_papersize_t *) pt; + return p->top; +} + +unsigned +stp_papersize_get_left(const stp_papersize_t pt) +{ + const stp_internal_papersize_t *p = (const stp_internal_papersize_t *) pt; + return p->left; +} + +unsigned +stp_papersize_get_bottom(const stp_papersize_t pt) +{ + const stp_internal_papersize_t *p = (const stp_internal_papersize_t *) pt; + return p->bottom; +} + +unsigned +stp_papersize_get_right(const stp_papersize_t pt) +{ + const stp_internal_papersize_t *p = (const stp_internal_papersize_t *) pt; + return p->right; +} + +stp_papersize_unit_t +stp_papersize_get_unit(const stp_papersize_t pt) +{ + const stp_internal_papersize_t *p = (const stp_internal_papersize_t *) pt; + return p->paper_unit; +} + +#if 1 +/* + * This is, of course, blatantly thread-unsafe. However, it certainly + * speeds up genppd by a lot! + */ +const stp_papersize_t +stp_get_papersize_by_name(const char *name) +{ + static int last_used_papersize = 0; + int base = last_used_papersize; + int sizes = stp_known_papersizes(); + int i; + for (i = 0; i < sizes; i++) + { + int size_to_try = (i + base) % sizes; + const stp_internal_papersize_t *val = &(paper_sizes[size_to_try]); + if (!strcmp(val->name, name)) + { + last_used_papersize = size_to_try; + return (const stp_papersize_t) val; + } + } + return NULL; +} +#else +const stp_papersize_t +stp_get_papersize_by_name(const char *name) +{ + const stp_internal_papersize_t *val = &(paper_sizes[0]); + while (strlen(val->name) > 0) + { + if (!strcmp(val->name, name)) + return (stp_papersize_t) val; + val++; + } + return NULL; +} +#endif + +const stp_papersize_t +stp_get_papersize_by_index(int index) +{ + if (index < 0 || index >= stp_known_papersizes()) + return NULL; + else + return (stp_papersize_t) &(paper_sizes[index]); +} + +static int +paper_size_mismatch(int l, int w, const stp_internal_papersize_t *val) +{ + int hdiff = abs(l - (int) val->height); + int vdiff = abs(w - (int) val->width); + return hdiff + vdiff; +} + +const stp_papersize_t +stp_get_papersize_by_size(int l, int w) +{ + int score = INT_MAX; + const stp_internal_papersize_t *ref = NULL; + const stp_internal_papersize_t *val = &(paper_sizes[0]); + int sizes = stp_known_papersizes(); + int i; + for (i = 0; i < sizes; i++) + { + if (val->width == w && val->height == l) + return (stp_papersize_t) val; + else + { + int myscore = paper_size_mismatch(l, w, val); + if (myscore < score && myscore < 20) + { + ref = val; + score = myscore; + } + } + val++; + } + return (stp_papersize_t) ref; +} + +void +stp_default_media_size(const stp_printer_t printer, + /* I - Printer model (not used) */ + const stp_vars_t v, /* I */ + int *width, /* O - Width in points */ + int *height) /* O - Height in points */ +{ + if (stp_get_page_width(v) > 0 && stp_get_page_height(v) > 0) + { + *width = stp_get_page_width(v); + *height = stp_get_page_height(v); + } + else + { + const stp_papersize_t papersize = + stp_get_papersize_by_name(stp_get_media_size(v)); + if (!papersize) + { + *width = 1; + *height = 1; + } + else + { + *width = stp_papersize_get_width(papersize); + *height = stp_papersize_get_height(papersize); + } + if (*width == 0) + *width = 612; + if (*height == 0) + *height = 792; + } +} + +/* + * The list of printers has been moved to printers.c + */ +#include "print-printers.c" + +int +stp_known_printers(void) +{ + return printer_count; +} + +const stp_printer_t +stp_get_printer_by_index(int idx) +{ + if (idx < 0 || idx >= printer_count) + return NULL; + return (stp_printer_t) &(printers[idx]); +} + +const stp_printer_t +stp_get_printer_by_long_name(const char *long_name) +{ + const stp_internal_printer_t *val = &(printers[0]); + int i; + for (i = 0; i < stp_known_printers(); i++) + { + if (!strcmp(val->long_name, long_name)) + return (stp_printer_t) val; + val++; + } + return NULL; +} + +const stp_printer_t +stp_get_printer_by_driver(const char *driver) +{ + const stp_internal_printer_t *val = &(printers[0]); + int i; + for (i = 0; i < stp_known_printers(); i++) + { + if (!strcmp(val->driver, driver)) + return (stp_printer_t) val; + val++; + } + return NULL; +} + +int +stp_get_printer_index_by_driver(const char *driver) +{ + int idx = 0; + const stp_internal_printer_t *val = &(printers[0]); + for (idx = 0; idx < stp_known_printers(); idx++) + { + if (!strcmp(val->driver, driver)) + return idx; + val++; + } + return -1; +} + +const char * +stp_printer_get_long_name(const stp_printer_t p) +{ + const stp_internal_printer_t *val = (const stp_internal_printer_t *) p; + return val->long_name; +} + +const char * +stp_printer_get_driver(const stp_printer_t p) +{ + const stp_internal_printer_t *val = (const stp_internal_printer_t *) p; + return val->driver; +} + +int +stp_printer_get_model(const stp_printer_t p) +{ + const stp_internal_printer_t *val = (const stp_internal_printer_t *) p; + return val->model; +} + +const stp_printfuncs_t * +stp_printer_get_printfuncs(const stp_printer_t p) +{ + const stp_internal_printer_t *val = (const stp_internal_printer_t *) p; + return val->printfuncs; +} + +const stp_vars_t +stp_printer_get_printvars(const stp_printer_t p) +{ + const stp_internal_printer_t *val = (const stp_internal_printer_t *) p; + return (stp_vars_t) &(val->printvars); +} + +const char * +stp_default_dither_algorithm(void) +{ + return stp_dither_algorithm_name(0); +} + +void +stp_compute_page_parameters(int page_right, /* I */ + int page_left, /* I */ + int page_top, /* I */ + int page_bottom, /* I */ + double scaling, /* I */ + int image_width, /* I */ + int image_height, /* I */ + stp_image_t *image, /* IO */ + int *orientation, /* IO */ + int *page_width, /* O */ + int *page_height, /* O */ + int *out_width, /* O */ + int *out_height, /* O */ + int *left, /* O */ + int *top) /* O */ +{ + *page_width = page_right - page_left; + *page_height = page_top - page_bottom; + + /* In AUTO orientation, just orient the paper the same way as the image. */ + + if (*orientation == ORIENT_AUTO) + { + if ((*page_width >= *page_height && image_width >= image_height) + || (*page_height >= *page_width && image_height >= image_width)) + *orientation = ORIENT_PORTRAIT; + else + *orientation = ORIENT_LANDSCAPE; + } + + if (*orientation == ORIENT_LANDSCAPE) + image->rotate_ccw(image); + else if (*orientation == ORIENT_UPSIDEDOWN) + image->rotate_180(image); + else if (*orientation == ORIENT_SEASCAPE) + image->rotate_cw(image); + + image_width = image->width(image); + image_height = image->height(image); + + /* + * Calculate width/height... + */ + + if (scaling == 0.0) + { + *out_width = *page_width; + *out_height = *page_height; + } + else if (scaling < 0.0) + { + /* + * Scale to pixels per inch... + */ + + *out_width = image_width * -72.0 / scaling; + *out_height = image_height * -72.0 / scaling; + } + else + { + /* + * Scale by percent... + */ + + /* + * Decide which orientation gives the proper fit + * If we ask for 50%, we do not want to exceed that + * in either dimension! + */ + + int twidth0 = *page_width * scaling / 100.0; + int theight0 = twidth0 * image_height / image_width; + int theight1 = *page_height * scaling / 100.0; + int twidth1 = theight1 * image_width / image_height; + + *out_width = FMIN(twidth0, twidth1); + *out_height = FMIN(theight0, theight1); + } + + if (*out_width == 0) + *out_width = 1; + if (*out_height == 0) + *out_height = 1; + + /* + * Adjust offsets depending on the page orientation... + */ + + if (*orientation == ORIENT_LANDSCAPE || *orientation == ORIENT_SEASCAPE) + { + int x; + + x = *left; + *left = *top; + *top = x; + } + + if ((*orientation == ORIENT_UPSIDEDOWN || *orientation == ORIENT_SEASCAPE) + && *left >= 0) + { + *left = *page_width - *left - *out_width; + if (*left < 0) + *left = 0; + } + + if ((*orientation == ORIENT_UPSIDEDOWN || *orientation == ORIENT_LANDSCAPE) + && *top >= 0) + { + *top = *page_height - *top - *out_height; + if (*top < 0) + *top = 0; + } + + if (*left < 0) + *left = (*page_width - *out_width) / 2; + + if (*top < 0) + *top = (*page_height - *out_height) / 2; +} + +void +stp_set_printer_defaults(stp_vars_t v, const stp_printer_t p, + const char *ppd_file) +{ + const stp_printfuncs_t *printfuncs = stp_printer_get_printfuncs(p); + stp_set_resolution(v, ((printfuncs->default_parameters) + (p, ppd_file, "Resolution"))); + stp_set_ink_type(v, ((printfuncs->default_parameters) + (p, ppd_file, "InkType"))); + stp_set_media_type(v, ((printfuncs->default_parameters) + (p, ppd_file, "MediaType"))); + stp_set_media_source(v, ((printfuncs->default_parameters) + (p, ppd_file, "InputSlot"))); + stp_set_media_size(v, ((printfuncs->default_parameters) + (p, ppd_file, "PageSize"))); + stp_set_dither_algorithm(v, stp_default_dither_algorithm()); + stp_set_driver(v, stp_printer_get_driver(p)); +} + +static int +verify_param(const char *checkval, stp_param_t *vptr, + int count, const char *what, const stp_vars_t v) +{ + int answer = 0; + int i; + if (count > 0) + { + for (i = 0; i < count; i++) + if (!strcmp(checkval, vptr[i].name)) + { + answer = 1; + break; + } + if (!answer) + stp_eprintf(v, "%s is not a valid %s\n", checkval, what); + for (i = 0; i < count; i++) + { + stp_free((void *)vptr[i].name); + stp_free((void *)vptr[i].text); + } + } + else + stp_eprintf(v, "%s is not a valid %s\n", checkval, what); + if (vptr) + free(vptr); + return answer; +} + +int +stp_verify_printer_params(const stp_printer_t p, const stp_vars_t v) +{ + stp_param_t *vptr; + int count; + int i; + int answer = 1; + const stp_printfuncs_t *printfuncs = stp_printer_get_printfuncs(p); + const stp_vars_t printvars = stp_printer_get_printvars(p); + const char *ppd_file = stp_get_ppd_file(v); + + /* + * Note that in raw CMYK mode the user is responsible for not sending + * color output to black & white printers! + */ + if (stp_get_output_type(printvars) == OUTPUT_GRAY && + (stp_get_output_type(v) == OUTPUT_COLOR || + stp_get_output_type(v) == OUTPUT_RAW_CMYK)) + { + answer = 0; + stp_eprintf(v, "Printer does not support color output\n"); + } + if (strlen(stp_get_media_size(v)) > 0) + { + const char *checkval = stp_get_media_size(v); + vptr = (*printfuncs->parameters)(p, ppd_file, "PageSize", &count); + answer &= verify_param(checkval, vptr, count, "page size", v); + } + else + { + int height, width; + int min_height, min_width; + (*printfuncs->limit)(p, v, &width, &height, &min_width, &min_height); + if (stp_get_page_height(v) <= min_height || + stp_get_page_height(v) > height || + stp_get_page_width(v) <= min_width || stp_get_page_width(v) > width) + { + answer = 0; + stp_eprintf(v, "Image size is not valid\n"); + } + } + + if (strlen(stp_get_media_type(v)) > 0) + { + const char *checkval = stp_get_media_type(v); + vptr = (*printfuncs->parameters)(p, ppd_file, "MediaType", &count); + answer &= verify_param(checkval, vptr, count, "media type", v); + } + + if (strlen(stp_get_media_source(v)) > 0) + { + const char *checkval = stp_get_media_source(v); + vptr = (*printfuncs->parameters)(p, ppd_file, "InputSlot", &count); + answer &= verify_param(checkval, vptr, count, "media source", v); + } + + if (strlen(stp_get_resolution(v)) > 0) + { + const char *checkval = stp_get_resolution(v); + vptr = (*printfuncs->parameters)(p, ppd_file, "Resolution", &count); + answer &= verify_param(checkval, vptr, count, "resolution", v); + } + + if (strlen(stp_get_ink_type(v)) > 0) + { + const char *checkval = stp_get_ink_type(v); + vptr = (*printfuncs->parameters)(p, ppd_file, "InkType", &count); + answer &= verify_param(checkval, vptr, count, "ink type", v); + } + + for (i = 0; i < stp_dither_algorithm_count(); i++) + if (!strcmp(stp_get_dither_algorithm(v), stp_dither_algorithm_name(i))) + { + stp_set_verified(v, answer); + return answer; + } + + stp_eprintf(v, "%s is not a valid dither algorithm\n", + stp_get_dither_algorithm(v)); + stp_set_verified(v, 0); + return 0; +} + +const stp_vars_t +stp_default_settings() +{ + return (stp_vars_t) &default_vars; +} + +const stp_vars_t +stp_maximum_settings() +{ + return (stp_vars_t) &max_vars; +} + +const stp_vars_t +stp_minimum_settings() +{ + return (stp_vars_t) &min_vars; +} + +#if defined DISABLE_NLS || !defined HAVE_VASPRINTF +#include + +static int vasprintf (char **result, const char *format, va_list args); +static int int_vasprintf (char **result, const char *format, va_list *args); + +static int +int_vasprintf (char **result, const char *format, va_list *args) +{ + const char *p = format; + /* Add one to make sure that it is never zero, which might cause malloc + to return NULL. */ + int total_width = strlen (format) + 1; + va_list ap; + + memcpy (&ap, args, sizeof (va_list)); + + while (*p != '\0') + { + if (*p++ == '%') + { + while (strchr ("-+ #0", *p)) + ++p; + if (*p == '*') + { + ++p; + total_width += abs (va_arg (ap, int)); + } + else + total_width += strtoul (p, (char **) &p, 10); + if (*p == '.') + { + ++p; + if (*p == '*') + { + ++p; + total_width += abs (va_arg (ap, int)); + } + else + total_width += strtoul (p, (char **) &p, 10); + } + while (strchr ("hlL", *p)) + ++p; + /* Should be big enough for any format specifier except %s. */ + total_width += 30; + switch (*p) + { + case 'd': + case 'i': + case 'o': + case 'u': + case 'x': + case 'X': + case 'c': + (void) va_arg (ap, int); + break; + case 'f': + case 'e': + case 'E': + case 'g': + case 'G': + (void) va_arg (ap, double); + break; + case 's': + total_width += strlen (va_arg (ap, char *)); + break; + case 'p': + case 'n': + (void) va_arg (ap, char *); + break; + } + } + } +#ifdef TEST + global_total_width = total_width; +#endif + *result = malloc (total_width); + if (*result != NULL) + return vsprintf (*result, format, *args); + else + return 0; +} + +static int +vasprintf (char **result, const char *format, va_list args) +{ + return int_vasprintf (result, format, &args); +} +#else +extern int vasprintf (char **result, const char *format, va_list args); +#endif + +void +stp_zprintf(const stp_vars_t v, const char *format, ...) +{ + va_list args; + int bytes; + char *result; + va_start(args, format); + bytes = vasprintf(&result, format, args); + va_end(args); + (stp_get_outfunc(v))((void *)(stp_get_outdata(v)), result, bytes); + free(result); +} + +void +stp_zfwrite(const char *buf, size_t bytes, size_t nitems, const stp_vars_t v) +{ + (stp_get_outfunc(v))((void *)(stp_get_outdata(v)), buf, bytes * nitems); +} + +void +stp_putc(int ch, const stp_vars_t v) +{ + char a = (char) ch; + (stp_get_outfunc(v))((void *)(stp_get_outdata(v)), &a, 1); +} + +void +stp_puts(const char *s, const stp_vars_t v) +{ + (stp_get_outfunc(v))((void *)(stp_get_outdata(v)), s, strlen(s)); +} + +void +stp_eprintf(const stp_vars_t v, const char *format, ...) +{ + va_list args; + int bytes; + char *result; + if (stp_get_errfunc(v)) + { + va_start(args, format); + bytes = vasprintf(&result, format, args); + va_end(args); + (stp_get_errfunc(v))((void *)(stp_get_errdata(v)), result, bytes); + free(result); + } +} + +void +stp_erputc(int ch) +{ + putc(ch, stderr); +} + +void +stp_erprintf(const char *format, ...) +{ + va_list args; + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); +} + +static unsigned long stp_debug_level = 0; + +static void +init_stp_debug(void) +{ + static int debug_initialized = 0; + if (!debug_initialized) + { + const char *dval = getenv("STP_DEBUG"); + debug_initialized = 1; + if (dval) + { + stp_debug_level = strtoul(dval, 0, 0); + stp_erprintf("Gimp-Print %s %s\n", VERSION, RELEASE_DATE); + } + } +} + +void +stp_dprintf(unsigned long level, const stp_vars_t v, const char *format, ...) +{ + va_list args; + int bytes; + char *result; + init_stp_debug(); + if ((level & stp_debug_level) && stp_get_errfunc(v)) + { + va_start(args, format); + bytes = vasprintf(&result, format, args); + va_end(args); + (stp_get_errfunc(v))((void *)(stp_get_errdata(v)), result, bytes); + free(result); + } +} + +void +stp_deprintf(unsigned long level, const char *format, ...) +{ + va_list args; + int bytes; + char *result; + init_stp_debug(); + if (level & stp_debug_level) + { + va_start(args, format); + bytes = vasprintf(&result, format, args); + va_end(args); + stp_erprintf("%s", result); + free(result); + } +} + +void * +stp_malloc (size_t size) +{ + register void *memptr = NULL; + + if ((memptr = malloc (size)) == NULL) + { + fputs("Virtual memory exhausted.\n", stderr); + exit (EXIT_FAILURE); + } + return (memptr); +} + +void +stp_free(void *ptr) +{ + free(ptr); +} + +int +stp_init(void) +{ + static int stp_is_initialised = 0; + if (!stp_is_initialised) + { + /* Things that are only initialised once */ + /* Set up gettext */ +#ifdef ENABLE_NLS + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE, PACKAGE_LOCALE_DIR); +#endif + init_stp_debug(); + } + stp_is_initialised = 1; + return (0); +} + +#ifdef QUANTIFY +unsigned quantify_counts[NUM_QUANTIFY_BUCKETS] = {0}; +struct timeval quantify_buckets[NUM_QUANTIFY_BUCKETS] = {{0,0}}; +int quantify_high_index = 0; +int quantify_first_time = 1; +struct timeval quantify_cur_time; +struct timeval quantify_prev_time; + +void print_timers(const stp_vars_t v) +{ + int i; + + stp_eprintf(v, "%s", "Quantify timers:\n"); + for (i = 0; i <= quantify_high_index; i++) + { + if (quantify_counts[i] > 0) + { + stp_eprintf(v, + "Bucket %d:\t%ld.%ld s\thit %u times\n", i, + quantify_buckets[i].tv_sec, quantify_buckets[i].tv_usec, + quantify_counts[i]); + quantify_buckets[i].tv_sec = 0; + quantify_buckets[i].tv_usec = 0; + quantify_counts[i] = 0; + } + } +} +#endif diff --git a/src/main/print-version.c b/src/main/print-version.c new file mode 100644 index 0000000..22b80c5 --- /dev/null +++ b/src/main/print-version.c @@ -0,0 +1,62 @@ +/* + * "$Id: print-version.c,v 1.6 2001/09/08 17:13:48 rleigh Exp $" + * + * Print plug-in driver utility functions for the GIMP. + * + * Copyright 1997-2000 Michael Sweet (mike@easysw.com) and + * Robert Krawitz (rlk@alum.mit.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + * This file must include only standard C header files. The core code must + * compile on generic platforms that don't support glib, gimp, gimpprint, etc. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include "gimp-print-internal.h" +#include + +const unsigned int gimpprint_major_version = GIMPPRINT_MAJOR_VERSION; +const unsigned int gimpprint_minor_version = GIMPPRINT_MINOR_VERSION; +const unsigned int gimpprint_micro_version = GIMPPRINT_MICRO_VERSION; +const unsigned int gimpprint_current_interface = GIMPPRINT_CURRENT_INTERFACE; +const unsigned int gimpprint_binary_age = GIMPPRINT_BINARY_AGE; +const unsigned int gimpprint_interface_age = GIMPPRINT_INTERFACE_AGE; + + +const char * +stp_check_version (unsigned int required_major, + unsigned int required_minor, unsigned int required_micro) +{ + if (required_major > GIMPPRINT_MAJOR_VERSION) + return "gimpprint version too old (major mismatch)"; + if (required_major < GIMPPRINT_MAJOR_VERSION) + return "gimpprint version too new (major mismatch)"; + if (required_minor > GIMPPRINT_MINOR_VERSION) + return "gimpprint version too old (minor mismatch)"; + if (required_minor < GIMPPRINT_MINOR_VERSION) + return "gimpprint version too new (minor mismatch)"; + if (required_micro < GIMPPRINT_MICRO_VERSION - GIMPPRINT_BINARY_AGE) + return "gimpprint version too new (micro mismatch)"; + if (required_micro > GIMPPRINT_MICRO_VERSION) + return "gimpprint version too old (micro mismatch)"; + return NULL; +} diff --git a/src/main/print-weave.c b/src/main/print-weave.c new file mode 100644 index 0000000..b7e058d --- /dev/null +++ b/src/main/print-weave.c @@ -0,0 +1,2715 @@ +/* + * "$Id: print-weave.c,v 1.36 2001/09/08 17:13:48 rleigh Exp $" + * + * Softweave calculator for gimp-print. + * + * Copyright 2000 Charles Briscoe-Smith + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + * This file must include only standard C header files. The core code must + * compile on generic platforms that don't support glib, gimp, gtk, etc. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include +#include +#include "gimp-print-internal.h" +#include + +#if 0 +#define TEST_RAW +#endif +#if 0 +#define TEST_COOKED +#endif +#if 0 +#define ACCUMULATE +#endif +#if 1 +#define ASSERTIONS +#endif + +#if defined(TEST_RAW) || defined(TEST_COOKED) +#define TEST +#endif + +#ifdef ASSERTIONS +#define assert(x,v) \ +do \ +{ \ + if (!(x)) \ + { \ + stp_eprintf(v, "Assertion %s failed! file %s, line %d.\n", \ + #x, __FILE__, __LINE__); \ + exit(1); \ + } \ +} while (0) +#else +#define assert(x,v) do {} while (0) +#endif + +#ifdef TEST +#define MAXCOLLECT (1000) +#endif + +static int +gcd(int x, int y) +{ + if (y == 0) + return x; + while (x != 0) { + if (y > x) { + int t = x; + x = y; + y = t; + } + x %= y; + } + return y; +} + +/* RAW WEAVE */ + +typedef struct raw { + int separation; + int jets; + int oversampling; + int advancebasis; + int subblocksperpassblock; + int passespersubblock; + int strategy; + stp_vars_t v; +} raw_t; + +/* + * Strategy types currently defined: + * + * 0: microweave (intercepted at the escp2 driver level so we never + * see it here) + * 1: zig-zag type pass block filling + * 2: ascending pass block filling + * 3: descending pass block filling + * 4: ascending fill with 2x expansion + * 5: ascending fill with 3x expansion + * 6: staggered zig-zag neighbour-avoidance fill + * + * In theory, strategy 1 should be optimal; in practice, it can lead + * to visible areas of banding. If it's necessary to avoid filling + * neighbouring rows in neighbouring passes, strategy 6 should be optimal, + * at least for some weaves. + */ + +static void +initialize_raw_weave(raw_t *w, /* I - weave struct to be filled in */ + int S, /* I - jet separation */ + int J, /* I - number of jets */ + int H, /* I - oversampling factor */ + int strat, /* I - weave pattern variation to use */ + stp_vars_t v) +{ + w->separation = S; + w->jets = J; + w->oversampling = H; + w->advancebasis = J / H; + if (w->advancebasis == 0) + w->advancebasis++; + w->subblocksperpassblock = gcd(S, w->advancebasis); + w->passespersubblock = S / w->subblocksperpassblock; + w->strategy = strat; + w->v = v; +} + +static void +calculate_raw_pass_parameters(raw_t *w, /* I - weave parameters */ + int pass, /* I - pass number ( >= 0) */ + int *startrow, /* O - print head position */ + int *subpass) /* O - subpass number */ +{ + int band, passinband, subpassblock, subpassoffset; + + band = pass / (w->separation * w->oversampling); + passinband = pass % (w->separation * w->oversampling); + subpassblock = pass % w->separation + * w->subblocksperpassblock / w->separation; + + switch (w->strategy) { + case 1: + if (subpassblock * 2 < w->subblocksperpassblock) + subpassoffset = 2 * subpassblock; + else + subpassoffset = 2 * (w->subblocksperpassblock + - subpassblock) - 1; + break; + case 2: + subpassoffset = subpassblock; + break; + case 3: + subpassoffset = w->subblocksperpassblock - 1 - subpassblock; + break; + case 4: + if (subpassblock * 2 < w->subblocksperpassblock) + subpassoffset = 2 * subpassblock; + else + subpassoffset = 1 + 2 * (subpassblock + - (w->subblocksperpassblock + + 1) / 2); + break; + case 5: + if (subpassblock * 3 < w->subblocksperpassblock) + subpassoffset = 3 * subpassblock; + else if (3 * (subpassblock - (w->subblocksperpassblock + 2) / 3) + < w->subblocksperpassblock - 2) + subpassoffset = 2 + 3 * (subpassblock + - (w->subblocksperpassblock + + 2) / 3); + else + subpassoffset = 1 + 3 * (subpassblock + - (w->subblocksperpassblock + + 2) / 3 + - w->subblocksperpassblock + / 3); + break; + case 6: + if (subpassblock * 2 < w->subblocksperpassblock) + subpassoffset = 2 * subpassblock; + else if (subpassblock * 2 < w->subblocksperpassblock + 2) + subpassoffset = 1; + else + subpassoffset = 2 * (w->subblocksperpassblock + - subpassblock) + 1; + break; + default: + subpassoffset = subpassblock; + break; + } + + *startrow = w->separation * w->jets * band + + w->advancebasis * passinband + subpassoffset; + *subpass = passinband / w->separation; +} + +static void +calculate_raw_row_parameters(raw_t *w, /* I - weave parameters */ + int row, /* I - row number */ + int subpass, /* I - subpass number */ + int *pass, /* O - pass number */ + int *jet, /* O - jet number in pass */ + int *startrow) /* O - starting row of pass */ +{ + int subblockoffset, subpassblock, band, baserow, passinband, offset; + int pass_div_separation; + int pass_mod_separation; + int off_mod_separation; + + subblockoffset = row % w->subblocksperpassblock; + switch (w->strategy) { + case 1: + if (subblockoffset % 2 == 0) + subpassblock = subblockoffset / 2; + else + subpassblock = w->subblocksperpassblock + - (subblockoffset + 1) / 2; + break; + case 2: + subpassblock = subblockoffset; + break; + case 3: + subpassblock = w->subblocksperpassblock - 1 - subblockoffset; + break; + case 4: + if (subblockoffset % 2 == 0) + subpassblock = subblockoffset / 2; + else + subpassblock = (subblockoffset - 1) / 2 + + (w->subblocksperpassblock + 1) / 2; + break; + case 5: + if (subblockoffset % 3 == 0) + subpassblock = subblockoffset / 3; + else if (subblockoffset % 3 == 1) + subpassblock = (subblockoffset - 1) / 3 + + (w->subblocksperpassblock + 2) / 3; + else + subpassblock = (subblockoffset - 2) / 3 + + (w->subblocksperpassblock + 2) / 3 + + (w->subblocksperpassblock + 1) / 3; + break; + case 6: + if (subblockoffset % 2 == 0) + subpassblock = subblockoffset / 2; + else if (subblockoffset == 1) + subpassblock = w->subblocksperpassblock / 2; + else + subpassblock = w->subblocksperpassblock + - (subblockoffset - 1) / 2; + default: + subpassblock = subblockoffset; + break; + } + + band = row / (w->separation * w->jets); + baserow = row - subblockoffset - band * w->separation * w->jets; + passinband = baserow / w->advancebasis; + offset = baserow % w->advancebasis; + pass_div_separation = passinband / w->separation; + pass_mod_separation = passinband % w->separation; + off_mod_separation = offset % w->separation; + + while (off_mod_separation != 0 + || pass_div_separation != subpass + || pass_mod_separation / w->passespersubblock + != subpassblock) + { + offset += w->advancebasis; + passinband--; + if (passinband >= 0) + { + pass_mod_separation--; + if (pass_mod_separation < 0) + { + pass_mod_separation += w->separation; + pass_div_separation--; + } + if (w->advancebasis < w->separation) + { + off_mod_separation += w->advancebasis; + if (off_mod_separation >= w->separation) + off_mod_separation -= w->separation; + } + else if (w->advancebasis > w->separation) + off_mod_separation = offset % w->separation; + } + else + { + const int roundedjets = + (w->advancebasis * w->oversampling) % w->jets; + band--; + passinband += w->separation * w->oversampling; + offset += w->separation * (w->jets - roundedjets); + pass_div_separation = passinband / w->separation; + pass_mod_separation = passinband % w->separation; + off_mod_separation = offset % w->separation; + } + } + + *pass = band * w->oversampling * w->separation + passinband; + *jet = (offset / w->separation) % w->jets; + *startrow = row - (*jet * w->separation); +} + +/* COOKED WEAVE */ + +typedef struct cooked { + raw_t rw; + int first_row_printed; + int last_row_printed; + + int first_premapped_pass; /* First raw pass used by this page */ + int first_normal_pass; + int first_postmapped_pass; + int first_unused_pass; + + int *pass_premap; + int *stagger_premap; + int *pass_postmap; + int *stagger_postmap; +} cooked_t; + +static void +sort_by_start_row(int *map, int *startrows, int count) +{ + /* + * Yes, it's a bubble sort, but we do it no more than 4 times + * per page, and we are only sorting a small number of items. + */ + + int dirty; + + do { + int x; + dirty = 0; + for (x = 1; x < count; x++) { + if (startrows[x - 1] > startrows[x]) { + int temp = startrows[x - 1]; + startrows[x - 1] = startrows[x]; + startrows[x] = temp; + temp = map[x - 1]; + map[x - 1] = map[x]; + map[x] = temp; + dirty = 1; + } + } + } while (dirty); +} + +static void +calculate_stagger(raw_t *w, int *map, int *startrows_stagger, int count) +{ + int i; + + for (i = 0; i < count; i++) { + int startrow, subpass; + calculate_raw_pass_parameters(w, map[i], &startrow, &subpass); + startrow -= w->separation * w->jets; + startrows_stagger[i] = (startrows_stagger[i] - startrow) + / w->separation; + } +} + +static void +invert_map(int *map, int *stagger, int count, int oldfirstpass, + int newfirstpass) +{ + int i; + int *newmap, *newstagger; + newmap = stp_malloc(count * sizeof(int)); + newstagger = stp_malloc(count * sizeof(int)); + + for (i = 0; i < count; i++) { + newmap[map[i] - oldfirstpass] = i + newfirstpass; + newstagger[map[i] - oldfirstpass] = stagger[i]; + } + + memcpy(map, newmap, count * sizeof(int)); + memcpy(stagger, newstagger, count * sizeof(int)); + stp_free(newstagger); + stp_free(newmap); +} + +static void +make_passmap(raw_t *w, int **map, int **starts, int first_pass_number, + int first_pass_to_map, int first_pass_after_map, + int first_pass_to_stagger, int first_pass_after_stagger, + int first_row_of_maximal_pass, int separations_to_distribute) +{ + int *passmap, *startrows; + int passes_to_map = first_pass_after_map - first_pass_to_map; + int i; + + assert(first_pass_to_map <= first_pass_after_map, w->v); + assert(first_pass_to_stagger <= first_pass_after_stagger, w->v); + + *map = passmap = stp_malloc(passes_to_map * sizeof(int)); + *starts = startrows = stp_malloc(passes_to_map * sizeof(int)); + + for (i = 0; i < passes_to_map; i++) { + int startrow, subpass; + int pass = i + first_pass_to_map; + calculate_raw_pass_parameters(w, pass, &startrow, &subpass); + passmap[i] = pass; + if (first_row_of_maximal_pass >= 0) + startrow = first_row_of_maximal_pass - startrow + + w->separation * w->jets; + else + startrow -= w->separation * w->jets; + while (startrow < 0) + startrow += w->separation; + startrows[i] = startrow; + } + + sort_by_start_row(passmap, startrows, passes_to_map); + + separations_to_distribute++; + + for (i = 0; i < first_pass_after_stagger - first_pass_to_stagger; i++) { + int offset = first_pass_to_stagger - first_pass_to_map; + if (startrows[i + offset] / w->separation + < i % separations_to_distribute) + { + startrows[i + offset] + = startrows[i + offset] % w->separation + + w->separation * (i % separations_to_distribute); + } + } + + if (first_row_of_maximal_pass >= 0) { + for (i = 0; i < passes_to_map; i++) { + startrows[i] = first_row_of_maximal_pass - startrows[i]; + } + } + + sort_by_start_row(passmap, startrows, passes_to_map); + calculate_stagger(w, passmap, startrows, passes_to_map); + + invert_map(passmap, startrows, passes_to_map, first_pass_to_map, + first_pass_to_map - first_pass_number); +} + +static void +calculate_pass_map(stp_vars_t v, + cooked_t *w, /* I - weave parameters */ + int pageheight, /* I - number of rows on page */ + int firstrow, /* I - first printed row */ + int lastrow) /* I - last printed row */ +{ + int startrow, subpass; + int pass = -1; + + w->first_row_printed = firstrow; + w->last_row_printed = lastrow; + + if (pageheight <= lastrow) + pageheight = lastrow + 1; + + do { + calculate_raw_pass_parameters(&w->rw, ++pass, + &startrow, &subpass); + } while (startrow - w->rw.separation < firstrow); + + w->first_premapped_pass = pass; + + while (startrow < w->rw.separation * w->rw.jets + && startrow - w->rw.separation < pageheight + && startrow <= lastrow + w->rw.separation * w->rw.jets) + { + calculate_raw_pass_parameters(&w->rw, ++pass, + &startrow, &subpass); + } + w->first_normal_pass = pass; + + while (startrow - w->rw.separation < pageheight + && startrow <= lastrow + w->rw.separation * w->rw.jets) + { + calculate_raw_pass_parameters(&w->rw, ++pass, + &startrow, &subpass); + } + w->first_postmapped_pass = pass; + + while (startrow <= lastrow + w->rw.separation * w->rw.jets) { + calculate_raw_pass_parameters(&w->rw, ++pass, + &startrow, &subpass); + } + w->first_unused_pass = pass; + + stp_dprintf(STP_DBG_WEAVE_PARAMS, v, + "first premapped %d first normal %d first postmapped %d " + "first unused %d\n", + w->first_premapped_pass, w->first_normal_pass, + w->first_postmapped_pass, w->first_unused_pass); + /* + * FIXME: make sure first_normal_pass doesn't advance beyond + * first_postmapped_pass, or first_postmapped_pass doesn't + * retreat before first_normal_pass. + */ + + if (w->first_normal_pass > w->first_premapped_pass) { + int spread, separations_to_distribute, normal_passes_mapped; + separations_to_distribute = firstrow / w->rw.separation; + spread = (separations_to_distribute + 1) * w->rw.separation; + normal_passes_mapped = (spread + w->rw.advancebasis - 1) + / w->rw.advancebasis; + w->first_normal_pass += normal_passes_mapped; + make_passmap(&w->rw, &w->pass_premap, &w->stagger_premap, + w->first_premapped_pass, + w->first_premapped_pass, w->first_normal_pass, + w->first_premapped_pass, + w->first_normal_pass - normal_passes_mapped, + -1, separations_to_distribute); + } else { + w->pass_premap = 0; + w->stagger_premap = 0; + } + + if (w->first_unused_pass > w->first_postmapped_pass) { + int spread, separations_to_distribute, normal_passes_mapped; + separations_to_distribute = (pageheight - lastrow - 1) + / w->rw.separation; + spread = (separations_to_distribute + 1) * w->rw.separation; + normal_passes_mapped = (spread + w->rw.advancebasis) + / w->rw.advancebasis; + w->first_postmapped_pass -= normal_passes_mapped; + make_passmap(&w->rw, &w->pass_postmap, &w->stagger_postmap, + w->first_premapped_pass, + w->first_postmapped_pass, w->first_unused_pass, + w->first_postmapped_pass + normal_passes_mapped, + w->first_unused_pass, + pageheight - 1 + - w->rw.separation * (w->rw.jets - 1), + separations_to_distribute); + } else { + w->pass_postmap = 0; + w->stagger_postmap = 0; + } +} + +static void * /* O - weave parameter block */ +initialize_weave_params(int S, /* I - jet separation */ + int J, /* I - number of jets */ + int H, /* I - oversampling factor */ + int firstrow, /* I - first row number to print */ + int lastrow, /* I - last row number to print */ + int pageheight, /* I - number of rows on the whole + page, without using any + expanded margin facilities */ + int strategy, /* I - weave pattern variant to use */ + stp_vars_t v) +{ + cooked_t *w = stp_malloc(sizeof(cooked_t)); + if (w) { + initialize_raw_weave(&w->rw, S, J, H, strategy, v); + calculate_pass_map(v, w, pageheight, firstrow, lastrow); + } + return w; +} + +void +stp_destroy_weave_params(void *vw) +{ + cooked_t *w = (cooked_t *) vw; + + if (w->pass_premap) stp_free(w->pass_premap); + if (w->stagger_premap) stp_free(w->stagger_premap); + if (w->pass_postmap) stp_free(w->pass_postmap); + if (w->stagger_postmap) stp_free(w->stagger_postmap); + stp_free(w); +} + +static void +stp_calculate_row_parameters(void *vw, /* I - weave parameters */ + int row, /* I - row number */ + int subpass, /* I - subpass */ + int *pass, /* O - pass containing row */ + int *jetnum, /* O - jet number of row */ + int *startingrow, /* O - phys start of pass */ + int *ophantomrows, /* O - missing rows at start */ + int *ojetsused) /* O - jets used by pass */ +{ + cooked_t *w = (cooked_t *) vw; + int raw_pass, jet, startrow, phantomrows, jetsused; + int stagger = 0; + int extra; + + assert(row >= w->first_row_printed, w->rw.v); + assert(row <= w->last_row_printed, w->rw.v); + calculate_raw_row_parameters(&w->rw, + row + w->rw.separation * w->rw.jets, + subpass, &raw_pass, &jet, &startrow); + startrow -= w->rw.separation * w->rw.jets; + jetsused = w->rw.jets; + phantomrows = 0; + + if (raw_pass < w->first_normal_pass) { + assert(raw_pass >= w->first_premapped_pass, w->rw.v); + *pass = w->pass_premap[raw_pass - w->first_premapped_pass]; + stagger = w->stagger_premap[raw_pass - w->first_premapped_pass]; + } else if (raw_pass >= w->first_postmapped_pass) { + assert(raw_pass >= w->first_postmapped_pass, w->rw.v); + *pass = w->pass_postmap[raw_pass - w->first_postmapped_pass]; + stagger = w->stagger_postmap[raw_pass + - w->first_postmapped_pass]; + } else { + *pass = raw_pass - w->first_premapped_pass; + } + + startrow += stagger * w->rw.separation; + *jetnum = jet - stagger; + if (stagger < 0) { + stagger = -stagger; + phantomrows += stagger; + } + jetsused -= stagger; + + extra = w->first_row_printed + - (startrow + w->rw.separation * phantomrows); + if (extra > 0) { + extra = (extra + w->rw.separation - 1) / w->rw.separation; + jetsused -= extra; + phantomrows += extra; + } + + extra = startrow + w->rw.separation * (phantomrows + jetsused - 1) + - w->last_row_printed; + if (extra > 0) { + extra = (extra + w->rw.separation - 1) / w->rw.separation; + jetsused -= extra; + } + + *startingrow = startrow; + *ophantomrows = phantomrows; + *ojetsused = jetsused; +} + +void +stp_fold(const unsigned char *line, + int single_length, + unsigned char *outbuf) +{ + int i; + memset(outbuf, 0, single_length * 2); + for (i = 0; i < single_length; i++) + { + unsigned char l0 = line[0]; + unsigned char l1 = line[single_length]; + if (l0 || l1) + { + outbuf[0] = + ((l0 & (1 << 7)) >> 1) + + ((l0 & (1 << 6)) >> 2) + + ((l0 & (1 << 5)) >> 3) + + ((l0 & (1 << 4)) >> 4) + + ((l1 & (1 << 7)) >> 0) + + ((l1 & (1 << 6)) >> 1) + + ((l1 & (1 << 5)) >> 2) + + ((l1 & (1 << 4)) >> 3); + outbuf[1] = + ((l0 & (1 << 3)) << 3) + + ((l0 & (1 << 2)) << 2) + + ((l0 & (1 << 1)) << 1) + + ((l0 & (1 << 0)) << 0) + + ((l1 & (1 << 3)) << 4) + + ((l1 & (1 << 2)) << 3) + + ((l1 & (1 << 1)) << 2) + + ((l1 & (1 << 0)) << 1); + } + line++; + outbuf += 2; + } +} + +static void +stp_split_2_1(int length, + const unsigned char *in, + unsigned char *outhi, + unsigned char *outlo) +{ + unsigned char *outs[2]; + int i; + int row = 0; + int limit = length; + outs[0] = outhi; + outs[1] = outlo; + memset(outs[1], 0, limit); + for (i = 0; i < limit; i++) + { + unsigned char inbyte = in[i]; + outs[0][i] = 0; + if (inbyte == 0) + continue; + /* For some reason gcc isn't unrolling this, even with -funroll-loops */ + if (inbyte & 1) + { + outs[row][i] |= 1 & inbyte; + row = row ^ 1; + } + if (inbyte & (1 << 1)) + { + outs[row][i] |= (1 << 1) & inbyte; + row = row ^ 1; + } + if (inbyte & (1 << 2)) + { + outs[row][i] |= (1 << 2) & inbyte; + row = row ^ 1; + } + if (inbyte & (1 << 3)) + { + outs[row][i] |= (1 << 3) & inbyte; + row = row ^ 1; + } + if (inbyte & (1 << 4)) + { + outs[row][i] |= (1 << 4) & inbyte; + row = row ^ 1; + } + if (inbyte & (1 << 5)) + { + outs[row][i] |= (1 << 5) & inbyte; + row = row ^ 1; + } + if (inbyte & (1 << 6)) + { + outs[row][i] |= (1 << 6) & inbyte; + row = row ^ 1; + } + if (inbyte & (1 << 7)) + { + outs[row][i] |= (1 << 7) & inbyte; + row = row ^ 1; + } + } +} + +static void +stp_split_2_2(int length, + const unsigned char *in, + unsigned char *outhi, + unsigned char *outlo) +{ + unsigned char *outs[2]; + int i; + unsigned row = 0; + int limit = length * 2; + outs[0] = outhi; + outs[1] = outlo; + memset(outs[1], 0, limit); + for (i = 0; i < limit; i++) + { + unsigned char inbyte = in[i]; + outs[0][i] = 0; + if (inbyte == 0) + continue; + /* For some reason gcc isn't unrolling this, even with -funroll-loops */ + if (inbyte & 3) + { + outs[row][i] |= (3 & inbyte); + row = row ^ 1; + } + if (inbyte & (3 << 2)) + { + outs[row][i] |= ((3 << 2) & inbyte); + row = row ^ 1; + } + if (inbyte & (3 << 4)) + { + outs[row][i] |= ((3 << 4) & inbyte); + row = row ^ 1; + } + if (inbyte & (3 << 6)) + { + outs[row][i] |= ((3 << 6) & inbyte); + row = row ^ 1; + } + } +} + +void +stp_split_2(int length, + int bits, + const unsigned char *in, + unsigned char *outhi, + unsigned char *outlo) +{ + if (bits == 2) + stp_split_2_2(length, in, outhi, outlo); + else + stp_split_2_1(length, in, outhi, outlo); +} + +static void +stp_split_4_1(int length, + const unsigned char *in, + unsigned char *out0, + unsigned char *out1, + unsigned char *out2, + unsigned char *out3) +{ + unsigned char *outs[4]; + int i; + int row = 0; + int limit = length; + outs[0] = out0; + outs[1] = out1; + outs[2] = out2; + outs[3] = out3; + memset(outs[1], 0, limit); + memset(outs[2], 0, limit); + memset(outs[3], 0, limit); + for (i = 0; i < limit; i++) + { + unsigned char inbyte = in[i]; + outs[0][i] = 0; + if (inbyte == 0) + continue; + /* For some reason gcc isn't unrolling this, even with -funroll-loops */ + if (inbyte & 1) + { + outs[row][i] |= 1 & inbyte; + row = (row + 1) & 3; + } + if (inbyte & (1 << 1)) + { + outs[row][i] |= (1 << 1) & inbyte; + row = (row + 1) & 3; + } + if (inbyte & (1 << 2)) + { + outs[row][i] |= (1 << 2) & inbyte; + row = (row + 1) & 3; + } + if (inbyte & (1 << 3)) + { + outs[row][i] |= (1 << 3) & inbyte; + row = (row + 1) & 3; + } + if (inbyte & (1 << 4)) + { + outs[row][i] |= (1 << 4) & inbyte; + row = (row + 1) & 3; + } + if (inbyte & (1 << 5)) + { + outs[row][i] |= (1 << 5) & inbyte; + row = (row + 1) & 3; + } + if (inbyte & (1 << 6)) + { + outs[row][i] |= (1 << 6) & inbyte; + row = (row + 1) & 3; + } + if (inbyte & (1 << 7)) + { + outs[row][i] |= (1 << 7) & inbyte; + row = (row + 1) & 3; + } + } +} + +static void +stp_split_4_2(int length, + const unsigned char *in, + unsigned char *out0, + unsigned char *out1, + unsigned char *out2, + unsigned char *out3) +{ + unsigned char *outs[4]; + int i; + int row = 0; + int limit = length * 2; + outs[0] = out0; + outs[1] = out1; + outs[2] = out2; + outs[3] = out3; + memset(outs[1], 0, limit); + memset(outs[2], 0, limit); + memset(outs[3], 0, limit); + for (i = 0; i < limit; i++) + { + unsigned char inbyte = in[i]; + outs[0][i] = 0; + if (inbyte == 0) + continue; + /* For some reason gcc isn't unrolling this, even with -funroll-loops */ + if (inbyte & 3) + { + outs[row][i] |= 3 & inbyte; + row = (row + 1) & 3; + } + if (inbyte & (3 << 2)) + { + outs[row][i] |= (3 << 2) & inbyte; + row = (row + 1) & 3; + } + if (inbyte & (3 << 4)) + { + outs[row][i] |= (3 << 4) & inbyte; + row = (row + 1) & 3; + } + if (inbyte & (3 << 6)) + { + outs[row][i] |= (3 << 6) & inbyte; + row = (row + 1) & 3; + } + } +} + +void +stp_split_4(int length, + int bits, + const unsigned char *in, + unsigned char *out0, + unsigned char *out1, + unsigned char *out2, + unsigned char *out3) +{ + if (bits == 2) + stp_split_4_2(length, in, out0, out1, out2, out3); + else + stp_split_4_1(length, in, out0, out1, out2, out3); +} + + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define SH20 0 +#define SH21 8 +#else +#define SH20 8 +#define SH21 0 +#endif + +static void +stp_unpack_2_1(int length, + const unsigned char *in, + unsigned char *out0, + unsigned char *out1) +{ + unsigned char ti0, ti1; + unsigned char to0, to1; + + if (length <= 0) + return; + + length = (length + 1) / 2; + + for (;length; length --) + { + ti0 = *in++; + ti1 = *in++; + + to0 = (ti0 & 0x80) << 0; + to1 = (ti0 & 0x40) << 1; + to0 |= (ti0 & 0x20) << 1; + to1 |= (ti0 & 0x10) << 2; + to0 |= (ti0 & 0x08) << 2; + to1 |= (ti0 & 0x04) << 3; + to0 |= (ti0 & 0x02) << 3; + to1 |= (ti0 & 0x01) << 4; + to0 |= (ti1 & 0x80) >> 4; + to1 |= (ti1 & 0x40) >> 3; + to0 |= (ti1 & 0x20) >> 3; + to1 |= (ti1 & 0x10) >> 2; + to0 |= (ti1 & 0x08) >> 2; + to1 |= (ti1 & 0x04) >> 1; + to0 |= (ti1 & 0x02) >> 1; + to1 |= (ti1 & 0x01) >> 0; + *out0++ = to0; + *out1++ = to1; + } +} + +static void +stp_unpack_2_2(int length, + const unsigned char *in, + unsigned char *out0, + unsigned char *out1) +{ + if (length <= 0) + return; + + for (;length;length --) + { + unsigned char ti0, ti1; + ti0 = in[0]; + ti1 = in[1]; + + *out0++ = (ti0 & 0xc0) << 0 + | (ti0 & 0x0c) << 2 + | (ti1 & 0xc0) >> 4 + | (ti1 & 0x0c) >> 2; + *out1++ = (ti0 & 0x30) << 2 + | (ti0 & 0x03) << 4 + | (ti1 & 0x30) >> 2 + | (ti1 & 0x03) >> 0; + in += 2; + } +} + +void +stp_unpack_2(int length, + int bits, + const unsigned char *in, + unsigned char *outlo, + unsigned char *outhi) +{ + if (bits == 1) + stp_unpack_2_1(length, in, outlo, outhi); + else + stp_unpack_2_2(length, in, outlo, outhi); +} + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define SH40 0 +#define SH41 8 +#define SH42 16 +#define SH43 24 +#else +#define SH40 24 +#define SH41 16 +#define SH42 8 +#define SH43 0 +#endif + +static void +stp_unpack_4_1(int length, + const unsigned char *in, + unsigned char *out0, + unsigned char *out1, + unsigned char *out2, + unsigned char *out3) +{ + unsigned char ti0, ti1, ti2, ti3; + unsigned char to0, to1, to2, to3; + + if (length <= 0) + return; + + length = (length + 3) / 4; + + for (;length; length --) + { + ti0 = *in++; + ti1 = *in++; + ti2 = *in++; + ti3 = *in++; + + to0 = (ti0 & 0x80) << 0; + to1 = (ti0 & 0x40) << 1; + to2 = (ti0 & 0x20) << 2; + to3 = (ti0 & 0x10) << 3; + to0 |= (ti0 & 0x08) << 3; + to1 |= (ti0 & 0x04) << 4; + to2 |= (ti0 & 0x02) << 5; + to3 |= (ti0 & 0x01) << 6; + + to0 |= (ti1 & 0x80) >> 2; + to1 |= (ti1 & 0x40) >> 1; + to2 |= (ti1 & 0x20) >> 0; + to3 |= (ti1 & 0x10) << 1; + to0 |= (ti1 & 0x08) << 1; + to1 |= (ti1 & 0x04) << 2; + to2 |= (ti1 & 0x02) << 3; + to3 |= (ti1 & 0x01) << 4; + + to0 |= (ti2 & 0x80) >> 4; + to1 |= (ti2 & 0x40) >> 3; + to2 |= (ti2 & 0x20) >> 2; + to3 |= (ti2 & 0x10) >> 1; + to0 |= (ti2 & 0x08) >> 1; + to1 |= (ti2 & 0x04) >> 0; + to2 |= (ti2 & 0x02) << 1; + to3 |= (ti2 & 0x01) << 2; + + to0 |= (ti3 & 0x80) >> 6; + to1 |= (ti3 & 0x40) >> 5; + to2 |= (ti3 & 0x20) >> 4; + to3 |= (ti3 & 0x10) >> 3; + to0 |= (ti3 & 0x08) >> 3; + to1 |= (ti3 & 0x04) >> 2; + to2 |= (ti3 & 0x02) >> 1; + to3 |= (ti3 & 0x01) >> 0; + + *out0++ = to0; + *out1++ = to1; + *out2++ = to2; + *out3++ = to3; + } +} + +static void +stp_unpack_4_2(int length, + const unsigned char *in, + unsigned char *out0, + unsigned char *out1, + unsigned char *out2, + unsigned char *out3) +{ + unsigned char tempin, + shift, + temp0, + temp1, + temp2, + temp3; + + length *= 2; + + for (shift = 0, temp0 = 0, temp1 = 0, temp2 = 0, temp3 = 0; + length > 0; + length --) + { + /* + * Note - we can't use (tempin & N) >> (shift - M) since negative + * right-shifts are not always implemented. + */ + + tempin = *in++; + + if (tempin & 192) + temp0 |= (tempin & 192) >> shift; + if (tempin & 48) + temp1 |= ((tempin & 48) << 2) >> shift; + if (tempin & 12) + temp2 |= ((tempin & 12) << 4) >> shift; + if (tempin & 3) + temp3 |= ((tempin & 3) << 6) >> shift; + + if (shift < 6) + shift += 2; + else + { + shift = 0; + *out0++ = temp0; + *out1++ = temp1; + *out2++ = temp2; + *out3++ = temp3; + + temp0 = 0; + temp1 = 0; + temp2 = 0; + temp3 = 0; + } + } + + if (shift) + { + *out0++ = temp0; + *out1++ = temp1; + *out2++ = temp2; + *out3++ = temp3; + } +} + +void +stp_unpack_4(int length, + int bits, + const unsigned char *in, + unsigned char *out0, + unsigned char *out1, + unsigned char *out2, + unsigned char *out3) +{ + if (bits == 1) + stp_unpack_4_1(length, in, out0, out1, out2, out3); + else + stp_unpack_4_2(length, in, out0, out1, out2, out3); +} + +static void +stp_unpack_8_1(int length, + const unsigned char *in, + unsigned char *out0, + unsigned char *out1, + unsigned char *out2, + unsigned char *out3, + unsigned char *out4, + unsigned char *out5, + unsigned char *out6, + unsigned char *out7) +{ + unsigned char tempin, bit, temp0, temp1, temp2, temp3, temp4, temp5, temp6, + temp7; + + + for (bit = 128, temp0 = 0, temp1 = 0, temp2 = 0, + temp3 = 0, temp4 = 0, temp5 = 0, temp6 = 0, temp7 = 0; + length > 0; + length --) + { + tempin = *in++; + + if (tempin & 128) + temp0 |= bit; + if (tempin & 64) + temp1 |= bit; + if (tempin & 32) + temp2 |= bit; + if (tempin & 16) + temp3 |= bit; + if (tempin & 8) + temp4 |= bit; + if (tempin & 4) + temp5 |= bit; + if (tempin & 2) + temp6 |= bit; + if (tempin & 1) + temp7 |= bit; + + if (bit > 1) + bit >>= 1; + else + { + bit = 128; + *out0++ = temp0; + *out1++ = temp1; + *out2++ = temp2; + *out3++ = temp3; + *out4++ = temp4; + *out5++ = temp5; + *out6++ = temp6; + *out7++ = temp7; + + temp0 = 0; + temp1 = 0; + temp2 = 0; + temp3 = 0; + temp4 = 0; + temp5 = 0; + temp6 = 0; + temp7 = 0; + } + } + + if (bit < 128) + { + *out0++ = temp0; + *out1++ = temp1; + *out2++ = temp2; + *out3++ = temp3; + *out4++ = temp4; + *out5++ = temp5; + *out6++ = temp6; + *out7++ = temp7; + } +} + +static void +stp_unpack_8_2(int length, + const unsigned char *in, + unsigned char *out0, + unsigned char *out1, + unsigned char *out2, + unsigned char *out3, + unsigned char *out4, + unsigned char *out5, + unsigned char *out6, + unsigned char *out7) +{ + unsigned char tempin, + shift, + temp0, + temp1, + temp2, + temp3, + temp4, + temp5, + temp6, + temp7; + + + for (shift = 0, temp0 = 0, temp1 = 0, + temp2 = 0, temp3 = 0, temp4 = 0, temp5 = 0, temp6 = 0, temp7 = 0; + length > 0; + length --) + { + /* + * Note - we can't use (tempin & N) >> (shift - M) since negative + * right-shifts are not always implemented. + */ + + tempin = *in++; + + if (tempin & 192) + temp0 |= (tempin & 192) >> shift; + if (tempin & 48) + temp1 |= ((tempin & 48) << 2) >> shift; + if (tempin & 12) + temp2 |= ((tempin & 12) << 4) >> shift; + if (tempin & 3) + temp3 |= ((tempin & 3) << 6) >> shift; + + tempin = *in++; + + if (tempin & 192) + temp4 |= (tempin & 192) >> shift; + if (tempin & 48) + temp5 |= ((tempin & 48) << 2) >> shift; + if (tempin & 12) + temp6 |= ((tempin & 12) << 4) >> shift; + if (tempin & 3) + temp7 |= ((tempin & 3) << 6) >> shift; + + if (shift < 6) + shift += 2; + else + { + shift = 0; + *out0++ = temp0; + *out1++ = temp1; + *out2++ = temp2; + *out3++ = temp3; + *out4++ = temp4; + *out5++ = temp5; + *out6++ = temp6; + *out7++ = temp7; + + temp0 = 0; + temp1 = 0; + temp2 = 0; + temp3 = 0; + temp4 = 0; + temp5 = 0; + temp6 = 0; + temp7 = 0; + } + } + + if (shift) + { + *out0++ = temp0; + *out1++ = temp1; + *out2++ = temp2; + *out3++ = temp3; + *out4++ = temp4; + *out5++ = temp5; + *out6++ = temp6; + *out7++ = temp7; + } +} + +void +stp_unpack_8(int length, + int bits, + const unsigned char *in, + unsigned char *out0, + unsigned char *out1, + unsigned char *out2, + unsigned char *out3, + unsigned char *out4, + unsigned char *out5, + unsigned char *out6, + unsigned char *out7) +{ + if (bits == 1) + stp_unpack_8_1(length, in, out0, out1, out2, out3, + out4, out5, out6, out7); + else + stp_unpack_8_2(length, in, out0, out1, out2, out3, + out4, out5, out6, out7); +} + +int +stp_pack_uncompressed(const unsigned char *line, + int length, + unsigned char *comp_buf, + unsigned char **comp_ptr) +{ + int i; + memcpy(comp_buf, line, length); + *comp_ptr = comp_buf + length; + for (i = 0; i < length; i++) + if (line[i]) + return 1; + return 0; +} + +int +stp_pack_tiff(const unsigned char *line, + int length, + unsigned char *comp_buf, + unsigned char **comp_ptr) +{ + const unsigned char *start; /* Start of compressed data */ + unsigned char repeat; /* Repeating char */ + int count; /* Count of compressed bytes */ + int tcount; /* Temporary count < 128 */ + int active = 0; /* Have we found data? */ + register const unsigned char *xline = line; + register int xlength = length; + + /* + * Compress using TIFF "packbits" run-length encoding... + */ + + (*comp_ptr) = comp_buf; + + while (xlength > 0) + { + /* + * Get a run of non-repeated chars... + */ + + start = xline; + xline += 2; + xlength -= 2; + + while (xlength > 0 && (xline[-2] != xline[-1] || xline[-1] != xline[0])) + { + if (! active && (xline[-2] || xline[-1] || xline[0])) + active = 1; + xline ++; + xlength --; + } + + xline -= 2; + xlength += 2; + + /* + * Output the non-repeated sequences (max 128 at a time). + */ + + count = xline - start; + while (count > 0) + { + tcount = count > 128 ? 128 : count; + + (*comp_ptr)[0] = tcount - 1; + memcpy((*comp_ptr) + 1, start, tcount); + + (*comp_ptr) += tcount + 1; + start += tcount; + count -= tcount; + } + + if (xlength <= 0) + break; + + /* + * Find the repeated sequences... + */ + + start = xline; + repeat = xline[0]; + if (repeat) + active = 1; + + xline ++; + xlength --; + + if (xlength > 0) + { + int ylength = xlength; + while (ylength && *xline == repeat) + { + xline ++; + ylength --; + } + xlength = ylength; + } + + /* + * Output the repeated sequences (max 128 at a time). + */ + + count = xline - start; + while (count > 0) + { + tcount = count > 128 ? 128 : count; + + (*comp_ptr)[0] = 1 - tcount; + (*comp_ptr)[1] = repeat; + + (*comp_ptr) += 2; + count -= tcount; + } + } + return active; +} + +/* + * "Soft" weave + * + * The Epson Stylus Color/Photo printers don't have memory to print + * using all of the nozzles in the print head. For example, the Stylus Photo + * 700/EX has 32 nozzles. At 720 dpi, with an 8" wide image, a single line + * requires (8 * 720 * 6 / 8) bytes, or 4320 bytes (because the Stylus Photo + * printers have 6 ink colors). To use 32 nozzles would require 138240 bytes. + * It's actually worse than that, though, because the nozzles are spaced 8 + * rows apart. Therefore, in order to store enough data to permit sending the + * page as a simple raster, the printer would require enough memory to store + * 256 rows, or 1105920 bytes. Considering that the Photo EX can print + * 11" wide, we're looking at more like 1.5 MB. In fact, these printers are + * capable of 1440 dpi horizontal resolution. This would require 3 MB. The + * printers actually have 64K-256K. + * + * With the newer (740/750 and later) printers it's even worse, since these + * printers support multiple dot sizes. But that's neither here nor there. + * + * Older Epson printers had a mode called MicroWeave (tm). In this mode, the + * host fed the printer individual rows of dots, and the printer bundled them + * up and sent them to the print head in the correct order to achieve high + * quality. This MicroWeave mode still works in new printers, but the + * implementation is very minimal: the printer uses exactly one nozzle of + * each color (the first one). This makes printing extremely slow (more than + * 30 minutes for one 8.5x11" page), although the quality is extremely high + * with no visible banding whatsoever. It's not good for the print head, + * though, since no ink is flowing through the other nozzles. This leads to + * drying of ink and possible permanent damage to the print head. + * + * By the way, although the Epson manual says that microweave mode should be + * used at 720 dpi, 360 dpi continues to work in much the same way. At 360 + * dpi, data is fed to the printer one row at a time on all Epson printers. + * The pattern that the printer uses to print is very prone to banding. + * However, 360 dpi is inherently a low quality mode; if you're using it, + * presumably you don't much care about quality. + * + * Printers from roughly the Stylus Color 600 and later do not have the + * capability to do MicroWeave correctly. Instead, the host must arrange + * the output in the order that it will be sent to the print head. This + * is a very complex process; the jets in the print head are spaced more + * than one row (1/720") apart, so we can't simply send consecutive rows + * of dots to the printer. Instead, we have to pass e. g. the first, ninth, + * 17th, 25th... rows in order for them to print in the correct position on + * the paper. This interleaving process is called "soft" weaving. + * + * This decision was probably made to save money on memory in the printer. + * It certainly makes the driver code far more complicated than it would + * be if the printer could arrange the output. Is that a bad thing? + * Usually this takes far less CPU time than the dithering process, and it + * does allow us more control over the printing process, e. g. to reduce + * banding. Conceivably, we could even use this ability to map out bad + * jets. + * + * Interestingly, apparently the Windows (and presumably Macintosh) drivers + * for most or all Epson printers still list a "microweave" mode. + * Experiments have demonstrated that this does not in fact use the + * "microweave" mode of the printer. Possibly it does nothing, or it uses + * a different weave pattern from what the non-"microweave" mode does. + * This is unnecessarily confusing. + * + * What makes this interesting is that there are many different ways of + * of accomplishing this goal. The naive way would be to divide the image + * up into groups of 256 rows, and print all the mod8=0 rows in the first pass, + * mod8=1 rows in the second, and so forth. The problem with this approach + * is that the individual ink jets are not perfectly uniform; some emit + * slightly bigger or smaller drops than others. Since each group of 8 + * adjacent rows is printed with the same nozzle, that means that there will + * be distinct streaks of lighter and darker bands within the image (8 rows + * is 1/90", which is visible; 1/720" is not). Possibly worse is that these + * patterns will repeat every 256 rows. This creates banding patterns that + * are about 1/3" wide. + * + * So we have to do something to break up this patterning. + * + * Epson does not publish the weaving algorithms that they use in their + * bundled drivers. Indeed, their developer web site + * (http://www.ercipd.com/isv/edr_docs.htm) does not even describe how to + * do this weaving at all; it says that the only way to achieve 720 dpi + * is to use MicroWeave. It does note (correctly) that 1440 dpi horizontal + * can only be achieved by the driver (i. e. in software). The manual + * actually makes it fairly clear how to do this (it requires two passes + * with horizontal head movement between passes), and it is presumably + * possible to do this with MicroWeave. + * + * The information about how to do this is apparently available under NDA. + * It's actually easy enough to reverse engineer what's inside a print file + * with a simple Perl script. There are presumably other printer commands + * that are not documented and may not be as easy to reverse engineer. + * + * I considered a few algorithms to perform the weave. The first one I + * devised let me use only (jets - distance_between_jets + 1) nozzles, or + * 25. This is OK in principle, but it's slower than using all nozzles. + * By playing around with it some more, I came up with an algorithm that + * lets me use all of the nozzles, except near the top and bottom of the + * page. + * + * This still produces some banding, though. Even better quality can be + * achieved by using multiple nozzles on the same line. How do we do this? + * In 1440x720 mode, we're printing two output lines at the same vertical + * position. However, if we want four passes, we have to effectively print + * each line twice. Actually doing this would increase the density, so + * what we do is print half the dots on each pass. This produces near-perfect + * output, and it's far faster than using (pseudo) "MicroWeave". + * + * The current algorithm is not completely general. The number of passes + * is limited to (nozzles / gap). On the Photo EX class printers, that limits + * it to 4 -- 32 nozzles, an inter-nozzle gap of 8 lines. Furthermore, there + * are a number of routines that are only coded up to 8 passes. Fortunately, + * this is enough passes to get rid of most banding. What's left is a very + * fine pattern that is sometimes described as "corduroy", since the pattern + * looks like that kind of fabric. + * + * Newer printers (those that support variable dot sizes, such as the 740, + * 1200, etc.) have an additional complication: when used in softweave mode, + * they operate at 360 dpi horizontal resolution. This requires FOUR passes + * to achieve 1440x720 dpi. Thus, to enable us to break up each row + * into separate sub-rows, we have to actually print each row eight times. + * Fortunately, all such printers have 48 nozzles and a gap of 6 rows, + * except for the high-speed 900, which uses 96 nozzles and a gap of 2 rows. + * + * I cannot let this entirely pass without commenting on the Stylus Color 440. + * This is a very low-end printer with 21 (!) nozzles and a separation of 8. + * The weave routine works correctly with single-pass printing, which is enough + * to minimally achieve 720 dpi output (it's physically a 720 dpi printer). + * However, the routine does not work correctly at more than one pass per row. + * Therefore, this printer bands badly. + * + * Yet another complication is how to get near the top and bottom of the page. + * This algorithm lets us print to within one head width of the top of the + * page, and a bit more than one head width from the bottom. That leaves a + * lot of blank space. Doing the weave properly outside of this region is + * increasingly difficult as we get closer to the edge of the paper; in the + * interior region, any nozzle can print any line, but near the top and + * bottom edges, only some nozzles can print. We've handled this for now by + * using the naive way mentioned above near the borders, and switching over + * to the high quality method in the interior. Unfortunately, this means + * that the quality is quite visibly degraded near the top and bottom of the + * page. Algorithms that degrade more gracefully are more complicated. + * Epson does not advertise that the printers can print at the very top of the + * page, although in practice most or all of them can. I suspect that the + * quality that can be achieved very close to the top is poor enough that + * Epson does not want to allow printing there. That is a valid decision, + * although we have taken another approach. + * + * To compute the weave information, we need to start with the following + * information: + * + * 1) The number of jets the print head has for each color; + * + * 2) The separation in rows between the jets; + * + * 3) The horizontal resolution of the printer; + * + * 4) The desired horizontal resolution of the output; + * + * 5) The desired extra passes to reduce banding. + * + * As discussed above, each row is actually printed in one or more passes + * of the print head; we refer to these as subpasses. For example, if we're + * printing at 1440(h)x720(v) on a printer with true horizontal resolution of + * 360 dpi, and we wish to print each line twice with different nozzles + * to reduce banding, we need to use 8 subpasses. The dither routine + * will feed us a complete row of bits for each color; we have to split that + * up, first by round robining the bits to ensure that they get printed at + * the right micro-position, and then to split up the bits that are actually + * turned on into two equal chunks to reduce banding. + * + * Given the above information, and the desired row index and subpass (which + * together form a line number), we can compute: + * + * 1) Which pass this line belongs to. Passes are numbered consecutively, + * and each pass must logically (see #3 below) start at no smaller a row + * number than the previous pass, as the printer cannot advance by a + * negative amount. + * + * 2) Which jet will print this line. + * + * 3) The "logical" first line of this pass. That is, what line would be + * printed by jet 0 in this pass. This number may be less than zero. + * If it is, there are ghost lines that don't actually contain any data. + * The difference between the logical first line of this pass and the + * logical first line of the preceding pass tells us how many lines must + * be advanced. + * + * 4) The "physical" first line of this pass. That is, the first line index + * that is actually printed in this pass. This information lets us know + * when we must prepare this pass. + * + * 5) The last line of this pass. This lets us know when we must actually + * send this pass to the printer. + * + * 6) The number of ghost rows this pass contains. We must still send the + * ghost data to the printer, so this lets us know how much data we must + * fill in prior to the start of the pass. + * + * The bookkeeping to keep track of all this stuff is quite hairy, and needs + * to be documented separately. + * + * The routine initialize_weave calculates the basic parameters, given + * the number of jets and separation between jets, in rows. + * + * -- Robert Krawitz = 0 + * + * 3) line_height < physlines + * + * 4) phys_lines >= 2 * jets * sep + */ +void * +stp_initialize_weave(int jets, /* Width of print head */ + int sep, /* Separation in rows between jets */ + int osample, /* Horizontal oversample */ + int v_subpasses, /* Vertical passes */ + int v_subsample, /* Vertical oversampling */ + int ncolors, + int width, /* bits/pixel */ + int linewidth, /* Width of a line, in pixels */ + int lineheight, /* Number of lines that will be printed */ + int separation_rows, /* Vertical spacing adjustment */ + /* for weird printers (1520/3000, */ + /* although they don't seem to do softweave */ + /* anyway) */ + int first_line, /* First line that will be printed on page */ + int phys_lines, /* Total height of the page in rows */ + int weave_strategy, /* Which weaving pattern to use */ + int *head_offset, + stp_vars_t v, + void (*flushfunc)(stp_softweave_t *sw, int passno, + int model, int width, int hoffset, + int ydpi, int xdpi, int physical_xdpi, + int vertical_subpass), + void (*fill_start)(stp_softweave_t *sw, int row, + int subpass, int width, + int missingstartrows, + int vertical_subpass), + int (*pack)(const unsigned char *in, int bytes, + unsigned char *out, unsigned char **optr), + int (*compute_linewidth)(const stp_softweave_t *sw, + int n)) +{ + int i; + int last_line, maxHeadOffset; + stp_softweave_t *sw = stp_malloc(sizeof (stp_softweave_t)); + + (void) memset(sw, 0, sizeof(stp_softweave_t)); + if (jets < 1) + jets = 1; + if (jets == 1 || sep < 1) + sep = 1; + if (v_subpasses < 1) + v_subpasses = 1; + if (v_subsample < 1) + v_subsample = 1; + + sw->v = v; + sw->separation = sep; + sw->jets = jets; + sw->horizontal_weave = osample; + sw->oversample = osample * v_subpasses * v_subsample; + if (sw->oversample > jets) + { + for (i = 2; i <= osample; i++) + { + if ((osample % i == 0) && (sw->oversample / i <= jets)) + { + sw->repeat_count = i; + osample /= i; + goto found; + } + } + stp_eprintf(v, "Weave error: oversample (%d) > jets (%d)\n", + sw->oversample, jets); + stp_free(sw); + return 0; + } + else + sw->repeat_count = 1; + found: + + sw->vertical_oversample = v_subsample; + sw->vertical_subpasses = v_subpasses; + sw->oversample = osample * v_subpasses * v_subsample; + sw->firstline = first_line; + sw->lineno = first_line; + sw->flushfunc = flushfunc; + + if (sw->oversample > jets) + { + stp_eprintf(v, "Weave error: oversample (%d) > jets (%d)\n", + sw->oversample, jets); + stp_free(sw); + return 0; + } + + /* + * setup printhead offsets. + * for monochrome (bw) printing, the offsets are 0. + */ + if(ncolors > 1) + for(i=0; ihead_offset[i] = head_offset[i]; + else + for(i=0; ihead_offset[i] = 0; + + maxHeadOffset = 0; + for(i=0; ihead_offset[i] > maxHeadOffset) + maxHeadOffset = sw->head_offset[i]; + + sw->virtual_jets = sw->jets; + if (maxHeadOffset > 0) + sw->virtual_jets += (maxHeadOffset + sw->separation - 1) / sw->separation; + last_line = first_line + lineheight - 1 + maxHeadOffset; + + sw->weaveparm = initialize_weave_params(sw->separation, sw->jets, + sw->oversample, first_line, last_line, + phys_lines, weave_strategy, v); + /* + * The value of vmod limits how many passes may be unfinished at a time. + * If pass x is not yet printed, pass x+vmod cannot be started. + * + * The multiplier of 2: 1 for the normal passes, 1 for the special passes + * at the start or end. + */ + sw->vmod = 2 * sw->separation * sw->oversample * sw->repeat_count; + if (sw->virtual_jets > sw->jets) + sw->vmod *= (sw->virtual_jets + sw->jets - 1) / sw->jets; + sw->separation_rows = separation_rows; + + sw->bitwidth = width; + sw->last_pass_offset = 0; + sw->last_pass = -1; + sw->current_vertical_subpass = 0; + sw->last_color = -1; + sw->ncolors = ncolors; + + /* + * It's possible for the "compression" to actually expand the line by + * one part in 128. + */ + + sw->linewidth = linewidth; + sw->vertical_height = lineheight; + sw->lineoffsets = stp_malloc(sw->vmod * sizeof(stp_lineoff_t)); + memset(sw->lineoffsets, 0, sw->vmod * sizeof(stp_lineoff_t)); + sw->lineactive = stp_malloc(sw->vmod * sizeof(stp_lineactive_t)); + memset(sw->lineactive, 0, sw->vmod * sizeof(stp_lineactive_t)); + sw->linebases = stp_malloc(sw->vmod * sizeof(stp_linebufs_t)); + sw->passes = stp_malloc(sw->vmod * sizeof(stp_pass_t)); + memset(sw->passes, 0, sw->vmod * sizeof(stp_pass_t)); + sw->linecounts = stp_malloc(sw->vmod * sizeof(stp_linecount_t)); + memset(sw->linecounts, 0, sw->vmod * sizeof(stp_linecount_t)); + sw->rcache = -2; + sw->vcache = -2; + sw->fill_start = fill_start; + sw->compute_linewidth = compute_linewidth; + sw->pack = pack; + sw->horizontal_width = + (sw->compute_linewidth)(sw, ((sw->linewidth + sw->horizontal_weave - 1) / + sw->horizontal_weave)); + sw->horizontal_width = ((sw->horizontal_width + 7) / 8); + + for (i = 0; i < sw->vmod; i++) + { + int j; + sw->passes[i].pass = -1; + for (j = 0; j < sw->ncolors; j++) + { + sw->linebases[i].v[j] = NULL; + } + } + return (void *) sw; +} + +void +stp_destroy_weave(void *vsw) +{ + int i, j; + stp_softweave_t *sw = (stp_softweave_t *) vsw; + stp_free(sw->linecounts); + stp_free(sw->passes); + stp_free(sw->lineactive); + stp_free(sw->lineoffsets); + if (sw->fold_buf) + stp_free(sw->fold_buf); + if (sw->comp_buf) + stp_free(sw->comp_buf); + for (i = 0; i < 8; i++) + if (sw->s[i]) + stp_free(sw->s[i]); + for (i = 0; i < sw->vmod; i++) + { + for (j = 0; j < sw->ncolors; j++) + { + if (sw->linebases[i].v[j]) + stp_free(sw->linebases[i].v[j]); + } + } + stp_free(sw->linebases); + stp_destroy_weave_params(sw->weaveparm); + stp_free(vsw); +} + +static void +weave_parameters_by_row(const stp_softweave_t *sw, int row, + int vertical_subpass, stp_weave_t *w) +{ + int jetsused; + int sub_repeat_count = vertical_subpass % sw->repeat_count; + /* + * Conceptually, this does not modify the softweave state. We cache + * the results, but this cache is considered hidden. + */ + stp_softweave_t *wsw = (stp_softweave_t *)sw; + vertical_subpass /= sw->repeat_count; + + if (sw->rcache == row && sw->vcache == vertical_subpass) + { + memcpy(w, &sw->wcache, sizeof(stp_weave_t)); + w->pass = (w->pass * sw->repeat_count) + sub_repeat_count; + return; + } + wsw->rcache = row; + wsw->vcache = vertical_subpass; + + w->row = row; + stp_calculate_row_parameters(sw->weaveparm, row, vertical_subpass, + &w->pass, &w->jet, &w->logicalpassstart, + &w->missingstartrows, &jetsused); + + w->physpassstart = w->logicalpassstart + sw->separation * w->missingstartrows; + w->physpassend = w->physpassstart + sw->separation * (jetsused - 1); + + memcpy(&(wsw->wcache), w, sizeof(stp_weave_t)); + w->pass = (w->pass * sw->repeat_count) + sub_repeat_count; + stp_dprintf(STP_DBG_WEAVE_PARAMS, sw->v, "row %d, jet %d of pass %d " + "(pos %d, start %d, end %d, missing rows %d)\n", + w->row, w->jet, w->pass, w->logicalpassstart, w->physpassstart, + w->physpassend, w->missingstartrows); +} + +void +stp_weave_parameters_by_row(const stp_softweave_t *sw, int row, + int vertical_subpass, stp_weave_t *w) +{ + weave_parameters_by_row(sw, row, vertical_subpass, w); +} + + +static stp_lineoff_t * +stp_get_lineoffsets(const stp_softweave_t *sw, int row, int subpass, int offset) +{ + stp_weave_t w; + weave_parameters_by_row(sw, row + offset, subpass, &w); + return &(sw->lineoffsets[w.pass % sw->vmod]); +} + +static stp_lineactive_t * +stp_get_lineactive(const stp_softweave_t *sw, int row, int subpass, int offset) +{ + stp_weave_t w; + weave_parameters_by_row(sw, row + offset, subpass, &w); + return &(sw->lineactive[w.pass % sw->vmod]); +} + +static stp_linecount_t * +stp_get_linecount(const stp_softweave_t *sw, int row, int subpass, int offset) +{ + stp_weave_t w; + weave_parameters_by_row(sw, row + offset, subpass, &w); + return &(sw->linecounts[w.pass % sw->vmod]); +} + +static const stp_linebufs_t * +stp_get_linebases(const stp_softweave_t *sw, int row, int subpass, int offset) +{ + stp_weave_t w; + weave_parameters_by_row(sw, row + offset, subpass, &w); + return &(sw->linebases[w.pass % sw->vmod]); +} + +static stp_pass_t * +stp_get_pass_by_row(const stp_softweave_t *sw, int row, int subpass,int offset) +{ + stp_weave_t w; + weave_parameters_by_row(sw, row + offset, subpass, &w); + return &(sw->passes[w.pass % sw->vmod]); +} + +stp_lineoff_t * +stp_get_lineoffsets_by_pass(const stp_softweave_t *sw, int pass) +{ + return &(sw->lineoffsets[pass % sw->vmod]); +} + +stp_lineactive_t * +stp_get_lineactive_by_pass(const stp_softweave_t *sw, int pass) +{ + return &(sw->lineactive[pass % sw->vmod]); +} + +stp_linecount_t * +stp_get_linecount_by_pass(const stp_softweave_t *sw, int pass) +{ + return &(sw->linecounts[pass % sw->vmod]); +} + +const stp_linebufs_t * +stp_get_linebases_by_pass(const stp_softweave_t *sw, int pass) +{ + return &(sw->linebases[pass % sw->vmod]); +} + +stp_pass_t * +stp_get_pass_by_pass(const stp_softweave_t *sw, int pass) +{ + return &(sw->passes[pass % sw->vmod]); +} + +static void +check_linebases(stp_softweave_t *sw, int row, int cpass, int head_offset, + int color) +{ + stp_linebufs_t *bufs = + (stp_linebufs_t *)stp_get_linebases(sw, row, cpass, head_offset); + if (!(bufs[0].v[color])) + bufs[0].v[color] = + stp_malloc(sw->virtual_jets * sw->bitwidth * sw->horizontal_width); +} + +/* + * If there are phantom rows at the beginning of a pass, fill them in so + * that the printer knows exactly what it doesn't have to print. We're + * using RLE compression here. Each line must be specified independently, + * so we have to compute how many full blocks (groups of 128 bytes, or 1024 + * "off" pixels) and how much leftover is needed. Note that we can only + * RLE-encode groups of 2 or more bytes; single bytes must be specified + * with a count of 1. + */ + +void +stp_fill_tiff(stp_softweave_t *sw, int row, int subpass, + int width, int missingstartrows, int color) +{ + stp_lineoff_t *lineoffs; + stp_linecount_t *linecount; + const stp_linebufs_t *bufs; + int i = 0; + int k = 0; + + width = sw->bitwidth * width * 8; + for (k = 0; k < missingstartrows; k++) + { + int bytes_to_fill = width; + int full_blocks = bytes_to_fill / (128 * 8); + int leftover = (7 + (bytes_to_fill % (128 * 8))) / 8; + int l = 0; + bufs = stp_get_linebases(sw, row, subpass, sw->head_offset[color]); + + while (l < full_blocks) + { + (bufs[0].v[color][2 * i]) = 129; + (bufs[0].v[color][2 * i + 1]) = 0; + i++; + l++; + } + if (leftover == 1) + { + (bufs[0].v[color][2 * i]) = 1; + (bufs[0].v[color][2 * i + 1]) = 0; + i++; + } + else if (leftover > 0) + { + (bufs[0].v[color][2 * i]) = 257 - leftover; + (bufs[0].v[color][2 * i + 1]) = 0; + i++; + } + } + + lineoffs = stp_get_lineoffsets(sw, row, subpass, sw->head_offset[color]); + linecount = stp_get_linecount(sw, row, subpass, sw->head_offset[color]); + lineoffs[0].v[color] = 2 * i; + linecount[0].v[color] = missingstartrows; +} + +void +stp_fill_uncompressed(stp_softweave_t *sw, int row, int subpass, + int width, int missingstartrows, int color) +{ + stp_lineoff_t *lineoffs; + stp_linecount_t *linecount; + const stp_linebufs_t *bufs; + + bufs = stp_get_linebases(sw, row, subpass, sw->head_offset[color]); + lineoffs = stp_get_lineoffsets(sw, row, subpass, sw->head_offset[color]); + linecount = stp_get_linecount(sw, row, subpass, sw->head_offset[color]); + width *= sw->bitwidth * missingstartrows; + memset(bufs[0].v[color], 0, width); + lineoffs[0].v[color] = width; + linecount[0].v[color] = missingstartrows; +} + +int +stp_compute_tiff_linewidth(const stp_softweave_t *sw, int n) +{ + return ((n + 128 + 7) * 129 / 128); +} + +int +stp_compute_uncompressed_linewidth(const stp_softweave_t *sw, int n) +{ + return (8 * ((n + 7) / 8)); +} + +static void +initialize_row(stp_softweave_t *sw, int row, int width, + const unsigned char *cols[]) +{ + stp_weave_t w; + int i, j, jj; + stp_pass_t *pass; + + for (i = 0; i < sw->oversample; i++) + { + for (j = 0; j < sw->ncolors; j++) + { + if (cols[j]) + { + stp_lineoff_t *lineoffs = + stp_get_lineoffsets(sw, row, i, sw->head_offset[j]); + stp_lineactive_t *lineactive = + stp_get_lineactive(sw, row, i, sw->head_offset[j]); + stp_linecount_t *linecount = + stp_get_linecount(sw, row, i, sw->head_offset[j]); + check_linebases(sw, row, i, sw->head_offset[j], j); + weave_parameters_by_row(sw, row+sw->head_offset[j], i, &w); + pass = stp_get_pass_by_row(sw, row, i, sw->head_offset[j]); + + /* initialize pass if not initialized yet */ + if (pass->pass < 0) + { + pass->pass = w.pass; + pass->missingstartrows = w.missingstartrows; + pass->logicalpassstart = w.logicalpassstart; + pass->physpassstart = w.physpassstart; + pass->physpassend = w.physpassend; + pass->subpass = i; + + for(jj=0; jjncolors; jj++) + { + if (lineoffs[0].v[jj] != 0) + stp_eprintf(sw->v, + "WARNING: pass %d subpass %d row %d: " + "lineoffs %ld should be zero!\n", + w.pass, i, row, lineoffs[0].v[jj]); + lineoffs[0].v[jj] = 0; + lineactive[0].v[jj] = 0; + if (linecount[0].v[jj] != 0) + stp_eprintf(sw->v, + "WARNING: pass %d subpass %d row %d: " + "linecount %d should be zero!\n", + w.pass, i, row, linecount[0].v[jj]); + linecount[0].v[jj] = 0; + } + } + + if((linecount[0].v[j] == 0) && (w.jet > 0)) + { + (sw->fill_start)(sw, row, i, width, w.jet, j); + } + } + } + } +} + +static void +add_to_row(stp_softweave_t *sw, int row, unsigned char *buf, size_t nbytes, + int color, int setactive, stp_lineoff_t *lineoffs, + stp_lineactive_t *lineactive, stp_linecount_t *linecount, + const stp_linebufs_t *bufs) +{ + size_t place = lineoffs[0].v[color]; + size_t count = linecount[0].v[color]; + if (place + nbytes > sw->virtual_jets * sw->bitwidth * sw->horizontal_width) + { + stp_eprintf(sw->v, "Buffer overflow: limit %d, actual %d, count %d\n", + sw->virtual_jets * sw->bitwidth * sw->horizontal_width, + place + nbytes, count); + exit(1); + } + memcpy(bufs[0].v[color] + lineoffs[0].v[color], buf, nbytes); + lineoffs[0].v[color] += nbytes; + if (setactive) + lineactive[0].v[color] = 1; +} + +static void +stp_flush(void *vsw, int model, int width, int hoffset, + int ydpi, int xdpi, int physical_xdpi) +{ + stp_softweave_t *sw = (stp_softweave_t *) vsw; + while (1) + { + stp_pass_t *pass = stp_get_pass_by_pass(sw, sw->last_pass + 1); + /* + * This ought to be pass->physpassend > sw->lineno + * but that causes rubbish to be output for some reason. + */ + if (pass->pass < 0 || pass->physpassend >= sw->lineno) + return; + (sw->flushfunc)(sw, pass->pass, model, width, hoffset, ydpi, xdpi, + physical_xdpi, pass->subpass); + } +} + +void +stp_flush_all(void *vsw, int model, int width, int hoffset, + int ydpi, int xdpi, int physical_xdpi) +{ + stp_softweave_t *sw = (stp_softweave_t *) vsw; + while (1) + { + stp_pass_t *pass = stp_get_pass_by_pass(sw, sw->last_pass + 1); + /* + * This ought to be pass->physpassend > sw->lineno + * but that causes rubbish to be output for some reason. + */ + if (pass->pass < 0) + return; + (sw->flushfunc)(sw, pass->pass, model, width, hoffset, ydpi, xdpi, + physical_xdpi, pass->subpass); + } +} + +static void +finalize_row(stp_softweave_t *sw, int row, int model, int width, + int hoffset, int ydpi, int xdpi, int physical_xdpi) +{ + int i,j; + stp_dprintf(STP_DBG_ROWS, sw->v, "Finalizing row %d...\n", row); + for (i = 0; i < sw->oversample; i++) + { + stp_weave_t w; + stp_linecount_t *lines; + + for(j=0; jncolors; j++) + { + lines = stp_get_linecount(sw, row, i, sw->head_offset[j]); + lines[0].v[j]++; + } + + weave_parameters_by_row(sw, row, i, &w); + if (w.physpassend == row) + { + stp_dprintf(STP_DBG_ROWS, sw->v, + "Pass=%d, physpassend=%d, row=%d, lineno=%d, flush...\n", + w.pass, w.physpassend, row, sw->lineno); + stp_flush(sw, model, width, hoffset, ydpi, xdpi, physical_xdpi); + } + } +} + +static void * +xzmalloc(size_t bytes) +{ + void *retval = stp_malloc(bytes); + if (retval) + memset(retval, 0, bytes); + return (retval); +} + +void +stp_write_weave(void * vsw, + int length, /* I - Length of bitmap data */ + int ydpi, /* I - Vertical resolution */ + int model, /* I - Printer model */ + int width, /* I - Printed width */ + int offset, /* I - Offset from left side of page */ + int xdpi, + int physical_xdpi, + const unsigned char *cols[]) +{ + stp_softweave_t *sw = (stp_softweave_t *) vsw; + stp_lineoff_t *lineoffs[8]; + stp_lineactive_t *lineactives[8]; + stp_linecount_t *linecounts[8]; + const stp_linebufs_t *bufs[8]; + int xlength = (length + sw->horizontal_weave - 1) / sw->horizontal_weave; + int ylength = xlength * sw->horizontal_weave; + unsigned char *comp_ptr; + int i, j; + int setactive; + int h_passes = sw->horizontal_weave * sw->vertical_subpasses; + int cpass = sw->current_vertical_subpass * h_passes; + + if (!sw->fold_buf) + sw->fold_buf = xzmalloc(sw->bitwidth * ylength); + if (!sw->comp_buf) + sw->comp_buf = xzmalloc(sw->bitwidth *(sw->compute_linewidth)(sw,ylength)); + if (sw->current_vertical_subpass == 0) + initialize_row(sw, sw->lineno, xlength, cols); + + for (j = 0; j < sw->ncolors; j++) + { + if (cols[j]) + { + const unsigned char *in; + + for (i = 0; i < h_passes; i++) + { + if (!sw->s[i]) + sw->s[i] = xzmalloc(sw->bitwidth * + (sw->compute_linewidth)(sw, ylength)); + lineoffs[i] = stp_get_lineoffsets(sw, sw->lineno, cpass + i, + sw->head_offset[j]); + linecounts[i] = stp_get_linecount(sw, sw->lineno, cpass + i, + sw->head_offset[j]); + lineactives[i] = stp_get_lineactive(sw, sw->lineno, cpass + i, + sw->head_offset[j]); + bufs[i] = stp_get_linebases(sw, sw->lineno, cpass + i, + sw->head_offset[j]); + } + + if (sw->bitwidth == 2) + { + stp_fold(cols[j], length, sw->fold_buf); + in = sw->fold_buf; + } + else + in = cols[j]; + if (h_passes > 1) + { + switch (sw->horizontal_weave) + { + case 2: + stp_unpack_2(length, sw->bitwidth, in, sw->s[0], sw->s[1]); + break; + case 4: + stp_unpack_4(length, sw->bitwidth, in, + sw->s[0], sw->s[1], sw->s[2], sw->s[3]); + break; + case 8: + stp_unpack_8(length, sw->bitwidth, in, + sw->s[0], sw->s[1], sw->s[2], sw->s[3], + sw->s[4], sw->s[5], sw->s[6], sw->s[7]); + break; + } + switch (sw->vertical_subpasses) + { + case 4: + switch (sw->horizontal_weave) + { + case 1: + stp_split_4(length, sw->bitwidth, in, + sw->s[0], sw->s[1], sw->s[2], sw->s[3]); + break; + case 2: + stp_split_4(length, sw->bitwidth, sw->s[0], + sw->s[0], sw->s[2], sw->s[4], sw->s[6]); + stp_split_4(length, sw->bitwidth, sw->s[1], + sw->s[1], sw->s[3], sw->s[5], sw->s[7]); + break; + } + break; + case 2: + switch (sw->horizontal_weave) + { + case 1: + stp_split_2(xlength, sw->bitwidth, in, sw->s[0], sw->s[1]); + break; + case 2: + stp_split_2(xlength, sw->bitwidth, sw->s[0], sw->s[0], sw->s[2]); + stp_split_2(xlength, sw->bitwidth, sw->s[1], sw->s[1], sw->s[3]); + break; + case 4: + stp_split_2(xlength, sw->bitwidth, sw->s[0], sw->s[0], sw->s[4]); + stp_split_2(xlength, sw->bitwidth, sw->s[1], sw->s[1], sw->s[5]); + stp_split_2(xlength, sw->bitwidth, sw->s[2], sw->s[2], sw->s[6]); + stp_split_2(xlength, sw->bitwidth, sw->s[3], sw->s[3], sw->s[7]); + break; + } + break; + /* case 1 is taken care of because the various unpack */ + /* functions will do the trick themselves */ + } + for (i = 0; i < h_passes; i++) + { + setactive = (sw->pack)(sw->s[i], sw->bitwidth * xlength, + sw->comp_buf, &comp_ptr); + add_to_row(sw, sw->lineno, sw->comp_buf, + comp_ptr - sw->comp_buf, j, setactive, + lineoffs[i], lineactives[i], linecounts[i], bufs[i]); + } + } + else + { + setactive = (sw->pack)(in, length * sw->bitwidth, + sw->comp_buf, &comp_ptr); + add_to_row(sw, sw->lineno, sw->comp_buf, comp_ptr - sw->comp_buf, + j, setactive, lineoffs[0], lineactives[0], linecounts[0], bufs[0]); + } + } + } + sw->current_vertical_subpass++; + if (sw->current_vertical_subpass >= sw->vertical_oversample) + { + finalize_row(sw, sw->lineno, model, width, offset, ydpi, xdpi, + physical_xdpi); + sw->lineno++; + sw->current_vertical_subpass = 0; + } +} + +#ifdef TEST_COOKED +static void +calculate_pass_parameters(cooked_t *w, /* I - weave parameters */ + int pass, /* I - pass number ( >= 0) */ + int *startrow, /* O - print head position */ + int *subpass, /* O - subpass number */ + int *phantomrows, /* O - missing rows */ + int *jetsused) /* O - jets used to print */ +{ + int raw_pass = pass + w->first_premapped_pass; + int stagger = 0; + int extra; + + if (raw_pass < w->first_normal_pass) { + int i = 0; + while (i + w->first_premapped_pass < w->first_normal_pass) { + if (w->pass_premap[i] == pass) { + raw_pass = i + w->first_premapped_pass; + stagger = w->stagger_premap[i]; + break; + } + i++; + } + } else if (raw_pass >= w->first_postmapped_pass) { + int i = 0; + while (i + w->first_postmapped_pass < w->first_unused_pass) { + if (w->pass_postmap[i] == pass) { + raw_pass = i + w->first_postmapped_pass; + stagger = w->stagger_postmap[i]; + break; + } + i++; + } + } + + calculate_raw_pass_parameters(&w->rw, raw_pass, startrow, subpass); + *startrow -= w->rw.separation * w->rw.jets; + *jetsused = w->rw.jets; + *phantomrows = 0; + + *startrow += stagger * w->rw.separation; + if (stagger < 0) { + stagger = -stagger; + *phantomrows += stagger; + } + *jetsused -= stagger; + + extra = w->first_row_printed - (*startrow + w->rw.separation * *phantomrows); + extra = (extra + w->rw.separation - 1) / w->rw.separation; + if (extra > 0) { + *jetsused -= extra; + *phantomrows += extra; + } + + extra = *startrow + w->rw.separation * (*phantomrows + *jetsused - 1) + - w->last_row_printed; + extra = (extra + w->rw.separation - 1) / w->rw.separation; + if (extra > 0) { + *jetsused -= extra; + } +} +#endif /* TEST_COOKED */ + +#ifdef TEST + +#ifdef ACCUMULATE +#define PUTCHAR(x) /* nothing */ +#else +#define PUTCHAR(x) putchar(x) +#endif + +static void +plotpass(int startrow, int phantomjets, int jetsused, int totaljets, + int separation, int subpass, int *collect, int *prints) +{ + int hpos, i; + + for (hpos = 0; hpos < startrow; hpos++) + PUTCHAR(' '); + + for (i = 0; i < phantomjets; i++) { + int j; + PUTCHAR('X'); + hpos++; + for (j = 1; j < separation; j++) { + PUTCHAR(' '); + hpos++; + } + } + + for (; i < phantomjets + jetsused; i++) { + if (i > phantomjets) { + int j; + for (j = 1; j < separation; j++) { + PUTCHAR('-'); + hpos++; + } + } + if (hpos < MAXCOLLECT) { + if (collect[hpos] & 1 << subpass) + PUTCHAR('^'); + else if (subpass < 10) + PUTCHAR('0' + subpass); + else + PUTCHAR('A' + subpass - 10); + collect[hpos] |= 1 << subpass; + prints[hpos]++; + } else { + PUTCHAR('0' + subpass); + } + hpos++; + } + + while (i++ < totaljets) { + int j; + for (j = 1; j < separation; j++) { + PUTCHAR(' '); + hpos++; + } + PUTCHAR('X'); + } +#ifdef ACCUMULATE + for (i=0; i<=MAXCOLLECT; i++) { + if (collect[i] == 0) + putchar(' '); + else if (collect[i] < 10) + putchar('0'+collect[i]); + else + putchar('A'+collect[i]-10); + } +#endif + putchar('\n'); +} +#endif /* TEST */ + +#ifdef TEST_COOKED +int +main(int ac, char *av[]) +{ + int S =ac>1 ? atoi(av[1]) : 4; + int J =ac>2 ? atoi(av[2]) : 12; + int H =ac>3 ? atoi(av[3]) : 1; + int firstrow =ac>4 ? atoi(av[4]) : 1; + int lastrow =ac>5 ? atoi(av[5]) : 100; + int pageheight=ac>6 ? atoi(av[6]) : 1000; + int strategy =ac>7 ? atoi(av[7]) : 1; + cooked_t *weave; + int passes; + + int pass, x; + int collect[MAXCOLLECT]; + int prints[MAXCOLLECT]; + + memset(collect, 0, MAXCOLLECT*sizeof(int)); + memset(prints, 0, MAXCOLLECT*sizeof(int)); + printf("S=%d J=%d H=%d firstrow=%d lastrow=%d " + "pageheight=%d strategy=%d\n", + S, J, H, firstrow, lastrow, pageheight, strategy); + + weave = initialize_weave_params(S, J, H, firstrow, lastrow, + pageheight, strategy); + passes = weave->first_unused_pass - weave->first_premapped_pass; + + for (pass = 0; pass < passes; pass++) { + int startrow, subpass, phantomjets, jetsused; + + calculate_pass_parameters(weave, pass, &startrow, &subpass, + &phantomjets, &jetsused); + + plotpass(startrow, phantomjets, jetsused, J, S, subpass, + collect, prints); + } + + for (pass=MAXCOLLECT - 1; prints[pass] == 0; pass--) + ; + + for (x=0; x<=pass; x++) { + if (collect[x] < 10) + putchar('0'+collect[x]); + else + putchar('A'+collect[x]-10); + } + putchar('\n'); + + for (x=0; x<=pass; x++) { + if (prints[x] < 10) + putchar('0'+prints[x]); + else + putchar('A'+prints[x]-10); + } + putchar('\n'); + + return 0; +} +#endif /* TEST_COOKED */ + +#ifdef TEST_RAW +int +main(int ac, char *av[]) +{ + int S =ac>1 ? atoi(av[1]) : 4; + int J =ac>2 ? atoi(av[2]) : 12; + int h_pos =ac>3 ? atoi(av[3]) : 1; + int h_over=ac>4 ? atoi(av[4]) : 1; + int v_over=ac>5 ? atoi(av[5]) : 1; + int H = h_pos * h_over * v_over; + + int pass, passes, x; + int collect[MAXCOLLECT]; + int prints[MAXCOLLECT]; + raw_t raw; + + memset(collect, 0, MAXCOLLECT*sizeof(int)); + memset(prints, 0, MAXCOLLECT*sizeof(int)); + printf("S=%d J=%d H=%d\n", S, J, H); + + if (H > J) { + printf("H > J, so this weave will not work!\n"); + } + passes = S * H * 3; + + initialize_raw_weave(&raw, S, J, H); + + for (pass=0; pass= J) + b=1; + if (x != first + jet * S) + c=1; + if (subpass != h) + d=1; + if (a || b || c || d) { + printf(" ("); + if (a) putchar('A'); + if (b) putchar('B'); + if (c) putchar('C'); + if (d) putchar('D'); + putchar(')'); + printf("\npass=%d first=%d start=%d jet=%d subpass=%d", pass, first, start, jet, subpass); + } + putchar('\n'); + } + /* putchar('\n'); */ + } + + return 0; +} + +#endif /* TEST_RAW */ diff --git a/src/main/printers.xml b/src/main/printers.xml new file mode 100644 index 0000000..f107c50 --- /dev/null +++ b/src/main/printers.xml @@ -0,0 +1,1095 @@ +# pseudo-XML description of printers known to the Print plugin +# This file was originally generated. It should be edited by hand. + +# "$Id: printers.xml,v 1.42 2001/11/22 12:39:18 rlk Exp $" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# Note that the 785EPX has a roll feed holder. It's more like the 890 +# than the 780, despite the name. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + # Uses 840 driver + + + + + + + + # Uses 840 driver + + + + + + + + # Uses 840 driver + + + + + + + + # Uses 840 driver + + + + + + + + # Uses 840 driver + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + # Uses 840 driver + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + # Uses 900 series driver (large) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + # Uses 900 series driver + + + + + + + + # Uses 900 series driver + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/quickmatrix257.h b/src/main/quickmatrix257.h new file mode 100644 index 0000000..8c5f9e1 --- /dev/null +++ b/src/main/quickmatrix257.h @@ -0,0 +1,6027 @@ +/* + * "$Id: quickmatrix257.h,v 1.2 2001/02/25 01:58:35 rlk Exp $" + * + * Square dither matrix file for the gimp-print plugin. + * + * Copyright 1997-2000 Thomas Tonino + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + + 0, 59688, 17885, 33107, 58234, 12934, 35793, 44835, 5911, 41622, 17122, +47448, 37402, 13125, 45769, 3041, 64479, 7193, 26025, 48883, 23186, 8596, +56304, 31276, 62070, 7419, 58111, 28763, 52231, 25607, 36689, 7878, 50438, + 3304, 46570, 30413, 38153, 22895, 59386, 16833, 64897, 26973, 56862, 1751, +30501, 43096, 19080, 38867, 48367, 16177, 41490, 6759, 62468, 3418, 24582, +56043, 38990, 1968, 42531, 12594, 60774, 36919, 21207, 48066, 15449, 42959, +61675, 23866, 6366, 32459, 57157, 7049, 26177, 49389, 19702, 57699, 40132, + 3070, 43778, 10151, 47443, 20912, 41554, 27622, 46713, 1914, 43539, 28428, + 4256, 50085, 14050, 53795, 38701, 9916, 52406, 371, 58245, 39850, 6794, +64725, 38727, 16036, 45639, 27474, 35744, 61301, 15408, 43781, 19382, 45519, +22661, 58538, 13444, 26893, 65363, 15584, 57641, 7346, 63655, 34350, 27108, +60053, 1389, 25706, 51128, 33025, 2997, 62541, 8045, 56547, 39855, 17393, +62119, 30279, 58117, 40176, 5416, 43034, 10397, 28137, 62708, 14977, 35842, +51282, 13140, 57289, 4287, 62260, 34738, 3051, 26068, 51278, 22395, 41714, +17957, 38847, 57449, 20831, 13094, 51140, 21733, 46148, 5516, 41878, 30210, + 3106, 52391, 14896, 39655, 26731, 47194, 12836, 50717, 35728, 16843, 53564, +33806, 18463, 43939, 20725, 50550, 39055, 511, 42169, 18626, 45294, 34266, +15424, 49439, 23119, 39211, 28260, 59005, 8240, 55197, 26793, 57303, 14814, +60469, 16583, 52634, 35308, 22649, 50030, 2194, 40629, 59032, 4777, 28774, +52867, 32354, 59389, 9671, 33651, 49781, 24490, 11991, 37686, 29536, 51252, +11424, 47104, 32362, 15651, 48712, 14413, 50922, 34165, 24144, 52891, 8573, +38880, 32426, 17423, 31321, 37485, 27441, 52996, 10324, 58235, 21400, 60935, +14706, 24516, 57051, 17947, 60150, 3907, 54271, 10399, 33568, 2617, 36464, +20515, 63720, 28199, 53393, 46866, 34713, 27290, 45633, 15536, 51091, 990, +30588, 59907, 14206, 55908, 24518, 8409, 58995, 18887, 52139, 17703, 34592, +59412, 2080, 33216, 44331, 25929, 5345, 21718, 46279, 35160, 14224, 42479, + 5630, 59093, 31948, 20683, 42456, 15998, 63251, 6859, 44930, 13925, 43763, +34236, 8438, 38292, 25073, 51355, 10201, 61196, 8702, 25255, 63565, 23235, +44508, 21547, 40315, 50916, 10802, 23093, 63703, 21537, 53748, 33443, 11201, +64203, 5324, 57904, 26849, 2952, 34541, 48011, 20564, 38024, 29077, 64722, +10611, 45690, 7410, 31413, 63227, 15386, 53171, 24772, 57435, 8038, 60438, +22060, 54545, 17757, 57329, 34695, 24441, 59579, 2111, 26391, 44137, 19178, +47156, 13224, 21027, 50738, 32897, 19690, 52822, 4886, 59097, 9156, 24192, +54382, 3738, 57333, 9654, 50128, 16204, 37405, 52971, 3242, 45691, 22908, +41296, 18130, 44699, 15375, 38344, 30433, 47682, 16262, 59312, 39285, 19523, +43669, 25664, 127, 49234, 26592, 7314, 20090, 33929, 63214, 15704, 55482, +39594, 19364, 52795, 7031, 26250, 47001, 32280, 43334, 13829, 23212, 59083, +38851, 11986, 55288, 984, 61266, 10252, 24108, 49173, 34897, 7142, 56436, +24990, 59880, 12950, 48564, 23567, 33595, 58419, 29, 62940, 20132, 42318, +25801, 7112, 64962, 28922, 835, 60073, 10974, 55058, 31332, 14868, 52056, +21473, 54782, 4374, 64030, 31663, 1077, 62112, 14118, 44038, 16360, 47813, +21799, 41930, 10532, 38704, 25784, 47592, 9732, 64599, 7506, 28719, 46469, +16996, 35926, 24263, 46087, 12616, 42615, 18468, 36842, 62005, 14275, 40798, +61121, 7810, 55226, 1498, 64932, 26958, 5653, 57203, 24958, 61651, 7013, +58957, 12785, 37080, 28569, 63670, 953, 57185, 44186, 14612, 64790, 18670, +45030, 32339, 4163, 31022, 44240, 33187, 1609, 46783, 26424, 42586, 19606, +37213, 58324, 22551, 55956, 5261, 37344, 9608, 31045, 21078, 8634, 55902, + 4995, 61629, 31582, 48308, 16726, 35033, 49771, 4120, 33554, 51183, 29273, +40625, 11186, 31077, 47313, 14634, 39474, 57369, 16543, 64039, 32600, 53687, +26956, 1086, 65147, 23386, 48700, 16882, 37638, 64548, 9390, 48553, 23856, +52293, 27637, 56418, 3001, 24182, 52674, 19844, 62998, 15793, 47555, 32418, +53432, 35435, 4173, 52330, 12769, 57335, 14741, 28075, 60229, 37389, 9813, +44919, 6074, 27682, 51324, 22773, 40833, 19394, 46250, 29454, 53750, 16611, +62564, 2029, 46434, 18334, 41146, 23477, 60308, 17868, 37832, 28542, 36303, + 4446, 37189, 29830, 39057, 5894, 33581, 45011, 8779, 47345, 12638, 37300, +29576, 51664, 7692, 60612, 25660, 34245, 62289, 26323, 3632, 59743, 12054, +41511, 21942, 46274, 34382, 13099, 49477, 26069, 36373, 28818, 62350, 6898, +29927, 42332, 19455, 51366, 12980, 55289, 2756, 58043, 10669, 54287, 6696, +43371, 9966, 29693, 48739, 12513, 37250, 59845, 11707, 44990, 31547, 53207, + 2573, 27242, 48094, 23599, 555, 45803, 12684, 41077, 61927, 21023, 8624, +27012, 49980, 36036, 8139, 29552, 43303, 18615, 46186, 28890, 50463, 32943, + 1701, 62462, 27877, 39605, 10804, 33916, 51795, 18242, 63823, 11319, 40940, +30797, 10608, 51505, 4521, 48372, 32952, 15190, 46996, 24235, 40722, 27676, +37117, 3886, 59119, 32959, 46715, 11254, 38973, 17471, 47805, 35180, 26109, +53362, 4884, 64314, 35374, 288, 61219, 33710, 53413, 4076, 40970, 32661, +23608, 36273, 55804, 20224, 62722, 11573, 54687, 21099, 64257, 7104, 55754, + 2715, 27090, 53054, 4879, 31648, 45488, 19370, 43470, 16524, 33517, 49976, +37745, 52, 29183, 41641, 19516, 45651, 3105, 48713, 13514, 42077, 26678, + 9467, 49993, 2385, 40416, 7630, 48942, 27410, 52650, 6921, 64321, 38475, +13921, 55373, 7629, 63454, 30672, 6666, 50454, 14180, 33036, 56785, 23364, +61934, 50897, 37592, 22449, 42695, 28178, 7409, 23622, 63923, 8872, 25951, +42404, 62981, 21196, 1637, 56370, 35960, 61370, 4923, 51737, 28471, 9697, +46565, 3141, 40384, 12993, 49074, 30606, 38353, 9029, 34010, 56717, 1978, +26285, 53201, 34265, 829, 36886, 10402, 38976, 30813, 61060, 13438, 43330, + 5698, 41151, 27248, 2793, 21679, 46142, 31598, 16991, 49692, 83, 33127, +48193, 4471, 31148, 54908, 16915, 58423, 40168, 679, 44552, 14862, 52972, +11525, 65437, 7948, 43232, 12188, 50303, 13919, 56757, 3500, 52309, 11616, +50772, 1488, 56002, 13181, 62223, 15993, 55425, 19664, 64564, 25401, 15194, +63306, 20585, 56080, 7037, 62477, 14537, 48587, 35111, 3940, 45198, 8697, +48995, 37088, 22600, 44051, 17396, 51773, 170, 65163, 28216, 39719, 17109, +60532, 1192, 38800, 25074, 56134, 10480, 61500, 5610, 38540, 30674, 47982, +21869, 41041, 19817, 62961, 35273, 23536, 53478, 5312, 64545, 16845, 32219, +52102, 21390, 63891, 13588, 35687, 57286, 8098, 36016, 61325, 31240, 56528, +22553, 2668, 53238, 30938, 64469, 81, 54471, 21610, 63058, 5361, 57809, +35841, 9176, 20341, 58716, 40964, 15934, 44624, 17377, 63391, 1154, 27674, +44195, 5089, 53179, 17624, 56077, 35137, 24003, 61108, 17519, 53052, 36327, + 9781, 57642, 7613, 62842, 19964, 45761, 25516, 7325, 28282, 61169, 24255, +55717, 6929, 57913, 9456, 30089, 45348, 23986, 13520, 46444, 27737, 7285, +21015, 62470, 19345, 58259, 710, 44751, 11086, 42459, 5550, 47470, 36447, + 1188, 30504, 44622, 19819, 49233, 38857, 17570, 46805, 21439, 34566, 62774, +10142, 39803, 60034, 12962, 21435, 35785, 52580, 16127, 56071, 26993, 60985, +22842, 54057, 19299, 59141, 36738, 16703, 60323, 25206, 56861, 19628, 62734, +16129, 46121, 11880, 29098, 50237, 22237, 39350, 17209, 47672, 28401, 38537, +25649, 45445, 12868, 42510, 3672, 32088, 11867, 64681, 17101, 54776, 32501, +52497, 14864, 39255, 57518, 19739, 9639, 32702, 49441, 23658, 7771, 25452, +42513, 20380, 63206, 37465, 21396, 54868, 19684, 60852, 8312, 58537, 19040, +54275, 28264, 13333, 47784, 41433, 14389, 28478, 57978, 21947, 62420, 18758, +45525, 7036, 49371, 28520, 55422, 14185, 57681, 31093, 64103, 10526, 56295, +37404, 21063, 38783, 65368, 12275, 44280, 17858, 33079, 38284, 8771, 24483, +60460, 30578, 56541, 4257, 38330, 23035, 40387, 19673, 57476, 35895, 24536, +34477, 44832, 19402, 38964, 25938, 42690, 21549, 47909, 23706, 44444, 2375, +46254, 12417, 50883, 35496, 589, 39839, 30456, 45929, 19541, 41582, 30846, +11788, 57172, 23470, 55282, 31737, 13972, 53840, 7550, 62698, 29539, 37578, +10902, 51184, 6402, 47547, 11834, 51418, 17990, 43490, 14691, 46907, 35394, +24786, 59400, 8448, 27581, 64765, 5049, 45171, 27546, 648, 57908, 13825, +44284, 26834, 54837, 7889, 35398, 3694, 41487, 24708, 48797, 16642, 30694, +44710, 20633, 5120, 27416, 49802, 37817, 15848, 43808, 17218, 41924, 12674, +47414, 32678, 45120, 14024, 23121, 64253, 34639, 6574, 29312, 48436, 4267, +50617, 23982, 36034, 58028, 10143, 37847, 24540, 47514, 3675, 44150, 13164, +37978, 30078, 2301, 62389, 22471, 35353, 47963, 16221, 52537, 12251, 65235, +31624, 50209, 2388, 40762, 15842, 42687, 21193, 38170, 51287, 10918, 32984, +56792, 18703, 52156, 31015, 48278, 36070, 9161, 29344, 51428, 18679, 61365, +30005, 51907, 14662, 25989, 57470, 40561, 13660, 60736, 33175, 8270, 63653, +10650, 57800, 2564, 26375, 53261, 23333, 3943, 54407, 32293, 63284, 9945, +43161, 4861, 40522, 11020, 38624, 6624, 46242, 3821, 30303, 47269, 21787, +43148, 13746, 37163, 1085, 41391, 20168, 57594, 36290, 2950, 61490, 11556, +53271, 858, 59486, 10702, 64165, 1869, 54841, 26935, 58643, 15149, 49032, + 1467, 39992, 10276, 43754, 3395, 46910, 30312, 2129, 35770, 59645, 41152, +15487, 64863, 31508, 53046, 13408, 44851, 143, 25285, 50154, 6313, 43125, +24707, 41418, 15308, 43970, 4113, 40203, 60039, 22344, 6572, 61829, 39359, +12800, 49896, 4976, 54405, 12377, 58637, 33921, 506, 36255, 46495, 7926, +42394, 18522, 43699, 27171, 6995, 60679, 9695, 26491, 53098, 22343, 57570, + 1604, 64580, 29568, 45529, 19810, 9318, 33322, 48623, 16919, 59444, 1113, +52145, 30322, 4833, 61090, 8709, 30707, 63702, 5354, 58065, 10006, 65271, + 6016, 40479, 17545, 53493, 27354, 39903, 4855, 59352, 27095, 52964, 5301, +24367, 54647, 1381, 64504, 27431, 40338, 16747, 38162, 1048, 63796, 27039, +48233, 24138, 14169, 57517, 31884, 19720, 58795, 21187, 40991, 30251, 56853, + 4298, 63577, 31531, 305, 52399, 21189, 35995, 43408, 18827, 50006, 17497, +52412, 32791, 18519, 49472, 30755, 2345, 39152, 22096, 58870, 46793, 11273, +60923, 5716, 40462, 65289, 10856, 54909, 32422, 58859, 7636, 33535, 59488, + 4516, 55323, 27856, 60827, 19594, 3367, 26633, 52567, 39250, 2457, 46871, +23717, 52789, 14679, 60790, 35112, 11918, 53681, 16877, 31565, 61382, 13819, +34195, 64824, 19298, 58707, 7299, 55682, 41368, 13633, 49520, 3591, 28456, +42644, 1535, 40136, 16401, 44640, 18400, 58177, 22870, 53100, 12822, 64914, + 1967, 22472, 61592, 38816, 3731, 41816, 11563, 65208, 2386, 25589, 56051, +41501, 15019, 47943, 35003, 2797, 22327, 63202, 34418, 8645, 23517, 51000, + 4373, 25004, 54191, 29702, 43764, 18388, 51807, 37316, 7175, 47481, 29920, +44032, 7977, 25587, 48472, 20816, 64471, 22297, 55078, 17978, 62491, 35106, +21076, 64194, 8023, 55352, 4613, 53503, 28185, 59333, 22742, 51658, 5369, +25257, 44884, 20560, 43075, 23600, 41785, 21747, 43691, 17937, 47090, 35073, +16299, 39398, 44762, 19137, 53181, 26652, 57794, 22001, 60777, 19194, 56172, +27184, 50286, 22729, 5495, 46922, 10351, 41876, 3560, 60184, 17902, 55322, +36383, 16166, 61698, 11756, 53004, 1785, 55499, 20719, 62519, 24972, 9629, +35349, 54979, 32195, 3855, 44795, 20870, 42564, 22619, 41007, 27165, 17044, +64480, 19082, 24631, 59919, 15174, 54695, 1436, 59025, 40691, 22725, 46376, +34979, 5771, 39538, 14505, 50493, 13352, 48900, 4890, 52182, 27557, 63514, +12764, 43718, 26416, 47137, 12008, 44367, 21247, 39941, 27338, 53928, 16878, +45465, 22440, 36961, 27999, 52596, 11948, 61431, 34172, 10698, 57951, 31499, +16339, 48179, 18533, 61936, 37068, 10789, 43153, 17554, 49680, 6100, 61426, +10623, 44631, 18654, 42006, 2955, 38953, 53127, 5088, 46855, 35458, 2700, +33209, 64144, 8391, 22063, 45560, 34302, 19753, 48506, 29218, 9793, 61982, + 1696, 56044, 12015, 38173, 7467, 59590, 35946, 8423, 61575, 20226, 50985, +32695, 14123, 29888, 38211, 19544, 50233, 26314, 1655, 46473, 22042, 42631, +15394, 48375, 12365, 26662, 46194, 34893, 9774, 37043, 51750, 31118, 60262, + 8741, 31972, 55732, 13237, 61723, 7905, 38923, 31909, 17856, 46487, 5735, +41247, 49097, 1907, 45548, 27989, 9044, 50494, 25476, 45762, 16336, 31554, +59315, 25718, 33925, 56859, 14568, 60515, 24035, 55491, 4686, 41541, 10676, +37005, 5672, 43589, 26024, 47322, 34508, 7734, 26844, 59985, 21766, 44265, +16955, 33085, 50266, 22052, 5744, 60109, 8189, 25059, 57058, 40055, 6137, +49409, 29443, 59936, 16719, 35764, 47816, 20797, 314, 36106, 48902, 13305, +28554, 56511, 20223, 61879, 15060, 33897, 59242, 2455, 37663, 11689, 46903, + 1455, 42693, 31026, 10231, 53133, 28034, 44678, 15454, 38700, 12279, 42083, + 8333, 43692, 12693, 37628, 60542, 9537, 55728, 6148, 62553, 12518, 54565, + 5823, 57616, 30766, 8466, 62821, 4673, 24995, 61253, 10817, 43137, 6010, +37218, 12181, 41451, 6788, 44939, 10924, 54660, 29519, 34103, 54083, 16293, +48147, 27575, 38363, 32252, 7544, 47683, 29885, 39654, 17948, 36503, 27495, +46990, 7746, 44736, 29933, 50076, 15029, 24216, 48420, 17362, 65229, 8612, +52083, 2469, 47613, 36002, 9079, 50608, 35162, 3739, 49248, 25729, 36547, +32268, 16301, 53609, 2515, 58601, 20638, 63077, 28490, 41337, 22677, 34023, +62051, 21757, 41402, 2186, 50217, 30922, 7354, 32895, 63010, 28518, 58627, +11088, 46304, 145, 41648, 12532, 50422, 3225, 43907, 19060, 46687, 29130, + 6726, 43682, 14834, 50114, 37291, 7481, 43936, 13288, 33214, 58766, 21053, +55777, 14844, 36395, 29087, 52433, 21216, 56716, 13458, 60029, 31275, 11284, +43013, 16609, 62088, 26015, 53774, 15026, 35755, 52819, 24986, 7580, 58887, +13499, 54636, 33101, 15889, 46062, 34965, 25711, 61274, 31011, 15718, 46277, +24602, 38196, 31562, 6449, 60552, 43825, 1008, 51361, 32129, 8917, 58424, +37925, 17660, 51354, 3389, 63111, 19511, 40325, 64003, 10808, 22000, 57995, +23954, 6393, 42443, 16415, 47983, 19138, 40719, 28127, 36675, 26005, 58448, + 306, 55381, 30776, 64383, 26572, 12653, 51615, 17212, 57791, 40145, 30727, + 1290, 34090, 52534, 5275, 38969, 10683, 50969, 6426, 43889, 31959, 8332, +32910, 47689, 22159, 61721, 27644, 57291, 19278, 55038, 16206, 58378, 29688, +52916, 14346, 48800, 5100, 54197, 39289, 10258, 63414, 35660, 28204, 33927, +45721, 10072, 27549, 55069, 13186, 42720, 1983, 31922, 64868, 9253, 41121, +59265, 25653, 6375, 64317, 39430, 16691, 42598, 1141, 37691, 51993, 16941, +31323, 50610, 23994, 34451, 58532, 15091, 51492, 25131, 41144, 574, 34132, +58721, 25621, 63375, 19034, 54430, 26403, 64984, 15789, 32186, 50651, 27074, +36499, 29089, 38442, 24931, 32707, 37305, 18919, 49198, 22069, 51944, 7733, +31688, 47558, 21118, 63466, 25190, 53891, 17496, 65205, 20422, 39885, 14963, +60879, 839, 23169, 62251, 35188, 5736, 57193, 12464, 65028, 26641, 3477, +56310, 23825, 63781, 12406, 34473, 57331, 16035, 64250, 352, 38100, 60900, +11428, 54014, 36240, 24015, 33435, 62739, 15498, 57501, 30656, 14899, 61564, +28383, 38759, 10018, 51220, 6206, 62662, 12706, 44422, 27635, 51113, 8346, +47586, 3507, 54270, 10002, 36936, 13710, 58839, 32019, 17851, 61385, 23636, +54466, 20418, 2671, 35138, 52833, 17591, 62022, 20191, 59784, 26426, 56416, +15133, 59183, 873, 36867, 56570, 23240, 64924, 1686, 25017, 60744, 31905, +52039, 3245, 28327, 46336, 4628, 41175, 59323, 2641, 25145, 46298, 6554, +51044, 34681, 16131, 61517, 28655, 54697, 10321, 44695, 5650, 29473, 48568, + 2024, 60763, 37580, 17076, 43824, 4819, 39603, 57151, 24006, 11053, 47881, + 2544, 39697, 55395, 3876, 65225, 13024, 57129, 40931, 11028, 25604, 64213, +16011, 56333, 36565, 14975, 31418, 62323, 11569, 37458, 29922, 52623, 1121, +23055, 54106, 33874, 1940, 36021, 65482, 21257, 56117, 759, 63574, 10540, +54671, 3869, 51439, 15716, 44130, 27694, 10023, 20173, 39306, 59370, 23502, +36990, 4744, 21249, 43562, 61988, 14115, 27504, 64497, 20378, 46471, 23237, +63347, 19866, 53307, 28169, 63838, 10104, 51769, 134, 46503, 13412, 39157, + 3331, 41848, 11387, 46692, 789, 40376, 24715, 58066, 30362, 19086, 46185, +15389, 44254, 3540, 53326, 15763, 65338, 37397, 17711, 46430, 21376, 53016, +38625, 15817, 54823, 28887, 11105, 34164, 50503, 23667, 3451, 58698, 12082, +53529, 27514, 6804, 43471, 57137, 5374, 62180, 8774, 29171, 45285, 5152, +59878, 18581, 47578, 23019, 9805, 49210, 2171, 46519, 32639, 3961, 31419, +47536, 292, 38845, 13127, 48826, 2442, 52289, 9754, 61054, 3481, 53688, +13439, 42413, 32764, 28665, 56192, 2762, 38749, 13087, 42180, 383, 46259, +29775, 51345, 3093, 43409, 18912, 49152, 38932, 8659, 24591, 51422, 21876, +44539, 17402, 50962, 38277, 10917, 43381, 5583, 50338, 28806, 2965, 42350, +19809, 52951, 33145, 5420, 42754, 26865, 1332, 59343, 9840, 25894, 41999, + 4832, 53283, 32602, 6560, 47604, 19648, 65005, 17664, 42091, 20035, 48195, +34462, 14912, 32621, 37225, 23628, 61052, 32308, 25503, 55990, 33266, 6731, +51451, 39883, 3828, 46340, 9960, 36245, 49272, 23409, 6988, 38238, 28459, +49607, 7379, 37619, 10391, 40086, 27423, 51017, 21297, 13293, 45317, 18269, +40862, 54110, 20752, 10263, 26496, 64110, 39590, 13669, 52764, 31064, 17981, +33193, 65287, 15430, 40675, 29279, 4543, 49858, 36352, 1545, 23529, 49340, +18823, 39222, 58093, 16607, 41195, 11318, 30058, 55712, 22857, 65045, 26238, + 7211, 34123, 63843, 22070, 52059, 14586, 27011, 43956, 21011, 48090, 1548, +27256, 55638, 36716, 19177, 42885, 4187, 26999, 55219, 6850, 41017, 26737, +56943, 13168, 25425, 45475, 35868, 7174, 50380, 27413, 47092, 9361, 45107, +14239, 37659, 29388, 46078, 17862, 42024, 20606, 48363, 9068, 62085, 33826, +54150, 2859, 33087, 8669, 63151, 29334, 53947, 8050, 23674, 47346, 36129, + 9660, 50074, 424, 40866, 11265, 37853, 3054, 45330, 18724, 37607, 26647, +42147, 20721, 63195, 28748, 53645, 23787, 62346, 18483, 32283, 63965, 9852, +36561, 8453, 60433, 1240, 54961, 20268, 58834, 23118, 42327, 102, 31980, +60574, 4109, 58517, 10373, 26022, 44261, 5060, 48336, 21383, 60959, 16182, +44755, 34693, 29259, 46025, 18001, 65476, 39483, 21742, 12573, 33384, 41254, +26513, 49429, 20344, 39201, 29718, 9026, 61953, 36232, 55659, 19967, 39673, +17334, 61075, 28697, 55224, 18237, 58971, 23135, 56579, 18857, 64612, 15049, +46097, 20024, 44427, 25563, 65501, 544, 59124, 41853, 19765, 50519, 27235, +55670, 22406, 60183, 26529, 8303, 34690, 62525, 22257, 56524, 12913, 28536, +42990, 58272, 11417, 39873, 1530, 58852, 32045, 14893, 60475, 32774, 57961, +14207, 38600, 53814, 22977, 47939, 12233, 27864, 47421, 18847, 50353, 34286, +28908, 35601, 49288, 18041, 45406, 19993, 38130, 56893, 13763, 42582, 2678, +55570, 29845, 51766, 4646, 23781, 61850, 1006, 56221, 11902, 39274, 7682, +44865, 286, 48121, 29757, 14873, 34082, 53130, 15894, 31676, 58003, 13022, +65088, 30541, 55642, 4342, 36350, 23999, 47677, 21989, 63158, 5654, 31933, +61782, 38094, 3884, 49357, 30301, 6220, 35016, 51151, 41621, 8754, 22014, +57405, 35720, 9107, 51266, 42524, 11589, 36154, 57750, 17412, 63507, 30566, +19392, 47996, 34420, 7335, 64878, 31218, 12516, 32318, 63256, 26845, 47776, + 3052, 41827, 12538, 49854, 29168, 53977, 4215, 43113, 9287, 60307, 36597, + 7042, 53389, 15062, 42908, 52408, 21605, 4968, 47877, 13329, 59990, 39692, +20563, 45862, 16912, 50016, 5284, 34707, 59642, 8915, 61805, 31306, 15628, +61089, 17670, 53649, 25408, 33417, 50818, 6047, 25012, 56612, 8277, 65040, +35381, 22780, 40908, 5050, 42973, 21641, 56742, 41902, 14952, 46144, 18077, +38748, 56560, 3348, 53061, 22004, 35037, 57184, 18997, 59584, 23673, 55251, +12967, 58979, 5179, 56395, 11123, 51013, 6225, 36755, 9996, 44845, 6689, +38044, 51972, 15719, 31315, 49895, 22754, 32852, 40272, 26530, 37857, 12396, +48850, 18810, 52383, 11819, 39186, 23766, 36663, 29797, 49732, 14564, 62523, +30705, 39530, 2299, 53732, 11469, 62237, 7311, 24252, 49908, 4098, 25477, +60302, 29798, 53630, 14186, 55887, 3377, 64695, 13531, 54005, 33829, 21933, + 5826, 31033, 45024, 7249, 51797, 11481, 44379, 6410, 40973, 11173, 45792, + 5162, 33410, 40368, 26235, 34789, 58104, 7966, 41042, 21430, 38814, 17477, + 5498, 61751, 11242, 44178, 5108, 48101, 9868, 36012, 58914, 23772, 10509, +47724, 6514, 33753, 64240, 2521, 31653, 20744, 49717, 28354, 36820, 6695, +48401, 25724, 748, 22488, 46038, 25439, 10292, 60595, 6172, 35204, 59158, +13905, 63596, 8198, 56189, 11968, 54727, 3255, 60161, 10700, 63944, 1062, +26263, 52187, 21566, 46245, 25108, 8929, 36061, 59542, 43017, 11366, 48821, +18510, 43878, 19941, 58265, 17470, 64841, 19363, 41341, 60642, 8497, 25873, +64063, 40933, 5643, 45681, 16380, 44073, 19289, 46928, 15605, 64453, 1329, +53481, 33729, 19338, 48541, 8257, 27933, 60202, 12587, 57637, 27299, 62976, + 2522, 23701, 48834, 34544, 53, 23321, 63067, 26705, 5490, 48875, 25924, + 729, 32080, 41690, 7970, 59045, 9819, 56595, 27693, 41306, 597, 51472, +38436, 4645, 42891, 21042, 52557, 18516, 60210, 880, 45235, 16276, 40435, +19878, 47284, 16971, 31850, 63370, 24527, 37256, 31136, 12207, 33480, 62808, +22876, 51799, 32635, 10398, 53224, 378, 60640, 33854, 23960, 47080, 17890, +42098, 14827, 48626, 38905, 5531, 43641, 30095, 3498, 62644, 12592, 58255, +38473, 19791, 43245, 28548, 2669, 56133, 14835, 59797, 25732, 49500, 6231, +30374, 54742, 660, 60374, 11400, 33619, 19622, 32181, 61451, 6949, 30288, +42521, 5528, 44203, 16379, 40475, 21069, 43106, 17488, 39737, 25423, 48180, +22538, 59108, 20411, 56958, 29415, 4455, 35247, 56303, 3002, 62955, 11667, +52841, 7493, 64395, 31739, 4611, 62241, 24887, 47435, 16314, 56659, 9074, +63440, 1017, 52494, 23804, 8083, 58030, 28457, 36724, 22556, 40487, 31111, +57487, 14818, 33420, 48989, 8458, 45772, 407, 37695, 21279, 40430, 17854, +44502, 1856, 40857, 56793, 28653, 65331, 16455, 58340, 24616, 37576, 21121, +53170, 25289, 62414, 19495, 30442, 60072, 8782, 47992, 1378, 31128, 50796, +14653, 47932, 12515, 52416, 45660, 16797, 38065, 20623, 64391, 15044, 31618, +53084, 4309, 49693, 30646, 37390, 27596, 50452, 16643, 52401, 36325, 62847, + 5080, 56119, 13526, 63529, 16105, 44883, 31319, 52263, 8064, 65413, 41442, +18260, 31222, 54344, 3610, 41167, 23590, 39257, 22100, 43646, 20389, 38607, +27849, 44077, 22122, 50340, 34135, 7427, 60906, 11030, 34915, 63434, 22620, +14104, 31512, 40174, 26049, 64232, 5520, 53447, 30002, 36900, 10649, 52088, + 4178, 23353, 54178, 35593, 747, 20915, 56351, 28953, 39214, 1793, 59626, +10707, 52576, 32723, 25991, 41273, 9621, 54513, 24334, 34902, 46388, 17558, +38929, 21474, 43513, 15419, 38015, 58346, 17050, 61241, 29659, 46711, 16410, +37730, 54990, 14531, 60659, 37426, 55593, 13643, 47293, 26326, 39677, 15382, +51995, 20473, 59402, 25713, 10559, 55218, 14011, 59181, 8040, 38802, 32917, +22280, 36105, 62583, 10639, 58249, 29004, 51542, 238, 38926, 10173, 58571, + 3282, 60823, 40274, 8733, 43783, 2494, 28110, 64969, 22046, 43584, 27654, + 9712, 64311, 2285, 55813, 29472, 52070, 2880, 25921, 56646, 12192, 58615, +35048, 22288, 41642, 31572, 1546, 60726, 13767, 52553, 34115, 24305, 50866, +32500, 11592, 35807, 65186, 15791, 36974, 27087, 41030, 24740, 64159, 43051, +13007, 38472, 25314, 48376, 13508, 52074, 28640, 62540, 1191, 54223, 31787, +64754, 2612, 60069, 12345, 40580, 1420, 42634, 12030, 47661, 23947, 45684, +14607, 43965, 29266, 47145, 19656, 42815, 17752, 50398, 36421, 13979, 41307, + 6297, 50766, 28351, 45496, 19924, 43345, 17311, 33388, 47091, 15238, 43626, + 9510, 50930, 739, 45210, 10468, 37278, 54425, 15705, 42124, 19434, 63733, +24292, 58879, 11887, 52987, 32353, 60557, 19540, 10905, 45895, 2795, 40614, +12041, 43478, 1220, 63593, 10095, 46649, 3083, 36840, 50988, 17169, 52738, +22307, 63234, 18325, 35423, 57163, 3925, 62367, 27623, 31919, 58742, 1126, +52768, 25674, 34722, 45510, 19375, 40331, 16275, 57216, 1331, 60379, 12044, +44816, 25461, 9291, 18906, 45567, 23943, 41265, 27034, 54019, 9033, 61586, +20634, 37483, 32224, 1601, 51520, 38107, 21199, 45628, 16323, 51816, 2287, +61438, 6739, 57419, 12724, 52933, 5648, 40359, 11724, 58955, 28942, 37655, +27179, 49868, 395, 32471, 55002, 3642, 57516, 9152, 28914, 46431, 23101, + 3021, 49580, 25502, 38316, 28996, 46031, 10335, 43833, 29713, 48928, 23100, + 9102, 61495, 24956, 36809, 27959, 39199, 7921, 51182, 17867, 58736, 30470, + 2436, 63958, 11744, 53229, 443, 54850, 7191, 56169, 31271, 5239, 44942, +11029, 53279, 8057, 56404, 2213, 30033, 43477, 21589, 10529, 22682, 50756, +35020, 2554, 62905, 31911, 4074, 44613, 17147, 36841, 49998, 21932, 45498, +19545, 31080, 48250, 13406, 57498, 8668, 30246, 46124, 22750, 5900, 35257, +55752, 22216, 45382, 19441, 47183, 29930, 16458, 54672, 18321, 57787, 36087, + 6125, 48258, 13982, 39029, 50787, 16228, 44070, 35789, 6521, 21703, 64652, +36364, 20741, 41911, 16284, 49843, 6965, 53991, 14636, 48889, 26413, 44773, + 5271, 63249, 10385, 37962, 1403, 47609, 19843, 31995, 50684, 10169, 58818, + 7597, 51371, 4346, 28376, 55504, 1747, 58113, 18072, 65463, 33980, 9265, +35505, 47240, 24894, 8170, 28716, 45695, 23258, 52715, 18986, 63556, 28021, +54445, 21226, 64632, 8138, 59299, 25404, 6298, 33323, 59714, 2273, 56585, + 9591, 30299, 57966, 21754, 60884, 35191, 2820, 34047, 54133, 7519, 39942, +61474, 3533, 55859, 18749, 65132, 26448, 55063, 19885, 63473, 28925, 2095, +61513, 26989, 50742, 10588, 43751, 5624, 42568, 28218, 7498, 24318, 47543, +35197, 25644, 53475, 21661, 48311, 18797, 51290, 28667, 38949, 22712, 57049, +32234, 10329, 42157, 4329, 44152, 12269, 54427, 6904, 29217, 42400, 32716, + 9306, 49828, 18761, 42813, 30428, 8732, 56727, 2182, 62032, 12521, 44927, +24688, 42689, 22011, 41801, 4751, 61079, 38318, 55459, 34668, 10220, 49321, + 2714, 38549, 29111, 36345, 3988, 56797, 16557, 58565, 27671, 7008, 62165, +10832, 58129, 30040, 46789, 18332, 41045, 26286, 46325, 21065, 61733, 24796, +43192, 16343, 47062, 4044, 43823, 13541, 57916, 38124, 17985, 44182, 20306, +37608, 52124, 14499, 40569, 61973, 16479, 55227, 6952, 63095, 16229, 57705, +19619, 62152, 12315, 35897, 49970, 15391, 53221, 5484, 56034, 21223, 60723, +14898, 45643, 5046, 39640, 49880, 19824, 42940, 25555, 41516, 18897, 46701, +34590, 11541, 51827, 26380, 39816, 21401, 33473, 41099, 24288, 62033, 6960, +53734, 34067, 64665, 5747, 23875, 54073, 18417, 37594, 57621, 12885, 63873, + 6140, 32094, 61353, 1439, 34460, 63028, 5212, 53736, 35255, 24816, 50410, + 2204, 41813, 64688, 25540, 11194, 49715, 6221, 56945, 35942, 7304, 50277, +25670, 38517, 10730, 50580, 19787, 34404, 58567, 3975, 22573, 57446, 28278, +12350, 59256, 43316, 28051, 8360, 54827, 254, 63459, 26981, 37168, 23846, +59079, 33368, 7658, 36073, 49658, 18907, 42838, 26350, 61627, 13636, 53082, + 3650, 39124, 21007, 43254, 32541, 22460, 34922, 45329, 17404, 41905, 12122, +44691, 3207, 27051, 49789, 22445, 11749, 58526, 32581, 51386, 16849, 37451, + 5774, 43406, 32263, 8859, 36428, 2173, 32108, 42017, 20104, 39231, 53387, +15081, 36708, 23668, 39275, 27905, 45474, 1670, 43742, 11231, 26755, 64764, +14841, 24829, 59423, 27364, 11996, 37152, 25381, 45748, 4948, 38718, 12418, +41969, 5990, 46375, 22021, 39076, 6605, 34814, 57878, 18499, 54910, 15595, +62694, 31436, 54463, 4225, 63089, 9328, 30339, 61476, 5326, 59460, 34270, +14883, 49602, 6783, 40839, 16183, 61679, 21060, 58625, 34269, 28458, 39847, +24233, 60474, 16483, 53496, 23180, 6541, 47014, 14167, 60604, 38961, 17786, +41879, 21700, 50694, 5688, 64769, 18017, 55749, 15433, 53138, 30729, 22244, + 492, 28343, 61839, 21388, 59473, 17283, 52798, 18860, 48118, 23693, 49514, +12690, 33679, 44855, 20087, 43457, 26823, 7820, 34284, 54454, 14057, 64157, + 119, 37078, 9555, 49026, 2211, 53763, 22934, 62379, 18977, 52770, 24346, + 8131, 47760, 12981, 61478, 30049, 1651, 59298, 32619, 12353, 31751, 42134, +22364, 32882, 39817, 2587, 50216, 6291, 33037, 57128, 2951, 40810, 29664, +46275, 13473, 44565, 3306, 36272, 29398, 62602, 21576, 10693, 55396, 6386, +59568, 9990, 62514, 29839, 16347, 65024, 35824, 14258, 59786, 3825, 64384, +10371, 49818, 15856, 46023, 27841, 3454, 39967, 30467, 45362, 14218, 49551, + 7090, 22188, 41147, 26940, 48613, 14751, 37439, 27651, 51197, 17955, 43894, +29063, 3447, 61836, 14530, 56442, 32431, 13656, 39602, 59087, 18759, 40911, +28643, 14796, 61972, 35155, 742, 63722, 32996, 23769, 61645, 9178, 30173, +44566, 35430, 7411, 33764, 53671, 23506, 13762, 38233, 50691, 18731, 45603, +29972, 11116, 48157, 2539, 38996, 11734, 62342, 16382, 30892, 57596, 6662, +53613, 21191, 43794, 18363, 60231, 26348, 55828, 2402, 62914, 11023, 57426, + 8454, 62266, 26359, 52379, 21182, 39118, 54865, 6563, 61007, 38668, 19209, +44869, 4323, 61930, 13428, 57236, 15524, 55466, 25172, 60692, 28664, 52459, +16640, 49144, 381, 28207, 62581, 10242, 55138, 5598, 61877, 15965, 54441, +19062, 55830, 40843, 8610, 48765, 37944, 5262, 46189, 30583, 54664, 13047, +34184, 58264, 21609, 60699, 24730, 56413, 30781, 52284, 13156, 48317, 29978, + 3595, 37666, 26942, 50451, 904, 46303, 21020, 41458, 18837, 49226, 37425, +17655, 42251, 26998, 8341, 56167, 23829, 65160, 29833, 53427, 794, 48458, +25391, 9212, 50150, 2866, 46931, 10695, 44646, 1979, 64838, 37644, 21135, +54524, 4600, 28159, 51859, 7794, 58442, 29532, 36860, 11113, 49136, 3281, +32236, 37119, 7743, 49851, 32041, 46596, 6288, 37640, 12480, 44293, 5198, +64606, 10714, 41701, 5962, 38871, 63276, 14179, 55959, 951, 35676, 64840, +22745, 4650, 47978, 33868, 23721, 50919, 32327, 15069, 65492, 33632, 8583, +29446, 45745, 4966, 40982, 64752, 33138, 53075, 7117, 49172, 25014, 36866, + 6460, 44197, 56874, 1151, 59965, 13058, 52507, 28604, 37258, 25926, 46489, +16554, 31337, 63844, 8199, 23865, 62299, 19849, 40831, 57427, 12466, 25137, +46887, 34006, 28404, 37689, 23173, 49178, 36004, 4182, 50097, 28623, 1441, +48502, 23178, 42900, 32095, 22273, 35549, 59132, 9787, 38199, 58394, 17666, +55264, 8559, 61683, 27133, 43671, 33074, 56127, 2150, 30328, 55497, 9994, +59847, 6720, 40977, 10855, 49069, 23028, 40362, 28069, 37333, 7772, 49039, +30120, 4005, 33699, 63109, 1762, 53065, 31210, 19887, 44388, 15827, 45954, + 3206, 39999, 26603, 52544, 15797, 62500, 25838, 46485, 845, 40584, 62896, + 3795, 31946, 61485, 9702, 39531, 57669, 17924, 64772, 19635, 46659, 24710, +51356, 580, 34601, 47115, 12640, 39969, 5425, 48783, 30633, 8746, 41535, +24119, 35762, 48872, 19268, 50755, 15717, 47895, 5092, 60002, 9890, 23532, +42851, 28309, 2486, 52575, 14945, 41839, 26547, 40262, 20187, 48447, 3778, +46238, 11414, 43686, 5910, 61389, 13051, 57648, 37371, 19054, 45161, 25925, +50973, 12219, 48601, 25473, 38574, 4802, 22313, 57738, 31761, 18816, 53055, +16534, 64113, 1526, 48291, 28144, 9021, 50383, 2987, 47727, 17021, 9267, +34360, 59890, 18989, 55627, 24818, 65058, 9378, 33039, 39345, 12811, 59062, + 8015, 56410, 33543, 112, 50654, 14322, 47737, 30972, 38312, 2039, 36453, +11011, 27176, 45102, 14954, 37790, 55669, 20237, 63848, 15724, 55007, 30452, +40436, 26575, 51608, 32642, 10910, 35315, 62699, 19611, 47288, 26434, 14696, +53702, 31328, 19969, 39736, 63138, 13146, 57784, 15715, 65308, 19531, 53262, +22865, 56594, 24570, 40205, 26869, 45274, 21432, 51337, 26074, 2918, 50666, +32855, 23626, 48880, 9920, 39775, 59465, 25630, 11571, 56768, 17040, 59779, +27489, 40873, 17658, 56629, 39520, 15701, 59908, 30940, 21360, 2377, 26385, +40751, 19361, 55910, 15828, 65319, 27208, 11206, 37303, 24734, 48388, 8073, +64961, 15056, 55019, 11443, 59813, 38138, 18943, 47777, 33691, 341, 52260, +26113, 7054, 34712, 51634, 1063, 65469, 12812, 56653, 2893, 32373, 21292, +58937, 34038, 15078, 57466, 36683, 7475, 52337, 12107, 57063, 992, 29882, +44297, 25224, 12575, 47479, 21946, 42711, 29710, 360, 58506, 10958, 19909, +51414, 39623, 19260, 42587, 17316, 46055, 21080, 65531, 16538, 58055, 6398, +54494, 20925, 61310, 18175, 52818, 23974, 45072, 12021, 32014, 42894, 9582, +59208, 6717, 56557, 27736, 54873, 14394, 60188, 1425, 48627, 11215, 51714, +19875, 58153, 27400, 10822, 48683, 14388, 35467, 53356, 22510, 4229, 44497, +30609, 51876, 4582, 41720, 21606, 60470, 15521, 27998, 64617, 22622, 58510, +17054, 36916, 63980, 14367, 52235, 5820, 30966, 40915, 1009, 38794, 23225, +36993, 28850, 33858, 63648, 16170, 57120, 34755, 24523, 64412, 9462, 54378, + 639, 59571, 28972, 37935, 22949, 51463, 18205, 40125, 21798, 44741, 29203, + 9077, 50048, 3420, 40720, 21310, 42330, 30056, 7400, 63264, 28800, 51593, +36228, 464, 60372, 13286, 41290, 22980, 42594, 20255, 53898, 37643, 18364, +43228, 22939, 40656, 62760, 25956, 1255, 44078, 8034, 45816, 21465, 48612, +16666, 60888, 30665, 17841, 45214, 28690, 13328, 64090, 29434, 57367, 3713, +61229, 13327, 54600, 19522, 59693, 41309, 8080, 64260, 31631, 5613, 41916, +26630, 38918, 22400, 7444, 58356, 12827, 3215, 63311, 27093, 48352, 13558, +42606, 3773, 38584, 63548, 88, 42130, 59920, 7281, 26804, 43760, 20531, +42575, 4361, 40682, 10906, 43280, 2098, 46253, 11726, 59912, 244, 57027, +14743, 60738, 30445, 36980, 8620, 60020, 16836, 53105, 27870, 14746, 44729, +35246, 7583, 39135, 3515, 47635, 6478, 50752, 32545, 1215, 51743, 36162, +12179, 56121, 31801, 62851, 10186, 45156, 5024, 41824, 20699, 46176, 30326, +50839, 14421, 34333, 44972, 21878, 41576, 1277, 43446, 28905, 5150, 54462, +10784, 59120, 39051, 15241, 48986, 30595, 61242, 20464, 40064, 23770, 43736, +17974, 40858, 52947, 13260, 44088, 8705, 53543, 32758, 17023, 63431, 25316, +33856, 40788, 20442, 51670, 5392, 63987, 32778, 1648, 60549, 13375, 50926, +34241, 23095, 36024, 62410, 24684, 8941, 64330, 3227, 56536, 30175, 52924, + 87, 36731, 30637, 46644, 11668, 42278, 976, 44244, 8838, 60193, 15607, +54819, 36996, 17564, 49914, 22376, 48808, 30340, 8572, 35054, 47149, 22990, +41799, 21283, 39620, 5805, 42728, 17155, 36471, 52844, 20648, 45085, 25194, + 6199, 34373, 50214, 23604, 8552, 34811, 55471, 12229, 48449, 8791, 35980, +44374, 3026, 46073, 11452, 53946, 116, 29665, 45915, 18628, 59649, 12662, +55327, 33740, 64882, 12325, 56766, 14351, 51267, 258, 47831, 11044, 49208, + 7123, 30635, 47599, 22091, 44389, 34208, 10387, 65153, 6858, 34524, 62900, +13697, 55679, 4016, 34666, 65504, 22789, 57081, 16290, 63691, 892, 58583, +35163, 16973, 46122, 12798, 20238, 43351, 26718, 47342, 4290, 51803, 10208, +62107, 5891, 30356, 63832, 13812, 57651, 4530, 20632, 53294, 38860, 17512, +61713, 33982, 2526, 36241, 54169, 5076, 49567, 34660, 3005, 51651, 22845, +40840, 11166, 24521, 44516, 20975, 42920, 25082, 46661, 4675, 21803, 51160, +35708, 17586, 60737, 11851, 53121, 204, 62134, 35178, 23803, 45372, 55455, +14947, 41332, 720, 57771, 24584, 56103, 12857, 33440, 48209, 23951, 13938, +35484, 48692, 1932, 51847, 29271, 55860, 16695, 59241, 30754, 64000, 18517, +53608, 20144, 36622, 29701, 43608, 9483, 47513, 17577, 45718, 25220, 41971, + 3875, 37798, 56367, 1861, 62285, 28744, 52754, 23153, 35829, 58503, 13688, +24640, 63295, 28528, 7374, 49567, 15159, 42324, 17808, 50344, 27358, 60653, +13456, 54456, 3173, 58757, 5913, 62727, 27150, 3484, 56186, 12634, 60958, +18047, 51320, 24470, 41841, 31816, 17137, 30112, 64779, 10229, 42069, 4542, +44889, 9446, 52514, 5559, 60981, 30401, 7420, 64219, 31404, 24338, 42532, + 4893, 30185, 41539, 3135, 53884, 9358, 61392, 23484, 48578, 16479, 53526, +37156, 17145, 41264, 6512, 65243, 9692, 47972, 4478, 44268, 34762, 29251, +50759, 24240, 8539, 38281, 25527, 49957, 14052, 26576, 63472, 19733, 56123, +25840, 37701, 29213, 46493, 5669, 25805, 65083, 3598, 41551, 13271, 37979, +64500, 20827, 5346, 55678, 12945, 63345, 27811, 56113, 11971, 65366, 4951, +28465, 60666, 1886, 55602, 29204, 59739, 16189, 61843, 42927, 14190, 28123, +63598, 19295, 30669, 57059, 17493, 54830, 25958, 33602, 41926, 20666, 57000, + 7968, 37685, 28812, 47260, 20820, 7399, 26736, 43708, 3846, 45648, 19309, +38497, 25953, 41447, 17845, 58898, 37324, 18610, 60681, 12900, 25019, 50113, +19812, 53632, 24237, 1146, 46677, 33834, 23607, 51281, 10678, 41909, 6814, +37938, 19831, 43475, 14931, 52610, 31314, 2500, 53965, 33108, 62653, 10582, +29458, 58985, 19224, 31574, 38714, 24525, 49056, 169, 36323, 28752, 50015, +35507, 8540, 27916, 51100, 12484, 25745, 57314, 27767, 13906, 44024, 11316, +63645, 21833, 36060, 60339, 6274, 55463, 37394, 14711, 51632, 5472, 62756, +12387, 39161, 57567, 28504, 2226, 49464, 22998, 42862, 19061, 46457, 14504, +51306, 17364, 34140, 24904, 44143, 18544, 50844, 33896, 9943, 36486, 50096, +22535, 8580, 57366, 32591, 54960, 11987, 60882, 34705, 8247, 25648, 49201, +34478, 8713, 27702, 48686, 6684, 32333, 49826, 7603, 24612, 55051, 22193, +64408, 4804, 54591, 13250, 62889, 31339, 18487, 46908, 21051, 44074, 13268, +63769, 9172, 22175, 44282, 36520, 10010, 48136, 21883, 35370, 54603, 5850, +58067, 35697, 598, 34317, 47710, 22230, 40188, 19751, 41789, 16623, 54205, +38091, 17257, 46829, 30587, 36448, 9445, 64309, 2145, 56158, 44305, 6004, +35232, 53617, 19270, 55794, 14602, 59768, 16341, 49024, 33915, 19972, 47681, +37214, 663, 58290, 19636, 62219, 47420, 12681, 59411, 18755, 45366, 28931, +13071, 33638, 41842, 8371, 29094, 57351, 20386, 52505, 25249, 38560, 15317, +54417, 17781, 49230, 12215, 21724, 43398, 62197, 14854, 57173, 5740, 60551, +38055, 3809, 49619, 29996, 10129, 64016, 2837, 22810, 57379, 39582, 16109, +53864, 24321, 59879, 2046, 25883, 51853, 38504, 17345, 44336, 3842, 37562, +15447, 45757, 21649, 51081, 37807, 18212, 42107, 15491, 46595, 9073, 38736, + 1081, 25816, 54094, 36071, 2049, 33913, 51688, 4772, 42341, 31507, 6928, +63031, 9926, 51645, 23115, 33147, 62125, 2120, 24961, 60641, 31754, 53317, +17812, 61335, 32230, 55173, 10448, 62771, 4773, 53655, 28606, 1871, 45615, + 6131, 39529, 56553, 2674, 44923, 9684, 41014, 57313, 26557, 7945, 60235, +15847, 47064, 25415, 48940, 12631, 53618, 25280, 47510, 8944, 39910, 60178, +35890, 7051, 22059, 49770, 35674, 8223, 34290, 56956, 14925, 59746, 17516, +40062, 56148, 11735, 21812, 64783, 30582, 59276, 5139, 46987, 36749, 8966, +35199, 62310, 18934, 38159, 25758, 53293, 8815, 20277, 47132, 33451, 1685, +64831, 30007, 38067, 18239, 52810, 26650, 10091, 47055, 33937, 13134, 56845, + 4860, 59305, 27664, 39723, 5866, 60177, 9497, 48706, 5069, 61272, 30869, +20415, 65125, 27060, 6021, 59650, 29182, 40764, 4172, 22228, 46137, 24342, +14747, 62476, 37459, 1155, 21263, 54800, 42008, 14611, 38886, 58057, 17610, +63698, 39261, 1772, 42306, 12320, 39171, 20159, 46591, 35343, 8123, 55355, +10952, 41428, 5796, 49295, 27143, 33748, 55656, 3080, 60964, 20179, 33297, +58747, 1890, 29575, 46645, 23440, 11368, 51284, 29698, 9551, 63798, 7803, +52351, 24223, 49077, 10542, 28454, 63558, 23561, 4260, 58120, 22335, 39501, +33622, 12851, 22880, 58439, 25233, 1620, 47117, 27110, 37661, 22831, 41686, +28023, 1949, 56986, 10148, 22906, 50765, 36125, 9683, 33444, 20999, 38731, +28005, 49576, 6153, 36426, 55976, 2450, 62185, 26170, 46709, 4314, 45145, +35105, 2899, 58070, 32740, 26464, 61023, 1167, 58927, 36066, 5411, 30909, +42214, 20098, 44669, 33088, 12337, 45231, 16154, 36744, 51488, 19346, 42080, +50584, 12746, 29812, 48021, 11176, 44105, 18433, 33064, 45661, 12080, 29206, +59669, 24382, 54179, 18913, 59085, 2206, 40892, 32395, 7457, 57785, 10347, +63822, 35132, 24198, 50767, 30918, 47560, 7270, 59186, 23202, 43884, 16008, +62228, 14302, 58831, 23831, 38112, 28578, 39828, 4013, 45191, 13395, 49866, +38485, 5223, 44827, 11757, 42428, 27688, 7783, 24445, 42822, 22240, 44229, +20145, 36460, 62049, 15499, 51832, 17031, 31937, 37561, 27246, 60408, 31500, +16546, 48142, 35547, 28236, 39144, 1584, 57833, 20409, 61267, 34425, 6184, +29858, 64974, 22508, 10970, 24873, 57217, 40402, 3134, 64568, 25228, 48279, + 1904, 44805, 8708, 52010, 29456, 7156, 33537, 47174, 2382, 43368, 15995, +41704, 20016, 63942, 21921, 51699, 3931, 32285, 58052, 1414, 40542, 29390, +58342, 25634, 12803, 45206, 26455, 9211, 58764, 32986, 486, 34858, 60070, +19276, 63141, 25078, 38430, 29517, 36492, 8536, 49870, 32730, 28411, 36157, +13817, 53699, 35836, 8074, 47163, 2710, 45325, 35618, 15208, 52760, 18795, +64634, 35920, 6715, 56923, 32233, 44463, 12362, 58587, 40468, 24573, 3804, +62801, 29101, 2505, 45518, 13828, 31370, 58885, 18850, 53727, 23217, 60954, + 520, 27418, 43557, 22382, 51511, 19383, 61191, 34466, 788, 50371, 14791, +46785, 26767, 51198, 5497, 41179, 25422, 64312, 16589, 37820, 62332, 17363, +55424, 24493, 37930, 32603, 13980, 60383, 36, 34324, 50401, 7385, 39943, +48759, 15659, 44891, 7210, 53310, 29530, 48421, 15844, 51088, 37101, 13301, +62742, 3142, 54550, 8037, 63265, 35903, 17123, 34899, 61531, 13881, 25121, +54977, 43119, 2060, 51096, 8508, 34258, 65373, 18190, 40221, 30874, 14642, +52948, 17734, 63200, 11695, 27817, 50070, 12408, 45739, 7217, 39761, 31302, +16790, 51878, 26111, 48074, 2487, 53637, 9600, 28087, 54286, 22392, 59335, + 4944, 32097, 57859, 8248, 33154, 62110, 494, 34588, 61176, 4909, 38974, +57014, 6526, 62587, 36415, 5, 41357, 10428, 48206, 34389, 25547, 61098, +12796, 52314, 31649, 44599, 20333, 3690, 56207, 11562, 65228, 19021, 41087, +13106, 51002, 8043, 47398, 29194, 39087, 9463, 48399, 1813, 58032, 14655, +65379, 24360, 54667, 32030, 17150, 57609, 15588, 63229, 1358, 54207, 36358, +59573, 2823, 56531, 11314, 51573, 8311, 32153, 40851, 25517, 63943, 7765, +58037, 12386, 36465, 4750, 52539, 11706, 62287, 5375, 54560, 31952, 15274, +45209, 2935, 28142, 56101, 40783, 3903, 50892, 31977, 48911, 14656, 28973, +54593, 18423, 41611, 15730, 53418, 35581, 26202, 42475, 16163, 61568, 41366, +18685, 52787, 22357, 54779, 13110, 49760, 335, 31260, 39956, 24478, 47302, +14943, 44665, 16813, 50282, 4296, 35503, 53943, 19069, 56902, 39790, 15251, +50650, 23299, 45514, 7417, 43456, 3983, 53600, 9791, 55353, 15148, 65380, +21678, 56607, 1627, 63998, 43189, 26411, 11722, 58768, 16351, 54477, 17245, +61712, 31388, 1703, 44837, 10390, 51272, 28033, 40241, 3472, 22995, 52349, +28286, 13415, 60197, 35436, 15918, 50189, 25620, 35670, 52308, 5447, 34773, +44559, 6381, 48034, 14559, 34012, 57892, 13988, 65269, 2973, 38605, 31497, +16846, 59588, 23900, 40732, 32462, 10725, 35997, 60300, 15935, 49138, 11934, +43302, 3704, 26882, 43887, 6354, 45580, 2100, 57080, 42860, 18196, 30979, +43930, 19314, 58530, 33258, 10994, 52501, 27424, 61863, 19747, 41445, 3553, +63372, 8895, 30911, 43200, 21553, 48050, 18294, 45375, 15010, 50156, 25862, +53336, 3880, 32582, 45896, 5965, 27152, 60330, 22225, 56732, 25327, 267, +46241, 9005, 59589, 34514, 6786, 40550, 24134, 54692, 43086, 16958, 61922, +22879, 52937, 15770, 47584, 35251, 8291, 63643, 13396, 59534, 23210, 34994, +64757, 1632, 41367, 13190, 47694, 17631, 40228, 30640, 14558, 38332, 51709, +17024, 30951, 50411, 14006, 22351, 47631, 27517, 16373, 53125, 21252, 64886, +30119, 8086, 53463, 20392, 46914, 22194, 542, 25967, 49798, 30100, 41624, +21091, 36903, 2930, 49192, 27390, 34748, 64307, 24423, 921, 50495, 32228, +18751, 53018, 22026, 49300, 34421, 10230, 40327, 6423, 51010, 22738, 39587, +30561, 48750, 21039, 9823, 31524, 49812, 15342, 39782, 27832, 58211, 13342, +55552, 3319, 28944, 46179, 21760, 43876, 20365, 64208, 23027, 39834, 21084, +44194, 18636, 37044, 63858, 11494, 38984, 50284, 10057, 24396, 58751, 16890, +44176, 1371, 61519, 37328, 6613, 43804, 9841, 60568, 31003, 13129, 65355, + 2851, 53654, 31059, 4811, 60155, 11278, 38687, 5981, 58616, 25700, 34415, +53843, 7360, 60063, 10112, 54715, 32741, 64651, 11898, 31242, 62597, 7717, +49160, 3216, 28442, 43898, 5935, 63539, 13718, 55182, 27387, 39521, 18436, +45339, 20803, 47444, 3100, 43618, 12240, 45990, 19943, 4030, 50471, 33701, +28255, 39693, 25015, 43486, 9394, 46915, 33930, 25675, 60554, 16137, 43748, +19670, 64097, 35827, 7512, 33628, 50604, 5814, 47879, 31525, 8148, 61889, +10366, 23030, 60525, 26407, 11420, 57532, 32786, 26287, 50972, 7111, 48822, +34928, 25751, 56999, 9313, 47570, 36050, 11715, 58025, 4435, 65051, 19596, +31212, 38320, 7956, 56775, 19840, 59551, 33179, 14361, 61412, 31594, 48398, +23154, 8681, 35801, 62526, 12437, 53788, 2484, 22822, 61326, 31492, 543, +36777, 9866, 57110, 27825, 38397, 24106, 60621, 6668, 57385, 10993, 39317, +30883, 58801, 5876, 44586, 12960, 39767, 57952, 15550, 64550, 37386, 11725, +43971, 14365, 37226, 55249, 20477, 49977, 15390, 44825, 27238, 51334, 824, +32104, 7535, 38506, 33793, 1864, 28839, 64893, 4864, 57418, 20772, 39565, +28301, 37312, 7464, 50115, 16744, 46801, 26510, 62741, 23478, 55788, 1986, +65332, 35758, 6215, 24586, 58332, 9293, 35702, 63893, 32503, 11012, 55495, +38092, 8993, 44055, 5079, 46206, 27283, 37534, 4388, 28964, 62458, 33043, +55034, 9895, 60837, 8171, 57334, 28221, 54393, 21905, 61018, 4080, 20985, +40632, 56201, 16742, 60556, 36639, 11825, 43384, 5568, 27876, 59253, 19580, +61554, 29362, 3000, 55917, 8718, 23637, 41113, 64083, 16507, 37359, 26387, +65303, 940, 34856, 46985, 17525, 50421, 37970, 14339, 53325, 62, 49547, +10603, 45223, 2378, 50939, 12295, 58388, 7579, 26129, 53011, 23429, 15942, +62499, 37381, 13185, 41667, 21006, 51804, 27724, 12591, 47958, 22805, 50671, +34570, 5446, 51389, 22405, 38183, 33063, 13425, 49624, 35213, 24690, 48807, +28429, 37396, 15125, 61203, 19400, 46066, 21217, 42496, 26878, 5726, 21951, +48032, 39588, 17623, 42414, 21680, 36608, 61980, 17510, 48162, 24777, 37418, +32547, 15754, 50280, 33148, 983, 62293, 26570, 38820, 18677, 52876, 23762, +39540, 61957, 21565, 54903, 1229, 63762, 7026, 29018, 57638, 19399, 53806, + 5606, 34731, 47914, 822, 49830, 10710, 54167, 20717, 63228, 17945, 43546, +21577, 57339, 37975, 19436, 54608, 41148, 14805, 46760, 30264, 38946, 3485, +62621, 12096, 41462, 30614, 5250, 45497, 15379, 51205, 26924, 6339, 52153, +17901, 48501, 14327, 53971, 208, 52914, 28155, 34405, 45834, 9052, 39553, +49837, 27983, 9913, 20310, 64650, 29041, 49526, 4846, 45783, 27463, 35739, +43154, 6285, 46392, 24691, 49651, 33324, 21224, 50609, 12274, 43724, 16224, +46474, 34186, 24017, 65173, 114, 27908, 41392, 21359, 63765, 27306, 8176, +49963, 31777, 16616, 53158, 4539, 62717, 30594, 9511, 41510, 24823, 56401, + 3307, 60751, 20723, 35568, 64172, 22278, 58744, 14950, 55845, 40969, 12947, +44843, 29453, 50506, 699, 46911, 14417, 58029, 24603, 39061, 9981, 52321, + 7039, 38469, 11505, 46293, 16789, 50123, 28620, 44743, 20314, 46541, 25808, + 1325, 52626, 42178, 4042, 31728, 58748, 24062, 55025, 16979, 61510, 14065, +58300, 39028, 11335, 42675, 17309, 46382, 23200, 39661, 33264, 5728, 37894, +10462, 39825, 30708, 54735, 8975, 27022, 45524, 6001, 26354, 61949, 20895, +55632, 35796, 773, 46013, 14803, 43538, 34684, 25856, 35929, 58381, 4941, +34091, 51066, 6738, 45986, 12557, 44526, 24092, 7490, 63144, 31410, 5169, +61445, 23816, 39990, 30576, 55392, 16022, 59482, 34847, 23479, 41903, 30227, +47466, 4960, 44138, 35059, 214, 29514, 54783, 5940, 64059, 9620, 34336, +56332, 20319, 63592, 624, 24225, 46656, 29788, 7947, 56772, 19098, 63318, +28686, 9792, 57796, 1740, 64299, 10419, 45157, 4183, 40965, 11480, 52532, + 2243, 61588, 30628, 56296, 34217, 666, 52216, 13704, 59395, 25268, 11299, +53186, 29558, 8819, 56678, 2433, 64322, 8173, 58892, 28685, 36490, 11373, +59744, 32532, 7234, 58190, 15330, 10987, 40928, 17475, 45717, 14516, 35192, +48080, 3701, 40563, 12709, 58307, 13991, 27363, 59216, 18115, 38579, 25247, +45755, 2313, 41131, 11554, 51537, 644, 26894, 47252, 4232, 28252, 51123, + 1278, 64894, 16561, 45734, 20105, 36495, 59215, 16167, 55511, 23527, 62977, + 1717, 33657, 64066, 21908, 39094, 27739, 42540, 21695, 43605, 13400, 63398, + 2873, 24634, 50994, 22279, 899, 56205, 37494, 51367, 3881, 41623, 13707, +57544, 34151, 9035, 64464, 12996, 54882, 17310, 57881, 13638, 65383, 5103, +34857, 59981, 963, 55560, 27443, 4082, 50489, 19900, 35348, 56390, 11624, +52221, 2774, 48187, 29860, 36687, 1283, 46747, 25955, 41199, 19125, 48961, +27570, 60204, 5242, 36418, 29047, 39165, 13580, 45965, 10766, 47807, 4656, +42340, 30978, 18328, 51400, 23184, 10162, 34080, 61539, 19347, 53136, 30538, + 3353, 61970, 32142, 19250, 44841, 20986, 53546, 29103, 41390, 9687, 60481, + 3258, 54816, 7408, 59127, 39644, 23459, 14616, 61762, 17873, 40795, 15137, +33351, 39382, 1212, 49261, 31914, 16685, 56020, 5945, 64100, 29584, 1722, +52730, 18708, 62793, 23723, 56603, 19491, 49743, 15731, 37308, 58275, 14785, +32762, 47762, 3180, 41549, 10868, 47217, 24219, 33906, 56588, 9108, 63821, +13855, 46959, 17992, 45238, 14723, 29801, 60949, 19922, 54899, 18502, 59170, +29403, 40301, 19366, 49174, 35459, 11274, 58774, 6539, 25746, 42432, 29662, + 9175, 64672, 740, 55575, 13795, 61068, 17086, 56818, 25809, 48518, 17878, +45313, 35966, 22055, 45881, 4075, 42168, 13641, 39421, 58568, 16608, 62344, +40326, 11964, 43052, 866, 46221, 22714, 42362, 32302, 17097, 52258, 32665, +56771, 16124, 65400, 29249, 38580, 13440, 50485, 8122, 19801, 60794, 30293, +44170, 4606, 54455, 38003, 1289, 40399, 51042, 18714, 46531, 21640, 44031, +14444, 51941, 17099, 54293, 4528, 48513, 27334, 34554, 47410, 55903, 6567, +60658, 34161, 24098, 56814, 15752, 62395, 20573, 43050, 23552, 50323, 37746, + 8667, 31735, 61494, 5477, 34517, 55940, 23146, 60778, 18916, 34323, 65139, +17533, 39708, 61264, 13061, 37309, 24040, 53404, 7899, 55906, 23935, 1096, +33056, 40334, 9709, 37336, 28573, 43287, 13882, 44801, 2541, 61699, 7207, +56957, 25402, 47945, 18541, 40076, 55275, 13821, 65156, 41588, 23580, 13162, +33697, 58850, 18875, 52198, 25443, 15878, 47840, 21040, 44700, 25673, 37257, + 8254, 40459, 23270, 47860, 14565, 28556, 45347, 18747, 37856, 54317, 29418, + 8486, 48947, 15836, 42741, 24501, 37635, 20099, 54389, 18572, 60877, 21588, +57471, 13035, 55740, 2311, 39220, 16094, 53102, 18128, 64636, 7793, 57880, +23631, 54209, 33167, 25817, 52057, 9836, 63000, 3417, 35689, 54754, 24750, +11995, 42763, 5897, 40714, 48570, 17772, 36658, 56606, 322, 61084, 25026, + 4661, 58071, 33601, 23043, 39989, 15909, 37245, 31908, 11807, 49432, 34422, +28488, 51121, 2661, 63621, 9717, 51478, 24785, 41056, 7315, 50923, 24515, +45455, 15111, 37647, 59348, 15829, 42643, 13644, 44950, 165, 42399, 6254, +60157, 33561, 2310, 41745, 64857, 16088, 54519, 29697, 57741, 14155, 64426, + 7116, 28673, 50249, 21357, 52908, 348, 60453, 27329, 55443, 2079, 39713, +33385, 3801, 38890, 10359, 51382, 1660, 57067, 9338, 28644, 46655, 18023, +36947, 63002, 3929, 54053, 27112, 39295, 33454, 21930, 41010, 28657, 46408, + 9853, 42829, 7894, 59846, 30337, 2696, 58143, 26561, 60887, 17807, 55184, +32700, 10353, 45337, 3435, 26396, 54804, 33623, 59095, 14250, 54055, 7669, +38241, 47880, 26162, 8365, 23546, 44262, 26064, 6913, 57278, 33222, 23700, +36225, 46652, 26351, 9431, 21222, 49600, 31831, 19601, 65242, 17033, 32193, +58464, 9470, 38463, 30309, 48566, 6363, 41822, 23615, 42669, 15910, 64526, + 565, 29086, 17993, 46670, 31259, 2938, 49853, 9811, 39266, 30774, 51465, + 7909, 65450, 2569, 21969, 56674, 41717, 15608, 52929, 28681, 10058, 46498, + 6193, 31057, 44241, 9667, 53964, 6919, 21696, 32232, 56265, 10909, 29557, +43601, 18421, 49835, 29048, 62109, 20757, 53452, 19247, 59801, 7615, 57475, +25317, 50877, 16763, 40791, 12491, 37350, 4970, 57751, 30400, 6967, 36696, +31885, 6038, 60237, 36202, 7541, 26157, 44251, 1374, 32942, 59758, 4090, +55772, 30187, 1699, 62962, 28308, 53117, 2620, 30023, 56315, 39367, 10666, +64176, 6095, 20969, 61284, 36088, 25534, 62030, 6531, 57689, 10739, 62503, + 5290, 42096, 11170, 39470, 6264, 47636, 34311, 23400, 63280, 32069, 11440, +47045, 22613, 43251, 31640, 2750, 36753, 8968, 60493, 21417, 33582, 38910, +27216, 60000, 6627, 38362, 56255, 21195, 64551, 27634, 11816, 59658, 6441, +30900, 40559, 15691, 48364, 36254, 17963, 52018, 14938, 63220, 27950, 53372, +19478, 64423, 4763, 56687, 8389, 37319, 25882, 42713, 30919, 18278, 55607, +14847, 64569, 36596, 2452, 28704, 53769, 6945, 32549, 48735, 4297, 51745, +27656, 61357, 16842, 47957, 12870, 23445, 52745, 29032, 7957, 38939, 33726, + 6626, 25465, 44034, 20109, 48617, 38228, 3893, 41791, 12270, 40461, 32564, + 7983, 31717, 46676, 17456, 52288, 27729, 62475, 32595, 23223, 33837, 41610, +25655, 65071, 2800, 54451, 32579, 19155, 43604, 20777, 47026, 7141, 51748, +10325, 59165, 3213, 33254, 65296, 22378, 52374, 34676, 12196, 50746, 32206, + 8643, 33805, 50166, 5663, 25284, 53149, 35527, 29158, 47082, 20876, 6059, +24562, 44424, 31067, 63013, 20807, 3099, 60628, 31194, 49255, 1138, 36884, +51020, 16444, 44934, 3322, 64175, 14098, 55541, 32292, 63064, 35183, 7088, +46953, 12485, 45389, 5393, 36367, 27827, 61404, 3466, 25126, 57935, 20069, +60855, 12561, 51430, 35917, 22697, 43597, 62753, 35866, 14082, 58883, 36343, +21141, 52661, 394, 27718, 45383, 15277, 33335, 46197, 28115, 3999, 48556, +21251, 39331, 64579, 15013, 36950, 58023, 16173, 48468, 35642, 29109, 57678, +41907, 3149, 49001, 39907, 4669, 63616, 11648, 46390, 8504, 42411, 3956, +44085, 12918, 46617, 35716, 5328, 34361, 56018, 22851, 62703, 20126, 51224, +10990, 44413, 26552, 58232, 20550, 48006, 17707, 45612, 29840, 53544, 11912, +62164, 38590, 20498, 42559, 18330, 38246, 49971, 15180, 45566, 18769, 60410, +41463, 7086, 22505, 52389, 23845, 48413, 32997, 10171, 46947, 2399, 30406, +50730, 22590, 40785, 17081, 45267, 20784, 53511, 23979, 65104, 28242, 10008, +45276, 7248, 50419, 37382, 1132, 52277, 16750, 55169, 28035, 62751, 19283, +41203, 151, 56828, 8494, 47728, 14193, 44371, 28721, 2633, 46052, 10401, +36968, 51215, 20327, 44357, 14811, 50783, 33243, 8075, 64262, 31197, 1073, +47521, 8621, 42948, 2300, 47893, 13986, 44303, 20167, 46362, 16254, 60124, + 6096, 57559, 37095, 3578, 47571, 30143, 17709, 33546, 60278, 19143, 44576, +12445, 26153, 64981, 35324, 11008, 30650, 53316, 22341, 38721, 63321, 9630, +48575, 24651, 51781, 17827, 62979, 40427, 2508, 52593, 10001, 24929, 54341, +22667, 62281, 20405, 48137, 23966, 64645, 13371, 58840, 6373, 48653, 11983, +53673, 5502, 61118, 13225, 51729, 15603, 31583, 41012, 8264, 51131, 12799, +60839, 15285, 57484, 24086, 37526, 27033, 51317, 20292, 36514, 1993, 32284, +15596, 62790, 36812, 16875, 47953, 19368, 38688, 29732, 62035, 19802, 8442, +57576, 13876, 64477, 31548, 52687, 19869, 3856, 26974, 50458, 39739, 15537, +53527, 19908, 62859, 18273, 31939, 59782, 11068, 49675, 20541, 42063, 5885, +44787, 1841, 24560, 60021, 22083, 56321, 24497, 60629, 20079, 52558, 15023, +50101, 34283, 10067, 47160, 1898, 39343, 31642, 7626, 53860, 9968, 24693, + 4671, 54311, 26338, 8530, 64137, 25550, 34147, 60393, 18247, 38434, 56177, +10216, 63032, 32761, 12830, 59614, 183, 24403, 50052, 27402, 3378, 52870, +25333, 2042, 50322, 9396, 20201, 63045, 32921, 17012, 51744, 34134, 26716, +35700, 56233, 15868, 61304, 25789, 54896, 31654, 18820, 49931, 29524, 8875, +45289, 1422, 41933, 27149, 61283, 16162, 50226, 1801, 42208, 11200, 52058, + 2650, 63676, 21524, 37262, 31340, 6529, 54709, 10722, 61145, 6973, 32110, +56761, 5725, 37693, 11552, 24901, 62355, 36455, 3687, 42807, 16754, 53468, +39779, 15492, 54803, 38168, 17544, 44222, 803, 51574, 30750, 59398, 3392, +42982, 13843, 37248, 59155, 18794, 54787, 26746, 15312, 61756, 12795, 39881, + 5920, 42536, 11865, 50445, 29761, 48841, 17612, 42681, 22490, 53233, 18994, +61208, 34617, 25449, 57723, 21895, 1350, 54993, 26712, 63412, 4210, 58912, +29567, 14176, 54181, 35260, 26316, 56934, 17432, 59735, 26732, 39230, 30511, +62411, 730, 52854, 22306, 48391, 13502, 26477, 62000, 34827, 8665, 57159, +41778, 5209, 49890, 22071, 58556, 36168, 8905, 22652, 57714, 39773, 7351, +45270, 3449, 31673, 36815, 21291, 60968, 448, 45804, 11135, 32096, 59071, +27666, 34326, 61077, 15047, 43810, 5722, 56440, 10616, 53199, 4639, 43389, +24918, 37981, 20892, 42730, 22169, 47488, 18286, 46004, 6906, 38756, 56447, +16870, 61772, 25095, 38294, 1814, 45492, 29620, 4324, 63441, 11350, 39699, + 7422, 53706, 28158, 55844, 42104, 4743, 24926, 54918, 1029, 65112, 10882, +48494, 2335, 40189, 51581, 23396, 41192, 1643, 48927, 12356, 61051, 32620, +55205, 9337, 28265, 45025, 6244, 41947, 10849, 46859, 4677, 39056, 27328, +34632, 58035, 11895, 53241, 17198, 57537, 40018, 10500, 42849, 2729, 39090, +10893, 43337, 35, 39972, 21086, 64931, 29274, 36502, 26859, 62432, 16683, +57695, 29837, 44999, 51801, 33253, 16807, 48056, 29375, 40842, 5331, 47605, +10963, 54504, 6088, 25596, 42562, 17816, 50771, 36931, 19505, 54913, 33643, + 7392, 61826, 40509, 14137, 42890, 63909, 23401, 34791, 46168, 26264, 13481, +58552, 23730, 9858, 59959, 2325, 22778, 48943, 29956, 10476, 38471, 422, +64729, 14606, 60567, 23694, 35259, 54490, 11708, 47249, 4068, 37915, 23655, +62921, 15569, 55918, 35561, 24244, 39898, 5391, 49775, 16821, 46854, 22675, +40365, 26231, 51316, 17747, 36338, 27016, 58765, 30532, 48430, 17625, 32162, +57005, 12810, 63007, 1360, 26185, 59585, 23404, 8724, 64755, 12686, 56140, +28266, 7805, 34354, 48492, 18183, 51974, 495, 31471, 41560, 4253, 34118, +45921, 21585, 43915, 23843, 59730, 20450, 56147, 36054, 6914, 25254, 58598, +12695, 65399, 1562, 40425, 10886, 50194, 5273, 30812, 47705, 29411, 39378, + 9296, 34441, 45806, 18938, 39904, 49454, 6813, 43964, 12940, 38674, 29399, +36289, 6317, 55238, 9580, 24437, 41846, 31957, 8901, 32664, 41638, 51661, +10643, 21986, 46271, 25966, 11876, 63289, 13816, 39374, 975, 51358, 29234, +44300, 2162, 25148, 63957, 18491, 55877, 13936, 58624, 5243, 40986, 31463, +19228, 56721, 20839, 37653, 12605, 45094, 1595, 49196, 27201, 37406, 17552, +44721, 26779, 39452, 19856, 55702, 14214, 63710, 519, 57310, 10060, 36802, +30294, 59737, 24444, 876, 47583, 28757, 5721, 52587, 32013, 17332, 54355, +42343, 19027, 49482, 22728, 61559, 16350, 47242, 6768, 21672, 57593, 39650, +13846, 45763, 29198, 44281, 15673, 56575, 21971, 32303, 6463, 59374, 33268, +25606, 39332, 6895, 46484, 16613, 36986, 57998, 13648, 61938, 32977, 56574, +21601, 55211, 19420, 63285, 222, 31073, 40828, 25158, 37808, 29737, 15107, +51917, 27194, 50497, 18645, 53379, 26482, 61776, 12675, 44334, 5203, 54767, +11239, 52373, 6033, 48389, 34560, 2410, 20736, 12239, 65068, 38901, 1534, +57503, 18976, 53740, 23549, 42347, 21660, 36747, 62006, 1318, 55209, 7761, +26910, 45305, 11645, 41676, 47965, 17134, 31809, 59355, 9001, 32945, 11091, +60085, 4927, 55000, 36153, 16, 35120, 45361, 20202, 50575, 39833, 6803, +37035, 58329, 17654, 52835, 21492, 41896, 3609, 46779, 13557, 31456, 64542, +22338, 33011, 54124, 8048, 34386, 45208, 28608, 8347, 60730, 15947, 54297, +25279, 59133, 14081, 63381, 694, 43294, 12071, 64987, 2924, 52190, 10141, +44079, 256, 54018, 9051, 44778, 21960, 36914, 29875, 47999, 5422, 33866, +49696, 32155, 46451, 15264, 38836, 63615, 21958, 10319, 61676, 29062, 43729, +14955, 63931, 23913, 56313, 8382, 58491, 3480, 50181, 10488, 45371, 1976, +22783, 63338, 34873, 4460, 38172, 26957, 49047, 20734, 44953, 18062, 63914, +37491, 7273, 62520, 18258, 56941, 25302, 11133, 55826, 2110, 24909, 61693, +22439, 55437, 4454, 61359, 11595, 49950, 22640, 36671, 58477, 13132, 56025, +27422, 65449, 1969, 23128, 39741, 59667, 385, 54863, 30905, 37017, 25104, +48338, 31330, 16631, 61741, 19039, 55346, 34470, 10138, 49988, 28897, 41867, +25627, 49402, 15600, 53067, 37051, 8103, 49836, 4423, 63608, 18736, 55012, +30253, 8545, 51742, 32098, 1399, 62906, 11352, 50368, 2925, 45128, 34989, +28879, 39407, 25272, 64225, 3478, 21670, 44648, 34880, 11065, 58566, 42052, +14629, 64919, 36878, 6027, 31628, 56596, 1249, 45228, 13265, 43740, 23418, +64254, 34394, 9384, 27720, 60179, 22263, 7696, 35300, 51117, 28426, 12537, +62873, 36137, 17381, 52208, 15493, 55539, 33944, 23687, 65007, 489, 22355, +49790, 25020, 2161, 27773, 40718, 7978, 43335, 14736, 46187, 17740, 62128, + 3741, 54871, 7741, 64582, 33228, 5029, 35078, 63461, 7450, 41293, 21889, +55403, 17587, 47946, 19085, 43111, 22265, 42128, 13577, 24093, 60263, 40830, +45863, 6327, 31405, 50508, 15067, 44337, 12603, 63322, 3110, 52029, 11679, +28540, 47440, 19212, 38226, 64265, 4468, 52524, 15395, 30102, 55689, 5337, +36745, 21431, 56563, 42450, 15735, 39103, 12246, 47291, 28316, 64256, 5737, +55371, 11050, 30717, 65194, 23812, 3342, 40876, 30394, 48218, 11129, 58105, +27467, 51479, 5746, 39339, 14759, 59595, 19049, 49566, 26180, 4565, 58409, +19940, 33875, 46113, 10503, 41565, 3261, 44590, 30432, 51914, 18889, 48076, +23510, 45264, 21626, 40983, 19262, 63739, 14917, 39811, 26305, 59107, 7633, +51994, 13597, 41091, 61043, 20496, 3038, 25823, 58417, 5026, 27153, 52756, +41614, 24792, 5692, 58114, 33515, 9015, 49101, 20603, 40498, 28734, 36449, +25933, 64839, 28629, 33555, 53342, 10293, 47207, 28635, 50865, 15992, 34282, +59137, 7914, 53771, 33205, 15336, 49134, 13009, 44029, 2788, 50315, 38184, +21838, 44908, 33098, 12033, 46612, 16615, 42358, 20295, 45390, 18474, 64811, + 3442, 28934, 48103, 5398, 43906, 16796, 36709, 53343, 7608, 27958, 44123, +14623, 50559, 3765, 56427, 8261, 59876, 34652, 5923, 47690, 14109, 51127, +27386, 37329, 1312, 47472, 11716, 33053, 59804, 3592, 26991, 62362, 24057, +46432, 22408, 42469, 13858, 39695, 65187, 19956, 58588, 36545, 18786, 41943, +22918, 60800, 27196, 11580, 50614, 7640, 45665, 15913, 40440, 55664, 13624, +63373, 31044, 17690, 33851, 48520, 9272, 26168, 60338, 12368, 38379, 27558, +34358, 58688, 3802, 40641, 12768, 50942, 30171, 49246, 3580, 41057, 61725, +23542, 4561, 58368, 42398, 19, 50851, 30486, 8959, 43151, 2740, 59815, + 9848, 29507, 51753, 39515, 8689, 43619, 31199, 52500, 15956, 60894, 26672, +54649, 9616, 51776, 22894, 47930, 15825, 30996, 43811, 17922, 59086, 12260, +29317, 45809, 15744, 48972, 4239, 37105, 28767, 60087, 1068, 57070, 17321, +63638, 35712, 8903, 27249, 19466, 59391, 21416, 35401, 61661, 6955, 37787, +19766, 40218, 22502, 57629, 34028, 9198, 60631, 32207, 16096, 44190, 25557, +62681, 1654, 37852, 20092, 51959, 34318, 887, 30091, 54422, 22916, 61940, +19081, 51364, 16055, 31715, 37931, 25981, 46856, 15461, 49601, 28715, 62815, + 6495, 25999, 53783, 35763, 16278, 33591, 58803, 25298, 48478, 719, 43032, +10570, 64132, 35885, 30236, 50520, 333, 27766, 65472, 20444, 56356, 34548, + 8704, 27647, 57496, 5291, 38737, 10904, 59475, 7573, 49275, 34671, 28074, +50093, 2270, 37942, 31989, 18970, 58139, 28213, 9788, 51461, 30057, 43048, +17982, 50219, 37076, 1681, 20106, 55117, 35378, 15937, 51304, 26635, 38122, + 1589, 62386, 13962, 54638, 15115, 38709, 7290, 47823, 18016, 44101, 20002, +55907, 7659, 62319, 3628, 29561, 43243, 25186, 434, 52166, 23975, 40874, +19923, 60564, 31414, 6258, 65197, 14613, 57997, 37776, 3138, 63853, 27901, +51483, 195, 41507, 12602, 52457, 38466, 20758, 61640, 23543, 55091, 12449, +29127, 63498, 36370, 18292, 58813, 22945, 45478, 19294, 43440, 15188, 50195, +24566, 40872, 32793, 4404, 61994, 13157, 56549, 22715, 65498, 7582, 38658, +29815, 54033, 16598, 40567, 14285, 55931, 5320, 60165, 24535, 3217, 45424, + 9297, 28339, 51082, 6517, 48407, 9509, 33881, 57901, 18633, 61939, 32552, +51818, 8727, 28205, 50175, 5270, 36556, 55220, 3032, 22049, 57778, 40072, +18480, 51621, 21567, 62631, 15530, 31114, 53141, 17113, 57201, 535, 43467, +17458, 52912, 33390, 9749, 53524, 38396, 18664, 33608, 47603, 14681, 39679, +63758, 17959, 47473, 22608, 36107, 44027, 14494, 33459, 58836, 20485, 63826, + 5560, 47797, 32314, 3157, 36133, 30407, 36818, 6515, 32222, 58763, 39277, + 916, 49952, 36082, 24090, 55041, 1960, 59306, 34610, 25780, 63297, 9221, +32701, 37966, 25908, 48930, 4088, 52755, 29820, 55999, 41350, 11195, 49279, + 4169, 27699, 52392, 24281, 59152, 13513, 44061, 4729, 45571, 21185, 40140, + 2931, 49663, 31176, 8836, 35955, 22084, 57914, 30841, 8337, 62535, 25497, +49348, 7725, 40744, 2751, 44125, 8211, 40091, 54130, 13696, 60832, 1506, +56831, 9331, 42226, 13571, 34368, 44860, 20239, 8101, 63694, 2167, 41244, + 9777, 30485, 52620, 23293, 39271, 17889, 47496, 13153, 22936, 55439, 35263, + 7098, 50797, 11341, 23171, 60599, 36116, 12986, 33532, 61634, 25752, 35168, +54381, 22105, 4735, 60266, 11929, 55096, 15548, 65048, 39448, 3476, 46154, +23038, 36443, 57054, 8143, 62814, 11669, 30958, 60317, 38388, 9547, 46494, +31224, 3721, 61114, 13292, 53151, 30073, 46697, 5359, 49291, 23155, 57255, +13479, 60350, 3022, 39578, 14685, 33499, 41958, 23718, 55458, 13702, 59906, +39355, 20455, 61604, 4570, 52630, 35797, 16304, 48546, 32241, 51125, 8362, +27079, 49689, 35166, 9069, 30865, 60616, 21788, 47366, 33014, 10446, 45990, +14730, 40386, 4153, 49193, 41889, 20495, 3163, 48377, 7069, 40598, 10798, +65148, 27498, 37889, 2847, 63162, 9961, 56231, 21085, 43972, 24234, 40699, +14477, 34998, 50997, 17354, 45265, 9786, 43339, 1102, 51174, 26680, 37056, +11885, 34162, 49516, 15448, 37907, 56937, 14694, 60008, 35253, 21044, 46776, + 4902, 43097, 24508, 1989, 21010, 59243, 37559, 18457, 45819, 11786, 40162, +28747, 49749, 33162, 326, 46385, 8431, 41976, 4666, 47499, 9917, 35434, +45876, 25008, 38525, 21887, 63519, 14338, 25940, 46748, 30127, 11415, 64720, + 7077, 24398, 60529, 4293, 25603, 53040, 34387, 11599, 54315, 5034, 61561, +26219, 3601, 47223, 13429, 39200, 12066, 57104, 23218, 65134, 15414, 59574, +27912, 46638, 9274, 22498, 56798, 26498, 8646, 48390, 13562, 40099, 30324, + 6773, 50028, 19777, 52118, 15228, 53787, 6636, 39959, 31542, 12856, 47501, + 262, 23251, 54426, 17941, 33285, 46296, 9651, 42709, 864, 50231, 29484, +64934, 14335, 58651, 23819, 53936, 12152, 60038, 20729, 54342, 42274, 12460, +49625, 40299, 16385, 45486, 18046, 65518, 21881, 53519, 24254, 59088, 27759, + 3792, 42355, 22061, 44545, 19339, 32176, 51885, 21172, 60076, 1209, 56728, +38468, 23793, 45645, 21668, 54815, 37595, 12536, 60953, 6645, 53768, 2435, +59685, 40395, 9429, 46825, 24761, 37697, 29803, 43931, 1900, 46820, 21270, +49458, 15090, 53144, 1305, 29140, 44603, 33203, 18380, 43812, 20998, 46693, + 6270, 29630, 54623, 15899, 63869, 387, 19365, 45244, 35802, 23330, 47967, +14415, 26446, 64421, 18428, 55898, 39397, 19290, 45779, 34594, 11009, 22377, +59047, 35703, 591, 41771, 34408, 24809, 32806, 64323, 25890, 57798, 12381, +51445, 6028, 37223, 31872, 8849, 46234, 11625, 42543, 27764, 8650, 58447, +26182, 653, 20740, 40694, 56463, 13434, 21024, 58345, 38222, 14332, 54795, + 6951, 26668, 54128, 1448, 56551, 19527, 59854, 32864, 9124, 54387, 39238, +26903, 62309, 21446, 52125, 30069, 6181, 53562, 32082, 16040, 46312, 29384, +38773, 9249, 59562, 5603, 48577, 27846, 2022, 61454, 22994, 57034, 21572, +64524, 30896, 8394, 58398, 28446, 53640, 20963, 61882, 26197, 4208, 44441, +30387, 826, 64873, 28234, 54564, 15324, 52640, 30683, 47887, 33844, 4036, +53815, 24087, 62021, 15682, 59577, 7575, 20269, 56215, 29770, 63656, 17814, +55722, 23092, 60962, 26475, 6340, 62093, 10486, 47131, 5366, 37013, 59480, + 1555, 55970, 22466, 40689, 29400, 54460, 16381, 33003, 44713, 7362, 27891, +62544, 19391, 49013, 11162, 53644, 37892, 18696, 57554, 24112, 44515, 16776, +42319, 8896, 45150, 1608, 53068, 19340, 63896, 37130, 14414, 41473, 62529, +22223, 33794, 65509, 17314, 56837, 13903, 44065, 2933, 46081, 23399, 64738, +16150, 59060, 37199, 18688, 63124, 43094, 5773, 39158, 56994, 15373, 64337, +17425, 56109, 35498, 8607, 24898, 51055, 30430, 6848, 42027, 26749, 35156, +46636, 5801, 29195, 64799, 2666, 28143, 53002, 4566, 42126, 11871, 37196, + 6165, 43127, 12739, 36796, 62450, 17467, 55878, 7184, 35572, 61596, 4235, +38824, 24756, 50171, 31918, 16725, 52360, 12897, 59867, 6306, 27298, 46114, +20583, 42505, 22611, 44001, 18557, 32982, 61968, 14512, 58112, 3788, 62778, +13671, 54475, 24480, 64236, 3949, 32588, 40777, 20176, 64601, 12776, 57233, +38998, 8308, 62232, 35377, 24214, 47841, 10752, 43922, 34718, 30572, 49419, +25227, 3861, 53701, 6205, 40696, 49330, 2683, 44226, 8279, 29250, 50100, + 6664, 25830, 65507, 43458, 9677, 25323, 61995, 20266, 54893, 6164, 52199, +10708, 49588, 1010, 30977, 40012, 22596, 64967, 16267, 54403, 29240, 56526, +17464, 64455, 33791, 14858, 44236, 29679, 62600, 34268, 5087, 32748, 53366, +24577, 6043, 43082, 23795, 35085, 63047, 20232, 37633, 27865, 43438, 11962, +26384, 61300, 24180, 14200, 50982, 12753, 42542, 1281, 36825, 60672, 12161, +40263, 57957, 23337, 284, 64735, 33788, 26832, 53707, 17639, 58777, 42567, +12921, 37677, 5877, 46941, 10950, 38325, 48432, 15966, 43933, 40, 40565, + 7624, 47567, 32799, 16180, 54870, 23940, 41580, 12434, 37679, 32262, 7150, +60326, 10280, 25681, 65417, 12951, 41305, 1456, 47151, 26971, 36094, 50987, +23688, 12916, 35781, 44952, 11670, 39946, 1706, 52456, 32797, 19005, 54122, +23268, 57922, 11922, 31822, 39484, 13684, 49028, 3009, 45943, 10461, 37332, +57177, 18556, 58982, 35847, 1078, 38799, 27264, 45315, 16769, 29227, 42678, + 7689, 50341, 799, 53972, 29540, 51130, 23616, 40661, 12725, 43162, 2964, +30868, 54579, 6224, 32881, 3811, 51375, 8041, 31776, 41803, 23852, 35784, +60514, 29149, 12036, 34608, 50308, 7792, 26964, 44828, 14146, 32204, 61062, +25079, 2087, 37303, 26288, 39987, 31191, 15733, 48863, 34027, 1857, 35786, +56407, 13830, 63583, 691, 31718, 58482, 15780, 34260, 47582, 14372, 35682, +59199, 20511, 55123, 27180, 60678, 20792, 56385, 32753, 10226, 45533, 34181, +27019, 46308, 12138, 30777, 54265, 7588, 37067, 10310, 61453, 4704, 43675, +19475, 36475, 65333, 3150, 56628, 9222, 62373, 11979, 54576, 5536, 26265, +41843, 19332, 43131, 17383, 45790, 30631, 8331, 37767, 27263, 50728, 9860, +47581, 23741, 51060, 3190, 24649, 48897, 27305, 905, 55834, 18335, 61401, +25748, 6970, 59787, 11121, 54915, 34128, 28037, 58906, 12610, 21137, 57317, +34649, 23548, 63082, 17144, 56510, 35919, 2434, 33295, 19107, 50781, 32528, + 8796, 31208, 43332, 22142, 45826, 18230, 35783, 61413, 14445, 44955, 2282, +47959, 35610, 3822, 25140, 49731, 1514, 38411, 53006, 6918, 47279, 11382, +22798, 59441, 42112, 1610, 46594, 29816, 62143, 2553, 48878, 12982, 44573, +15577, 64195, 6665, 52025, 34831, 868, 46939, 35399, 5011, 55933, 23959, +57391, 17235, 26256, 49149, 22331, 6853, 51637, 41928, 19493, 49221, 3098, +32278, 38119, 6976, 33468, 20800, 52716, 28170, 34252, 57801, 20060, 4059, +61383, 32454, 56621, 17904, 54254, 19755, 64008, 38627, 10828, 50109, 16987, +57094, 3336, 63238, 41546, 20029, 39504, 48980, 16804, 43444, 22261, 56890, +33985, 10747, 64517, 4996, 33606, 58486, 3317, 27279, 50512, 19660, 43565, +15101, 48305, 39299, 2679, 44505, 16569, 51702, 19694, 63086, 25256, 35555, +61331, 17674, 52407, 29995, 1972, 50434, 10833, 46898, 23872, 55095, 6054, +33398, 58315, 1833, 64533, 31723, 19563, 62696, 35927, 6772, 20706, 56174, +17070, 61151, 26626, 51555, 11919, 44366, 20750, 60316, 42744, 16457, 38817, +54025, 732, 62214, 8762, 21455, 40861, 56122, 1602, 25283, 40652, 58006, + 3550, 55193, 9854, 20730, 49794, 29676, 60334, 7867, 54822, 3832, 62250, +19218, 54328, 27695, 46472, 18161, 38836, 23089, 47998, 17779, 35952, 50977, + 7295, 31486, 61434, 8743, 29909, 46183, 1899, 40476, 10814, 50254, 1032, +26301, 52490, 23719, 2992, 63878, 16493, 57528, 40446, 17197, 64425, 21776, +48128, 26212, 40786, 28167, 49534, 16116, 32016, 50386, 26149, 33132, 36764, +27748, 38037, 30241, 48740, 1067, 52313, 29199, 56168, 5040, 40443, 58953, +14795, 55537, 19022, 59717, 30179, 7226, 37205, 30995, 61092, 16390, 53198, +32874, 13387, 42551, 4168, 37683, 52877, 22350, 40954, 20866, 65221, 15316, +37290, 30744, 50974, 27520, 11153, 47929, 23, 42022, 14308, 44932, 23737, +58357, 40772, 4799, 56171, 27269, 63411, 16089, 56838, 4375, 30172, 48452, + 9711, 54888, 25263, 58226, 31220, 18290, 61140, 40103, 12360, 45097, 18098, +30991, 60257, 18662, 54575, 41363, 10029, 26572, 65004, 19157, 52726, 15233, +40266, 29070, 59342, 4831, 50659, 22630, 40956, 18958, 57876, 30712, 16429, +63868, 31864, 17940, 47791, 8568, 33576, 44247, 2501, 59431, 37335, 28177, +12542, 54452, 16489, 45010, 11576, 56817, 23654, 64182, 45606, 9031, 62661, + 2627, 25474, 50204, 41294, 22123, 9498, 26522, 42624, 13255, 44984, 2459, +27563, 59662, 6824, 40291, 25139, 49610, 21891, 11199, 56347, 181, 31238, +58017, 6457, 52007, 9649, 25115, 44985, 18834, 41506, 48697, 15916, 32182, +54876, 7228, 64319, 28136, 59246, 8682, 30408, 64832, 25726, 41120, 7581, +45546, 3982, 50581, 8550, 27102, 43932, 5816, 64139, 25089, 38995, 32557, +21136, 65479, 13187, 50718, 15776, 40553, 30761, 15212, 49235, 34776, 10432, +26309, 58667, 39048, 4010, 46940, 35225, 5909, 33343, 61971, 24565, 39387, + 9760, 26831, 58254, 22568, 11778, 48606, 26243, 34066, 57693, 5496, 36489, +30045, 61251, 10348, 22309, 46262, 28434, 36647, 51848, 7062, 42269, 13661, +48293, 23103, 45205, 13189, 43367, 6057, 62992, 10273, 59381, 4880, 53451, +10879, 61622, 4063, 26072, 57189, 19190, 36844, 50561, 15035, 34656, 63423, +18975, 44419, 23132, 37715, 64633, 8401, 48374, 36577, 19855, 49072, 579, +25417, 49892, 13221, 44703, 2597, 57971, 10919, 62530, 135, 55951, 11242, +38538, 14595, 52131, 1547, 56184, 7590, 64809, 16863, 57632, 34813, 8902, +25913, 49154, 19938, 33331, 46278, 6550, 42059, 2662, 39159, 62533, 14400, +46079, 5642, 42234, 9715, 38080, 64316, 21440, 57931, 28288, 10012, 48148, + 2509, 44200, 8926, 47493, 1039, 61897, 7121, 38103, 59552, 17663, 53665, +30079, 60456, 5790, 52341, 10439, 28466, 48496, 16808, 45059, 1847, 42392, +12819, 38849, 62671, 19557, 44136, 34077, 6489, 38006, 10858, 46980, 8115, +32941, 57858, 21974, 63147, 4726, 33505, 39071, 2467, 30266, 51268, 37453, +16378, 44829, 7307, 32329, 57076, 8780, 25103, 42263, 11642, 58687, 2876, +48438, 13501, 41413, 50103, 8025, 39150, 59236, 14511, 37500, 64251, 14927, +54198, 32900, 16995, 61164, 35050, 7739, 62169, 20965, 50035, 15640, 43694, + 596, 30794, 40093, 16735, 35902, 55354, 13321, 27884, 52615, 31535, 63126, + 4845, 59324, 24973, 34076, 46320, 17832, 36374, 62576, 13300, 30604, 45555, +28501, 35726, 50603, 14184, 34125, 45753, 20570, 39175, 62799, 2328, 55436, +27701, 8168, 60527, 39465, 18486, 45598, 35075, 3737, 33286, 53591, 21485, +36218, 12273, 54557, 33933, 27881, 56985, 22938, 33839, 58816, 20774, 40152, +15781, 48951, 8644, 59563, 4698, 40613, 32249, 25610, 61821, 9371, 55618, +37246, 4525, 60464, 28928, 48176, 15806, 32964, 64709, 28498, 11084, 57425, +14221, 37025, 343, 56534, 29808, 52594, 2396, 35294, 59656, 29166, 13270, +46480, 19398, 44623, 17243, 49190, 20325, 53368, 33361, 12479, 65286, 1131, +31147, 61937, 18523, 53595, 34032, 10403, 36083, 57945, 22412, 39666, 21192, +41414, 23905, 44146, 20256, 42200, 21976, 45395, 37275, 10013, 48710, 358, +28706, 54071, 5470, 31027, 51514, 6754, 49170, 17027, 31438, 40816, 14727, +59675, 32543, 11300, 35060, 54940, 5109, 36220, 29433, 53647, 19171, 38987, +22121, 42419, 24897, 44533, 4973, 63263, 19697, 45770, 23142, 42143, 21560, +44911, 12625, 23004, 63890, 39552, 11741, 61226, 74, 27971, 63501, 22465, +54891, 12424, 26828, 53910, 20364, 56409, 22462, 59951, 28537, 6545, 45500, +14726, 49865, 33430, 18967, 62524, 17682, 51410, 20014, 42792, 22413, 45994, +24805, 4364, 40622, 33816, 9170, 26591, 47232, 20617, 37413, 64021, 13050, +39533, 19564, 51611, 26105, 59557, 22475, 8461, 54006, 2867, 27753, 52750, +21861, 63639, 23365, 54720, 27839, 5641, 50803, 13294, 48271, 15759, 56000, +24391, 63521, 20033, 5433, 55064, 12400, 38659, 50424, 17540, 36853, 53308, +18384, 47178, 30341, 37131, 25845, 62767, 4069, 22300, 55518, 25355, 2222, +42981, 31146, 4816, 45815, 26926, 9538, 48379, 3725, 47039, 24555, 32953, +41002, 5124, 60314, 25949, 53424, 14877, 58194, 24646, 44654, 7087, 32713, +64958, 1777, 40347, 20459, 49483, 35039, 10545, 57337, 5970, 52255, 29912, + 1720, 34825, 55555, 4708, 61109, 9499, 23497, 63723, 26405, 3186, 59030, +13865, 32815, 48039, 14809, 37639, 52562, 21964, 1114, 62208, 10234, 24927, +49755, 13675, 40296, 4937, 49497, 31000, 1208, 61845, 13030, 38902, 14937, +48287, 441, 53988, 9605, 56204, 23087, 41906, 27977, 51357, 11812, 48380, + 2638, 35202, 46588, 24026, 12817, 52600, 18317, 44102, 2656, 52109, 9453, +22054, 54129, 41284, 21113, 46188, 19036, 47970, 16707, 45115, 14903, 32038, +47056, 5764, 40946, 64419, 3214, 54853, 11052, 63916, 7416, 42379, 2830, +39338, 48600, 23147, 43819, 15172, 35543, 46060, 2637, 24097, 59860, 29448, + 66, 51261, 11444, 48220, 2779, 52307, 12087, 65369, 6991, 56216, 14823, +60880, 23232, 34950, 63750, 17285, 37909, 57558, 16367, 34061, 61663, 13049, +55376, 4114, 58224, 30009, 5883, 54017, 26985, 62897, 15215, 43750, 59319, + 8795, 24662, 46200, 6873, 51450, 13144, 60750, 18540, 49025, 29419, 40273, +11654, 60454, 14326, 52907, 4377, 40252, 49643, 2380, 32394, 53639, 18118, +34487, 50406, 9399, 44406, 16765, 48634, 36320, 617, 43055, 11515, 40216, + 2199, 47243, 34606, 25010, 54214, 1463, 40283, 53549, 7645, 36915, 27295, +60876, 13084, 54164, 16364, 64741, 29336, 54976, 18599, 63652, 39125, 12443, +59747, 1080, 32443, 53300, 4026, 60785, 31447, 7101, 32483, 49816, 37492, +15895, 40304, 60007, 13786, 50020, 804, 42947, 14119, 44763, 35203, 24568, +41114, 28532, 52012, 9785, 42366, 8202, 34991, 49040, 32666, 61212, 21296, + 3659, 62907, 31651, 505, 65237, 27010, 7620, 52859, 10986, 34562, 53466, +38194, 11322, 45888, 29072, 61029, 20519, 52296, 18853, 38512, 62569, 20853, +42511, 15289, 55660, 1579, 51982, 28444, 36613, 10256, 40960, 33812, 4456, +51481, 12291, 60045, 37378, 18441, 46452, 12547, 43765, 8187, 28346, 50474, +22161, 41753, 12069, 58263, 26550, 48703, 18280, 44091, 21004, 53398, 38322, + 7477, 46893, 35102, 28273, 53094, 8584, 29450, 61065, 4439, 24308, 36400, +51532, 20850, 40668, 56048, 16809, 58198, 22860, 61256, 18193, 56593, 32813, +17265, 47704, 6091, 65248, 30177, 40886, 18942, 45470, 30772, 3308, 63172, +13818, 34733, 56784, 19215, 60048, 22602, 6652, 63482, 42121, 21962, 40538, +14260, 59659, 25027, 35679, 48871, 1170, 26279, 63164, 4599, 55147, 25950, +64155, 6600, 36991, 62806, 15714, 55305, 17739, 31154, 37575, 23540, 39924, +28058, 51798, 18586, 62916, 26516, 8272, 59639, 32444, 57071, 8807, 21262, +63772, 39899, 6496, 47112, 20424, 34770, 60196, 16099, 57219, 27318, 37788, +33380, 26471, 39918, 31192, 2371, 50041, 13708, 30770, 47222, 7874, 23834, +48211, 2902, 28353, 43466, 19890, 45818, 15713, 50954, 34665, 21280, 42516, + 7489, 39361, 30044, 17701, 33644, 57311, 15476, 63543, 29692, 36077, 3829, +53260, 24018, 7865, 58987, 33614, 2861, 47986, 25835, 61433, 15003, 33251, +58529, 22268, 6861, 42187, 57149, 15045, 36894, 25854, 58389, 7919, 28575, +52480, 21804, 63049, 25560, 55037, 19396, 58873, 11696, 32580, 63443, 12645, +22785, 31949, 57568, 4801, 33306, 39667, 3276, 36847, 9969, 48554, 7965, +45236, 2921, 30826, 43554, 22075, 49555, 16477, 26846, 42120, 10795, 47088, +21379, 53482, 233, 28117, 63811, 24032, 9078, 45517, 18880, 38728, 21001, +56991, 3044, 61816, 10425, 58905, 42, 36413, 20908, 57190, 27742, 59835, +22154, 972, 26040, 45799, 29423, 39734, 14580, 45234, 16092, 39133, 60377, +17636, 47692, 23835, 8996, 27861, 64679, 19266, 53762, 6713, 39995, 10506, +58650, 669, 30747, 52685, 8990, 64478, 27831, 39204, 14076, 63718, 21481, +54615, 18772, 60896, 31479, 19657, 46847, 26141, 5424, 54856, 23715, 58822, +17461, 60955, 37918, 1004, 65459, 15811, 47523, 21321, 42545, 8014, 64704, +11549, 40836, 2489, 29805, 57262, 14618, 61633, 5362, 38307, 24643, 44277, +17803, 41430, 54521, 9219, 28874, 47266, 5483, 31215, 37617, 91, 47047, +10997, 43197, 7366, 38139, 52589, 21233, 42646, 25798, 11713, 59971, 36385, +12712, 58489, 37613, 20218, 47591, 695, 26198, 44472, 9198, 53489, 37997, +29313, 129, 54416, 8328, 45777, 30479, 7164, 61800, 13717, 38611, 50841, +16195, 31892, 38137, 8335, 29328, 50552, 23763, 8999, 39132, 24856, 50753, +10370, 47818, 14646, 58759, 431, 31304, 45576, 15367, 53938, 37292, 17073, + 3696, 38345, 29339, 47984, 26444, 14219, 55110, 27429, 64615, 7458, 25690, +42949, 29947, 9516, 50719, 1364, 54858, 12855, 52780, 35633, 25652, 58335, + 3839, 36058, 60234, 32282, 11294, 58950, 35117, 8647, 62980, 26546, 37306, + 9357, 60611, 1991, 52093, 24358, 47906, 3463, 64983, 40554, 1317, 42875, +26344, 5752, 55685, 41238, 14850, 46418, 35346, 15809, 50071, 27383, 38620, + 9405, 34634, 50737, 24115, 10336, 36474, 48485, 25064, 4472, 32315, 62050, + 3340, 38478, 30854, 64891, 15256, 38409, 7057, 48249, 10594, 43340, 4370, +44725, 20404, 38675, 29081, 60129, 41280, 11854, 52253, 16896, 58633, 26059, +55765, 32508, 22820, 61469, 33464, 25196, 50356, 7259, 57399, 9987, 34794, +61786, 14757, 56479, 28230, 65167, 12060, 34444, 44958, 5521, 47786, 30203, +34546, 62218, 7568, 51192, 26103, 40105, 18250, 46764, 34120, 22739, 64310, +32015, 3383, 45938, 13088, 44060, 31182, 53800, 7924, 55953, 10592, 58518, +24038, 51046, 4284, 32102, 41059, 1848, 61788, 32429, 49737, 70, 43927, +13751, 31671, 48866, 24788, 33181, 50215, 15784, 39602, 25885, 36673, 6170, +48945, 31827, 8547, 46335, 2365, 43423, 9392, 38208, 63243, 1243, 39750, +50010, 15416, 41198, 3576, 47940, 30960, 19307, 53420, 25429, 40027, 4391, +61270, 15012, 52883, 20185, 32164, 58925, 25058, 48691, 18520, 43598, 22048, +49298, 12608, 65133, 570, 57702, 33247, 14133, 63918, 38896, 15466, 59410, +11345, 65397, 32937, 26490, 55302, 19805, 63776, 24469, 9907, 60466, 2405, +51692, 34865, 6546, 29017, 49504, 5009, 27197, 52895, 16820, 36040, 61096, +16070, 40146, 32161, 17032, 57849, 25993, 34765, 62438, 17237, 55916, 37504, +19380, 45304, 27872, 10679, 56884, 42853, 12789, 59164, 39893, 3448, 60024, +30448, 56360, 1319, 33659, 61606, 4961, 52693, 33183, 21402, 60850, 9447, +41225, 5356, 29611, 49400, 64475, 14468, 53784, 5125, 57763, 30973, 37001, +10869, 40548, 30811, 54049, 4552, 63296, 35993, 23449, 60380, 19092, 47894, + 6292, 64078, 10299, 33530, 54278, 12309, 21503, 49768, 40178, 15559, 46624, +23818, 38985, 271, 48915, 21931, 40444, 31042, 16242, 61755, 14276, 53114, +31369, 13640, 48654, 18831, 52474, 33271, 17297, 31520, 64861, 960, 56865, +31733, 5957, 64285, 18592, 57384, 28025, 5608, 62910, 29393, 55361, 13871, +65227, 29333, 52000, 17580, 49313, 13433, 45673, 4919, 43562, 24621, 58145, +18627, 37353, 29843, 65432, 14171, 48865, 6063, 50817, 3065, 20913, 47263, +29281, 41854, 10414, 46545, 14978, 44446, 1430, 38500, 14129, 58251, 17179, +53937, 35740, 24783, 46255, 5269, 44291, 35729, 2598, 40167, 24044, 58652, +20749, 55738, 16802, 59040, 3867, 27280, 42373, 15795, 65310, 6176, 55522, +27488, 7189, 49169, 11216, 52985, 37833, 18256, 51541, 6826, 64584, 13553, +41870, 21998, 46919, 35441, 6564, 34154, 57728, 19126, 55641, 29711, 14772, +42662, 17912, 59024, 23379, 35749, 57143, 3295, 63384, 13114, 35812, 56679, + 4237, 59898, 16818, 54335, 19651, 57889, 37837, 16309, 58917, 24137, 55630, +13948, 28810, 53855, 17172, 30560, 62205, 11447, 55764, 34267, 6440, 45685, +13555, 44356, 18021, 51246, 29107, 38223, 457, 35057, 48127, 5933, 52096, + 9795, 36971, 1328, 54423, 16728, 41534, 20051, 46800, 30967, 6006, 44726, +26589, 2548, 50180, 24300, 44202, 20529, 52246, 5943, 29720, 41855, 3136, +46433, 35158, 28006, 48931, 16851, 55551, 23799, 63632, 15601, 39526, 61581, + 7937, 31365, 54236, 6307, 29486, 50270, 4052, 46934, 10635, 43780, 5381, +32215, 50521, 2122, 29395, 53140, 4985, 61048, 34296, 3088, 22213, 51830, +33401, 18825, 48605, 21583, 43051, 14117, 46330, 18656, 36776, 26454, 40634, + 7833, 49589, 25338, 33855, 56047, 21810, 58497, 11189, 20492, 42573, 22964, +40794, 11863, 45605, 1676, 50169, 15637, 46529, 18345, 41329, 21176, 49377, + 7812, 29122, 41530, 15926, 43038, 21036, 46585, 19547, 40676, 28885, 65101, + 1560, 25531, 53252, 5267, 59791, 13346, 56257, 31891, 65298, 10631, 57118, +35521, 5631, 33038, 38425, 8273, 51022, 23348, 61888, 11464, 39563, 58463, + 9527, 37698, 30235, 16712, 51591, 37506, 13497, 43158, 472, 47338, 36142, +19110, 42812, 1618, 39813, 20886, 45857, 11032, 41218, 23245, 59449, 20046, +56159, 11915, 51618, 1743, 31820, 50428, 8515, 27084, 52302, 17535, 61161, +25525, 35745, 56786, 24010, 568, 63290, 31696, 5403, 62262, 28324, 56636, +20117, 45821, 4607, 41478, 29243, 2124, 64380, 17439, 55530, 25716, 18168, +52287, 15314, 46030, 6589, 41354, 13124, 43229, 22837, 37399, 53684, 12348, +48593, 19899, 45163, 14749, 37440, 54379, 19412, 42772, 24224, 9282, 62027, +33340, 25393, 36194, 47703, 15841, 60480, 2156, 28788, 62518, 25770, 12410, +44233, 6011, 37195, 52098, 6942, 46708, 28954, 5245, 50867, 11746, 45071, +23097, 42826, 7231, 29445, 44355, 21888, 42993, 12920, 45121, 3428, 25459, +50385, 29455, 5569, 35584, 49672, 7303, 42387, 33678, 7808, 35449, 51071, +25422, 14135, 63536, 32400, 56601, 7391, 62385, 34215, 11001, 56235, 25896, +59945, 16032, 31138, 38240, 22937, 64335, 27593, 33900, 60248, 6845, 56499, +35690, 15243, 53604, 17449, 59926, 33612, 18415, 56782, 4199, 42202, 13316, +38753, 60175, 16238, 54262, 13969, 57490, 8136, 31298, 43317, 13543, 45916, + 1401, 53332, 33046, 17996, 42039, 48369, 13251, 40981, 63889, 14680, 56199, +28615, 64942, 20264, 49016, 12189, 39370, 22678, 64318, 16394, 40994, 12012, +49606, 29985, 65214, 26984, 1532, 44209, 11425, 52237, 7177, 64990, 28892, +54347, 11956, 56946, 16431, 62457, 36074, 13452, 50948, 1783, 39154, 24386, +46300, 55487, 620, 59359, 19401, 63183, 24231, 56015, 21470, 61747, 3297, +55691, 12308, 58221, 15041, 34751, 47184, 3716, 62065, 29980, 55550, 968, +52339, 6707, 45409, 14157, 37752, 57052, 18181, 40979, 29288, 50806, 20787, + 6465, 27241, 45692, 18310, 51545, 27696, 59976, 20705, 56060, 28820, 5300, +33869, 43948, 2245, 28841, 45802, 19629, 60251, 42289, 10423, 28056, 54610, +20130, 55819, 21534, 59156, 9884, 53365, 32869, 59922, 7548, 35171, 60982, + 1172, 53142, 8649, 36175, 26460, 46766, 16358, 40133, 60606, 14529, 57033, +36725, 182, 42767, 30393, 9485, 48015, 7208, 38983, 49490, 17726, 37069, +51399, 21710, 12268, 35685, 52542, 11544, 61031, 15570, 48008, 23250, 42906, +31431, 11893, 47916, 33997, 8854, 60402, 27137, 54955, 17680, 64561, 1830, +51297, 9983, 32089, 57740, 1275, 36406, 28860, 60788, 2247, 30675, 62728, + 4254, 58507, 29645, 40278, 1738, 57781, 19217, 4447, 50874, 37253, 20694, +53081, 10034, 35970, 54629, 22657, 61102, 19975, 31484, 63613, 15667, 56251, +38561, 17251, 61650, 34495, 15544, 53443, 26519, 65370, 11212, 54884, 1064, +63110, 28950, 34232, 61858, 9885, 40728, 65282, 15462, 30658, 57684, 14508, +64381, 44013, 21355, 336, 36178, 46899, 22696, 2954, 28558, 42458, 23937, + 2340, 49362, 17035, 44228, 10190, 40120, 62933, 13533, 54957, 5090, 50819, +10876, 23995, 46008, 26613, 9037, 62556, 23528, 48538, 10512, 52092, 36684, +12324, 46314, 17034, 63027, 33832, 10445, 45860, 34493, 27121, 40492, 22999, +64353, 4320, 58169, 26825, 41790, 21945, 9482, 50040, 2739, 23647, 57698, +33469, 1789, 31171, 37499, 7654, 23963, 51640, 15804, 59339, 28632, 48319, + 8606, 44310, 21314, 58709, 15292, 45851, 7872, 37603, 60417, 16981, 57592, +19618, 31899, 38703, 4484, 24347, 48803, 2190, 45153, 29881, 4204, 58142, +19552, 30857, 62058, 6871, 28899, 16253, 45111, 13205, 51630, 4360, 37956, +12678, 43399, 27840, 37435, 24387, 45338, 529, 31709, 60995, 20050, 51715, +24861, 8671, 37161, 31869, 18142, 62296, 22266, 50952, 30281, 7505, 33820, +64207, 2474, 23051, 44258, 33171, 49709, 3627, 42075, 9899, 44528, 779, +43022, 16585, 36387, 59523, 15315, 56430, 24286, 63039, 7229, 49761, 3253, +24459, 58001, 40616, 4133, 45672, 35395, 7067, 30263, 45932, 22152, 12223, +23961, 50295, 16566, 26619, 43897, 19263, 39919, 61763, 2555, 29012, 64160, +22690, 6212, 45589, 33536, 19065, 62150, 21994, 54080, 33949, 16063, 64663, +13068, 30198, 54652, 11157, 25919, 40400, 58872, 6243, 31053, 39549, 25980, +51610, 9352, 59425, 7653, 38741, 62445, 707, 57797, 29123, 37891, 3471, +32683, 48898, 28099, 39788, 20048, 61199, 17966, 39221, 26099, 59408, 9289, +38962, 24325, 47758, 16079, 41335, 14154, 51016, 17303, 54171, 23257, 35216, +61496, 26318, 9046, 33232, 41074, 19693, 47852, 1123, 41587, 10825, 48152, + 2689, 39680, 33626, 9193, 24414, 44234, 27186, 7822, 58314, 1981, 40737, +19867, 49519, 33392, 27005, 38336, 7888, 50956, 17361, 46683, 21306, 33450, +48668, 1901, 39327, 32829, 4129, 28208, 48890, 29396, 61465, 8589, 57463, +36851, 54060, 11608, 58100, 37637, 21662, 64089, 4900, 54192, 27752, 3109, +47116, 29038, 44686, 18866, 40426, 52913, 2716, 39395, 49797, 32865, 1780, +31637, 42518, 6286, 28952, 62280, 22625, 50886, 27782, 1917, 52855, 23823, + 6706, 62625, 757, 51227, 19566, 39698, 33777, 8832, 62082, 36311, 57230, +28977, 65074, 35837, 8484, 20824, 44161, 54928, 17301, 58291, 39845, 1356, +45183, 35195, 3944, 20640, 57680, 31839, 54785, 538, 38427, 23310, 50439, +20103, 32612, 47386, 5609, 37515, 54947, 14867, 60759, 42645, 17389, 63747, +33142, 18370, 46740, 10883, 40997, 48165, 15516, 50139, 37310, 62629, 26485, +39783, 28330, 47465, 16853, 60680, 5279, 52946, 13410, 65145, 20667, 38551, +53679, 5513, 42287, 15573, 39226, 57288, 16580, 59987, 38683, 10796, 43741, + 4579, 59463, 26739, 51854, 11587, 32798, 47821, 9114, 61147, 15450, 54741, +20038, 62720, 24838, 53881, 13054, 64009, 3096, 41845, 30643, 9191, 47019, +16422, 43277, 22292, 53986, 35268, 8100, 22966, 63753, 15631, 26300, 61958, +39979, 3744, 64678, 35620, 56160, 2979, 33803, 47835, 11644, 57884, 30316, +14822, 33838, 53812, 8213, 33169, 55257, 26269, 3735, 47153, 10860, 41372, + 4569, 58231, 27438, 43656, 20536, 59621, 4086, 42998, 64156, 1946, 33716, +49096, 18471, 65312, 302, 36920, 32063, 19798, 52178, 15968, 27479, 44858, +21090, 51213, 15816, 63041, 11224, 36789, 6911, 53323, 31475, 4770, 46235, + 8246, 49244, 20978, 50731, 17014, 43840, 11530, 53480, 26706, 48200, 7674, +43593, 28852, 6360, 49000, 12554, 44854, 30139, 63760, 3966, 56830, 30943, +64773, 16021, 54032, 25445, 59263, 14243, 54708, 29910, 64936, 1475, 51635, +30591, 37777, 21698, 48359, 5667, 37086, 9606, 56904, 19128, 59173, 23205, +39358, 142, 51394, 8275, 26451, 60488, 20298, 54322, 23574, 59278, 10167, +52536, 18478, 41877, 27169, 9408, 22047, 47376, 26966, 13067, 46450, 28332, +41712, 19304, 36808, 57135, 21568, 12441, 35771, 62405, 7726, 31826, 61262, +13364, 21690, 52616, 27300, 64184, 20665, 58681, 38032, 925, 41467, 7991, +57204, 32514, 18127, 58591, 38033, 18812, 47718, 32075, 9645, 54864, 21256, +51949, 18720, 5456, 33712, 11357, 19584, 45077, 28363, 60765, 24099, 6530, +42275, 30478, 14986, 61388, 31435, 11283, 62823, 41562, 24025, 6223, 27660, +43560, 19321, 60883, 4753, 55636, 9991, 25219, 63566, 28539, 98, 41278, +32681, 8728, 30547, 38225, 11540, 55402, 25810, 65408, 32026, 6126, 57433, +33213, 11484, 34095, 5681, 49066, 9772, 35545, 50850, 23117, 40451, 18691, +42832, 6202, 50573, 10181, 26681, 45861, 11529, 64394, 2570, 26420, 44124, + 5869, 27480, 56437, 23744, 39843, 17761, 45885, 14948, 36877, 58428, 16031, +52468, 24415, 38213, 8134, 40112, 32857, 11947, 35104, 46500, 23802, 49763, +18470, 54227, 34917, 26034, 52955, 12590, 39415, 14441, 62175, 32286, 52588, + 9770, 34131, 52005, 12683, 23260, 48329, 28828, 8267, 38692, 28126, 63580, + 6344, 54194, 35500, 3996, 51295, 42016, 17686, 37539, 49629, 15989, 38795, +63660, 21068, 53132, 18138, 48608, 12336, 39543, 2240, 52003, 23731, 37753, +32310, 16735, 46383, 14526, 30204, 55372, 10718, 47330, 16529, 54862, 41166, + 3097, 36756, 53296, 13171, 40460, 5053, 43472, 25163, 50013, 21948, 61911, +11794, 36431, 55287, 22337, 63118, 34426, 3564, 30164, 64821, 5145, 57549, +35217, 753, 32906, 59458, 15186, 65426, 33300, 16484, 57097, 295, 52506, +16937, 45750, 25612, 9301, 23359, 46289, 35309, 7877, 28809, 45485, 4469, +42160, 16619, 46466, 20158, 60318, 12779, 55649, 31811, 61095, 23796, 51193, +15061, 42156, 5015, 47890, 12702, 61269, 15771, 57117, 36822, 16556, 42672, + 6271, 44636, 17472, 40490, 15572, 45184, 3904, 51952, 31459, 64567, 1136, +33211, 60465, 6975, 55851, 14256, 52298, 11330, 25694, 43056, 59275, 798, +29746, 54158, 17131, 37780, 29282, 59187, 5634, 41163, 11978, 47506, 13917, +26740, 55557, 19738, 44744, 15140, 40320, 49512, 11604, 29691, 43180, 13158, +61193, 22575, 36045, 2217, 31151, 46261, 27572, 51122, 39050, 54131, 3754, +48817, 9874, 52042, 34850, 63070, 3625, 52637, 35862, 19485, 54155, 26588, +13509, 52477, 32989, 47623, 9490, 51503, 13934, 44593, 17785, 42865, 35780, +11182, 51696, 22452, 58847, 20015, 56554, 43872, 6387, 51327, 34769, 977, +37403, 13771, 44159, 28691, 2438, 52894, 17098, 54752, 22651, 64965, 20417, + 1037, 58012, 9235, 56242, 32349, 59259, 16258, 33615, 62559, 17766, 54763, +28132, 34130, 53000, 11878, 48921, 33292, 2809, 51293, 9905, 63366, 629, +55153, 27706, 5784, 42702, 30369, 1462, 63730, 27075, 55674, 2578, 59009, +28553, 6374, 57668, 10972, 39832, 6776, 65428, 384, 31050, 60992, 4965, +47656, 25500, 1370, 42962, 27910, 46861, 2170, 37470, 54391, 17066, 41260, +58077, 18568, 52229, 15696, 41417, 28918, 12853, 62949, 31938, 5854, 59705, +24472, 878, 58711, 9707, 29343, 44520, 6552, 59929, 34832, 25731, 60938, +29127, 36375, 6676, 48717, 9685, 53031, 24213, 60268, 4971, 42174, 24703, +33256, 62901, 6841, 29705, 61541, 25030, 6330, 65014, 17929, 59843, 20374, +54641, 1125, 44870, 16831, 46790, 26356, 15131, 44169, 12825, 24945, 56130, +40971, 14311, 45898, 31286, 18131, 63421, 19604, 38556, 30798, 2865, 51513, +36901, 22185, 42706, 23498, 40106, 13196, 51372, 35818, 58140, 5347, 20901, +63189, 38171, 15457, 57894, 23165, 52617, 11048, 39794, 4953, 44836, 28065, + 7435, 18100, 42441, 2653, 62635, 27650, 53469, 17979, 42873, 24544, 45014, +28567, 4549, 52545, 12567, 62052, 27308, 56397, 2676, 63960, 30782, 58305, +19933, 45973, 14496, 40721, 50570, 18381, 39251, 20488, 43425, 1615, 60634, +33501, 6436, 31279, 48294, 14669, 34479, 49383, 3941, 43391, 11174, 44849, +19387, 53802, 3396, 32781, 45830, 8877, 50024, 25340, 61681, 5552, 30982, +64572, 2915, 55938, 30847, 4932, 41977, 59393, 28149, 56212, 12833, 63332, + 270, 22210, 31661, 58330, 16464, 40655, 32163, 13414, 22421, 47308, 28959, + 9532, 43744, 5684, 48671, 35792, 1939, 59021, 12961, 64041, 25448, 39302, +30357, 63042, 2020, 53660, 20708, 43503, 30923, 9669, 46891, 2760, 23473, +59554, 26614, 15699, 60479, 22814, 54284, 19100, 63490, 25357, 38944, 61046, +31329, 3068, 32645, 44259, 29357, 34968, 46365, 27099, 2329, 24955, 40021, +49076, 1977, 31526, 37409, 7567, 47554, 14929, 60605, 21877, 64717, 36874, +18927, 44909, 24903, 42924, 19603, 38487, 60531, 17374, 56074, 36746, 13239, +47337, 21835, 45456, 17042, 50227, 37986, 19630, 44198, 22775, 46151, 19231, +37821, 49155, 17590, 42697, 11193, 50589, 33287, 14976, 58296, 17806, 61202, +27215, 8843, 60348, 805, 25987, 42854, 4999, 45392, 20843, 49614, 24629, +38494, 16976, 47630, 10881, 45095, 30259, 40504, 23127, 51733, 15304, 38084, +30793, 1219, 49872, 8013, 55065, 13916, 62670, 19859, 57795, 29216, 7294, +35867, 53893, 17783, 51313, 3749, 39082, 21544, 49656, 10877, 45760, 34430, +28407, 48843, 8537, 41552, 12633, 37645, 30685, 55631, 3164, 59543, 38854, + 449, 50971, 35888, 8853, 23287, 52141, 36169, 8055, 49360, 12139, 52748, + 5577, 56097, 42326, 25591, 7250, 63008, 11309, 55706, 5707, 59942, 32854, + 3166, 39477, 29294, 51034, 33311, 686, 47199, 31560, 8599, 33001, 62505, +22519, 54514, 17661, 63792, 32554, 49068, 22410, 47256, 30211, 8784, 33191, +64795, 3678, 55269, 10016, 37980, 63324, 19291, 46313, 31478, 9273, 32672, +50027, 24433, 9735, 38308, 6752, 34243, 59063, 24826, 10088, 54965, 3970, +62106, 25083, 48909, 15117, 40483, 65345, 19758, 36224, 58397, 9382, 25125, +64810, 15881, 55997, 28180, 61521, 14704, 39884, 57940, 16495, 64998, 33556, + 3785, 35559, 48280, 14209, 36204, 46454, 17346, 39006, 52635, 20339, 10089, +47897, 6064, 43700, 24345, 35416, 60172, 10564, 37964, 27045, 64598, 933, +56005, 38134, 8219, 57133, 24819, 60533, 31976, 16315, 65430, 30180, 17976, +42745, 29280, 3204, 56843, 8479, 27154, 45988, 32124, 61362, 5317, 39482, +64763, 16932, 36572, 50199, 13290, 39646, 49345, 9292, 42243, 3900, 47212, +10449, 51556, 8238, 14688, 43149, 26813, 52415, 7742, 61563, 11057, 21028, +63898, 31245, 52486, 8495, 22719, 57146, 41871, 14491, 50441, 21035, 38127, + 156, 42610, 13100, 31041, 57551, 5142, 54602, 10609, 61842, 3446, 23883, +49550, 7679, 28609, 58053, 34896, 8827, 30439, 64756, 4737, 26873, 62238, + 1721, 55583, 13848, 58654, 27041, 8979, 55097, 29016, 64351, 18389, 56613, +39108, 6413, 44617, 20197, 49384, 33739, 14842, 34584, 51525, 10977, 62247, +13536, 55852, 307, 58899, 7817, 54781, 26073, 65281, 18095, 56016, 13006, +61906, 2856, 33507, 56523, 18713, 65108, 22926, 42893, 20949, 46404, 24663, +44493, 827, 39557, 62040, 15063, 31060, 40888, 11728, 57976, 14356, 43610, +23649, 58724, 20533, 55502, 2198, 36906, 22804, 56737, 27510, 63511, 13873, +24144, 42348, 28475, 10896, 64166, 17944, 57906, 29482, 61628, 1895, 21341, +59999, 33907, 27181, 36369, 46672, 21276, 10326, 59031, 40822, 18157, 44111, +21151, 48265, 27672, 15189, 52788, 13853, 60718, 9856, 23889, 55987, 18324, +61508, 27404, 48439, 2996, 43027, 10236, 38790, 364, 52888, 11602, 59526, +14004, 37000, 51958, 19416, 38029, 31303, 20576, 50127, 17698, 30880, 40819, + 961, 51834, 21493, 43731, 14148, 36888, 54728, 21692, 62704, 26666, 3346, +48732, 37238, 22249, 44140, 32598, 9047, 31675, 56712, 23291, 10355, 50321, + 4522, 26814, 51308, 40204, 18523, 46773, 33955, 237, 35283, 48662, 25052, + 6469, 30796, 39123, 17907, 59349, 12227, 26996, 53896, 22873, 10677, 60748, + 7591, 25106, 65201, 33924, 16817, 58828, 32512, 15451, 52988, 20767, 47927, + 5907, 51438, 12025, 46232, 15206, 27791, 50160, 18418, 42071, 366, 37103, +51536, 6690, 38954, 56042, 7625, 48326, 36017, 22316, 34205, 49990, 19048, + 9169, 26188, 47769, 18170, 32380, 54038, 8192, 30151, 62334, 4691, 31765, +56037, 17258, 58994, 30632, 40317, 23377, 45922, 56877, 7093, 59960, 13010, +48460, 21941, 53868, 38951, 6651, 45135, 18158, 61316, 35049, 9531, 24749, +63627, 4494, 58869, 25826, 55267, 20065, 51704, 8011, 41374, 32715, 22658, +40899, 28965, 34434, 44532, 12298, 40396, 50794, 4230, 20692, 54374, 42502, +14469, 36805, 52301, 15218, 48769, 25574, 40706, 4313, 50944, 34000, 22032, + 2684, 35452, 46173, 4577, 29781, 62834, 11850, 40579, 3559, 53583, 28552, +64122, 17894, 49020, 36184, 23880, 34198, 44095, 18894, 46357, 30274, 2088, +34468, 43655, 4693, 45972, 34822, 24719, 46890, 8747, 43623, 12667, 40170, +14980, 50831, 3147, 38247, 11797, 50183, 17357, 33475, 47775, 2357, 64069, +27812, 37015, 25804, 54183, 1202, 36102, 9063, 38977, 18505, 59026, 33516, + 4174, 51588, 7911, 34719, 60560, 6120, 52435, 34550, 25665, 48029, 5417, +45321, 13427, 39647, 54642, 24399, 3271, 61125, 8833, 23612, 64076, 39244, +14630, 31928, 54058, 2366, 61810, 9710, 34443, 64170, 22030, 44549, 19839, +40848, 48704, 11395, 42627, 6248, 41176, 14116, 51195, 29609, 58595, 19310, +43869, 20671, 41090, 4306, 44761, 25685, 1359, 58469, 12212, 60304, 34319, + 2263, 55965, 8946, 59686, 24004, 35479, 65106, 4778, 55692, 28122, 704, +44098, 11276, 39610, 56899, 29037, 7572, 65020, 13291, 54395, 28165, 45712, + 5287, 37254, 55245, 18126, 43844, 63386, 22074, 2165, 57724, 8282, 25853, +50174, 22699, 8571, 63104, 36267, 54943, 1593, 52111, 22226, 41795, 56555, + 398, 33358, 49881, 28281, 34886, 45754, 1158, 44127, 26271, 39085, 11171, +46756, 4380, 41308, 14241, 61516, 24891, 36942, 19760, 59788, 43176, 3220, +61857, 14605, 54459, 11585, 25947, 45297, 19160, 33283, 52157, 15747, 62009, +13486, 59640, 4339, 56023, 37151, 58573, 13361, 51115, 3670, 37648, 27462, +45845, 19111, 44478, 21273, 34446, 46157, 7962, 20075, 53950, 194, 35396, +31020, 46723, 19729, 40439, 16533, 42819, 3470, 33194, 51196, 12663, 41302, + 4060, 48177, 29776, 46285, 15928, 42954, 17939, 41018, 11141, 46420, 29010, +59114, 15869, 62488, 13693, 48095, 6166, 53419, 20221, 64952, 25719, 14631, +61682, 39347, 24885, 55, 57003, 32049, 7468, 43376, 29354, 8609, 62937, +33318, 12123, 60440, 40293, 57525, 14601, 28138, 55464, 16929, 35876, 51705, +21349, 59341, 11233, 43940, 5890, 41000, 26695, 2771, 60096, 10277, 28083, +63810, 15076, 39637, 57176, 22044, 11853, 52518, 27257, 7668, 54281, 14301, +59034, 31711, 53653, 5227, 63083, 30256, 55955, 18619, 64531, 27064, 55668, + 7703, 22747, 50935, 21259, 44110, 4810, 60872, 12440, 32836, 51926, 26599, +62683, 31170, 9912, 48268, 19452, 40159, 28562, 50430, 18243, 47620, 21104, +56474, 7556, 30493, 41695, 21890, 49753, 27677, 9673, 35093, 47697, 20340, +53850, 34399, 1362, 27944, 49095, 5030, 36359, 28723, 37784, 25886, 47198, + 1233, 42192, 7684, 49875, 2524, 32226, 65517, 24774, 54291, 19320, 60006, +23840, 8062, 34981, 49431, 13740, 54831, 27131, 64336, 17124, 56561, 39333, +21656, 42630, 7096, 46601, 26526, 36188, 48838, 20881, 53648, 7936, 30216, +48093, 11823, 40039, 59905, 18378, 53838, 23280, 13706, 36282, 50992, 17481, +42020, 105, 50067, 16855, 63167, 29629, 1892, 41727, 32835, 7241, 34469, +45997, 20452, 38827, 55393, 13498, 59762, 42123, 21913, 11790, 26872, 44252, +15347, 47888, 6958, 20525, 40097, 63569, 19230, 4011, 52146, 20938, 57047, +13752, 62193, 3066, 55440, 27924, 64204, 18840, 43875, 30245, 2444, 56448, +33795, 7159, 31006, 40202, 23958, 44873, 20568, 39570, 60026, 14278, 58206, + 3817, 24668, 41666, 772, 46455, 23778, 41492, 30347, 21275, 1231, 41125, +29139, 62636, 14318, 57443, 604, 55084, 11004, 64123, 2109, 27533, 61440, +36957, 26143, 64673, 18391, 4583, 34060, 55781, 1625, 64252, 29058, 59134, +14284, 26947, 62453, 19851, 55483, 13760, 59513, 1295, 53603, 28116, 56670, + 6575, 62831, 24331, 3905, 38870, 33545, 1680, 51937, 26166, 59866, 11698, +46353, 1178, 32757, 48106, 23054, 9964, 60050, 29223, 40186, 18176, 60701, +21322, 56545, 35154, 16467, 47785, 29877, 20500, 7025, 31149, 49456, 8305, +41923, 32289, 187, 25016, 43063, 15551, 47716, 23462, 56099, 14292, 57729, +32662, 19303, 53257, 40774, 3521, 50084, 9508, 26797, 41227, 60677, 15636, +38689, 64037, 19121, 42440, 27836, 2445, 22369, 48289, 35272, 8548, 26393, +41940, 4670, 42840, 13253, 40232, 59329, 31815, 9922, 57181, 20131, 38650, +28794, 64723, 13990, 47253, 4895, 50941, 35051, 24116, 64261, 10740, 57115, + 1759, 38621, 12095, 42685, 16071, 33416, 62401, 17489, 55526, 4215, 64608, +30745, 51551, 6667, 39368, 11178, 46117, 30544, 57320, 19068, 60859, 21824, +55281, 6611, 58657, 12382, 54555, 30725, 62794, 27348, 57123, 21229, 36215, + 4073, 31219, 43500, 1310, 39380, 64525, 26340, 5228, 62056, 30260, 6894, +35973, 50017, 11183, 28080, 48035, 15230, 52706, 17030, 63637, 13651, 33548, + 3818, 32173, 45477, 18530, 36237, 61220, 15153, 33231, 46970, 5246, 42035, +60767, 1959, 27088, 55547, 23533, 61144, 21819, 40075, 12715, 47106, 24547, +60015, 14932, 30660, 56971, 15507, 62517, 29931, 5906, 37566, 31309, 2781, +51379, 32406, 57530, 9299, 63861, 28036, 34737, 60227, 29641, 8953, 35933, +58184, 30199, 9395, 35517, 50083, 18954, 48404, 36287, 16095, 33827, 49937, + 8737, 53405, 39142, 18031, 50625, 26295, 63705, 10313, 55388, 5336, 64434, +29192, 2518, 46883, 35201, 29180, 63458, 19826, 54997, 35691, 11332, 51800, + 7715, 64482, 34679, 53085, 9936, 25116, 46592, 21997, 38644, 25514, 41370, +17829, 50768, 38862, 22281, 5095, 48742, 11861, 44470, 60779, 14934, 26744, +50484, 36275, 10809, 22621, 54966, 36113, 301, 42585, 28318, 37548, 22388, +33058, 38956, 10011, 34833, 50031, 16679, 43658, 54024, 18623, 48894, 27828, +36924, 17104, 39070, 31825, 16134, 57701, 42065, 6925, 52527, 36918, 15655, +46341, 5835, 48237, 11286, 38630, 3724, 50546, 31567, 1115, 53228, 38152, +63611, 15672, 36052, 59792, 12948, 64897, 36975, 57096, 7459, 61848, 29284, + 1786, 33509, 42242, 8395, 48378, 35752, 6566, 24622, 56752, 20300, 35275, +62674, 5517, 31550, 49397, 510, 30730, 47740, 5914, 61551, 34806, 57319, +10658, 23676, 43816, 59558, 15303, 54354, 22201, 61418, 34011, 5465, 46590, +18611, 35267, 52271, 8260, 48672, 3233, 42493, 22504, 40825, 19920, 60230, + 80, 29681, 46088, 22094, 44036, 20447, 65441, 3710, 58535, 37380, 1484, +43644, 11514, 38395, 15890, 44727, 18052, 58931, 26461, 62624, 18528, 52334, + 7786, 44875, 12597, 41643, 15597, 43069, 18768, 44868, 24695, 16149, 36863, +12792, 38807, 8957, 51288, 28516, 58832, 15088, 55365, 33564, 16294, 52192, +36300, 12507, 34505, 48354, 23392, 2894, 33976, 62749, 5462, 57207, 25024, +40309, 5822, 43937, 56428, 27173, 61626, 10247, 57336, 2428, 23977, 52211, + 7246, 27601, 63121, 32260, 16504, 48089, 40286, 6329, 38133, 10928, 45043, + 6687, 58524, 21404, 53120, 8731, 35415, 47674, 11833, 40921, 4315, 51691, +27255, 64523, 11045, 56488, 36473, 5233, 41518, 23855, 38129, 4550, 51154, +13347, 48533, 23705, 45257, 14732, 41327, 53592, 24220, 7006, 41938, 30688, +12481, 59564, 1497, 23239, 62400, 26729, 11509, 59176, 4838, 45771, 20979, +37436, 19136, 42416, 13610, 36263, 53513, 23319, 10978, 50714, 7301, 44747, + 9864, 26734, 60974, 18583, 31393, 44172, 14754, 22959, 57962, 39556, 6577, +60951, 11630, 52934, 5732, 58405, 31445, 9871, 57356, 41600, 16353, 52633, +24489, 10237, 47362, 34924, 8696, 24426, 48772, 34502, 6971, 47166, 24221, +52103, 5918, 60829, 11410, 54675, 19008, 64549, 25617, 2215, 37373, 31450, +12773, 65462, 7343, 55718, 9851, 63815, 3034, 56264, 36408, 26955, 12953, +63517, 27945, 3354, 55525, 32613, 63271, 19676, 53491, 24475, 64535, 12842, +40648, 59361, 22604, 5296, 32253, 51936, 1891, 28779, 44267, 22706, 10053, +27311, 41043, 19551, 52004, 36260, 16525, 65526, 29269, 17262, 61378, 29990, +45453, 8814, 31849, 53620, 18316, 47842, 21138, 35799, 59823, 16572, 36143, +51460, 21083, 13357, 39067, 29305, 61174, 128, 32261, 36890, 9423, 49370, + 1784, 20375, 55005, 29059, 63572, 482, 30443, 42012, 21541, 53531, 16692, +58362, 7685, 43484, 12326, 54529, 38865, 7133, 62020, 14572, 53259, 23952, +49080, 27781, 13668, 54252, 24583, 60439, 20828, 52396, 218, 40749, 11886, +44025, 2768, 41400, 14866, 37759, 26369, 51294, 552, 65072, 31803, 51998, + 3587, 39541, 59142, 4747, 53555, 23322, 62036, 18121, 44879, 7451, 47125, +30447, 10393, 44662, 3236, 46290, 25143, 58086, 15952, 61207, 29762, 53101, +18748, 44484, 29513, 534, 60691, 31561, 22243, 11665, 42881, 16889, 47076, +29353, 34747, 44746, 17160, 49712, 38135, 20620, 9948, 56508, 30746, 15258, +63607, 19205, 57445, 24974, 51975, 30913, 3491, 39040, 27130, 61932, 558, +52740, 23839, 45300, 14395, 42476, 18164, 47181, 29599, 17112, 62133, 14420, +54121, 16200, 58456, 25261, 44131, 2126, 54631, 6163, 61827, 23015, 2374, +63413, 32932, 59840, 4746, 53945, 27030, 35938, 45457, 6444, 33136, 48189, +22182, 41461, 13070, 49594, 1577, 52444, 26752, 57653, 22254, 8656, 61502, +43028, 18188, 57079, 28097, 34540, 47061, 2692, 38793, 53892, 4986, 33017, +48286, 2960, 31457, 50313, 18534, 42932, 21634, 48025, 35179, 14760, 46848, +19210, 32875, 62968, 2618, 40670, 57113, 19285, 63334, 29924, 57708, 4236, +52864, 30666, 15121, 65334, 17248, 39835, 25177, 45062, 4407, 47049, 7446, +51838, 29534, 61417, 8421, 42448, 28948, 45836, 19577, 41470, 25369, 49635, +22246, 6509, 51166, 38020, 18034, 41228, 49829, 21902, 9346, 26898, 41723, + 1957, 43072, 20712, 46164, 25581, 9545, 35486, 56863, 18344, 39742, 24723, +54659, 5733, 52952, 31953, 48938, 3908, 45053, 12059, 58400, 31086, 4764, +50704, 37818, 1084, 52472, 13163, 64586, 38132, 1677, 42816, 13729, 57789, +10490, 27163, 53446, 11151, 25101, 41812, 53935, 6927, 47626, 16188, 52603, +21190, 57925, 27055, 38053, 30330, 45416, 23725, 8981, 42454, 24546, 56614, +14343, 59755, 9628, 37183, 26117, 51390, 17630, 48799, 25849, 14101, 49735, +30389, 36011, 5834, 45266, 10133, 32477, 50569, 19140, 40775, 4865, 46878, +26707, 62939, 19951, 56475, 21972, 54836, 24609, 58214, 4049, 63364, 20462, +46505, 27851, 8591, 23405, 61194, 28397, 10799, 48473, 15399, 43821, 185, +41060, 13391, 63986, 35961, 18818, 56970, 22072, 60787, 20644, 53422, 861, +39649, 11835, 44041, 7847, 41687, 10225, 51368, 33664, 12519, 49347, 36558, +64597, 1517, 54691, 25093, 6144, 63818, 12762, 58475, 25866, 1382, 52861, +35820, 43787, 4273, 51665, 28229, 46180, 2577, 41595, 14188, 37304, 64433, +16453, 49820, 20544, 44004, 19257, 61180, 17161, 59067, 1366, 54259, 35040, + 6831, 50835, 33280, 45606, 708, 31882, 42834, 9988, 32923, 60885, 27223, +39494, 11781, 51063, 29159, 38432, 9933, 21293, 49265, 34595, 7676, 51570, +16568, 57749, 38220, 627, 65318, 16115, 56903, 27726, 61233, 12444, 43873, + 4077, 49197, 38390, 25684, 1055, 39348, 32935, 4720, 64865, 21517, 56327, +16263, 24607, 61910, 40773, 12854, 63736, 15922, 35364, 55894, 2381, 65073, + 9105, 27496, 61951, 1116, 54926, 8587, 28689, 49691, 22669, 6561, 43041, + 727, 45170, 20791, 41471, 18413, 58745, 35652, 8958, 33146, 57341, 12841, +30496, 62147, 23318, 40662, 20745, 44180, 14891, 32316, 58144, 818, 24084, +61002, 4795, 44112, 10396, 40294, 62755, 23638, 2415, 59159, 10696, 34050, +61063, 31152, 54162, 14453, 58851, 17320, 54956, 5519, 60865, 29829, 44912, +13607, 49777, 7989, 61552, 21142, 47503, 16148, 59058, 14832, 63875, 24142, +49786, 6903, 40581, 55278, 24741, 15202, 46558, 21944, 41963, 26794, 16192, +59407, 23332, 52295, 3679, 32732, 46208, 4949, 33433, 64825, 1598, 31557, +62224, 25822, 40249, 10019, 45713, 3579, 50626, 14320, 62554, 12512, 58320, +38768, 15782, 47615, 6183, 43999, 34216, 27935, 63377, 1623, 30283, 61246, + 4462, 37008, 59297, 23072, 2632, 57814, 40546, 18065, 61329, 38619, 6571, +63900, 12750, 56891, 34240, 8489, 30123, 49478, 5184, 37259, 9354, 46810, +17479, 42367, 16076, 39928, 9581, 57715, 36119, 49508, 13066, 45618, 33224, +20312, 55810, 26735, 59630, 22156, 52563, 27679, 2180, 50298, 6543, 41557, +32492, 8387, 31611, 43001, 22904, 55647, 19518, 58860, 31745, 64973, 15772, +39479, 57956, 20434, 7443, 28424, 41407, 14259, 50305, 38000, 22239, 42995, + 5006, 39770, 65290, 33707, 8229, 22106, 59799, 33066, 9360, 31958, 55071, +20133, 60219, 8107, 28526, 42648, 5537, 57533, 11137, 38263, 6214, 36633, +25358, 45934, 13772, 22660, 63480, 24364, 9757, 26276, 59611, 39219, 17900, +65533, 20182, 36634, 15509, 53093, 31662, 16225, 47864, 17374, 55889, 40959, +25568, 13228, 64883, 22591, 41524, 10179, 23714, 50855, 30425, 44777, 6793, +38715, 17138, 40781, 21543, 62951, 28838, 11323, 53089, 30500, 62449, 15011, +49936, 17163, 41817, 11782, 48991, 36795, 10731, 27494, 50842, 20071, 45624, + 8019, 30396, 41001, 24718, 33833, 45563, 16901, 44020, 25367, 34920, 59406, +16794, 38464, 52071, 25736, 54552, 16237, 62186, 12469, 44449, 2722, 48009, +25897, 45614, 1852, 49848, 36734, 17914, 43400, 12391, 60122, 3586, 56246, +39168, 18246, 52577, 35450, 11374, 53111, 16721, 58422, 30238, 14043, 42593, +54651, 28861, 47865, 20595, 879, 45197, 7185, 47108, 30314, 36467, 11021, +37450, 14994, 51584, 3168, 65261, 19815, 42856, 32488, 9428, 31446, 39519, + 2221, 43911, 35782, 17206, 33495, 62308, 21550, 12612, 43635, 63133, 9330, +58737, 4318, 51572, 34534, 7138, 46821, 17502, 39792, 63429, 14201, 41008, +55654, 17640, 48603, 15554, 37284, 4400, 57036, 31788, 19946, 64972, 18427, +41518, 6475, 47947, 33658, 2888, 53471, 26870, 61662, 19919, 3582, 50426, +12899, 46991, 39766, 18707, 45092, 28307, 8764, 53558, 33688, 15404, 29134, +54588, 625, 25626, 46504, 21797, 44183, 28400, 14312, 59512, 42704, 15527, +32143, 65276, 22997, 33975, 61493, 8154, 55564, 24039, 53521, 32403, 4518, +21538, 54773, 1533, 64367, 37920, 5193, 42371, 10510, 37706, 6046, 46526, +34388, 25097, 62609, 14324, 56013, 27166, 65256, 10712, 50182, 4663, 40678, +27461, 2084, 23926, 47227, 5204, 24831, 51756, 32074, 55739, 19284, 60080, +33204, 10938, 52657, 19700, 55433, 28827, 10466, 23195, 58022, 41981, 14409, +48666, 23632, 50981, 5865, 42985, 22529, 36310, 53460, 13691, 48448, 25309, +33374, 54693, 28095, 52343, 12225, 30469, 55770, 40884, 2411, 48225, 31193, +52936, 21043, 8740, 50585, 3510, 48959, 8039, 57269, 1002, 37903, 64702, + 5339, 43745, 28190, 175, 57453, 43311, 30462, 3301, 60874, 29724, 56210, +19442, 9023, 35161, 54283, 22816, 47667, 5932, 51162, 9658, 34281, 58516, +16595, 48350, 6944, 41013, 25388, 55486, 6390, 59759, 28832, 252, 58894, +42783, 5973, 56918, 26089, 60303, 16992, 54040, 12599, 59979, 4045, 56382, +36032, 13780, 47882, 5512, 43688, 12898, 29386, 9370, 37042, 31862, 5978, +51092, 32634, 60494, 16686, 55129, 20040, 63416, 28105, 8266, 52886, 557, +54975, 19327, 48923, 24272, 5564, 44928, 13890, 48434, 31846, 20514, 46348, +34839, 346, 53536, 31727, 19793, 5551, 35965, 57507, 32517, 17852, 64129, +23983, 4680, 61803, 28420, 52701, 23230, 39176, 27820, 33935, 47270, 831, +54010, 28249, 63369, 18960, 50776, 26885, 8850, 56813, 690, 25733, 47354, +35447, 2379, 32873, 40424, 23826, 48761, 11461, 61067, 28534, 33845, 54468, + 8232, 22599, 50649, 26337, 8855, 38997, 24282, 58352, 11829, 44888, 17132, +49806, 36618, 7795, 44412, 24079, 54570, 27624, 17001, 65487, 32637, 10093, +31539, 45634, 35996, 22864, 55407, 31762, 6899, 53796, 13488, 65086, 38855, +16442, 42070, 62991, 8249, 43333, 35209, 58939, 11037, 55820, 2904, 38550, +53596, 23414, 2413, 39731, 51236, 13360, 48414, 1047, 25860, 43696, 30497, + 2103, 42863, 13857, 62264, 38743, 23933, 42755, 14690, 31300, 58154, 18858, +54643, 25964, 61016, 16706, 57603, 9256, 30732, 47383, 3859, 44270, 20245, +45911, 18174, 62938, 15352, 53919, 32628, 56254, 18336, 61710, 37803, 2748, +43265, 9762, 46316, 4216, 27712, 62809, 232, 41403, 13373, 46540, 31253, +47917, 3176, 27571, 62601, 509, 40784, 14940, 64843, 11811, 56105, 1196, +23990, 62306, 30218, 2298, 63912, 10123, 41994, 3205, 65218, 38155, 7546, +27809, 57745, 18531, 42265, 4433, 61664, 36829, 23041, 55937, 25157, 43476, +20997, 45920, 11049, 30524, 53807, 14379, 60541, 36501, 20286, 9264, 54337, +35235, 13883, 46207, 4214, 39525, 60140, 25805, 2728, 63302, 13935, 57200, +35571, 24448, 46405, 3358, 44495, 22769, 33711, 59292, 1719, 29465, 42869, +14406, 38090, 51412, 22598, 13924, 31734, 37475, 1419, 40180, 32244, 5218, +49918, 22501, 42004, 28320, 7570, 62731, 23507, 54225, 20776, 65230, 40351, +61064, 14542, 55698, 39137, 21952, 7935, 27258, 40589, 5253, 43004, 13770, +39323, 58918, 15656, 48183, 31201, 37967, 10450, 35027, 63097, 30706, 59230, + 3275, 38978, 64212, 7034, 26136, 61966, 36128, 7996, 43832, 65266, 23301, +12644, 52652, 42457, 9816, 39216, 50904, 16313, 43327, 477, 63173, 10520, +58558, 7269, 25524, 60526, 16625, 41249, 4157, 54953, 13677, 60914, 34071, +28618, 36210, 54620, 7923, 60645, 30099, 16986, 56978, 13420, 29562, 42671, +19679, 44840, 2871, 24464, 58519, 35297, 1014, 60240, 29948, 52256, 3384, +34312, 51279, 22807, 63788, 2115, 28729, 53621, 13733, 60274, 913, 36685, +50770, 7368, 44403, 21061, 49523, 13601, 64325, 8434, 36754, 20817, 62328, +24378, 36571, 962, 29901, 49212, 5244, 31913, 51318, 12287, 20480, 31740, +37786, 24083, 49052, 19468, 7825, 35746, 62102, 25138, 6191, 58011, 27896, +35226, 53167, 12719, 59687, 37120, 18631, 47551, 28787, 11328, 59459, 17644, +48084, 8151, 35271, 46134, 2746, 43281, 12503, 41856, 20948, 37442, 51871, +19181, 40551, 14939, 52323, 1936, 37355, 30368, 46921, 9898, 42727, 6699, +45290, 10824, 26946, 53455, 17999, 62315, 23946, 35597, 48119, 16588, 44639, +24031, 59536, 5915, 61695, 16671, 54290, 37774, 13142, 31510, 57060, 25153, +35638, 44688, 18698, 47527, 38764, 9019, 44992, 36035, 22469, 48990, 16050, +50129, 32387, 19515, 60831, 34096, 10644, 50029, 15128, 46952, 33144, 12435, +44500, 18524, 40250, 12718, 62701, 33081, 59012, 18154, 35242, 46710, 7908, +24060, 63061, 37694, 15494, 47508, 26203, 33965, 51772, 27980, 10859, 48114, +32839, 18775, 44269, 27979, 47, 55243, 20190, 65169, 29477, 8384, 51135, +13774, 35252, 51866, 20663, 62787, 26071, 8777, 34706, 65532, 43493, 12297, +55093, 14437, 63170, 37260, 19530, 46386, 15726, 50442, 30836, 39510, 1773, +33755, 46131, 3400, 19623, 32397, 42530, 2144, 28436, 64787, 31489, 56334, +14316, 61525, 29406, 54202, 3820, 23663, 44754, 26017, 6093, 65063, 27605, +53329, 21073, 9060, 26841, 50556, 23106, 11914, 34001, 50131, 13238, 21489, +51967, 33735, 15593, 49091, 39887, 4094, 26521, 56111, 33396, 12971, 57806, +25498, 48083, 18038, 41515, 21426, 53421, 35240, 12647, 50046, 22115, 46833, +25973, 42758, 5535, 47850, 10453, 44807, 15421, 42045, 19517, 53657, 34803, + 5187, 36176, 65161, 4, 55235, 15335, 62391, 38571, 11831, 49158, 31523, +17080, 47395, 14673, 62982, 28762, 7300, 42498, 13026, 32939, 60697, 22013, +39641, 20693, 46511, 11900, 31257, 56067, 23395, 60458, 1324, 52979, 25659, +33342, 57967, 2754, 42204, 10501, 51227, 26226, 56373, 21307, 60395, 18326, +38321, 28857, 52662, 4490, 61777, 9103, 30942, 64900, 29437, 45019, 10197, +47468, 29678, 38141, 10908, 60570, 19901, 49256, 5636, 27455, 64476, 7199, +56298, 34029, 3405, 52382, 29613, 61894, 13703, 24847, 65123, 20107, 52888, + 4402, 49075, 27542, 599, 63588, 10015, 57783, 34436, 28563, 60600, 6385, +25021, 59528, 20454, 51994, 22566, 36478, 59125, 13564, 42031, 31158, 6838, +58577, 12614, 56619, 20897, 51218, 15146, 37002, 26837, 40577, 10848, 21694, +52176, 39568, 10074, 50302, 3763, 29898, 61252, 12876, 27985, 57804, 19199, +59828, 7103, 29606, 57057, 24153, 9530, 47597, 4212, 51226, 22090, 35924, +62959, 7873, 26955, 57893, 1628, 64050, 6387, 52493, 27415, 3930, 23385, +51916, 2561, 25501, 51233, 41682, 4610, 29093, 56532, 2044, 61913, 8180, +20680, 63955, 41086, 15777, 53157, 38115, 7973, 59710, 32759, 15405, 42700, +12253, 39025, 57439, 18787, 31876, 63967, 12450, 47172, 3872, 54502, 30529, +53380, 4358, 24306, 47123, 21450, 48524, 27457, 10215, 57754, 400, 64604, +11038, 55333, 18979, 58911, 27991, 15484, 58165, 51504, 7406, 58678, 23869, +49209, 10561, 42766, 883, 46831, 24694, 9818, 36544, 30941, 64071, 9475, +37133, 55586, 16223, 42175, 1920, 47025, 32368, 43624, 15612, 60386, 29655, +56191, 4213, 40016, 59358, 24352, 2875, 57973, 8426, 30098, 62142, 37221, +22166, 2157, 48639, 30140, 7536, 34799, 56567, 4464, 45241, 14549, 43552, +31291, 6454, 55536, 11758, 37476, 19795, 52824, 23045, 65033, 18276, 59547, + 4039, 48971, 9675, 45396, 25434, 50830, 14874, 38641, 26023, 49467, 9449, +27414, 43663, 19211, 64456, 37727, 5335, 42868, 20347, 39612, 59881, 19251, +55846, 38745, 9800, 43957, 4789, 52767, 25447, 63135, 19395, 39136, 5235, +40765, 28647, 37287, 5687, 48027, 14604, 51905, 28550, 59838, 20143, 47244, +10995, 40793, 13841, 53958, 2085, 63561, 22203, 45192, 15821, 50853, 40766, + 870, 49912, 21153, 57430, 16193, 52658, 19389, 45575, 4355, 42002, 14725, +33040, 52519, 17166, 41161, 20273, 46082, 26800, 40219, 6233, 22834, 50734, +34256, 7622, 38869, 29074, 62284, 15388, 58694, 32795, 20584, 43652, 25839, + 7515, 54448, 16864, 49465, 34819, 25, 38089, 11945, 63488, 3634, 29827, +45877, 903, 49634, 20388, 33689, 40429, 3302, 37861, 8132, 33042, 51953, + 1858, 57529, 33926, 64229, 4593, 22764, 59387, 34355, 17796, 48832, 6069, +32615, 49688, 3382, 51535, 13267, 35303, 44149, 894, 39020, 59366, 14961, +44346, 25430, 58620, 0, 21342, 53694, 38457, 17373, 50915, 28189, 45512, +16734, 48081, 31263, 43187, 15070, 39600, 64145, 12973, 21338, 52732, 40015, +19520, 43006, 22531, 53472, 35724, 1110, 24167, 58802, 5415, 26412, 49938, +19640, 39891, 61017, 6534, 54022, 26528, 2288, 49391, 40478, 6056, 44007, +17964, 39558, 19579, 48057, 16392, 40707, 58213, 8513, 61749, 3209, 34085, +52863, 23088, 40612, 20885, 38343, 5949, 43485, 12247, 50645, 35063, 10077, +38733, 30965, 17563, 45625, 15283, 54063, 19762, 52310, 15902, 38164, 58207, +20605, 51979, 18828, 49609, 28785, 12831, 51101, 22720, 60587, 16567, 57363, + 6742, 54357, 1143, 41857, 14175, 47594, 27646, 9350, 49506, 29563, 38645, +25539, 53849, 19246, 9130, 59478, 40627, 18896, 65080, 36643, 12174, 24126, +50393, 29897, 57659, 2482, 62472, 38696, 24227, 64272, 1355, 58004, 11191, +40013, 3050, 50538, 25112, 39379, 28302, 64015, 21424, 57861, 8520, 32589, +60043, 6331, 36664, 30768, 55750, 4064, 53693, 7752, 27078, 57555, 12190, +55188, 610, 27115, 46039, 5830, 25205, 51739, 18650, 59162, 11230, 42917, + 3759, 49948, 13416, 58697, 15687, 54738, 18339, 60943, 22172, 41420, 31324, + 9348, 38559, 4325, 36093, 63849, 3630, 43540, 19985, 47981, 34623, 7639, +36437, 56807, 25380, 12624, 58392, 27975, 5469, 37236, 32211, 1713, 64268, +14298, 55927, 24102, 62679, 38165, 10651, 45327, 111, 51590, 10119, 63850, +16082, 57677, 35906, 950, 54160, 27027, 48636, 11342, 34222, 44767, 7019, +39375, 54995, 4796, 59834, 38927, 22066, 42009, 12511, 64117, 26617, 55419, +28656, 41774, 21796, 50895, 16801, 65410, 25714, 54838, 9325, 64270, 28184, +54375, 25505, 63612, 19175, 45731, 23690, 8563, 43373, 28971, 45953, 7907, +26970, 63303, 21841, 38237, 55225, 15054, 43267, 33809, 26842, 47872, 16662, +62719, 33109, 20420, 53551, 34759, 8405, 38618, 31040, 45982, 29421, 5144, +42977, 33559, 14651, 36200, 61234, 9888, 55729, 7224, 58161, 27211, 9025, +34525, 59953, 26489, 6999, 59289, 12327, 49088, 16908, 44790, 29432, 49430, +14837, 36706, 64739, 12965, 45108, 4572, 30879, 47114, 17358, 37216, 60123, +24564, 11523, 55149, 30163, 61143, 9937, 56781, 2201, 43925, 29224, 15440, +31692, 38797, 25124, 45080, 6346, 43548, 13098, 59674, 26674, 53381, 24491, +64081, 4701, 47130, 25971, 13, 63688, 34533, 5429, 60120, 28975, 36768, + 8385, 63038, 32534, 2839, 44295, 7334, 41384, 1258, 60901, 33272, 4181, +46056, 10014, 29926, 40023, 24185, 34481, 48806, 20155, 44309, 18893, 64413, +37045, 16536, 61399, 12329, 47802, 1301, 41724, 51146, 32522, 14144, 45570, + 3695, 53290, 29165, 60167, 19661, 9939, 35905, 48716, 22826, 14121, 44106, +18641, 42043, 27342, 46036, 20991, 43755, 30790, 8367, 55747, 11976, 37175, + 1553, 40025, 28295, 47780, 18306, 52464, 21809, 63751, 16454, 46352, 21382, +36306, 48787, 15722, 45164, 24959, 36312, 52975, 15087, 34911, 62818, 1509, +48879, 27148, 36454, 15870, 56972, 33895, 27536, 35643, 46984, 7984, 42759, +10889, 50197, 374, 63207, 23179, 56848, 33364, 14354, 30624, 45788, 23489, +59153, 11843, 27381, 60016, 22984, 3086, 35427, 46827, 18217, 38633, 60983, +13160, 54821, 41323, 22304, 39499, 21159, 51851, 2655, 26577, 57091, 21140, +60752, 28365, 38007, 23368, 49893, 11056, 46619, 31578, 15641, 60355, 19586, +56745, 1761, 26537, 51587, 23996, 12103, 46851, 28070, 10864, 50161, 3167, +45353, 17504, 41083, 14486, 49017, 7168, 58103, 8967, 39290, 32731, 5797, +42632, 32136, 21381, 46252, 11308, 43007, 4081, 42106, 13599, 50402, 32357, +17839, 60388, 16220, 55529, 40380, 2093, 53247, 11101, 24709, 65490, 23327, +10306, 60655, 4481, 52205, 27787, 8816, 45707, 2589, 27020, 61373, 16372, +54566, 11259, 65053, 24080, 59224, 9277, 56642, 3028, 32433, 20945, 34812, +47355, 17234, 44579, 30535, 47799, 1272, 45352, 33972, 15950, 37360, 4892, +62870, 9932, 53954, 7538, 43108, 31126, 1909, 54724, 27879, 52502, 14778, +35305, 63142, 8906, 21348, 47645, 28711, 36804, 582, 25490, 46486, 22137, +36680, 64218, 7002, 36108, 52429, 17185, 57407, 14800, 63553, 28738, 49363, + 3708, 42922, 11663, 37268, 20097, 40727, 21934, 57511, 42262, 14900, 53377, +25537, 38206, 3277, 48523, 25482, 40711, 17176, 50846, 14794, 62618, 23587, +45674, 16928, 39624, 57886, 19450, 35339, 52424, 4594, 64805, 9698, 27253, +61607, 7530, 53917, 1809, 30459, 46236, 5168, 42872, 20110, 63852, 31030, +21026, 4840, 62570, 25383, 49232, 15105, 42655, 1592, 39966, 64624, 25117, + 8538, 34249, 49499, 4644, 52297, 12230, 61691, 6604, 57085, 13960, 62641, +36452, 18774, 50063, 23061, 61752, 15783, 53376, 3339, 42320, 11594, 44345, + 1434, 40346, 10590, 60853, 28579, 2172, 61701, 30463, 8623, 65396, 10415, +31017, 47680, 17863, 41620, 29955, 8283, 63933, 45937, 24037, 8987, 62172, + 2133, 24742, 64853, 32461, 55841, 19669, 44073, 16270, 46094, 6638, 52719, +25152, 58228, 12482, 53145, 6281, 32803, 46544, 16549, 44609, 29321, 63993, + 6506, 55435, 9882, 29102, 43905, 23624, 9521, 58965, 6878, 46703, 11955, +36331, 48814, 6369, 43892, 30968, 8443, 53758, 2274, 30084, 42649, 18122, +63308, 37927, 4145, 42482, 14533, 40763, 64205, 16959, 37228, 61540, 16172, +36538, 64780, 15481, 56966, 31845, 54195, 5116, 60042, 23785, 32911, 37346, +26944, 56769, 15513, 59695, 13805, 52134, 1700, 35509, 60952, 17909, 55423, +27159, 62192, 5189, 56383, 35477, 1156, 49916, 32149, 14765, 44022, 18651, +46696, 35766, 303, 34648, 54476, 18490, 42365, 12506, 37524, 56452, 17843, +64417, 40034, 19621, 43657, 3832, 41757, 18169, 47602, 15269, 31169, 40116, +25728, 43603, 59490, 488, 28341, 62516, 4352, 55044, 13585, 56936, 18277, +64563, 28750, 55406, 26364, 33206, 38755, 23458, 60714, 18080, 56667, 24571, +38564, 9422, 33544, 58399, 1302, 28753, 53131, 38999, 4220, 61979, 14308, +56132, 40913, 5775, 58660, 10598, 20446, 31049, 60482, 910, 42119, 7835, +46509, 33611, 17792, 36023, 56743, 16989, 62272, 1505, 55836, 12845, 49446, +16764, 30039, 48064, 9215, 44663, 13462, 63937, 20877, 55004, 4608, 59234, +30145, 39796, 21451, 54811, 12167, 52851, 25484, 8493, 30843, 63309, 14851, +45273, 17888, 38462, 51768, 15917, 39384, 33273, 22989, 58328, 17824, 56901, +15217, 54700, 35292, 11158, 58603, 43800, 36216, 10363, 30696, 61133, 20624, +54942, 27028, 5889, 53017, 30466, 61309, 16884, 58348, 31048, 36500, 22739, +38608, 28054, 47257, 402, 29814, 58415, 5018, 44333, 10614, 45999, 24486, +57350, 20571, 61435, 17353, 51561, 22615, 42877, 18160, 51083, 38459, 17317, +50036, 35439, 22584, 33698, 56276, 4152, 58867, 13920, 54408, 33445, 20636, + 229, 35047, 43726, 18106, 49108, 39901, 21557, 3987, 27352, 39481, 12473, +58492, 28751, 37672, 20899, 48540, 1453, 38989, 17004, 35794, 64736, 167, +55055, 9278, 52418, 14288, 32851, 41978, 22635, 52076, 3660, 63117, 35088, +27225, 50744, 18537, 43356, 29383, 16550, 64960, 18396, 40261, 58326, 18929, +36806, 61402, 5099, 48992, 8655, 29689, 47375, 22016, 53122, 28593, 9319, +45552, 3577, 31496, 53678, 1223, 23889, 42957, 28421, 10400, 22743, 47541, +34779, 1573, 62460, 11347, 52602, 2932, 48146, 35854, 23231, 37136, 57645, +24422, 7021, 49341, 32482, 11703, 38018, 30642, 15453, 48244, 25182, 38176, + 6756, 62437, 27880, 58849, 7576, 56713, 28441, 44723, 6946, 48777, 25712, +63748, 22118, 5013, 49406, 28675, 6112, 48188, 12317, 59863, 28245, 55088, + 1206, 34859, 52160, 6062, 63789, 10969, 22772, 52992, 38400, 12314, 42663, +21758, 37946, 23073, 41401, 3410, 43492, 10657, 48043, 17817, 57666, 3081, +29983, 46020, 5873, 44122, 20316, 62357, 18495, 40890, 23313, 44290, 15923, +32017, 50213, 20203, 42740, 18445, 32271, 52994, 27471, 34625, 51835, 44667, +12902, 49598, 19827, 54288, 26225, 1998, 60834, 9122, 28030, 47719, 22155, +42285, 27499, 44288, 6829, 61967, 3969, 27615, 60708, 21780, 51719, 30810, +10357, 34742, 46634, 22704, 8890, 56248, 2271, 29489, 42500, 5699, 61794, +36568, 49358, 108, 41979, 21880, 58175, 32853, 2686, 30700, 59679, 12777, +52370, 8840, 40397, 27585, 37417, 6643, 23129, 52367, 33383, 8130, 22006, +57095, 38671, 6157, 44237, 10768, 36445, 47642, 17596, 41545, 104, 45503, +25631, 9283, 51459, 2591, 54790, 9832, 32607, 53025, 16081, 42554, 31935, +19891, 54396, 29565, 7012, 32499, 37826, 5939, 39386, 29865, 58655, 4568, +56291, 8177, 24303, 43575, 6132, 59254, 2897, 50668, 19674, 43782, 23437, +46978, 6416, 40385, 56582, 29585, 61056, 11404, 55571, 28445, 12829, 52140, +31342, 61745, 7478, 53578, 34756, 3058, 65258, 10027, 41409, 29000, 62555, +26563, 50951, 15043, 30861, 38723, 24911, 40408, 20937, 50478, 1881, 62348, +13958, 47781, 15359, 49734, 413, 34056, 63464, 5224, 56759, 37455, 13304, +50716, 3743, 24597, 47004, 9579, 26134, 54404, 34332, 24979, 56208, 14015, +59541, 5997, 33998, 58088, 21759, 51070, 18162, 40650, 29304, 51738, 7811, +58942, 36201, 63139, 9192, 29666, 53273, 21047, 46998, 22562, 41564, 25450, +10033, 62073, 4718, 19682, 48067, 29884, 39656, 655, 53108, 17203, 58236, +41356, 7487, 64724, 13056, 52578, 30928, 4403, 32306, 42279, 16798, 50618, +21157, 61773, 30383, 2023, 35730, 54038, 41837, 14032, 32971, 57257, 22484, +51552, 30779, 13289, 38200, 26819, 61905, 11921, 42268, 19313, 47071, 35373, + 8640, 24714, 51039, 17743, 61021, 5573, 48594, 11327, 51447, 23745, 61349, + 376, 42139, 13637, 49766, 37845, 15734, 63560, 13180, 50487, 3526, 45716, +10187, 51882, 5539, 64387, 12017, 34907, 57667, 6869, 64791, 11072, 37843, +14848, 61448, 3393, 21350, 40126, 27123, 58513, 9978, 34395, 50370, 22479, +53041, 34699, 5727, 54704, 14172, 59561, 18674, 52329, 35097, 57197, 39256, + 7182, 42808, 1432, 41107, 56665, 27890, 14125, 65477, 35843, 26566, 33963, +49840, 17528, 48370, 31916, 13490, 23968, 56938, 11636, 53045, 6334, 23207, +62286, 41763, 5998, 45725, 35832, 24946, 62879, 221, 51623, 29992, 45399, + 2759, 24528, 55472, 34972, 673, 26366, 52222, 22245, 63004, 28863, 12423, +58875, 21753, 56372, 13500, 38778, 63120, 19666, 48670, 24065, 64721, 14981, +37992, 61153, 7409, 36781, 59129, 2741, 40437, 64493, 14836, 48384, 27436, +53948, 8679, 20331, 47038, 35127, 29264, 62911, 14810, 53395, 25799, 40920, +13138, 62340, 7953, 38285, 16834, 64766, 24458, 12504, 51231, 21289, 45520, + 4564, 37447, 59738, 6733, 45328, 15887, 47910, 26076, 17008, 49849, 21963, +55083, 19043, 51805, 9437, 42377, 4978, 34472, 58094, 18222, 61305, 3834, +56590, 35958, 24545, 32298, 37393, 25687, 39280, 29607, 57872, 13659, 28043, +47824, 23378, 1388, 55280, 27214, 34545, 63074, 15280, 55853, 41728, 21418, +12379, 50505, 2535, 44033, 35397, 24014, 48424, 13254, 39551, 7239, 57406, + 9703, 62785, 20146, 46543, 21729, 2210, 42407, 26313, 44977, 16404, 43205, + 5329, 61138, 17365, 55675, 34214, 29441, 51289, 33446, 9635, 58642, 14049, +65031, 23496, 46720, 3074, 29236, 54166, 20905, 44554, 18910, 46347, 22151, +51963, 10733, 64042, 3653, 41117, 13535, 39405, 58292, 20036, 9589, 24145, +60113, 38056, 10654, 42683, 1817, 36527, 63242, 7738, 45079, 15662, 48978, +23063, 55492, 4730, 57175, 29774, 65270, 2241, 40298, 29596, 53390, 16540, +63343, 34948, 14740, 30028, 52691, 21358, 65388, 32542, 8721, 51843, 34990, +27657, 32775, 56092, 26086, 61625, 29337, 48297, 25304, 53827, 2504, 27047, +45282, 23841, 51041, 1647, 48402, 24588, 42882, 32927, 63059, 4678, 36794, +29029, 65257, 6691, 40063, 16285, 44894, 24435, 32828, 40448, 3007, 37177, +11024, 21077, 24858, 13791, 55279, 18711, 61687, 23390, 6083, 50533, 39215, + 370, 52573, 11296, 57767, 7529, 64189, 35530, 3143, 55579, 40229, 17627, +45894, 27653, 35908, 49774, 10574, 25191, 55827, 22147, 3568, 47303, 13595, +44181, 16308, 58919, 18886, 64829, 39905, 14886, 50350, 29589, 59666, 13764, +42048, 2988, 50847, 38231, 4997, 43570, 16249, 52584, 28576, 5745, 43138, +29451, 7813, 44084, 33914, 3730, 24016, 50802, 13466, 26358, 49012, 17892, +33646, 51712, 656, 62451, 14069, 34062, 64921, 26118, 11264, 48061, 337, +45005, 34377, 9125, 47903, 28581, 36729, 22217, 58091, 32669, 2446, 35483, +44458, 5188, 41570, 16531, 50122, 19675, 31944, 41629, 23970, 57234, 1863, +43005, 60639, 7834, 44850, 31407, 5481, 36482, 20379, 60297, 23868, 49271, + 7387, 47358, 11497, 43650, 27977, 8446, 58806, 10493, 54489, 4620, 60409, + 8294, 22571, 53057, 39249, 9045, 61815, 30563, 40855, 9963, 49457, 6963, +38673, 29488, 735, 65359, 39721, 20156, 61732, 27500, 10778, 64641, 266, +31926, 60866, 23907, 35032, 46024, 32563, 4592, 30630, 49736, 35321, 13929, +56548, 6136, 64849, 12221, 38570, 13485, 44853, 399, 49873, 7920, 21716, +63403, 41070, 18343, 45271, 36402, 8984, 32876, 60619, 14658, 39601, 31336, + 2523, 57790, 9894, 60061, 26139, 37636, 20262, 47320, 17934, 53563, 8181, +27327, 45969, 31915, 50545, 614, 25944, 52830, 21437, 58370, 16058, 25218, +49683, 20342, 57489, 2493, 37153, 13573, 45541, 16876, 43058, 15143, 32033, +58589, 8893, 24160, 44670, 28998, 6634, 56270, 36926, 12823, 46681, 6053, +23157, 57232, 25433, 731, 48630, 10921, 39714, 6830, 36394, 13403, 37579, +16669, 40207, 29731, 49282, 13218, 40877, 19847, 59200, 30130, 8092, 53667, +11229, 23464, 47600, 18265, 44341, 15398, 47099, 12510, 59892, 676, 64485, + 8808, 56469, 25366, 63130, 30573, 49740, 65170, 34079, 28610, 50236, 9679, +34008, 59625, 11822, 24984, 43976, 19106, 45627, 23480, 38705, 11973, 22924, +46331, 29373, 7172, 59403, 33719, 2164, 63764, 14033, 33461, 48661, 14450, +34905, 65433, 29518, 56391, 26179, 39017, 7824, 49856, 10037, 28272, 60421, +11810, 44892, 7147, 47851, 18327, 57817, 24685, 14522, 61669, 31929, 48031, + 3195, 36401, 59059, 17949, 53929, 35326, 16281, 57652, 28966, 46770, 18346, +63630, 39033, 10897, 60153, 7942, 25961, 44764, 35284, 23894, 46093, 2470, +39867, 54959, 22160, 59736, 31292, 19448, 64283, 16690, 54892, 1106, 49366, + 9887, 52031, 27633, 59497, 19443, 54932, 25162, 64505, 13654, 56363, 1042, +62487, 9588, 37175, 32297, 11360, 30574, 38565, 14557, 61925, 25470, 57690, +32769, 2702, 54406, 13211, 37888, 30277, 53682, 15669, 65166, 32763, 18535, +46136, 19882, 42848, 17280, 45715, 34892, 3148, 24451, 43611, 19459, 45998, +15980, 61195, 22308, 32784, 59873, 11938, 51444, 31693, 6678, 46349, 9719, +40889, 52361, 19245, 37709, 53369, 14659, 48963, 2610, 19418, 55170, 26857, +61093, 11442, 53905, 31592, 18053, 51026, 21510, 31397, 58780, 27340, 35010, +64044, 18806, 46412, 36053, 2490, 24419, 52642, 5127, 27015, 50072, 19158, +36100, 51057, 9552, 61619, 35342, 25102, 33391, 40226, 1001, 49243, 32489, + 8989, 59508, 24900, 34802, 51813, 4637, 61115, 16977, 34786, 64758, 9133, +47413, 7205, 41197, 55975, 4338, 39722, 33279, 25959, 61395, 28541, 34141, +60077, 7317, 54875, 37375, 19689, 47110, 35714, 1634, 57887, 25171, 40501, + 4119, 60180, 27268, 35182, 45350, 16812, 41065, 58274, 18950, 61218, 21469, +54267, 22741, 59388, 313, 56438, 9693, 59774, 21850, 62482, 3960, 44069, +12723, 37164, 63825, 19013, 38458, 56118, 9558, 59445, 2747, 52129, 21619, +42566, 20003, 48349, 29952, 37914, 21476, 46663, 9817, 43883, 1130, 12369, +46840, 3770, 37714, 26032, 48574, 17679, 37073, 57098, 15444, 62204, 34663, + 3683, 59980, 30364, 54051, 15946, 62428, 25962, 38149, 15071, 47647, 19152, +40339, 56825, 751, 31502, 50555, 19833, 9872, 37006, 4726, 61823, 33302, +26856, 35429, 48525, 3863, 40905, 20521, 64463, 30709, 39453, 8614, 34723, +48999, 22900, 9662, 27393, 65193, 23780, 10976, 41830, 1000, 60471, 30767, + 6234, 51292, 10250, 43076, 1271, 31712, 52672, 23284, 36227, 57612, 19472, + 5231, 59529, 12666, 56482, 14546, 32889, 5428, 38481, 10717, 54331, 3850, +39777, 26653, 61422, 30162, 45038, 13617, 41786, 7628, 47743, 10539, 38681, + 2827, 36515, 26133, 39660, 22666, 52998, 17336, 64054, 41571, 18156, 54280, +33652, 657, 47401, 10411, 45181, 27892, 40147, 21305, 62825, 1294, 23589, +42296, 5126, 50749, 39727, 778, 63690, 30082, 55165, 10945, 65480, 31131, +55676, 14869, 58528, 5779, 53327, 35478, 2441, 45671, 17079, 44188, 36429, +14697, 53339, 24657, 56919, 32046, 4874, 45696, 26299, 8326, 41794, 28243, +63913, 38979, 12522, 44745, 18936, 40284, 6679, 62010, 34146, 996, 35605, +46111, 3676, 50747, 8786, 25075, 42264, 15034, 60192, 29167, 56519, 15346, +34568, 62882, 13362, 56885, 5599, 26768, 45421, 20359, 53417, 5879, 55134, +17442, 61941, 14479, 57090, 41945, 29367, 1476, 62501, 14527, 43749, 12199, +31001, 46593, 15575, 44511, 26952, 62267, 32214, 17219, 31116, 64848, 6828, +53525, 10737, 50272, 912, 23648, 48977, 27162, 3575, 51811, 12680, 62723, +31437, 14393, 50465, 17916, 49299, 33859, 9838, 62162, 2594, 51250, 12197, +30939, 38488, 7952, 46626, 2895, 41777, 17295, 43739, 20165, 46563, 34828, + 7882, 31079, 52775, 22855, 56724, 5135, 27476, 46447, 132, 31840, 41137, +25062, 37855, 28447, 57923, 4964, 55158, 26709, 10291, 50539, 4156, 34314, +52896, 19208, 40002, 54624, 21737, 58581, 16451, 64276, 2350, 43482, 30808, + 5130, 51199, 9380, 29082, 47405, 18652, 42951, 994, 41659, 10474, 50577, + 5000, 60950, 31325, 54208, 7655, 26634, 38679, 61097, 6982, 40636, 53579, +21750, 48696, 12970, 53383, 1513, 56090, 13426, 43661, 16579, 49513, 25337, + 2337, 55401, 27973, 63935, 1091, 33202, 57023, 41333, 12751, 37411, 56112, +19378, 44810, 12535, 47343, 35821, 22888, 62737, 28134, 56802, 20962, 43769, + 3583, 48018, 9769, 32237, 50798, 36417, 28226, 41468, 22734, 63484, 42857, +16027, 49795, 35761, 24463, 51663, 11119, 37412, 6245, 23919, 57459, 18500, +63260, 34633, 22871, 58323, 28940, 52541, 8586, 47283, 14295, 33240, 49129, + 3270, 24975, 59923, 5137, 50409, 21245, 35304, 55930, 13809, 64396, 8087, +52318, 27066, 35587, 55924, 17730, 57704, 12577, 25377, 48823, 35806, 6601, +25331, 49561, 18435, 41744, 7137, 47024, 26228, 38393, 12091, 24495, 57444, +30998, 52276, 4505, 22572, 58622, 34483, 1836, 37872, 14333, 59194, 17448, +62366, 30071, 56368, 5504, 22219, 31543, 59578, 491, 52613, 15871, 43320, +20468, 45466, 28014, 59761, 17207, 56188, 20334, 32456, 57920, 4430, 53560, +10552, 48757, 8641, 31588, 46153, 1774, 44083, 24754, 34380, 63975, 75, +40265, 16590, 43617, 11499, 46843, 30013, 36856, 6141, 21978, 51378, 38813, +18482, 48001, 21886, 37654, 57823, 5875, 56166, 35529, 3139, 38647, 11036, +43885, 52517, 14644, 46640, 19865, 43528, 17584, 64303, 41300, 10068, 32872, +61703, 22577, 41722, 6022, 46002, 34287, 8344, 58878, 29899, 16231, 55014, +22480, 40150, 28018, 64053, 5061, 52777, 33534, 25001, 65144, 11419, 55141, +32440, 63668, 4412, 19222, 55438, 38646, 15221, 45949, 17775, 33329, 51392, +15885, 60060, 13470, 54551, 7466, 62381, 10838, 36380, 32057, 14588, 39298, +62769, 18854, 58061, 28497, 7547, 60979, 23492, 4939, 41223, 10505, 45743, +29490, 53720, 12748, 62829, 27309, 39190, 21777, 58273, 6877, 54717, 13801, +65041, 20284, 56402, 22384, 42737, 27607, 9066, 23515, 43011, 59014, 10156, +22757, 45172, 30327, 2021, 59471, 17355, 44649, 20872, 41819, 22325, 63470, +19430, 54558, 9094, 36559, 50688, 15402, 43822, 19773, 37135, 51362, 6417, +21965, 52049, 28825, 7080, 50325, 26386, 64048, 20240, 55792, 2250, 37585, +11490, 39944, 6698, 33987, 65445, 15615, 41159, 60828, 21373, 10388, 53062, + 3718, 50251, 9225, 24874, 58233, 29799, 6897, 60285, 15526, 47029, 19978, +53959, 39571, 3545, 46819, 30472, 702, 48904, 13159, 45467, 17613, 63524, +27798, 59080, 6189, 40194, 28648, 46815, 15193, 44046, 26543, 63329, 6549, +24430, 42171, 17287, 45927, 34179, 12120, 44642, 7136, 46364, 28530, 35087, +61376, 14661, 22322, 59240, 37910, 2018, 44740, 12780, 60626, 30353, 1020, +64667, 29789, 48109, 20013, 9284, 27132, 64241, 35544, 8163, 26604, 63546, +21628, 51680, 23501, 39704, 3309, 50144, 12292, 33952, 49280, 8602, 42291, +24917, 34367, 65503, 3952, 57344, 10147, 51569, 7495, 41936, 10914, 37678, +48154, 16126, 45335, 28336, 40337, 22710, 35219, 60825, 20186, 54991, 30060, + 8381, 51771, 15126, 47838, 12407, 59102, 29244, 64527, 23699, 4221, 54419, +27961, 65089, 11879, 32168, 55475, 7760, 63374, 2724, 23345, 42284, 29646, +13922, 54731, 19454, 59442, 24353, 325, 37802, 28003, 58260, 4100, 38519, +32076, 18624, 56658, 40066, 13954, 44857, 18406, 54681, 15833, 65003, 26121, +41835, 986, 47911, 36314, 6961, 53746, 14448, 34871, 44771, 17705, 58956, +13874, 29346, 42836, 26820, 7610, 22171, 40599, 50374, 25536, 1007, 65335, + 8597, 40160, 62075, 11508, 30783, 41809, 22324, 34033, 48571, 17653, 51580, +20685, 61149, 44201, 2465, 33242, 45698, 14364, 40738, 51144, 15489, 45385, +60040, 18143, 56301, 36180, 7969, 24344, 47015, 16191, 44657, 1621, 49380, +31091, 38158, 25848, 49822, 28313, 37590, 4025, 48667, 16850, 52705, 32709, +64708, 3816, 21098, 37172, 55334, 16953, 63996, 25575, 38480, 31699, 5445, +62596, 10829, 46876, 6769, 37720, 26827, 60770, 32079, 21165, 59340, 4876, +54710, 10764, 26247, 42408, 60319, 1842, 40079, 59470, 31689, 3938, 36873, + 8595, 32021, 49920, 21434, 59385, 23746, 54433, 12924, 26809, 54929, 28995, + 1916, 34463, 47511, 18448, 61896, 27276, 34349, 47264, 1671, 45702, 20812, +40660, 33547, 2268, 63732, 31810, 15089, 60725, 36543, 15502, 55315, 28078, +61952, 5967, 31985, 41039, 3838, 35472, 50899, 13413, 53830, 8162, 56827, +33161, 11753, 39694, 30352, 51965, 1815, 59078, 31278, 4289, 60965, 16670, +58597, 33871, 2552, 50012, 7934, 32106, 53575, 12357, 28048, 62198, 24070, +51515, 20362, 36484, 50389, 13907, 41872, 4033, 62442, 37457, 49126, 16048, +45134, 30006, 48112, 13463, 42217, 6403, 47529, 11356, 43695, 20280, 37047, +60524, 15528, 54839, 21369, 57992, 10513, 30881, 48141, 23981, 37370, 25952, +64388, 19421, 53129, 25518, 1985, 60704, 34321, 12915, 65181, 847, 50620, + 6511, 41922, 12772, 38526, 59581, 18767, 41232, 22526, 52377, 34122, 2961, +21144, 39652, 49925, 15558, 42473, 16891, 46654, 5216, 36836, 25791, 41373, +29153, 52065, 11492, 61960, 24642, 33522, 41031, 5534, 51274, 29407, 60963, + 8483, 36269, 26541, 50934, 9179, 48133, 4655, 25650, 52261, 140, 59889, +28016, 39324, 2984, 53311, 19911, 60632, 31198, 11791, 49092, 25202, 59327, + 8251, 24232, 48565, 1383, 35598, 49356, 4827, 52017, 31616, 60286, 28319, +13732, 58733, 30336, 35704, 51711, 24933, 2408, 35522, 54982, 6594, 64120, + 3643, 27819, 43543, 1041, 42227, 8416, 27321, 57158, 23603, 6428, 61768, +24862, 1855, 37531, 27355, 34616, 50763, 517, 22511, 60432, 35293, 5611, +55646, 22972, 60602, 20083, 10344, 63554, 3020, 36209, 8022, 58907, 31760, +12927, 60294, 1368, 46049, 13522, 40780, 52150, 28587, 2943, 51221, 10690, +47687, 8109, 50390, 34851, 25099, 54755, 35850, 28181, 52915, 436, 40587, + 6265, 46095, 12865, 41892, 16559, 39126, 62166, 17256, 32479, 48722, 20923, + 9971, 46554, 23326, 53550, 28605, 58629, 16841, 45376, 4331, 42247, 16178, +46227, 35438, 8295, 49381, 22550, 64151, 7215, 31440, 38095, 15020, 59056, +17526, 54698, 23695, 65117, 9453, 56980, 25293, 41505, 8575, 52860, 28479, + 7187, 32476, 40896, 9325, 21509, 38377, 53939, 15434, 48576, 12099, 24122, +65061, 19732, 30821, 38909, 2397, 60871, 15663, 57292, 17895, 48348, 35831, +19012, 50968, 22295, 41636, 26240, 14047, 64486, 18855, 40275, 47311, 3490, +33288, 52312, 14266, 39963, 4787, 59539, 10346, 27065, 57088, 18452, 52569, +33663, 21689, 342, 55100, 11742, 60127, 3090, 54554, 16718, 61244, 30571, +57231, 15364, 65052, 25094, 1656, 40757, 33061, 5070, 36149, 50634, 18559, +39146, 13840, 49424, 2753, 33822, 44465, 5635, 62685, 39511, 22991, 6734, +54101, 17620, 38509, 26193, 57293, 16672, 62515, 4741, 26750, 46889, 3611, +61361, 7438, 26331, 42636, 57245, 8316, 30828, 60277, 2193, 55969, 29066, +60693, 21112, 54594, 13020, 59013, 17753, 45188, 1314, 50221, 8049, 64206, +31601, 15319, 42791, 21117, 53239, 16899, 62585, 21659, 59221, 20222, 35834, +63669, 11210, 38148, 33188, 7648, 48637, 22768, 34945, 9486, 37965, 21480, +64536, 35552, 1803, 41035, 29212, 62611, 15666, 30596, 55991, 12023, 61775, +14853, 47044, 2055, 48974, 34549, 6458, 43676, 10719, 20556, 57438, 28483, +49844, 16935, 45526, 25528, 36238, 56680, 19588, 65022, 17061, 54770, 37452, +16355, 47789, 35539, 10772, 53457, 29854, 64851, 8388, 12911, 28889, 44574, +33089, 14460, 51968, 31608, 37061, 8518, 32437, 53033, 40750, 15138, 46126, +20907, 51924, 18199, 47190, 34563, 26102, 39001, 18877, 57674, 25066, 11066, +62730, 34018, 15252, 40128, 23436, 60753, 16007, 56892, 13679, 32370, 3474, +61332, 14034, 47673, 18044, 53698, 22626, 62780, 24289, 56195, 28269, 3574, +53219, 9177, 25173, 63530, 33294, 16210, 61398, 13215, 44273, 5781, 40566, +14126, 62127, 31710, 56543, 269, 60566, 19105, 36208, 53605, 13389, 39925, +57179, 917, 44567, 7543, 41410, 29119, 4859, 43341, 31545, 17735, 50208, +14084, 48120, 35152, 17975, 43864, 65344, 17043, 56987, 43130, 24524, 1587, +60980, 20363, 56608, 34171, 49, 36080, 58525, 18107, 52681, 21664, 46251, + 4475, 41432, 28999, 6922, 63499, 10130, 47505, 361, 53887, 36199, 23923, +54653, 9755, 23078, 55531, 41398, 7341, 46156, 18784, 43743, 22978, 37849, +47563, 6284, 43723, 25023, 7800, 58008, 36147, 25865, 41586, 20308, 38569, +22931, 46629, 34315, 1076, 27296, 44986, 5922, 46817, 29091, 52189, 18232, +63683, 26656, 2432, 56816, 7929, 61796, 19870, 55116, 28342, 12734, 50143, +29137, 9831, 49213, 30527, 41460, 24514, 52209, 11717, 29442, 42956, 22017, +49724, 37049, 13951, 51180, 29649, 36132, 49459, 13206, 31861, 50953, 13985, +34732, 45398, 24739, 11018, 43445, 197, 30254, 48664, 6342, 36397, 26753, +55734, 20587, 43433, 18206, 37430, 54266, 10028, 48920, 2922, 45893, 10442, +44097, 1533, 31209, 49455, 16311, 29515, 47339, 17379, 52638, 12288, 62011, +44276, 27859, 56489, 4031, 32776, 13383, 57020, 18172, 43944, 4495, 54402, +39457, 19235, 43719, 23535, 38866, 20959, 41119, 11557, 52385, 24029, 61073, +29254, 48674, 4975, 44144, 9929, 61583, 34710, 13904, 50218, 5942, 38713, + 9479, 49654, 31597, 4420, 63778, 12528, 56138, 31643, 18331, 48828, 16260, +54078, 20951, 48150, 6870, 63528, 40051, 2881, 20748, 64588, 25616, 45709, + 4436, 27537, 56300, 24178, 61473, 12177, 43514, 5749, 62890, 9638, 55140, +32360, 6757, 35172, 47036, 18213, 44839, 27191, 58309, 4083, 29694, 43116, + 965, 40871, 51413, 22597, 42339, 24572, 32650, 65315, 10368, 36742, 1941, +45104, 8174, 47068, 34263, 14274, 36037, 44304, 4578, 39224, 49707, 556, +41802, 24365, 64992, 21868, 46986, 27073, 8874, 20732, 50397, 25552, 42762, + 5501, 29828, 45506, 26009, 16988, 49062, 21790, 52523, 11840, 61159, 34987, +14523, 56278, 35677, 5792, 62015, 30623, 1400, 54135, 30080, 3325, 47387, +33393, 4921, 60116, 34471, 26457, 44749, 6990, 43434, 26062, 47164, 9686, +44820, 7376, 37687, 29571, 65390, 12707, 55157, 23339, 40158, 33511, 27579, +62151, 11205, 48429, 6015, 42943, 33642, 63273, 10615, 21034, 57298, 29042, +64315, 9309, 56256, 2860, 32887, 60715, 14756, 54086, 29461, 40297, 10196, +62045, 5421, 53177, 10743, 62947, 7731, 25207, 55542, 37824, 17419, 51407, +13546, 58990, 7373, 44861, 9815, 46465, 29469, 41007, 22843, 34703, 46226, +11304, 40525, 59001, 17561, 36462, 57730, 14145, 55635, 3444, 61832, 7688, +34522, 48125, 2614, 53705, 10101, 30641, 65339, 23575, 11311, 58363, 20177, +63259, 745, 36057, 62343, 21975, 10031, 52866, 40335, 18365, 63687, 38520, +16307, 40849, 65405, 10613, 30765, 48425, 12143, 58455, 2188, 27953, 63512, +19202, 38142, 30121, 53743, 15739, 39688, 57165, 7109, 33510, 53923, 5526, +61101, 26414, 37345, 21032, 5002, 50191, 13842, 41443, 52053, 23216, 36642, +50824, 11144, 47702, 31411, 9374, 60089, 3355, 53711, 8432, 63323, 17764, +58000, 16194, 41782, 3108, 38787, 22455, 60656, 18481, 41200, 30450, 1558, +58404, 23294, 32644, 59800, 24617, 36615, 21460, 45983, 25559, 41360, 231, +50415, 39138, 5718, 32198, 40360, 62243, 25793, 52797, 13451, 29736, 58438, +41658, 12523, 49116, 18071, 61998, 36826, 8841, 42421, 282, 39419, 21532, +51239, 23842, 44656, 16085, 50140, 27789, 61534, 469, 56673, 6287, 49660, +12752, 36978, 53901, 18029, 64937, 30926, 8325, 58496, 11471, 51833, 4354, +38879, 26154, 49648, 31844, 19743, 57437, 18562, 64220, 28833, 58704, 17751, +54089, 14708, 30041, 52925, 18245, 48156, 11899, 53949, 1714, 51819, 33057, +44752, 30946, 9941, 63146, 21845, 55414, 3155, 59672, 33006, 6109, 63335, +25266, 39615, 20318, 48070, 29825, 118, 52434, 26204, 39217, 19949, 59126, +36469, 14368, 58122, 26307, 12447, 51934, 18459, 49468, 11485, 29491, 62371, +18953, 55101, 16387, 63023, 27185, 32647, 50631, 9362, 24736, 45443, 15472, +49752, 3385, 56795, 13280, 35414, 43737, 19688, 60211, 26773, 1580, 38313, +30029, 48648, 24569, 11, 35223, 48116, 16879, 51126, 19960, 30532, 39502, + 1931, 63968, 16327, 51482, 21019, 42969, 24110, 44370, 18279, 40115, 50375, +20950, 8964, 58281, 31039, 36636, 23229, 38636, 30697, 60101, 17060, 54630, +13493, 58484, 1187, 30315, 63210, 4567, 23775, 45758, 157, 25267, 43870, +20030, 47202, 15446, 31677, 58248, 17152, 63625, 35331, 20642, 45810, 1303, +43677, 35290, 4359, 44578, 17164, 46377, 25100, 6643, 36638, 56605, 32386, + 5593, 49055, 33337, 8470, 50476, 24371, 3404, 34578, 57486, 5096, 39426, +21497, 46610, 34821, 7318, 32909, 57822, 6493, 24203, 65336, 28193, 12534, +41798, 62086, 14910, 30580, 40912, 2081, 57571, 32684, 42774, 18114, 63091, +25881, 9141, 59770, 5615, 21197, 63882, 34938, 17162, 50320, 36317, 22527, +32898, 41673, 26057, 47757, 5410, 32091, 64348, 19492, 56337, 12580, 34764, +48013, 6981, 51280, 21403, 41880, 11736, 47855, 14921, 53586, 2159, 60815, +13800, 53266, 20928, 59671, 26213, 13628, 43961, 58691, 2584, 42462, 10857, +37610, 23058, 46539, 6490, 27361, 56981, 856, 39052, 10805, 30739, 54546, +19067, 59247, 15392, 55673, 30540, 2502, 35982, 64354, 4386, 41993, 14366, +43886, 24156, 37917, 19188, 63349, 28086, 9855, 46309, 35211, 15183, 48480, +36470, 21530, 35115, 55849, 14363, 57999, 7663, 61580, 37664, 12470, 43807, + 205, 51064, 6959, 48042, 24242, 60706, 11391, 35314, 58101, 4768, 38438, +28582, 36461, 13666, 63824, 4911, 58427, 18271, 34587, 47318, 12182, 41597, +15823, 50699, 37313, 13004, 43679, 2565, 53770, 9081, 62944, 40393, 16333, +46220, 11761, 50736, 7593, 23346, 49542, 8800, 35666, 45358, 22134, 40488, + 6400, 53243, 38193, 14357, 47795, 4250, 33341, 38652, 1675, 56319, 16219, +59624, 34816, 938, 61806, 26517, 44605, 20077, 51393, 5408, 25253, 52161, +12828, 32449, 57534, 13839, 51925, 5487, 39081, 61107, 17876, 31106, 40489, +10755, 63317, 8274, 50701, 34456, 23271, 45032, 3374, 48505, 12933, 59075, + 1559, 56706, 31034, 4227, 64130, 41868, 27972, 3008, 63344, 10996, 54241, + 762, 24680, 43487, 6195, 47267, 35680, 25087, 43934, 15792, 37863, 55445, +14918, 64168, 39243, 8167, 59939, 26181, 35317, 45565, 5368, 40919, 27345, + 8805, 58825, 25378, 56509, 16269, 54125, 25905, 32856, 55364, 9027, 57994, +29069, 47192, 3199, 23130, 59302, 27040, 14787, 56951, 20227, 60132, 28974, +51348, 13551, 43903, 23242, 62776, 14894, 56312, 25739, 45190, 17980, 40955, +47402, 3924, 37093, 51363, 23534, 2682, 35518, 56190, 18921, 50875, 23383, + 8717, 54204, 30829, 637, 46972, 35443, 27796, 33991, 46077, 25992, 82, +57619, 25000, 6525, 64904, 12376, 57037, 774, 29283, 54435, 37137, 9640, +46467, 31101, 50591, 460, 25935, 64593, 12892, 55680, 24841, 63485, 3932, +40391, 28717, 46945, 19139, 39631, 5396, 42996, 10043, 36578, 64141, 22689, +11629, 33726, 16511, 57388, 1707, 61271, 17390, 54902, 35139, 14914, 33073, +58699, 23689, 48779, 3615, 44429, 29430, 47658, 6135, 40684, 58451, 28945, +11923, 48082, 19686, 53160, 34579, 9518, 54878, 31878, 1650, 39202, 57322, +24143, 4910, 59605, 28894, 2376, 63689, 9528, 30565, 43172, 20762, 41412, +27100, 5282, 52659, 23441, 40253, 21984, 42752, 31774, 2512, 32571, 46037, + 7562, 22368, 31641, 61738, 15982, 56040, 26233, 40151, 23233, 36146, 49652, + 2316, 28440, 57696, 19768, 65213, 8909, 29730, 56693, 19042, 60036, 17180, +45200, 21706, 31968, 57196, 3968, 63901, 28093, 33901, 61314, 16235, 31461, +62795, 426, 56153, 15924, 64664, 33172, 2334, 57394, 35420, 23014, 60289, +14930, 48956, 20199, 40054, 5664, 47812, 28379, 36858, 9750, 30802, 60702, +15685, 32833, 64933, 3750, 40017, 49773, 18030, 44724, 19930, 58949, 33631, +14110, 50086, 4175, 58246, 33815, 24194, 42653, 17712, 56959, 12319, 28484, +60973, 30952, 38407, 26291, 36902, 33026, 16581, 48535, 33557, 12429, 51840, +40256, 19649, 44216, 21526, 49142, 34298, 11738, 64574, 31962, 17619, 61129, + 6957, 52138, 27648, 8636, 50920, 32296, 19296, 49817, 29409, 1464, 64710, +11989, 52911, 15805, 49115, 31009, 39064, 5972, 34193, 50367, 7990, 61045, +11959, 38428, 31246, 16397, 51966, 18966, 64143, 35231, 9143, 51030, 36258, + 1849, 44692, 12349, 42074, 19800, 61462, 16880, 49997, 3758, 41026, 10748, +49562, 970, 61868, 13943, 33497, 60187, 21397, 8860, 58056, 28804, 49180, + 8094, 43779, 11423, 39188, 64340, 16632, 38017, 58433, 14424, 54768, 3178, +61582, 12778, 53375, 32719, 13634, 45099, 35332, 27949, 51286, 21367, 35570, +45075, 13974, 23972, 55271, 22038, 7381, 23630, 59123, 40214, 16476, 44804, +29672, 7297, 37062, 27662, 50822, 11002, 34558, 57297, 11903, 63188, 18676, +55250, 28822, 3522, 45308, 29586, 55467, 36872, 27741, 50623, 24767, 43963, +11260, 49860, 21513, 51376, 7353, 42117, 20057, 65389, 26067, 9236, 34110, +63962, 13165, 20628, 49082, 22835, 32975, 59741, 7699, 26962, 65238, 16906, +41399, 51950, 21266, 7826, 50378, 33348, 17523, 54114, 26237, 40741, 23758, +59943, 1221, 46812, 15301, 54312, 33629, 14872, 60200, 8642, 56740, 10437, +65520, 27888, 55181, 16463, 63219, 37763, 50066, 9598, 43221, 3793, 49099, +10890, 57029, 7917, 26748, 62222, 39962, 6482, 44933, 36064, 24267, 47646, + 4053, 49822, 30539, 38077, 5003, 51694, 10417, 37112, 23836, 40879, 13568, +45169, 2734, 40401, 52677, 17871, 48660, 25767, 41986, 9825, 23329, 45867, +30043, 8058, 52113, 10065, 41489, 25315, 64341, 11681, 54095, 17451, 55628, +18895, 57675, 41219, 7492, 37897, 48936, 18591, 45277, 27394, 8888, 62605, + 3268, 41591, 29509, 7762, 55332, 27189, 42060, 21365, 53029, 895, 58797, +32385, 4604, 36695, 49994, 21653, 9886, 55694, 5811, 65302, 11474, 53429, + 7045, 24822, 59472, 22662, 10222, 55074, 5195, 62484, 14039, 56214, 27919, +37859, 2872, 53340, 12494, 48885, 18908, 60086, 29793, 36792, 3898, 59217, +13203, 38022, 51405, 18644, 43508, 21735, 60904, 463, 54981, 12877, 61463, +15123, 30625, 42986, 17588, 48459, 1930, 64903, 40717, 4947, 42714, 15052, +45224, 30519, 17427, 62908, 25965, 34885, 53794, 7497, 47307, 681, 37955, +29975, 54746, 16128, 60663, 29424, 37279, 20910, 52450, 11329, 26569, 54609, +39432, 18333, 45160, 14313, 63903, 32351, 58750, 27636, 3805, 48028, 10030, +33234, 45446, 22656, 41339, 18770, 43195, 7673, 40422, 61221, 16186, 56287, + 2364, 38315, 10320, 62539, 7047, 59793, 40134, 1821, 41693, 62291, 34044, +14181, 31426, 52453, 3218, 39589, 60423, 15259, 54289, 20135, 62668, 4848, +26098, 44867, 32583, 48748, 7740, 37811, 52439, 16982, 50051, 6139, 63360, + 9344, 39026, 5530, 29719, 64786, 3251, 40165, 25754, 62706, 15975, 52592, +12721, 35431, 50348, 16830, 27036, 50955, 34583, 7242, 57239, 1802, 38863, +30273, 45268, 3146, 47231, 10782, 26216, 61236, 43969, 14675, 62359, 38493, +10568, 49831, 7073, 45412, 13404, 50592, 28679, 64581, 3391, 48181, 24626, +34384, 50210, 20597, 38351, 15609, 41873, 5678, 44799, 26631, 1469, 20416, +54313, 23878, 60217, 18620, 45644, 19750, 32587, 54170, 13277, 22543, 51948, +26200, 467, 54670, 20697, 42131, 25834, 8441, 64649, 32436, 19533, 59485, +15654, 54360, 6562, 58874, 19464, 55079, 25070, 5882, 43395, 28906, 5160, +58341, 30762, 55311, 13198, 63673, 20888, 43236, 27700, 53715, 5081, 30000, +43978, 22534, 42271, 7038, 46046, 2643, 23751, 53396, 28875, 1246, 58823, +14299, 55872, 37237, 21642, 52684, 11759, 64022, 22120, 43297, 12390, 65189, + 7065, 38891, 30240, 14490, 51677, 25686, 64728, 7522, 35234, 46549, 17437, +42684, 19120, 45531, 21999, 62126, 36099, 89, 34220, 46896, 26312, 38074, +23570, 41633, 4299, 48400, 16100, 44813, 27053, 40556, 22187, 38557, 1636, +47412, 17037, 44423, 21623, 46698, 6790, 31168, 56530, 4170, 37158, 25546, +45249, 19009, 41883, 21507, 47480, 2770, 35985, 53034, 22079, 44227, 24790, +12380, 58732, 20971, 54256, 1070, 60441, 40227, 7022, 46733, 15173, 31439, +64331, 24753, 33418, 58895, 9050, 26759, 44177, 24055, 8412, 55258, 31355, + 4818, 47994, 35575, 521, 30743, 62841, 5052, 41573, 25899, 1053, 20713, +51491, 35743, 24528, 53465, 21392, 5862, 65444, 10788, 55605, 30097, 58336, +23602, 4821, 49814, 32101, 22058, 48788, 33369, 24968, 50880, 30907, 15564, +57348, 33182, 12108, 42701, 51094, 6190, 35556, 58048, 18249, 32822, 45793, + 652, 42179, 14528, 38623, 54931, 21857, 1391, 26994, 61375, 23531, 9572, +59506, 24085, 32765, 19170, 48328, 21663, 59072, 35454, 14240, 32667, 47810, + 5294, 35981, 44959, 1552, 31681, 56414, 4624, 60146, 37768, 1083, 61624, +27617, 35444, 52722, 15127, 60836, 18990, 54116, 23234, 59269, 34561, 4527, +32458, 41068, 27, 29359, 44397, 18965, 62744, 30042, 55154, 23250, 6456, +36059, 44167, 11936, 63063, 2082, 28853, 44117, 4143, 48812, 23909, 59622, +18680, 35719, 57457, 31032, 36363, 7115, 32178, 42259, 854, 64814, 38971, + 4448, 45333, 34501, 9618, 61255, 35210, 15279, 62663, 13745, 58242, 36581, +17676, 49157, 41084, 1975, 31178, 43861, 26579, 34758, 47696, 9286, 37473, +64230, 10998, 59715, 35492, 13924, 37854, 3503, 50318, 25493, 37110, 781, +61356, 13540, 34624, 51222, 2869, 62582, 13119, 59803, 20874, 37362, 64209, +14573, 44005, 22674, 39105, 33857, 6210, 30192, 43586, 16502, 46442, 25781, +54030, 2101, 37079, 25168, 47778, 15429, 62279, 33233, 11290, 43746, 15896, +30378, 54869, 618, 59924, 27141, 52122, 2744, 41272, 14230, 47845, 27842, +56826, 7485, 61420, 12716, 53146, 18109, 59128, 24287, 62884, 10103, 57434, + 5373, 65196, 11890, 54316, 24176, 63478, 11202, 55934, 24824, 62037, 15207, +39459, 27333, 50099, 9137, 29428, 64279, 4982, 53863, 24732, 63453, 20882, + 6461, 61637, 14321, 51473, 34210, 26509, 38140, 11203, 48222, 13478, 32190, +55363, 22645, 58063, 4513, 39283, 10967, 50708, 20548, 35534, 64928, 5657, +53911, 38455, 17531, 64080, 40467, 16660, 59041, 24406, 52090, 15383, 48361, +17594, 50453, 31140, 43299, 10380, 61321, 6751, 29104, 59179, 39527, 17096, +50779, 35844, 1897, 20890, 48063, 29007, 39160, 7995, 64091, 11465, 58269, + 3790, 37660, 9438, 49041, 29261, 17699, 53005, 2772, 28855, 63257, 24559, +10362, 48191, 8001, 26953, 59273, 22917, 56271, 28595, 9110, 49396, 31722, +45917, 15914, 43896, 30404, 39861, 957, 45859, 60004, 3857, 41105, 12722, +53008, 26334, 60310, 17063, 56135, 11875, 24832, 60931, 39281, 18398, 45550, +25040, 10521, 46741, 17411, 43916, 8760, 24589, 46391, 5674, 40666, 12714, +37624, 6584, 48944, 29819, 15794, 56141, 23203, 57865, 5645, 52225, 35031, + 3194, 20440, 40156, 59268, 16682, 30927, 49804, 17575, 39073, 58364, 14457, +61471, 19954, 52622, 12062, 50523, 8120, 39840, 12826, 64344, 28040, 56358, +16927, 52968, 30412, 14852, 51299, 17592, 59623, 30536, 18133, 48647, 31858, + 5305, 45732, 28637, 1189, 55793, 9803, 26670, 62407, 37841, 12643, 64954, + 869, 31010, 57628, 15384, 29871, 39797, 16922, 52212, 22580, 61724, 27751, +40316, 6778, 57816, 29184, 39260, 23874, 59276, 16751, 37901, 27943, 36480, +25541, 50008, 11821, 33176, 49388, 10071, 54188, 8099, 63589, 24867, 58174, + 592, 60826, 34329, 5153, 38250, 28849, 60419, 16630, 35533, 50467, 5824, +40771, 60068, 2362, 56569, 39450, 18813, 42165, 31183, 8376, 32421, 60760, +29181, 55923, 9540, 43512, 17211, 40073, 20481, 42896, 1882, 46161, 29842, + 8124, 35034, 46904, 21443, 42492, 23553, 44238, 19620, 40242, 5777, 42228, +33381, 2262, 32259, 46129, 7819, 63040, 12569, 57077, 38508, 17659, 48752, +32913, 7781, 31707, 46244, 34556, 28531, 37522, 7413, 56803, 3549, 62248, +28182, 34909, 52704, 21243, 3064, 43632, 12005, 48860, 18385, 57183, 28798, + 2835, 48010, 19046, 41019, 33208, 2000, 46307, 10284, 27837, 51043, 12907, +41616, 6896, 37764, 28077, 60673, 7818, 53779, 21950, 47678, 18007, 33745, +49264, 1444, 27199, 44285, 8166, 25440, 59973, 36661, 12121, 62071, 16907, +54532, 24405, 43921, 19264, 46936, 22334, 61172, 32266, 5083, 64971, 34934, +22703, 45260, 15410, 37799, 53638, 19779, 65494, 34669, 10604, 50234, 6655, +34488, 64637, 19626, 58227, 6936, 54563, 3091, 65371, 12850, 56024, 14410, +34278, 51433, 16408, 44330, 76, 45568, 8516, 50528, 27984, 34385, 47206, +22259, 6272, 51655, 13630, 41078, 57481, 21178, 54648, 13908, 63649, 38123, +20234, 57836, 25691, 63136, 22136, 53507, 18314, 64547, 35964, 8701, 47936, +14248, 41908, 12726, 24978, 60601, 48417, 11687, 33819, 51654, 7447, 35419, +55548, 25456, 10932, 47043, 27164, 37391, 801, 40590, 28412, 62001, 22497, +49503, 2887, 41555, 12141, 47698, 35808, 9359, 60490, 31925, 43523, 1790, +52796, 39812, 7329, 54015, 40856, 11458, 52554, 39474, 20001, 42746, 52137, +21475, 7143, 50054, 18671, 51812, 20911, 35904, 47118, 3234, 54308, 32322, + 1307, 46778, 9059, 44925, 20470, 51728, 18263, 48346, 11405, 44712, 6642, +31924, 56926, 9495, 51923, 215, 29580, 58083, 4946, 26764, 61944, 31890, +47706, 16185, 50887, 19286, 48333, 28175, 11156, 49146, 14380, 44480, 8525, +51857, 3165, 28551, 55874, 17601, 24776, 46863, 27725, 6483, 62645, 14294, +52800, 23463, 48217, 20270, 6273, 35578, 51310, 22437, 64870, 4058, 54084, +28464, 60329, 14790, 36433, 55569, 20491, 318, 51493, 13086, 55759, 3363, +60448, 13968, 48643, 16571, 52503, 27359, 57491, 17426, 53344, 35164, 21333, +32936, 3292, 43318, 14085, 56011, 26911, 59091, 10655, 54679, 255, 59757, +23080, 43307, 32242, 14563, 46949, 5434, 24238, 65126, 33625, 16158, 61146, +29964, 45364, 6630, 37737, 54111, 29695, 11516, 56338, 22077, 60397, 19705, +51879, 35174, 3188, 32967, 64623, 22672, 56366, 2307, 36523, 32073, 12866, +64957, 3399, 40367, 57882, 15425, 36999, 62502, 19698, 48676, 34086, 13999, +50382, 32527, 3585, 47218, 33785, 1217, 29387, 53272, 6290, 42444, 16693, +54034, 24465, 39730, 8578, 60247, 10039, 55316, 1194, 28372, 42477, 4591, +46429, 21421, 39874, 18884, 47054, 3425, 43292, 13351, 36601, 28848, 48213, +17292, 31923, 42677, 25144, 10124, 27628, 64267, 23175, 56806, 18964, 31566, +39122, 2315, 63887, 7951, 57947, 33634, 27357, 63250, 2681, 31229, 39212, + 4897, 48545, 28515, 2901, 51550, 10377, 43506, 785, 41315, 11596, 42970, + 2453, 46366, 24780, 34292, 64040, 19422, 55462, 36091, 8076, 32516, 43306, + 615, 28926, 61813, 22390, 4428, 44961, 32824, 6155, 54732, 12908, 63797, +15129, 43516, 3668, 46212, 14216, 55027, 21487, 61183, 5974, 25645, 46481, +22951, 6746, 25282, 47161, 12696, 24177, 64403, 16777, 26534, 59231, 23056, +13023, 61838, 32337, 3698, 33918, 56361, 25088, 40230, 14055, 61470, 7838, +32928, 60802, 11747, 49636, 24141, 34569, 56615, 15852, 63123, 12427, 36624, + 4128, 64806, 19219, 54986, 40239, 14907, 46763, 18814, 63763, 39416, 16248, +47347, 41153, 20503, 2982, 28147, 41028, 4378, 42664, 13796, 38948, 57232, +20711, 62920, 18710, 56222, 34149, 23452, 46001, 9151, 38280, 52878, 12499, +36783, 49085, 20988, 44893, 3681, 63755, 9632, 36640, 58382, 25011, 2246, +41601, 15083, 48475, 35715, 9042, 33799, 49867, 4790, 44026, 32287, 61467, +26504, 36444, 28886, 37497, 25704, 51069, 28326, 61295, 10383, 41149, 5178, +43353, 23929, 1049, 59704, 42484, 23740, 58087, 31205, 1576, 46846, 19744, +43614, 18067, 42102, 13692, 48644, 9232, 39686, 54793, 19449, 59117, 38591, + 9343, 41102, 52106, 35811, 1482, 24479, 62059, 22766, 9809, 63187, 42561, +32119, 8121, 30908, 44680, 6282, 61184, 25485, 53700, 8715, 45774, 13731, +44468, 16824, 57309, 37505, 19667, 45833, 29657, 7414, 51980, 31992, 12493, +54200, 4242, 63578, 30714, 7050, 55339, 26629, 41330, 14909, 60721, 40161, +12009, 62740, 14195, 48020, 277, 43879, 13530, 52077, 30064, 46528, 17538, +40047, 61720, 15957, 55807, 29582, 61142, 1996, 57747, 26879, 52064, 16403, +39724, 62184, 12280, 22970, 56668, 37388, 4709, 49720, 55369, 37959, 6570, +42529, 10412, 37111, 62509, 15560, 53873, 21169, 40870, 19071, 53408, 11003, +34199, 43713, 15420, 62253, 36028, 18231, 55925, 33236, 16039, 47695, 31660, +55677, 15381, 58846, 30365, 54998, 20815, 60071, 3959, 30617, 45187, 1750, +47122, 29994, 13678, 63866, 24290, 46427, 14807, 40421, 57330, 19099, 64909, +37982, 17331, 47657, 22827, 53168, 25458, 58183, 20149, 37951, 24935, 45411, +16156, 33730, 58988, 3122, 55416, 33887, 63551, 16272, 56824, 36423, 3423, +33978, 47348, 2108, 34876, 48595, 5902, 25446, 60345, 41694, 11019, 46501, + 4641, 43394, 23433, 49048, 17418, 27204, 42232, 19595, 65253, 6931, 28344, +43801, 2072, 32113, 58741, 23144, 32985, 50709, 1771, 24977, 61918, 5510, +41672, 31769, 8233, 52905, 33743, 12236, 57295, 36620, 61019, 13367, 55023, +32509, 65353, 6777, 32024, 51229, 1394, 40318, 31387, 13418, 59468, 20720, +63078, 31965, 4873, 61403, 16774, 31868, 57826, 10971, 33408, 40290, 25797, +53214, 13824, 33669, 61282, 18135, 57208, 10463, 25195, 63397, 16465, 26066, +58618, 22941, 10841, 38943, 6289, 52862, 9850, 58865, 7839, 34392, 668, +31066, 45215, 19253, 64970, 14592, 51724, 29750, 36234, 7166, 47904, 10131, +37656, 60429, 12300, 39953, 4555, 64660, 24155, 55730, 26887, 63932, 20512, + 2015, 42001, 10674, 30346, 49951, 25548, 7846, 20701, 53610, 41533, 15610, +49283, 40245, 20966, 64, 59697, 27024, 53175, 17016, 41635, 20763, 46994, +15900, 36883, 27485, 62210, 24133, 49470, 5448, 26848, 55789, 11267, 63037, +25819, 38045, 2821, 45608, 21688, 40631, 17875, 53742, 34882, 20453, 64640, + 8948, 52591, 32401, 17750, 49627, 26936, 37334, 28677, 63709, 19103, 49541, +26875, 3558, 35805, 58575, 26165, 11298, 49475, 24892, 12601, 36318, 44774, +31132, 9765, 32382, 59790, 25499, 406, 34753, 46967, 7542, 26675, 62628, +21870, 1924, 31232, 59326, 20008, 52142, 28349, 5954, 46699, 24162, 43014, +13937, 44587, 647, 48955, 19974, 56794, 29525, 8373, 24009, 45733, 11640, +40254, 65128, 22731, 8104, 28071, 48610, 26465, 6920, 38936, 10278, 36382, +50186, 11416, 33113, 56747, 16047, 58590, 36584, 20967, 54096, 10721, 52241, +27278, 9643, 50900, 1326, 28789, 60412, 8439, 41094, 5104, 36780, 10599, +50860, 6884, 63405, 63, 39523, 51873, 15039, 29959, 38832, 11709, 40998, +31186, 8129, 49584, 27594, 60728, 14701, 31226, 63974, 17193, 36197, 53331, + 9322, 23592, 58333, 19691, 63404, 12105, 56085, 2185, 34424, 50937, 5413, +45638, 13103, 39066, 52628, 18585, 37641, 50018, 14788, 46258, 8863, 37400, +28915, 45759, 17436, 30780, 55773, 20006, 58881, 24793, 1922, 50593, 25978, + 9159, 22541, 43240, 27000, 10603, 24381, 46407, 18113, 36519, 27287, 47517, + 5982, 49704, 35928, 459, 42650, 22267, 43977, 19797, 50205, 1486, 37999, +22733, 51079, 16512, 47321, 1177, 30833, 45312, 7775, 46957, 34643, 30267, +44512, 810, 50872, 40053, 12794, 41955, 54542, 19333, 63085, 17240, 45795, +19957, 41644, 64438, 21003, 57869, 8561, 53895, 26717, 38287, 8158, 62269, +13384, 55135, 20764, 65458, 17056, 28239, 51234, 21871, 45370, 31956, 8627, +36701, 3958, 31364, 46294, 28878, 62639, 23039, 57318, 444, 56053, 31585, +63799, 28297, 9517, 59467, 3874, 27689, 52243, 36814, 14456, 43024, 3496, +62455, 10962, 57084, 1264, 32425, 59429, 4301, 39635, 9336, 34815, 60023, +41761, 223, 39581, 18357, 53189, 15051, 60588, 26975, 57105, 10606, 43362, + 438, 45805, 10052, 36446, 48864, 23277, 5772, 54272, 34609, 3004, 58710, + 8318, 33151, 55662, 6872, 34600, 54326, 22431, 5586, 47766, 33852, 2636, +35375, 50908, 7071, 22664, 64047, 20783, 45785, 5836, 42845, 30451, 52921, +18410, 60389, 40005, 11354, 43098, 47753, 17213, 35134, 48269, 2977, 58162, +32698, 12335, 61455, 4335, 57248, 30345, 64918, 14928, 40583, 4041, 52364, +37680, 58058, 174, 59996, 25310, 5342, 52436, 33769, 62638, 4167, 34107, +61792, 21903, 52802, 27453, 17340, 62191, 21519, 40571, 28943, 3732, 50092, + 5994, 41053, 33269, 2910, 62878, 36039, 23713, 34250, 45952, 19781, 43991, +26644, 57026, 21167, 60930, 27663, 43990, 17615, 49929, 30864, 9691, 32968, +62877, 19915, 53523, 1025, 58612, 34447, 20972, 54799, 9155, 35742, 49876, + 7479, 29626, 45310, 15882, 32718, 50925, 550, 38070, 30304, 45676, 16411, +38460, 58549, 14882, 62492, 25217, 57100, 31503, 4387, 60553, 25210, 7564, +55948, 27168, 60991, 13827, 58217, 7430, 54412, 36763, 3117, 48073, 14189, +37321, 65021, 17606, 44363, 32116, 48791, 1133, 59821, 36985, 55858, 2773, +61547, 9627, 57926, 14702, 64553, 10711, 26273, 51018, 29112, 11493, 58670, +34035, 10049, 65121, 29298, 55254, 4699, 60461, 12411, 35823, 64371, 19232, +54980, 23807, 3508, 52548, 20637, 57818, 31647, 6854, 65365, 33330, 3179, +47522, 30350, 39915, 2066, 56155, 31784, 12745, 47077, 24172, 40183, 33034, + 2736, 49306, 31828, 17988, 45844, 26145, 41292, 4102, 52872, 34364, 6358, +61915, 14203, 48204, 28049, 51454, 18722, 58212, 9947, 52115, 6639, 37361, +15753, 45441, 17067, 44052, 5226, 48481, 34842, 25859, 33790, 58187, 12589, +24533, 49953, 18780, 47928, 34330, 24660, 38403, 28409, 49608, 12109, 54349, +21186, 52036, 28796, 11743, 21793, 49839, 23020, 44848, 4950, 42386, 32435, + 8735, 31185, 46888, 19189, 60244, 24683, 57382, 21687, 2531, 35663, 59576, +25888, 10680, 46501, 22609, 44824, 18089, 38422, 24043, 62157, 14458, 37987, +63884, 19323, 54829, 28749, 62928, 20025, 56758, 33225, 4351, 52785, 23884, +55133, 15272, 63661, 8790, 44982, 2704, 31518, 53487, 19239, 10624, 63026, + 7757, 25963, 41980, 14272, 50037, 37866, 20432, 49438, 27104, 11755, 36871, +25811, 59580, 31940, 13191, 21288, 30415, 41895, 15632, 48251, 29510, 37428, +16473, 40621, 20009, 46753, 9659, 44075, 1139, 58321, 34975, 6106, 51902, + 9444, 65401, 34888, 23391, 60854, 17290, 56542, 31284, 14095, 44392, 6761, +58929, 10342, 55861, 2803, 49979, 12586, 42788, 1854, 39858, 11763, 56258, +36038, 18920, 54064, 41338, 5683, 44058, 14498, 48684, 22163, 43084, 4707, +37878, 22485, 58013, 18136, 39807, 57237, 2691, 62871, 39632, 14683, 31670, +54786, 7348, 24264, 50473, 26376, 8688, 32743, 39718, 260, 37022, 17794, +47316, 10736, 45309, 29951, 39547, 523, 33585, 49445, 22691, 40019, 32485, +11060, 62894, 23643, 42818, 6730, 27406, 53659, 4794, 62305, 19634, 52618, +21711, 8397, 28732, 44431, 22767, 50310, 24146, 44021, 20211, 38117, 56734, +16207, 63872, 32950, 3409, 53803, 25922, 42334, 13537, 20196, 44592, 34015, +28052, 54021, 5566, 43501, 11501, 39341, 62276, 28603, 8315, 38005, 17318, +46459, 28263, 15690, 60667, 23827, 10427, 50723, 25039, 36959, 5306, 53249, +35504, 3786, 51471, 15915, 60608, 20352, 55617, 40119, 2151, 50491, 11846, +44546, 15849, 48983, 25054, 35564, 53601, 2318, 60014, 11184, 32481, 42480, +22383, 36487, 26332, 49452, 32312, 13315, 60281, 23821, 38323, 18218, 55321, +13085, 47469, 7091, 39039, 54883, 4907, 63981, 27987, 9132, 55704, 5281, +65211, 15007, 40562, 17840, 46492, 1691, 63809, 33572, 54718, 8451, 61486, +13151, 55073, 17289, 48014, 24195, 65093, 4690, 51408, 35445, 6192, 28661, +50026, 30025, 45041, 12788, 38369, 65285, 16377, 56279, 13126, 53059, 2181, +47423, 9724, 43216, 31540, 12366, 42089, 7844, 44107, 13683, 41076, 16197, +48240, 38086, 17473, 41118, 11439, 47614, 23456, 38030, 20589, 51940, 16832, +35249, 57713, 44462, 21022, 33319, 55535, 18145, 65273, 26671, 1245, 45433, + 8748, 40107, 54219, 6558, 45346, 9734, 49714, 36249, 64454, 6978, 54971, +31888, 9201, 61148, 1953, 54736, 11197, 59345, 24850, 51312, 16252, 40639, +14773, 47367, 31120, 19713, 44513, 15369, 48324, 9076, 29707, 44113, 11543, +37864, 53232, 18401, 49258, 16086, 40003, 28079, 37210, 18376, 64622, 23833, +52126, 22298, 46014, 28392, 8222, 65090, 2146, 26687, 56576, 22607, 61666, +29238, 9480, 65360, 19003, 48197, 31748, 193, 53623, 11767, 26450, 51341, +23220, 6315, 59401, 41657, 18429, 36711, 56751, 3455, 64111, 30608, 54930, +21033, 53244, 11398, 61875, 26909, 55256, 15216, 64502, 19123, 53349, 11892, +38417, 3711, 65514, 16087, 47022, 29210, 13041, 52552, 30976, 45438, 12648, +41124, 33068, 7327, 30937, 46145, 32340, 50786, 16273, 39174, 6547, 41499, + 2230, 53426, 31384, 4070, 41997, 8066, 47989, 38843, 14959, 47404, 6017, +39354, 61704, 24600, 7527, 48130, 14464, 38486, 22954, 58935, 29709, 9903, +35609, 60152, 22632, 55733, 2308, 51919, 35912, 8652, 34720, 57021, 18776, +63836, 16944, 59565, 27468, 14521, 62471, 22947, 37140, 6889, 46924, 9596, +30371, 59151, 19114, 56854, 21546, 62577, 585, 42699, 9320, 29895, 43980, +21255, 38568, 56483, 863, 61729, 11582, 55391, 4350, 64451, 39112, 3394, +50903, 10944, 62844, 2279, 44582, 19494, 65522, 31360, 17367, 43664, 11779, +37503, 51778, 21629, 45482, 18649, 43642, 6536, 61338, 34437, 23641, 43396, + 5799, 26083, 46172, 34119, 28300, 35319, 62275, 1171, 52903, 13826, 39914, +29949, 15210, 63205, 39496, 10992, 61844, 17017, 56571, 855, 32160, 41741, + 4715, 36645, 25513, 59777, 32347, 20810, 52281, 918, 56425, 18197, 60156, +22868, 53118, 38, 60848, 9028, 27559, 57535, 1570, 61593, 28983, 4193, +58977, 33409, 9653, 64995, 6014, 27362, 563, 37642, 51191, 4849, 44920, + 9095, 35718, 52700, 28628, 60457, 17244, 32863, 62159, 18937, 56139, 23159, + 2216, 33702, 46777, 19549, 38726, 50176, 18844, 42486, 21910, 45232, 34782, + 2840, 36167, 65017, 23338, 54640, 4771, 61393, 32926, 421, 54269, 25198, +36025, 52441, 1417, 64429, 25698, 4917, 61187, 32706, 25067, 62573, 5507, +52430, 33009, 6619, 38227, 11155, 62263, 4573, 58509, 34093, 24697, 35456, +47397, 16934, 39808, 3919, 45667, 35017, 26221, 52044, 12098, 62589, 40663, +19928, 46553, 33902, 9889, 35070, 49179, 25692, 4144, 65489, 11520, 29436, +44460, 13761, 46905, 5833, 42770, 15523, 44394, 32127, 2673, 33128, 41269, + 4766, 42748, 22326, 61542, 18307, 43002, 24655, 51682, 1036, 60067, 38072, + 4155, 61685, 15936, 59190, 21092, 55329, 28228, 64346, 14007, 56592, 4553, +63389, 12886, 55652, 17774, 62203, 35340, 15281, 60646, 23623, 52201, 12863, +27486, 56456, 21818, 59363, 30678, 236, 35094, 57524, 22398, 62903, 17942, +52019, 1712, 44776, 25009, 51050, 4357, 45407, 12258, 40046, 18248, 58219, +27219, 49056, 979, 43489, 7561, 46615, 10929, 38311, 48798, 29200, 9993, +56586, 43224, 24431, 64056, 15470, 37325, 32657, 6673, 38631, 33379, 27771, +58483, 22594, 55945, 14671, 63319, 6177, 19910, 40695, 29638, 47296, 17441, +41825, 12254, 30759, 57722, 19792, 42679, 21858, 41259, 15302, 51189, 35998, + 1182, 60660, 26568, 56721, 31984, 1905, 41481, 11213, 58377, 30200, 50745, +27271, 12687, 55430, 15409, 38972, 59284, 20067, 2602, 51626, 7709, 25495, +42992, 19708, 36483, 58817, 11281, 53374, 31991, 20964, 52421, 5163, 42914, +24409, 47058, 19641, 52038, 28290, 63092, 10203, 40644, 6433, 58042, 24784, +39493, 27577, 46960, 4040, 37953, 11631, 42751, 24440, 36299, 50643, 13075, +43222, 20166, 37145, 54153, 14724, 49182, 23899, 40578, 30308, 49989, 61411, +25223, 14816, 60083, 32491, 23211, 58647, 21368, 13450, 34170, 51523, 2001, +24239, 42941, 5055, 41279, 60365, 25638, 10374, 62446, 3536, 26945, 56345, +13516, 64149, 6527, 28279, 57455, 29508, 7357, 46160, 12747, 42743, 16792, +38975, 59532, 28402, 7076, 60273, 21676, 41375, 19066, 47136, 28694, 41210, + 253, 51138, 12881, 47557, 15616, 59984, 26127, 54844, 33732, 19830, 47869, +18166, 43304, 13719, 52644, 7214, 60344, 11487, 54383, 13548, 57615, 2333, +30066, 45148, 6966, 24323, 58868, 4977, 64877, 21715, 44812, 16261, 54248, +29979, 43378, 22141, 60713, 17923, 41024, 22379, 59501, 18826, 63800, 7271, +54261, 23684, 58967, 17146, 51889, 13319, 47991, 6127, 31721, 57326, 8500, +28676, 44245, 16918, 32246, 41581, 23394, 49649, 479, 38779, 9745, 50087, + 2476, 40197, 19302, 37688, 26922, 42522, 21847, 46956, 28453, 5538, 49372, +21008, 44921, 18566, 58344, 36528, 2056, 43199, 12186, 49113, 27638, 46653, +10235, 40815, 2942, 42736, 12879, 48855, 20233, 64745, 13454, 41966, 21685, +62626, 24266, 44375, 5045, 42078, 14370, 53044, 26147, 38894, 30250, 51973, +20838, 1344, 54097, 34818, 19473, 32538, 32, 35143, 52062, 5071, 63166, +27085, 53490, 10573, 49640, 15260, 40428, 4852, 36879, 27746, 50683, 33518, +52586, 7992, 25608, 59572, 22195, 54523, 18699, 35289, 47569, 7563, 53506, +27554, 58961, 8935, 21616, 48966, 34982, 6435, 39434, 14042, 61801, 22447, +53087, 34139, 408, 20323, 56833, 41051, 3974, 50515, 31127, 9637, 40906, +64769, 22360, 37924, 57615, 12231, 48680, 28987, 3120, 33950, 41887, 1622, +47446, 13093, 37814, 18678, 51187, 11847, 61036, 7501, 39497, 21830, 50412, +15987, 48229, 34976, 12758, 65127, 8465, 30377, 57421, 25628, 64339, 20412, +55582, 6253, 29268, 64884, 16773, 56021, 7397, 30935, 42094, 1216, 60710, +13851, 56162, 20372, 11789, 46838, 29583, 38418, 12735, 46506, 3998, 40805, +64013, 5545, 38804, 29893, 48048, 15929, 51897, 31373, 16902, 53981, 39799, +16345, 51148, 36817, 7652, 46068, 35696, 23784, 53502, 10111, 49393, 22389, +34276, 62969, 21037, 52648, 11783, 22285, 49211, 33706, 14942, 50693, 12619, +55156, 7695, 59652, 21284, 56699, 33682, 23125, 38252, 30349, 9442, 48906, + 682, 44491, 31248, 9157, 54492, 3237, 61432, 23263, 37464, 28306, 46606, +21161, 42297, 19482, 37550, 61131, 17129, 36248, 51037, 15199, 36889, 29176, +53223, 1451, 61759, 8414, 39373, 10251, 52683, 1074, 48981, 9433, 50179, + 1843, 36973, 28786, 40588, 20534, 47712, 9810, 44757, 30891, 59933, 26881, +34868, 50170, 14587, 35520, 53590, 21736, 56176, 6405, 57821, 10820, 30331, +43920, 18859, 45892, 17186, 42930, 23523, 60311, 12106, 53805, 126, 60009, + 8997, 33439, 43144, 11754, 54668, 1046, 37860, 7099, 30832, 62725, 19504, +53514, 6700, 63503, 18898, 53058, 20643, 56057, 31854, 61099, 30142, 7212, +34251, 48022, 16142, 49677, 6408, 53360, 15027, 64338, 21892, 59303, 34094, +11660, 61909, 3971, 23494, 61035, 40729, 13578, 64751, 5845, 57700, 45001, +28008, 12903, 47868, 16888, 42374, 19872, 60747, 3671, 31308, 64221, 25431, +53234, 11920, 41964, 13399, 23109, 65305, 43290, 2155, 46369, 8353, 51208, + 985, 24939, 60861, 30751, 4050, 37420, 29309, 57368, 24783, 12172, 50354, +23307, 45856, 17087, 48373, 7375, 24876, 63244, 36278, 7890, 24678, 64436, +35748, 17685, 57847, 32862, 14048, 46927, 16921, 32712, 51153, 6596, 63743, +24766, 55304, 16141, 59769, 19337, 56019, 26241, 64284, 3254, 31555, 36893, +26116, 56835, 1531, 34057, 60501, 26473, 3415, 49239, 16498, 54056, 37124, +14663, 50253, 5123, 44450, 14003, 49009, 37668, 3197, 45632, 34337, 26533, +50347, 16023, 47277, 25768, 37651, 4524, 43684, 54321, 7030, 63711, 2238, +55113, 28932, 56647, 10913, 32427, 53716, 12256, 59314, 8091, 63516, 35276, +12729, 49104, 5783, 30446, 58754, 24654, 12607, 59819, 31085, 545, 48395, +15170, 41456, 17790, 60166, 1510, 30484, 41122, 3375, 57756, 35502, 5008, +63491, 40288, 2743, 44954, 20718, 31536, 36677, 12150, 39021, 9209, 65184, + 2258, 57755, 42146, 14173, 63685, 15958, 56341, 36726, 20805, 45708, 30554, +10175, 49923, 512, 33065, 64513, 5251, 50619, 24689, 8648, 52848, 27763, + 3031, 42282, 56544, 12867, 19458, 43732, 35951, 22681, 48282, 26774, 33492, +38386, 24620, 58124, 34969, 26189, 52023, 12939, 57868, 3677, 30184, 62803, +24965, 1279, 37421, 10546, 64094, 2537, 30514, 59456, 4652, 39311, 12402, +45679, 20192, 36648, 64670, 7868, 56464, 26443, 61481, 10965, 47720, 6900, +42177, 16673, 48645, 34692, 24013, 52695, 17093, 64997, 34542, 27801, 61341, +24522, 51377, 15775, 38190, 24322, 41288, 13950, 37220, 5237, 45324, 27094, + 8529, 21829, 41590, 56864, 27690, 428, 57607, 36148, 28206, 32738, 37665, + 9576, 48202, 3473, 29071, 45450, 19650, 55075, 34985, 9091, 30740, 46003, +21552, 42230, 26397, 9416, 61557, 42867, 23134, 54788, 1669, 47089, 14153, +35774, 45132, 11026, 46628, 18058, 61410, 2841, 58785, 39106, 5341, 31645, +36892, 16393, 63050, 28613, 33942, 44732, 15994, 40499, 62331, 13525, 45970, + 5731, 33427, 55222, 19789, 63604, 4211, 58631, 27337, 35329, 44067, 16065, +45719, 29142, 48775, 21494, 8983, 47361, 841, 26685, 54535, 6099, 59498, + 3700, 28224, 42129, 13249, 46842, 7898, 39008, 25479, 45434, 6736, 43451, +13867, 40172, 59121, 15282, 44994, 18261, 46512, 29095, 8137, 36316, 62271, +21569, 43756, 33087, 2276, 46043, 19393, 39663, 27465, 61871, 23716, 17395, +59682, 24679, 9876, 58645, 5207, 63084, 29547, 8633, 50711, 32174, 17522, +22891, 41931, 19673, 49361, 34641, 14208, 24109, 50394, 16169, 27232, 46438, +22051, 40748, 26010, 820, 57374, 33909, 21299, 45600, 1396, 43841, 29308, +38640, 15757, 56249, 33008, 61320, 4476, 52465, 35627, 25710, 56082, 10482, +43984, 18446, 47739, 31206, 17217, 29999, 57566, 15514, 63215, 43184, 3593, +49907, 24384, 46664, 19002, 44248, 16760, 31288, 37176, 23524, 46799, 5791, +25788, 62942, 13060, 38303, 55815, 18799, 59545, 14972, 38461, 30817, 15779, +59239, 42821, 14196, 39505, 60503, 30424, 8097, 35026, 49679, 25679, 11134, +57102, 3140, 63103, 12887, 59795, 7179, 32551, 11013, 61620, 6353, 45912, +23376, 37871, 50637, 8081, 39851, 55017, 21171, 52736, 19488, 40164, 48604, +15845, 43705, 19353, 63650, 25994, 54590, 3286, 24768, 47012, 29187, 3912, +33478, 52112, 25749, 57487, 20753, 63921, 30225, 10223, 58460, 2940, 44426, +25708, 7759, 47539, 14253, 42603, 10298, 45742, 4408, 60284, 21701, 54421, +28315, 58756, 17046, 65505, 33097, 55160, 4127, 18318, 51335, 39701, 21038, +11022, 59957, 1527, 56029, 26248, 39313, 20879, 54534, 7083, 48585, 15255, +44250, 25786, 58349, 4477, 50560, 14226, 52880, 38010, 20236, 4222, 39911, +12142, 59785, 33100, 25600, 52667, 17483, 57606, 1248, 39759, 26829, 48461, +31107, 17009, 55213, 15014, 57990, 26693, 39086, 13852, 49296, 6503, 52327, +10451, 26481, 49665, 18064, 64401, 40533, 2693, 43531, 13326, 41736, 30055, + 9564, 56137, 3284, 59776, 10495, 52008, 2349, 40067, 60478, 28600, 53024, +41645, 11704, 44365, 21707, 38597, 60907, 20198, 55871, 18152, 31685, 62692, + 4095, 29302, 61232, 21643, 54413, 27826, 9452, 52943, 4398, 64737, 10781, +52601, 20646, 44715, 14418, 51168, 5921, 24592, 61368, 22532, 59178, 11237, +52317, 1781, 32622, 47722, 12201, 53652, 39170, 21479, 42622, 19554, 36717, +56652, 13285, 64420, 39068, 57991, 16117, 45508, 30723, 8258, 59054, 41716, + 338, 61689, 38059, 3475, 56434, 14349, 52451, 29642, 42029, 8820, 65483, +23733, 55176, 10861, 63752, 4929, 47128, 26899, 8218, 22806, 43129, 28061, +12178, 48145, 16024, 50151, 29460, 64680, 10989, 41613, 55701, 8411, 38456, +32324, 6540, 26142, 53831, 17020, 61569, 5265, 55624, 32399, 53392, 4274, +58833, 7927, 29099, 59864, 40882, 1565, 51038, 27738, 6119, 44498, 25437, +49183, 7730, 53458, 40591, 1352, 32511, 64167, 6538, 21957, 53993, 20472, +63633, 4336, 59171, 33961, 27709, 50838, 17420, 45451, 19376, 40935, 55767, +22788, 42047, 31716, 17224, 65162, 12301, 22286, 56620, 28659, 12606, 42552, + 5601, 45891, 24882, 9290, 62560, 26932, 50547, 1819, 41476, 15095, 39248, +52452, 11937, 36242, 58039, 21052, 36660, 1613, 31898, 40594, 4186, 45968, +27527, 35882, 49901, 13722, 40211, 57287, 19600, 53982, 3483, 64682, 27316, +49676, 16335, 42830, 2566, 44059, 11305, 39981, 949, 50648, 19681, 35986, +59756, 9411, 26329, 63984, 34993, 23451, 45944, 17294, 50563, 12818, 63253, +35977, 22971, 33094, 65154, 2322, 52619, 12807, 39268, 28328, 59371, 2532, +23808, 49815, 30148, 53191, 20858, 36536, 8455, 65066, 5478, 38547, 23588, +32983, 49878, 7186, 36737, 9979, 50259, 24966, 45538, 9455, 48859, 3707, +56750, 22396, 64872, 23620, 35207, 56381, 304, 38665, 31150, 16644, 59163, +25707, 54392, 18924, 53388, 32714, 15350, 47732, 35911, 23040, 32220, 62326, +18928, 33220, 10751, 20700, 33953, 63430, 15576, 53588, 26085, 10157, 45977, + 587, 37461, 52136, 14672, 33746, 50342, 10471, 38895, 158, 34790, 48771, +20368, 40804, 32735, 23696, 35727, 58809, 478, 55585, 28993, 35641, 46680, +10330, 40847, 6926, 43507, 21756, 36778, 55018, 7693, 43996, 30894, 761, +48408, 10692, 53076, 2796, 23583, 44322, 27466, 1657, 11041, 50945, 3764, +61044, 27349, 36346, 17543, 48203, 33212, 18511, 44547, 20654, 42600, 7155, +60671, 19273, 50972, 29090, 14307, 34872, 48896, 20545, 52220, 19226, 62724, +31758, 54144, 17165, 64402, 38496, 6204, 58958, 26883, 5365, 33314, 52254, + 1915, 28797, 46580, 18957, 51257, 36256, 58449, 13713, 39916, 21743, 42519, +27795, 8345, 24731, 42859, 14946, 50632, 38454, 16628, 32811, 56973, 15209, +41369, 63828, 35563, 4328, 29237, 62680, 12621, 33992, 55513, 17507, 25976, +47389, 34183, 790, 41158, 24048, 44968, 14030, 47272, 6806, 37912, 31483, + 5274, 53282, 28805, 2471, 48092, 13971, 53658, 39550, 641, 44988, 35262, + 5141, 33863, 63506, 22483, 58734, 15109, 55800, 31617, 36389, 7124, 30914, +55533, 18447, 60791, 8635, 30249, 62465, 16091, 41474, 9000, 63182, 28337, +53231, 15166, 55230, 13109, 60997, 5859, 22330, 62543, 30592, 1776, 37387, +28703, 33110, 39441, 12405, 34599, 55584, 10670, 64033, 18579, 51443, 23075, +44742, 30629, 9814, 43428, 22476, 33957, 47239, 4642, 53960, 9039, 30001, +62368, 5343, 41921, 31382, 192, 57703, 10050, 40222, 27941, 37077, 20169, +63567, 8501, 36580, 31046, 62915, 10441, 58080, 7363, 31357, 49355, 22509, +41852, 28367, 51507, 8828, 62817, 13664, 54722, 22896, 63742, 33282, 120, +35617, 62034, 20854, 42465, 32023, 9826, 36590, 3162, 44018, 20289, 32930, +60111, 8089, 51155, 10694, 37019, 6992, 42997, 768, 39765, 65060, 26368, + 5617, 57564, 12562, 41455, 6737, 55573, 36097, 58684, 5200, 25179, 39871, + 1795, 48135, 34559, 30551, 65475, 22132, 8876, 41177, 57008, 16947, 31293, +57765, 23761, 63497, 7268, 30338, 58278, 13734, 55008, 5367, 30475, 42925, +23344, 12057, 64217, 17605, 56564, 30380, 54509, 17880, 63486, 12878, 26079, +60651, 35061, 14571, 63924, 32933, 59185, 16883, 38224, 60455, 6663, 54848, +36360, 62063, 25311, 39975, 13072, 52172, 5767, 64333, 25911, 7769, 58271, +10456, 64760, 32704, 47825, 13724, 38429, 3343, 40447, 58317, 6045, 30354, +43070, 13303, 40544, 3664, 42229, 10704, 45984, 2153, 24726, 44779, 19373, +39729, 53871, 13344, 37797, 24317, 62684, 12289, 59166, 721, 21079, 30778, +47471, 1704, 52175, 10916, 64074, 36602, 56375, 20219, 63119, 33609, 2608, +53721, 10685, 24284, 47954, 22787, 9443, 20084, 58318, 41058, 18101, 44811, +23922, 9233, 35984, 51668, 11394, 58600, 27691, 51425, 9067, 29556, 55168, +21789, 64609, 18657, 57506, 34974, 12250, 64249, 20476, 33533, 62592, 4872, +29311, 57124, 19134, 60913, 24117, 43651, 2229, 50943, 8739, 32912, 39237, + 93, 57752, 21200, 44452, 9959, 46814, 34797, 23425, 43753, 800, 49162, +22869, 50314, 13996, 42464, 6168, 44471, 20247, 38882, 23021, 47369, 33024, + 8601, 51095, 23703, 60437, 11147, 55273, 18301, 59144, 675, 31163, 37040, +26110, 39042, 7503, 61992, 13655, 47892, 26723, 62758, 2179, 52901, 15561, +42239, 19842, 49956, 37423, 15357, 32506, 52725, 17815, 43579, 24953, 49827, +14337, 59703, 6629, 51396, 23347, 48201, 15219, 43295, 16492, 45280, 24748, +35002, 63364, 3464, 55150, 13252, 58726, 16676, 31701, 42466, 21215, 38235, + 4399, 41961, 19550, 59347, 28111, 5838, 52776, 13158, 60368, 29006, 54067, +25954, 58773, 8759, 51983, 22366, 47081, 20061, 44570, 27848, 62676, 22468, +57229, 23985, 8559, 44696, 33071, 19301, 52647, 23749, 50733, 26401, 3033, +42068, 29918, 55183, 19553, 61538, 16819, 56637, 7118, 27547, 43941, 58659, +24888, 2239, 35678, 47138, 5670, 49733, 16357, 33239, 44230, 1926, 46912, +36261, 19718, 63288, 9250, 51997, 33022, 3810, 49982, 27419, 1021, 35190, +47353, 4785, 40083, 50996, 3495, 22432, 54233, 27448, 8207, 24147, 45971, +29857, 11942, 40535, 31668, 21128, 5318, 46416, 19101, 42975, 21013, 44974, +14913, 53883, 35538, 19918, 46897, 24333, 1758, 27713, 53123, 23519, 62819, +11697, 36281, 26934, 61579, 2416, 57505, 24596, 55412, 16226, 59309, 30024, +34370, 57122, 14543, 62278, 96, 23530, 60977, 16905, 49738, 6865, 42087, +22744, 40104, 64963, 8921, 34465, 60544, 22790, 45369, 15746, 30585, 1082, +45981, 9759, 25271, 48469, 21535, 65473, 35608, 3572, 59070, 31430, 53112, +33801, 10349, 56331, 2582, 61567, 29497, 57254, 3697, 40369, 18442, 46436, +15295, 62067, 39080, 1963, 43242, 10688, 41596, 34, 46040, 26042, 36207, +49525, 9705, 38163, 21442, 47598, 14432, 49521, 9061, 51583, 15988, 47053, +34949, 27625, 60687, 17480, 43397, 12804, 51245, 23783, 59638, 31877, 4908, +53675, 16957, 58730, 35619, 5665, 34231, 55812, 18949, 58288, 24828, 65422, + 923, 54339, 16259, 57921, 38678, 15103, 45109, 16806, 42928, 4635, 47826, +24078, 52041, 19589, 59962, 4896, 56552, 21155, 34343, 52627, 5546, 54544, +14362, 40466, 28910, 61245, 7744, 56273, 27114, 2706, 43355, 57958, 8024, +28769, 61446, 6154, 29554, 54247, 20861, 45040, 31705, 634, 32533, 53973, + 6077, 56032, 28854, 1140, 47467, 13711, 43813, 27198, 39868, 367, 35066, +55763, 3310, 60376, 27697, 56872, 16164, 52030, 12461, 32372, 44697, 22844, +40808, 1429, 43591, 17460, 46746, 14641, 31738, 41496, 4535, 29699, 63314, + 1725, 52556, 12436, 47540, 14329, 36425, 54917, 17372, 60271, 39205, 1104, +43253, 11456, 38327, 64191, 13794, 46917, 8677, 43806, 13012, 42342, 21056, +50551, 40179, 4504, 19386, 51579, 29161, 64496, 15694, 43143, 12374, 37749, +56623, 17946, 62594, 26277, 9901, 50222, 28100, 40570, 16298, 59384, 38712, +15242, 41847, 62848, 13914, 23488, 56820, 28893, 16705, 37368, 49058, 5748, +44781, 31954, 51502, 4142, 65109, 26037, 52682, 13926, 43662, 56124, 12243, +63217, 1127, 57686, 29113, 37983, 2648, 50727, 30101, 5132, 54663, 31575, +61330, 5714, 41796, 20241, 54394, 18607, 51285, 16399, 41450, 32114, 9036, +33069, 50163, 23288, 6908, 51398, 9807, 49568, 28580, 33700, 43633, 8056, +45543, 27716, 56744, 17954, 54834, 13044, 33291, 52881, 25792, 11560, 41154, + 4066, 51350, 35931, 60298, 18257, 39129, 55126, 12146, 43829, 6943, 50352, +30076, 13608, 47356, 1153, 21239, 48515, 24907, 50848, 16165, 45791, 19848, +43410, 23262, 63267, 5872, 37285, 32376, 17192, 59886, 31123, 54093, 20773, +61386, 15652, 52011, 5706, 31214, 56498, 24541, 59261, 8358, 36897, 25889, +40212, 27852, 58136, 9940, 18617, 49238, 4502, 53172, 22736, 65096, 35133, + 3567, 39490, 14062, 64036, 28859, 46218, 10433, 25248, 64859, 27092, 2338, +46538, 31506, 8357, 32659, 43698, 12367, 42286, 3527, 28480, 64202, 6607, +53354, 25507, 63222, 13377, 40709, 7893, 45537, 14238, 50827, 27797, 46999, + 3174, 31622, 38908, 22802, 33317, 49119, 12115, 24618, 45582, 18235, 39690, +60411, 29169, 12244, 35930, 48516, 14974, 35107, 46517, 2938, 38924, 13587, +62259, 27606, 57440, 21078, 46005, 19207, 38437, 60238, 18323, 56466, 35664, + 9766, 61205, 24853, 48507, 15030, 30731, 43856, 11211, 34450, 46718, 7472, +39982, 57166, 15621, 63446, 18015, 54996, 12001, 63888, 5562, 37416, 61381, +17140, 54810, 38114, 18407, 42108, 21253, 39045, 4866, 61573, 29256, 2540, +50601, 10243, 30590, 63115, 18219, 56374, 21066, 31213, 51697, 23486, 59913, +28877, 52731, 3543, 62792, 11245, 23828, 60223, 32969, 9862, 42489, 7476, +54253, 28568, 61523, 29851, 4014, 51104, 11437, 34967, 59911, 22716, 2667, +57104, 33893, 6586, 25868, 48877, 8463, 25077, 51735, 33512, 9767, 42715, +65414, 12428, 28210, 62233, 17847, 57327, 20629, 43344, 15639, 46586, 163, +59600, 17530, 26029, 37634, 30626, 47399, 24149, 8880, 59822, 31573, 14036, +62347, 39462, 15511, 43073, 17599, 49874, 12710, 47544, 247, 42240, 7287, +46266, 21209, 64833, 26394, 44086, 978, 37241, 63368, 21075, 43350, 35198, + 6501, 53305, 13820, 57968, 35667, 2939, 34328, 44629, 4623, 47711, 24034, + 3262, 36092, 56252, 20007, 61787, 24262, 7578, 28223, 52469, 4869, 31521, +60924, 26601, 40199, 17049, 61919, 37074, 25170, 34844, 64375, 28616, 7393, +33550, 40389, 6309, 65231, 12929, 53353, 14737, 30969, 56376, 3994, 49214, +23511, 6303, 27883, 47500, 8830, 40936, 23335, 60633, 16633, 40852, 1496, +42395, 28525, 53495, 2798, 62273, 6025, 37769, 30167, 64449, 22023, 40633, +14744, 45530, 6758, 29297, 47905, 19725, 49917, 35967, 7681, 21879, 56599, +41858, 12976, 49015, 39207, 16274, 62098, 28310, 52372, 18753, 60592, 26390, +52904, 36603, 20260, 42044, 31658, 9324, 32692, 44235, 21763, 62094, 33994, +28777, 40095, 12574, 35402, 60769, 16701, 58138, 8241, 63713, 3799, 57056, +38317, 1108, 65246, 9924, 21744, 51933, 24165, 64406, 1867, 30756, 56618, +19388, 63934, 23957, 48840, 7754, 42799, 10672, 40985, 3605, 65382, 9208, +30063, 44610, 5180, 22176, 50275, 20073, 45002, 7619, 64554, 37533, 18180, +50682, 1764, 26028, 64817, 23917, 2972, 51068, 8203, 47913, 27871, 36403, +20647, 51315, 27172, 2203, 43455, 25006, 6382, 56559, 13310, 60786, 25699, +43881, 19502, 49395, 37632, 21398, 45585, 16456, 34874, 47960, 4305, 44980, + 7886, 36813, 20, 39047, 6885, 36205, 27187, 37202, 30950, 49416, 14289, +38446, 61885, 19942, 47973, 34855, 1335, 21320, 52694, 25237, 40902, 20893, +45801, 6159, 38262, 48678, 12571, 45462, 29973, 62013, 20426, 57413, 32617, + 3059, 41312, 58960, 22631, 355, 52547, 39363, 13741, 42315, 1961, 38602, +11223, 58097, 35110, 22825, 32649, 49123, 3170, 54196, 9822, 19966, 55833, +42029, 15840, 49057, 41220, 11482, 33640, 56110, 9321, 58921, 35923, 26357, +34824, 60242, 21929, 57909, 11411, 52842, 5268, 48741, 13728, 60819, 28322, +11111, 47454, 2806, 25677, 65324, 20263, 48616, 26642, 15160, 61935, 11622, +31117, 63794, 16016, 57352, 29673, 49954, 6200, 42888, 14625, 48235, 31559, +44440, 16043, 47245, 11727, 36774, 152, 58109, 32118, 5091, 54478, 8998, +52196, 13003, 41046, 60676, 15113, 52999, 26564, 32845, 49664, 1787, 34642, +44863, 16421, 42651, 12659, 52259, 36334, 62967, 14374, 32319, 56156, 3594, +29341, 46682, 13214, 51653, 17760, 64732, 15191, 44400, 22774, 55286, 13421, +50460, 1122, 44224, 10605, 61602, 34480, 26321, 56378, 11253, 61324, 1244, +25573, 52173, 33744, 2968, 32301, 52949, 8005, 33244, 50807, 4382, 41792, +10122, 37296, 5404, 44716, 17850, 9123, 56294, 365, 59724, 27703, 56703, + 2358, 54185, 17965, 5995, 57214, 1578, 64930, 24434, 9207, 48819, 29414, +42141, 15997, 36691, 32235, 13797, 51036, 29792, 35224, 46635, 4112, 44903, +16500, 53631, 40008, 7258, 43120, 11346, 41187, 17689, 52377, 24877, 60908, +16184, 48659, 34429, 25827, 52483, 14495, 33373, 63802, 31216, 2726, 32321, +51365, 23564, 4758, 57775, 21955, 61328, 35497, 13978, 49626, 36022, 27025, +32963, 38301, 4687, 57324, 32131, 9020, 39451, 56014, 11769, 65279, 35004, +27160, 46583, 3411, 50301, 9716, 56052, 7614, 28277, 64578, 5136, 58182, + 8916, 31907, 59631, 14710, 62047, 18666, 54744, 22393, 64880, 14058, 54229, + 9504, 58166, 1079, 46751, 25982, 3337, 53696, 11874, 23568, 58074, 40411, +10177, 48479, 7718, 60431, 28982, 55939, 14235, 32341, 65304, 18872, 53567, + 1411, 44706, 13197, 37374, 60772, 20796, 8112, 34914, 46630, 25389, 7145, +56031, 19807, 61214, 23166, 52332, 29686, 7496, 62434, 10309, 39846, 63992, +28960, 50069, 35879, 4092, 33434, 65172, 6130, 23691, 52930, 919, 26850, +44794, 22811, 2969, 64186, 9738, 29278, 45513, 15307, 37430, 27426, 39262, +19445, 53880, 21674, 39909, 55725, 18296, 58444, 39312, 12081, 42388, 4124, +38116, 50689, 22993, 46323, 20052, 35943, 43286, 9906, 45641, 14174, 63520, +27620, 54644, 10254, 57871, 3012, 64856, 20814, 53190, 18612, 44993, 14721, +48715, 36309, 18443, 42735, 19822, 46795, 4046, 36347, 31179, 297, 60055, +10533, 37148, 27857, 54706, 7554, 60892, 25373, 57950, 31621, 21156, 2858, +38740, 50359, 17305, 37261, 54498, 7707, 63247, 26466, 36504, 6565, 48737, +31391, 9478, 32487, 42314, 19534, 59524, 29209, 54092, 21048, 2430, 50292, +15876, 42233, 22198, 40415, 58466, 13579, 43521, 62984, 14729, 22454, 61452, +24539, 12545, 56106, 19790, 59560, 24186, 54622, 22457, 62314, 33304, 21802, +46632, 19179, 42488, 16051, 46246, 30128, 35514, 49968, 23172, 42523, 18393, +49579, 40803, 21529, 59, 55266, 26246, 53442, 19605, 59510, 25847, 5785, +55515, 17414, 59050, 10991, 38101, 31963, 18743, 60709, 25928, 54601, 5054, +60092, 34714, 1791, 28976, 53589, 23137, 11438, 49891, 2097, 58947, 40323, + 8231, 54306, 26520, 59587, 10318, 33781, 47150, 12136, 41754, 8444, 45299, +30815, 6345, 55943, 12701, 60948, 22099, 50240, 18961, 41313, 62456, 15114, +31108, 47937, 15927, 44193, 10836, 32825, 57929, 15310, 39676, 24063, 34024, +46844, 18734, 42968, 26523, 53037, 19986, 37902, 28382, 34108, 47409, 10110, +45464, 16366, 48283, 25002, 41425, 21719, 43095, 18013, 50025, 33936, 28312, +36121, 50414, 14500, 27849, 65039, 18319, 32004, 37030, 685, 23406, 51687, +24755, 3945, 43283, 11092, 39335, 16900, 52857, 6811, 27853, 50685, 30296, +55484, 16230, 60264, 29822, 34225, 46895, 9534, 41395, 4912, 47601, 20214, +36329, 51791, 15815, 34696, 6548, 21438, 61570, 31043, 16607, 37601, 28870, +56939, 17057, 37269, 63450, 7631, 51855, 30616, 38420, 24309, 55766, 4125, +31584, 63231, 1734, 59641, 31848, 7130, 45319, 3927, 32201, 36810, 9171, +30342, 59927, 22221, 54488, 30284, 7687, 58367, 946, 53629, 7075, 27459, +59938, 21764, 40619, 31813, 461, 34996, 21345, 39027, 26093, 33092, 38189, + 7799, 62369, 29478, 51638, 9326, 26063, 56718, 2792, 62904, 23457, 54985, +16990, 57788, 38734, 20934, 47433, 17602, 62463, 20403, 48236, 29358, 533, +39725, 9464, 43992, 58941, 24625, 7056, 65292, 28425, 15438, 32159, 38735, + 4079, 58261, 32150, 18573, 61179, 24482, 53053, 3866, 47032, 35095, 7482, +24920, 48276, 30110, 36404, 63336, 4344, 51531, 9129, 31383, 37969, 6500, +29255, 47968, 35291, 278, 36138, 45114, 22002, 44049, 1525, 47700, 10933, +41239, 2709, 49027, 38392, 13583, 51822, 5058, 65119, 24875, 8329, 47817, +11555, 62925, 15024, 55003, 6179, 30915, 60170, 38236, 11740, 42971, 6422, +44320, 8942, 40340, 49302, 12414, 43648, 33847, 26222, 61753, 4559, 49011, +12765, 37482, 21856, 44090, 27411, 13193, 36513, 44886, 6671, 39347, 62108, +19568, 36803, 28739, 17327, 46518, 14829, 42506, 16171, 38450, 62504, 17078, +53573, 28951, 55022, 16520, 59182, 33235, 19828, 43262, 2036, 45534, 10870, +59754, 483, 26056, 52978, 7078, 34175, 59367, 1023, 49615, 17646, 36921, +28535, 63659, 180, 59751, 12200, 51448, 13616, 39869, 1846, 46589, 9670, +50324, 2882, 25154, 57624, 29704, 39945, 2050, 56183, 6238, 63300, 12249, +55137, 6637, 64115, 10756, 59084, 5064, 32703, 45907, 3094, 38370, 55325, +15036, 63983, 42372, 9083, 40813, 56443, 28712, 61216, 21849, 47721, 19741, +64794, 38947, 12010, 44946, 4612, 38404, 10557, 48445, 3726, 26690, 54340, +18155, 63591, 27330, 56821, 2341, 24762, 45428, 23066, 57263, 40469, 12617, +42901, 53992, 1873, 45039, 10286, 48366, 32504, 19083, 41097, 13823, 57377, + 6412, 48830, 13560, 33681, 51470, 17971, 44780, 15732, 36324, 57045, 14911, +62092, 17452, 52423, 27113, 46475, 1393, 44722, 10331, 64116, 21129, 40410, +32053, 18567, 61475, 38555, 2027, 51867, 8144, 59469, 19710, 43469, 62240, + 6785, 55711, 13487, 59209, 25149, 40184, 5668, 23660, 64575, 39180, 15629, +43910, 30077, 8157, 28370, 45425, 5757, 25382, 50145, 8488, 42974, 5057, +41183, 11536, 36830, 64776, 17403, 55383, 33773, 11051, 46099, 30863, 40651, + 939, 57769, 43338, 18915, 45735, 13862, 53606, 39872, 320, 46171, 17326, +63093, 28720, 16508, 57502, 40532, 5639, 55043, 10153, 20394, 46146, 28947, +56812, 17118, 60969, 24439, 54510, 9758, 59000, 27057, 54085, 7126, 64528, +14249, 38616, 28020, 63576, 15456, 57222, 26253, 6367, 60801, 28699, 39120, +12627, 34396, 50995, 19979, 38819, 3727, 45137, 34971, 26092, 51269, 13496, +28112, 64287, 18973, 57410, 24277, 62486, 15541, 30823, 63449, 22028, 473, +50091, 15841, 41863, 20860, 51986, 928, 58739, 11997, 56179, 30348, 64266, +15326, 58446, 31534, 4442, 42364, 55726, 6832, 61655, 29758, 52133, 6023, +48451, 29211, 1357, 40712, 33223, 3992, 25132, 49322, 605, 40497, 62213, +15139, 53399, 20956, 42110, 16822, 36294, 48635, 21614, 45049, 16768, 28795, +53547, 23709, 62060, 6886, 51717, 11324, 41874, 26011, 38415, 3520, 62478, +23805, 55493, 22478, 65329, 18003, 59105, 42880, 21055, 5831, 60891, 32147, +17568, 43868, 23432, 37481, 27768, 41061, 20604, 45048, 22189, 39228, 62382, +13089, 56337, 24543, 6954, 49353, 32948, 16412, 53016, 33686, 20696, 7831, +34960, 51253, 5158, 42625, 25851, 2139, 57984, 23283, 62627, 21467, 53470, +23593, 64512, 37315, 14092, 45693, 34577, 8532, 40637, 30506, 60821, 9134, +48707, 601, 25646, 51987, 8031, 27043, 59069, 21990, 62995, 27800, 4362, +57927, 24054, 47304, 17051, 42611, 20174, 61876, 39687, 7959, 42375, 23083, +53115, 10515, 28196, 49942, 23381, 41927, 5903, 63624, 16402, 55954, 18991, +36955, 25197, 47907, 12660, 52533, 35116, 9583, 25396, 46749, 15567, 44306, +24840, 54003, 12637, 30434, 41483, 23018, 45594, 1474, 49351, 19413, 57132, +42293, 1933, 31231, 60434, 10021, 53498, 37520, 61482, 12133, 40195, 64061, +18112, 54506, 26164, 58743, 22817, 52831, 19451, 32694, 48867, 4875, 22872, +51683, 19748, 60449, 12397, 52962, 30213, 8995, 61327, 25039, 50009, 8012, +29564, 57028, 12110, 33676, 39016, 10899, 51053, 31460, 14347, 62354, 22856, +35453, 52758, 24504, 12264, 33403, 41437, 2053, 46133, 15741, 42944, 19539, +41529, 16688, 47262, 34003, 25680, 57825, 7326, 30201, 45123, 18740, 51300, +30636, 36510, 10753, 58494, 26867, 54797, 1161, 61136, 22579, 57625, 29480, + 9541, 58915, 2813, 34603, 45852, 4786, 47236, 35279, 2012, 33290, 48161, + 3429, 36332, 51649, 28741, 35089, 55909, 10255, 65091, 29638, 46684, 16739, +40638, 3902, 50060, 8436, 51462, 34088, 18240, 49349, 24930, 13353, 32424, +41073, 752, 23901, 64152, 20690, 58090, 25948, 55460, 14513, 59948, 36625, +19335, 46159, 23748, 9435, 37789, 26754, 65150, 6674, 55413, 28094, 9634, +64216, 3847, 56876, 37339, 6065, 40996, 21645, 43309, 19435, 31942, 54016, +16938, 57359, 31757, 14944, 43352, 7310, 41866, 13880, 39606, 27037, 8424, +35045, 51124, 19305, 37890, 58569, 10408, 52522, 2799, 61064, 13482, 57209, + 382, 52325, 9247, 25843, 42535, 19344, 50721, 39970, 27439, 5349, 58171, +29247, 2422, 63654, 44266, 15474, 31124, 59998, 14677, 54264, 36481, 17328, +43388, 13992, 41351, 1617, 42825, 12759, 32047, 59098, 886, 24992, 55596, +15249, 51307, 16924, 33470, 14446, 42195, 64483, 17547, 34620, 47886, 13956, +43625, 6917, 38391, 51190, 12113, 43091, 2360, 65347, 27866, 54070, 1183, +25221, 56247, 12027, 47814, 4853, 60519, 38185, 386, 43928, 12618, 48914, +24604, 38326, 8690, 33470, 50457, 2355, 29020, 62439, 5210, 48597, 29832, +54824, 19507, 65384, 34631, 4679, 35988, 49368, 2514, 52285, 9484, 29065, +53717, 36166, 10452, 32751, 21740, 55451, 14473, 34849, 46248, 24913, 958, +20707, 50700, 30872, 13736, 43668, 2092, 37893, 12119, 42250, 3222, 56597, + 8299, 26421, 41758, 63487, 36086, 2183, 27539, 48818, 35067, 15006, 51163, +35875, 2091, 33457, 60171, 16250, 42667, 25735, 49783, 5277, 58800, 36136, + 1870, 44405, 32601, 8379, 60495, 440, 43670, 64150, 5793, 53278, 21237, +34303, 65300, 3756, 55309, 6277, 60145, 28650, 3115, 51019, 12203, 34954, +49605, 4904, 39399, 11547, 64398, 21208, 49510, 3318, 41833, 13888, 44014, +16909, 40796, 12346, 46704, 20482, 41634, 23680, 61956, 20883, 54026, 10858, +27273, 50630, 17846, 35910, 57737, 20518, 9481, 59891, 6712, 23370, 44783, +26628, 8252, 35214, 62872, 23259, 45213, 21657, 41615, 25386, 265, 57038, + 9594, 64685, 36379, 53668, 16659, 57386, 33414, 10576, 43835, 5112, 46108, + 9315, 31322, 42707, 7848, 62864, 13542, 56641, 30577, 51613, 4465, 29772, +46387, 17938, 50808, 38050, 19439, 42620, 26646, 11407, 61120, 13898, 47205, + 2384, 55317, 36298, 4648, 44844, 9381, 36583, 54682, 19727, 61001, 28317, +56783, 5023, 54001, 30738, 63717, 13332, 44437, 4625, 30866, 46706, 18725, +42349, 22524, 38657, 24351, 43678, 18803, 37139, 54713, 2168, 60805, 9721, +21704, 61630, 36165, 12296, 48946, 19362, 37295, 22912, 49883, 110, 33338, +39949, 9013, 27483, 49054, 5652, 51689, 27401, 61040, 16552, 56485, 6262, +39682, 30067, 48332, 20857, 42696, 4496, 38691, 58888, 53126, 32328, 5379, +31433, 60403, 3561, 40943, 19745, 50193, 15525, 33959, 60131, 17906, 52676, +34551, 9904, 37169, 30556, 47213, 17474, 64029, 26259, 39651, 31798, 19165, +65006, 21287, 57963, 30188, 3486, 53407, 28359, 57664, 15363, 60360, 38724, +17770, 44187, 15986, 59160, 3584, 39561, 8751, 29439, 58298, 18360, 31629, +64274, 22227, 35864, 61315, 14228, 26608, 63701, 43481, 7222, 35962, 49592, + 4538, 21540, 58916, 31646, 56284, 35531, 3537, 59602, 32445, 57015, 18785, +62832, 26897, 49184, 16803, 39179, 58408, 21105, 10161, 18253, 57140, 41226, +21980, 4401, 62394, 32059, 18032, 48266, 20329, 38031, 30956, 3460, 63777, +14178, 53940, 29624, 15376, 65409, 18293, 49185, 26469, 42817, 29962, 16785, +31808, 48767, 23475, 59750, 8625, 31104, 39240, 25041, 46646, 13834, 40088, +56764, 19097, 31449, 61160, 17069, 54813, 23887, 44272, 1363, 42201, 14532, +56131, 23249, 63681, 31297, 53853, 6796, 55761, 31055, 64552, 7283, 50159, +12496, 43322, 16584, 40547, 61407, 14027, 56022, 8269, 29295, 46823, 39130, +15151, 41256, 54152, 3082, 58220, 42710, 20194, 6211, 53969, 13983, 61168, +17007, 47921, 35644, 29078, 46000, 21064, 3010, 26555, 44496, 12262, 50351, +37233, 18715, 53250, 23133, 36046, 65481, 15681, 52108, 27518, 37138, 3073, +42277, 20088, 57718, 38963, 11538, 61599, 2713, 30930, 47588, 14775, 50363, +32850, 20369, 52264, 24557, 64792, 15740, 27569, 59143, 22399, 63988, 26677, + 5905, 49560, 31385, 547, 33067, 44536, 16997, 42470, 1428, 48916, 28956, +62230, 15108, 34310, 64596, 8793, 55977, 4938, 54037, 8523, 59700, 31626, +16017, 46923, 26871, 34423, 45341, 1175, 47585, 21059, 34961, 59476, 5960, +54491, 11731, 56720, 16436, 63157, 30144, 56154, 20123, 63819, 30974, 8685, +34516, 47333, 22592, 43998, 19850, 62874, 7735, 57665, 12344, 65525, 26783, + 7349, 36882, 18589, 55262, 39513, 15338, 50885, 11232, 61797, 26156, 55342, + 46, 30552, 39320, 8317, 23375, 58481, 19403, 53464, 5832, 41807, 29654, + 2223, 54231, 14423, 48423, 13302, 51136, 7814, 34535, 61240, 13847, 43577, + 4899, 45220, 32363, 7274, 56666, 24461, 40683, 11406, 33226, 50247, 23126, +45408, 13878, 47556, 6486, 38260, 11046, 48649, 5353, 34795, 47804, 3379, +22861, 59820, 27765, 16904, 63304, 33423, 11386, 48657, 6802, 22668, 47011, +26606, 9071, 23854, 46381, 6623, 44220, 9829, 61853, 34142, 1524, 46961, +28843, 50108, 34002, 8676, 59511, 28638, 38986, 6672, 56039, 11618, 65001, + 5786, 44344, 54556, 22910, 32518, 41101, 11739, 46870, 23998, 53341, 4159, +58115, 12676, 38197, 59211, 10749, 39936, 14041, 35380, 50658, 17356, 49336, +10063, 34605, 63279, 22911, 8939, 35849, 46419, 628, 41747, 20873, 60031, +15167, 53176, 19055, 47278, 34341, 9756, 36027, 4288, 28064, 48277, 23850, + 578, 37933, 27550, 32886, 56451, 1402, 58661, 31110, 5308, 32393, 43181, +23309, 64595, 5485, 26218, 62095, 18414, 32078, 37441, 14269, 30344, 49428, +34021, 28194, 37415, 2516, 54867, 10327, 63019, 7340, 23446, 59272, 31889, +55010, 7595, 60810, 24803, 3221, 61969, 35038, 13131, 50117, 2321, 30320, +41033, 5476, 48621, 25723, 63359, 8673, 32463, 22496, 43720, 33763, 24950, +58372, 8017, 63131, 1596, 57473, 38833, 4984, 42376, 10322, 37320, 50134, +13048, 42356, 1492, 51992, 37726, 11635, 43946, 23679, 53001, 12582, 61748, +21855, 55745, 25637, 9054, 36536, 53624, 718, 26052, 44862, 19677, 47154, +34694, 26374, 39732, 5871, 62987, 35770, 14010, 58458, 17983, 53813, 24337, +62857, 8478, 29941, 43201, 21495, 41806, 24815, 45553, 7253, 46752, 3321, +42437, 12204, 38406, 58545, 21100, 4278, 53799, 11882, 50309, 17125, 37010, +29265, 46759, 18033, 45168, 29905, 11785, 50094, 24682, 8897, 57727, 28639, +45749, 32636, 5901, 31698, 45255, 18998, 61506, 29553, 48173, 3419, 44581, +12925, 60387, 15968, 51628, 35058, 22411, 59196, 5457, 32343, 37523, 26780, +45658, 19360, 40938, 22353, 65122, 26290, 14070, 51836, 34448, 309, 53333, +27757, 62642, 14764, 56898, 1263, 62974, 26941, 54522, 16752, 58959, 32576, +24189, 57605, 15647, 33184, 50490, 12100, 53019, 40131, 8663, 54762, 41765, +18971, 39372, 65050, 10443, 55485, 36833, 52306, 14971, 39823, 20267, 51005, +30398, 14553, 54285, 33126, 60814, 5590, 23964, 45528, 17652, 44016, 20789, +45081, 22784, 41990, 24096, 49139, 15532, 33911, 8447, 46102, 982, 61854, +33633, 7162, 31636, 41540, 22027, 47829, 5039, 33760, 52397, 3371, 57253, +26756, 894, 61657, 21714, 55884, 27603, 1683, 44738, 29338, 61978, 16334, +52669, 10481, 47843, 3954, 36741, 27389, 62634, 5812, 26148, 59365, 43231, +19528, 61814, 14199, 42504, 59918, 17227, 49110, 15613, 38634, 26852, 36733, +20089, 52717, 39083, 796, 51249, 19214, 34910, 49491, 1746, 52727, 12639, +63754, 24205, 55062, 1485, 60351, 9782, 47087, 32586, 26472, 43452, 19024, +49122, 40117, 12984, 42211, 17958, 43252, 15712, 38907, 47714, 30155, 7044, +58908, 16970, 33962, 57247, 17826, 60309, 11998, 52932, 21527, 35523, 48168, + 929, 59597, 9166, 52422, 21498, 37229, 28329, 44658, 16046, 30735, 59972, +19142, 48026, 30206, 7196, 56651, 20291, 48003, 16449, 28761, 58546, 19000, +64278, 16138, 48561, 6473, 38489, 11209, 35012, 50312, 22819, 16535, 49315, +35628, 13030, 59413, 28427, 12035, 65354, 18315, 50157, 29741, 3766, 52521, + 7486, 32609, 38047, 4862, 41750, 25895, 55120, 13623, 58786, 4285, 62096, +18577, 37227, 23934, 59583, 16653, 55192, 633, 25519, 45222, 35548, 28422, +60369, 2499, 33692, 53313, 3462, 24257, 54676, 1276, 61322, 41553, 2816, +62612, 29767, 37159, 1426, 22363, 56353, 20282, 64855, 10723, 49902, 4761, +41860, 16698, 62931, 28333, 39003, 24987, 48474, 10259, 62329, 7549, 30710, +41233, 56108, 2639, 63102, 11627, 52922, 766, 49344, 10004, 35956, 46576, +22985, 12073, 64369, 17440, 45070, 5787, 37193, 24720, 41049, 33082, 10516, +40148, 28164, 41814, 871, 53320, 9099, 39930, 61744, 17315, 44760, 396, +32342, 47763, 24052, 2868, 59438, 14735, 30549, 44935, 20338, 4473, 28154, +63737, 746, 57361, 34939, 4722, 45897, 25985, 8000, 20478, 39751, 64334, +12894, 55619, 3013, 63904, 9986, 58858, 713, 52504, 10661, 39471, 59722, +22024, 55577, 30555, 16592, 48677, 27035, 60093, 15677, 54512, 18008, 64761, +14786, 25407, 42691, 19145, 47918, 37596, 12864, 42599, 5397, 37438, 53222, +15874, 50212, 4506, 37286, 26054, 65220, 28254, 32754, 56656, 7950, 38876, +29739, 50405, 21462, 8499, 52282, 29543, 37203, 7643, 33772, 53095, 4614, +63072, 10531, 54320, 6576, 65446, 12160, 24969, 59634, 30161, 11510, 56377, +20920, 40801, 27786, 47121, 4963, 43982, 11527, 40236, 21152, 53254, 18422, +65011, 5886, 29866, 52820, 1927, 33332, 56702, 5554, 63233, 27525, 52048, + 6173, 21093, 56660, 27427, 38747, 25319, 47215, 7380, 45082, 23797, 33252, +39282, 5984, 58897, 15549, 53866, 18980, 30494, 39439, 4759, 48918, 12697, +34943, 51404, 8974, 35600, 53494, 700, 62236, 25743, 38572, 31966, 11165, +62980, 40664, 7939, 47344, 3814, 39293, 32450, 26649, 52234, 20433, 60547, + 4093, 58380, 32555, 7704, 54309, 31065, 3641, 50663, 33186, 1566, 44264, +10183, 56506, 24207, 38938, 27863, 64368, 11277, 57169, 16696, 49721, 1730, +45914, 28683, 38578, 10249, 32991, 53941, 13073, 28508, 48422, 20698, 33514, +49495, 9266, 65065, 14497, 38916, 25795, 43627, 15136, 61830, 39235, 10777, +43177, 21123, 13076, 45948, 15812, 43912, 17633, 63568, 40734, 12338, 47255, +36408, 23508, 34984, 56059, 13899, 52232, 34919, 11315, 50333, 622, 36984, +21265, 42657, 25571, 47462, 11317, 23613, 44957, 21823, 39670, 17337, 56947, +34176, 20754, 54596, 3102, 59773, 35588, 30272, 48590, 10656, 32090, 53915, +11891, 51403, 20821, 56028, 3189, 61049, 13495, 49838, 19469, 44158, 30032, + 5597, 37281, 24800, 65301, 21046, 13340, 52257, 35880, 26901, 51698, 1646, +34775, 61771, 31228, 43081, 17629, 47537, 31659, 21366, 65009, 18456, 59287, +32130, 53559, 30402, 227, 51058, 29404, 37974, 16433, 47966, 29068, 37605, +18841, 62597, 28240, 2629, 43612, 10081, 38145, 58262, 3243, 43085, 10580, +39041, 1416, 45604, 27740, 35495, 49585, 13358, 62843, 7987, 28375, 58041, +23672, 64327, 18793, 31804, 57497, 11653, 32814, 58656, 7697, 39599, 13995, +50105, 21844, 45167, 16271, 60401, 173, 33481, 47870, 25155, 2513, 57220, +44970, 23444, 12740, 45767, 21175, 42216, 18687, 44410, 17266, 41135, 48615, + 9753, 37994, 47801, 28813, 7913, 59015, 10097, 34736, 56805, 19051, 61014, +25705, 44368, 4683, 41311, 13417, 55611, 38899, 21335, 61587, 10662, 25483, +49928, 30381, 1103, 34582, 64950, 41004, 9942, 51684, 161, 63657, 11721, +55808, 35122, 1277, 64614, 14038, 51099, 26281, 40829, 9867, 35165, 64416, +17687, 56193, 24311, 61846, 6397, 23290, 64102, 26207, 15100, 43826, 21411, +49309, 4202, 59673, 34930, 2690, 24538, 52729, 34213, 27540, 60295, 9952, +57346, 2510, 40770, 29960, 44872, 14000, 40693, 63906, 18139, 39700, 61277, +14143, 41136, 57610, 20283, 48046, 14482, 43479, 17542, 47216, 14840, 44998, +30262, 39755, 10815, 65223, 33313, 17898, 53083, 26512, 48016, 1353, 64587, +38776, 6799, 41550, 61923, 15203, 54818, 23611, 47666, 7033, 51201, 10282, +48126, 32415, 16810, 56533, 26453, 58640, 51880, 20162, 54132, 7081, 49529, +33531, 5177, 52692, 29605, 2519, 58866, 9366, 28811, 43834, 25034, 6293, +56841, 20102, 64468, 30985, 55498, 4006, 57504, 16181, 64625, 36539, 9584, +59505, 6143, 46302, 30382, 6835, 62773, 27906, 40276, 19717, 49650, 4474, +25478, 61635, 39316, 16620, 60741, 4164, 44556, 17267, 47034, 20393, 37114, +25038, 64654, 12813, 58555, 26654, 55703, 8079, 29348, 54232, 34494, 6498, +62522, 9524, 31967, 47382, 23213, 7278, 53872, 11656, 58619, 35574, 11114, +52784, 13695, 42032, 2766, 43449, 13341, 47830, 24993, 36566, 15273, 49741, +27376, 36089, 6167, 50329, 32560, 7365, 34867, 51432, 23428, 64613, 18792, +32782, 52197, 20034, 63394, 23052, 56387, 30639, 9111, 58665, 2472, 54250, +30512, 34257, 52812, 3935, 44162, 10762, 47139, 6901, 40778, 24712, 44208, +17348, 53856, 23256, 43369, 2025, 63393, 12454, 52850, 20294, 37311, 55960, +13077, 65325, 34301, 11612, 19852, 63791, 29763, 35233, 55616, 3006, 59308, +28002, 51675, 2607, 33070, 61667, 22107, 4136, 63174, 35950, 24417, 50636, +15843, 30692, 39362, 6907, 50958, 12363, 48567, 22867, 50372, 33539, 11369, +48256, 16289, 35448, 46373, 14668, 37887, 59073, 22282, 12847, 31553, 48602, +19031, 42157, 21693, 43504, 29783, 14635, 53744, 18509, 46017, 30329, 2538, +62620, 27528, 49710, 3565, 43186, 13593, 41173, 19597, 53643, 33327, 3040, +45243, 32823, 8485, 54730, 12566, 41913, 18149, 45165, 29270, 57774, 21433, +12248, 44530, 17809, 46966, 23864, 33262, 65190, 9533, 23373, 55899, 25622, + 2267, 47861, 10522, 24245, 48749, 22940, 8884, 37274, 30775, 63602, 6816, +60540, 264, 55315, 23474, 3456, 59719, 26889, 37072, 12439, 48873, 2983, +60654, 14309, 41181, 31350, 10760, 57302, 29577, 4742, 31282, 38314, 2065, +29937, 57933, 20100, 64154, 27458, 5738, 49911, 36296, 4207, 34682, 6439, +39288, 28387, 59676, 13311, 24131, 56965, 35537, 16418, 51165, 37121, 22110, +63929, 1554, 54840, 33238, 15356, 45817, 23897, 7904, 40455, 27379, 34438, +49657, 1292, 28672, 50444, 24645, 52171, 19639, 60830, 25803, 38136, 12756, +53163, 7713, 29053, 57986, 43849, 21106, 2141, 47351, 29893, 36585, 25979, +63973, 7537, 33571, 56756, 4438, 29230, 46317, 1971, 42703, 14005, 49427, +38583, 4837, 46225, 28106, 38401, 22317, 56954, 16211, 60049, 35699, 25347, +49940, 3078, 24095, 44735, 5730, 48987, 21977, 55978, 19243, 61948, 7183, +56527, 10523, 60674, 5075, 55145, 12339, 61660, 15645, 58095, 26016, 56182, +11236, 41811, 4736, 50055, 8845, 28019, 41261, 5563, 43578, 12075, 50384, +37671, 21612, 44223, 23911, 6032, 45426, 14398, 39555, 17015, 51806, 27473, +59271, 13725, 62690, 2581, 46877, 29008, 5975, 57180, 35940, 17171, 41513, + 5157, 45906, 30269, 7029, 39838, 16766, 44332, 54525, 32519, 1662, 50446, + 8936, 25533, 47006, 34133, 8468, 35992, 57563, 23013, 7027, 53554, 41671, +13494, 45694, 2900, 33521, 64866, 115, 54571, 36152, 20555, 63383, 16575, +59430, 832, 25294, 62565, 4856, 31417, 59930, 3684, 55743, 23254, 8271, +44313, 52986, 2647, 35129, 59765, 14856, 54967, 4749, 62057, 25850, 42924, +31794, 7712, 54384, 38278, 19474, 45711, 14753, 57072, 32513, 51595, 51, +46284, 10272, 39863, 56627, 18503, 59300, 37143, 17088, 65443, 27097, 53542, +13441, 48607, 5380, 35937, 61947, 1237, 55994, 34903, 5720, 45400, 18090, +49647, 37816, 6883, 46460, 34683, 28745, 52840, 33749, 5656, 62531, 28259, +55500, 2572, 25487, 49703, 28980, 40827, 18274, 50881, 34956, 21377, 51956, + 6615, 55614, 16145, 43974, 35322, 23443, 49671, 17727, 50946, 36186, 15875, +53051, 43962, 19206, 50660, 35044, 11320, 40527, 201, 35567, 59830, 23559, +13620, 64697, 30520, 24721, 63080, 439, 37147, 30933, 45623, 20538, 8048, +60870, 32773, 5739, 43247, 13365, 47109, 17457, 40502, 59514, 3121, 38587, +61039, 13097, 53921, 9010, 20610, 39820, 58185, 16532, 38424, 3372, 41820, +10701, 44404, 1788, 48254, 23779, 63847, 41619, 18488, 9270, 35803, 50879, +23969, 8942, 57620, 12677, 38445, 28571, 45118, 11397, 51303, 38205, 16505, +52143, 22749, 62766, 32196, 19599, 60864, 18147, 56081, 14236, 45269, 3789, +43273, 12245, 48899, 14103, 39927, 29545, 61429, 16246, 58076, 30528, 39492, + 9242, 37414, 28232, 45418, 17953, 41710, 21347, 43537, 18214, 41237, 20608, +43147, 3554, 41214, 21387, 45842, 17986, 60459, 25763, 35840, 57719, 15028, +55049, 18244, 59848, 26120, 6359, 62080, 11441, 38606, 63860, 20148, 56346, +22525, 61085, 32152, 17, 37874, 21811, 36217, 52170, 12975, 63963, 33400, +11120, 26708, 51529, 24343, 61638, 11353, 57469, 23893, 51896, 30962, 5661, +21773, 40654, 57938, 16400, 39018, 61571, 13650, 22232, 62782, 24605, 10185, +37004, 46572, 18569, 32210, 55102, 22528, 60082, 17325, 40617, 28844, 14090, +32064, 43169, 3230, 37792, 28381, 34442, 46115, 14229, 40537, 51970, 18125, +44045, 11801, 50436, 40042, 26789, 16096, 58018, 24902, 7777, 46092, 29263, +37815, 10892, 49219, 3640, 37703, 61071, 22655, 10773, 57930, 5181, 42316, +23633, 8276, 28186, 58072, 22589, 60743, 27274, 11558, 50201, 5675, 29512, +46138, 2003, 38221, 6616, 60198, 16318, 31495, 50833, 15147, 40914, 30889, +15814, 63052, 12938, 55163, 211, 29131, 59955, 19174, 62789, 8110, 21380, +58218, 38934, 14998, 42804, 16122, 51323, 39968, 21939, 12210, 56871, 31488, + 8772, 61975, 13756, 41705, 31480, 19646, 62378, 28668, 9312, 56083, 6037, +61549, 26205, 2556, 64024, 33813, 6472, 59228, 14158, 63352, 26470, 55009, +21884, 53036, 9680, 33908, 46491, 19240, 44964, 52393, 21874, 48693, 11168, +53206, 3720, 64282, 28733, 41875, 14906, 30873, 57548, 25844, 32618, 62008, + 8882, 26904, 51921, 16651, 28743, 44274, 18329, 42097, 61835, 32794, 7255, +47846, 13208, 62551, 28131, 55494, 17835, 58814, 34780, 14232, 32802, 1022, +55382, 33333, 59527, 13309, 64556, 40953, 18379, 47833, 10, 52668, 15801, +61891, 32524, 6912, 57358, 30887, 8883, 36793, 3279, 47364, 11378, 41608, + 1210, 50462, 26003, 63011, 17915, 39162, 100, 64540, 21514, 53479, 8666, +41508, 28026, 1201, 63168, 25342, 54847, 4217, 34155, 65465, 2330, 54249, +29285, 62994, 1334, 56910, 27038, 53920, 13510, 63594, 1678, 53532, 34117, +13021, 44174, 153, 46456, 24519, 38034, 2920, 33948, 53818, 20460, 47596, +26595, 10275, 48738, 2132, 41387, 8430, 45871, 20530, 49758, 33818, 5221, +30224, 42290, 18349, 49305, 36759, 59138, 4118, 42654, 19834, 39351, 15867, +43145, 3211, 62508, 35351, 60513, 9255, 24661, 47617, 28057, 5986, 52224, +36600, 285, 50152, 28896, 52699, 14638, 64226, 1198, 36728, 9089, 31274, +49943, 6312, 46906, 61828, 8752, 58325, 25354, 53952, 7807, 57495, 20425, +53556, 30062, 8616, 37557, 27914, 64308, 31999, 4415, 62409, 33899, 9418, +36172, 62985, 23278, 13107, 50586, 32346, 19292, 57467, 24585, 13359, 48327, +29307, 35469, 52185, 16012, 62160, 30867, 44847, 11006, 38346, 4334, 47384, +30068, 37947, 25005, 61059, 19645, 52033, 22823, 44012, 25544, 39627, 64541, + 8651, 29610, 49259, 7358, 51385, 35915, 27934, 39417, 21647, 50957, 13298, +43473, 16001, 54547, 35723, 830, 29944, 52238, 4575, 60236, 31879, 7885, +59189, 33551, 3985, 44601, 36124, 24936, 47564, 954, 53719, 39509, 4993, +46758, 21429, 40355, 33460, 12031, 35175, 48382, 22846, 11577, 42254, 28688, +45574, 3812, 42572, 8352, 31269, 43101, 20532, 51519, 1862, 57588, 8992, +33462, 12720, 27592, 61414, 18726, 40419, 24957, 50053, 787, 53459, 39178, +10165, 48633, 4643, 37528, 30361, 44880, 6864, 36355, 54702, 1826, 58671, +31252, 4449, 26050, 52505, 22100, 43342, 20381, 37331, 5319, 49932, 27139, + 8980, 51571, 43569, 26278, 39314, 22361, 6370, 38212, 32331, 4841, 54113, +27452, 60233, 21005, 43132, 2758, 24124, 48261, 19761, 41048, 59148, 17819, +53942, 24168, 58014, 22425, 64161, 32848, 8798, 31697, 54442, 22647, 52213, +31533, 6930, 32744, 46162, 20229, 51962, 36351, 14779, 42666, 16867, 47187, +12409, 23509, 50810, 35506, 11246, 22546, 49250, 31516, 9507, 32957, 46839, +19404, 38376, 31012, 6881, 49137, 19016, 64286, 34116, 8133, 61204, 28821, +48632, 14541, 41599, 672, 57663, 33724, 28488, 60404, 15553, 54077, 30902, +65013, 9164, 55818, 25988, 61276, 8297, 54950, 784, 21114, 31352, 47590, +13807, 53723, 1487, 59871, 26392, 49217, 20778, 13915, 46564, 29193, 53810, + 4149, 58930, 33048, 17702, 46158, 30957, 16486, 60768, 4463, 30947, 39633, +24737, 57792, 27590, 52204, 13744, 43450, 18383, 37376, 29765, 15445, 47670, +17527, 42397, 10975, 44328, 2842, 63666, 26643, 57732, 504, 36652, 13811, +47549, 17720, 54279, 28523, 51391, 3917, 39460, 56562, 1694, 60162, 36827, + 6909, 50377, 40618, 418, 65055, 8932, 26801, 40600, 1838, 54604, 21134, +65244, 16594, 53264, 14267, 63779, 1204, 52967, 9931, 40077, 8033, 62512, +11468, 55236, 311, 21721, 37744, 54634, 18285, 59479, 24872, 3172, 57660, +10106, 62090, 30392, 37179, 3440, 49003, 19775, 44398, 25764, 64818, 17462, +47105, 35814, 19769, 44969, 17142, 38398, 64658, 16015, 54059, 6071, 34235, +63704, 23642, 13259, 51627, 32878, 64912, 414, 58137, 22116, 43585, 16369, +52149, 29435, 54222, 12626, 23761, 56226, 18454, 62167, 39096, 4954, 60749, +26002, 38761, 16340, 41495, 3248, 58892, 43615, 6061, 32495, 47948, 9664, +20989, 59909, 33356, 18822, 62552, 23024, 55587, 18297, 58119, 19499, 65198, +24517, 11628, 47455, 34203, 15504, 49267, 36096, 11007, 64088, 137, 53240, +15254, 45789, 19108, 38061, 60030, 21591, 5547, 62081, 11161, 54263, 29327, +56522, 19254, 49882, 31243, 8420, 32676, 41215, 14160, 50437, 34898, 9897, +63409, 698, 28510, 44859, 10296, 43167, 6305, 38108, 12731, 44383, 28496, +46514, 6085, 42092, 10248, 44283, 28311, 55127, 3865, 63947, 9631, 26782, +60094, 6468, 57243, 31587, 59464, 36392, 8873, 25902, 58426, 39007, 7600, +45175, 24279, 61372, 4918, 29574, 55785, 14435, 59457, 24981, 52368, 10115, +27792, 53334, 19709, 43900, 9425, 65199, 29749, 50073, 14054, 44627, 5313, +35316, 46935, 23426, 3680, 27288, 43196, 15750, 41324, 19873, 43793, 23214, +40044, 62158, 9279, 35101, 64802, 22391, 48500, 35944, 10440, 34454, 56461, +38371, 728, 41380, 12891, 43204, 15713, 37905, 63989, 11128, 56962, 36196, +12282, 35128, 58862, 10660, 49148, 15182, 44797, 3883, 62849, 25230, 56616, + 2075, 55215, 34926, 5947, 65425, 29096, 60729, 18969, 38491, 22119, 42361, +17508, 53842, 21639, 60405, 25682, 41281, 1447, 42782, 14443, 48365, 32934, +18347, 43954, 25363, 13884, 63970, 31593, 17648, 55059, 24075, 33977, 60065, +18461, 48746, 31902, 6197, 32844, 42979, 22234, 41675, 18191, 44987, 34686, +23736, 48848, 32058, 18134, 49572, 20228, 41477, 57160, 32787, 3901, 44171, +10664, 32631, 46826, 20607, 44457, 24552, 6251, 52067, 32434, 12211, 59111, + 6670, 50019, 12600, 41377, 24128, 9648, 63269, 1306, 49286, 25390, 9412, +48304, 22648, 57936, 20004, 10135, 36019, 60324, 26965, 8392, 19118, 45106, +30638, 53292, 4562, 61020, 7943, 39634, 821, 61421, 34870, 9334, 49678, +32154, 16980, 47292, 29989, 11702, 63641, 27954, 56210, 31318, 36286, 17581, +39409, 55941, 14485, 58237, 43850, 25986, 8309, 45924, 2908, 44115, 12055, +50450, 347, 46573, 14296, 40723, 60550, 27275, 6247, 63562, 19567, 55989, +23340, 33185, 40647, 25454, 57626, 11497, 64902, 2461, 29290, 36655, 52724, +17557, 44455, 19970, 42346, 1556, 45302, 13897, 63099, 23012, 54719, 5676, +65078, 16733, 55957, 29027, 37132, 25436, 54984, 14855, 64846, 29372, 52953, +20356, 55347, 4343, 60657, 20005, 58787, 18756, 56645, 15077, 61047, 17704, +43447, 15664, 38384, 49334, 19149, 44519, 27513, 797, 20220, 49120, 29791, +45669, 3815, 33754, 64192, 16530, 49915, 14703, 39787, 51054, 9204, 44643, +35312, 3742, 38361, 30498, 47314, 4426, 40267, 15293, 51338, 23476, 7483, +34787, 61379, 21236, 55576, 25246, 9550, 62481, 32402, 53500, 19161, 59727, + 1792, 54282, 13515, 57604, 15298, 27995, 52535, 25598, 6322, 43383, 9529, +28202, 63017, 22920, 7194, 27398, 58253, 19726, 64653, 23656, 55077, 2249, +26131, 43665, 5201, 47746, 25212, 45602, 17675, 42633, 5449, 61290, 19961, +32072, 36442, 7677, 41493, 31494, 14619, 50594, 24125, 39254, 1284, 33853, +51206, 12656, 49571, 5121, 48105, 10076, 44453, 6779, 50884, 12117, 57107, +20115, 65343, 26573, 10514, 61575, 6030, 52110, 28778, 41859, 11136, 47637, +36095, 12688, 46409, 4035, 42809, 13045, 51240, 26527, 55597, 2275, 59002, + 7789, 55971, 31796, 13233, 54480, 2802, 58454, 36485, 4844, 45035, 28491, + 9304, 23316, 61384, 19561, 40371, 64916, 14430, 53553, 4631, 40891, 56572, +15475, 64356, 23551, 40101, 32810, 27338, 57316, 3316, 55115, 33880, 27174, +53049, 14666, 58468, 29170, 40454, 2048, 29868, 50432, 28251, 45961, 2735, +42978, 31455, 50177, 25313, 10000, 20152, 47294, 36055, 24507, 57458, 31726, +17215, 48755, 26341, 37330, 1466, 58149, 13445, 55270, 37243, 6852, 49553, +13923, 54549, 7694, 65226, 29108, 2011, 37190, 32061, 4526, 38513, 64955, +21409, 54548, 16635, 40319, 28296, 36674, 26150, 51566, 3661, 21504, 37282, +53363, 13866, 44454, 2818, 46410, 9714, 60298, 6996, 30257, 41340, 22262, +42495, 55719, 7940, 28275, 48773, 3803, 65267, 12572, 58135, 25852, 37586, + 3030, 46691, 17438, 43712, 25150, 39577, 4676, 46011, 11564, 49706, 7158, +40110, 33766, 2171, 25455, 42344, 16329, 49094, 13430, 37187, 2606, 39069, +27098, 49586, 1765, 37587, 23151, 50729, 29541, 2437, 52782, 13872, 40687, +53312, 33245, 5710, 62725, 13735, 52381, 17697, 30981, 41444, 451, 57846, +32225, 20687, 65138, 26622, 16863, 61717, 21901, 57141, 17306, 62527, 24002, +57442, 1964, 35822, 58776, 25662, 3530, 42734, 12011, 51049, 39337, 17859, +42385, 6453, 47492, 12101, 37537, 30093, 45539, 4548, 49143, 37731, 2874, +33321, 57890, 15141, 55490, 32965, 3851, 53212, 31635, 49847, 11418, 43949, +32679, 7508, 31347, 49333, 39393, 14348, 53324, 21303, 65179, 1872, 56030, +29408, 53285, 11771, 40806, 57218, 16998, 53885, 21708, 63801, 38360, 11473, +58838, 20157, 55832, 26283, 7371, 57103, 16113, 61333, 34036, 24791, 35218, +58225, 19141, 38352, 22795, 44856, 6592, 37928, 52873, 22786, 41270, 21108, +56027, 2883, 58383, 29756, 5729, 51786, 19701, 56780, 21604, 63448, 7491, +45564, 13596, 47568, 34397, 27862, 37621, 4574, 61761, 21139, 44215, 10885, +27970, 56573, 13130, 62924, 36159, 49033, 14001, 46344, 28991, 1644, 37517, +27360, 59760, 17569, 31620, 38338, 9119, 47170, 2019, 61668, 9976, 34744, +45480, 13844, 48155, 7040, 40671, 31468, 5358, 52333, 15412, 61686, 35241, + 6857, 59320, 15053, 57019, 20659, 55054, 4071, 59448, 32590, 63239, 27083, +13052, 46090, 15380, 50646, 38544, 5143, 62988, 19293, 51241, 20968, 44015, + 2896, 24558, 45084, 20313, 39954, 23697, 46292, 11858, 52663, 21558, 62226, +16767, 55384, 14789, 34043, 47676, 9454, 31743, 60214, 5977, 63066, 10779, +31019, 56631, 43616, 12530, 32085, 40560, 25597, 58962, 28883, 51736, 16649, +34259, 49227, 3963, 52223, 10317, 20059, 40287, 60502, 15337, 37084, 27368, +50435, 32691, 16437, 61257, 33758, 27994, 59235, 11838, 53612, 19381, 57918, +22986, 61342, 18874, 32003, 60112, 17261, 47120, 57251, 7555, 62078, 27070, +33589, 47396, 24764, 65402, 7954, 30152, 45225, 11961, 62342, 6029, 57709, +34238, 24743, 64696, 10345, 21752, 60426, 39141, 18681, 42103, 22755, 59839, + 6631, 56070, 27310, 36672, 8145, 48487, 2261, 33493, 50420, 11766, 45212, + 1256, 41287, 12195, 46107, 17933, 31766, 45437, 15939, 39886, 54329, 18648, +64687, 29405, 1145, 56078, 13175, 58467, 35896, 24837, 62830, 7869, 26918, +64422, 11805, 21851, 60733, 42382, 18012, 46249, 19319, 50364, 38822, 14584, +45028, 18551, 61789, 4664, 52826, 28192, 59696, 10295, 22884, 61117, 30507, + 7912, 32530, 44255, 23755, 14211, 34647, 48052, 26906, 688, 45699, 10769, +48275, 3445, 27302, 44887, 5283, 42729, 13063, 47452, 39822, 19610, 45021, +28807, 11089, 64822, 2718, 28780, 49079, 5077, 61027, 16003, 55366, 28325, + 654, 45736, 12322, 48910, 16398, 32005, 39184, 15313, 63248, 30805, 40303, + 9586, 38097, 28791, 36614, 19341, 61319, 24825, 9310, 62965, 20320, 48443, +24846, 42049, 16025, 64431, 37990, 19238, 50198, 24326, 2447, 33526, 55428, + 6348, 58403, 21148, 48491, 8471, 34687, 47837, 969, 50518, 27704, 35639, +54045, 22564, 49175, 16624, 29154, 59808, 22695, 56066, 18665, 62327, 35461, +23936, 45593, 10584, 43331, 22983, 39346, 31865, 9526, 47415, 15773, 40752, +18123, 48322, 1966, 34808, 55446, 3431, 64409, 8831, 27220, 43581, 12896, +46203, 7521, 65364, 28114, 34356, 59394, 14538, 62017, 998, 57857, 16811, +40990, 27964, 48514, 8531, 50326, 26711, 42776, 1665, 29214, 58539, 37686, +17650, 43064, 22145, 54123, 39597, 8672, 28321, 57851, 842, 61371, 10044, +36748, 5105, 38856, 26886, 56267, 15598, 61902, 25941, 33873, 63358, 24201, + 433, 33275, 56076, 9674, 39401, 5214, 51837, 10168, 48720, 6762, 38355, +31644, 1345, 47167, 12525, 43042, 2528, 38259, 52060, 4015, 30429, 36236, +15093, 31423, 39475, 551, 58313, 9043, 51538, 21655, 34467, 59440, 19801, +52989, 25779, 41009, 12692, 46736, 7649, 28851, 48381, 34838, 8301, 25061, +49969, 1893, 47901, 10948, 38195, 16205, 53378, 21785, 60886, 18864, 37989, +58508, 6505, 42389, 20081, 52893, 27710, 54440, 5027, 38269, 60054, 9650, +48124, 5817, 31311, 37322, 8105, 48111, 22988, 35108, 45617, 27673, 2990, +50064, 14114, 41751, 52028, 16999, 32914, 47097, 28884, 9977, 38823, 397, +58938, 8415, 24908, 65044, 2143, 40809, 24590, 37831, 17151, 44705, 20567, +36922, 50697, 3492, 42787, 27487, 50002, 11455, 39114, 62423, 3161, 21472, +64734, 37748, 20702, 60296, 19187, 36730, 56887, 16854, 61556, 28195, 52491, + 4209, 31331, 60005, 1708, 40624, 52814, 19982, 39054, 52151, 14254, 43862, +30305, 40593, 9722, 34630, 59575, 19072, 64361, 4546, 34853, 61921, 8118, +49273, 26035, 2207, 59814, 27106, 53597, 888, 58705, 31807, 3509, 41475, +51578, 16296, 45540, 12132, 57761, 6352, 51230, 31657, 1051, 45872, 7656, +40541, 59043, 11307, 30088, 38725, 12148, 52611, 31102, 63346, 13242, 26346, +62325, 16321, 57900, 7219, 19047, 42093, 4881, 63744, 37197, 90, 43046, +11334, 38340, 2833, 47519, 8369, 33995, 56433, 17748, 65431, 4326, 52165, +34942, 26171, 64248, 7474, 54238, 12519, 31403, 44501, 18752, 43089, 21602, +34137, 59657, 17641, 56639, 34691, 25018, 39730, 10389, 53161, 6259, 48397, +26772, 35580, 5249, 30840, 59531, 3443, 24190, 43407, 30243, 6430, 61243, +20184, 52270, 22726, 3870, 49440, 11426, 47336, 2344, 20681, 64177, 38106, +16102, 45808, 23091, 51296, 17421, 65502, 12422, 45677, 1227, 43867, 35694, +13768, 47103, 6318, 43866, 29744, 45668, 18201, 48161, 21408, 59780, 24994, +44184, 19764, 55779, 13545, 63575, 36368, 27240, 62425, 20932, 54483, 28557, +13350, 42614, 56484, 9339, 63150, 43435, 21274, 52511, 17485, 30726, 40790, + 4103, 53738, 10575, 42036, 4630, 48158, 20849, 59870, 18659, 55629, 38110, + 3315, 53786, 29310, 55876, 15650, 64889, 34800, 24893, 50531, 31997, 5622, +45775, 15175, 44275, 29457, 12419, 54257, 15796, 63483, 30758, 8908, 32548, +64004, 13635, 26854, 52346, 22893, 63191, 17549, 56481, 33328, 13889, 60191, + 6818, 20755, 64052, 33981, 23285, 57284, 31951, 1027, 39143, 60079, 5709, +56082, 20686, 63834, 32577, 27529, 35757, 47729, 17576, 54215, 15406, 57256, +12332, 54669, 1236, 63538, 6710, 32068, 56540, 15179, 63003, 20095, 57989, + 6060, 32902, 49642, 35717, 8348, 29856, 50964, 6507, 42436, 30806, 8070, +46836, 34167, 15981, 35465, 64532, 14387, 35975, 54303, 23782, 6203, 46127, +27101, 8244, 59364, 26234, 2030, 63782, 24641, 51105, 7722, 31264, 37564, +24260, 54009, 20557, 44164, 19112, 52813, 37037, 15854, 45047, 14534, 43613, +16440, 39929, 52636, 14843, 30929, 38839, 468, 53535, 17428, 30534, 39793, +14715, 60483, 26638, 53289, 15660, 31247, 51562, 16288, 63674, 25893, 41243, + 5527, 23448, 51553, 40373, 10537, 44312, 24460, 34348, 60986, 21702, 52698, +27324, 10846, 53826, 21318, 64999, 26574, 53411, 21815, 60858, 27794, 515, +47980, 25164, 44387, 18675, 60719, 1120, 29495, 43208, 22086, 39427, 57848, + 9743, 60510, 6994, 30809, 53540, 1709, 45004, 28790, 4055, 60359, 15589, +49958, 22442, 42331, 30004, 9636, 52089, 34485, 49700, 10754, 35354, 63895, +13194, 56762, 35858, 23415, 46175, 7853, 33111, 63780, 19213, 56339, 26808, +35433, 50675, 23791, 5238, 52959, 31464, 7910, 32704, 47624, 22495, 52671, +21722, 61013, 30038, 8284, 58434, 27493, 54743, 13118, 58677, 8710, 62490, + 2817, 36393, 10980, 40782, 603, 50126, 22451, 42468, 24860, 9055, 51784, + 5394, 41569, 10607, 36328, 63926, 26747, 16674, 46089, 24996, 5202, 47693, + 9935, 36964, 63531, 18498, 44604, 22849, 49203, 18177, 64228, 13614, 37570, + 375, 42199, 31744, 17189, 62217, 13392, 45110, 4694, 43770, 31406, 12952, +56566, 3116, 63697, 39360, 11615, 52688, 4262, 62657, 22290, 32682, 39269, + 5430, 49684, 21686, 44185, 18719, 49063, 36859, 328, 41567, 11198, 43995, + 2254, 50331, 25898, 43246, 29844, 48949, 9740, 52928, 5450, 35624, 21458, +55534, 29653, 14620, 44418, 24383, 49999, 6866, 52119, 12191, 60926, 5001, +42508, 27904, 46555, 6105, 42844, 21681, 40789, 18851, 45902, 16389, 35637, +46754, 539, 40941, 13467, 52280, 25931, 9808, 54420, 24735, 59212, 15443, +32227, 64142, 17777, 54369, 25872, 377, 50188, 9701, 25277, 49390, 22828, + 9419, 34702, 56790, 14648, 62718, 32954, 17559, 47552, 35098, 15074, 46118, +17539, 39745, 57650, 13790, 45281, 9341, 41512, 1057, 60932, 9009, 24542, +55362, 6648, 64506, 23685, 56115, 8684, 26229, 64852, 5948, 59555, 33277, +26487, 35357, 63609, 3736, 52703, 36439, 17110, 34526, 65135, 5236, 41699, +33796, 645, 44155, 17047, 54505, 35819, 2712, 22181, 53373, 30252, 3622, +48131, 11966, 44572, 14813, 32832, 46560, 17299, 41670, 6480, 43888, 12992, +41388, 17201, 46356, 35096, 12383, 54000, 7190, 41262, 13031, 37810, 55672, +14331, 60130, 5330, 20461, 50499, 25241, 35582, 47819, 20032, 40173, 11142, +52336, 21234, 41823, 32269, 480, 57244, 17532, 64234, 36239, 22258, 62713, +17834, 31931, 46647, 16111, 41371, 122, 51118, 10457, 28802, 53861, 40068, +13148, 42716, 32083, 6732, 61711, 10382, 34007, 49106, 18473, 62853, 27561, +56974, 2195, 40916, 6683, 37657, 17025, 47495, 20942, 40875, 2037, 34211, +50111, 23228, 32523, 40832, 28118, 57042, 23084, 63812, 32067, 15879, 60499, + 3939, 56688, 39534, 18395, 48728, 24354, 59487, 22448, 5959, 38751, 51554, + 1443, 37059, 55199, 19532, 60033, 32240, 5754, 54318, 11241, 61999, 1087, +39357, 33503, 23774, 54574, 28022, 63254, 5499, 45979, 22685, 41890, 19612, +61206, 35528, 8603, 46291, 20823, 42390, 17486, 26777, 58191, 20208, 40137, +25203, 49004, 609, 47379, 24997, 35865, 59556, 2815, 56380, 7604, 28898, +61840, 19763, 54760, 29846, 59644, 21339, 39593, 3972, 61987, 15964, 41815, +20063, 39772, 61670, 10211, 42726, 8119, 52879, 36079, 1913, 34614, 45542, +21893, 43550, 22761, 54968, 31343, 8714, 32423, 64108, 28917, 59201, 10852, +55313, 25265, 58784, 8891, 29148, 53735, 21738, 45252, 18119, 38367, 61736, +16247, 44396, 4291, 48708, 39035, 1824, 43839, 10405, 39595, 63283, 21399, +58413, 38622, 3326, 62339, 29533, 48182, 16694, 42897, 7, 37717, 55592, + 6406, 58334, 31702, 4061, 53858, 27926, 2373, 49451, 27144, 56365, 16057, +48113, 30234, 34410, 46605, 18506, 42417, 31354, 4498, 32958, 49443, 37474, +18546, 43210, 21515, 55047, 7257, 49386, 11377, 42638, 24637, 9070, 56822, + 2986, 23750, 46283, 19349, 53967, 22688, 60325, 30453, 9548, 57757, 29136, +61230, 7861, 38399, 65523, 17343, 56776, 1449, 39110, 58172, 5860, 60381, +31714, 54707, 19529, 59035, 3906, 55417, 11521, 63021, 31378, 19470, 58674, +22174, 46627, 30897, 8920, 48762, 27715, 34166, 45119, 29637, 3, 65149, +12040, 55801, 15155, 62640, 30455, 47744, 9072, 54351, 36811, 12176, 45928, + 3614, 53664, 13033, 1376, 40624, 60452, 5705, 55021, 21045, 59210, 18595, +33600, 62667, 4734, 23896, 55571, 955, 60028, 20261, 40503, 28662, 58453, +14060, 39308, 3843, 42181, 15503, 44809, 25785, 63193, 13123, 57397, 4765, +54345, 23635, 64684, 14774, 38021, 4491, 49237, 12217, 51534, 7618, 47400, +13918, 53754, 37957, 11256, 43622, 16303, 31081, 54766, 9958, 43418, 263, +40704, 57654, 23504, 11799, 60835, 32536, 13217, 29019, 42750, 15686, 48340, +25806, 37456, 32843, 27117, 58044, 9239, 44411, 7001, 36457, 14999, 51823, +11723, 58758, 1431, 51216, 30489, 14880, 52546, 29015, 61558, 7356, 51524, +34999, 1574, 32924, 49718, 8581, 34963, 59827, 19351, 56723, 13001, 31639, +40370, 23712, 33840, 53444, 13204, 48493, 25923, 7102, 36607, 10464, 57853, +33694, 24581, 53888, 497, 59378, 11566, 26483, 51207, 17722, 65471, 31167, +18796, 59202, 27111, 10757, 62380, 3406, 39830, 14019, 48466, 24130, 51243, +20324, 3061, 35586, 49045, 29500, 3967, 32675, 51076, 13893, 34371, 60364, + 4684, 56269, 30114, 1446, 40295, 23252, 52845, 12372, 26679, 55496, 22270, +57937, 32575, 11994, 45096, 6789, 30736, 46508, 13626, 41660, 4654, 60576, +31554, 50902, 24132, 11765, 44768, 21202, 37090, 62245, 13227, 41669, 63163, +34564, 6557, 36262, 64976, 25134, 11567, 57150, 3751, 60473, 10485, 52326, +27955, 59357, 20834, 1511, 53932, 12889, 47915, 15132, 44673, 23557, 59884, +18006, 48306, 33645, 27580, 36063, 50854, 13658, 62392, 8744, 39659, 4748, +49927, 36372, 15721, 45124, 17855, 46579, 14593, 32002, 41439, 25829, 50750, +22068, 11513, 49587, 25290, 2294, 28390, 50544, 15785, 37395, 25413, 43040, + 5701, 50075, 37886, 13952, 50622, 3655, 62562, 25167, 37055, 2351, 63626, +13431, 56976, 38300, 16573, 42581, 3712, 46415, 34113, 5976, 24363, 63938, +16622, 28024, 61288, 19814, 38305, 25602, 45502, 56995, 23160, 12085, 37611, +29891, 45454, 8961, 38104, 48355, 16300, 36930, 50242, 16844, 45558, 29640, +51434, 9002, 44490, 1501, 47742, 25585, 55394, 20189, 59549, 8576, 53852, +19385, 41864, 22799, 43278, 32697, 9421, 31731, 51098, 19411, 60206, 21909, +64389, 17459, 38775, 26802, 36635, 6491, 25909, 51355, 33090, 65424, 2326, +35080, 60966, 17498, 52612, 27960, 14197, 49767, 29538, 41617, 7737, 65165, +38357, 2064, 57939, 29883, 3169, 56640, 12922, 48856, 17068, 30785, 61380, +26244, 57083, 22294, 38784, 32801, 26217, 40084, 33541, 6278, 58425, 36206, + 54, 24022, 48705, 12000, 60315, 28347, 54527, 17157, 64516, 28163, 10269, +43349, 6301, 50330, 20527, 65534, 11993, 45086, 16772, 42984, 3193, 40144, +64457, 22073, 52002, 18338, 47650, 12169, 30884, 44731, 21996, 47035, 34680, + 2393, 32987, 38177, 4930, 46618, 13248, 50672, 37725, 17082, 53385, 20466, +58606, 997, 62598, 10455, 33860, 50155, 23384, 8314, 43522, 62261, 17105, +36354, 64996, 7017, 31094, 43852, 11085, 47012, 27052, 58437, 7342, 29121, +62215, 36868, 14112, 47747, 4807, 19719, 53416, 36126, 27564, 56476, 18373, +59027, 22287, 53187, 28017, 9085, 20611, 64099, 40412, 18362, 52710, 10668, +25934, 47848, 22576, 11146, 21496, 51890, 23112, 2807, 40417, 49728, 21669, +38643, 26598, 41054, 20225, 47574, 12392, 44099, 62244, 28984, 36586, 4171, +60921, 32592, 1782, 35860, 54072, 5402, 57946, 11894, 61527, 7946, 30681, +36998, 26298, 48583, 32790, 14923, 64629, 32066, 6591, 51217, 28150, 58973, + 5340, 55441, 9269, 29001, 63196, 37009, 15226, 39860, 64012, 35264, 8856, +33159, 62146, 13747, 29226, 57948, 22686, 1692, 64082, 32831, 42796, 16160, +53576, 18801, 52624, 23219, 49417, 7607, 27388, 51780, 22491, 59036, 28241, +17181, 53338, 41271, 2652, 39058, 48169, 5788, 31812, 58511, 8767, 29035, +16600, 51415, 28477, 49328, 2999, 26524, 64513, 24505, 2272, 57415, 29303, + 8349, 65392, 33360, 13694, 25165, 57055, 22438, 64747, 19146, 42937, 11729, +46421, 30086, 38626, 11282, 49151, 3111, 51734, 14352, 62187, 27239, 56857, + 6003, 45195, 10086, 43495, 1149, 31532, 55509, 3612, 58854, 29765, 61783, +19999, 8175, 27251, 46069, 19038, 30219, 48166, 8492, 64470, 35621, 3365, +55944, 20845, 53204, 31501, 16537, 50642, 12375, 39940, 51161, 22129, 42114, + 6182, 52283, 38693, 3413, 42370, 9909, 46689, 2527, 56102, 8775, 64410, +16783, 47238, 25772, 17995, 56878, 38490, 16064, 43432, 19637, 41625, 12902, +42921, 3989, 37432, 54047, 16368, 62227, 35386, 1408, 28198, 51945, 4479, +60843, 24139, 57404, 32273, 14792, 45151, 1477, 41389, 7662, 65107, 37270, +13715, 56730, 6196, 63510, 28225, 57820, 20018, 54102, 24027, 63081, 4180, +28584, 42934, 9493, 46744, 29590, 44257, 16714, 39806, 55578, 13318, 59974, +39172, 14678, 33662, 48040, 1958, 27421, 49379, 15857, 35769, 63462, 14560, +51758, 17375, 35256, 46437, 20823, 3018, 59812, 25870, 42304, 60929, 24101, + 2244, 50983, 10555, 40536, 1147, 43310, 11413, 39334, 51782, 35594, 5322, +27046, 48960, 1369, 59862, 38762, 5196, 56173, 32334, 60637, 9891, 33637, +54758, 28120, 5383, 62886, 12861, 53741, 202, 63721, 7710, 38959, 32389, +22373, 9879, 50365, 27157, 39294, 19897, 49960, 27732, 15467, 44218, 22211, +47325, 18963, 43237, 55200, 1835, 59415, 10834, 56422, 28682, 2260, 41464, +57068, 23434, 345, 40026, 33570, 16432, 35692, 45393, 4458, 32383, 55963, + 8239, 22284, 46100, 20613, 49304, 1232, 52815, 44457, 9407, 33580, 47186, +27807, 8156, 29835, 47941, 6377, 39267, 11496, 43156, 20865, 36932, 61311, + 5522, 41449, 10386, 38109, 61770, 13027, 27002, 50707, 22333, 13758, 55778, +42066, 15710, 50641, 39789, 46926, 7627, 63420, 20484, 56229, 41257, 15465, +49967, 39895, 14277, 44698, 25577, 38524, 3202, 49382, 35607, 5032, 38806, +12214, 53245, 6156, 61578, 24302, 209, 64301, 33249, 26839, 60775, 29352, +36623, 658, 48464, 20501, 40225, 29174, 55817, 26862, 34492, 48347, 19091, +44978, 21272, 46497, 1853, 44141, 31451, 57412, 13413, 52121, 4394, 37879, +31605, 15458, 47483, 26406, 38593, 10810, 43551, 4500, 44645, 28509, 60522, +21070, 8242, 64742, 16038, 59154, 33479, 14652, 55233, 20058, 65252, 29024, +49885, 17555, 45422, 24315, 53486, 12492, 62506, 42000, 7876, 33315, 65356, + 3618, 55301, 7072, 61030, 21580, 55863, 17970, 31700, 41575, 9494, 29306, +55476, 41201, 18140, 47203, 34894, 10154, 37961, 5964, 51349, 31367, 62333, +20154, 52673, 28671, 4651, 50583, 23518, 40962, 16866, 45368, 7395, 42207, +12124, 43842, 18050, 32918, 56789, 19256, 60170, 26699, 7612, 33395, 57086, + 5523, 25275, 45091, 44, 28366, 53309, 5803, 22003, 55753, 40364, 20737, +59390, 2576, 25135, 42148, 5863, 31310, 65377, 10901, 56630, 30395, 37779, + 9801, 33116, 7842, 34860, 48153, 17247, 62922, 26452, 54611, 19185, 65263, +25296, 2991, 60961, 30174, 56905, 15287, 41991, 31249, 16028, 50511, 35626, + 334, 42794, 26664, 47002, 15299, 59232, 34817, 18789, 45652, 23503, 42790, +16779, 31029, 56848, 2919, 42257, 57479, 16078, 63190, 7895, 55821, 12102, +65415, 34261, 9873, 62658, 123, 38914, 32369, 17541, 41752, 21935, 43524, +17928, 38511, 52631, 20887, 11033, 35125, 64096, 19374, 54203, 25068, 61942, +14234, 51850, 18238, 41532, 27893, 57509, 4185, 59932, 24017, 40465, 31775, +18150, 38324, 61303, 14953, 54210, 23493, 57657, 19981, 61807, 26775, 59434, + 4588, 56494, 17208, 31454, 48542, 19011, 54469, 23916, 920, 34774, 56726, + 9723, 59836, 36349, 24206, 1919, 64910, 32457, 4266, 24407, 33835, 38298, +13900, 32570, 6659, 52900, 9704, 30953, 61535, 6158, 54221, 14739, 59377, +11220, 62424, 21317, 51024, 27326, 36463, 32291, 17288, 51339, 36799, 14610, +47193, 5853, 37733, 12294, 56400, 25420, 38830, 10519, 63055, 2599, 36861, +12665, 57897, 6947, 61391, 11852, 40477, 15413, 54220, 22443, 49811, 6049, +41138, 25387, 63062, 20309, 58295, 33970, 6350, 61901, 16897, 59281, 22215, +36721, 62498, 6862, 24676, 45945, 34364, 27937, 47803, 1860, 24611, 45293, + 8108, 47432, 35333, 12560, 23420, 60918, 35855, 4248, 32470, 39116, 2824, +29809, 54224, 10807, 26254, 47241, 30255, 37758, 25593, 45442, 10703, 46892, + 2414, 59220, 21406, 48580, 22409, 7944, 62941, 11257, 29598, 55768, 20526, +60357, 24763, 9165, 27373, 44311, 15542, 36388, 58978, 18091, 43837, 11188, +52266, 24650, 55775, 15859, 61520, 226, 54750, 40098, 7132, 47634, 1612, +35221, 65245, 18028, 37318, 30107, 61281, 18302, 36546, 64603, 16074, 41212, +60856, 24487, 7857, 52779, 12404, 32721, 48813, 19056, 60195, 38079, 213, +44214, 21918, 50317, 15222, 55076, 43365, 21665, 64905, 13363, 44676, 31289, + 8193, 32515, 45866, 6984, 34365, 47030, 17128, 43838, 9542, 36221, 54536, +12130, 65116, 29634, 17071, 58585, 13941, 53070, 6002, 41365, 11849, 50343, +31173, 6766, 61489, 10786, 55640, 36496, 19428, 48160, 29690, 6089, 37166, +30853, 45940, 17351, 43036, 3266, 51894, 28722, 37012, 25651, 55993, 6644, +60936, 11376, 47733, 5623, 63014, 9834, 33767, 61577, 29222, 48629, 13247, +43525, 8579, 42188, 2176, 47524, 24103, 59517, 572, 48852, 16858, 43795, +36158, 9923, 65200, 7858, 55731, 4668, 24865, 41663, 3231, 43918, 10438, +40177, 723, 44571, 15185, 41899, 12711, 46660, 1844, 34835, 63225, 8182, +49392, 31097, 45556, 18689, 43659, 28888, 7063, 49444, 30034, 37265, 14916, +60239, 9824, 57454, 689, 42980, 60615, 22416, 35913, 59029, 17693, 34650, +47883, 20553, 42843, 18561, 45959, 28141, 41231, 9469, 60875, 2848, 57299, +41021, 7463, 28574, 55988, 20602, 59198, 22283, 44212, 7664, 46174, 15839, +52144, 23788, 49702, 21555, 45942, 23315, 38382, 25738, 43112, 5629, 64711, +35313, 9190, 36233, 62171, 21389, 45009, 12112, 42613, 1756, 53985, 22922, +35114, 50910, 908, 48831, 9846, 20053, 35077, 55633, 147, 53585, 10253, +37039, 30323, 63469, 17874, 57553, 29986, 670, 53931, 43150, 5887, 27509, +57942, 11058, 52054, 23177, 45221, 15225, 39853, 57432, 20766, 9883, 50373, + 936, 35250, 63143, 20142, 52749, 26137, 39678, 5148, 58411, 31741, 38453, +25737, 50741, 875, 42292, 13783, 47964, 33221, 56832, 2717, 61247, 8766, +26625, 48285, 1297, 60902, 35405, 3497, 30239, 49084, 20980, 36301, 29202, +15372, 64035, 35957, 22043, 50168, 10212, 53708, 2829, 51639, 12224, 48628, +27210, 11351, 50891, 26328, 9401, 34589, 44956, 18048, 38788, 57315, 10566, +54949, 33721, 15037, 52531, 18002, 41006, 5186, 63724, 26980, 1005, 52723, +29262, 40961, 4087, 55843, 21982, 61652, 14514, 30593, 57996, 12595, 53580, +22919, 59437, 25907, 3663, 33618, 39996, 6801, 49319, 36594, 22927, 35025, +61639, 20852, 44062, 1735, 54117, 37234, 19858, 46228, 26930, 5647, 59718, +11251, 64342, 25444, 55185, 809, 24556, 60290, 22394, 40510, 20546, 59195, + 5033, 49332, 14371, 45360, 29823, 52369, 26232, 54607, 30420, 49378, 24169, + 4302, 44687, 7082, 51912, 27639, 60809, 15568, 56398, 29874, 7394, 37741, +31772, 12089, 54851, 29677, 15638, 52413, 34538, 22463, 42694, 30419, 51384, +12672, 56886, 31800, 64874, 15689, 54898, 22958, 52084, 29385, 64332, 25036, +53726, 14083, 27001, 43951, 15620, 52973, 7398, 64707, 3835, 37840, 62361, +16949, 55114, 6383, 52737, 29289, 49961, 18234, 47856, 25441, 11152, 44432, + 3557, 29092, 45925, 1173, 31708, 58062, 4544, 55319, 33041, 508, 54798, +31529, 18340, 46149, 26091, 12544, 52512, 39406, 4160, 42909, 13534, 50068, +17919, 65012, 28267, 59665, 6658, 35838, 11126, 54911, 4218, 64049, 13652, +52868, 16371, 49398, 30760, 18009, 59296, 26987, 769, 53674, 7470, 56350, +17094, 49098, 13173, 45263, 8278, 30803, 41653, 24849, 56967, 32693, 49933, +13154, 42197, 18489, 61318, 20398, 50516, 6618, 43638, 34452, 16528, 59620, +31421, 15648, 33728, 50504, 20535, 44517, 16316, 60051, 5766, 63331, 31115, + 2047, 34957, 61997, 22450, 58579, 27252, 7513, 33320, 37977, 11841, 64627, +30558, 13474, 51248, 3351, 44292, 14449, 61632, 27645, 53548, 4162, 43274, +16570, 41314, 21340, 38522, 55470, 14996, 39668, 31211, 12979, 58717, 38889, + 8977, 41174, 58026, 10954, 52135, 30495, 12565, 56259, 25910, 45223, 21246, +41452, 19944, 42833, 6559, 54362, 37630, 3350, 46233, 30620, 54052, 851, +64360, 27067, 4445, 42846, 28725, 7665, 43390, 29529, 61529, 11913, 45230, +16680, 39036, 49118, 18981, 7106, 58209, 20516, 33603, 49575, 2567, 35493, +50337, 21315, 42555, 782, 39098, 7157, 49687, 29049, 61419, 20172, 55152, +25815, 9187, 63492, 3288, 29378, 49181, 16985, 64197, 15590, 33152, 58354, + 3381, 38582, 49631, 17417, 43261, 20842, 46669, 14350, 50893, 38151, 6820, +47392, 12977, 44765, 16000, 42194, 19501, 64259, 23941, 2864, 36771, 12487, +39164, 902, 19995, 58440, 39139, 18097, 60225, 36198, 3095, 34087, 46288, +20614, 39784, 64740, 13754, 42590, 62593, 35259, 6275, 45729, 30676, 2491, +57283, 10571, 63385, 19841, 47663, 21837, 6792, 25945, 46147, 32411, 9115, +36540, 3129, 35892, 9953, 33939, 57944, 39239, 3387, 60993, 22859, 40049, +29958, 49031, 25208, 12630, 45354, 23067, 43185, 19453, 39371, 32027, 62141, + 7262, 54673, 33558, 65146, 23505, 55389, 15819, 63132, 12014, 40513, 26158, +37034, 20124, 47664, 17013, 38071, 58178, 8413, 41989, 63640, 22874, 15184, +62672, 32562, 55128, 1405, 40932, 32264, 3752, 37171, 22186, 58200, 40572, +17252, 41988, 20350, 47073, 73, 59944, 34351, 3283, 50967, 12546, 33120, +48054, 18608, 40113, 24579, 36617, 28846, 60508, 25671, 56114, 15736, 64263, +13712, 39377, 3506, 26724, 63814, 23198, 48301, 4779, 41678, 12650, 55921, +27294, 4012, 49301, 36579, 9163, 63830, 41139, 12170, 61692, 993, 37609, +28869, 48908, 18287, 52645, 24297, 51374, 14784, 40348, 16825, 52207, 29496, +57835, 4689, 49941, 19164, 43848, 35392, 23047, 54802, 17737, 46834, 35131, + 9440, 32407, 63735, 23204, 51826, 10646, 48744, 30306, 4282, 33538, 64296, +19352, 44842, 26304, 16597, 64871, 28403, 6302, 33594, 44035, 3241, 32364, +42081, 5220, 34784, 61767, 8117, 57536, 22975, 63617, 16618, 29318, 58498, +20509, 62958, 17126, 47146, 21769, 36302, 60665, 16139, 47990, 24335, 54115, + 4126, 25494, 49546, 31730, 53412, 8626, 32710, 60066, 34781, 26163, 51181, + 9227, 39091, 24806, 47754, 5455, 63226, 16217, 55194, 19695, 64466, 21466, +45196, 8541, 42673, 2177, 46141, 30822, 40506, 20039, 57862, 7918, 38180, +28842, 47572, 9098, 28011, 51824, 18374, 31627, 53962, 1640, 40292, 8286, +58889, 33836, 15644, 53692, 27760, 63911, 8440, 56513, 30680, 51528, 7601, +35065, 57376, 20835, 65010, 22923, 51594, 35511, 8969, 29723, 47809, 13750, +22963, 57556, 24773, 10593, 53767, 4649, 27167, 52641, 23059, 3437, 25969, +60487, 13069, 51028, 25080, 39100, 28191, 36919, 281, 29759, 60933, 33155, +52445, 4933, 60428, 27522, 55783, 21860, 58542, 43464, 20406, 6150, 23506, +47546, 28649, 11839, 58871, 13460, 21166, 57899, 39616, 239, 57224, 11489, +63684, 2782, 12352, 36770, 27783, 40725, 20111, 9329, 41733, 5500, 49132, +27723, 51999, 21374, 64347, 10638, 56399, 14023, 62892, 4021, 23928, 50104, +29862, 1753, 34672, 47660, 27069, 9131, 24912, 45245, 11467, 51080, 20122, +47808, 33677, 1624, 30581, 61122, 8324, 56178, 25046, 39991, 31682, 19754, +57041, 24118, 40860, 57805, 9946, 31389, 64966, 4115, 58604, 9049, 38192, + 2953, 40113, 32903, 5798, 51793, 18184, 58256, 43307, 7465, 38629, 15290, +57762, 25590, 45020, 19129, 38940, 60559, 14304, 22296, 51874, 26728, 3015, +47962, 17120, 31706, 56696, 12824, 25201, 42113, 11392, 43379, 6770, 46577, + 4459, 48688, 12263, 44466, 17450, 40486, 14419, 55986, 203, 61130, 8818, +29570, 64101, 6117, 24379, 49745, 16239, 37839, 6606, 29369, 62850, 18451, +58277, 24526, 53867, 9460, 49187, 5191, 53270, 34431, 2112, 51681, 22359, +60707, 17148, 38829, 62209, 17911, 58769, 15515, 31087, 47779, 13757, 39857, + 2057, 33928, 45686, 12942, 42266, 4797, 39780, 11574, 56129, 8200, 29505, +51721, 1659, 62566, 13685, 33945, 57777, 20321, 2460, 28156, 62800, 24150, + 3645, 46373, 12531, 35845, 60509, 15415, 57581, 18587, 40482, 11025, 36834, +28594, 46210, 11684, 41034, 16708, 52107, 14824, 59950, 17574, 55920, 12403, +52344, 25512, 33587, 56558, 5028, 21590, 61072, 41204, 13803, 65204, 8693, +34197, 62431, 22415, 44675, 29190, 4343, 62101, 32840, 2189, 36118, 48624, +25118, 1299, 38013, 27266, 47394, 10205, 42345, 6843, 45098, 16416, 56219, +26770, 63939, 1664, 54859, 33346, 7585, 37224, 63365, 17518, 35149, 44548, + 8078, 48353, 31334, 53569, 18096, 47956, 20147, 62738, 5575, 53423, 18922, +58945, 39827, 11941, 44864, 16319, 40697, 17714, 43080, 13602, 47195, 8377, +27319, 52388, 31779, 65464, 17443, 55545, 34638, 1542, 50828, 35713, 7821, +30695, 51558, 20788, 37602, 26478, 46650, 59192, 17621, 53064, 1974, 58351, +32137, 51449, 24751, 38539, 8862, 35330, 2708, 32029, 42577, 5912, 44321, +20826, 49090, 33325, 14297, 55528, 22095, 58479, 5452, 53415, 31672, 59805, +17168, 61802, 30954, 57398, 8608, 63438, 26972, 51351, 19242, 44991, 29892, +10281, 62866, 7545, 44494, 11432, 47512, 5017, 21814, 50307, 38296, 16080, +46449, 14826, 51829, 18580, 63328, 20070, 53445, 28546, 34986, 46155, 10073, +32279, 20523, 59882, 31602, 10866, 52331, 1269, 62960, 8927, 23918, 53020, +32616, 6774, 38655, 54323, 22836, 39854, 50869, 8116, 33077, 55080, 3887, +59661, 27228, 64034, 19989, 42571, 23343, 64953, 1818, 31599, 61697, 26726, +34486, 45507, 15938, 48231, 37116, 19035, 39824, 59446, 1878, 55167, 20121, +57312, 40087, 78, 45646, 8186, 42351, 20941, 37075, 27627, 59842, 11798, +47526, 20715, 36081, 48805, 12323, 53846, 24769, 10507, 50821, 23350, 49342, + 577, 36876, 28485, 52643, 25756, 59844, 7434, 55086, 18996, 51601, 23295, +43343, 18477, 49558, 37314, 19521, 42046, 22067, 38166, 47235, 9544, 40859, +55840, 36274, 11102, 35546, 54172, 22269, 64428, 455, 28513, 43959, 6356, +31493, 53382, 26191, 59096, 4540, 34491, 55947, 1603, 58731, 30871, 38603, +25085, 43983, 4660, 48115, 35705, 1168, 45089, 14127, 50936, 39894, 25031, + 693, 48426, 20377, 44225, 27397, 12646, 50023, 16668, 52568, 23692, 42676, +18320, 50281, 22981, 10706, 34728, 61758, 18658, 58125, 15247, 53619, 28305, +58692, 13621, 40949, 3916, 46688, 21000, 43031, 17135, 45650, 27534, 49922, + 760, 30546, 51468, 19427, 60972, 15309, 41255, 9347, 43207, 1052, 40109, +12347, 44822, 14213, 43393, 8450, 25356, 54632, 2592, 63647, 31251, 53143, + 1457, 63116, 24655, 35243, 62023, 392, 45125, 10665, 41742, 6553, 46879, +31402, 17848, 62899, 26373, 47299, 10125, 61351, 5553, 53878, 21636, 4800, +42647, 13690, 47027, 35953, 22164, 12959, 61961, 16711, 57304, 44693, 24388, +52605, 13320, 60498, 30229, 38883, 8809, 64836, 35635, 6656, 40285, 12990, +45562, 17706, 40040, 3361, 42196, 26319, 5625, 23789, 42026, 18462, 43789, +11954, 39065, 3055, 53436, 34826, 26663, 51723, 17121, 62028, 20549, 37252, +63897, 26333, 2559, 52969, 34099, 26317, 35410, 44652, 7181, 46787, 11331, +59603, 1583, 24241, 62788, 36321, 51108, 2290, 45919, 35140, 22328, 40311, +28776, 33825, 46140, 2395, 41435, 59094, 20926, 9837, 62827, 5174, 21800, +64759, 40926, 17476, 47100, 35220, 15864, 32831, 53504, 9128, 54780, 14075, +34571, 46351, 5765, 47715, 9980, 24011, 57296, 28589, 2624, 53759, 10508, +32947, 43498, 12173, 47072, 32680, 14412, 53066, 25759, 32670, 61081, 2468, +51203, 14012, 39458, 32905, 25042, 62563, 5673, 29696, 44464, 1097, 46767, +34190, 4393, 40480, 13147, 55608, 17614, 62816, 4990, 48853, 21536, 40463, +27213, 37323, 10288, 61984, 2906, 59039, 26658, 5426, 63899, 11027, 56393, + 6938, 26959, 64689, 23113, 13345, 50304, 21146, 48440, 7665, 43364, 14603, +40378, 54907, 17230, 62370, 38349, 1921, 43421, 15246, 51006, 25318, 17825, +47949, 27116, 5581, 64002, 10517, 29796, 61166, 23468, 15066, 65529, 22516, +59531, 31790, 11310, 49972, 35109, 26370, 58027, 4815, 55400, 37913, 3123, +60114, 10261, 38729, 7165, 57280, 14140, 61239, 29511, 52976, 13461, 40925, + 4414, 42739, 32568, 1999, 31785, 47175, 21907, 61113, 33811, 9730, 34918, +61849, 12034, 58580, 20045, 42747, 59204, 9612, 38685, 1938, 54493, 18765, +63658, 28274, 58791, 22085, 54142, 27552, 61396, 17246, 56202, 36235, 20669, +42512, 27981, 7997, 22740, 42042, 29853, 5925, 49473, 13241, 41109, 16713, +51521, 29733, 60538, 15831, 54922, 36297, 4371, 50178, 15196, 42159, 24574, +43685, 15591, 41022, 55954, 19576, 63310, 26415, 5175, 59893, 35084, 319, +42608, 30994, 6708, 61312, 17249, 45764, 25632, 1322, 54175, 29197, 16354, +52127, 27600, 60976, 23096, 35897, 65434, 11855, 56998, 15471, 52350, 32558, +48267, 14147, 52838, 4485, 58572, 21587, 65130, 16119, 47889, 4850, 37488, +32255, 1690, 53350, 28646, 7958, 43590, 59535, 23514, 9559, 62440, 351, +27511, 57375, 23412, 42212, 17286, 40755, 52743, 21561, 5479, 25625, 55349, +16020, 64507, 6391, 56580, 13833, 54577, 17550, 64907, 12931, 29870, 46772, +34058, 28103, 35265, 46106, 25900, 1652, 58944, 28067, 9400, 49705, 485, +36743, 28868, 38121, 25828, 59286, 18399, 54091, 21866, 63387, 33163, 6729, +40934, 60215, 21343, 49292, 27860, 17324, 65277, 26913, 3779, 59594, 35851, +17183, 49955, 14782, 40838, 23853, 63392, 716, 57378, 7980, 36589, 55285, +15679, 35387, 64515, 14383, 56520, 28246, 63353, 22459, 33528, 43857, 11097, +38087, 32332, 10045, 65515, 1166, 58073, 28871, 34042, 45642, 14068, 32777, +53731, 22700, 47686, 17782, 33051, 51023, 756, 34992, 59033, 5660, 41421, +26659, 58664, 18883, 56389, 26605, 10727, 50664, 24375, 13231, 57210, 32605, +63678, 8922, 38697, 61920, 13590, 33365, 46955, 22097, 36629, 51660, 8296, +33316, 46869, 30945, 8985, 36525, 2694, 62622, 13512, 52769, 7671, 36134, +46651, 17127, 31074, 43025, 24833, 32526, 64892, 26433, 34877, 45112, 3532, +42037, 6357, 45963, 23729, 63255, 20540, 55350, 24140, 62249, 5809, 52155, +11190, 28448, 54139, 25833, 3388, 50814, 35859, 5280, 33967, 21839, 32469, +49038, 25601, 34352, 46958, 5073, 37696, 11453, 42546, 7122, 36735, 2884, +47065, 28927, 5259, 51666, 10803, 56344, 32640, 59858, 15635, 55232, 33520, +19486, 56286, 24076, 59019, 35023, 2568, 25543, 43645, 9217, 45737, 21452, +33419, 58238, 2412, 55259, 10724, 65067, 30461, 25312, 46033, 8010, 39706, +52348, 16077, 48467, 26211, 53980, 12425, 41230, 22777, 50288, 7577, 37182, +58805, 18630, 41164, 47431, 2463, 43218, 10210, 50725, 722, 28570, 42960, +20337, 46282, 8858, 63977, 294, 55780, 28299, 37266, 25914, 46478, 12787, +42056, 23563, 59648, 18653, 55293, 40268, 14579, 46685, 33458, 19300, 11271, +40530, 55136, 20795, 49159, 32625, 10381, 51409, 3860, 65511, 27942, 8722, +47083, 30971, 44148, 9523, 29859, 42835, 24259, 34353, 47548, 4519, 44042, +35404, 25109, 55172, 291, 59964, 14192, 57139, 10999, 53790, 36912, 14951, +38757, 62550, 21394, 57270, 19059, 61250, 3287, 51486, 8293, 39852, 11073, +43203, 3037, 38887, 52286, 22781, 11384, 44219, 4981, 57807, 34978, 7227, +36276, 44475, 23123, 8910, 64669, 5059, 33889, 56491, 7053, 29740, 43066, +22565, 46363, 18917, 32320, 50678, 9870, 30795, 41047, 20900, 37793, 9011, +51817, 6102, 59484, 24659, 56731, 15813, 51955, 23870, 46327, 14700, 50000, + 7114, 20955, 52696, 39309, 12453, 44017, 3433, 39177, 58303, 15031, 30526, +46211, 16974, 31556, 62086, 1543, 38752, 31359, 5014, 49484, 33823, 3071, +35475, 46458, 22683, 6097, 28012, 48325, 23573, 3524, 36976, 57627, 12278, +54805, 560, 20615, 39689, 57451, 3706, 55623, 27661, 54324, 22098, 42455, +33237, 22833, 63382, 15397, 29863, 60784, 10956, 57066, 14649, 45996, 362, +48335, 9921, 27990, 54842, 19331, 59606, 16945, 51844, 11459, 44580, 8002, +48313, 14268, 43893, 18538, 39349, 59294, 6462, 48888, 36752, 14633, 23915, +44766, 64946, 11607, 57013, 5898, 62061, 10360, 27313, 57692, 20924, 55237, +26669, 64271, 23170, 52251, 19838, 37544, 65105, 17961, 46105, 15046, 47902, + 4219, 44529, 9666, 51264, 37091, 3569, 45850, 7727, 21622, 63571, 39467, +14131, 56869, 30601, 64546, 8514, 38941, 31235, 19148, 50795, 36051, 1035, +34374, 11383, 57138, 32056, 20302, 45051, 7337, 63584, 20884, 34045, 58252, + 2051, 28585, 62572, 30820, 10878, 49808, 5307, 31353, 61690, 21422, 54757, +25968, 33671, 48620, 6915, 53862, 29663, 37082, 23079, 33762, 39296, 10047, +62282, 7188, 33455, 57130, 935, 50267, 10837, 43230, 8498, 27560, 56633, + 5857, 60613, 36344, 52087, 29157, 4585, 43902, 12912, 61076, 37384, 21898, +44271, 19223, 37973, 56661, 14597, 58523, 16758, 61447, 39232, 3299, 60301, +10279, 26637, 61812, 22179, 7243, 48341, 11611, 43301, 16645, 50200, 3747, +42378, 18852, 32025, 55566, 5508, 24301, 43263, 8009, 41995, 12394, 44145, +20996, 48259, 27962, 60534, 17281, 56515, 26430, 13765, 64378, 35186, 25901, +51085, 14752, 45597, 24700, 60497, 13323, 51435, 29684, 38502, 26371, 47335, +18264, 32323, 52806, 17609, 54562, 12596, 61273, 2593, 26696, 59044, 6972, +54769, 3113, 60535, 25471, 42311, 32384, 20522, 40471, 2649, 42721, 33984, + 5602, 32892, 56458, 24652, 35335, 64214, 28200, 354, 59637, 24196, 61740, +29494, 5240, 35623, 60722, 9925, 53071, 36800, 15240, 49216, 16603, 63542, +37422, 13527, 59546, 28756, 65466, 9492, 55546, 31362, 52353, 16168, 41719, +53568, 28793, 7517, 44948, 16448, 41948, 62337, 27780, 13043, 44317, 17883, +41869, 14525, 48766, 8593, 57590, 3853, 32115, 47934, 1337, 39917, 34037, + 6325, 52037, 18902, 55981, 20768, 62918, 39619, 11985, 47550, 30693, 36705, + 619, 38532, 16292, 59967, 26866, 37757, 30141, 65362, 241, 24702, 44325, +12754, 64181, 32216, 55968, 8723, 26488, 41434, 17232, 45430, 23131, 36122, +43527, 14247, 47885, 3607, 45814, 14983, 42125, 12775, 59691, 7747, 31755, +40434, 859, 62254, 26691, 37869, 19991, 64782, 26436, 14718, 60269, 18712, +32416, 53662, 27649, 5695, 51090, 23120, 755, 27353, 52550, 17214, 60773, +34654, 6948, 23304, 49405, 62330, 27931, 37571, 2928, 54635, 11896, 31612, +39402, 4450, 52839, 14459, 32908, 43943, 15943, 46537, 22587, 33759, 59706, +13503, 36831, 7338, 34937, 13949, 58904, 18682, 62105, 25127, 2630, 56412, +13354, 60143, 16814, 51539, 22724, 49308, 15661, 38613, 31180, 19444, 63203, +21768, 58123, 36530, 18056, 42418, 25178, 1044, 22045, 63527, 38085, 18869, +50529, 6151, 28413, 59116, 13730, 54740, 5067, 32295, 36678, 503, 48928, +32009, 19971, 46791, 18811, 38150, 50535, 16322, 40823, 58450, 28162, 62312, +18983, 39720, 20684, 45186, 13567, 63927, 7293, 43776, 29855, 48253, 14556, +51802, 26976, 56326, 15582, 63619, 32561, 838, 31703, 41422, 7302, 50135, +32521, 1309, 47234, 8664, 30115, 62656, 636, 52473, 21212, 48262, 2826, +58628, 15437, 54772, 11313, 61867, 39305, 10578, 44543, 4509, 41103, 21180, +48555, 39340, 17789, 47191, 23754, 45105, 17188, 49061, 1748, 64915, 12533, +53633, 27899, 58696, 17184, 62099, 12809, 39614, 2418, 44791, 9778, 48221, +36518, 18450, 41698, 13199, 49105, 25463, 45058, 19794, 42607, 25176, 6649, +56017, 29013, 43029, 10105, 24871, 46875, 21119, 42771, 18805, 40951, 19947, +45417, 171, 61198, 10056, 21351, 64920, 40224, 19571, 59193, 32409, 7260, +53180, 37046, 21775, 63286, 6300, 58602, 34988, 24393, 40201, 27686, 55736, +18590, 54118, 20973, 64070, 27103, 33076, 41566, 9300, 37783, 5399, 22902, +58636, 25055, 7751, 64694, 27277, 53903, 29391, 36191, 3223, 50792, 9506, +23148, 49884, 32627, 17090, 53060, 22841, 1321, 39888, 29998, 51892, 2530, +53128, 29917, 8393, 56525, 56, 65394, 25029, 38744, 20163, 57242, 1327, +49314, 25120, 44598, 18892, 50576, 25107, 36628, 12446, 58412, 32012, 2117, +47437, 39145, 9295, 50627, 40669, 11688, 46665, 35798, 16083, 59453, 32594, +44294, 10942, 41972, 4925, 48079, 29330, 59375, 16657, 4104, 51901, 15455, +64621, 21770, 36864, 60415, 17950, 46057, 23539, 38476, 65294, 10026, 55737, + 3629, 53359, 14770, 39192, 26990, 56352, 24046, 63831, 39545, 5197, 42317, +11238, 38161, 49289, 19390, 44438, 6052, 47171, 32410, 2297, 30545, 60720, + 6246, 54380, 34869, 4307, 48967, 31792, 2913, 65330, 10567, 52766, 31732, +49046, 8844, 26236, 57075, 14946, 34749, 47315, 1185, 39685, 21158, 49311, +15479, 62137, 24159, 37728, 6860, 53518, 12781, 57618, 30912, 860, 56283, + 9603, 32671, 3133, 34621, 51725, 6341, 61405, 26429, 52292, 28658, 39908, +20927, 57928, 2557, 65152, 32742, 4356, 33867, 40231, 6993, 50913, 24389, +55265, 19405, 61550, 20733, 37081, 55744, 17688, 59109, 38503, 16201, 41646, +31607, 9652, 32531, 41299, 22420, 42907, 1203, 45993, 29160, 3305, 58069, +25837, 65386, 15181, 56894, 33122, 11083, 63793, 35148, 13603, 32920, 58429, +11478, 37272, 28636, 43427, 7169, 36688, 9665, 49251, 28443, 53409, 22276, +60812, 18737, 55900, 25467, 11522, 57512, 6693, 55146, 20919, 63371, 8778, +54449, 2730, 65233, 39225, 22113, 3937, 54598, 34685, 60920, 1061, 52927, + 7859, 54415, 4206, 60169, 12958, 38339, 26995, 33877, 47323, 2327, 26476, +50864, 4854, 25281, 47944, 23185, 1992, 50413, 11827, 45414, 28262, 97, +64589, 10770, 46184, 7339, 41429, 14168, 42800, 12815, 48985, 2600, 59903, +25755, 54235, 32366, 43270, 1929, 34667, 48862, 13963, 45415, 6039, 57932, +12936, 63540, 20922, 56500, 35008, 12370, 55068, 36250, 7915, 34709, 58240, +15267, 61441, 21500, 43722, 18621, 62865, 34729, 15585, 50949, 32398, 10636, +59970, 33370, 11222, 37209, 16108, 54923, 3293, 57687, 9302, 60732, 21525, +52742, 7105, 40703, 57126, 17744, 31380, 63005, 22760, 1181, 57301, 19913, +61177, 31014, 7523, 48854, 18771, 61785, 24061, 51760, 19735, 43126, 12006, +41352, 47639, 18640, 44381, 8560, 50007, 27170, 1588, 51577, 10420, 59362, + 6380, 25451, 48702, 29622, 37943, 24624, 64462, 24, 51764, 10538, 48227, + 3023, 28452, 47408, 22545, 51004, 31344, 9379, 59007, 26525, 40279, 15022, +64210, 25584, 45440, 17931, 42967, 14282, 46962, 26545, 37446, 14839, 51210, +26282, 47751, 19602, 61595, 14163, 33670, 46792, 2174, 30605, 64628, 16859, +53963, 11553, 63213, 30090, 40968, 8456, 51271, 13374, 65023, 26031, 44524, + 7901, 47979, 27829, 37201, 23646, 44792, 54843, 14563, 23064, 46367, 30613, + 8991, 36366, 1137, 60288, 10429, 36139, 28059, 37829, 20366, 60098, 18000, +54438, 30787, 13561, 42639, 5302, 43854, 14397, 48065, 10699, 27612, 42793, +24429, 3984, 55111, 19808, 56964, 26360, 63221, 6723, 53809, 13739, 63950, +34983, 16547, 50106, 36337, 17036, 33849, 42186, 6598, 24998, 53454, 417, +27221, 52899, 4972, 39920, 26699, 57064, 14113, 55314, 21177, 61479, 26178, +38350, 3911, 43519, 8577, 29535, 42166, 5802, 50774, 38253, 21633, 43043, +32540, 1633, 31448, 40372, 18424, 47286, 30997, 14059, 58509, 41862, 22794, + 7146, 28096, 44192, 15064, 38945, 16661, 48776, 34689, 25076, 51703, 6863, +56935, 14261, 36619, 58167, 15085, 38935, 63585, 9748, 32994, 60442, 25098, +38268, 19198, 49414, 32838, 17463, 51647, 20494, 61798, 26208, 59383, 5549, +56320, 23417, 38413, 16414, 47332, 13128, 21428, 56881, 27824, 60937, 17733, +55559, 21709, 40779, 23247, 46974, 16823, 43264, 5110, 45591, 31221, 3547, +63029, 27568, 47884, 19460, 45473, 4868, 49778, 10874, 39196, 3980, 46532, +28630, 37249, 18014, 49493, 6755, 51930, 27930, 62881, 32922, 22515, 39043, +33371, 27982, 42883, 4653, 30021, 49131, 23659, 11519, 50990, 4812, 42768, +35323, 49591, 14554, 38576, 3852, 47464, 34675, 13335, 55468, 3045, 38510, +12517, 64196, 1816, 55811, 24269, 7526, 61057, 30476, 40257, 14817, 57803, +37985, 22039, 42082, 19115, 50558, 36970, 21242, 7972, 57345, 9546, 30261, +45527, 21894, 43164, 17626, 32846, 57834, 16496, 55683, 1235, 64435, 28352, +36341, 3646, 50078, 31270, 8072, 52487, 10563, 57829, 27640, 64573, 7421, +54969, 11750, 61933, 21294, 39455, 6516, 43370, 3729, 38958, 54592, 17445, +60119, 40735, 8226, 43217, 20279, 42213, 25245, 2451, 53003, 21624, 42789, +28460, 40602, 1988, 35306, 62743, 15008, 53351, 5685, 64125, 10949, 26484, +37937, 65461, 2200, 40626, 57595, 21454, 53957, 23354, 48650, 15830, 50970, + 8491, 46571, 11470, 42926, 1687, 36905, 58196, 18405, 65341, 30313, 51622, + 3541, 38662, 62888, 6316, 48751, 33776, 12527, 46731, 4767, 44168, 12875, +39446, 19770, 45012, 30125, 8527, 59214, 31268, 12860, 47827, 1658, 60249, +29175, 49494, 16553, 44730, 36103, 10589, 62945, 14627, 51359, 4072, 36179, +23704, 50132, 146, 47507, 14344, 64746, 23645, 35074, 52403, 15122, 62356, +31348, 3232, 65111, 14252, 47771, 27769, 53505, 15460, 57285, 35384, 8220, +49487, 33605, 12584, 51589, 36550, 56704, 18404, 63096, 23023, 57726, 28042, + 8806, 64255, 21725, 44503, 18597, 48829, 29196, 10691, 49540, 33569, 17710, +54745, 40255, 16236, 53829, 5708, 62076, 9502, 56839, 37700, 4958, 43536, +32307, 2253, 31084, 45726, 34739, 8706, 61907, 31189, 4123, 65313, 33683, + 7321, 46287, 11010, 38048, 2966, 43037, 11634, 52104, 1599, 39034, 26021, +60740, 14440, 57519, 40413, 16527, 43105, 6142, 53577, 13078, 38040, 20141, +59466, 25641, 54934, 12500, 60414, 5806, 56308, 26389, 44362, 16815, 41941, + 4563, 48758, 8787, 63953, 13235, 55411, 17578, 38575, 64430, 16286, 43891, +34627, 28997, 58649, 20257, 8638, 28285, 65236, 23576, 53851, 17801, 63835, +26130, 36896, 28808, 53402, 22464, 34277, 46813, 15005, 39037, 52599, 26199, + 590, 48711, 33593, 6169, 30422, 64046, 3955, 56170, 28173, 862, 60845, +41715, 18010, 50811, 40314, 12652, 54304, 5734, 62246, 41123, 7828, 38515, +12733, 43159, 15205, 46360, 21323, 61430, 18507, 57441, 37572, 19538, 41821, +30992, 1569, 32745, 40910, 22536, 43488, 474, 45386, 12463, 59180, 23281, +56089, 28449, 7009, 45344, 32566, 15798, 51908, 27734, 61503, 7244, 57266, +34823, 27004, 60581, 4270, 55803, 18111, 59225, 13714, 29976, 40500, 21521, +43275, 19853, 39709, 57977, 7736, 33540, 50873, 24976, 13104, 46811, 15320, +44040, 4717, 63201, 18402, 58663, 25374, 53297, 22588, 62206, 25252, 8803, +46334, 34628, 11901, 24922, 60267, 29481, 13263, 52940, 16837, 64815, 26758, +36078, 61028, 18746, 52917, 27430, 60670, 4179, 56644, 25920, 38203, 5458, +55070, 27229, 52498, 20903, 38919, 11970, 61611, 21594, 55870, 31109, 20561, +47606, 18554, 41234, 59740, 8215, 29904, 42538, 19696, 51467, 34127, 10421, +59167, 922, 48816, 36353, 16135, 43895, 28768, 52245, 9376, 61087, 11343, +46086, 4353, 23005, 60335, 28270, 77, 64085, 31261, 20252, 3467, 40743, + 9678, 47866, 1754, 43620, 30818, 39653, 2844, 35604, 62686, 4471, 41738, +59994, 23776, 867, 46530, 27772, 4110, 48638, 13409, 41737, 26160, 43285, +19936, 30270, 60569, 15197, 52720, 22903, 50138, 11472, 28284, 53139, 18750, +49754, 35835, 15708, 51442, 41015, 18221, 52918, 24401, 64140, 26689, 58547, +19463, 32171, 54933, 8303, 29188, 50440, 22319, 9106, 51609, 24129, 60593, +32356, 26816, 63714, 33502, 7238, 48184, 22212, 40481, 20430, 42503, 12946, +39756, 2158, 61480, 23317, 53876, 15334, 44936, 24073, 47796, 2002, 46015, +26725, 10078, 54373, 155, 62615, 10460, 24462, 52015, 31058, 45787, 5161, +43363, 11055, 39710, 1668, 44733, 10244, 49254, 7100, 58593, 9393, 30567, +60260, 21228, 10160, 37146, 56038, 19153, 61819, 25222, 53438, 11694, 44597, +14187, 32779, 46982, 16746, 33665, 63171, 2764, 25753, 60046, 19007, 37174, +31005, 20181, 51512, 26355, 60467, 20889, 54970, 4992, 52268, 11127, 44979, + 780, 33560, 63048, 5133, 55191, 23545, 52941, 15368, 60367, 18403, 56297, +28292, 49748, 16874, 41888, 15457, 36488, 64178, 24704, 5154, 56565, 36377, + 3158, 33941, 45905, 18496, 47533, 12003, 36969, 32648, 10200, 49195, 33504, +23948, 54725, 3651, 58954, 12083, 51932, 1433, 31859, 43953, 12462, 19780, +59659, 37773, 3516, 62413, 30474, 38663, 27270, 44685, 127, 40797, 6347, +44009, 16098, 39456, 52304, 27365, 2256, 55935, 40324, 15892, 46607, 22756, +34810, 43785, 2184, 54156, 9032, 29903, 42595, 1536, 37192, 15675, 42086, +21987, 51087, 18618, 62046, 32126, 10328, 35839, 5971, 56203, 31996, 3626, +43621, 6771, 46139, 34591, 1379, 61899, 30934, 16852, 33259, 64095, 13563, +57578, 5999, 30405, 46110, 21617, 41005, 29084, 8918, 34081, 60209, 5062, +24273, 44876, 35616, 26284, 34144, 62688, 43305, 10525, 50680, 24402, 43843, + 8496, 59901, 32725, 54860, 27058, 33898, 61524, 14570, 55710, 18185, 58036, +12235, 26077, 53205, 22616, 7871, 38261, 61497, 12302, 36719, 65062, 22713, +44408, 21254, 58969, 3182, 54912, 12072, 40730, 33465, 8339, 64801, 16786, +58085, 39486, 733, 45158, 10117, 57647, 29836, 1230, 31068, 62377, 5035, +44407, 10487, 47233, 6647, 37283, 61900, 17849, 48588, 35886, 967, 34307, +62161, 28836, 2354, 37235, 10265, 48536, 501, 53926, 31036, 15953, 64562, + 1572, 54107, 24394, 63457, 21313, 53080, 31356, 9186, 32377, 60617, 28970, + 6532, 35491, 60088, 15837, 51927, 33969, 23261, 47273, 18369, 44866, 36044, + 2794, 60596, 13559, 55001, 19608, 60110, 27475, 54352, 22018, 62408, 18025, +32111, 42236, 26538, 45142, 4560, 42474, 65407, 28473, 14237, 43191, 10729, +45778, 21334, 49559, 18548, 39675, 59678, 11005, 54661, 5377, 23735, 48996, +35636, 7560, 33352, 52598, 1682, 58480, 10792, 48809, 3888, 40336, 25330, +37568, 16352, 40995, 29322, 53517, 13343, 25211, 48167, 16224, 42485, 9474, +48559, 3962, 31837, 36723, 7837, 30603, 63725, 1956, 53267, 10134, 21361, +48051, 35385, 12127, 23176, 58728, 26020, 9861, 54936, 4774, 63971, 19662, +52419, 27698, 38125, 5316, 45838, 11486, 42256, 24576, 46311, 22218, 61182, +17673, 56493, 29588, 48281, 6086, 27793, 53038, 22882, 11600, 50165, 6821, +34510, 55782, 19162, 64467, 12816, 57328, 4603, 20722, 59344, 41378, 21807, + 7941, 54621, 344, 58301, 8408, 30019, 49223, 35422, 22901, 57472, 17551, +63610, 23413, 55599, 11457, 48318, 268, 42719, 14640, 44897, 22146, 63065, +41509, 14263, 51103, 36786, 18817, 65164, 15239, 57828, 25384, 42420, 6229, +54260, 38656, 3210, 46973, 35979, 25122, 60420, 17635, 55188, 6602, 63662, +25359, 53184, 17264, 32432, 56634, 20205, 643, 50906, 7540, 20914, 30265, +40710, 17585, 56917, 14707, 37658, 48273, 21940, 11115, 45381, 5170, 24428, +46611, 5937, 42295, 22206, 45547, 33684, 9610, 35052, 50133, 16914, 26349, +52273, 29873, 8949, 55166, 1523, 51984, 17149, 37160, 27774, 50541, 1109, +48339, 27247, 35551, 44076, 6581, 22558, 63784, 25410, 42018, 20213, 40247, +55186, 14152, 34611, 49921, 22303, 40028, 18790, 51485, 30771, 3889, 44625, +10806, 64743, 25299, 46205, 15703, 39431, 55444, 18555, 57688, 22484, 41637, +18236, 44327, 35212, 9849, 47214, 17270, 44128, 4824, 47987, 13966, 45960, +26745, 43300, 553, 38563, 56897, 14647, 31031, 39926, 3878, 57959, 7994, +36459, 59628, 6721, 48658, 21147, 33312, 41250, 26078, 36592, 6819, 46337, +12305, 41594, 5278, 50837, 37711, 86, 63277, 13261, 54334, 22930, 2845, +34618, 59051, 5171, 54972, 29674, 2342, 35853, 62398, 5950, 26612, 43542, +22196, 45199, 32381, 9845, 56927, 27669, 62745, 16788, 46413, 24698, 41910, +18968, 32100, 63230, 8678, 56280, 33675, 65251, 7768, 22342, 60013, 39062, + 8628, 56638, 31979, 61466, 17342, 38922, 58749, 15084, 54048, 37794, 20840, +44315, 25693, 38204, 54987, 172, 62324, 28680, 44931, 14709, 50692, 38016, +22759, 42661, 14198, 44877, 1361, 59713, 16068, 64357, 20054, 57221, 16799, +63595, 6429, 36549, 10213, 49222, 4803, 37104, 22208, 63376, 42850, 9709, +33635, 57039, 20043, 60996, 24619, 9900, 49318, 27882, 38052, 30670, 48219, +35881, 9614, 29982, 61991, 35425, 27307, 32973, 39156, 25160, 62181, 20037, +11069, 50319, 5632, 47261, 12007, 43588, 6997, 40037, 20506, 65024, 29555, +51747, 2989, 49150, 9040, 25128, 58722, 27543, 9726, 48982, 29938, 39425, + 8773, 53545, 21684, 48973, 10986, 23419, 56234, 28588, 9245, 50588, 2040, +39998, 12670, 44434, 18355, 42487, 1823, 38670, 49613, 8111, 40070, 63876, +22419, 55234, 36766, 2134, 59266, 33402, 5338, 45662, 29326, 2266, 34363, +64994, 18992, 57171, 38187, 17000, 52358, 12837, 61012, 1193, 55180, 28416, +64703, 3029, 56779, 39856, 5436, 47717, 20593, 38639, 33919, 11100, 32760, +64390, 15393, 34615, 62301, 13604, 55260, 3635, 24088, 49462, 33301, 11087, +52191, 4703, 60270, 8407, 26703, 45878, 23892, 11859, 56318, 15, 59856, +34757, 15422, 53431, 23882, 40356, 20974, 53752, 10099, 57048, 6395, 33308, +44943, 4440, 50687, 11348, 61793, 3733, 58410, 26795, 32646, 57842, 11389, +36564, 28864, 57050, 3840, 64661, 16014, 51657, 20601, 33714, 50928, 9424, +61916, 21241, 41316, 30531, 15332, 31669, 54050, 25510, 56896, 9149, 62139, + 613, 52675, 32145, 18387, 59177, 23617, 57387, 27227, 13860, 47988, 23669, +40041, 16602, 49188, 20917, 46712, 12222, 41182, 15176, 39218, 57634, 24173, +13279, 51489, 34805, 3154, 64988, 12213, 58222, 38771, 20537, 42839, 4595, +39408, 11626, 64935, 6825, 56801, 36824, 14699, 43583, 27986, 2191, 23499, +51277, 35334, 3459, 27894, 46604, 23034, 2757, 28257, 44538, 25130, 11015, +47708, 26786, 5371, 56763, 11344, 61268, 7551, 31281, 41186, 19767, 51582, + 6625, 65215, 29275, 744, 56175, 16717, 58355, 24452, 40731, 11169, 51169, +30492, 39013, 30, 50480, 28423, 33121, 54273, 26053, 38543, 28166, 58753, + 571, 34072, 19087, 55549, 40549, 1868, 42427, 14833, 46983, 30094, 36702, + 2769, 51256, 10681, 23150, 63997, 19280, 48922, 3928, 51976, 17338, 64238, +12202, 47069, 4319, 40573, 59282, 28826, 39263, 24446, 53990, 28133, 60035, +16519, 52274, 25545, 8164, 33309, 59794, 23163, 34673, 46310, 846, 40520, +60755, 24184, 2291, 50137, 27680, 37565, 13176, 34209, 62613, 40523, 15145, +44635, 22518, 34547, 63180, 15949, 53824, 27965, 56882, 12129, 58792, 14016, +23191, 59633, 27254, 12956, 44447, 17095, 47566, 31351, 15602, 52375, 26449, +62972, 16499, 56285, 42976, 7275, 51301, 29572, 11662, 63804, 34299, 25297, +35408, 47559, 14819, 41504, 16348, 46201, 32771, 14540, 59354, 23371, 62417, +12840, 57600, 27284, 49803, 4537, 46631, 9158, 25595, 44826, 19075, 37782, +61258, 15863, 56602, 36852, 15168, 43279, 17259, 36649, 63456, 3359, 58126, +37684, 20921, 43257, 25262, 7875, 63651, 33196, 13182, 58926, 5372, 29950, +42313, 19912, 47659, 13778, 28248, 65284, 24021, 40010, 20138, 46050, 14317, +51501, 5441, 38785, 27444, 62029, 16462, 33673, 39315, 22824, 48489, 11372, +59380, 5012, 25105, 46417, 28374, 53528, 12267, 63759, 44096, 1845, 39270, +12514, 37593, 31047, 19001, 49474, 16759, 64138, 38304, 3212, 47668, 9127, +34428, 53561, 19572, 56386, 5637, 58205, 35963, 62759, 26535, 53634, 19497, +64365, 27080, 8821, 34104, 47793, 19685, 56691, 30838, 17820, 50362, 25096, + 1157, 48170, 15300, 50976, 21608, 44063, 18200, 47057, 30989, 391, 51726, +19644, 60925, 31603, 46281, 15990, 44319, 30597, 58110, 10819, 62836, 32827, +54573, 5748, 64785, 35282, 1287, 62652, 41364, 19437, 46730, 17908, 43375, +22514, 59958, 12969, 32338, 41779, 10926, 48526, 20679, 40927, 32120, 6389, +50526, 20517, 46765, 25667, 7003, 48652, 27193, 37065, 13264, 47858, 2651, +62461, 13632, 50477, 18159, 41023, 52075, 6935, 30360, 13646, 65043, 26445, +55015, 4121, 58016, 13207, 61492, 21449, 56164, 34313, 743, 53683, 25183, +45159, 13424, 43904, 5841, 53391, 18842, 56490, 31683, 21506, 906, 60644, +10128, 36384, 2571, 32042, 44588, 4618, 36181, 57390, 13902, 38102, 5257, +64693, 19471, 54479, 21699, 8060, 43289, 56829, 16648, 63870, 4316, 58820, +26458, 692, 31541, 59899, 4791, 54747, 11475, 26400, 47847, 36182, 3603, +34051, 45359, 21523, 46690, 35150, 2936, 51311, 33166, 4836, 58050, 11638, +64560, 34863, 7796, 38952, 10041, 40615, 32084, 13965, 30671, 39938, 511, +48210, 31595, 3722, 49913, 8427, 27433, 58998, 5565, 54390, 25239, 8670, +44569, 31320, 2131, 32311, 42796, 6268, 45391, 16605, 54332, 20554, 58534, +38917, 5899, 59238, 28222, 9448, 47491, 2707, 29734, 62791, 21808, 54437, +29670, 13394, 50764, 31875, 7148, 61408, 9733, 54499, 29023, 41547, 2074, +49312, 26327, 34185, 51774, 2828, 63223, 23361, 58796, 38530, 12497, 43629, + 7095, 53348, 30222, 37848, 23837, 60681, 13575, 49852, 815, 45204, 10150, +58821, 7594, 29332, 43871, 18513, 41838, 65497, 20000, 1065, 36285, 49476, + 5789, 26895, 51787, 19931, 64939, 3652, 55688, 38842, 6294, 42731, 10728, +28470, 55370, 19096, 31135, 64869, 4009, 43269, 11639, 45663, 30786, 8090, +32537, 1098, 31719, 42895, 3782, 51333, 30134, 63054, 219, 42073, 8323, +46894, 35976, 7074, 34189, 63716, 12906, 55868, 31429, 61009, 2426, 54517, +35613, 15658, 59373, 12578, 47449, 6445, 53162, 10447, 62575, 5363, 52072, +18204, 43443, 19934, 40988, 14722, 45865, 18268, 51114, 30893, 16256, 33713, +52892, 2645, 32156, 57260, 4688, 33704, 52656, 3011, 59409, 21745, 34513, +57743, 11584, 61804, 37191, 13230, 63125, 3373, 35042, 61231, 14078, 55897, + 7661, 60362, 19053, 41691, 22639, 42953, 7281, 64683, 10774, 26215, 61285, +36434, 51119, 32529, 9238, 31684, 40251, 22009, 43090, 17143, 41953, 7558, +46028, 27492, 39778, 8511, 30757, 58940, 20274, 41063, 15211, 44852, 35345, + 9567, 51600, 42757, 18455, 32317, 64443, 20751, 54784, 12730, 61728, 17074, +41748, 27125, 53984, 31906, 36555, 9973, 30915, 50820, 38157, 14768, 29365, +36006, 11603, 46822, 18312, 41205, 51815, 12880, 35647, 48223, 19771, 40514, +55952, 7110, 22158, 61201, 24385, 6295, 64404, 9262, 55771, 31024, 15725, +61437, 38444, 20676, 42151, 4101, 49480, 21973, 60643, 20204, 54569, 4283, +62235, 43986, 17579, 60462, 35499, 21258, 53987, 17392, 62775, 37230, 21551, +43271, 19545, 37830, 63396, 17446, 55426, 25701, 53110, 15619, 60375, 24328, +39485, 8114, 36849, 31866, 21646, 51346, 17391, 49821, 31016, 38660, 24677, +51056, 8003, 44684, 1732, 47247, 24438, 39728, 16898, 48802, 27775, 45522, +14507, 50256, 16213, 57812, 36117, 8632, 61360, 13539, 45875, 31809, 8205, +35338, 1214, 54814, 15214, 59288, 27956, 1885, 49404, 10966, 33566, 41088, +20578, 55790, 19446, 51989, 24049, 35103, 62548, 2348, 55600, 32785, 7776, +34339, 56441, 22953, 14427, 33477, 60817, 16636, 42983, 22885, 47573, 15818, +28001, 51659, 22111, 47246, 34055, 8383, 35772, 45131, 17378, 39352, 21327, +62199, 34092, 17696, 48509, 55556, 21447, 61307, 16515, 48232, 22062, 44683, +17517, 54294, 21211, 61514, 15082, 59131, 27951, 53462, 18409, 44402, 28345, + 7418, 25300, 41376, 29162, 5924, 49919, 21786, 39802, 26108, 41482, 21168, +38354, 25654, 42111, 13459, 37884, 117, 48965, 7247, 60806, 24400, 38273, +11905, 58297, 43134, 9790, 25588, 65069, 39024, 12501, 47459, 16757, 39889, +24868, 36003, 50120, 5515, 31174, 47545, 2731, 29039, 54444, 34054, 28130, +53437, 18558, 43009, 20992, 45404, 30399, 52485, 9223, 57717, 16159, 46268, +20400, 32770, 46807, 21862, 2994, 20382, 45869, 23800, 52834, 14336, 63494, + 5840, 54587, 31453, 59461, 14766, 62993, 18216, 57089, 37971, 2680, 50482, +24747, 61213, 1619, 23086, 65453, 33817, 13913, 52461, 41140, 7797, 46569, +29660, 38419, 24532, 50327, 1726, 46997, 10642, 18718, 56749, 28066, 61173, + 4146, 32559, 62707, 5719, 54666, 41996, 22453, 53153, 7364, 28101, 64520, +22897, 10144, 58512, 1282, 29351, 44981, 32606, 9857, 51825, 35631, 29040, +43346, 17253, 48901, 35972, 8653, 28901, 54166, 15178, 55835, 25216, 41221, + 896, 50553, 29088, 46739, 24658, 8745, 53185, 26367, 6597, 58714, 10637, +44384, 29056, 2580, 53534, 11163, 60084, 321, 33708, 47390, 7160, 41731, + 9911, 46178, 35301, 524, 63845, 28361, 56836, 2421, 63216, 11270, 40518, + 283, 65158, 10596, 58312, 20351, 39707, 28437, 59636, 11269, 57235, 4858, +64313, 35778, 2394, 32859, 62665, 4397, 37573, 31317, 18444, 47863, 22955, +40313, 17100, 55929, 25942, 51228, 31054, 19543, 49708, 21570, 37194, 62975, +16470, 55056, 3153, 65049, 30849, 7988, 42692, 31835, 3345, 50653, 13506, +40344, 30886, 16975, 52158, 41040, 11079, 31853, 59017, 40606, 8900, 48935, + 4724, 58128, 9962, 34593, 63395, 13039, 57526, 2534, 61700, 21456, 59596, + 1291, 51981, 14385, 46806, 27946, 2105, 59787, 11138, 27721, 45957, 7154, +39716, 11686, 60477, 6537, 40282, 10204, 36909, 26992, 40739, 2248, 46096, +10619, 40715, 4051, 60243, 32574, 55216, 10079, 63976, 20357, 34708, 61746, + 3995, 55911, 12004, 60151, 1489, 54925, 19500, 59064, 23989, 63854, 21885, +53078, 30298, 2138, 56988, 33298, 6343, 23466, 49557, 35606, 8769, 20819, +51175, 28592, 60650, 7922, 55567, 13612, 30118, 62880, 17236, 39836, 25133, +48839, 21936, 7445, 45882, 9821, 38501, 2059, 65375, 24852, 3950, 33586, +37560, 24667, 51078, 1716, 36644, 56087, 5164, 54533, 38306, 57521, 7706, +59789, 1018, 44734, 32378, 50674, 20230, 2031, 28227, 41072, 5437, 51051, +10434, 23000, 62591, 32624, 8142, 31301, 47368, 36189, 6875, 24294, 57658, + 3608, 26362, 56856, 23017, 5842, 58127, 9188, 34658, 64045, 20848, 58877, +41310, 2387, 44702, 13464, 48214, 17582, 44082, 31832, 20856, 1582, 61369, +13955, 33964, 44995, 2981, 46483, 29850, 37929, 24191, 65320, 16297, 57964, +39032, 14536, 47477, 261, 25722, 62196, 5770, 44786, 25599, 46623, 1392, +42972, 29754, 9194, 58719, 27158, 37347, 12341, 21295, 57706, 36779, 15517, +49653, 38449, 18925, 42034, 20206, 57403, 39639, 15497, 46707, 30008, 50574, +13299, 27834, 57227, 19014, 65398, 30385, 17882, 48962, 14287, 41688, 15978, +45088, 18542, 42961, 23296, 46527, 19514, 44263, 35196, 3879, 61672, 14303, +32990, 37521, 18622, 42288, 30499, 15110, 58689, 18460, 39536, 24971, 55966, + 6882, 64949, 28517, 416, 59396, 37165, 4760, 43068, 10925, 64243, 39155, + 4598, 45387, 9964, 33217, 46406, 23187, 43530, 18087, 36509, 58092, 16320, +64118, 28187, 37712, 21904, 52790, 9668, 60392, 4048, 24916, 63272, 43308, + 2957, 23950, 55039, 19377, 31713, 36982, 25242, 43360, 1571, 44591, 24921, +39674, 11832, 48701, 25863, 40610, 30302, 60824, 6081, 54905, 35383, 22606, +40761, 4384, 34980, 57764, 24390, 52807, 18076, 31615, 58909, 25007, 52291, + 5505, 49435, 31842, 18947, 62117, 24280, 52405, 19277, 47625, 15951, 50472, +23734, 44442, 9199, 30682, 42806, 19288, 48721, 23357, 44900, 15614, 46578, + 6004, 50606, 11601, 44071, 9257, 37538, 49934, 13014, 43899, 28161, 62084, + 3882, 55109, 29902, 58472, 24397, 1099, 35411, 45978, 19692, 44253, 1568, +36277, 53367, 8201, 64858, 12438, 38874, 60783, 19461, 58081, 23246, 50336, +11303, 40000, 54753, 13025, 63787, 5525, 30375, 60793, 27897, 13976, 43272, +25273, 10085, 29961, 40966, 18140, 49220, 27447, 10968, 24511, 46536, 32970, +50065, 16287, 44817, 24781, 36185, 47484, 14077, 43259, 27928, 55919, 16222, +59677, 30196, 45143, 17196, 37916, 48833, 15676, 40057, 49788, 18819, 45138, +29025, 11436, 37460, 6365, 25486, 50079, 21378, 40526, 24066, 51423, 11930, +37052, 58359, 29755, 38041, 24199, 57373, 17039, 55457, 20716, 61726, 5694, +43250, 10839, 48504, 2492, 30268, 63415, 19724, 56487, 33131, 13554, 50514, +21248, 65438, 12241, 57464, 18073, 61929, 33091, 14305, 48455, 6685, 64668, +42013, 1880, 31880, 61750, 4714, 29817, 65183, 1407, 52565, 9804, 24072, +64352, 34866, 7975, 22165, 61677, 40050, 3278, 48427, 35987, 4901, 59147, +32819, 55634, 4247, 52653, 31063, 55011, 5325, 59983, 12593, 55996, 6797, +26562, 50205, 22507, 46177, 5594, 49453, 26645, 51586, 10163, 53218, 26087, +49565, 10907, 44821, 17282, 42820, 11857, 52475, 33156, 10195, 30376, 62376, +20423, 46662, 16737, 33347, 60934, 17566, 56072, 26742, 6787, 59963, 12391, +54099, 5963, 27285, 48149, 12067, 53386, 6823, 61364, 26826, 45345, 19163, +37882, 48887, 8526, 21817, 53213, 38234, 14776, 41776, 61308, 7286, 56396, +14202, 60052, 33542, 17092, 50513, 29118, 37301, 5509, 56949, 9796, 24408, +42336, 13274, 49471, 8592, 52582, 65034, 20370, 10304, 43284, 1551, 49018, +37448, 3273, 46269, 13096, 64674, 16151, 56589, 36760, 6394, 43422, 11953, +38875, 526, 43033, 30852, 3324, 58002, 27009, 54141, 14244, 63491, 7055, +36676, 9992, 64509, 27582, 36339, 29818, 39569, 26827, 54255, 15585, 28862, +60062, 16943, 52481, 21184, 42583, 15697, 44487, 6162, 40753, 62495, 16409, +29726, 64424, 10378, 56707, 15161, 28009, 45074, 21336, 52805, 458, 29504, +42025, 4898, 43420, 16306, 56306, 27619, 17376, 43416, 21914, 48609, 40414, +11124, 38706, 58499, 18972, 62651, 36085, 15468, 64077, 31203, 8729, 61774, +36650, 56725, 7251, 64657, 11675, 55449, 20656, 60081, 1330, 29115, 54511, + 5020, 51219, 10648, 39153, 4534, 49466, 11869, 63060, 28792, 9375, 61447, + 500, 33486, 62763, 3768, 56342, 22982, 54646, 31227, 62322, 12092, 55453, + 7282, 63634, 101, 56288, 25166, 7700, 49168, 10483, 50605, 5097, 43372, +30686, 8994, 34596, 49759, 18532, 54187, 34476, 27322, 53456, 5511, 44364, +10675, 38898, 54921, 29501, 2346, 33563, 39591, 24336, 50225, 5101, 47185, +35325, 23512, 53793, 32265, 17344, 55094, 14480, 40449, 23303, 45006, 16120, +47075, 26853, 33775, 51007, 4245, 25887, 58387, 35861, 6092, 22925, 54151, +25274, 12991, 46849, 27449, 8507, 23279, 44160, 27018, 7711, 25229, 47407, +35228, 27707, 34138, 51517, 32446, 12974, 55125, 17684, 64631, 12359, 55932, + 566, 32018, 41544, 5297, 34346, 55294, 1174, 60647, 26048, 49165, 17791, +41647, 55072, 15496, 33653, 52757, 2137, 57168, 8631, 24999, 42219, 186, +49194, 36632, 21081, 41929, 22157, 50366, 37806, 1384, 42298, 15482, 43520, +32472, 259, 31398, 50250, 13281, 33705, 56697, 32494, 12658, 30421, 64385, + 453, 27621, 45656, 21385, 50998, 28740, 9363, 56058, 4587, 62820, 13799, +50980, 16468, 36458, 54199, 17926, 63636, 26428, 38835, 23500, 42659, 32510, +56009, 18782, 64027, 27243, 13832, 53820, 35030, 23152, 32940, 39669, 9120, +29526, 51402, 22623, 57602, 20808, 65524, 14478, 55655, 38746, 13622, 41755, + 1072, 47168, 25583, 33158, 57839, 28598, 38903, 3631, 56755, 8914, 59660, + 3019, 34586, 65455, 5056, 35599, 46214, 581, 40059, 10853, 63679, 23116, +53729, 14596, 32191, 50716, 4201, 32884, 51369, 25336, 34227, 59783, 3854, +41679, 14815, 36662, 55707, 17369, 63418, 28469, 48100, 6087, 36570, 61644, + 814, 56643, 8960, 25796, 53628, 22952, 7469, 51342, 250, 49005, 32060, + 4243, 51730, 42246, 20695, 3224, 28512, 43404, 22386, 38333, 4002, 43000, +12904, 37358, 65095, 19316, 40495, 21834, 63740, 26176, 52884, 20056, 41050, + 2013, 46769, 34740, 23881, 53797, 13681, 27260, 41708, 15912, 43107, 1058, +47281, 19094, 38821, 28992, 46678, 19560, 38722, 16638, 42460, 64358, 18745, +40200, 28876, 62268, 13455, 39101, 52982, 27182, 14280, 60305, 25136, 7289, +46022, 17106, 42154, 21781, 60638, 23181, 6780, 41713, 59966, 15478, 52432, + 7149, 36870, 31273, 11793, 63803, 2963, 38394, 10300, 49850, 29412, 43357, + 8016, 58130, 12111, 56357, 35366, 6840, 60857, 14328, 38848, 49266, 16209, +45858, 29141, 44166, 9439, 33075, 61976, 19354, 54583, 31781, 62584, 15244, +60232, 32451, 57436, 20011, 9024, 64126, 3240, 20670, 60597, 40649, 1365, +36692, 24821, 44907, 16513, 39754, 59006, 17589, 65440, 14255, 22976, 47111, +29914, 5715, 33946, 58287, 3226, 28990, 47094, 6236, 37945, 25820, 40672, +29667, 51761, 18890, 63817, 29106, 10469, 56340, 2517, 63313, 9622, 30677, +60863, 22957, 57174, 18584, 55130, 21058, 63871, 6209, 54677, 26578, 1480, +40233, 58504, 5493, 44359, 34500, 52496, 11965, 39074, 3263, 46675, 35583, +26616, 45379, 19643, 42670, 23025, 64585, 27556, 3364, 45262, 31013, 696, +58793, 11506, 27304, 3017, 47430, 36712, 7534, 41274, 61119, 29155, 9744, +59763, 819, 54503, 26567, 63559, 1837, 40405, 8657, 48550, 27428, 36958, + 8237, 29150, 62443, 20710, 58844, 29604, 11570, 52980, 2359, 49281, 16481, +51157, 20281, 47295, 17837, 45532, 20627, 31874, 48719, 10475, 30589, 61336, +19168, 47498, 32658, 2361, 31143, 46816, 6987, 36575, 58009, 14231, 39892, + 5992, 49335, 12045, 52024, 22636, 60385, 27183, 10673, 49507, 35648, 12632, +34308, 59604, 13854, 29361, 50004, 18565, 32999, 62069, 2822, 47723, 34607, +29021, 45076, 17139, 53904, 38078, 13781, 23215, 54904, 31932, 60521, 15480, +53804, 17881, 62321, 27721, 57332, 22687, 6968, 48579, 11578, 45365, 1, +43667, 12997, 58703, 22839, 54887, 13381, 59140, 6669, 37299, 30799, 51170, +12158, 60598, 32931, 52566, 28418, 8950, 59474, 3412, 34378, 58038, 9244, +54414, 33467, 3942, 31819, 59654, 2214, 22665, 47391, 24802, 380, 58989, +44002, 3562, 35936, 51427, 21094, 61855, 12364, 52249, 3807, 35287, 58495, +24636, 10232, 47912, 22801, 63108, 16861, 55359, 40837, 19050, 50844, 21650, +61186, 24848, 3845, 63237, 33846, 27343, 48845, 3187, 30332, 43225, 22007, +45491, 29315, 9153, 56007, 1955, 63046, 14141, 58082, 38505, 1273, 41426, +10758, 43157, 2278, 39821, 10502, 42363, 1050, 38553, 53922, 22628, 44584, +36072, 8280, 21746, 43792, 56989, 7108, 29502, 62345, 22735, 8742, 45975, +36174, 29239, 57456, 12311, 39495, 63401, 10479, 38081, 24550, 63972, 11381, +59997, 17384, 54568, 14120, 59530, 5689, 44929, 13787, 38873, 51326, 15893, +44830, 34746, 25418, 46067, 17225, 40388, 5082, 47439, 8982, 39276, 23980, +46513, 14849, 41303, 62474, 17084, 27903, 47523, 22192, 9655, 24797, 63152, +18560, 54880, 14667, 65323, 6791, 34163, 58936, 298, 47828, 7441, 39147, +60159, 12613, 37365, 50260, 19939, 46361, 61808, 35432, 12766, 29527, 57022, +22539, 4226, 44594, 21967, 36466, 48055, 15065, 42501, 19950, 44612, 18051, +61614, 34725, 4870, 59616, 24923, 49582, 5473, 45017, 8934, 35501, 43666, +21074, 40209, 23001, 61993, 12703, 36033, 25657, 63274, 7641, 56151, 12458, +36508, 58963, 16376, 34234, 53857, 7528, 56041, 27350, 60320, 17560, 55415, +11433, 24107, 48255, 20436, 61536, 18931, 39259, 16895, 43366, 5638, 45744, +32705, 3461, 23022, 57400, 1508, 24594, 52316, 41787, 10633, 37288, 47051, +14920, 41772, 17571, 64845, 12343, 23857, 59982, 11226, 26266, 58968, 39768, + 6207, 43987, 10189, 41189, 410, 48360, 30278, 9048, 34409, 51671, 41248, +17553, 60941, 23421, 56791, 18909, 37702, 6237, 45886, 17572, 39726, 26112, +51954, 17872, 65209, 5025, 45797, 25825, 7881, 20096, 63357, 35777, 24064, +43088, 14734, 23006, 47485, 28214, 14134, 43534, 52639, 16029, 35055, 56094, + 7221, 64938, 35476, 12257, 21720, 32081, 63022, 13212, 37445, 989, 40989, +32309, 26345, 47458, 16305, 51383, 30477, 38541, 3979, 28760, 45899, 430, +25821, 58338, 13813, 42847, 6216, 45724, 32998, 15162, 51518, 17716, 37338, +25556, 63646, 10365, 55307, 817, 59753, 20504, 32867, 39935, 24111, 51089, +31416, 20258, 56263, 24412, 52338, 17828, 48723, 20664, 51650, 21979, 62856, +28597, 14136, 49597, 16591, 52939, 29778, 63071, 25688, 11774, 34958, 48482, + 4205, 37650, 52890, 25740, 2916, 50966, 6593, 44054, 19431, 32465, 53281, +14884, 51607, 18382, 44023, 23591, 45738, 7702, 47534, 22653, 36989, 31037, +55461, 4085, 24012, 60313, 28088, 11375, 58617, 4340, 54946, 12869, 62732, +35124, 25960, 58254, 11824, 35612, 60577, 22776, 10218, 37031, 55310, 13576, +59851, 36283, 49186, 6116, 41081, 23267, 42785, 19089, 50142, 13232, 28340, +41891, 18721, 53134, 14594, 29896, 46830, 22404, 9561, 55429, 6470, 17669, +53328, 24058, 51075, 14401, 33219, 51706, 16885, 57924, 6837, 30117, 60716, + 4957, 55716, 10984, 53557, 30718, 16395, 45481, 14985, 42248, 17556, 53255, +34416, 24226, 52095, 5131, 65047, 10964, 44544, 6760, 41788, 55622, 911, +29349, 42238, 23124, 50761, 1828, 26115, 49463, 4825, 25364, 43124, 20565, +45820, 8502, 39433, 26702, 34796, 63224, 312, 41881, 27526, 46942, 2116, +62784, 30876, 56230, 14159, 64237, 39038, 51133, 16795, 46929, 40511, 7153, +22209, 64529, 27245, 5870, 58268, 29363, 50361, 4406, 43947, 33798, 6515, +35542, 47143, 1470, 32866, 65195, 16629, 53251, 26818, 59260, 14819, 39102, +52966, 21107, 2804, 32032, 53798, 4241, 36604, 10009, 33054, 61590, 28258, +33996, 64158, 4008, 48522, 11666, 43509, 22197, 40642, 18342, 53453, 31188, +49447, 4826, 44488, 11295, 52063, 32043, 65429, 2737, 40404, 59205, 23890, +10025, 30999, 46750, 14897, 41965, 17632, 49369, 28834, 55741, 42357, 8410, +30619, 55348, 23992, 57514, 15297, 64784, 9307, 37369, 1228, 62606, 20520, +56851, 42014, 14705, 60798, 37219, 7816, 47759, 26983, 59101, 16829, 56275, +37998, 207, 60147, 7412, 53406, 21154, 49532, 17903, 37813, 24531, 51506, +12038, 49100, 7644, 36995, 4004, 45254, 11860, 47265, 5190, 64827, 28519, +58150, 4482, 46499, 12895, 43206, 34053, 2078, 58685, 10228, 46901, 4590, +42605, 28728, 61165, 15265, 54774, 31674, 10496, 60347, 34772, 23987, 62053, +13838, 56480, 1799, 27996, 42445, 4905, 48675, 34944, 924, 29906, 65177, +34640, 2944, 62265, 9633, 26174, 45935, 34271, 6424, 36396, 50927, 18739, +37750, 26655, 49623, 30295, 14452, 44506, 3544, 48351, 28203, 2549, 44179, +51275, 24910, 4300, 42467, 31153, 2119, 27521, 55697, 11017, 61127, 1129, +54307, 23925, 38528, 56767, 10036, 61537, 34935, 24400, 51794, 5036, 62666, +34357, 25917, 38385, 31843, 8195, 43814, 373, 38529, 63460, 12118, 48815, +34959, 26095, 45950, 20631, 38548, 25110, 47230, 35734, 3487, 51225, 31678, +56909, 1377, 64370, 31105, 15378, 61460, 18525, 48591, 25468, 53635, 18933, +58533, 30827, 16920, 33117, 54439, 14949, 61546, 18132, 32877, 44003, 14676, +64019, 39242, 11866, 59353, 15418, 31881, 64726, 3280, 47516, 13152, 31412, +57073, 8338, 29987, 53909, 23164, 8734, 34626, 50293, 24296, 11476, 31586, +62104, 9563, 26383, 60104, 33656, 2383, 42837, 52960, 24304, 9536, 36280, +57240, 15311, 54756, 27685, 61424, 18082, 56064, 12194, 25033, 48104, 30850, + 6763, 32638, 46035, 4728, 24724, 61337, 43725, 12361, 38023, 28616, 50034, +26061, 44492, 3087, 50834, 9231, 25146, 42412, 15625, 60867, 1832, 55357, +10558, 58371, 2449, 38686, 21654, 56683, 17844, 61293, 26560, 6718, 36048, +53314, 21088, 7085, 50088, 36707, 63129, 6266, 54216, 26209, 57782, 9465, +39005, 5252, 19884, 50932, 39974, 14865, 46468, 7791, 49268, 33523, 22397, +49723, 28146, 40674, 7683, 32006, 10927, 49317, 33007, 19879, 53124, 30126, + 1581, 34854, 51107, 8558, 25858, 44871, 20184, 42050, 12994, 44420, 4497, +32139, 61617, 6477, 34761, 63922, 22104, 55480, 18282, 64484, 17182, 58815, +21627, 31363, 36718, 8172, 38105, 32847, 26036, 56262, 5851, 61468, 26507, +37513, 31961, 19172, 54314, 15907, 50202, 2306, 30516, 40787, 20898, 46524, +19668, 43545, 15756, 33123, 48512, 26019, 35830, 59219, 20510, 61892, 13008, +26938, 57656, 41797, 11655, 24835, 52188, 19587, 39672, 58385, 17492, 64537, +20951, 55942, 703, 32938, 65306, 9174, 41721, 1728, 53924, 32768, 64473, +15940, 55612, 33350, 20315, 7616, 65113, 32826, 53933, 16606, 62242, 37835, +19581, 44650, 28586, 36988, 11502, 46965, 3862, 22260, 49564, 30816, 2663, +57357, 10840, 40048, 17271, 51223, 2224, 58180, 40457, 62935, 15680, 58559, +25301, 6124, 41974, 31487, 1962, 65275, 11674, 53144, 13944, 62805, 7265, +23355, 60327, 28152, 10007, 22549, 47993, 35925, 10577, 46072, 2703, 41484, +10172, 37569, 274, 46559, 34555, 4754, 61034, 39791, 9487, 43412, 4507, +39191, 58247, 7178, 55042, 30215, 17913, 51678, 971, 37906, 50455, 18458, +42429, 21505, 52718, 37934, 16614, 50635, 36535, 14609, 41348, 58997, 20660, + 1260, 35611, 54428, 4885, 37690, 29145, 53801, 15452, 39241, 54656, 20128, +11385, 35244, 62754, 19642, 31256, 47976, 2169, 42136, 13195, 44338, 22348, +51530, 35237, 2967, 62812, 22109, 56152, 19438, 63885, 35269, 7780, 27440, +56546, 18179, 59360, 7256, 63281, 14566, 55639, 16936, 35512, 54184, 19154, +47009, 21016, 36506, 28499, 41914, 23082, 33246, 64326, 9280, 34834, 47126, + 684, 41252, 57461, 21995, 10560, 33153, 61784, 27013, 884, 22150, 43913, +29205, 3247, 36845, 23408, 63597, 29800, 59559, 33590, 2698, 64235, 35019, +27344, 39376, 3349, 53837, 13202, 58984, 17793, 54794, 36414, 65016, 27059, + 4959, 57164, 10188, 39394, 63533, 12442, 29499, 40403, 65352, 11445, 54586, +31793, 62364, 19477, 39107, 54274, 13738, 48406, 28726, 2831, 43182, 11312, +46462, 26439, 39194, 7405, 34581, 60609, 16577, 55155, 19122, 63489, 15970, +35592, 47671, 15001, 44885, 7237, 65293, 38868, 12771, 59450, 23378, 35889, +57736, 7686, 64005, 893, 52105, 8067, 49739, 3826, 39985, 9560, 50775, + 7277, 45501, 16466, 39876, 49992, 9515, 21682, 56349, 40543, 13448, 48764, +28408, 1521, 50524, 8813, 31394, 41202, 22858, 47730, 15130, 52272, 23334, +59270, 20953, 8287, 27369, 42483, 5874, 40328, 59619, 29485, 38885, 20891, + 8904, 49904, 33884, 12421, 58790, 4151, 52398, 21110, 59417, 26058, 63523, +32981, 7931, 45033, 23002, 37129, 27192, 59405, 31298, 12046, 44428, 15227, + 4629, 27497, 48825, 19191, 52117, 29492, 60245, 18283, 53983, 23199, 43827, + 3057, 41759, 18668, 49985, 33552, 12277, 41793, 63355, 33756, 7571, 26379, +53822, 21845, 56232, 27244, 60486, 22506, 57721, 28771, 11870, 50557, 13716, +26757, 48625, 19116, 52595, 30936, 11503, 46166, 35328, 3501, 47378, 32379, +61790, 27747, 5595, 57422, 10221, 59172, 6609, 25554, 60780, 2976, 24442, +65327, 4739, 25877, 47748, 28718, 61352, 18549, 48263, 21732, 44689, 3714, +49374, 8543, 30182, 61083, 28759, 49200, 638, 45609, 8146, 34841, 63930, +20231, 52262, 3800, 40821, 9180, 46721, 19820, 36015, 45384, 12598, 42929, +11306, 49834, 29993, 46757, 927, 42698, 14037, 46267, 23991, 32480, 40445, +26960, 48811, 1088, 59874, 7967, 33012, 50290, 14091, 61878, 7195, 48631, +15745, 43945, 28391, 14262, 54808, 33305, 13370, 50486, 36949, 48842, 12998, +45436, 31690, 51762, 16526, 59956, 42442, 13376, 46399, 1435, 44301, 11524, +25668, 52897, 22815, 6005, 58361, 14149, 60910, 24817, 44770, 4712, 42889, +25689, 2590, 21545, 51895, 40868, 17860, 44607, 21290, 36315, 23876, 49006, + 4228, 22356, 47133, 27898, 2295, 24500, 50813, 10894, 26880, 42040, 18907, +57523, 38387, 16469, 59420, 30186, 39, 53403, 28055, 51332, 2562, 41677, +11179, 43946, 649, 45607, 9690, 28031, 57261, 20677, 53641, 24042, 176, +43114, 33577, 5776, 47210, 17973, 44945, 14471, 38717, 26769, 62735, 29766, +55626, 16862, 64816, 22771, 38365, 25346, 53056, 2640, 32197, 63176, 33489, + 3918, 30855, 61659, 7488, 43988, 33883, 15266, 35736, 49140, 13489, 61443, + 7144, 31162, 39197, 5506, 35893, 48037, 31396, 52009, 19195, 57477, 23771, +10612, 52300, 907, 58059, 41884, 24045, 6535, 48747, 25258, 39189, 13808, +40893, 5679, 43100, 16136, 37341, 55643, 18104, 64060, 13120, 49204, 1015, +41651, 65484, 24416, 54100, 47490, 34207, 8962, 36807, 3624, 39630, 10207, +46637, 7750, 39488, 15483, 56916, 31630, 58634, 65, 40398, 55973, 21316, + 2536, 51866, 38178, 59169, 4240, 42642, 12331, 38801, 6522, 43571, 14242, +39301, 64134, 20119, 37200, 57340, 2583, 64635, 35382, 20918, 62155, 24845, +17350, 51073, 28654, 8954, 21240, 45237, 34721, 23122, 49029, 28455, 34239, +44525, 11112, 39622, 49007, 12208, 37954, 54804, 9835, 43576, 6856, 41319, +12526, 65037, 17107, 56907, 33032, 21603, 47896, 4830, 40752, 22318, 56063, +17984, 59418, 25564, 10176, 37796, 30480, 62031, 15743, 56501, 31623, 60226, + 8366, 28233, 54657, 1775, 38648, 16781, 58638, 20047, 64590, 22969, 55035, +34645, 2152, 58202, 6595, 64898, 11951, 31349, 37761, 27583, 63442, 5938, +52984, 29925, 39284, 23790, 56274, 3127, 60216, 39810, 24001, 6036, 62957, +31092, 1851, 24520, 56455, 5541, 64607, 10358, 38264, 8102, 30687, 61603, +18642, 54650, 17003, 56722, 41649, 10149, 32739, 51713, 19784, 48072, 29716, + 8988, 35558, 64006, 16026, 52763, 30904, 45499, 9112, 33850, 62176, 2775, +54733, 6680, 57768, 16075, 60623, 33584, 9206, 56976, 32641, 59280, 5588, +35123, 64876, 1611, 46598, 8825, 27265, 47651, 5848, 36838, 61487, 14888, +42122, 18788, 45989, 23522, 51852, 20649, 59716, 23031, 53284, 33912, 2857, +40185, 11258, 48163, 29368, 51969, 16873, 63363, 11498, 55928, 28076, 32904, +58505, 17190, 36960, 13223, 23243, 46305, 34013, 144, 60505, 12037, 34829, +58778, 22124, 6653, 42935, 53792, 17838, 34619, 54696, 16700, 61055, 23555, +57349, 3436, 53642, 26347, 34895, 57898, 18120, 63068, 26119, 9595, 61237, + 541, 45303, 13663, 49725, 36534, 17422, 45581, 27508, 14026, 63941, 40688, +16132, 53021, 21919, 64762, 18946, 57428, 12051, 53666, 1673, 28091, 42221, + 6008, 45823, 20299, 54894, 15977, 35630, 7068, 30664, 16736, 55742, 22763, +64275, 28435, 56116, 22184, 34069, 62283, 19757, 51291, 24613, 9333, 27804, +45747, 22323, 8042, 32894, 46239, 24024, 11408, 20661, 49252, 30228, 63892, +18094, 47908, 20673, 52744, 3760, 24211, 45918, 7264, 23107, 45218, 27887, + 8570, 51490, 419, 37351, 56920, 13055, 65175, 36698, 56261, 12166, 52910, +14991, 39128, 1638, 64164, 20467, 52014, 27929, 17322, 56073, 29426, 13885, +50047, 30684, 57633, 20293, 52006, 196, 30901, 40032, 13549, 63471, 35990, +18773, 52621, 8756, 29510, 41563, 5004, 53152, 29164, 57589, 6068, 23601, +45619, 26908, 714, 21425, 53691, 39955, 18527, 59764, 24243, 52022, 5492, +37623, 10903, 41543, 7961, 27963, 51597, 20539, 47196, 22037, 39330, 56928, +13080, 49329, 20066, 44135, 25635, 166, 59332, 11150, 34291, 50739, 22542, + 8268, 48108, 29643, 38915, 16302, 60586, 43967, 17802, 40576, 23108, 33621, +57134, 24420, 52564, 4551, 50167, 26929, 37567, 6421, 22349, 62595, 37089, +12149, 43053, 22, 40092, 56695, 14769, 30404, 48383, 8435, 61458, 17022, +58197, 24940, 13797, 46981, 18709, 42057, 26760, 43919, 13631, 52404, 39075, +18408, 46270, 15435, 30166, 45233, 17089, 49841, 23610, 35076, 60970, 21652, +54812, 20332, 32956, 49207, 4793, 54228, 12116, 62111, 6034, 39544, 12700, +49556, 6635, 64297, 19415, 59968, 33599, 21599, 62188, 8582, 32630, 40141, +26308, 36816, 3401, 49974, 9113, 54039, 2495, 42652, 59701, 5574, 28529, +51254, 19906, 44756, 29942, 9116, 36156, 55239, 24293, 10812, 45377, 522, +26686, 46916, 5407, 42433, 12061, 44523, 29717, 10145, 45449, 2175, 42786, +13226, 53322, 34531, 16755, 39507, 24810, 60205, 3833, 30885, 63541, 8150, +54711, 33303, 3156, 32071, 60287, 31, 42576, 8046, 47974, 30026, 45923, +17399, 40029, 62353, 14493, 56362, 26501, 38214, 9252, 33086, 57543, 22370, +61641, 39554, 1437, 45246, 13541, 43166, 14885, 49337, 947, 30482, 42723, + 4466, 63928, 32868, 54614, 14637, 64862, 37724, 59518, 15229, 55212, 31043, +61306, 34852, 8310, 28098, 51497, 1757, 62545, 25642, 35424, 55434, 17397, +60353, 32585, 14390, 55875, 33095, 15417, 47942, 26997, 6702, 42939, 23306, + 2251, 26352, 41783, 4165, 62712, 23938, 53515, 13665, 47078, 4994, 61924, +33141, 834, 42272, 63557, 22821, 3114, 34518, 46397, 15068, 33411, 58420, + 6585, 51540, 24863, 1666, 58829, 26559, 35189, 65274, 16517, 43853, 20794, +46954, 17778, 50461, 33988, 8032, 64355, 32955, 44621, 24963, 5304, 48085, +13356, 41912, 15075, 44976, 21691, 52525, 18661, 60108, 38558, 13682, 42338, + 9773, 55274, 4784, 24854, 42887, 3329, 57844, 10102, 35352, 47768, 21201, +45509, 26948, 9676, 35541, 64956, 17759, 55922, 4268, 51373, 33765, 11340, +30557, 55312, 13810, 48343, 2099, 45229, 20171, 40887, 33424, 8812, 61155, +29578, 49661, 1934, 26817, 55520, 23367, 61983, 20626, 33685, 50805, 1760, +33112, 40343, 23323, 37616, 736, 49537, 29834, 34807, 59850, 10534, 51814, + 1059, 37549, 25747, 3403, 63006, 7999, 35693, 55284, 11856, 58476, 33841, +13200, 51731, 3633, 43775, 10854, 45240, 8036, 25807, 63712, 29523, 38063, +25291, 33397, 57147, 27450, 36977, 22076, 41946, 30898, 8866, 50878, 3957, +38251, 25335, 58902, 1649, 53400, 20118, 65036, 22358, 40724, 24356, 47179, +30870, 11944, 35153, 48110, 10682, 55958, 4158, 64386, 26733, 49645, 14654, +39111, 57838, 20180, 64768, 39618, 14821, 52366, 25760, 63665, 16434, 40074, +62303, 19196, 55144, 21371, 48893, 3682, 43803, 28389, 50565, 11096, 37178, +28081, 47474, 21771, 38405, 18978, 42182, 51722, 13081, 28046, 47098, 17776, +54429, 35238, 2838, 26884, 59707, 23698, 8814, 50852, 33598, 3757, 60987, +28160, 51417, 2877, 46219, 11285, 19952, 59065, 32946, 53303, 6661, 59781, +35922, 26506, 50732, 11080, 47434, 14233, 39844, 5254, 49394, 30715, 3620, +26618, 42686, 6121, 47815, 638, 19582, 55713, 39932, 15653, 42461, 30890, +10315, 49910, 8881, 42095, 1226, 51676, 39468, 5350, 41711, 63502, 19598, +39297, 60022, 16555, 54465, 31941, 60895, 19542, 48344, 31852, 8687, 33105, +41282, 19117, 43660, 15092, 37542, 58158, 20954, 7605, 35907, 59499, 25526, + 8911, 62311, 37963, 17799, 44094, 11909, 46724, 29612, 41240, 12782, 44898, + 3092, 51067, 12144, 62999, 1211, 40611, 14051, 58611, 41626, 17431, 52526, +11204, 61171, 30020, 34498, 65500, 3745, 57416, 29967, 61931, 2542, 43463, +28969, 4443, 62953, 23871, 45180, 19052, 36703, 62189, 15520, 53318, 16627, +31346, 64011, 17893, 53914, 5438, 62588, 30390, 52885, 1234, 40769, 21277, +43234, 29067, 7331, 58308, 36409, 3616, 43282, 19064, 60862, 29431, 11325, +65103, 21992, 48560, 15004, 42732, 18163, 58632, 39009, 5616, 46257, 11252, +48997, 7218, 26536, 62542, 12839, 55244, 5435, 56309, 32175, 11550, 64445, + 5780, 28145, 45941, 22513, 64038, 19823, 58045, 30562, 41342, 21774, 47985, + 576, 43122, 27325, 5146, 62750, 29189, 40206, 19258, 65506, 17695, 56777, +40082, 21920, 10467, 57635, 1516, 43319, 10206, 48433, 3534, 52275, 13997, +55721, 43653, 23931, 56906, 14599, 49460, 17694, 43480, 12164, 42033, 6107, +48098, 11090, 60261, 6682, 56604, 26343, 63856, 20837, 38186, 24188, 42641, +15905, 46732, 1311, 62579, 29848, 4817, 50991, 30773, 8462, 60246, 36049, + 1942, 33080, 53113, 5858, 24664, 46771, 8053, 37477, 24456, 57155, 14150, +64896, 6748, 54939, 17787, 61977, 11981, 55862, 4633, 61491, 10061, 23003, +57192, 36084, 9311, 62983, 31569, 19880, 61781, 33405, 6376, 49769, 29977, +37719, 16689, 47619, 14987, 42773, 18757, 41222, 23520, 52889, 42963, 25611, + 9699, 27515, 42150, 24030, 11980, 56738, 17629, 61347, 35229, 26382, 59277, +20543, 36967, 11884, 35634, 52446, 13611, 62990, 25521, 35894, 45659, 24578, + 4783, 59598, 19015, 55092, 34112, 27120, 61847, 29742, 48557, 25334, 11678, +58903, 23832, 10116, 53766, 3915, 33779, 45515, 9368, 47377, 6104, 43863, +14177, 55826, 27408, 58343, 6378, 60118, 26196, 55198, 9570, 23932, 46979, +28565, 48545, 15872, 53276, 41740, 21966, 5258, 55338, 27147, 60492, 21278, +54325, 5627, 61565, 19593, 55714, 34636, 28394, 37597, 24666, 60711, 31313, + 3314, 29036, 49646, 4808, 39167, 16860, 53182, 10709, 27548, 50549, 23681, + 9093, 35022, 47641, 12873, 53116, 36704, 16641, 53816, 536, 58910, 30548, + 8600, 48151, 26587, 34376, 46398, 4657, 41207, 11946, 38043, 15522, 42415, +17026, 44967, 13521, 59525, 9457, 63719, 25270, 39604, 16964, 62783, 28250, +52226, 9070, 35248, 54806, 27925, 554, 35870, 53467, 4038, 45144, 13793, +31112, 65280, 19414, 41160, 17671, 60141, 37704, 18735, 46345, 20085, 47691, +15463, 41157, 52410, 19555, 37016, 53441, 3688, 40608, 11837, 45504, 7225, +49533, 11167, 52707, 23939, 64198, 15960, 53765, 41267, 24502, 9317, 55842, +31725, 952, 48642, 33905, 3060, 51132, 42380, 18251, 31579, 65141, 22707, +32390, 60803, 25891, 38217, 1159, 35100, 9797, 31546, 45311, 5115, 55161, +28047, 60971, 18693, 57468, 27231, 37795, 21762, 41973, 19326, 44906, 1693, +52735, 7454, 60998, 11396, 54105, 35481, 23324, 42245, 12579, 33030, 37206, +18368, 46333, 27868, 17029, 51147, 19736, 38598, 28923, 59427, 15441, 33345, +64028, 11542, 29747, 46679, 19508, 38439, 25871, 45069, 2005, 42335, 15760, +40745, 24879, 46584, 34322, 5979, 50294, 24886, 38615, 4903, 51273, 10793, +53330, 36898, 12846, 57024, 575, 64570, 24905, 55124, 4987, 63337, 10459, +59849, 6255, 14771, 64778, 31955, 54855, 2623, 63033, 33355, 5390, 44937, +23671, 2299, 50273, 8970, 31969, 62178, 23439, 57639, 18281, 44775, 31462, + 9771, 57101, 14111, 65224, 37007, 13337, 43526, 6923, 47416, 2752, 37646, +10801, 20427, 65372, 36761, 16044, 46551, 34875, 29335, 50173, 14600, 30963, +57954, 17260, 36521, 29811, 50911, 41, 40685, 12985, 43118, 30959, 2303, +32267, 50534, 39503, 3667, 60346, 10734, 37716, 1797, 30189, 49549, 28967, +42452, 2705, 36881, 9451, 38431, 32050, 15345, 48444, 25343, 10290, 49966, + 5385, 46080, 9016, 36386, 55521, 13243, 31901, 63181, 20479, 49141, 1405, +44211, 36042, 18944, 33885, 56107, 16656, 27044, 64231, 22886, 10287, 49498, +29356, 39053, 14780, 50039, 27833, 37950, 1491, 60989, 12475, 57226, 25464, +55378, 23183, 58975, 3934, 56977, 28364, 52242, 23886, 48572, 14434, 53538, + 299, 50777, 34160, 6499, 38435, 25624, 49103, 5043, 40181, 58186, 15822, +31296, 63361, 24896, 51991, 9426, 33960, 51336, 2832, 53704, 30859, 5093, +57541, 9459, 36362, 27802, 59483, 7305, 24028, 44377, 12988, 25569, 61150, +18984, 55589, 27717, 38239, 18024, 61760, 29267, 6239, 33134, 37858, 8476, +21225, 57949, 37094, 15351, 50408, 39011, 25045, 12477, 59042, 32243, 6851, +52354, 37364, 5412, 53869, 12355, 40942, 7849, 62433, 20793, 58452, 28128, +64854, 16030, 41561, 33289, 8214, 31747, 45152, 13013, 52697, 476, 62852, +13720, 49536, 16452, 41185, 14783, 44066, 18904, 41064, 29133, 6372, 56459, +16741, 59825, 48102, 10543, 58293, 3658, 53476, 34233, 6888, 58578, 11659, +48685, 84, 30990, 51040, 4769, 39077, 52458, 1267, 32166, 59647, 5213, +30147, 57780, 22312, 51177, 19932, 53256, 1442, 60757, 31078, 15360, 58493, +18614, 44133, 22705, 42100, 15618, 25379, 47177, 21095, 43312, 31920, 8250, +33021, 45557, 30205, 36908, 26294, 47707, 50257, 4161, 39321, 19655, 43721, +18469, 38884, 52772, 15432, 37530, 58146, 16738, 40885, 53669, 1045, 48724, + 8429, 40123, 2045, 53291, 20449, 32834, 50285, 7646, 30431, 54165, 22800, +63294, 21564, 58299, 22544, 53927, 42527, 4054, 27292, 53119, 2062, 60682, + 8176, 24681, 62496, 1380, 39870, 26190, 63270, 11077, 23768, 64890, 21795, +53661, 18153, 47792, 22020, 63865, 7230, 29044, 54243, 17842, 32128, 64699, +20161, 57282, 12685, 63105, 15508, 53778, 23838, 64211, 16968, 57267, 41804, + 7370, 32569, 60057, 21522, 57092, 18879, 51604, 15512, 39389, 23143, 45964, +11982, 43474, 24534, 58374, 13928, 62513, 6650, 45420, 220, 49981, 37838, + 5969, 40975, 57837, 25695, 7448, 60735, 32247, 6337, 65381, 17339, 52420, +23495, 39583, 19480, 43380, 1965, 48618, 19722, 46329, 31823, 8976, 36605, + 2596, 32199, 41466, 20770, 45022, 26548, 15349, 55864, 20346, 62225, 17167, +44535, 18891, 33830, 47772, 10454, 39469, 6809, 35358, 57910, 26402, 15774, +42602, 20958, 45740, 28041, 41885, 25438, 64888, 3200, 37038, 29784, 62926, + 2102, 57411, 38708, 8615, 50695, 35086, 4584, 59494, 33519, 1834, 36173, +56819, 19076, 60212, 29966, 51314, 2073, 32593, 61880, 6654, 22214, 60727, +29464, 37801, 15706, 63122, 13484, 24593, 46521, 21269, 44902, 18228, 50657, +29616, 45987, 11533, 42101, 2720, 51922, 20577, 61964, 22461, 51424, 3666, +39957, 20490, 46272, 30858, 52021, 4366, 57671, 29225, 59592, 26923, 54655, + 2863, 61864, 22139, 33797, 38535, 2265, 25790, 41598, 20847, 42910, 14340, +64106, 25065, 32300, 42170, 22401, 56238, 41129, 18871, 60121, 26051, 16952, +62427, 41062, 12838, 49644, 36727, 14281, 46032, 6296, 65412, 12673, 43435, +17308, 45149, 35200, 2356, 49544, 10338, 55330, 1225, 65219, 39758, 4417, +59206, 10108, 53995, 19904, 58740, 21717, 11621, 50832, 130, 29114, 20811, +57065, 12615, 58812, 8473, 51397, 13002, 31361, 65137, 8059, 30569, 45926, +23049, 13079, 33508, 38069, 26239, 64465, 22624, 36231, 60842, 3341, 39203, +27524, 47018, 987, 38380, 12451, 41707, 14463, 44966, 7473, 33215, 56682, +39424, 17116, 43772, 20360, 49102, 38358, 18054, 51619, 11928, 44899, 3390, +49320, 39063, 15231, 46071, 5215, 62140, 10136, 52887, 35909, 19707, 45828, +13115, 40375, 50262, 8006, 45064, 26787, 39414, 7131, 33529, 40679, 7763, +29591, 50403, 493, 23764, 63629, 39442, 2196, 41585, 11234, 44217, 32660, +64943, 7140, 59136, 2043, 54486, 33047, 7832, 31002, 41396, 20072, 53570, +24799, 59046, 31770, 15477, 48548, 30510, 1742, 34504, 46534, 18311, 41650, +54251, 20678, 45680, 11401, 43805, 5704, 51662, 13296, 64407, 14470, 38774, + 7041, 62341, 21658, 55104, 27434, 61449, 6188, 57676, 12306, 64289, 41100, +10214, 46439, 1507, 52875, 10785, 63851, 7537, 29323, 60622, 20675, 56470, +23065, 1028, 36192, 59865, 8026, 63619, 10780, 54924, 527, 49905, 13625, +45129, 17468, 48781, 15154, 50396, 32888, 16967, 47422, 30508, 14904, 44575, +16264, 46616, 25037, 50328, 13388, 45697, 3259, 42354, 17302, 46756, 14360, +43510, 28596, 54368, 9472, 44349, 4405, 47451, 19569, 40756, 55658, 9316, +60044, 2026, 57758, 35389, 4392, 24705, 53165, 19166, 47013, 12431, 38928, + 786, 47385, 26214, 63729, 15330, 55501, 25551, 10017, 38536, 27902, 36141, + 9432, 36987, 5348, 31161, 47438, 16244, 44983, 8763, 65249, 28784, 54516, + 7266, 62447, 30136, 49121, 9496, 44947, 2810, 60860, 10572, 35872, 7245, +47607, 13475, 43483, 34966, 8924, 22717, 56472, 24181, 8480, 62669, 30763, +39392, 28231, 36843, 26039, 56305, 7705, 64291, 28004, 32830, 61110, 26741, +48030, 31427, 16956, 50211, 26324, 40609, 28935, 46339, 2166, 39140, 56774, +18027, 62538, 37734, 45832, 16405, 41605, 21637, 46273, 27377, 60340, 487, +41235, 27054, 54778, 3796, 61100, 29277, 56915, 17228, 45493, 12328, 49581, + 6727, 25305, 45286, 16732, 61985, 11000, 58720, 25326, 53086, 4396, 56963, +19479, 61069, 23657, 12668, 31528, 62838, 9535, 56144, 31978, 5454, 47086, +27762, 60194, 19845, 55187, 33168, 7308, 58594, 27188, 37048, 25360, 39609, +31666, 4277, 58779, 23858, 62923, 607, 23276, 56003, 35121, 4131, 51475, +24395, 58584, 17795, 56095, 43214, 14093, 33488, 46116, 9739, 27395, 54540, +22692, 62521, 28089, 71, 24410, 47282, 28924, 40433, 15921, 60820, 26868, +54074, 3525, 47042, 35391, 8533, 38694, 12078, 60507, 21792, 55386, 20469, +63807, 11676, 51708, 2749, 30351, 36130, 4279, 56104, 21325, 63075, 26306, +36880, 32408, 27821, 50698, 33452, 25915, 47688, 12770, 42964, 17521, 46643, +29110, 37041, 3066, 21791, 59855, 30800, 39072, 23450, 32901, 41027, 24952, +51143, 2431, 45435, 12354, 48733, 29135, 43634, 14506, 47482, 24312, 39977, +16049, 37122, 23209, 56810, 31130, 53355, 8336, 43459, 28360, 5156, 62003, +35657, 133, 64644, 23362, 56323, 10174, 60545, 7748, 40243, 28549, 55473, +12002, 63581, 26830, 54916, 4000, 40901, 15941, 49270, 20361, 53516, 27367, +58284, 447, 31137, 36606, 27237, 40078, 31505, 16994, 64075, 33703, 7388, +57274, 31156, 60135, 18019, 56206, 30906, 10198, 32455, 44057, 6476, 36626, +58798, 17729, 65499, 20961, 53306, 22489, 63156, 39307, 10332, 57895, 29628, +52278, 15033, 47298, 19315, 43431, 24152, 1033, 36532, 56834, 19151, 51674, +34820, 27442, 65468, 24202, 33842, 57636, 2723, 55410, 29061, 46085, 3104, +39814, 52923, 25761, 329, 53955, 10311, 48544, 4106, 30457, 50751, 13961, +47135, 5607, 36599, 12140, 37984, 7510, 60137, 35001, 13544, 61904, 5378, +23105, 63837, 29462, 6880, 41211, 32183, 8071, 29627, 54190, 1698, 63741, +29991, 4982, 35409, 49784, 19252, 46992, 15999, 39480, 10759, 43439, 6998, +50572, 4332, 58548, 28432, 34153, 57981, 8870, 52328, 23190, 44318, 15165, +40582, 18694, 47778, 31023, 38719, 160, 35277, 49310, 5085, 41607, 26014, +36656, 15253, 64400, 33349, 7815, 31667, 42210, 13256, 24674, 53209, 35099, +11450, 48795, 1285, 51325, 13672, 44064, 33476, 9812, 30964, 46423, 36056, +11647, 19010, 61791, 21122, 44661, 1128, 46884, 25946, 4589, 37708, 59670, +17380, 56424, 36591, 16509, 48754, 6688, 52865, 31975, 57748, 20902, 9196, +52362, 31458, 5711, 48405, 17210, 64458, 14845, 28261, 61409, 22144, 51718, + 4084, 43609, 8885, 45521, 27382, 38282, 24246, 62845, 14455, 57993, 41036, +16503, 46738, 29806, 8528, 59766, 3441, 56415, 10094, 60696, 588, 35751, +65317, 4452, 51898, 23756, 8588, 55385, 31551, 51343, 27758, 5208, 58502, +12070, 54983, 3806, 59632, 14061, 36563, 27341, 54217, 19987, 64490, 6208, +55178, 34846, 3619, 58241, 33761, 61355, 10109, 39443, 5985, 25861, 60382, +19221, 40127, 51436, 13927, 22679, 54028, 33201, 6556, 31377, 42223, 19905, +31998, 65216, 14992, 23393, 47761, 31426, 7436, 35245, 21805, 64639, 31570, + 1672, 62637, 34457, 8695, 35632, 50961, 17634, 64397, 14164, 49385, 8235, +43979, 13528, 49064, 39566, 21848, 5756, 27687, 42405, 7782, 44717, 21705, +58199, 19041, 61450, 28642, 2603, 47922, 7792, 46686, 1071, 44314, 12180, +25028, 51395, 23537, 369, 40453, 31767, 5225, 59379, 13959, 55195, 33667, +15411, 28847, 41112, 8802, 16978, 53925, 4191, 49117, 9682, 26811, 44989, +19406, 49897, 15032, 58701, 32146, 16681, 46852, 34783, 22610, 59477, 15971, +63236, 39829, 19182, 42619, 23410, 53103, 22153, 58972, 20785, 52147, 29355, + 2545, 54541, 18439, 48416, 36411, 14404, 53074, 23724, 55367, 15377, 60661, + 5543, 34272, 50043, 17465, 37554, 57342, 21925, 10038, 55574, 5931, 62510, +20596, 52991, 24261, 63731, 19984, 31771, 38980, 15932, 47312, 18729, 42267, +31753, 2363, 32687, 56046, 5626, 63766, 28583, 8567, 51746, 26310, 64215, +17887, 54962, 13861, 59635, 783, 43348, 18945, 54065, 22670, 55985, 4805, +61394, 36164, 1997, 30258, 61038, 19546, 57381, 16960, 64461, 21131, 54559, +27335, 57560, 6319, 60818, 28737, 47267, 31564, 9237, 32722, 65451, 11363, +35230, 61106, 22847, 6867, 49376, 32040, 4304, 45193, 12171, 40420, 18055, +42902, 12520, 37574, 63771, 17857, 49855, 36009, 22680, 44482, 9514, 32880, +50790, 2320, 42824, 17500, 40423, 19607, 61572, 35683, 3691, 57044, 9491, +43890, 32138, 7236, 28938, 61795, 353, 38289, 48868, 18070, 42303, 22673, +40673, 20760, 45536, 18026, 31207, 40635, 15423, 60027, 39980, 16283, 43163, +13092, 45654, 19559, 35041, 46803, 16009, 48993, 22436, 43497, 57694, 8730, +37735, 4249, 32031, 46520, 17642, 27589, 51474, 22441, 7084, 27988, 52230, +21477, 63379, 36456, 1197, 47783, 10565, 25199, 57061, 42952, 9746, 49813, +26444, 48495, 3813, 52394, 38027, 1135, 53237, 35669, 4931, 58842, 19654, +56900, 38156, 10239, 45688, 35767, 13135, 25329, 59778, 23360, 11268, 45551, + 4980, 54177, 20475, 61425, 23424, 55895, 308, 25864, 63236, 32371, 54398, +14551, 64543, 26921, 53050, 1889, 41016, 11804, 42359, 54734, 20026, 40628, +15017, 60724, 19216, 55448, 41178, 7048, 37454, 63436, 17665, 49727, 35413, +25192, 45868, 7949, 40322, 58882, 5612, 63036, 29777, 46510, 22093, 42481, +18353, 62039, 37484, 14369, 63600, 6459, 30910, 37555, 5750, 64638, 11164, +56079, 7415, 29623, 44563, 23792, 9090, 57365, 754, 62087, 11321, 41894, + 3296, 43268, 14503, 46463, 24291, 38965, 32885, 11784, 52085, 33956, 9398, +44905, 3130, 48537, 23447, 58276, 25640, 10982, 44307, 7291, 24729, 48547, +33903, 25765, 38378, 30522, 48185, 1445, 42105, 14073, 37276, 55503, 9607, +62835, 316, 55067, 13174, 64626, 28705, 49995, 18022, 42668, 16196, 37181, +60291, 15617, 42322, 11266, 46042, 28268, 38828, 23161, 51176, 12281, 49425, + 2819, 44380, 13973, 46355, 17607, 50148, 22574, 43354, 8658, 44660, 27909, +38128, 7900, 47023, 2622, 42023, 14481, 44239, 20841, 52515, 2135, 57112, +26585, 52148, 15144, 30860, 48731, 16018, 51606, 29173, 39198, 14793, 64472, +20114, 58365, 23976, 61709, 4682, 55699, 26876, 2974, 44080, 10350, 62375, + 584, 29470, 57527, 39976, 18501, 56584, 27142, 65070, 11483, 53697, 30285, +16424, 49297, 22797, 50907, 15925, 39988, 53263, 13868, 34809, 51112, 15355, +33261, 53483, 10979, 47955, 5117, 52560, 11772, 57205, 7455, 54801, 33733, + 1375, 29945, 62100, 5640, 57188, 30317, 64733, 7887, 27026, 61859, 35871, + 7171, 32193, 19233, 33736, 61512, 24881, 56198, 9554, 38416, 62300, 12271, +44207, 31720, 46597, 2319, 42779, 11293, 27830, 54694, 21149, 65411, 37277, + 3538, 32221, 38452, 20287, 62673, 14286, 58470, 11748, 24082, 43325, 11016, +45182, 21170, 33562, 50705, 249, 26267, 59264, 18337, 52808, 30111, 46864, + 2891, 39715, 56922, 19799, 38666, 25613, 36972, 3335, 46516, 17651, 37379, +52123, 9590, 42918, 3075, 46729, 36155, 5248, 34964, 48212, 17223, 53492, +24392, 9729, 31855, 57121, 26803, 36821, 32272, 3819, 30825, 59008, 12808, +25916, 53854, 11535, 61560, 3145, 29625, 64306, 18004, 31974, 49632, 21261, +52711, 808, 60019, 12540, 52347, 28755, 1778, 51116, 23196, 42733, 60356, +16010, 45351, 20786, 41967, 18594, 50616, 38049, 2497, 52843, 34527, 26833, +37923, 18116, 48851, 19813, 54031, 26554, 63399, 9844, 57228, 6280, 62807, +30839, 1107, 60838, 26620, 32890, 65176, 12193, 35536, 13709, 39115, 56388, +20672, 61653, 40379, 2128, 64345, 14402, 58019, 11067, 26978, 59103, 22277, +53780, 2962, 26977, 45056, 23356, 40333, 20993, 37599, 6269, 45626, 10597, +59237, 24932, 54989, 1695, 27391, 44896, 6149, 54066, 34440, 2558, 57772, + 8340, 28900, 61722, 30015, 39771, 26013, 63427, 29043, 38465, 9226, 65419, +15866, 54705, 34509, 5758, 50388, 31333, 18426, 61225, 22473, 51211, 32112, + 8399, 33241, 40702, 16423, 42609, 5482, 38552, 54703, 3402, 44119, 10040, +62091, 1479, 52352, 30673, 38174, 2616, 49959, 15948, 47060, 21727, 45629, +34156, 28621, 54820, 25151, 34455, 51173, 20765, 4952, 48646, 12629, 37614, + 5582, 46380, 34039, 793, 59213, 32223, 5693, 33696, 58487, 1262, 29970, +60352, 8938, 24633, 58876, 5980, 25937, 64796, 18870, 58536, 35379, 23727, +41735, 30150, 13105, 50862, 25348, 47237, 18351, 49946, 24380, 771, 37028, +53961, 42923, 2220, 24449, 42494, 65535, 184, 47844, 11491, 50999, 21613, +43178, 31204, 1341, 48589, 15557, 64223, 19917, 55964, 18508, 58668, 44558, +14310, 39002, 7587, 29708, 59816, 13336, 54948, 1980, 30230, 44509, 28612, +35848, 62317, 17170, 56001, 25703, 63184, 9865, 40341, 30027, 47276, 8127, +42520, 4621, 61111, 11960, 52051, 27234, 7359, 33496, 60922, 12238, 52919, +33265, 10915, 58983, 31783, 15112, 48490, 19419, 60591, 24427, 16684, 50379, +19997, 31522, 62528, 5614, 34507, 64187, 38925, 4523, 48952, 9275, 43021, +64648, 14052, 45087, 33709, 42541, 6279, 44456, 22135, 38042, 53091, 10217, +48470, 2506, 38334, 10842, 36399, 26715, 37939, 32133, 6694, 40592, 59250, +31806, 10042, 34129, 915, 52035, 26925, 55020, 3518, 61649, 33661, 15000, +49067, 21268, 60099, 12736, 54937, 32962, 8380, 64518, 33853, 7097, 30454, +44614, 19749, 42255, 13169, 49418, 39878, 20328, 50542, 15898, 37670, 27454, +46422, 62277, 29566, 3514, 45657, 9593, 30679, 50702, 18701, 42329, 3993, +45463, 35672, 17991, 46786, 11967, 33870, 59729, 5989, 52792, 14251, 60102, +25776, 51401, 23651, 38612, 3990, 46394, 13701, 33083, 52847, 20311, 59090, +24686, 17010, 50858, 20250, 33751, 45093, 21130, 6844, 58373, 10953, 36441, + 514, 51186, 27889, 33979, 46884, 3043, 23387, 63154, 17398, 56719, 35457, +10416, 39923, 4499, 64985, 25570, 55408, 11099, 62655, 22336, 59428, 28188, +18198, 63496, 20594, 40382, 23993, 47436, 21312, 8861, 55283, 26943, 33310, +37115, 10943, 60207, 14454, 53192, 6080, 38272, 11897, 59489, 7004, 37627, +63481, 24692, 44823, 22356, 58646, 26320, 13766, 48047, 36767, 14691, 64698, +17885, 42905, 25321, 46943, 18416, 38921, 49574, 20242, 43596, 35569, 1635, +44354, 28495, 9080, 63235, 2353, 59313, 36047, 20080, 63990, 8224, 38702, +11103, 34316, 52604, 22540, 9997, 20207, 34041, 56289, 11988, 26798, 50416, +20502, 41919, 28873, 3124, 59316, 17052, 55580, 24665, 36693, 4713, 49611, + 9345, 40937, 31591, 5323, 32392, 57697, 23253, 52163, 17788, 46625, 21621, +40555, 55797, 6849, 18492, 50690, 5460, 46515, 35018, 2659, 28819, 49530, +16886, 61654, 20616, 53622, 24895, 39906, 21928, 43065, 18982, 65094, 29656, +50261, 1458, 42491, 16791, 63642, 28171, 38852, 6044, 61778, 30321, 40118, + 8931, 34159, 59233, 12234, 56626, 8464, 37941, 28244, 51557, 13401, 23349, +59875, 21285, 54319, 16130, 28472, 51065, 22486, 2390, 61259, 31338, 16857, +57546, 13317, 27502, 44028, 21671, 54212, 23639, 57259, 18905, 64712, 15518, +55565, 44287, 20851, 13814, 48303, 26144, 54481, 40776, 30169, 9557, 32553, +47629, 25022, 5587, 58835, 28902, 7829, 43296, 31223, 5086, 47360, 25633, +39410, 15248, 51526, 38073, 245, 53225, 22581, 58168, 25643, 8951, 47197, + 4489, 59258, 7749, 53676, 711, 19617, 47426, 23104, 36226, 53042, 15566, +34941, 56061, 11881, 54495, 15157, 60583, 5620, 31099, 65357, 38699, 15611, +43909, 20353, 41957, 3685, 43358, 12488, 53918, 20140, 62229, 22752, 36541, +64798, 9663, 41025, 3590, 37518, 62973, 9229, 40237, 65059, 3489, 55581, +37875, 23481, 52265, 21875, 59248, 12728, 56883, 6222, 24864, 59857, 40014, +12187, 42580, 332, 45483, 21683, 56272, 31196, 15339, 42769, 18464, 47644, + 3837, 44632, 12623, 49415, 35482, 8227, 33270, 58160, 12412, 28782, 57353, +40280, 14031, 50882, 6392, 65260, 31262, 1112, 42109, 20513, 61139, 19350, +48242, 21801, 43502, 27855, 10898, 52655, 1349, 54431, 9764, 39864, 62752, +23302, 8306, 53048, 26720, 38803, 9965, 62316, 6497, 55189, 27464, 2644, +63340, 11390, 54992, 30986, 15050, 49894, 34100, 27262, 50395, 22034, 47878, + 4867, 41684, 21574, 56157, 27451, 63155, 14306, 36259, 60764, 28856, 51611, +17638, 46021, 34644, 10472, 57277, 6523, 63245, 35474, 12835, 33406, 41983, +10765, 58893, 29291, 37805, 25609, 62610, 15340, 36211, 48122, 2677, 45587, +11752, 41071, 5743, 63305, 9477, 24457, 47486, 34381, 22996, 56685, 30502, +14828, 59811, 39412, 7672, 54578, 4188, 37558, 13307, 64147, 15096, 56026, + 6320, 48437, 13589, 41834, 15684, 56568, 31473, 47971, 4517, 43566, 13325, +50263, 25141, 2323, 52771, 27303, 46199, 1247, 41558, 25629, 45800, 20947, +44030, 61, 45189, 33722, 8765, 46359, 1564, 39325, 58096, 5102, 36493, +54988, 18849, 39642, 50793, 1406, 46714, 34228, 6090, 62802, 12039, 41631, + 4451, 44926, 8304, 42780, 3260, 25511, 57515, 37263, 4700, 65042, 11429, +19782, 62761, 22722, 57885, 14614, 35092, 45675, 19671, 39046, 63786, 16586, +40349, 61344, 14183, 56537, 1805, 58676, 32484, 19090, 60341, 15865, 45405, + 4034, 37271, 64130, 18686, 42132, 22005, 44039, 17969, 41674, 55060, 6781, +64908, 13933, 31750, 59969, 5855, 29144, 46920, 34106, 23547, 40736, 28168, +49284, 21021, 7852, 54906, 29779, 63246, 11349, 56478, 17444, 61235, 1304, +40812, 11175, 51145, 6614, 28356, 47920, 22474, 50003, 29002, 15152, 47067, +25553, 12802, 48315, 32212, 10233, 43135, 4609, 47152, 16391, 44814, 19953, +39253, 52079, 10554, 32729, 55112, 20056, 61886, 24813, 49218, 6020, 37527, +54182, 1012, 59018, 29780, 37357, 17487, 53764, 138, 43532, 26847, 50597, + 2481, 35295, 45117, 5580, 26224, 62846, 22065, 43093, 12935, 39795, 53944, +23289, 49461, 13308, 40024, 2235, 56237, 14018, 60620, 36357, 17205, 41517, +20068, 49171, 31254, 4457, 55231, 32841, 43709, 2443, 56815, 34101, 23044, +44151, 14777, 45637, 34459, 16969, 46328, 21826, 39613, 62002, 6338, 55847, +14138, 38897, 10791, 32464, 60575, 26639, 49511, 2926, 44890, 6580, 31145, +47188, 3465, 44718, 8402, 62691, 4379, 59052, 21751, 36472, 51931, 16218, +47424, 26126, 61189, 5755, 50306, 17611, 45460, 13789, 50840, 287, 29163, +51808, 16665, 63774, 25813, 33173, 60999, 27384, 36531, 30752, 58932, 13570, +63961, 626, 36257, 10498, 52746, 31834, 18521, 45768, 24236, 42942, 18102, +44758, 2324, 46502, 29915, 38069, 25904, 58610, 5486, 44562, 24023, 8517, +26660, 57640, 22305, 53998, 18386, 44568, 35825, 20703, 62963, 13166, 54112, +15169, 64993, 4091, 57866, 15723, 61167, 16961, 56473, 26395, 35565, 62200, +24077, 11845, 47633, 27297, 10046, 49303, 8217, 25428, 65099, 20322, 56228, +24635, 35602, 46453, 16426, 59455, 28627, 54434, 19836, 61621, 34701, 7804, +30052, 46424, 21482, 38474, 49502, 7129, 44910, 2067, 30748, 64247, 12077, +56655, 1180, 33013, 51330, 3024, 26688, 43952, 20906, 46027, 28157, 6026, +49986, 10937, 36163, 29560, 55229, 14838, 31987, 52488, 9944, 56617, 30464, +60530, 10741, 34017, 27375, 35428, 49107, 1250, 40917, 26532, 62770, 20599, + 190, 63535, 10413, 56875, 2424, 33260, 50283, 24947, 900, 32993, 48238, +26824, 36378, 31062, 47643, 21615, 43083, 18588, 58152, 38131, 13219, 61609, + 7930, 57099, 33197, 1117, 60378, 29728, 37184, 17962, 59941, 19680, 64571, +25818, 40802, 3704, 62893, 31851, 18308, 45870, 26363, 5423, 49669, 29331, + 9004, 33366, 59507, 11732, 23430, 43790, 26968, 12134, 63985, 33861, 24801, +56960, 14462, 60168, 17156, 31265, 53088, 19734, 60841, 36653, 678, 46104, +16939, 48903, 27417, 8675, 58928, 4096, 31076, 64748, 27315, 33668, 46533, + 3424, 29644, 56952, 7569, 60265, 34837, 15306, 50760, 36335, 20727, 11931, +50443, 17312, 47834, 3877, 30720, 64105, 7854, 56241, 31695, 4444, 57670, + 8396, 24988, 45227, 21116, 43215, 3836, 51446, 16202, 37718, 12543, 35157, +58414, 18808, 35826, 52026, 11605, 58693, 16787, 31425, 38209, 24372, 43377, +30122, 2034, 31234, 39353, 8228, 53894, 20499, 38402, 27236, 65185, 3027, +57241, 23366, 34727, 60185, 6617, 30862, 37507, 9014, 49083, 833, 54301, +12755, 51380, 3085, 39611, 16756, 42118, 61197, 21025, 37540, 5697, 64926, +14334, 57225, 12151, 60139, 30698, 51700, 21232, 10617, 63410, 764, 30831, +52463, 18367, 62796, 32755, 49877, 10303, 40601, 991, 65351, 11617, 57167, + 7345, 29919, 42668, 23062, 38479, 19029, 50933, 11291, 37033, 25306, 49147, + 3407, 43323, 11148, 19322, 50311, 37383, 17319, 64064, 38632, 20746, 58853, +36410, 14733, 42870, 11279, 50469, 217, 28010, 51298, 36621, 13653, 33932, +48457, 10470, 51575, 23050, 60539, 14973, 52765, 2949, 32257, 56746, 23665, +35668, 50391, 6640, 42899, 24251, 48663, 10610, 22183, 58390, 37109, 6467, +52963, 10227, 35412, 62397, 23158, 41263, 65367, 7955, 27217, 46667, 1519, +38586, 26710, 36270, 2721, 24606, 49612, 4616, 58672, 11700, 25481, 57597, +18974, 48396, 8867, 43711, 36010, 25683, 46477, 18187, 39579, 62077, 10032, +40864, 58789, 18700, 37870, 4988, 50448, 9100, 27917, 63631, 4814, 49527, +31004, 595, 45413, 19937, 41692, 18298, 53510, 36524, 14319, 54388, 6404, +52781, 1779, 48919, 30195, 8868, 50706, 27844, 36651, 8184, 56125, 1663, +64119, 34052, 14355, 41446, 53474, 16702, 39922, 29178, 62467, 7332, 49307, +33018, 5761, 48582, 9173, 30191, 45610, 5005, 38767, 64804, 8524, 42190, +13469, 31990, 54473, 24906, 59509, 4434, 51865, 35754, 17762, 34264, 43989, + 9877, 50571, 7787, 21282, 52073, 38760, 19113, 44286, 25800, 2879, 63680, +28773, 6974, 61715, 41773, 31466, 59952, 13122, 55967, 37922, 20799, 41612, +17886, 50785, 37612, 18742, 48159, 35036, 941, 58192, 17045, 65026, 22434, +56496, 57, 53012, 29703, 9230, 32651, 61585, 15778, 41156, 24970, 35072, +48913, 13074, 50859, 9356, 40603, 63946, 14686, 49622, 22310, 40978, 712, +49023, 12478, 36251, 28398, 39223, 8637, 46542, 12917, 40574, 55762, 19144, +59351, 22200, 39079, 20076, 42222, 25475, 45468, 22427, 50005, 29097, 8386, +33362, 49285, 23572, 40528, 32747, 1251, 50162, 33574, 7128, 27291, 58216, +36041, 23201, 34247, 46202, 11172, 40596, 2654, 45275, 20739, 59731, 16199, +46881, 30917, 39461, 22056, 34490, 55026, 4788, 59977, 7651, 47494, 27574, +33425, 53677, 6113, 39626, 27918, 63009, 33106, 55296, 5852, 25614, 52034, + 642, 28735, 45678, 4599, 31904, 54061, 3674, 59824, 16107, 33789, 61170, + 7367, 23139, 63747, 1630, 26586, 40903, 16346, 43544, 425, 45133, 29064, +61856, 12910, 36498, 8913, 60610, 13582, 40984, 19026, 53839, 15930, 35899, +46368, 29379, 12136, 64978, 33130, 24091, 53906, 16745, 47876, 2252, 21842, +33750, 59135, 17768, 61719, 20137, 54792, 15344, 63211, 40820, 21573, 39148, +17723, 43260, 53828, 8259, 38062, 16060, 52786, 21959, 50011, 6745, 29438, +54043, 13989, 23122, 45139, 27895, 7449, 52322, 13378, 64982, 15800, 56126, +38243, 16565, 54302, 34925, 15296, 60451, 25842, 52180, 3160, 44053, 10625, +26931, 49496, 22671, 42312, 20804, 44068, 15102, 37127, 55838, 17216, 60758, +14755, 49260, 21071, 42393, 17738, 38642, 58485, 3780, 28410, 63827, 2314, +46969, 13687, 52649, 18084, 57854, 39411, 15540, 60636, 40900, 18634, 51667, +11842, 24466, 46299, 18018, 49630, 7432, 38993, 10491, 36927, 30722, 14967, +63367, 25766, 54963, 16054, 57739, 23666, 36823, 62695, 25983, 5769, 65316, +10343, 53978, 30037, 42805, 16827, 45336, 33573, 21882, 6114, 26459, 45023, +23859, 10435, 52228, 650, 59655, 9415, 27222, 61263, 15594, 53713, 26447, +33872, 46490, 12052, 40081, 25081, 45579, 18059, 64437, 23956, 48292, 1711, +29476, 55405, 6217, 64850, 1094, 56924, 19778, 60898, 18045, 32213, 54890, + 4695, 58316, 28710, 62746, 23578, 55326, 7439, 53346, 16541, 61716, 20756, +53968, 32632, 11548, 45013, 4488, 53287, 10941, 58283, 6409, 65077, 11359, +57062, 5263, 54174, 25957, 58608, 2237, 53571, 10146, 48194, 27435, 37489, +19786, 62898, 40354, 3581, 49667, 9285, 57053, 16396, 61981, 21459, 55757, +29429, 6633, 35810, 51420, 28335, 9383, 58713, 3184, 47787, 14087, 44806, +18224, 51789, 31341, 2130, 42810, 21993, 63795, 14225, 51863, 7403, 20728, +41992, 29245, 60804, 14621, 33044, 56355, 15727, 61943, 11916, 37502, 28614, +39984, 26124, 47365, 18431, 44415, 33442, 11817, 35932, 56462, 5140, 64364, +32497, 53966, 20569, 8216, 42589, 26161, 49002, 31576, 17341, 51872, 25213, +61008, 3767, 31202, 63025, 4798, 55715, 20027, 40217, 14687, 45287, 3636, +39607, 12995, 54450, 36875, 50669, 4745, 43249, 11768, 47950, 6019, 45822, +28294, 8639, 53156, 31817, 64018, 2309, 33494, 22199, 61914, 31144, 3181, +58148, 15333, 60189, 41954, 4685, 37032, 55693, 3513, 61082, 36722, 22367, +43815, 23487, 42270, 25250, 2810, 44196, 29425, 7755, 49065, 36031, 8919, +30194, 58544, 21954, 62632, 38521, 4099, 63806, 11228, 57420, 29126, 62115, + 5255, 31467, 38601, 942, 41542, 26730, 59599, 11808, 52678, 7306, 31190, +48239, 15059, 35513, 50715, 19457, 38792, 23867, 42218, 1866, 26437, 52162, +23275, 3056, 63198, 27976, 34048, 56220, 1631, 59897, 27719, 55806, 18397, +64031, 19731, 56686, 38451, 1948, 47139, 6484, 45203, 35280, 280, 48091, +10622, 34065, 45631, 23369, 40031, 14988, 48071, 8510, 31650, 58350, 107, +54500, 30233, 64922, 1874, 33438, 61103, 25615, 48403, 19929, 33062, 46700, + 2834, 41328, 10535, 62702, 7261, 29156, 54639, 5063, 60960, 10090, 41469, + 5837, 42858, 13863, 57478, 38610, 21356, 45904, 19200, 37551, 29246, 43859, + 3334, 48581, 7716, 37895, 27681, 36171, 10587, 43738, 15104, 30961, 42931, +19565, 44615, 4057, 42135, 26771, 1684, 64444, 25469, 41331, 23069, 47033, +27927, 44831, 21304, 37940, 18479, 43730, 15135, 41762, 16175, 45296, 19006, +59521, 21311, 61950, 4979, 52356, 11435, 24222, 55506, 18798, 41932, 25240, +37543, 5821, 51033, 11862, 34521, 64026, 25184, 3794, 61346, 22792, 33436, +52390, 25508, 63479, 28371, 39264, 9974, 62415, 20662, 58830, 12371, 30035, +44308, 22629, 38290, 58285, 2052, 49408, 9525, 39364, 47074, 7632, 42449, +21749, 49008, 18571, 55746, 6508, 62567, 9434, 54589, 3868, 58179, 27714, +50081, 18730, 42708, 28350, 9294, 24530, 58384, 38075, 14547, 54180, 4269, +59003, 38716, 139, 43324, 11380, 38064, 50045, 12843, 44153, 28331, 51862, + 499, 59831, 27063, 56739, 19330, 61192, 26698, 9592, 19715, 56012, 24513, +40153, 30944, 57539, 13901, 37584, 59492, 16771, 9513, 42161, 20164, 51605, +40817, 5321, 46695, 34306, 11559, 37667, 31797, 18952, 64820, 32572, 12717, +50780, 32250, 10641, 58020, 1906, 53976, 8106, 61831, 32596, 59491, 14467, +57488, 31830, 17429, 65262, 37900, 13911, 46995, 7267, 30065, 45887, 19418, +41011, 25812, 7532, 33404, 52120, 14008, 57725, 23595, 53615, 6122, 35205, +47450, 23248, 61499, 19173, 33624, 56849, 7906, 29810, 60984, 4376, 55723, +12448, 65207, 36533, 8020, 46446, 31051, 37765, 6874, 47862, 14222, 40980, +31610, 5199, 33096, 43314, 2854, 44393, 9138, 32374, 42401, 22482, 59853, +13552, 26544, 61648, 17370, 30505, 53109, 16384, 55905, 988, 59439, 19652, +55510, 38805, 12529, 42413, 16480, 46938, 14982, 51846, 37352, 6735, 43057, +11908, 36855, 65247, 14220, 52821, 21712, 44372, 19249, 49073, 38423, 21533, +42446, 19903, 48948, 27535, 53953, 19367, 50098, 33143, 4647, 53288, 9902, +31799, 51232, 7119, 26187, 54068, 21221, 45342, 15624, 52428, 19465, 60418, + 5288, 37244, 57742, 1950, 63088, 30307, 54825, 14376, 57598, 38684, 15187, +52384, 17836, 62912, 3252, 36787, 10340, 52633, 1490, 61766, 30379, 55666, + 3719, 64508, 29826, 36983, 6187, 44551, 13802, 42158, 17514, 45207, 35007, + 8662, 32966, 61286, 2041, 48824, 27873, 39031, 22840, 43847, 13931, 48551, +39882, 15234, 46260, 7043, 40976, 10550, 36832, 502, 49596, 24272, 33715, +50224, 8068, 35360, 55048, 945, 60500, 10484, 32034, 36637, 23382, 57046, +31155, 16983, 63605, 26462, 53069, 1741, 41904, 13476, 48289, 22960, 38443, +28872, 43047, 15055, 46280, 6242, 60142, 13895, 52425, 31563, 46658, 5467, +33862, 63877, 21124, 44784, 18728, 29988, 65174, 20134, 55045, 26438, 17115, +57735, 35365, 8925, 22727, 49114, 35126, 9314, 30634, 46845, 5418, 43747, +31552, 45561, 29253, 10193, 64646, 2911, 26505, 44608, 23566, 359, 47788, +56209, 24509, 60349, 10367, 29314, 56324, 14758, 64487, 25043, 54999, 1796, +51869, 9185, 24136, 46135, 26721, 17077, 48483, 20458, 39993, 16255, 46865, +35651, 21457, 6494, 34111, 40948, 2208, 46443, 24265, 5451, 55032, 33293, +21150, 56050, 12064, 59436, 251, 54580, 43594, 17691, 35675, 46582, 9271, +45067, 16006, 65151, 28545, 2958, 44056, 11261, 51048, 1190, 37867, 25368, +44666, 10884, 42775, 20486, 45730, 16362, 28957, 53581, 20652, 58500, 17085, +54689, 22659, 62274, 19070, 53689, 25251, 61289, 12559, 51331, 21516, 48531, +16715, 62403, 9672, 30048, 40595, 54004, 8355, 33015, 58223, 3069, 42425, +12814, 46989, 27374, 37126, 3948, 24187, 62239, 20508, 57006, 8829, 39445, +31764, 18856, 53599, 22548, 58047, 30426, 5570, 39209, 28451, 59917, 4716, +51754, 27722, 2058, 63518, 13569, 56736, 34864, 2579, 36405, 61869, 7617, +26258, 63833, 15142, 39532, 57979, 15627, 63350, 33567, 13313, 59993, 24599, +64986, 1478, 40182, 13875, 47611, 29467, 11957, 49785, 33527, 9030, 24477, +47589, 7016, 33357, 48718, 5542, 43935, 13179, 51568, 19359, 60580, 25049, +48337, 27541, 9195, 35386, 48784, 24467, 8698, 50947, 33227, 24081, 54885, +30190, 58810, 537, 65299, 26417, 47577, 15838, 53072, 13627, 59991, 8028, +57953, 113, 55105, 28669, 8869, 56006, 30158, 64474, 18639, 56880, 23388, +60422, 16697, 56348, 3606, 38066, 25998, 46853, 15323, 42138, 18835, 48234, +21328, 65376, 13222, 41325, 3300, 48497, 35873, 5466, 30471, 58366, 21309, +64847, 35029, 2628, 57223, 10920, 34158, 62954, 21125, 41268, 23752, 38825, + 2420, 62313, 16835, 51152, 27432, 1493, 40210, 10240, 56240, 7745, 34254, +46902, 5988, 45343, 34244, 1944, 23997, 61576, 36476, 7015, 21126, 63917, +40557, 15688, 51421, 21120, 62952, 850, 57998, 36020, 22730, 34237, 52411, + 7719, 63544, 34097, 28707, 38531, 3649, 30410, 48870, 18043, 36013, 45179, + 7401, 42478, 16482, 43672, 20714, 39841, 56773, 559, 62675, 38732, 5386, +64073, 24229, 57187, 28564, 12944, 50993, 27968, 48260, 17935, 62429, 11652, +51652, 28829, 41251, 1481, 50530, 25831, 40089, 23732, 48782, 30948, 10307, +64280, 2454, 28384, 61613, 30075, 39163, 10096, 33831, 58079, 21556, 39763, +24485, 64842, 20726, 59227, 15485, 54508, 30784, 62201, 7018, 38216, 59817, +13017, 40235, 848, 44008, 10458, 37108, 3777, 42781, 9908, 47140, 20943, +39629, 30208, 59184, 5782, 53611, 25421, 34734, 49577, 3775, 20952, 51021, +41628, 18838, 49111, 20775, 61334, 34435, 11159, 64295, 29652, 52319, 6528, +48774, 35131, 25984, 59325, 4341, 62578, 11059, 41397, 2227, 49776, 25166, +56503, 8823, 36491, 32103, 12509, 58527, 37020, 18545, 50665, 6822, 30359, +58788, 22812, 12483, 35576, 44714, 18684, 47770, 27501, 2808, 42966, 20216, +47713, 37144, 5518, 41960, 11358, 44694, 22112, 55950, 20410, 64043, 24757, +38654, 15501, 58561, 37208, 19861, 62016, 27503, 17065, 60840, 24349, 38019, +28566, 40880, 5010, 42795, 12611, 39575, 57770, 22108, 14545, 38955, 55263, +13121, 63463, 1894, 37486, 9430, 27083, 48975, 20419, 53594, 5295, 30882, +36595, 22380, 41322, 33413, 24329, 45849, 17469, 37150, 49618, 21162, 1606, +43104, 32028, 4989, 45572, 12923, 41655, 27466, 45909, 13572, 64706, 5138, +57585, 29493, 52499, 3978, 44996, 6933, 53970, 18705, 61522, 24696, 12872, +51466, 38266, 14979, 46044, 6953, 26939, 45083, 20285, 51695, 24174, 1093, +53598, 12252, 55122, 19336, 45116, 22582, 40657, 11719, 59627, 30291, 52210, +23331, 36330, 50244, 14378, 28903, 57030, 14902, 63672, 29615, 47924, 16251, +54482, 30137, 52583, 25874, 1689, 58855, 36253, 8422, 34878, 48881, 16332, +51810, 6578, 60776, 17178, 48665, 20547, 51259, 13276, 22315, 52828, 34932, + 6879, 58933, 811, 30022, 51411, 28386, 60771, 10763, 58666, 33200, 14935, +44339, 33674, 15599, 50042, 11623, 44616, 4244, 38054, 55228, 6, 64432, +10155, 52957, 25619, 39645, 14905, 56359, 19874, 64058, 35281, 5167, 61884, + 8313, 36365, 20600, 55431, 37118, 24503, 48768, 19311, 4223, 50600, 25322, +48415, 16639, 52050, 6834, 45272, 10354, 41526, 4914, 49241, 26582, 470, +34218, 49628, 24404, 3531, 47535, 18289, 64245, 24036, 57153, 27107, 52853, +22010, 65100, 29729, 403, 57249, 9402, 23633, 42827, 28754, 1239, 57423, +14330, 63881, 37705, 29221, 5468, 64611, 9139, 39681, 31372, 4926, 51172, +17715, 44796, 14426, 41347, 30193, 2780, 50644, 15626, 46224, 21717, 44340, +18078, 63563, 14589, 45722, 20465, 43673, 15291, 64349, 41775, 23068, 9088, +43681, 33666, 23720, 45147, 15634, 46762, 29537, 59689, 632, 55621, 9003, +35519, 62043, 11579, 55926, 409, 28871, 52823, 18598, 57409, 28555, 50232, + 7960, 41609, 2929, 45848, 6411, 51599, 28104, 891, 43595, 12184, 50554, +36553, 9261, 53449, 383, 59975, 16179, 55883, 21782, 64188, 33114, 5843, +42471, 62494, 67, 27823, 42007, 19914, 46216, 18167, 56185, 39091, 13028, +43636, 15200, 39826, 62452, 9646, 56200, 3923, 64789, 10035, 30814, 63057, + 4727, 23955, 60756, 38383, 15693, 51893, 36424, 21012, 54626, 6362, 61209, +21448, 51685, 17879, 31917, 39208, 8521, 24967, 61862, 16241, 38841, 28687, +49950, 8907, 33783, 57860, 22974, 8051, 61088, 34320, 29381, 55206, 14428, +60648, 7500, 48727, 35684, 29614, 44204, 4337, 60990, 11143, 53028, 6455, +43168, 18254, 46933, 12333, 63128, 4920, 31307, 61439, 2462, 40474, 31075, + 7319, 50836, 11208, 42658, 4231, 41730, 10731, 46091, 34206, 12399, 23898, +57170, 26493, 13366, 41767, 21794, 43714, 27317, 41277, 12206, 37532, 5578, +61298, 42426, 11868, 65519, 26075, 39865, 22867, 63035, 20019, 3841, 36436, +49926, 23582, 4863, 49422, 29474, 7176, 54206, 21548, 41491, 18809, 59742, +12042, 30644, 41836, 20558, 44335, 29179, 3910, 59100, 31780, 6332, 45256, +10352, 28474, 48139, 18564, 31782, 58465, 4487, 33654, 12163, 53047, 7125, +40191, 55962, 20688, 63169, 103, 40768, 13407, 62547, 28835, 55824, 14738, +46045, 17805, 37141, 57545, 21484, 9706, 55343, 35466, 26593, 51617, 11106, +41318, 5431, 38900, 11693, 44386, 6466, 36552, 52116, 15341, 37408, 64373, +15729, 47734, 35974, 18863, 45653, 24100, 11500, 56471, 25308, 36904, 27838, +53384, 15799, 43564, 25676, 57661, 1661, 36479, 60103, 18066, 63920, 11511, +36616, 28775, 56253, 7714, 51603, 28709, 37343, 9647, 61459, 289, 47610, +24851, 3523, 55087, 29080, 62144, 1056, 55699, 11287, 65416, 5194, 52387, +20976, 32404, 40496, 24510, 50456, 17349, 32690, 40494, 24059, 59399, 8719, +48499, 35645, 4196, 33770, 59709, 16328, 54686, 30017, 61313, 17536, 40456, +64803, 21468, 56408, 2849, 28674, 46523, 22618, 42299, 20878, 46163, 11880, +50479, 2464, 23189, 53197, 30108, 11730, 34059, 57417, 7553, 59749, 25782, +50376, 6579, 31687, 60897, 3118, 57144, 32203, 18475, 46018, 25226, 50607, +19192, 38169, 51242, 16417, 41079, 53280, 12620, 27437, 59503, 11219, 28692, +48246, 16033, 38695, 12104, 42424, 1315, 36512, 54054, 19632, 59068, 35656, +10715, 32608, 50890, 300, 37326, 27072, 44522, 2479, 41095, 52597, 24548, + 775, 47317, 10268, 43258, 30367, 39879, 17053, 65239, 13483, 26503, 49722, +30521, 37149, 25903, 64583, 21329, 55799, 3493, 37949, 26694, 48619, 17226, +35918, 52832, 18186, 59988, 34970, 22173, 55855, 28237, 64750, 19513, 56260, +17622, 62571, 29602, 52269, 4003, 32780, 64093, 3264, 55653, 10602, 58360, + 1320, 54336, 24919, 44350, 19274, 1768, 48205, 16840, 43549, 13609, 50297, + 8613, 35369, 54295, 25466, 7764, 34597, 63979, 18918, 57452, 25578, 35194, +60689, 1537, 52164, 34126, 25918, 61350, 14273, 56698, 7440, 34413, 47084, +18999, 36839, 60869, 16370, 38297, 57779, 12727, 37501, 49819, 15835, 42152, +51487, 22148, 32520, 60618, 22737, 35485, 8096, 31981, 44348, 22422, 49962, +35254, 3338, 33958, 52484, 22791, 60390, 11677, 28617, 51188, 40963, 14162, +62986, 6646, 30105, 44659, 20020, 61543, 17897, 55374, 25147, 58306, 13278, +27658, 48895, 31424, 3617, 52874, 8590, 61026, 32218, 6795, 54789, 41055, + 872, 48053, 11952, 60370, 2123, 36497, 63299, 13442, 29076, 49964, 23320, + 8088, 33482, 40585, 23895, 57907, 737, 38254, 27597, 36151, 3665, 54861, +32750, 27096, 52380, 17952, 57142, 39804, 14489, 47144, 16114, 31061, 40264, +25286, 37099, 28029, 39151, 8617, 51483, 12050, 61094, 3797, 30318, 49019, + 5951, 47020, 21611, 39000, 31511, 16650, 62489, 12966, 27545, 45065, 35747, +10257, 23675, 48096, 11130, 33028, 45620, 14924, 39831, 58662, 17495, 65486, +13629, 56913, 6887, 38963, 27399, 34913, 49639, 17595, 60684, 26043, 48062, +16868, 44443, 35208, 4330, 36244, 64386, 16911, 41902, 25353, 37003, 8196, +49846, 1348, 42253, 14182, 44637, 27460, 2507, 56844, 25773, 7598, 34475, +47158, 4020, 39776, 58488, 2219, 65254, 20235, 55523, 22987, 62716, 28060, + 9656, 43179, 2585, 48534, 27042, 55880, 18192, 63886, 21865, 55089, 14665, +59995, 31171, 11082, 39760, 56635, 19409, 63261, 23810, 3291, 58522, 32746, + 5618, 36560, 57793, 21734, 10059, 48321, 608, 29100, 45955, 14270, 32151, +53753, 15862, 35003, 58457, 8851, 25344, 44399, 11943, 46215, 683, 39012, + 9409, 34557, 47285, 2625, 39169, 6425, 42490, 14377, 48196, 38573, 18304, +44644, 25225, 37868, 19916, 45910, 15720, 62648, 13850, 56953, 38026, 28968, +58078, 4154, 55295, 34289, 27516, 46993, 15858, 62444, 29804, 48129, 13436, +41697, 3025, 45239, 10064, 27553, 46016, 23224, 9241, 48926, 5881, 45811, +35655, 23422, 62044, 11117, 54699, 758, 26210, 51260, 23722, 3076, 52585, +26335, 2044, 65493, 25047, 9140, 62764, 1238, 41685, 12871, 58683, 28253, +54866, 10783, 60201, 6009, 24314, 58799, 27076, 8364, 42938, 2477, 39385, +64591, 5596, 32789, 48690, 18824, 32365, 54277, 2660, 49807, 28378, 46668, + 1398, 41998, 20243, 38210, 61873, 7634, 45176, 24575, 38796, 30611, 16356, +51977, 38368, 13349, 30801, 61946, 17972, 42569, 21666, 49604, 24413, 7254, +35081, 45323, 10850, 53286, 30657, 55879, 4809, 44690, 16388, 51150, 18600, +62072, 20896, 58861, 16190, 48756, 6041, 38008, 33737, 7708, 26920, 53137, + 6364, 35372, 60253, 10260, 53733, 3272, 57815, 14040, 62964, 26778, 42231, +22429, 34875, 58379, 12749, 65255, 34345, 10121, 61406, 1911, 53220, 22830, +38348, 52177, 92, 21973, 58863, 36573, 3755, 54268, 25063, 5185, 52572, +29911, 8253, 37600, 4276, 48970, 35721, 28547, 62798, 14693, 59255, 8822, +45140, 3873, 41627, 9875, 52489, 30789, 15633, 54104, 12389, 23526, 47504, +10787, 51673, 21784, 63775, 27610, 55052, 20385, 62066, 6304, 58376, 36391, +11451, 47977, 30132, 62664, 18411, 55335, 26558, 14025, 44510, 31945, 46702, + 4261, 43649, 11185, 40094, 56529, 16910, 64180, 22583, 40312, 4732, 45577, +11609, 41849, 5332, 47219, 34716, 20437, 64514, 17114, 32817, 44385, 5818, +37014, 50598, 12079, 45569, 25409, 51008, 2009, 35144, 63402, 17932, 57031, +38846, 8281, 58807, 40238, 7460, 61883, 974, 23634, 46609, 32861, 3946, +56518, 22866, 62182, 23949, 57863, 14626, 27156, 59307, 23483, 53956, 20779, +61824, 28764, 7322, 59612, 11581, 53626, 5256, 65085, 28039, 38758, 4303, +49034, 27203, 51592, 7089, 33752, 46048, 24669, 9938, 61141, 2601, 41258, +11042, 43436, 1149, 51765, 21111, 61472, 18268, 55823, 37747, 13149, 65447, +39683, 19317, 53217, 30050, 2096, 48175, 16490, 42430, 21227, 49599, 40521, + 8512, 63268, 33604, 17597, 60276, 39774, 14583, 46063, 34778, 29771, 47836, +18939, 51340, 3599, 46237, 16147, 41900, 20017, 36911, 48709, 17501, 39711, +63664, 19490, 55031, 25523, 16865, 44577, 23011, 1667, 60516, 43019, 17153, +58021, 36065, 8955, 33768, 63570, 12307, 51149, 3327, 22878, 54120, 19512, +62729, 11773, 57843, 41559, 2604, 25875, 59089, 19907, 35091, 51549, 6235, +46223, 10202, 58900, 29872, 54662, 4275, 62677, 20586, 43968, 14875, 49437, +29422, 60936, 10632, 42249, 5266, 46581, 12671, 43461, 22663, 54386, 11610, +62858, 30129, 59317, 17603, 31896, 50333, 21087, 46006, 17284, 43054, 18472, +47176, 35005, 2427, 57119, 8030, 53497, 16104, 42528, 26858, 14956, 49861, +23596, 43212, 12209, 46574, 6333, 25416, 64690, 34124, 8406, 50656, 31768, +18375, 59910, 38356, 16647, 63417, 23516, 55336, 32180, 21531, 9789, 54371, + 1313, 41528, 25592, 37294, 15649, 56062, 19562, 65027, 35877, 2372, 60331, +32188, 49824, 33695, 853, 59310, 30116, 5066, 38772, 12760, 33019, 39743, +11064, 49412, 15328, 31375, 61123, 19862, 42565, 897, 43654, 9869, 37128, +52983, 24870, 8947, 18764, 51244, 30232, 58164, 24248, 5944, 50461, 33104, + 9150, 60258, 33787, 20524, 56990, 17241, 62136, 30370, 9768, 45459, 3947, +51276, 9500, 26381, 49515, 13776, 27598, 54464, 20618, 61912, 15353, 31294, +45000, 7198, 43413, 32708, 15737, 51029, 30921, 16740, 45034, 20248, 41419, +55103, 14013, 64450, 37251, 15459, 43599, 17513, 51416, 5192, 48552, 32720, + 8472, 45355, 11924, 43405, 50, 36281, 49617, 23269, 41143, 19032, 47650, +34223, 9388, 50517, 29594, 36213, 10264, 22942, 63867, 12954, 21916, 59833, +35857, 18088, 53147, 20801, 59161, 22578, 55478, 27293, 39121, 8245, 47003, +30691, 5533, 53710, 32048, 2947, 58964, 36848, 15510, 63603, 25406, 53709, + 4622, 58461, 31392, 15586, 44540, 14156, 47442, 41700, 8824, 27576, 56672, + 4916, 53714, 11160, 27105, 59720, 15237, 37911, 24941, 64716, 2068, 53178, +27932, 9377, 56733, 1351, 32010, 49801, 9065, 34620, 51942, 12549, 57246, +38229, 25392, 7525, 40248, 11999, 23274, 59663, 16161, 27366, 47275, 18396, +59544, 43643, 34411, 1752, 28641, 49833, 5621, 23057, 65393, 43123, 4806, +47268, 9565, 31773, 57152, 26667, 39344, 14964, 47250, 20153, 42302, 17119, +38809, 1176, 65516, 26275, 6985, 34763, 47997, 19888, 54029, 25432, 39127, + 1427, 64114, 17075, 41592, 21520, 42913, 1910, 37732, 64619, 4140, 41523, + 7836, 63432, 30749, 55131, 7028, 23971, 50141, 19297, 38738, 29544, 46550, + 1395, 51935, 35800, 4441, 55171, 17091, 63590, 20044, 56912, 41217, 15426, +46297, 29886, 14501, 63175, 41915, 11828, 33660, 48392, 1468, 43505, 10629, +41283, 61091, 34537, 24752, 33016, 47476, 6147, 51388, 28858, 34022, 48861, + 6956, 22627, 45003, 25550, 5983, 21579, 57832, 39548, 17478, 41424, 55450, +16059, 58641, 4410, 52666, 28865, 37289, 23661, 44121, 5453, 50258, 14476, +54159, 29413, 64258, 20689, 5700, 60333, 35130, 57191, 36430, 8160, 20653, +49387, 29617, 37996, 19025, 47305, 16562, 51616, 31025, 2302, 49522, 36005, +21502, 59414, 18930, 55620, 27952, 34622, 61706, 18262, 58981, 38270, 12, +42497, 8292, 39149, 59748, 18829, 55538, 24733, 4486, 61265, 35709, 2304, +65340, 25072, 51522, 12539, 32361, 50909, 7916, 28920, 49859, 6314, 37812, +12661, 42617, 19803, 63186, 37525, 18836, 60603, 22907, 55201, 26609, 12852, +56100, 2090, 61006, 31090, 17062, 56406, 21436, 60425, 18299, 57672, 43818, +17453, 37125, 50989, 109, 43817, 30916, 8007, 47839, 32202, 6419, 36230, +12310, 58474, 33650, 16325, 63407, 24421, 40667, 17006, 50536, 28803, 7753, +32320, 42155, 8971, 36537, 28119, 38099, 6910, 61643, 27202, 55615, 5561, +29300, 51939, 36846, 16634, 43026, 19683, 57569, 35916, 6741, 33045, 50077, + 8852, 29229, 45046, 18371, 62302, 38347, 15074, 45812, 16475, 37026, 28232, +62018, 3864, 47874, 33680, 15579, 52944, 28506, 65508, 33353, 51845, 3702, +35028, 54994, 6018, 41066, 30491, 9602, 21859, 60107, 40758, 18129, 46198, +33807, 14210, 32808, 55543, 16990, 63053, 22015, 36933, 3398, 64941, 31596, + 368, 56889, 12029, 59421, 25362, 46428, 12342, 41096, 57395, 22973, 2317, +64534, 30618, 8674, 59798, 33174, 27006, 48024, 4310, 50825, 15119, 46780, +24745, 12556, 48097, 19290, 51255, 24890, 1515, 37775, 29714, 61354, 9641, +32177, 64246, 5382, 24278, 60686, 19756, 57573, 28645, 32858, 39819, 3229, +36865, 31947, 9473, 51137, 4983, 57731, 36018, 2228, 28840, 49889, 5927, +25744, 57178, 31345, 51648, 18962, 2560, 49481, 13057, 52476, 17804, 63862, +12168, 58540, 948, 24567, 40342, 57148, 10316, 62948, 30081, 47898, 8792, +26377, 63307, 12043, 28663, 47756, 22228, 45031, 16485, 59859, 411, 65448, +12957, 54714, 25111, 40431, 33426, 7200, 23817, 51441, 29935, 40332, 21441, + 235, 26499, 63504, 34750, 2776, 60873, 12157, 53295, 734, 44351, 7801, +63140, 39744, 26055, 8370, 48912, 1218, 43235, 35776, 8801, 47008, 1937, +42030, 7788, 31571, 63949, 17273, 55995, 28696, 3771, 50264, 9522, 34073, +48698, 23033, 11361, 49681, 29052, 6042, 34192, 60254, 3321, 21713, 39849, +60915, 20265, 55377, 27815, 65485, 25802, 53210, 1387, 31164, 50400, 4738, +40967, 10410, 50800, 37563, 21739, 46230, 34768, 8716, 44326, 602, 42015, + 7841, 46461, 2885, 24787, 49410, 5893, 28406, 56609, 20253, 64376, 38299, +14969, 56150, 23644, 65110, 31580, 3964, 52447, 29748, 405, 49595, 9642, +60078, 35393, 14066, 44474, 57707, 17499, 55418, 14728, 65030, 20307, 51990, +32134, 1839, 36440, 20635, 64491, 22064, 530, 62466, 24324, 49290, 3239, +44469, 23920, 63908, 17304, 56842, 39423, 13209, 50613, 4117, 30599, 54654, +22417, 60614, 5230, 46937, 13581, 41572, 29769, 6257, 59451, 10418, 49352, + 212, 21419, 39438, 25161, 45903, 15116, 36631, 57599, 14487, 36190, 47923, +29592, 8848, 56622, 12905, 51693, 36934, 8322, 29260, 40923, 1460, 44940, +12928, 50112, 17204, 52956, 37377, 24357, 40767, 5129, 51985, 21407, 55203, +32439, 16227, 50548, 39896, 15195, 37050, 50116, 14271, 45301, 7296, 35526, +58653, 19150, 55837, 8206, 57691, 34182, 28651, 59745, 9833, 34520, 58599, +20574, 52371, 14544, 39740, 47867, 17416, 51347, 37738, 10494, 41536, 6705, +45216, 9625, 60126, 24836, 53751, 17573, 59330, 28978, 39939, 16548, 52871, +23265, 55456, 15944, 61601, 44541, 20116, 6765, 26766, 58286, 35562, 22889, +62252, 5442, 40142, 23472, 44664, 19033, 38966, 61188, 14399, 33377, 46841, +16352, 42946, 14919, 52078, 36837, 3551, 53315, 34458, 2106, 64292, 9200, +36322, 25778, 40646, 18697, 46948, 29147, 3053, 61765, 12185, 56128, 39095, + 1954, 48837, 10436, 62097, 31829, 54348, 15495, 47854, 27339, 41106, 23312, +32466, 58702, 26697, 36981, 13015, 22204, 54872, 34285, 15578, 57347, 31655, +17708, 63509, 22723, 56975, 23888, 52043, 19037, 34074, 47919, 10627, 51741, +21900, 37682, 27071, 62828, 14684, 39542, 59346, 19558, 40865, 56677, 10713, +38742, 28622, 49125, 25912, 1590, 45862, 10431, 41729, 2909, 40056, 16232, +46010, 14857, 35738, 57622, 18194, 64616, 28197, 5696, 62811, 11132, 25618, +52555, 19895, 63425, 26580, 51913, 20474, 40390, 55398, 15057, 61600, 39752, +11181, 45621, 4935, 26905, 43141, 2033, 45595, 14106, 51209, 41336, 14926, +37581, 57917, 20383, 42717, 26186, 5047, 62997, 30668, 1011, 39952, 27195, +46725, 2767, 43061, 13111, 48088, 24005, 59016, 32604, 9340, 48288, 30214, +40854, 7701, 34064, 61461, 14161, 48592, 812, 43582, 30355, 5463, 61033, +34929, 25996, 46734, 7000, 43244, 11910, 52856, 24121, 58151, 18673, 63859, +24746, 35852, 45484, 18430, 41577, 56445, 10935, 60312, 7851, 64662, 29377, + 749, 31960, 63145, 4470, 52184, 25320, 37739, 30610, 14, 61428, 24706, +53685, 18846, 57649, 20354, 60091, 27875, 41135, 9427, 22008, 62194, 16013, +48454, 31894, 8692, 36252, 3468, 62996, 10113, 27017, 47329, 5953, 28124, +56931, 20136, 61742, 24980, 9644, 38617, 29172, 44089, 13879, 51720, 484, +38191, 27151, 45060, 15790, 42224, 4706, 44473, 27082, 210, 56465, 11680, +28358, 48295, 18081, 62195, 21041, 50464, 15969, 42828, 5651, 47417, 23978, + 1199, 62318, 32820, 7574, 42621, 9617, 40658, 32597, 12738, 36098, 64576, +39422, 13836, 46445, 9281, 38039, 27806, 56770, 3003, 30061, 49620, 8418, +27138, 53364, 4023, 31142, 55252, 1629, 59010, 32448, 20139, 45930, 18465, +43735, 23380, 37742, 28068, 52061, 6533, 56711, 32086, 8469, 58141, 35344, +22809, 45829, 15983, 33993, 59607, 18241, 44256, 22311, 46479, 11963, 42300, + 5592, 53823, 10376, 65025, 7011, 40033, 14797, 54293, 29542, 51061, 5019, +65191, 27997, 38441, 12398, 50404, 5376, 39965, 12882, 46240, 14517, 57682, + 4634, 25013, 44246, 30397, 64767, 11712, 46547, 1323, 53275, 28415, 4835, +46372, 13835, 33429, 52516, 18141, 63493, 11495, 57540, 34406, 18637, 59004, +22385, 54245, 11145, 59651, 24361, 56146, 7827, 30244, 42285, 3036, 33917, +46797, 17765, 39444, 59207, 4882, 48641, 36438, 14223, 33974, 62132, 11775, + 1372, 45027, 32949, 19102, 52181, 16612, 34121, 53832, 17159, 61705, 26007, +38777, 8622, 24151, 62574, 6321, 33968, 47373, 15362, 54612, 39258, 18437, +52183, 23016, 61104, 6261, 34678, 56587, 18738, 59723, 7589, 41548, 12198, +53499, 38942, 17520, 59443, 15646, 56004, 11904, 29946, 40826, 20023, 53994, +34246, 14712, 49531, 31619, 11409, 57325, 19203, 65337, 27915, 37674, 19860, +39809, 717, 43109, 11262, 48530, 2985, 31558, 61042, 8700, 29546, 50243, +19590, 32148, 42144, 17757, 56049, 40208, 19835, 44433, 16460, 64522, 6681, +58673, 42578, 21825, 48611, 5315, 42912, 12232, 47648, 34923, 7402, 54418, +32498, 45095, 6464, 43556, 19737, 60573, 28611, 56701, 24474, 38012, 30403, +60001, 20407, 53268, 34340, 2878, 40289, 13667, 52100, 30311, 65143, 3072, +26270, 61032, 22293, 43198, 16445, 62383, 5813, 55667, 12393, 65087, 17960, +59197, 35336, 22481, 33947, 63106, 3570, 53930, 25520, 37649, 671, 56446, +27146, 64379, 13032, 34248, 44329, 18843, 48586, 26836, 65307, 20977, 56675, + 546, 30131, 51200, 21491, 3504, 54796, 29569, 59515, 20493, 48681, 14122, +36670, 54234, 16871, 63197, 35883, 12694, 50110, 16848, 37547, 26792, 40215, + 5443, 61890, 11071, 57586, 7350, 60472, 14204, 55784, 20150, 42852, 17643, +50816, 37842, 14205, 48778, 7691, 30334, 63218, 4888, 26463, 50815, 6743, +40878, 3689, 51792, 24915, 59802, 18603, 45251, 19994, 49633, 24369, 62349, + 3107, 42916, 17529, 41618, 10911, 47445, 4195, 61366, 24615, 44583, 19965, +53996, 2905, 38154, 28770, 35470, 61528, 20210, 2202, 35426, 49278, 18412, +43233, 12732, 36765, 54832, 23586, 62483, 276, 24924, 46975, 5134, 44221, +16257, 47899, 31549, 5591, 44564, 17368, 47340, 30517, 3849, 34788, 48410, +17048, 51891, 22365, 58811, 9148, 55028, 31390, 14901, 41130, 30138, 9957, +58229, 4556, 28601, 42756, 65272, 26372, 8534, 58554, 3144, 31258, 62895, + 9126, 49093, 35553, 5666, 59567, 30146, 54226, 19615, 48687, 25385, 8898, +64620, 2269, 29658, 43733, 8183, 46119, 12635, 50078, 24212, 10092, 39801, +26302, 50357, 16338, 45655, 3458, 26684, 49944, 5753, 45136, 35596, 27128, +52762, 5044, 62971, 26046, 7390, 59223, 36736, 20829, 44560, 388, 39877, +12432, 50950, 2886, 61734, 14425, 55517, 28830, 53501, 22456, 57840, 16097, +37372, 26084, 46400, 2417, 37021, 53875, 4934, 49448, 27332, 8194, 52993, +12128, 41431, 21160, 47380, 19324, 33382, 10518, 32270, 63820, 27206, 55036, + 3885, 23192, 63451, 25169, 2511, 59055, 36229, 12859, 50975, 1745, 44483, +12094, 49130, 7504, 54343, 189, 43799, 9573, 63783, 21593, 55601, 31818, + 807, 48356, 20641, 53650, 34883, 5461, 48760, 10934, 52708, 23565, 47608, +28939, 36948, 26080, 48786, 9214, 50483, 6299, 45855, 15671, 43798, 34904, +10821, 49253, 29548, 36308, 11551, 38495, 28304, 60447, 6941, 55802, 10497, +38861, 3662, 50567, 24271, 35141, 60553, 8487, 33498, 49287, 25204, 7330, +41448, 228, 31082, 64959, 26791, 10536, 42831, 4822, 46374, 22272, 35015, +56823, 7657, 65361, 13894, 51077, 24744, 38414, 28652, 50268, 26251, 45706, + 2980, 48884, 10267, 63695, 1718, 27512, 60868, 19487, 55454, 39862, 20384, +47052, 32749, 13101, 64887, 16582, 58520, 30483, 13492, 33583, 37760, 1702, +56223, 29241, 5395, 34674, 47906, 11745, 61112, 24443, 53430, 19282, 44142, +21271, 52961, 11292, 60675, 34889, 27261, 65510, 10219, 54237, 6892, 40835, +56611, 23702, 5895, 60203, 27756, 57877, 21250, 32809, 9689, 43715, 29787, +58215, 15263, 36819, 29382, 55936, 8161, 64133, 35779, 27613, 61105, 7502, +38780, 62118, 13896, 28334, 63573, 11531, 31665, 40450, 20438, 43923, 1092, +33717, 64793, 19371, 53253, 21949, 35591, 54424, 16903, 21324, 50287, 35954, +27665, 34891, 47297, 19742, 41285, 29468, 12790, 50861, 18068, 46143, 1465, +44072, 13472, 55390, 30660, 37921, 22718, 49421, 16037, 56084, 28109, 37629, +16892, 54854, 30733, 62623, 290, 29631, 64173, 22561, 55082, 35206, 10863, +54012, 23965, 2187, 60797, 13606, 46009, 10356, 38426, 51928, 23686, 2998, +63342, 16407, 54109, 24373, 59011, 21632, 42072, 23193, 44459, 32299, 9258, +36899, 6846, 32614, 44279, 4627, 63500, 16881, 58682, 30503, 13550, 62561, +11777, 34150, 61275, 25884, 48827, 1883, 54119, 34255, 4198, 44092, 57943, +17921, 37512, 15286, 39440, 29984, 44347, 10645, 48656, 33771, 15539, 30388, +64448, 25879, 37024, 17177, 61731, 22654, 42688, 19095, 41465, 15761, 49488, +24298, 44672, 11984, 50510, 37740, 16687, 42547, 11651, 46064, 31327, 18741, +64190, 34049, 3422, 39500, 10220, 50978, 2225, 32893, 40705, 25056, 60279, +29466, 57323, 8256, 27733, 64642, 19423, 59037, 15040, 54927, 3042, 51533, +14461, 49603, 35733, 22289, 58471, 28666, 37444, 11518, 46546, 17662, 41345, +58771, 16144, 44395, 63001, 18553, 54507, 42310, 6660, 38770, 60181, 21644, +55132, 30414, 58675, 507, 29647, 45100, 20771, 42439, 30124, 8557, 52574, + 279, 40122, 13137, 32896, 62507, 28724, 39625, 24554, 34030, 46051, 5176, +43448, 28291, 674, 54411, 10865, 57431, 37809, 23416, 44712, 20397, 38765, +63773, 7480, 49183, 30993, 15853, 43347, 58331, 14074, 22762, 55162, 32656, + 1575, 31200, 59904, 13372, 37054, 518, 41127, 31165, 6349, 49407, 16061, +44461, 21206, 49987, 27886, 9794, 51032, 30848, 37479, 8128, 42051, 3035, +64239, 39093, 16005, 51258, 7602, 43171, 60669, 2232, 25457, 41110, 13887, +53246, 389, 33954, 50130, 12581, 26751, 52303, 41067, 795, 37904, 56868, + 6583, 61671, 35468, 21600, 49411, 8234, 45278, 2284, 31088, 47418, 6747, +39265, 46613, 3986, 55869, 10478, 60717, 7309, 54539, 926, 60128, 22813, +32767, 57213, 10961, 36954, 28369, 60343, 3673, 43256, 11593, 53235, 6876, +61887, 34767, 3289, 64777, 32335, 4467, 45284, 19723, 52759, 38653, 6079, +42811, 13405, 60163, 31316, 18762, 65129, 38680, 17813, 42133, 21937, 58049, +32396, 15967, 45401, 35193, 26683, 47403, 10640, 42616, 6451, 48086, 10051, +56465, 5007, 64415, 20929, 54617, 27272, 62649, 14806, 53371, 20590, 43211, + 6620, 52247, 25561, 38276, 23571, 46075, 3791, 38218, 15361, 60594, 13348, +27743, 62430, 23879, 7213, 52926, 2331, 60485, 9842, 56610, 21179, 51899, +17562, 40894, 57069, 4166, 39608, 9613, 56307, 32077, 4626, 53009, 11196, +64980, 26815, 58157, 33084, 3897, 36101, 60712, 5760, 27378, 57867, 6989, +62797, 15099, 56867, 36014, 7507, 25750, 56556, 19647, 58884, 23032, 61974, +16140, 53173, 13016, 38516, 1794, 23149, 51961, 40853, 2546, 44971, 7197, +46976, 19968, 43226, 21956, 42019, 29802, 2014, 47684, 13613, 45226, 17141, +62700, 5494, 51947, 28431, 1876, 38534, 11932, 33190, 37217, 9930, 22765, +49215, 25003, 1995, 50527, 18011, 9203, 39762, 18985, 61442, 11297, 53974, + 2701, 60100, 33378, 19509, 64565, 22633, 55276, 5795, 36773, 11403, 59257, + 6076, 57493, 13286, 53397, 15678, 64630, 36557, 17490, 42660, 28626, 2533, +53566, 8630, 55651, 1095, 27683, 52679, 18137, 60106, 39971, 9097, 26492, +52606, 38523, 7471, 44753, 26796, 48725, 6855, 32231, 64302, 25721, 57810, +16965, 43255, 23585, 58592, 1034, 40155, 13170, 60940, 33027, 17335, 63715, +15094, 55202, 18732, 52086, 26597, 6722, 59818, 35550, 20312, 32209, 12495, +34890, 52686, 19959, 43142, 21820, 46181, 25181, 17864, 57306, 43929, 5955, +21748, 53739, 26353, 15751, 47774, 25567, 9700, 58551, 24623, 56316, 16601, +34474, 61291, 15820, 59274, 12013, 19578, 41766, 22838, 46061, 21915, 38452, +24320, 42570, 11650, 46774, 3517, 39310, 25605, 64233, 16295, 34309, 51596, +16658, 59122, 31973, 45061, 25488, 11362, 48446, 14045, 41020, 58289, 28619, + 8425, 33848, 21330, 57623, 17055, 47871, 1253, 43573, 34536, 7891, 30607, +48143, 4027, 51270, 27813, 1710, 64948, 11043, 55848, 7728, 29671, 60280, +17936, 55061, 27351, 36203, 16596, 49780, 26001, 46735, 1987, 42053, 10005, +47301, 30276, 38933, 11187, 48968, 17546, 43846, 1440, 59295, 16053, 53574, +21499, 43710, 23081, 37498, 50299, 9397, 45939, 34879, 26399, 41828, 19429, +47124, 33118, 612, 31290, 61631, 5919, 27425, 49399, 21597, 51686, 19248, +47066, 37936, 18061, 46196, 29347, 6230, 37754, 12805, 62390, 26727, 14555, +34212, 47502, 19130, 39781, 22031, 41939, 1653, 49906, 29743, 51437, 12791, +44833, 35487, 6940, 42085, 31139, 4367, 64010, 20933, 54606, 33170, 12321, +24307, 56194, 17424, 39336, 26514, 62936, 9934, 57888, 7774, 64131, 23921, +34419, 61261, 6152, 53183, 29725, 40108, 14830, 63738, 23914, 55839, 31432, + 4533, 56921, 29208, 61656, 12943, 55946, 34646, 27936, 35863, 64171, 24537, +51636, 21926, 38375, 23110, 43555, 17657, 49403, 37085, 12330, 42422, 17136, +44838, 20930, 50058, 18885, 48190, 23060, 38374, 26468, 41089, 8842, 24598, +51707, 6218, 61555, 36371, 18940, 42878, 14908, 48174, 36420, 10775, 42539, + 4512, 32578, 62909, 36030, 121, 30835, 64691, 20254, 59023, 16146, 38329, +50196, 14624, 46213, 7971, 34020, 63161, 12076, 29954, 52345, 22255, 45250, + 4130, 38888, 47731, 564, 45588, 25414, 40270, 10347, 34445, 49191, 28963, + 2725, 40366, 64991, 21911, 47576, 9057, 62419, 4311, 57905, 11733, 63024, +35471, 2675, 23236, 37348, 59915, 9972, 45727, 33059, 2496, 51672, 30053, +39078, 3808, 37302, 28082, 48441, 10845, 43227, 27472, 50856, 57202, 13993, +63745, 1737, 43248, 13491, 64700, 17501, 55663, 26556, 62113, 14097, 52721, + 5172, 50172, 10075, 23753, 46054, 27822, 646, 20691, 55208, 41584, 19023, +52455, 23300, 10831, 50540, 37509, 60994, 12433, 33031, 40193, 25405, 62875, +14965, 49053, 26982, 54421, 21301, 59954, 18366, 37707, 49810, 20471, 41952, +18804, 51111, 38720, 4255, 31814, 37434, 1502, 62862, 29376, 38364, 11658, +34664, 60919, 17917, 57300, 24670, 1031, 55665, 28015, 33989, 64127, 12742, +54537, 28494, 40496, 10241, 65278, 7389, 57250, 3244, 31704, 56098, 20738, +64242, 13133, 51353, 32172, 6812, 65079, 26467, 45592, 14381, 38295, 53148, +11301, 44047, 836, 62485, 8351, 29940, 60881, 2401, 34711, 54098, 21767, +47254, 18467, 52324, 30159, 55190, 11108, 60358, 4032, 53194, 27372, 61297, +16133, 41362, 17503, 60585, 964, 27808, 48330, 14063, 57520, 37185, 17401, +44975, 9022, 41525, 61436, 36135, 9577, 32796, 59869, 4541, 36784, 32525, +27609, 48428, 17269, 53718, 11243, 28013, 42403, 23358, 1022, 57896, 31841, + 9034, 45549, 14028, 50889, 40792, 17780, 44037, 3637, 41155, 17191, 45259, +11760, 47079, 3294, 42453, 8191, 44653, 4418, 63564, 10548, 57131, 5952, +25538, 56091, 3746, 60927, 26140, 54201, 1019, 42276, 30834, 9332, 63127, + 2404, 56796, 30702, 59175, 18663, 45807, 25562, 9725, 57841, 26398, 62479, +32093, 21375, 61340, 24949, 56760, 23085, 14510, 50230, 20970, 46295, 10087, +41128, 4731, 54148, 28287, 3323, 56054, 20271, 30615, 53817, 3621, 35640, +42797, 8342, 62660, 17672, 57343, 24687, 16176, 58680, 29498, 5247, 56996, +22796, 61317, 16439, 45765, 23297, 50470, 5888, 54597, 26486, 38893, 15500, +50300, 27584, 40045, 6868, 51499, 30525, 64392, 14957, 28693, 49434, 18845, +65178, 39947, 14447, 62436, 17891, 53730, 13284, 64174, 5488, 54932, 35947, + 340, 34109, 6174, 38904, 26508, 49796, 16187, 51426, 5405, 48393, 34344, + 7790, 35701, 45217, 18356, 42612, 20028, 40690, 63354, 7382, 39182, 62221, +33738, 5589, 31175, 59872, 1338, 35488, 63179, 22140, 2475, 26967, 49269, + 4234, 53154, 8720, 29340, 51770, 4725, 58843, 11613, 40623, 14608, 45045, + 8327, 33099, 56486, 5370, 61294, 33412, 14989, 43559, 64098, 20212, 50146, +12964, 43533, 3753, 59921, 19740, 31441, 50449, 7456, 34497, 51097, 13723, +60158, 3421, 23074, 46648, 31519, 5649, 51106, 22560, 32428, 47359, 26418, +49426, 14283, 40102, 980, 37385, 31052, 4857, 59244, 43382, 16198, 52625, + 8460, 58393, 30689, 16522, 63727, 34145, 24842, 36112, 48800, 15261, 40004, +25175, 58864, 10477, 50587, 1265, 40192, 7866, 43239, 2113, 38596, 23554, +43831, 31157, 8899, 32305, 44527, 4601, 47891, 24481, 34511, 64775, 18632, +51860, 26097, 7892, 51109, 32375, 58230, 19796, 4150, 50164, 27456, 48743, +20818, 52538, 16234, 54230, 330, 39662, 33124, 5205, 35707, 52094, 15535, +60208, 38182, 17989, 49747, 35846, 22241, 61156, 7732, 24563, 64328, 14731, +53565, 32022, 59168, 6194, 62074, 23469, 56517, 15284, 60506, 16604, 49832, +34484, 27392, 38968, 30530, 45367, 16563, 47411, 35388, 8691, 29079, 65075, +15920, 56068, 36665, 15232, 47553, 21562, 45018, 3973, 40363, 13507, 49984, +30804, 37107, 4238, 40381, 7897, 49793, 3438, 44634, 12641, 46951, 34752, + 8021, 59500, 24656, 51716, 16894, 45813, 12664, 43541, 34366, 10524, 36246, +48252, 15428, 28633, 50488, 18208, 48049, 25558, 37162, 11379, 52747, 41593, + 8923, 36946, 50681, 13519, 44800, 1179, 53195, 9369, 58040, 13330, 32772, +37057, 898, 49037, 29345, 36266, 16923, 55474, 31883, 14590, 43059, 8047, +40169, 56008, 3566, 36862, 8544, 28430, 44904, 6186, 42517, 26047, 46930, +22224, 43958, 25841, 17388, 63258, 23953, 30654, 60306, 11250, 33307, 59074, +27177, 39576, 31504, 20094, 50431, 29969, 216, 59372, 29014, 57040, 2615, +30824, 53934, 22170, 9727, 42557, 58131, 12318, 37819, 27470, 47580, 6544, +34230, 56940, 41427, 14582, 63841, 22126, 35773, 45489, 18390, 38592, 16280, +44278, 154, 64017, 29520, 53663, 13234, 23822, 46867, 25535, 1101, 58402, +29177, 8757, 39648, 15764, 59318, 22770, 51644, 13605, 53775, 5360, 37673, +28293, 64923, 19318, 40358, 21723, 44550, 35615, 7758, 61852, 19992, 35510, +58826, 310, 36291, 11149, 30899, 61498, 21988, 54461, 11537, 57043, 40006, +22862, 10132, 37297, 23407, 39842, 33879, 2070, 46276, 26624, 7023, 59350, +13574, 31255, 57673, 6704, 45283, 18778, 43374, 22570, 57194, 24942, 59502, +20448, 65350, 17202, 54036, 15431, 63475, 21486, 58188, 12220, 54920, 29146, + 8029, 50655, 10489, 41406, 2846, 39329, 61684, 22914, 770, 26640, 47127, +35090, 21518, 65442, 1274, 41169, 12698, 45298, 21625, 61754, 12020, 57392, +27190, 63508, 2439, 48939, 9604, 26175, 43960, 6415, 53882, 2695, 28946, +46169, 35170, 1222, 47561, 27692, 9571, 22492, 50724, 28765, 13382, 32728, +38844, 26835, 54189, 31490, 12651, 59424, 1142, 54680, 9975, 63408, 29463, +14643, 52811, 38083, 20440, 45846, 4252, 27845, 51971, 34280, 11098, 35560, +62351, 20612, 55850, 1461, 64135, 16419, 55085, 20395, 53043, 17242, 39757, +19627, 51875, 1887, 64023, 27566, 40330, 3798, 29712, 62568, 22522, 56799, +18358, 63686, 27210, 60398, 1850, 33103, 59733, 5804, 56979, 29129, 2503, +49685, 33731, 6138, 30490, 62038, 20113, 32135, 64885, 27032, 33102, 37083, +25259, 39319, 28280, 61594, 16106, 56539, 12272, 60399, 6504, 46804, 2016, +37822, 59157, 22080, 48192, 25702, 12373, 33630, 60321, 22881, 54409, 17254, +55774, 11691, 60813, 1520, 40470, 12541, 59548, 32961, 9012, 52660, 43797, +18425, 46872, 4381, 36907, 10003, 57630, 2332, 63153, 13143, 56335, 24722, +38710, 9184, 36494, 26289, 46873, 13275, 37180, 50269, 24432, 16993, 51302, +20981, 61714, 15086, 30791, 49030, 9162, 24377, 46448, 31184, 10199, 58614, + 2755, 55901, 22329, 62298, 23556, 52753, 35828, 6111, 22387, 62123, 36507, +10048, 35011, 49365, 18266, 53485, 23757, 57125, 33164, 5991, 45703, 16887, +41142, 21528, 44589, 15832, 46324, 11371, 42999, 5807, 49659, 10426, 58401, +25639, 33375, 52882, 9713, 18092, 42549, 63298, 20371, 52335, 6249, 45036, +17200, 46674, 24937, 14107, 48979, 28907, 62220, 3604, 55524, 15439, 61078, +19788, 54938, 35649, 23099, 50522, 3077, 33802, 52202, 12304, 64020, 4887, +38669, 14245, 42280, 13150, 48442, 28462, 46371, 8361, 41381, 33, 46828, +25932, 38335, 14878, 62616, 39466, 19227, 56329, 22354, 59698, 29031, 9784, +44342, 31420, 63266, 13178, 56870, 8093, 31786, 44132, 18229, 60889, 6492, +38810, 24418, 47324, 18057, 41746, 19663, 42903, 21415, 36782, 56502, 16062, +64753, 25243, 34515, 55297, 10835, 59392, 31280, 15931, 57198, 35790, 43717, + 701, 42127, 53077, 7565, 48689, 1800, 36854, 6599, 47201, 24067, 41702, +21302, 48789, 36288, 1918, 58746, 32345, 4823, 50670, 12303, 40904, 60224, + 7070, 23609, 54665, 27056, 7985, 46794, 27778, 43152, 22231, 47395, 12744, +44139, 29722, 65470, 9387, 55796, 29370, 38412, 15692, 53166, 18275, 56432, +34398, 8703, 38960, 914, 50661, 7059, 41703, 14014, 51319, 39514, 16931, +43631, 15015, 38930, 65018, 13676, 59481, 26949, 53527, 14128, 48596, 3430, +38181, 7884, 55888, 11421, 63378, 3717, 48476, 8555, 42333, 19699, 44298, +23272, 53473, 21264, 65081, 26272, 9624, 54023, 1259, 61881, 29506, 50459, +13953, 42803, 206, 46575, 29242, 36792, 18815, 52101, 20175, 45535, 3432, +51495, 38372, 14692, 2127, 54361, 29392, 62697, 16652, 52417, 24068, 45784, +16435, 41184, 6228, 47456, 15262, 65391, 21173, 55006, 5880, 60909, 27799, + 1990, 64414, 39535, 4029, 43877, 8077, 40350, 54069, 16450, 37027, 60018, + 837, 54852, 23726, 39564, 32391, 12334, 47208, 6839, 41275, 10334, 25025, +57305, 38025, 2403, 48041, 27314, 64511, 12893, 44352, 6782, 42381, 2789, +48017, 26636, 35490, 65180, 60, 58126, 26821, 61598, 2339, 56663, 24120, +62374, 27776, 53757, 18291, 48345, 2738, 40818, 28816, 56181, 24295, 8378, +34019, 40733, 25114, 32974, 63601, 3977, 34482, 60342, 1549, 51775, 20272, +41769, 29483, 48849, 10601, 41537, 4363, 45015, 10912, 37063, 63149, 17447, +26961, 41500, 20297, 49236, 28388, 62762, 3369, 54941, 35813, 5041, 34109, +59048, 19357, 56093, 35299, 6072, 52482, 33891, 2004, 30416, 45723, 5094, +42945, 13480, 36407, 55831, 14695, 52852, 7233, 30087, 39703, 25113, 53215, +10671, 55107, 30418, 50381, 14096, 43385, 3762, 51509, 8482, 56811, 13785, +61866, 28461, 3362, 48314, 30699, 9228, 44584, 16729, 41949, 20349, 52709, +39010, 5119, 20806, 65232, 30649, 15738, 34275, 63043, 19030, 55735, 20868, +64808, 17968, 52632, 15702, 62388, 7442, 22430, 31071, 40620, 17767, 61397, +21924, 56984, 33035, 17683, 39559, 61818, 26, 49563, 32951, 15529, 58804, +11864, 39365, 5327, 60635, 34372, 445, 23652, 46566, 26006, 6728, 60520, +33133, 5532, 45037, 13700, 48272, 25238, 58473, 32000, 19864, 44606, 22053, +57492, 23767, 9741, 62473, 31181, 54432, 7863, 32980, 45544, 19272, 43219, + 1471, 39958, 23988, 58155, 17649, 49698, 19197, 43020, 22131, 41085, 18377, +52549, 27478, 63954, 3356, 38782, 10070, 42145, 13831, 45824, 33484, 19988, +44553, 16277, 41764, 4636, 56671, 30980, 63864, 24529, 5022, 58132, 32092, + 9372, 62927, 28727, 48245, 15562, 29934, 57941, 25236, 37247, 12145, 22950, +48932, 30384, 8035, 35934, 55148, 21906, 61116, 26623, 51938, 4308, 45554, +15786, 41301, 17784, 52340, 33472, 15224, 30931, 55700, 18899, 57290, 25411, + 2923, 65321, 32044, 20188, 42574, 15963, 44720, 6603, 64659, 26223, 34947, +57577, 19372, 48435, 34005, 14180, 50615, 32567, 20376, 51406, 4571, 39749, +21445, 52218, 28028, 62448, 12564, 56163, 8044, 29821, 46784, 34391, 9183, +39933, 31910, 15331, 47453, 17511, 38232, 583, 41382, 13909, 64788, 21115, +47749, 5042, 50147, 29595, 59937, 2163, 57389, 10473, 38545, 28235, 53975, +19536, 42526, 30518, 9202, 57911, 6420, 21586, 54173, 27940, 65423, 17910, +53572, 29316, 8857, 35285, 56888, 452, 53434, 32493, 8185, 31472, 44436, +23863, 10659, 52702, 25867, 12708, 45649, 29191, 11532, 64594, 16770, 48164, +21730, 53859, 11275, 63623, 25035, 53265, 5658, 27878, 46395, 17656, 35525, +51500, 3313, 62116, 15587, 47679, 26230, 2682, 34294, 58195, 19186, 65115, +26590, 36943, 30473, 45616, 7032, 50187, 33125, 12471, 39512, 57485, 22025, +62170, 4349, 48528, 8400, 24436, 60075, 32505, 8707, 45380, 58015, 4200, +29324, 41568, 14645, 44104, 25142, 37976, 3191, 43213, 13334, 33005, 57915, +44417, 10394, 47007, 8052, 43802, 27008, 2147, 48736, 10180, 28522, 43697, +18497, 65212, 37113, 3376, 45423, 23794, 51235, 28602, 10947, 59082, 35901, +13967, 58060, 41652, 11877, 50799, 23678, 35735, 61996, 2281, 42950, 10823, +36910, 54365, 13402, 48730, 4348, 35167, 46165, 26896, 178, 22711, 46868, +24760, 3891, 55980, 10939, 63842, 18669, 46932, 11873, 41405, 29668, 60425, + 5491, 55143, 13977, 59291, 31277, 6252, 32535, 49871, 18529, 61358, 31285, +55857, 4067, 59796, 36798, 7377, 51045, 18601, 48669, 35307, 10946, 20982, +39937, 48274, 14962, 49757, 39187, 24843, 5827, 35795, 64925, 7461, 42258, +61562, 6427, 55591, 39964, 665, 42281, 64979, 26701, 4105, 43424, 11826, +37472, 18207, 42011, 11337, 60283, 29887, 48431, 8433, 42038, 57746, 11104, +34697, 45704, 12999, 49792, 29026, 38967, 5475, 51883, 10544, 62402, 27770, +50791, 14108, 46117, 1616, 27405, 52047, 3871, 61137, 30176, 7206, 59771, + 9414, 29824, 55756, 16056, 60512, 31986, 9763, 36785, 22347, 42876, 20401, +52579, 10628, 23255, 49350, 18839, 53032, 36762, 4432, 55175, 12550, 60688, +24844, 52454, 35921, 9144, 30819, 61163, 19093, 44448, 14598, 46909, 19616, +50812, 15543, 44416, 7840, 48038, 13398, 64499, 34743, 26539, 36140, 47040, +32330, 8188, 31121, 47669, 1333, 58541, 24928, 48226, 14781, 44913, 16576, +61222, 22909, 55563, 16344, 60097, 33639, 17647, 63069, 40345, 2634, 49845, +24019, 41098, 32972, 8549, 59311, 26851, 36690, 15546, 47031, 20441, 41209, +64964, 2392, 32039, 60491, 18629, 42402, 23048, 38051, 6110, 41003, 63919, +22641, 8933, 46326, 33931, 12963, 54467, 792, 25214, 53271, 17667, 41038, +59883, 20862, 2, 51214, 13662, 37743, 18350, 63951, 42260, 12489, 49573, +40271, 17899, 36790, 25232, 51831, 9135, 61215, 4936, 53537, 11705, 60847, +22848, 56354, 38769, 4089, 19329, 64121, 24911, 52249, 14846, 37070, 62837, +20195, 53761, 34637, 11597, 52898, 6442, 25332, 54877, 19614, 62978, 15979, +38309, 54013, 17956, 50153, 30842, 3177, 32452, 43762, 21412, 57662, 9327, +27491, 53777, 22180, 65131, 26423, 3089, 61444, 33000, 25930, 64602, 7372, +55196, 32140, 58203, 10024, 61615, 37212, 22040, 42054, 27608, 51576, 4834, +32467, 62934, 1831, 24775, 45967, 28904, 47565, 94, 44647, 24332, 58445, +15327, 45429, 28417, 5808, 23809, 51455, 27407, 11935, 62765, 28911, 58302, + 9342, 24007, 43419, 57401, 8350, 32475, 60548, 2575, 22078, 43015, 57032, +16654, 31791, 52236, 21589, 28936, 46346, 15700, 33326, 58369, 19962, 10667, +34226, 53026, 23286, 57450, 1594, 62422, 27731, 53772, 35759, 981, 22487, +62786, 23711, 5334, 50507, 26583, 79, 63675, 21344, 43607, 13598, 58752, +18903, 48412, 35898, 3426, 34519, 54619, 19057, 59267, 39185, 11355, 42391, +16916, 46217, 36170, 25572, 34670, 45490, 18911, 41317, 498, 46354, 19877, +50044, 33821, 1902, 61363, 25855, 36293, 54359, 3936, 63940, 8556, 29581, +45211, 22595, 42172, 19156, 46722, 4780, 22521, 58133, 38840, 15555, 41706, + 3734, 53690, 28507, 37098, 5572, 58163, 24166, 61707, 16472, 39522, 3137, +53010, 12628, 62943, 125, 59721, 19462, 55795, 21089, 40065, 15742, 43174, + 4529, 64671, 30221, 38244, 5619, 47709, 11177, 40516, 1026, 50676, 42753, + 6836, 32344, 54633, 20591, 60443, 3774, 51477, 28215, 39092, 4295, 49690, +32051, 429, 58946, 10022, 23813, 49242, 40071, 5926, 45880, 12468, 53789, +20421, 59279, 28247, 10294, 35698, 55421, 27519, 5414, 48682, 21755, 59397, +38594, 10951, 63134, 4969, 26790, 47289, 30282, 36562, 26315, 56765, 31742, + 1639, 33592, 55053, 25666, 2801, 61548, 10687, 56290, 19811, 46716, 21581, +40038, 28102, 41521, 16856, 46548, 6810, 26297, 54446, 42558, 35573, 573, +33483, 58550, 6703, 30083, 44960, 4943, 59694, 22748, 38359, 30444, 47159, +14519, 42041, 7437, 48290, 2742, 26805, 45008, 5878, 62148, 37577, 19325, +64489, 828, 38872, 30437, 49042, 16872, 40972, 6448, 46322, 30165, 38628, +11714, 52981, 20735, 39413, 19034, 41897, 15294, 50804, 33506, 13338, 54088, + 6407, 59118, 14591, 36587, 50278, 15787, 37699, 53912, 21017, 9761, 35948, +64647, 21337, 51904, 10735, 40418, 1540, 50748, 32239, 43202, 15954, 39247, +47849, 21635, 3101, 38118, 30231, 63316, 1945, 26951, 50722, 18322, 37363, +29635, 51309, 8794, 33878, 50032, 956, 39366, 10120, 41416, 20290, 64104, + 5065, 24549, 51440, 28949, 60190, 15374, 46286, 19237, 40508, 12834, 43190, + 6621, 24000, 58208, 33010, 13815, 52906, 38599, 16268, 60394, 40716, 29753, + 6048, 52462, 23806, 33421, 40517, 7666, 22782, 49670, 24934, 8554, 37785, +31682, 14984, 63699, 24163, 54367, 959, 65436, 12395, 56392, 3208, 62919, +13946, 53834, 25187, 63734, 4839, 57499, 28467, 40052, 6132, 58767, 16312, +32929, 40929, 23814, 58999, 14615, 62966, 6612, 56477, 11888, 34704, 45586, +26722, 1162, 55687, 12016, 62646, 35278, 9539, 65210, 27127, 39753, 490, +33983, 51167, 21821, 44189, 23070, 45956, 16291, 39747, 24859, 44750, 5260, +42866, 11248, 60762, 30724, 51910, 23605, 9436, 50124, 27346, 36381, 24727, +64819, 31805, 14670, 29939, 57631, 22477, 36542, 9587, 31485, 45055, 19871, +62156, 15124, 54723, 18272, 61135, 39848, 16494, 37676, 55341, 13769, 21308, +56426, 29287, 64440, 124, 48937, 13618, 51074, 30701, 44949, 1529, 39560, +61022, 16610, 41886, 7766, 31970, 44010, 23328, 34331, 55893, 8660, 65385, + 5934, 49224, 9915, 40394, 52244, 22899, 7272, 35176, 51510, 21372, 48562, +30290, 1424, 35079, 58679, 13167, 55268, 150, 59092, 35185, 29831, 48529, +20658, 9335, 28256, 50056, 18543, 38341, 26101, 49744, 15911, 42021, 13680, +46222, 2595, 58084, 8837, 60849, 27659, 56187, 22995, 34253, 63883, 15396, +41093, 22081, 48726, 8574, 29449, 54299, 20010, 60947, 5110, 44100, 12137, +52016, 15348, 58943, 17692, 49316, 1386, 43442, 11094, 60662, 5633, 44011, +27705, 2136, 49862, 25933, 38826, 21453, 44922, 29394, 8611, 56860, 31443, + 6986, 40472, 57371, 15563, 33780, 7423, 31759, 43639, 19998, 62537, 13314, +57542, 9389, 63667, 481, 32891, 55290, 42936, 14859, 52320, 19267, 47113, +34552, 5406, 65418, 10191, 55984, 17505, 62145, 14056, 26474, 60400, 19312, +56325, 3171, 52849, 13117, 34715, 44818, 8871, 47334, 2898, 38950, 7060, +51602, 24778, 48117, 21009, 50246, 34573, 9298, 47478, 36123, 3192, 30220, +46857, 8290, 22041, 54964, 35809, 10880, 61526, 1688, 55300, 28882, 60468, +16425, 56648, 30154, 61820, 5211, 50082, 32916, 7802, 31395, 43855, 20031, +47595, 21578, 38518, 24283, 43788, 32654, 9084, 31237, 42058, 14435, 45431, +16954, 48794, 11664, 30509, 47773, 13422, 51003, 1286, 38096, 26810, 48858, +32818, 28500, 61545, 8125, 53202, 32907, 20674, 49087, 26184, 16663, 50447, +21598, 45291, 17758, 49109, 27858, 6040, 59435, 11247, 57364, 4956, 31897, +56196, 9780, 34414, 62558, 22418, 52590, 34202, 7531, 20215, 39447, 56277, +14044, 59293, 2790, 51027, 7647, 38637, 53712, 4369, 39428, 13019, 64068, +28438, 57212, 13674, 37850, 1340, 42626, 22808, 46029, 10922, 24728, 56955, +30564, 6764, 34338, 50245, 25727, 11114, 34242, 44425, 16963, 39326, 4617, +62710, 14422, 58570, 24339, 9728, 52460, 28209, 64293, 20431, 52020, 2121, +46496, 14403, 38433, 19818, 42911, 22424, 60912, 27385, 14429, 58159, 28989, +63293, 11907, 44093, 6070, 38988, 64521, 24200, 7014, 44968, 18466, 48876, +24210, 10746, 65512, 2296, 58337, 31873, 62234, 13984, 54146, 3657, 64899, +10562, 55671, 24056, 63315, 27947, 51643, 18220, 41321, 32258, 944, 36574, +12063, 53321, 9075, 32217, 57182, 12955, 28153, 52794, 36835, 12384, 42384, +15606, 54919, 21596, 62772, 19665, 37134, 4776, 41574, 27089, 55603, 15985, +47832, 26763, 53301, 17565, 64363, 39859, 16459, 62709, 11431, 55024, 454, +65408, 22130, 41126, 17925, 59826, 33093, 2978, 42149, 55690, 26788, 60782, + 4503, 54377, 27289, 38038, 22935, 45781, 19963, 49697, 24319, 8839, 33943, +60690, 6401, 41075, 12968, 58718, 31538, 20408, 43727, 23442, 41578, 4322, +45908, 33149, 8027, 47306, 30845, 25636, 37155, 27922, 54258, 16324, 61228, +35554, 22381, 58890, 31838, 16743, 63855, 3654, 56431, 14578, 64492, 30924, +17173, 54530, 27599, 65064, 19716, 56708, 32736, 12548, 46058, 25669, 42801, +31590, 17617, 44467, 11620, 42115, 357, 44147, 12820, 41987, 18085, 55854, +28148, 58690, 9927, 39875, 5702, 53039, 11590, 58976, 5114, 55241, 27779, +59495, 17797, 54683, 7170, 64718, 24494, 35071, 62190, 3079, 55527, 34114, +28405, 49751, 9893, 36668, 2069, 51322, 20909, 43924, 17387, 64258, 38093, + 5219, 43830, 32812, 1727, 59188, 7378, 55351, 11911, 63969, 36992, 24675, +42225, 18868, 36869, 48953, 17749, 51141, 27446, 12218, 46482, 3312, 26799, +44585, 62041, 1825, 28038, 43757, 18392, 42323, 20559, 57025, 17111, 27412, +62352, 21163, 51238, 706, 48060, 6311, 52342, 25586, 57824, 11906, 65496, + 6452, 34748, 44421, 3644, 50754, 27209, 61893, 1755, 36416, 58644, 5298, +24630, 61260, 26427, 47952, 21872, 37881, 18226, 46862, 31083, 36757, 2971, +42919, 13177, 34951, 60627, 18647, 54046, 24488, 58896, 12767, 53013, 3290, +44881, 34659, 4672, 46247, 16542, 40759, 22444, 59978, 26700, 11504, 52829, +33934, 27481, 63805, 8661, 33784, 51759, 17869, 40515, 22414, 47463, 4662, +40850, 21511, 44114, 17263, 41286, 32350, 1280, 36667, 9182, 31833, 44299, +13942, 52714, 21133, 61895, 28393, 41768, 20742, 50417, 1586, 34598, 61211, + 4692, 24496, 50316, 2862, 47169, 31096, 37828, 350, 33565, 56449, 24050, +63327, 9657, 29849, 61926, 36183, 2945, 34760, 48640, 8178, 28880, 46332, + 5074, 42814, 17277, 47327, 25200, 51035, 4111, 48958, 10626, 25769, 63101, +23351, 12226, 51120, 17583, 47309, 35590, 8307, 48835, 2937, 35356, 56311, +12937, 36342, 64290, 16521, 25824, 48299, 22314, 51690, 7809, 39866, 53107, + 531, 47765, 15861, 51841, 18550, 58560, 38146, 14825, 62396, 48362, 11118, +59337, 1404, 43690, 30844, 5846, 50107, 14079, 54585, 35368, 10732, 38197, +25771, 44360, 2419, 39473, 59099, 6328, 43465, 10621, 44674, 2076, 38068, +62614, 3613, 58121, 13912, 37508, 63534, 4597, 53951, 29528, 65202, 19893, +52252, 22220, 48000, 2280, 44521, 16155, 49711, 23455, 61989, 27029, 45052, +22375, 41850, 13090, 47101, 2192, 50901, 21607, 31606, 39004, 882, 50667, +19613, 44965, 22127, 7864, 65478, 21220, 57643, 19857, 63433, 13322, 40531, + 3357, 49762, 10364, 29559, 60090, 15009, 56705, 38060, 20064, 41438, 22446, +43336, 28891, 9413, 54974, 1829, 61320, 27939, 8683, 64867, 2242, 36120, +58951, 18878, 35791, 54363, 10209, 25231, 36928, 54748, 6932, 63351, 30598, +48342, 11830, 45403, 35068, 9210, 46403, 16019, 40607, 23008, 43499, 19133, +41180, 16917, 47142, 33828, 26408, 53196, 17608, 63192, 14518, 42409, 20012, +46319, 12775, 40058, 30568, 54518, 7292, 41756, 10811, 57016, 3571, 53999, + 6805, 62404, 14861, 56281, 23984, 57582, 5540, 29621, 41289, 6677, 43674, + 1089, 40043, 19183, 47752, 11434, 62480, 21054, 36090, 55696, 466, 47755, + 9798, 50033, 37495, 15766, 47248, 3913, 37407, 29120, 46041, 5182, 36740, +56096, 12909, 27803, 55118, 11969, 61074, 27049, 56444, 7785, 60543, 26600, +54595, 20650, 58856, 3844, 64676, 26061, 45410, 10369, 49331, 4520, 60032, +35989, 23435, 45947, 17064, 40409, 58621, 18783, 63587, 27750, 9167, 51171, +26245, 47460, 8343, 50239, 20984, 34402, 45469, 5309, 23342, 54625, 22271, +14022, 32430, 58322, 19162, 53488, 23820, 60928, 35642, 12654, 34201, 61227, +19945, 37106, 50773, 13970, 45843, 34785, 1970, 39769, 30543, 16667, 65309, +14392, 58735, 29030, 6714, 30149, 51360, 4711, 32256, 53848, 1111, 44373, +17413, 61769, 26280, 13759, 57972, 11657, 64350, 27966, 37064, 2370, 24183, +44534, 5303, 18233, 41408, 21675, 49726, 36104, 13524, 63422, 28930, 43039, + 423, 45448, 27708, 59888, 13192, 29503, 49133, 23298, 12472, 50762, 18453, +39961, 23111, 50125, 26361, 16933, 48614, 20505, 53439, 7046, 30286, 47274, +24230, 13368, 37102, 33575, 4389, 60917, 10931, 37991, 25857, 63240, 3669, +42307, 10697, 37273, 1410, 51614, 16574, 64300, 20330, 39015, 10826, 34754, +56317, 15488, 59887, 29603, 9718, 35737, 60241, 39658, 14072, 43773, 4203, +46832, 25742, 43361, 16722, 59290, 35650, 23629, 47655, 19356, 51011, 7209, +27755, 47935, 13737, 60695, 2785, 52466, 33778, 18211, 49765, 20944, 47119, +30458, 38440, 24268, 50203, 7223, 30621, 64084, 15202, 42563, 59772, 20743, +12205, 41165, 33782, 4792, 26188, 61457, 1550, 53073, 25442, 34046, 59609, + 8359, 55865, 10923, 61718, 4681, 55179, 30435, 2805, 59829, 9661, 39030, +28139, 47575, 8546, 57711, 17005, 63550, 21582, 43706, 15079, 49164, 19785, +51920, 23482, 42396, 26262, 39997, 21300, 49436, 29745, 9154, 40061, 25814, +51194, 16330, 62258, 32610, 55409, 14139, 63671, 30248, 38288, 24355, 50427, +12293, 30903, 42164, 18956, 57579, 28283, 2529, 62714, 21002, 58116, 19358, +54835, 15400, 61735, 26293, 7721, 34881, 45332, 18215, 43079, 32054, 2035, +33453, 50589, 19132, 45427, 11031, 47419, 23194, 39388, 33157, 6145, 35878, +57683, 17930, 39537, 30661, 6817, 64968, 11528, 55488, 29890, 8082, 44882, +13465, 39562, 60133, 17713, 57874, 13932, 31527, 40240, 2520, 59504, 16544, +51809, 33597, 9385, 60041, 35695, 49505, 1119, 37692, 12048, 40999, 3152, +27567, 54213, 6171, 28814, 44655, 999, 28172, 54889, 7720, 61903, 25515, +57985, 6438, 52827, 24716, 33525, 42955, 17406, 62174, 41726, 18830, 57753, +38098, 13619, 59570, 27993, 37876, 3511, 48763, 36222, 24350, 32417, 39173, + 6983, 56662, 30358, 63545, 16349, 51951, 57644, 7313, 65259, 10341, 22892, +46837, 32486, 9386, 25424, 61986, 18867, 51964, 5548, 33487, 54218, 7426, +63034, 33938, 26038, 61299, 4942, 55856, 13172, 59629, 34908, 8680, 33284, +39342, 23090, 57279, 15803, 39059, 59022, 7452, 56143, 27469, 39381, 23550, +57574, 13822, 30183, 52431, 22178, 55505, 19109, 60822, 28419, 38113, 7860, +32584, 60590, 26542, 49325, 5286, 42898, 21049, 38082, 58257, 27565, 5576, +29276, 53625, 17830, 41132, 12285, 52751, 6323, 54721, 27119, 8749, 62153, + 168, 42509, 12914, 36517, 64641, 4605, 53908, 26107, 37558, 15097, 62861, +39684, 10551, 42618, 5763, 53913, 13282, 56657, 17194, 33165, 48075, 909, +39805, 32200, 4177, 46913, 28823, 52363, 16125, 58244, 38144, 18723, 44156, +21726, 60816, 3427, 29301, 42884, 24551, 37529, 21062, 49359, 35062, 14812, +50332, 36043, 23471, 49166, 1150, 33257, 52311, 24614, 38853, 7784, 51669, + 2642, 59752, 29916, 36694, 1038, 63839, 18754, 57870, 11818, 45798, 446, +41602, 54457, 20695, 63400, 11545, 47189, 27155, 9410, 23521, 49823, 27023, + 7559, 57281, 2212, 33428, 58478, 5571, 65157, 33210, 7611, 35145, 53651, +23363, 44205, 12774, 42760, 1504, 41082, 20871, 44087, 30622, 63100, 1054, +59203, 8542, 52965, 20078, 47806, 23708, 5794, 30807, 64298, 28684, 6902, +50782, 13161, 48563, 24069, 2367, 33649, 51431, 15018, 47736, 26632, 38711, + 3600, 49492, 26100, 33578, 56035, 5724, 24376, 44302, 3909, 35288, 64146, +15150, 54327, 24632, 43117, 12276, 65346, 26365, 39356, 5847, 24985, 63525, +22803, 55368, 20439, 57852, 32711, 14483, 40069, 56429, 16123, 64124, 38981, +18494, 41680, 21471, 49637, 14995, 32184, 41346, 765, 50279, 9104, 31401, +36681, 1769, 47579, 11095, 26954, 46265, 34553, 8437, 50525, 31233, 15486, +62839, 6108, 55303, 21922, 43035, 12763, 49413, 8952, 40100, 29785, 24701, +45773, 34771, 30319, 56055, 2765, 57271, 20049, 53394, 33647, 10140, 31089, +40742, 58031, 19728, 41353, 16073, 45700, 549, 35177, 46633, 19074, 41709, + 6502, 52206, 28360, 64797, 724, 44815, 10308, 50826, 2586, 28624, 42933, +18766, 46402, 14509, 51178, 5930, 35083, 46193, 11958, 39638, 6890, 48411, +35118, 5916, 56714, 25576, 50274, 4137, 44878, 13870, 63287, 12053, 54193, + 3528, 22612, 44391, 18862, 50207, 331, 56933, 32788, 60578, 19084, 37827, +21779, 45951, 33923, 28701, 52179, 25549, 58762, 32001, 18575, 44557, 30047, + 8889, 48984, 32842, 4246, 23908, 56394, 32187, 63513, 15643, 43223, 3728, +40726, 57974, 14524, 28916, 53208, 16731, 57215, 22256, 64324, 248, 48714, +24033, 8265, 54246, 13443, 41386, 15163, 38126, 54945, 16727, 64495, 2197, +45439, 29420, 8943, 62869, 31934, 5993, 55914, 13505, 60221, 21673, 36646, + 4347, 55174, 32167, 18526, 46742, 23910, 9458, 50206, 32205, 12655, 44206, + 5111, 50481, 28271, 64927, 13411, 33386, 4147, 43955, 32194, 1744, 56180, +31470, 44638, 3848, 37087, 53607, 17810, 48792, 15945, 39931, 28913, 15156, +51142, 25532, 46150, 10549, 40493, 5908, 52227, 27814, 60463, 11800, 57252, + 3434, 52186, 14386, 49010, 29900, 39463, 25427, 63948, 9802, 35603, 59520, +41893, 2907, 38215, 56583, 18951, 62497, 17407, 55151, 28815, 63444, 8230, +59433, 34936, 16539, 51009, 32192, 14474, 62887, 1254, 36997, 29296, 49900, +14889, 30481, 53079, 6905, 48215, 29401, 7586, 35756, 49229, 631, 44129, +19772, 56598, 41479, 10302, 43716, 7113, 45295, 9830, 41934, 61574, 25787, +11093, 47085, 24047, 9737, 59447, 3556, 43997, 9234, 37463, 63282, 15955, +55558, 19343, 61025, 44916, 12583, 50849, 21772, 40799, 60328, 3772, 22850, +64875, 20101, 56492, 35440, 10847, 33463, 44611, 1450, 52970, 20939, 36419, +27286, 60916, 21, 55142, 20244, 4001, 51202, 19135, 40244, 26860, 44914, + 4871, 48753, 20904, 60957, 22517, 1298, 47300, 11737, 52858, 22253, 57355, +28591, 9611, 64032, 27507, 47406, 16143, 42447, 18602, 49939, 25394, 61181, +19384, 32959, 62779, 11460, 54817, 1342, 64320, 33999, 28538, 61566, 600, +56992, 17323, 64844, 31400, 15973, 46476, 14698, 44390, 17628, 58051, 23352, +36952, 28220, 46170, 18449, 40844, 55886, 8736, 62813, 30647, 45331, 24208, + 7355, 27505, 48793, 1626, 64881, 11365, 57116, 5713, 37729, 10100, 40659, + 2574, 50252, 11568, 39097, 62320, 17724, 56950, 29879, 50801, 20303, 640, +27109, 48186, 21836, 60558, 25974, 7850, 35222, 61037, 6103, 49249, 29936, + 8846, 39303, 33029, 12689, 35887, 50346, 32254, 65217, 6066, 51641, 27062, + 7431, 48874, 12416, 52733, 17593, 58421, 24113, 42005, 15846, 46338, 18901, +43087, 29228, 12090, 64577, 30875, 15709, 41116, 61544, 11448, 37988, 65241, +17719, 55447, 37583, 16112, 60563, 34575, 16950, 37952, 23374, 59664, 37173, +15824, 58102, 38812, 15016, 50652, 20445, 61377, 30895, 10297, 41485, 26432, +60105, 8865, 54549, 35804, 3535, 60946, 20246, 55598, 18227, 61872, 35442, +16716, 33207, 50612, 24492, 46788, 19712, 40846, 24340, 10827, 51631, 5352, +38011, 28050, 53989, 21395, 12162, 52219, 15622, 33725, 44479, 651, 42010, + 9736, 46301, 19854, 43707, 22732, 191, 56314, 9220, 58901, 40259, 22428, +48320, 20429, 65291, 8481, 58418, 37926, 19281, 43441, 21414, 39279, 61004, +17637, 31018, 57744, 15850, 52069, 12699, 27911, 50823, 18189, 60218, 29452, +51352, 21420, 1607, 49163, 34792, 4532, 55340, 29549, 34375, 50500, 19467, +54136, 27490, 4018, 47745, 29235, 39304, 5400, 23904, 56086, 16103, 64559, + 7173, 24158, 54443, 39193, 10511, 42533, 2071, 45786, 26125, 58845, 17174, +40519, 24889, 59934, 4132, 53760, 13798, 33229, 9863, 41935, 61696, 28937, +11463, 59066, 8243, 32919, 64072, 24368, 38310, 7621, 50960, 35113, 27230, +60272, 5166, 43321, 13669, 50984, 39429, 31724, 1544, 32502, 60624, 4280, +55469, 12264, 43453, 5389, 36609, 48672, 17220, 40950, 22585, 44709, 25400, + 7204, 49240, 20621, 43003, 25209, 45253, 34492, 2975, 52942, 29618, 63114, + 224, 33339, 40491, 8445, 53169, 1679, 34401, 61456, 14375, 33129, 49059, +36131, 11122, 20127, 63816, 31900, 52080, 15171, 42886, 18295, 40361, 22853, +53695, 17866, 63677, 23453, 55645, 20414, 58108, 24313, 1003, 45388, 10895, +41583, 8126, 59020, 36427, 51909, 6641, 38892, 10379, 45664, 29633, 50894, +18086, 44619, 14071, 36720, 55809, 17187, 59145, 27573, 62207, 21143, 2525, +28395, 48569, 20483, 58924, 36271, 19898, 43690, 25579, 40020, 6937, 50713, + 293, 56689, 26861, 63682, 3201, 54599, 33892, 7058, 44006, 58266, 586, +27788, 53200, 25892, 3933, 41134, 7024, 23801, 47328, 30325, 8811, 55867, + 3452, 51877, 10266, 29371, 46557, 6980, 30537, 64503, 6160, 41668, 12576, +45476, 22321, 64200, 5206, 31482, 43771, 18209, 45741, 31095, 13891, 43179, + 806, 47542, 31267, 8892, 49167, 4723, 38410, 9303, 29632, 64666, 5671, +57508, 35681, 22601, 60125, 14562, 43515, 273, 45689, 34180, 26714, 61507, + 7963, 29003, 51544, 31236, 60115, 32717, 4037, 30584, 50119, 36187, 19526, +45444, 25453, 6094, 53150, 11720, 41480, 16110, 45630, 31856, 1024, 62131, +10940, 56787, 1984, 26549, 51305, 6084, 34572, 46411, 4413, 32995, 59191, + 2209, 31614, 36956, 4259, 24204, 64714, 36682, 17415, 59931, 31903, 14291, +45402, 7163, 26249, 64929, 13141, 40190, 58327, 24094, 10137, 59304, 32992, +43600, 3198, 37896, 28543, 33876, 49524, 14088, 27744, 52128, 18536, 61132, +16516, 51796, 4847, 31125, 63991, 8403, 29522, 44213, 19417, 47798, 39084, +59734, 26292, 14881, 48573, 35999, 23490, 50784, 13779, 41080, 2283, 56268, +31887, 14713, 64864, 17433, 37264, 31577, 16626, 62292, 4390, 21346, 58841, +24648, 53781, 11646, 37433, 26812, 39195, 22236, 51251, 26676, 8750, 56550, + 4756, 52154, 9549, 37198, 58490, 16042, 40383, 12420, 50679, 8221, 22943, +60074, 24179, 9168, 37588, 27667, 54952, 15318, 65076, 19308, 48917, 24484, + 6050, 51381, 25990, 2369, 23145, 53269, 39643, 4580, 42472, 10620, 61779, +29807, 57873, 3894, 43693, 13477, 47147, 29786, 7729, 43392, 32573, 6950, +47638, 28824, 34262, 60939, 18777, 47000, 29005, 11338, 31072, 61851, 22793, +54520, 16090, 65283, 2889, 39292, 28380, 63044, 2089, 25351, 45991, 4640, +43030, 7235, 47093, 31119, 44901, 9984, 42142, 567, 29258, 62532, 5048, +56330, 13586, 63875, 36340, 20863, 37604, 8147, 31381, 41556, 18110, 50639, +39449, 13283, 23053, 49809, 35725, 8298, 44737, 33449, 56403, 29034, 62183, + 1645, 52570, 27003, 42244, 22168, 40564, 26657, 61647, 18303, 52427, 21031, +35585, 48519, 16730, 59519, 257, 52378, 34931, 20428, 56217, 1308, 63445, +10742, 56748, 37800, 22709, 64399, 34379, 14863, 57743, 25050, 63618, 18900, +56343, 36659, 15880, 43010, 12682, 45177, 2400, 34187, 49354, 18763, 62114, +13566, 57601, 4286, 41229, 25051, 58282, 20916, 7134, 21970, 52159, 26339, +57372, 11154, 64087, 31368, 12806, 61780, 37681, 17515, 60844, 3479, 55164, +35215, 18484, 51102, 22946, 41840, 17175, 49050, 37280, 11643, 61737, 14017, +26018, 64001, 38328, 14561, 40269, 62121, 15401, 56120, 38982, 8598, 27259, +53274, 11940, 38179, 62459, 19119, 56879, 37100, 324, 44772, 30436, 8212, +35261, 46130, 22470, 14264, 63526, 27281, 53298, 9982, 58607, 148, 35557, +63137, 5864, 48508, 25188, 38546, 11546, 34840, 47041, 13018, 50038, 38248, +14585, 64774, 6276, 23071, 2038, 53099, 37865, 6481, 64510, 890, 35024, +60154, 18476, 45853, 15565, 39748, 48331, 3740, 44044, 9892, 55443, 40811, +22915, 36953, 48409, 8255, 42076, 14968, 45728, 21014, 63341, 2745, 57883, +10686, 64199, 38389, 20443, 47331, 27135, 60734, 32099, 19624, 52728, 4197, +63857, 18354, 58772, 39117, 14290, 41810, 57531, 13312, 43587, 6807, 47497, +29650, 37836, 9365, 59613, 40139, 11619, 64539, 31376, 57903, 8065, 28385, +54845, 20798, 47685, 34953, 6847, 26518, 51344, 19574, 61292, 1418, 35184, +49805, 17233, 37546, 63112, 14577, 56136, 6133, 25794, 42904, 2970, 64393, +21260, 44707, 16984, 42209, 1367, 47509, 23942, 32726, 58531, 9260, 23372, +54007, 41326, 14750, 51496, 19806, 56243, 11990, 57712, 22372, 63199, 18012, +55644, 38585, 11225, 41436, 22012, 46642, 27913, 9404, 31930, 60745, 24725, +53155, 10716, 59148, 5567, 26422, 60890, 34461, 10194, 57108, 18932, 62736, +21912, 12026, 42499, 15505, 45054, 18182, 58794, 12983, 63020, 8069, 48371, + 843, 43511, 11221, 59222, 2890, 27652, 53886, 19425, 39528, 28801, 9145, +48216, 36679, 22854, 33890, 49127, 21218, 5741, 50857, 9489, 27178, 45461, + 2711, 41774, 13029, 43468, 30612, 427, 54497, 27086, 60978, 18514, 53304, +26495, 8834, 54954, 28695, 38906, 23222, 50358, 17272, 46622, 12430, 39951, +65404, 34506, 13269, 44382, 17645, 41361, 5072, 53808, 34489, 2077, 29852, +45995, 21953, 42761, 29680, 6724, 60292, 12284, 47129, 4820, 64823, 32611, +19983, 45794, 21852, 40154, 53063, 10705, 22593, 48007, 28866, 8008, 49713, +32460, 18821, 58416, 41640, 5489, 44369, 23538, 2257, 48172, 32412, 17700, +48934, 21981, 52664, 20390, 62721, 2389, 54677, 36945, 7870, 42215, 17482, +47157, 20317, 31217, 46070, 19355, 41732, 30247, 3953, 55046, 28073, 61553, +19825, 55519, 25757, 2732, 51204, 35941, 30363, 49199, 40958, 32144, 12413, +45756, 21831, 43766, 26296, 7092, 52409, 29185, 62777, 8699, 27843, 57611, +21203, 50564, 26611, 1935, 57002, 10813, 29869, 52471, 18079, 61962, 5825, +49686, 15583, 41459, 19711, 46389, 31474, 1016, 58723, 34464, 12926, 41334, + 2140, 43901, 13639, 46109, 26511, 37142, 1770, 30728, 49177, 5084, 33119, +52203, 21501, 61254, 24869, 3469, 56942, 31129, 15106, 33610, 47489, 18042, +44173, 16413, 33882, 47162, 13379, 59076, 2811, 23461, 55816, 39657, 9950, +45687, 34279, 27523, 54338, 11040, 60424, 3249, 30737, 42680, 21961, 35658, +50509, 16564, 48857, 24114, 52990, 4557, 55387, 12932, 57733, 35407, 11917, +43993, 15329, 50190, 38447, 6716, 31824, 65008, 9566, 38111, 25349, 33296, +39131, 4108, 35524, 49674, 13059, 26206, 52250, 16383, 60537, 1943, 33951, +54436, 41304, 4190, 43602, 21405, 47628, 19996, 32837, 45279, 2485, 47518, +20864, 40640, 32355, 2028, 35151, 51328, 4733, 57587, 24627, 37487, 6013, +48892, 32871, 24170, 35760, 56690, 19821, 41527, 22642, 47050, 34528, 8604, +32629, 49701, 15387, 60293, 30373, 13112, 53508, 8084, 27938, 40845, 59586, +15581, 39019, 58993, 19184, 56010, 20936, 54140, 7052, 61990, 24089, 40171, + 7974, 30016, 48199, 6711, 65234, 30878, 36791, 4891, 48123, 9109, 35310, +63746, 1715, 54951, 29706, 4740, 41829, 56384, 1373, 60703, 20781, 48679, +15506, 43580, 26673, 52233, 7328, 57111, 13930, 48558, 25741, 38604, 28845, +34417, 53870, 27200, 8886, 55896, 3723, 58658, 28986, 1343, 36548, 56961, + 6335, 52520, 24795, 41291, 230, 47063, 13136, 30575, 51625, 16838, 49888, +28482, 41029, 6588, 61464, 10900, 57759, 4913, 37919, 26806, 50475, 12930, +30488, 57362, 21352, 61636, 5264, 34798, 53530, 7557, 55982, 9601, 59249, +33376, 13556, 44163, 725, 42423, 7202, 33150, 60562, 22547, 11235, 57360, +20579, 62549, 16501, 57965, 18037, 53614, 9951, 49202, 30202, 37552, 4638, +21575, 53230, 36769, 13244, 46182, 6078, 63278, 32978, 46727, 19176, 65530, + 3049, 44840, 25397, 39902, 28746, 56850, 9017, 54082, 34580, 17732, 45101, +29417, 7499, 64940, 17943, 55915, 22229, 57799, 34369, 9836, 53319, 27957, +55892, 19204, 61678, 26114, 2555, 45683, 10098, 39880, 50917, 20217, 41818, +53672, 664, 26919, 52646, 4883, 38877, 62363, 1242, 42153, 22133, 37722, +50602, 13869, 33276, 64162, 24425, 5165, 59452, 18255, 41188, 23682, 52442, +13113, 54712, 4429, 65387, 12237, 59569, 36193, 9896, 33344, 40505, 25880, +38331, 30653, 17371, 62469, 5621, 55223, 33579, 20747, 49022, 18672, 36554, +28867, 60299, 1090, 53845, 15354, 59885, 25090, 6446, 34325, 61610, 3699, +48069, 35480, 24499, 49128, 19714, 12704, 57186, 15623, 62007, 1397, 35579, +65035, 14890, 53907, 24424, 63333, 5272, 53541, 28084, 59601, 19489, 46007, +30178, 9251, 63749, 28183, 39664, 2286, 53728, 9970, 28151, 50289, 5276, +62603, 14102, 56969, 24982, 64835, 4851, 54366, 37401, 3228, 62822, 26135, +35446, 61223, 2083, 24270, 44507, 28561, 4251, 50059, 9783, 38202, 27531, +47662, 17255, 45746, 14719, 58515, 37449, 16699, 41725, 20580, 46614, 17278, +63012, 22117, 52931, 26607, 14502, 33687, 38581, 18223, 49274, 11813, 30920, +37536, 10527, 39621, 29342, 62682, 8687, 58210, 19990, 39617, 31160, 51565, + 9956, 63756, 2688, 57396, 10224, 20780, 39516, 50235, 16709, 43128, 18914, +41664, 62590, 16637, 31912, 42273, 20183, 64975, 11795, 55242, 26151, 63325, + 3360, 35991, 57562, 8262, 64498, 20655, 53106, 25372, 40130, 15469, 33278, +60164, 11430, 39478, 23244, 48208, 966, 45782, 12228, 30468, 59841, 18063, +39252, 23465, 44626, 15996, 40277, 65222, 21896, 52752, 17823, 58435, 44682, + 9353, 34777, 46243, 27632, 5751, 24468, 50248, 3311, 36979, 30949, 62138, +16072, 57035, 17268, 59336, 40924, 25506, 179, 61591, 33588, 24711, 42623, +20129, 6934, 40353, 28450, 49326, 30690, 9881, 58564, 275, 34031, 47562, +25939, 6024, 62124, 11014, 54447, 25048, 38991, 31195, 10430, 47096, 6569, +28505, 62387, 20336, 43768, 7336, 40680, 10583, 47259, 34955, 17239, 58381, +32169, 13005, 62659, 6510, 23577, 63606, 35731, 10767, 60664, 14089, 25084, +53785, 17455, 65155, 8605, 31763, 60160, 697, 21326, 52448, 38477, 14165, +44445, 6388, 48002, 21145, 40377, 32478, 23098, 41385, 33448, 1512, 29293, +55972, 15642, 59961, 9216, 63840, 3494, 52510, 31857, 46195, 26665, 516, +61743, 11369, 57513, 3397, 51957, 22035, 42725, 18651, 46561, 10271, 51480, +29573, 45613, 18706, 42369, 27205, 10083, 55204, 5432, 65328, 35169, 27380, +46556, 11753, 29794, 51624, 7902, 28799, 37772, 9246, 29521, 48549, 13910, +43494, 7670, 39994, 13369, 49641, 35043, 14799, 52174, 18613, 60781, 15305, +33636, 65297, 16359, 37398, 27014, 45174, 1865, 41743, 13645, 44555, 29516, +17347, 32348, 41784, 6355, 52046, 13591, 36895, 55248, 7606, 63016, 35361, +23627, 32442, 65015, 1767, 34962, 59680, 4501, 52581, 31664, 2843, 61484, +12058, 57127, 1195, 52052, 11637, 44050, 3159, 60517, 30651, 53745, 10818, +59053, 33049, 62295, 16004, 47441, 27675, 53533, 2619, 24041, 46378, 35009, +13145, 64731, 548, 27031, 41032, 21667, 43574, 23221, 41531, 61278, 72, +33617, 63015, 13432, 51498, 8619, 24878, 50621, 13116, 60496, 2791, 36432, +21863, 37958, 16279, 43078, 32245, 13947, 22962, 44917, 31749, 10361, 36284, + 3267, 51452, 27641, 47372, 16748, 44414, 5896, 65456, 15270, 55159, 26651, +35935, 44081, 2850, 48284, 11131, 61348, 1503, 53756, 26252, 6368, 36654, +10062, 39539, 31007, 15042, 29475, 63252, 1169, 54561, 35508, 8505, 39234, +26892, 60450, 5310, 24473, 43146, 1763, 47102, 33372, 9323, 49469, 30289, +38750, 11081, 59593, 14067, 54356, 33864, 58391, 12821, 21938, 61086, 35532, +17718, 50677, 23438, 13380, 59949, 43110, 21370, 48994, 15288, 43592, 3951, +50965, 35462, 24779, 60436, 39764, 3246, 48224, 14035, 65374, 25234, 54035, +15592, 63468, 28533, 36801, 1438, 46101, 16617, 37392, 49857, 17199, 45029, +30212, 20301, 48869, 33299, 9254, 49590, 29138, 44329, 16282, 41514, 28521, +46587, 8431, 29057, 56625, 20625, 65057, 33920, 379, 61134, 8569, 57018, +14801, 51494, 25663, 45356, 6519, 46641, 23397, 50843, 18643, 48450, 27969, +11074, 21867, 60445, 39574, 17276, 43774, 26435, 45373, 12901, 48694, 7932, +63790, 28463, 39973, 21512, 64744, 1697, 54372, 14080, 59251, 32804, 15807, +45326, 22190, 43155, 2670, 31927, 55822, 39210, 16869, 41246, 55139, 15604, +58024, 39181, 20041, 60584, 22637, 54239, 26785, 64715, 177, 58193, 31312, + 4385, 44324, 21813, 49442, 40473, 3344, 31893, 55540, 8263, 30600, 54881, +20704, 58432, 35815, 10238, 45854, 57584, 15002, 49548, 19496, 45146, 17977, +31921, 48296, 20456, 51612, 13240, 47059, 16545, 53335, 11974, 21873, 43784, +36076, 19201, 48734, 24699, 39400, 22702, 43315, 26195, 38789, 18882, 49695, +13062, 45901, 6075, 43288, 24008, 2784, 26152, 52513, 6582, 64488, 13686, +33422, 55961, 21238, 4312, 50184, 23903, 35732, 57970, 5524, 52774, 12551, +49346, 5961, 28289, 48023, 24713, 6542, 37207, 27136, 55099, 38609, 4702, +46673, 26122, 51642, 29233, 58980, 5677, 53890, 9391, 56460, 37096, 60742, + 857, 54716, 26917, 60406, 33747, 13139, 63915, 1339, 56512, 29876, 52169, +25709, 40441, 32849, 6815, 64136, 14436, 51179, 20782, 41415, 27594, 37541, +12131, 49666, 30734, 56423, 24770, 62643, 3639, 53879, 38690, 18552, 42198, +15802, 46963, 65474, 15366, 44941, 18948, 50896, 38421, 13523, 53399, 11336, +23811, 65168, 19456, 55686, 15976, 51457, 3366, 31103, 41206, 21462, 930, +38566, 53636, 4775, 44043, 31836, 7976, 63905, 35983, 3488, 32405, 39983, + 2231, 59522, 19348, 62733, 20983, 55380, 28, 32674, 13295, 51263, 17756, +41975, 33267, 825, 32107, 42325, 4696, 50532, 12259, 55609, 24316, 59110, +28625, 9519, 57565, 5662, 55604, 32448, 2993, 58781, 41502, 26336, 3597, +57354, 36529, 5929, 53847, 14762, 62054, 34219, 2406, 50898, 10184, 26877, +49071, 35945, 26012, 42189, 30292, 7361, 58574, 13272, 63301, 30018, 48, +36739, 32123, 7998, 41172, 58147, 36068, 8457, 30036, 54145, 5355, 41454, +21286, 62654, 16940, 31386, 37018, 3132, 49991, 8417, 32737, 37755, 23973, +47457, 5810, 38483, 62747, 30648, 9053, 59894, 18873, 48300, 21630, 6198, +58686, 30602, 3588, 46488, 31371, 931, 45635, 8928, 41538, 3119, 37468, +17352, 42749, 20709, 47016, 34407, 12097, 57258, 7232, 25370, 58637, 42084, +14650, 50918, 38265, 12401, 48503, 4043, 26096, 62079, 22646, 874, 39183, +25295, 58118, 3784, 65427, 10375, 37669, 106, 33055, 61390, 5113, 41111, +28468, 33648, 50265, 25339, 8320, 64224, 10873, 55299, 5241, 53841, 10591, +59989, 5815, 57955, 27847, 39890, 23162, 59681, 16361, 55684, 31895, 45219, +21198, 41770, 18635, 36850, 49779, 12175, 38057, 61515, 28783, 8149, 46944, +14484, 45103, 19556, 59896, 17229, 55705, 37631, 11075, 53242, 29600, 57211, + 2336, 33060, 19804, 58075, 34393, 8190, 39219, 10797, 41266, 27900, 34335, +47665, 20875, 6073, 28062, 40281, 19236, 43092, 7333, 46414, 21132, 41359, +31691, 22149, 9609, 36627, 3408, 60668, 13594, 52529, 23619, 39733, 29795, +62678, 4419, 56669, 16510, 63477, 21478, 45068, 2480, 48368, 20082, 41683, +32304, 6740, 59028, 10750, 56075, 29751, 34576, 52801, 390, 56454, 9064, +27506, 63076, 29587, 35359, 45306, 3596, 41898, 7167, 43704, 22332, 37097, +56684, 8503, 64452, 43462, 26864, 16121, 48045, 19672, 54553, 39628, 16761, +52386, 29416, 14716, 54978, 26404, 35540, 46782, 11949, 40001, 15072, 42205, +52543, 22554, 35142, 59338, 8799, 55272, 21816, 60228, 18716, 56468, 22818, +43136, 19259, 40307, 3922, 47621, 34565, 26026, 43553, 15884, 50492, 37825, +13034, 21103, 53015, 34567, 12743, 30074, 63194, 21741, 42241, 18923, 49787, +24951, 39291, 30409, 58353, 19234, 11539, 52741, 2498, 62586, 38001, 18800, +42802, 21267, 37877, 54076, 14761, 43313, 55040, 20668, 2178, 50611, 19776, +44504, 22233, 64014, 15158, 52530, 2006, 34952, 58996, 17884, 54775, 24765, +58106, 19703, 60739, 12056, 34793, 57087, 22676, 823, 49554, 26581, 36145, +52081, 10530, 64092, 35135, 43415, 13213, 62617, 34995, 17534, 64377, 14567, +55432, 18539, 61822, 23156, 52935, 12498, 55029, 8141, 61339, 23777, 37510, +29864, 45992, 10333, 22238, 61917, 24580, 5956, 63275, 23739, 34188, 47229, + 7494, 43359, 31134, 63956, 8449, 30031, 42798, 22088, 53347, 26027, 58596, +17745, 38667, 25375, 57408, 8789, 62917, 3265, 57009, 34503, 27992, 45432, +17967, 42237, 28493, 36714, 20990, 42765, 30983, 9619, 64800, 849, 29046, +41606, 7798, 48847, 10055, 61126, 412, 57114, 24925, 5762, 59582, 31498, +17231, 42588, 54474, 22275, 62546, 28999, 39023, 1822, 36422, 32170, 18593, +64405, 21057, 45154, 17742, 40187, 65159, 9752, 43460, 22022, 62885, 17011, +55516, 19379, 64244, 1788, 23815, 62257, 30988, 52837, 11422, 62930, 15695, +54157, 24587, 58991, 8467, 55337, 37873, 62064, 18646, 45113, 22374, 47180, +34400, 1820, 53836, 9420, 25730, 45472, 19881, 43414, 5107, 41968, 14465, +60384, 35258, 11326, 57813, 21592, 43973, 26888, 49730, 22082, 4424, 14475, +31452, 40895, 22863, 34342, 46552, 20562, 5928, 57912, 14520, 54485, 29272, +58727, 18074, 63579, 13532, 26915, 47070, 23544, 12286, 60354, 34433, 10283, +62855, 2008, 29913, 45831, 6260, 38484, 65152, 9364, 44671, 5427, 29923, +56435, 6808, 61041, 28766, 9205, 64447, 5159, 26094, 46874, 31272, 45349, +11393, 40121, 14664, 48584, 6399, 64677, 11701, 53833, 14323, 62062, 2010, +33620, 60373, 7823, 23467, 63994, 39464, 6471, 61157, 23266, 44924, 11614, +48539, 3769, 57550, 7903, 42987, 12609, 54154, 4148, 34653, 63474, 22537, +46125, 17524, 31729, 54833, 3647, 57206, 9007, 26138, 61958, 5078, 27021, +64555, 35013, 25032, 59301, 3831, 48846, 10407, 32122, 37519, 25846, 47357, + 6551, 41696, 11710, 45202, 14742, 43914, 4762, 45933, 28373, 8810, 51453, +41498, 17600, 57969, 4461, 24253, 42874, 27777, 69, 23581, 51156, 22523, +10404, 49528, 36610, 27616, 34078, 47048, 10871, 43880, 6175, 38859, 25419, +41503, 16461, 44997, 1252, 64109, 18993, 54458, 35403, 393, 48950, 29380, +41970, 16052, 59115, 17103, 55979, 12657, 52804, 20275, 35460, 56411, 10936, +47790, 5884, 41603, 11370, 46603, 7770, 49782, 21206, 45545, 15962, 40258, +13886, 47531, 750, 30711, 62270, 13258, 56632, 2061, 63907, 14217, 55442, +34539, 21822, 35688, 54401, 20355, 63390, 19019, 36885, 30149, 50905, 14552, +46918, 29619, 41092, 1495, 55356, 11047, 33367, 3063, 36700, 9160, 56225, +24948, 61959, 7396, 46401, 3347, 41298, 8302, 60250, 11632, 23094, 49262, +30542, 593, 32062, 44430, 3827, 42778, 15322, 48655, 40329, 12786, 44048, +20305, 42337, 4813, 47224, 30106, 2160, 35350, 45780, 19935, 6226, 28439, +51656, 11889, 57199, 7384, 28933, 59617, 21461, 37123, 58319, 13095, 52909, +23625, 55420, 18667, 52082, 8334, 25623, 46370, 28929, 8783, 63770, 2259, +35900, 42597, 59832, 48498, 7383, 63925, 12135, 58375, 2855, 54729, 39245, +22320, 47632, 26128, 12385, 34432, 50118, 1459, 39934, 52551, 5031, 32816, +54726, 2903, 50789, 28730, 36913, 25307, 56457, 11815, 59229, 18093, 33513, +50579, 17293, 48622, 15873, 34921, 50089, 18035, 47654, 24218, 38514, 29768, +57294, 19483, 5778, 27678, 52761, 2657, 62216, 26986, 36751, 29152, 45242, +21427, 41037, 20120, 46882, 14960, 39567, 29055, 48059, 99, 27854, 46026, +15834, 49909, 1951, 56419, 27907, 37834, 26220, 33135, 63902, 22932, 43926, +20935, 47425, 9288, 39665, 6185, 50335, 9775, 35006, 44651, 19548, 48134, +40352, 16243, 48998, 37823, 10830, 45378, 7079, 34083, 53174, 19020, 38850, +59732, 7623, 57109, 20112, 55477, 22177, 62129, 141, 38198, 29597, 56069, +17870, 64273, 40223, 14657, 31847, 53164, 11633, 34143, 61003, 7723, 54041, +31250, 60252, 7180, 32792, 56293, 24276, 6632, 52355, 3899, 25491, 58459, +30449, 56664, 14941, 63437, 2825, 56250, 27735, 50185, 13892, 39586, 5644, +47349, 31428, 13245, 57460, 9041, 51740, 1413, 37606, 29867, 45516, 28377, + 2995, 50433, 15768, 39800, 26890, 60528, 21490, 54849, 24453, 59810, 30719, + 1144, 34677, 54300, 23403, 51856, 20463, 58923, 37721, 6201, 46968, 19592, +44296, 23389, 46229, 3776, 50334, 8209, 46761, 11062, 44630, 3555, 32277, +57766, 5311, 27643, 42540, 9688, 63212, 21618, 50696, 16118, 39318, 59149, +25435, 49086, 32352, 19058, 42629, 13649, 52132, 30237, 54134, 15547, 48462, +31860, 50863, 33966, 5459, 59775, 25193, 54186, 18288, 61158, 21174, 52239, + 7592, 33178, 58204, 2948, 55318, 14382, 58639, 18005, 39572, 65136, 12849, +23743, 53582, 32290, 43938, 437, 42321, 19921, 38577, 49145, 12604, 44769, + 5544, 32189, 40300, 635, 36361, 10289, 38319, 29219, 33824, 64592, 272, +54305, 34801, 23847, 51164, 20074, 9488, 26257, 18020, 44485, 23664, 50566, +26227, 37066, 32141, 16599, 64288, 840, 40374, 62304, 5604, 23683, 45936, +28121, 17019, 61870, 38002, 15534, 44633, 21072, 59404, 7584, 48882, 15442, +42167, 21595, 47381, 661, 30704, 58279, 24639, 63108, 1528, 30830, 40800, + 3563, 55814, 11690, 44477, 1947, 51047, 37466, 64002, 20399, 47341, 30659, + 9259, 53401, 415, 33981, 59895, 5155, 54613, 24247, 65311, 11280, 56600, +16587, 36772, 55320, 10618, 58311, 25399, 39390, 33399, 16749, 61501, 13262, +52665, 1118, 36891, 8768, 60025, 27670, 55247, 18605, 59245, 23930, 61688, +26988, 13615, 64944, 28045, 2613, 53461, 32689, 18203, 52040, 22967, 61509, +30021, 11625, 43045, 777, 23308, 45026, 30533, 3997, 32756, 46379, 15711, +33407, 51100, 7252, 23773, 50399, 1494, 26322, 59538, 6518, 37239, 28238, +46315, 17221, 40080, 20994, 43981, 15904, 47925, 40308, 2236, 42463, 59328, +19077, 35971, 50845, 20957, 1522, 33990, 49930, 19948, 47811, 30627, 9512, +34347, 56535, 25943, 60956, 17853, 53096, 34574, 22499, 32550, 39573, 27301, +65102, 4998, 21620, 60789, 42435, 24411, 62435, 1538, 52440, 12459, 36963, + 2466, 43563, 16331, 41497, 64427, 26743, 9471, 60746, 4962, 43567, 10178, +26419, 52402, 22992, 40452, 7880, 53022, 15276, 37804, 25350, 58708, 29773, +61965, 16523, 37862, 49935, 15670, 39436, 53897, 19829, 49543, 36069, 7883, +34651, 65265, 23077, 7127, 52629, 11933, 64264, 4480, 51134, 26719, 39985, +12068, 23640, 58992, 26497, 1288, 20507, 56420, 39022, 14021, 42353, 7216, +46342, 10164, 37471, 26172, 60138, 11776, 24759, 50349, 35741, 27586, 34334, +50924, 10800, 36451, 29360, 49863, 3748, 63241, 17409, 55904, 15490, 64618, +27445, 3920, 61928, 17678, 55751, 15538, 65054, 26502, 60095, 28303, 57447, + 3457, 49044, 15630, 41297, 18171, 46946, 13727, 29479, 61963, 31802, 55590, +52215, 34148, 3830, 39454, 10424, 61400, 7756, 49112, 13053, 44361, 10553, +36450, 30103, 53782, 11787, 58089, 34221, 8940, 24771, 49373, 6520, 40814, +14411, 43062, 20391, 63628, 4141, 53979, 26104, 61680, 12455, 40198, 7566, +33023, 52974, 14132, 63757, 36797, 20572, 49205, 18267, 61618, 33189, 23188, + 7660, 43328, 13011, 38408, 58706, 19573, 50871, 25530, 10761, 48471, 31476, + 7161, 32413, 44165, 4192, 51086, 32925, 18733, 43188, 29459, 7552, 64771, +10092, 51946, 5464, 45611, 17279, 31680, 55983, 24285, 40645, 1733, 30051, +45066, 14438, 41193, 865, 53035, 33910, 5839, 36177, 58934, 22751, 8629, +60799, 1224, 41358, 15961, 55324, 26242, 64834, 35181, 54538, 13216, 60893, +27226, 51679, 9147, 30411, 56855, 19279, 63435, 35817, 13856, 34102, 48599, +21354, 54292, 15427, 64781, 1827, 55709, 12049, 62055, 4097, 56581, 29440, +14391, 61518, 30570, 9623, 31652, 62336, 7514, 40085, 65467, 27532, 5471, +43209, 11718, 37231, 62840, 22458, 3976, 46441, 11140, 40841, 7094, 64366, + 3103, 59537, 14353, 47593, 19752, 53889, 34014, 9466, 36243, 6709, 31399, +43761, 20566, 45316, 27785, 61674, 13040, 53509, 6697, 20567, 48804, 37071, +18195, 41191, 22250, 64906, 34200, 12216, 57307, 16893, 60851, 27711, 33198, +62826, 12691, 39746, 2347, 23873, 51527, 26565, 12086, 65114, 24830, 8566, +58431, 2912, 24299, 48477, 28092, 3896, 47447, 29675, 42305, 21897, 40310, +33354, 21188, 57547, 738, 63160, 36214, 5800, 43703, 63586, 35706, 7680, +26442, 52395, 19591, 63894, 35341, 29011, 50136, 1105, 38588, 30003, 45776, +19537, 9578, 63768, 37, 24074, 56045, 5600, 57845, 14831, 40863, 12147, +47005, 26268, 36966, 9086, 50291, 35417, 24209, 41662, 28211, 49449, 8726, +46964, 5867, 42328, 14879, 43759, 20867, 58156, 10556, 61178, 4602, 57011, +38470, 6128, 43326, 1597, 13397, 28979, 62412, 17382, 44973, 19229, 42185, +21231, 51900, 29022, 56577, 15321, 60504, 18432, 43950, 4024, 49949, 30441, +56948, 19159, 64163, 26762, 56224, 1241, 51727, 27754, 39472, 32685, 8509, +34657, 43683, 22721, 57106, 17800, 42176, 28090, 8419, 31422, 59837, 6396, +42191, 29124, 9998, 36336, 56997, 17275, 60833, 4194, 24228, 42434, 13538, +63505, 37941, 17763, 58107, 28323, 52528, 19244, 59403, 26907, 8912, 62557, + 3368, 54062, 35665, 17987, 47280, 22643, 41646, 21109, 59077, 38649, 11883, +46719, 15959, 64605, 37626, 5016, 57359, 20497, 49153, 11399, 45458, 24362, +49750, 10127, 35035, 46440, 25542, 44109, 12679, 49879, 4483, 46628, 9006, +19585, 32055, 42235, 8564, 40881, 21244, 65528, 42722, 4321, 47520, 12266, +43140, 28000, 61511, 11367, 39166, 3761, 44019, 19524, 40869, 25044, 49433, +19816, 39229, 33742, 8375, 50229, 35661, 16816, 54163, 40993, 17435, 44963, +24789, 10581, 35516, 60371, 21846, 55829, 24450, 6610, 52571, 42560, 20542, +58250, 23431, 43820, 19407, 45847, 25869, 50255, 7316, 41171, 16558, 46522, +27122, 59653, 19265, 55787, 9747, 64600, 5333, 50788, 19193, 40540, 23227, +36569, 55507, 3573, 29683, 50758, 14265, 44618, 2255, 49277, 31581, 3892, +48241, 36000, 58, 49489, 6800, 51903, 22291, 56299, 34912, 6031, 57393, +41355, 1585, 45247, 35363, 14860, 33734, 61908, 10586, 56495, 37429, 13565, +60476, 1069, 55568, 10158, 60117, 7925, 43568, 33843, 16948, 49973, 31141, +21828, 10118, 52997, 29782, 61764, 2631, 47370, 27081, 4425, 58886, 13453, +54701, 14915, 65527, 4615, 56929, 39735, 21584, 44918, 33052, 16723, 47875, +25328, 43386, 22274, 59935, 29231, 4710, 59262, 33485, 21050, 57879, 8356, +52068, 2289, 38698, 31638, 19408, 54310, 22887, 62149, 7650, 52359, 27602, +37367, 24644, 41882, 32367, 12074, 52958, 16926, 60649, 37591, 47182, 9779, +51563, 28072, 59422, 1877, 55786, 25734, 6115, 33441, 48264, 2665, 39786, +26303, 65002, 14345, 42438, 465, 38837, 11583, 46112, 17108, 31971, 37317, + 9708, 56800, 19892, 60136, 16214, 52001, 4843, 33865, 51329, 3067, 58648, +45288, 14717, 35227, 51701, 15901, 54764, 22019, 50418, 1100, 48510, 28487, +34439, 54079, 7433, 46950, 32453, 3016, 45827, 11972, 42871, 1066, 40824, +14628, 37516, 49327, 21331, 41734, 19863, 45185, 31469, 562, 59914, 10930, +50271, 3131, 25496, 61954, 4659, 51633, 33078, 17798, 48323, 12154, 36292, +30417, 60652, 16447, 56753, 15025, 30133, 62711, 4088, 54453, 19609, 58407, +21067, 39978, 28708, 51864, 37478, 2917, 63356, 24960, 55912, 1600, 35362, +12987, 38739, 26682, 58605, 2456, 53410, 6969, 46798, 17484, 62902, 29981, +52013, 10862, 46835, 6775, 30788, 53646, 18625, 64951, 23906, 5217, 46608, +26902, 659, 57380, 13188, 55562, 29636, 50466, 16925, 41349, 525, 49206, +39088, 29752, 10066, 36939, 1724, 50769, 14142, 54127, 36144, 11517, 35064, +56379, 13547, 61416, 611, 51881, 11388, 48976, 35473, 23765, 32673, 39517, +13849, 56654, 4065, 62580, 10444, 28201, 39506, 63262, 7323, 57891, 28994, +53522, 14632, 39913, 62511, 25566, 13804, 57802, 31187, 43572, 17454, 42173, +11575, 48770, 31568, 15365, 29735, 55292, 17296, 60625, 28368, 52791, 20802, +44798, 16782, 26081, 52240, 19275, 31756, 36788, 23525, 44595, 29889, 15164, +54605, 28489, 8711, 57875, 42712, 33437, 17386, 45837, 14970, 40558, 11992, +57308, 34034, 22114, 42061, 27403, 41196, 22968, 48334, 31789, 6977, 49339, +13670, 59683, 37293, 10159, 62372, 1483, 51906, 8165, 37851, 52778, 13064, +48463, 1165, 40586, 32496, 14617, 62950, 16847, 58635, 36588, 11950, 47530, +16710, 31821, 36313, 2685, 48019, 8140, 51469, 19484, 64730, 20940, 41604, +25658, 7220, 21840, 57156, 35959, 6418, 33786, 46568, 18144, 40305, 60003, +17058, 37427, 23168, 50931, 9985, 35327, 46850, 20592, 61488, 25582, 54244, + 4431, 36319, 62202, 21864, 44116, 14936, 46256, 2427, 40992, 26594, 62426, +11289, 38482, 30300, 15545, 32686, 56369, 540, 28514, 45682, 4437, 65240, +33655, 20769, 40713, 9461, 49903, 18259, 61799, 27626, 15991, 56088, 24671, +61061, 22138, 55081, 23341, 64281, 6035, 28314, 58913, 13155, 55891, 6324, +62853, 34496, 26914, 54645, 28837, 34196, 48077, 19476, 42550, 27212, 7642, +53358, 22569, 42183, 64201, 7007, 26260, 42841, 1903, 40897, 51710, 17360, +39798, 13246, 37781, 6219, 33431, 62399, 13773, 22467, 58068, 30753, 14660, +49898, 16208, 31465, 59139, 24193, 53874, 16427, 33886, 45879, 19658, 40438, +22299, 51093, 25783, 8475, 34900, 56982, 17927, 63552, 37589, 1205, 45314, +13437, 37240, 58099, 15371, 63808, 34403, 23491, 47226, 3303, 43637, 6891, +54765, 13647, 62135, 33033, 17567, 59712, 25717, 65046, 33342, 27642, 61811, + 5401, 23830, 60256, 2142, 28631, 44358, 22638, 39950, 20598, 43291, 29974, + 3449, 53747, 14804, 48357, 25725, 34741, 46103, 17359, 41831, 57613, 12155, +22050, 45640, 24053, 11699, 35765, 58669, 20880, 8835, 35187, 46065, 22530, + 9468, 26937, 60174, 4263, 64362, 19837, 39286, 61483, 8930, 34523, 47515, + 4416, 43194, 7533, 41404, 136, 59684, 39134, 5051, 41519, 63406, 14170, +49049, 2550, 39287, 62288, 4176, 47938, 36025, 20125, 2852, 61343, 38242, + 5147, 50578, 22877, 44439, 16446, 48941, 8725, 60811, 3542, 56593, 9082, +36307, 20833, 61865, 26627, 53773, 3965, 27967, 45946, 21410, 39119, 19045, +45578, 16266, 31746, 42079, 23174, 60607, 15886, 55217, 27077, 34887, 46074, + 4264, 26192, 63635, 1563, 39049, 56538, 19721, 64051, 22979, 55798, 29929, + 1060, 34613, 47653, 4189, 50360, 63107, 34724, 606, 24954, 49869, 23292, +11682, 65295, 4368, 31481, 53258, 8562, 63159, 16174, 57370, 29073, 7462, +50740, 13699, 40708, 21393, 48068, 28678, 8155, 52315, 3686, 65403, 35514, +24217, 55427, 13457, 29125, 46602, 19104, 64643, 43115, 5968, 40096, 24366, +62290, 13792, 30487, 39986, 8197, 58543, 25906, 63185, 13877, 41661, 1739, +37431, 49479, 9092, 42308, 4721, 38342, 8428, 43437, 12358, 46796, 34105, + 1500, 38831, 29847, 47873, 15665, 43882, 14029, 37298, 7276, 65250, 9575, +55481, 14539, 60484, 35147, 13726, 58738, 2312, 21444, 33553, 54567, 18060, +59699, 33215, 7352, 31442, 56145, 23460, 63936, 27282, 52607, 1812, 35418, +45559, 6701, 47618, 35775, 5646, 34237, 50735, 10392, 44708, 6098, 62358, + 9820, 30104, 56521, 13447, 59916, 496, 42301, 58880, 23398, 2783, 41411, +32696, 15120, 59038, 26855, 54658, 2959, 30837, 41956, 6443, 49682, 9910, +30553, 63073, 21102, 39508, 22533, 46775, 27347, 8770, 53670, 3416, 42965, +14808, 49485, 12153, 37898, 29921, 52217, 16438, 32688, 63880, 6379, 54487, +12558, 63326, 5628, 57448, 22302, 36526, 59334, 356, 63537, 8956, 27591, +49694, 1806, 25129, 51785, 35320, 528, 61190, 38274, 5691, 24811, 45479, +29880, 55606, 4924, 65454, 32294, 53686, 20651, 38143, 16800, 46012, 667, +33281, 49401, 22883, 14130, 54618, 23584, 64065, 18959, 51732, 29045, 11671, +48673, 30579, 8474, 53159, 27134, 58386, 17394, 30856, 45320, 13065, 65395, +32229, 51751, 12713, 25376, 58181, 17994, 64655, 1567, 55344, 28492, 39300, +24471, 49673, 17222, 33250, 51237, 1888, 41800, 9859, 38028, 30769, 61280, + 6675, 54397, 11672, 64382, 30054, 56709, 2547, 63515, 9918, 29531, 43728, + 5068, 51159, 9441, 23036, 56239, 41052, 14105, 44343, 28817, 6336, 50387, +12741, 42294, 16152, 38373, 58760, 27578, 11598, 56700, 23076, 16374, 48745, +29601, 63708, 15657, 57850, 36223, 27048, 50501, 14416, 38838, 24989, 41944, +32165, 1674, 49036, 23861, 34662, 58514, 5829, 55489, 12919, 60011, 38188, +18604, 47258, 27129, 10844, 48598, 7035, 37622, 57855, 1134, 53370, 9476, +26781, 60489, 20855, 53755, 8753, 36001, 53236, 19079, 46694, 31656, 3692, +32544, 45796, 22586, 51567, 20622, 33792, 64977, 19018, 53724, 20552, 62168, +26316, 56983, 17118, 53448, 24123, 63726, 9189, 25460, 57902, 4409, 52816, +23114, 43133, 16966, 45050, 29389, 40060, 199, 50090, 26146, 39272, 29186, +51861, 40260, 4383, 48207, 9505, 23860, 65457, 43121, 315, 47725, 10541, +44962, 16775, 31159, 56650, 11249, 60523, 20151, 54901, 27588, 61608, 17951, +40484, 20086, 49293, 35082, 25398, 43547, 4531, 48417, 27730, 37307, 32158, +15257, 45583, 28772, 60444, 5364, 29790, 42544, 8788, 40369, 25395, 50940, +19706, 43917, 21927, 60064, 37751, 14748, 45874, 12165, 59516, 4619, 34735, +44435, 15767, 48012, 23167, 54400, 4915, 45394, 18576, 43411, 10384, 48651, +37880, 18888, 42451, 27655, 37157, 24807, 41861, 16101, 50595, 9248, 28731, +42764, 18570, 33415, 54472, 19653, 60148, 32727, 8319, 47393, 31028, 16778, +52902, 29374, 63419, 1423, 50599, 12888, 43008, 15213, 47352, 1925, 44249, +13642, 54935, 23305, 59376, 26167, 6657, 62932, 40458, 30096, 10465, 34295, +46562, 14990, 36348, 62693, 17681, 56846, 22933, 38554, 5293, 35146, 50339, + 9574, 36412, 53092, 23141, 6798, 40512, 29220, 47204, 10981, 43403, 26159, +37535, 32677, 5605, 62464, 12452, 37222, 28212, 63148, 14767, 58501, 23742, +52449, 15897, 44514, 18372, 41780, 22753, 46900, 26082, 6361, 41656, 33466, +24672, 35595, 54350, 18695, 64813, 21571, 38614, 50102, 11125, 32546, 53216, +20402, 59496, 36917, 17250, 44793, 4940, 60511, 9696, 22493, 51884, 39580, +14958, 44401, 37060, 10959, 54496, 8208, 43173, 2934, 44596, 9218, 34927, +62068, 68, 58725, 6964, 52200, 35768, 19678, 60809, 3183, 28176, 45752, +18099, 42989, 2118, 31943, 57500, 9096, 34068, 52938, 19131, 63388, 32037, +17998, 42383, 22252, 36516, 49825, 12114, 46123, 16045, 31491, 48309, 2787, +60754, 11063, 55613, 23877, 54298, 6686, 60222, 11820, 57760, 5703, 28179, +41242, 14358, 47525, 29382, 2483, 35406, 45471, 5285, 42742, 14257, 49772, +37514, 17491, 45966, 12502, 61015, 1798, 56858, 24944, 5234, 54353, 31122, +12505, 62883, 5579, 56161, 10504, 18935, 63362, 27091, 36195, 50979, 20367, +13845, 36944, 28174, 59081, 4945, 34359, 48511, 19433, 42777, 15683, 39383, + 435, 42220, 9520, 45351, 3333, 64079, 27920, 1013, 52920, 17300, 65182, +34229, 10720, 62154, 5723, 53865, 10262, 49886, 21364, 36468, 51516, 12570, +62493, 21205, 56804, 11402, 60761, 14100, 53014, 4372, 25345, 56914, 1912, +52608, 35659, 23579, 64193, 19124, 57685, 28958, 8225, 32576, 60536, 25324, +57012, 45, 62876, 26661, 4427, 52609, 9955, 58974, 2814, 55554, 10630, +61024, 34449, 23264, 47627, 6587, 57934, 38498, 4719, 44175, 12737, 37771, +65326, 15134, 56218, 33904, 8585, 44561, 15908, 41394, 19846, 61623, 28355, +37011, 23824, 59106, 29083, 49887, 5222, 40945, 10689, 42534, 51849, 21362, + 2017, 44154, 58623, 27323, 3330, 57510, 6431, 24943, 42635, 1952, 45487, +12642, 64913, 14439, 25269, 60795, 22371, 1705, 34901, 56694, 14279, 60332, + 243, 54846, 30072, 7896, 60047, 15972, 43942, 20178, 51484, 401, 47532, + 7312, 44201, 29320, 5444, 35464, 64860, 943, 55060, 11035, 58576, 2892, +36938, 60361, 13435, 50049, 7675, 45900, 3648, 41194, 11641, 45340, 85, +28714, 59914, 24135, 3203, 48138, 8965, 23786, 61616, 25489, 53193, 21853, +48307, 35494, 5892, 30226, 61238, 2488, 58064, 22087, 40234, 33140, 26088, +53877, 19261, 47961, 20832, 30645, 45122, 15755, 46666, 21677, 63982, 9406, +31625, 53520, 37437, 10647, 64837, 26194, 51052, 16215, 40907, 24804, 60975, + 164, 30586, 39785, 5289, 51072, 12457, 61185, 4554, 32070, 57580, 2292, +34997, 64055, 17506, 37766, 28414, 44210, 15436, 42140, 17668, 39328, 26494, +44103, 18638, 32599, 54791, 741, 59986, 9351, 39912, 52376, 15325, 30156, +61217, 18861, 55572, 28607, 2646, 61860, 30276, 38589, 18987, 46988, 20869, +38527, 62294, 17329, 37036, 47221, 16069, 44376, 23710, 35489, 46886, 30280, +11070, 43858, 3128, 57583, 29252, 55108, 12183, 38834, 25878, 53916, 7964, +65120, 3589, 53616, 25361, 62913, 18616, 57462, 21923, 51419, 15021, 38811, +59618, 22779, 47735, 8085, 24653, 45334, 18252, 44118, 19570, 64519, 35376, + 8018, 55594, 19889, 33389, 44191, 4515, 28988, 45825, 1591, 39498, 27630, +34305, 48801, 17717, 41141, 30932, 14151, 49135, 9403, 50710, 1124, 41805, +63555, 17818, 39435, 10985, 35053, 46809, 13784, 40568, 58046, 23562, 47612, +18069, 45042, 21761, 46358, 29051, 1908, 64770, 13468, 52214, 30012, 11107, +62026, 24051, 56847, 6227, 29116, 41689, 4395, 48358, 21235, 35753, 54138, +11255, 49247, 34178, 3196, 50986, 7678, 38754, 11039, 33894, 61128, 19410, +56729, 28511, 12290, 38492, 56033, 22520, 8204, 40898, 49799, 20639, 38858, +55030, 16041, 60944, 30030, 54399, 19927, 47764, 32766, 6256, 55066, 29248, +49716, 18881, 42584, 24157, 38913, 19583, 48298, 33810, 20657, 52195, 11339, +57074, 26553, 40407, 15762, 53450, 18309, 36962, 46470, 12884, 24855, 47374, +20055, 39518, 29593, 51564, 14682, 27818, 53722, 21096, 62297, 17548, 59049, +20575, 55748, 24914, 61533, 34173, 7511, 36062, 65288, 18083, 33447, 45666, + 767, 40138, 11192, 41522, 2148, 65118, 20645, 54176, 17333, 31988, 13236, +44808, 3703, 61589, 10166, 30217, 60416, 5314, 56741, 10888, 36114, 55508, +28919, 12490, 38381, 26456, 44938, 14124, 22435, 51547, 30513, 6842, 36127, +63208, 4697, 43791, 21363, 35069, 54895, 16805, 59610, 22913, 44846, 26274, +47371, 19535, 37968, 25661, 52365, 7429, 29257, 50369, 7026, 24717, 58098, + 131, 64460, 10634, 49089, 2588, 36857, 50662, 15220, 44895, 25775, 49965, +18117, 31415, 59553, 10973, 38798, 32036, 7152, 36641, 51158, 23558, 5844, +53844, 31867, 8321, 51943, 11803, 33387, 49043, 7135, 22403, 57655, 32035, + 8797, 60694, 726, 54143, 19746, 61861, 34089, 21765, 45890, 6450, 49420, +17741, 62025, 14581, 41639, 27587, 37511, 20859, 43529, 13046, 46977, 28736, +37899, 8210, 56925, 31950, 6833, 42855, 14212, 36925, 58339, 3062, 55873, +26615, 38275, 2104, 25264, 47429, 31633, 339, 58347, 22251, 35286, 50014, +16375, 32325, 63978, 10323, 58700, 7830, 31964, 65140, 7120, 56453, 33394, +25412, 38467, 31230, 15177, 34297, 51265, 2425, 48907, 16365, 31100, 55825, +20836, 32358, 7982, 34383, 65513, 14293, 38219, 7284, 49756, 35673, 25832, +32883, 39815, 16826, 48933, 32251, 14396, 42062, 21827, 54761, 17291, 59493, +23844, 63829, 2956, 26106, 58952, 6308, 25235, 56450, 22301, 63995, 20335, +53352, 27749, 9062, 47319, 2733, 37267, 65029, 31069, 9751, 35159, 61605, +25086, 13257, 64705, 28921, 11110, 49364, 26843, 7010, 34730, 43966, 475, +51790, 40952, 15883, 45016, 9999, 64112, 4558, 53299, 11586, 62956, 4967, +57575, 39921, 3219, 45734, 35119, 6000, 63964, 32655, 25276, 61010, 10816, +57786, 32441, 55913, 7981, 33549, 62854, 5237, 23541, 45007, 34688, 561, +40575, 10771, 37948, 26765, 49294, 6628, 39404, 16337, 53655, 21214, 46306, +10192, 38931, 54759, 14689, 57811, 29953, 62868, 15556, 52495, 32052, 45090, +10339, 40746, 51031, 64185, 28912, 48247, 16664, 49338, 37462, 14933, 42406, +18284, 50149, 24161, 5037, 41959, 57716, 3482, 55106, 6250, 59807, 40241, + 776, 41739, 58173, 23140, 13987, 31530, 56504, 13306, 46192, 7698, 43016, +11685, 38682, 3414, 51960, 8973, 65092, 13975, 44126, 16793, 40604, 55866, +14876, 63320, 38661, 18518, 45155, 28348, 52492, 20931, 62454, 29957, 7856, +63879, 33195, 6474, 35978, 63051, 4317, 34717, 50468, 363, 43845, 65439, +21631, 12022, 57402, 41208, 17833, 64343, 35318, 27477, 59702, 3046, 30170, +63966, 38937, 2727, 47951, 28486, 37490, 22898, 41865, 31936, 5712, 50537, +11925, 32633, 63663, 24249, 41115, 2605, 47107, 21943, 51767, 12465, 58891, + 7064, 55595, 34293, 2233, 48969, 26090, 36710, 18313, 54385, 21463, 61200, +29319, 12797, 50392, 34585, 7539, 52508, 30550, 57265, 15888, 63330, 27356, +38595, 10107, 65314, 6590, 55769, 37349, 18865, 47251, 20528, 40163, 51978, +15808, 28962, 41951, 2719, 58857, 13082, 61739, 45201, 7288, 27007, 59150, +24104, 64727, 6784, 36941, 3529, 62365, 43701, 27611, 1043, 53512, 26173, +60173, 20487, 54137, 8390, 56236, 3257, 59868, 35891, 1270, 53135, 26933, +49501, 2563, 45596, 34940, 9501, 39060, 29963, 45141, 17773, 38912, 47738, +12378, 42064, 14407, 44679, 937, 63113, 35686, 25159, 52680, 21018, 5556, +50720, 26531, 48387, 4842, 53203, 32507, 1268, 45835, 34136, 4107, 36026, +51212, 23945, 11302, 59454, 27484, 9224, 61831, 34026, 25672, 36505, 46705, +17731, 41632, 22559, 44834, 26648, 13806, 65082, 31038, 17366, 48087, 12941, +54749, 4134, 41379, 33627, 2697, 21542, 40883, 27538, 50590, 17598, 37553, +60878, 9181, 55452, 22644, 47701, 28660, 57482, 1766, 30427, 46755, 12883, +43018, 5357, 49570, 25462, 57082, 31070, 5584, 48729, 26610, 7855, 34906, +46525, 23314, 8594, 27161, 58970, 24880, 5439, 22701, 9626, 35884, 56292, +23760, 1030, 51988, 31172, 62715, 2391, 34191, 64713, 22205, 14895, 40539, +29907, 47165, 17494, 33336, 62338, 20288, 9839, 34612, 54211, 39233, 10139, +50001, 28572, 64538, 19883, 56211, 24738, 62650, 17618, 40135, 29325, 54027, + 5558, 60012, 30662, 1385, 45494, 31993, 4922, 49791, 12801, 37215, 5941, +41276, 11526, 46083, 25069, 38076, 17274, 58436, 12028, 28113, 46971, 16724, +25091, 54688, 22340, 9543, 48198, 39524, 27555, 10395, 47616, 844, 44134, +13419, 41170, 23560, 52478, 10337, 27604, 51321, 20209, 64807, 13390, 56507, + 8285, 58819, 39437, 22500, 60037, 1541, 37778, 9142, 57264, 31736, 18515, +61070, 973, 46167, 22567, 41393, 26784, 11449, 63614, 16704, 60282, 4138, +50228, 10872, 41589, 1879, 49124, 39487, 27810, 16406, 60199, 21030, 46743, +11454, 43401, 5917, 51755, 18438, 53277, 23226, 41937, 29682, 8972, 43647, + 3577, 54042, 24330, 198, 35421, 60435, 21319, 51560, 19369, 43183, 4281, +23138, 56866, 32899, 12283, 43809, 19481, 54149, 22611, 50870, 24827, 11477, +51763, 40090, 18596, 44231, 4536, 41343, 13964, 44476, 19783, 42892, 29132, +13083, 64148, 34004, 7779, 32988, 62863, 11462, 27267, 52305, 19334, 55720, + 7139, 62177, 31778, 16560, 60698, 5409, 52437, 21559, 40196, 18124, 46231, +12705, 34427, 58920, 39858, 15223, 59902, 18832, 44788, 20193, 37255, 58294, +17307, 54168, 22634, 63622, 16386, 57275, 40529, 17918, 37354, 53902, 21391, + 2277, 57864, 7635, 28007, 60942, 3014, 55681, 10301, 32274, 49616, 36153, + 8288, 59643, 29427, 38542, 22746, 49552, 16720, 52267, 28634, 63348, 13777, +59130, 1994, 43628, 12125, 33199, 48957, 16240, 65378, 5849, 52950, 13864, +33192, 64007, 18485, 57819, 22605, 62768, 30059, 1409, 42003, 20759, 62255, +18690, 42682, 55708, 20345, 4017, 60042, 35869, 53539, 188, 36219, 47290, +34152, 50628, 25836, 6979, 43426, 64566, 25260, 8372, 38036, 26969, 48820, + 9581, 52400, 35622, 61708, 8847, 24274, 57001, 12008, 25472, 52809, 29254, +49439, 1605, 22202, 62012, 24171, 3238, 35949, 51247, 1810, 42556, 9742, +31863, 59061, 404, 23912, 49276, 36279, 13229, 62089, 35722, 19220, 56405, +25876, 60322, 21832, 57154, 24020, 55098, 15810, 59226, 3823, 51842, 23513, +39592, 55214, 9949, 57710, 37710, 13939, 41749, 56710, 24782, 2107, 62647, +34098, 25715, 58176, 19977, 54161, 7524, 46204, 16212, 36511, 59322, 11588, +41224, 4224, 45985, 18394, 49746, 25774, 13000, 43630, 17102, 48527, 26325, +53097, 16506, 50062, 34830, 10726, 39044, 15531, 64277, 3921, 49719, 30011, +36111, 43994, 12242, 45479, 19925, 64656, 25970, 55404, 22402, 6414, 63700, +41962, 13220, 40246, 4265, 61345, 24105, 40035, 12862, 44874, 3250, 48140, +13529, 57522, 25189, 61597, 32132, 15080, 63209, 29687, 46885, 6012, 39489, +10983, 47995, 27396, 55610, 37340, 17330, 49899, 38014, 5183, 46264, 14639, +42099, 13324, 38337, 57162, 33263, 8761, 61646, 12858, 55090, 17769, 63696, +24341, 60808, 6058, 54370, 25509, 41245, 20809, 50703, 18202, 37846, 30209, +58358, 1075, 40957, 12588, 47046, 36161, 327, 51429, 29661, 38302, 26738, +60058, 9731, 57321, 4757, 55661, 28399, 7203, 24127, 45889, 372, 42090, +14246, 63056, 10684, 27816, 42368, 13945, 47148, 8978, 38781, 2777, 30523, +64459, 4705, 23944, 49176, 35994, 18609, 52248, 34946, 14046, 47649, 19127, +37620, 54075, 1164, 22222, 52817, 24608, 2086, 58170, 9599, 35787, 62042, +12351, 42724, 6146, 37932, 18504, 48099, 22089, 54627, 25677, 3151, 39278, +30925, 44486, 19426, 37023, 51788, 10305, 40677, 3047, 44481, 14053, 37232, +59382, 15533, 52032, 12024, 37480, 2609, 30703, 50673, 28577, 41344, 13386, +19525, 30970, 61809, 14166, 56649, 1736, 60911, 34698, 13673, 21563, 40507, +54376, 16153, 59462, 18683, 45636, 28125, 1152, 22829, 48302, 34529, 2611, +36160, 43767, 5514, 45884, 15860, 60407, 42252, 6573, 33334, 58755, 18148, +31113, 47640, 15245, 54739, 36713, 18547, 46621, 35014, 10528, 22101, 51456, +27068, 7862, 47800, 12019, 40022, 3370, 42525, 10245, 47622, 1261, 39104, +29402, 47141, 14002, 44353, 1561, 22557, 45495, 27126, 3175, 63291, 28027, + 5655, 34766, 52066, 14373, 49156, 6767, 29579, 50022, 15358, 61505, 26261, +57238, 1293, 24447, 44782, 17041, 53345, 26891, 38230, 2234, 33973, 63098, + 4781, 55588, 35274, 14922, 40321, 30085, 6051, 59331, 26807, 55331, 33020, +24673, 53211, 14009, 58270, 5232, 21854, 55755, 29128, 39246, 5904, 46019, +11479, 32870, 52045, 23728, 763, 56514, 18791, 44600, 29350, 14408, 55246, +28044, 34604, 59946, 16646, 39546, 901, 42864, 16962, 36611, 48517, 8169, +42738, 12553, 52509, 18359, 62393, 30975, 7667, 33940, 10422, 59877, 766, +21985, 53226, 28527, 57870, 1557, 61124, 28107, 4752, 20062, 49228, 35856, +22905, 32653, 48925, 705, 36929, 12265, 45670, 17246, 48310, 4294, 58922, +11814, 55998, 5384, 48036, 16420, 44157, 22552, 64557, 26979, 15201, 57004, +23885, 10652, 49161, 2621, 30207, 45452, 23423, 41832, 19730, 49800, 32276, +62004, 17728, 56371, 31994, 51546, 3499, 39691, 55648, 5868, 61210, 27218, +33607, 50582, 22961, 44489, 14341, 45840, 33002, 12088, 62608, 30559, 11809, +45766, 23197, 33491, 63467, 6180, 24839, 61703, 33456, 14488, 40681, 48964, +19063, 46464, 24258, 813, 31241, 55657, 23136, 51858, 32783, 10126, 64442, + 7324, 52099, 29143, 58715, 8686, 24638, 61834, 3991, 25565, 43908, 20251, +53104, 28941, 51015, 9503, 32185, 40834, 4411, 33741, 56578, 23967, 64418, +10114, 48004, 7424, 63549, 37652, 48543, 8061, 29669, 17831, 42674, 19306, +46858, 29764, 58563, 3602, 27921, 44108, 5856, 42601, 13782, 60988, 31283, +54690, 11078, 63693, 26927, 55890, 16780, 64374, 23798, 37770, 9450, 26838, +55637, 40009, 10957, 45839, 7347, 34700, 49539, 27250, 6101, 56692, 11927, +62833, 32663, 58010, 3787, 34169, 55033, 21353, 61427, 23026, 54685, 26863, +65488, 19078, 33774, 61080, 9827, 26900, 56715, 21638, 64917, 32474, 8113, +60571, 33160, 12456, 50743, 30460, 60846, 19704, 43496, 22057, 60413, 38291, + 3638, 32281, 37092, 5440, 39585, 29838, 54809, 6007, 61694, 34273, 9243, +60336, 28743, 53627, 19631, 45248, 28135, 8712, 58441, 3693, 64701, 43139, +13355, 47931, 4581, 44748, 8864, 35347, 45573, 18692, 33248, 51001, 24938, + 225, 59146, 36212, 17905, 61955, 37615, 9136, 46426, 34861, 29932, 49668, + 8506, 53819, 35298, 1723, 62824, 9568, 25325, 54857, 21230, 60945, 12156, +56197, 5819, 28502, 55399, 22503, 59668, 25294, 44000, 1412, 54242, 20489, +64329, 41851, 16093, 40406, 63292, 31537, 8878, 32623, 43298, 18779, 48005, +31444, 64294, 24348, 2941, 58613, 7778, 38638, 28742, 53357, 23042, 32652, +58033, 10790, 38818, 19342, 45057, 24758, 42718, 21554, 61423, 13518, 50192, + 4829, 43417, 34025, 8785, 35355, 65142, 18300, 55360, 36582, 16157, 51820, +13859, 64183, 1749, 43175, 11796, 40747, 28053, 9355, 22928, 46717, 24820, +12415, 49655, 32490, 889, 56227, 10851, 62163, 7509, 55724, 17405, 58808, +39584, 5936, 41681, 56840, 680, 59218, 9008, 40867, 29364, 45599, 12299, +42067, 60430, 7425, 31982, 64222, 6485, 34174, 57591, 37327, 14472, 45590, + 3783, 59992, 27050, 35653, 44915, 16951, 42604, 14315, 36669, 50496, 14997, +38708, 56735, 7938, 60766, 34848, 6916, 24834, 55221, 19896, 63312, 26540, +45044, 13511, 47010, 16497, 39369, 25071, 54900, 31983, 3285, 21651, 52773, +40760, 65421, 11692, 55379, 5768, 52995, 11364, 35236, 61898, 12848, 57145, +26044, 51464, 7724, 41295, 16972, 45322, 15403, 41108, 7843, 50829, 34453, + 2946, 57276, 30386, 48270, 14300, 25287, 53435, 22029, 63728, 23677, 3890, +61673, 41263, 21778, 44819, 25697, 6898, 41423, 24374, 44803, 9967, 43077, + 1859, 46726, 11180, 44628, 4665, 32065, 50050, 17821, 53302, 36630, 6161, +41718, 16946, 50296, 38677, 14763, 52799, 40111, 18807, 44620, 11534, 39491, + 4116, 50959, 9776, 21097, 43074, 64895, 16913, 51757, 14492, 45505, 18146, +43238, 31374, 19926, 52055, 17822, 47017, 6371, 40605, 14194, 61175, 33672, +23485, 47326, 15758, 31366, 37582, 22956, 57827, 19255, 62335, 26409, 1452, +61279, 41216, 9240, 63087, 33693, 15278, 31326, 53425, 3380, 24798, 57480, +19886, 61050, 11939, 25777, 65097, 20619, 48228, 31600, 19328, 47652, 33230, + 6283, 50407, 27420, 45705, 19955, 38058, 50914, 14191, 40909, 3858, 37762, +13755, 49311, 32734, 45166, 3039, 24814, 51839, 27761, 12552, 47699, 20582, +62214, 11061, 52357, 6326, 42842, 10152, 40987, 52670, 29639, 43851, 19432, +57465, 9562, 49518, 2343, 37496, 27544, 62384, 31358, 159, 65084, 10246, +53680, 3548, 36477, 30713, 57414, 17385, 60555, 28698, 46245, 5946, 42309, +31266, 8236, 62804, 3552, 38258, 26004, 47155, 16002, 52869, 3824, 64530, +34973, 54914, 14720, 60255, 29550, 37053, 21384, 45584, 19169, 43558, 25244, +38271, 27978, 48058, 1390, 26410, 49694, 20551, 32020, 38120, 25762, 53023, +15073, 58396, 17466, 51025, 4333, 27140, 53337, 17154, 37723, 27124, 50686, +20825, 9880, 65192, 29727, 40552, 19659, 50238, 255, 24476, 57195, 4974, +63439, 29861, 1266, 55255, 32011, 17038, 47487, 30716, 17677, 64305, 40149, + 2368, 46745, 8551, 51559, 22207, 60366, 6082, 32915, 59252, 1336, 36750, +14798, 43329, 59432, 33641, 4658, 30242, 39236, 24175, 45261, 15891, 31871, +51185, 19902, 41104, 31632, 2063, 36576, 22033, 57983, 37556, 3715, 53737, +20093, 44289, 14569, 27885, 49081, 18876, 41472, 4271, 65056, 36598, 662, +42915, 16621, 50647, 38920, 19832, 10314, 52443, 2664, 39596, 55465, 15204, +64826, 17604, 58557, 29878, 37625, 18151, 52836, 19980, 37211, 58189, 8694, +40157, 2836, 30851, 62019, 12978, 54531, 5118, 28590, 45974, 24164, 7386, +59020, 1160, 55544, 16265, 64067, 30010, 35302, 56873, 24197, 8937, 40974, +30742, 59615, 7773, 63761, 35371, 12784, 46425, 450, 41984, 13698, 65206, +24275, 51779, 1163, 49245, 18039, 36109, 54973, 95, 62781, 8452, 29397, +43689, 12555, 49423, 37443, 28338, 14574, 48312, 20761, 42193, 56516, 9720, +40930, 29054, 49583, 14714, 43865, 5122, 52977, 37885, 2927, 43220, 12316, +58462, 39206, 4122, 52540, 37424, 13981, 41145, 4667, 64481, 25426, 2032, +62633, 19575, 56809, 22103, 64830, 28105, 9806, 23282, 55177, 35266, 8368, +58406, 36007, 3185, 53910, 23902, 37713, 26123, 59947, 16066, 56149, 33757, +20813, 11272, 63090, 3926, 41844, 20960, 34916, 64812, 14548, 52193, 7061, +49864, 35239, 22948, 32468, 38507, 27684, 52825, 9263, 24857, 48484, 2440, +52559, 21386, 54771, 20276, 61005, 23594, 40880, 27805, 58430, 8758, 29841, +61287, 22352, 48790, 25352, 7453, 41665, 31434, 2114, 52168, 8535, 65521, +13184, 59566, 30168, 3781, 51062, 12524, 36551, 30333, 63874, 16363, 54897, +13471, 65280, 5493, 32556, 48394, 2352, 37058, 23606, 57017, 38580, 11034, +47538, 3048, 54958, 8618, 40947, 48248, 24794, 6770, 56944, 11649, 34726, +61249, 38635, 12426, 46802, 17865, 48924, 23621, 41985, 6067, 60010, 35515, + 709, 45363, 11227, 31686, 58848, 14993, 32979, 39396, 349, 36697, 28881, +48453, 18165, 44802, 22433, 50921, 28085, 9087, 20387, 50223, 10069, 58304, + 2543, 29033, 63952, 37410, 432, 46396, 8565, 52614, 20588, 65098, 33718, + 5365, 28758, 49699, 29943, 61415, 240, 59174, 32539, 8159, 62689, 12793, +51738, 20296, 32117, 59321, 13592, 55013, 8363, 30157, 58626, 33727, 27874, +63910, 17298, 31056, 48385, 881, 49975, 27409, 5686, 63644, 32805, 6692, +61833, 30391, 15098, 29085, 64153, 23007, 46098, 19269, 42548, 24647, 36398, +63532, 2293, 57272, 36937, 22512, 41453, 26602, 47134, 24506, 10887, 45419, + 8, 48386, 28981, 55240, 2473, 23010, 47200, 26692, 3269, 58034, 25288, +62469, 20609, 55306, 35589, 10843, 29215, 42352, 11844, 54002, 7279, 25995, +42628, 19638, 51059, 38255, 2761, 53776, 23182, 7599, 51749, 32414, 3193, +54364, 7320, 26155, 47767, 18779, 44518, 6725, 64227, 26950, 40944, 17721, +32976, 58986, 16828, 51918, 7484, 26479, 64025, 17811, 31379, 62179, 22944, +53584, 11673, 48929, 34661, 27175, 45258, 10499, 42261, 5388, 53477, 31634, +61000, 6263, 49021, 30135, 15343, 50568, 26132, 39712, 7151, 49323, 2478, +30438, 46209, 23206, 242, 59112, 35566, 24808, 51387, 27562, 59533, 8153, +25977, 43606, 18926, 46384, 15877, 56624, 6384, 59726, 14342, 47028, 19147, +63177, 39322, 12018, 42823, 15788, 40357, 12757, 45078, 1213, 51283, 13210, +47675, 16677, 53821, 37342, 5659, 42431, 13091, 38279, 57078, 17434, 63426, +39403, 20326, 42784, 18178, 47388, 6750, 35311, 57474, 22125, 61584, 6178, +53433, 10182, 43454, 4062, 46120, 19503, 50638, 16491, 39636, 27320, 64544, + 9556, 33218, 20091, 63204, 21983, 42656, 18305, 61612, 29232, 1660, 52760, +38786, 21194, 47173, 28433, 8477, 20581, 55050, 31008, 40007, 9367, 59368, +15919, 49947, 26500, 13266, 53811, 23849, 49189, 18574, 37618, 27727, 57557, +15974, 64947, 12972, 54044, 7201, 57773, 11240, 63018, 5106, 56778, 31752, +61367, 25656, 35968, 22407, 34157, 50021, 9146, 25119, 54628, 17755, 62946, +29075, 45864, 10409, 48785, 18660, 62536, 21464, 9694, 34804, 47461, 18440, +52713, 36940, 21539, 43387, 16441, 46657, 6232, 39391, 28560, 36965, 26000, +47427, 1186, 45976, 13423, 35654, 50633, 7986, 37814, 33177, 12649, 35337, +51262, 15580, 48418, 26378, 41440, 621, 51458, 42116, 6939, 49569, 11926, +56165, 234, 59550, 10663, 20987, 49593, 32879, 17877, 64749, 12890, 54276, + 6488, 33115, 52712, 18717, 63079, 14966, 43985, 19088, 36666, 56421, 10054, +39476, 54103, 16034, 43758, 7369, 38499, 30655, 3512, 44537, 57161, 16471, +63846, 27869, 33922, 60807, 10312, 56142, 31795, 15275, 59608, 17746, 40124, +64945, 17028, 57975, 40011, 15728, 37972, 65406, 2149, 58824, 13775, 52279, +34300, 1354, 56911, 29894, 7066, 41486, 24561, 36686, 29968, 45958, 10475, +43402, 1473, 44499, 9417, 30014, 42283, 18802, 58201, 7344, 30070, 52945, +17997, 47926, 14892, 43049, 20844, 39227, 19180, 61841, 34532, 5717, 65358, +14215, 56467, 18105, 63767, 37029, 8459, 51870, 38676, 15552, 47475, 6622, +37545, 12832, 39717, 30987, 55532, 5038, 61192, 24455, 38766, 12844, 41950, +24071, 51084, 7690, 43193, 1454, 21728, 56302, 27331, 62307, 4421, 58582, +17133, 37242, 29151, 57572, 6524, 36295, 32248, 18420, 55805, 19687, 60144, + 1347, 30515, 46152, 6240, 24359, 58443, 4906, 55210, 34288, 27631, 49509, +16753, 40918, 15235, 44243, 19241, 40643, 21508, 60134, 11109, 36951, 28357, +60579, 8519, 54616, 15851, 41917, 52299, 162, 29608, 50057, 12989, 45980, +35437, 15473, 58395, 33690, 10738, 62599, 3328, 53428, 32087, 45883, 26431, + 2264, 62130, 21213, 37736, 31225, 11806, 65019, 43012, 21127, 56932, 5128, +61945, 9828, 52479, 4878, 44260, 20304, 43165, 22965, 41494, 27551, 37756, +19929, 42958, 12874, 46263, 687, 44409, 62619, 6055, 55776, 18434, 39696, +60396, 13201, 43828, 23851, 4510, 32800, 56213, 23738, 42515, 7428, 35750, +56908, 25053, 12084, 43044, 4782, 26033, 59940, 1415, 55261, 24553, 61224, +12508, 56788, 4894, 62534, 14451, 55882, 23238, 59708, 5229, 24983, 57273, +16478, 61296, 24327, 56754, 20731, 43752, 11802, 54020, 21488, 56930, 31166, +16487, 57552, 25522, 38815, 27629, 44451, 16216, 48810, 39702, 27668, 8986, +51012, 4258, 42640, 20373, 37791, 60059, 3386, 40432, 26065, 51508, 4854, +60220, 11836, 28063, 50276, 32807, 11076, 49375, 22698, 33598, 48844, 12159, +51476, 33490, 6893, 31544, 38160, 4492, 45647, 17117, 46860, 35400, 5557, +49842, 29050, 43060, 5021, 24899, 45357, 11412, 27595, 60176, 19510, 31694, +36758, 23618, 39598, 31177, 17083, 48257, 13038, 38707, 62418, 10988, 54737, + 18, 60565, 18941, 54330, 21210, 57982, 24628, 35788, 60149, 3084, 47310, +13331, 36265, 60572, 715, 38267, 26912, 58280, 2305, 51585, 11427, 43640, + 323, 46781, 21164, 41162, 28713, 34274, 45720, 11848, 22264, 58258, 27614, + 9878, 65171, 31515, 54828, 16678, 61817, 1346, 51821, 14020, 42596, 29997, + 2007, 54147, 34063, 61702, 2870, 33137, 57980, 26874, 54684, 32473, 36333, + 7920, 31408, 47859, 34530, 27118, 50158, 11214, 39014, 25156, 60518, 200, +49231, 10867, 44759, 32208, 50888, 13940, 36304, 53027, 33004, 15707, 44739, +26045, 2458, 62607, 10020, 43071, 9, 51752, 29117, 60685, 2672, 52130, +34390, 23650, 49060, 1518, 42410, 20894, 34070, 47933, 6351, 25278, 59057, +40302, 7020, 59711, 31035, 4514, 49742, 31509, 19167, 45318, 26330, 42994, +17537, 63706, 6259, 58007, 35136, 24256, 52793, 4422, 56282, 34362, 2626, +36110, 9018, 32238, 41213, 22339, 42537, 19519, 48465, 26169, 55992, 3439, +61248, 10653, 55375, 1973, 52167, 25936, 38651, 18036, 53248, 14550, 23747, +47287, 13721, 43517, 3914, 27923, 48532, 7192, 40754, 58782, 18075, 38283, + 885, 59591, 32420, 51777, 2448, 40220, 65495, 22143, 56364, 39113, 11333, +42028, 32752, 8945, 31514, 47900, 20790, 45173, 22235, 43680, 34862, 9585, +40213, 30465, 47225, 20249, 41925, 4007, 44378, 8300, 40392, 2398, 60796, +35914, 5173, 36664, 9349, 43860, 33986, 4022, 60391, 9995, 30113, 53188, +23311, 5958, 61504, 43023, 14515, 56322, 15906, 62211, 29651, 11975, 33800, +57988, 8179, 29700, 42507, 22362, 40175, 65342, 995, 21917, 61374, 36326, + 4576, 64441, 16514, 59725, 26761, 14575, 62103, 43103, 18955, 52561, 22248, +57720, 2409, 25174, 64359, 22162, 9117, 60905, 33180, 55727, 677, 34177, +46321, 5351, 50241, 10406, 54807, 8330, 62083, 3895, 55207, 23037, 60259, +19506, 31609, 47587, 15855, 42637, 13689, 38664, 5292, 47363, 34745, 6719, +49367, 14433, 54526, 34009, 23862, 49621, 15698, 31287, 63692, 8781, 33072, +40143, 25303, 63476, 15903, 57010, 31513, 54637, 10579, 60337, 1296, 24512, +55119, 42665, 4078, 40700, 49662, 21082, 2699, 28599, 46600, 22102, 44668, +23325, 48078, 18108, 58630, 40922, 20457, 8522, 27370, 45622, 18606, 37467, +13393, 41241, 5828, 64062, 19894, 54126, 22555, 9056, 64675, 3332, 59540, +19958, 50912, 15192, 44232, 20946, 65348, 24370, 8289, 26571, 62726, 22603, +11565, 61532, 38035, 10492, 50121, 36075, 23427, 53030, 20021, 64828, 25678, + 8879, 35000, 46818, 30153, 7107, 56266, 14314, 62860, 24595, 51911, 3705, +23009, 62421, 35646, 9928, 21101, 53899, 34204, 17430, 64719, 36356, 9213, +60683, 5151, 55298, 13183, 37883, 22650, 41190, 15574, 49538, 8135, 29009, +44789, 18348, 46191, 22852, 52290, 27835, 62929, 14622, 51129, 1200, 60561, +35173, 8152, 32724, 38366, 18781, 46728, 24866, 45073, 13742, 64501, 6827, +58827, 27790, 39900, 8804, 34884, 60017, 20348, 57268, 36699, 19633, 54011, +33616, 9954, 49545, 15250, 53361, 27728, 12636, 22875, 49070, 29447, 6129, +48044, 14227, 30787, 54240, 17920, 63455, 28140, 52414, 2054, 40653, 10595, +51996, 3502, 27618, 65349, 15826, 54572, 1928, 60546, 11572, 53749, 29928, +64372, 18833, 47209, 25403, 14405, 32326, 63178, 23653, 59369, 14745, 52097, +22242, 35270, 62705, 3256, 33363, 54886, 18493, 31021, 38245, 25975, 45130, + 1896, 50061, 21806, 48780, 16430, 37047, 62014, 13036, 53900, 6744, 25504, +44719, 34977, 7979, 25123, 51886, 28831, 44199, 1421, 40464, 53587, 24148, + 2658, 58609, 9373, 41918, 13753, 37662, 52114, 14576, 33814, 48316, 23569, +13600, 39099, 28524, 63495, 20630, 56245, 25492, 43786, 18361, 47271, 26928, +45601, 11561, 41488, 6267, 46435, 2635, 35535, 64610, 22563, 56439, 25720, +61665, 13042, 28219, 64879, 20259, 41253, 26030, 8398, 58948, 4955, 34412, +54879, 20358, 46808, 18727, 59728, 6924, 29105, 48243, 22708, 7845, 26713, +46053, 20042, 50429, 35625, 8004, 32626, 62604, 13504, 25341, 55881, 32699, +60589, 7404, 40698, 10569, 64086, 5996, 36715, 9914, 28544, 63620, 31937, +55291, 10891, 64446, 4877, 59426, 15933, 51598, 26060, 46190, 594, 44120, +35816, 25371, 45714, 14674, 41383, 5098, 63232, 29685, 38878, 4135, 51620, +33524, 47857, 4632, 35455, 49225, 616, 27850, 56968, 19440, 59285, 7609, +29908, 45710, 13788, 38256, 53782, 22890, 11606, 63339, 25997, 39738, 28985, +37493, 7596, 30197, 57617, 36247, 14431, 50562, 30287, 45063, 26008, 2423, +48132, 11217, 25180, 51110, 22423, 40485, 23662, 47726, 1300, 50629, 12032, +43293, 19625, 64558, 38448, 14086, 61387, 6753, 57679, 10960, 47428, 3656, +44641, 30297, 54484, 14099, 29444, 63813, 17509, 52689, 30652, 5419, 59767, +16655, 40686, 22092, 47037, 34016, 3126, 49035, 64901, 26776, 1257, 50712, +32109, 11770, 62416, 1808, 26255, 64304, 30160, 45178, 8738, 40597, 63863, +36268, 10084, 58562, 20822, 36008, 60792, 2812, 34655, 46059, 5742, 43975, +16784, 57734, 25972, 64179, 18512, 32960, 49945, 6479, 44677, 26070, 37675, +22345, 46318, 25594, 13584, 34635, 51543, 10080, 58775, 37419, 52690, 11288, +49014, 2094, 40630, 32359, 7516, 46567, 15749, 38009, 47975, 11661, 44728, + 802, 59690, 8374, 32313, 57483, 28481, 39948, 4991, 55695, 32336, 1642, +45126, 17400, 36612, 58243, 15668, 55791, 30440, 58761, 19225, 9615, 32419, +57808, 22167, 8404, 47782, 36828, 20108, 49051, 26311, 61727, 31335, 6432, +42879, 55121, 1614, 35662, 50543, 7879, 47220, 14064, 37844, 12261, 41630, + 1148, 60731, 34040, 13339, 35710, 63428, 18173, 53602, 28670, 58134, 20682, + 8354, 48178, 3981, 40807, 19973, 51646, 33808, 9799, 52846, 462, 62024, +29487, 40129, 21332, 50868, 9597, 41808, 3505, 50498, 13297, 35451, 55308, + 4233, 42360, 33720, 58783, 3450, 38533, 13749, 61530, 28961, 17002, 37995, +29648, 45523, 5474, 43687, 13102, 52783, 26551, 54081, 18744, 32121, 56993, +22614, 50220, 4139, 44711, 16474, 50778, 22758, 48891, 21219, 45127, 30667, + 9569, 32008, 61323, 16342, 56895, 12340, 30877, 55512, 22693, 47211, 26041, + 7993, 56591, 31305, 15765, 58966, 14466, 30343, 58054, 16488, 32438, 46599, + 5480, 39420, 13446, 47350, 34194, 3235, 58695, 32105, 5344, 57831, 37186, +17158, 51139, 3519, 58586, 12761, 55650, 39089, 11764, 46047, 28909, 1840, +56676, 13385, 62212, 36067, 18655, 56036, 43102, 630, 56505, 17195, 64107, +15058, 57561, 28702, 60899, 4028, 53825, 33359, 471, 48796, 24964, 40692, +28476, 38147, 17896, 58712, 26621, 11683, 38004, 24215, 47822, 2205, 42203, + 9121, 62441, 35296, 20846, 50345, 4272, 53725, 10285, 29329, 54674, 21281, +16930, 52651, 30271, 37188, 6437, 46507, 16518, 38994, 52122, 21483, 3320, +35577, 60582, 20200, 4019, 52803, 18995, 33471, 44704, 9058, 24610, 49324, +10600, 26963, 58837, 21991, 37469, 13108, 42579, 6962, 36887, 53835, 14887, +41760, 18210, 62048, 12474, 52294, 5876, 40701, 58005, 296, 27312, 42861, +22684, 3125, 26515, 45447, 18704, 30046, 54333, 17313, 64494, 23848, 55553, + 9308, 25215, 65188, 20160, 53007, 35671, 23241, 47021, 18848, 9681, 63447, +24962, 41826, 14820, 51014, 20413, 61154, 27145, 4047, 48954, 11446, 42137, + 2154, 46393, 23927, 50809, 13657, 35629, 61011, 28032, 12949, 65038, 29715, + 791, 44944, 12313, 57007, 28559, 10955, 31589, 62989, 19424, 57338, 22929, +53484, 4365, 61757, 22617, 52091, 28396, 5555, 50502, 24310, 532, 42553, +33432, 8963, 25292, 51828, 33971, 28129, 53227, 16839, 43241, 2429, 45292, +23046, 35939, 46925, 17408, 43777, 12065, 65460, 25529, 45511, 16203, 62757, +34168, 26840, 44785, 15198, 30423, 60630, 11218, 37337, 23411, 54087, 31244, + 4928, 42991, 57919, 816, 54296, 11512, 63452, 23598, 38881, 20170, 43170, + 3623, 38293, 48836, 456, 43067, 13517, 56056, 23759, 40166, 877, 36567, +11711, 38567, 2218, 60182, 19397, 50080, 22191, 41133, 5503, 49257, 36775, + 1641, 43430, 9843, 52734, 37204, 18040, 49638, 41441, 1875, 39818, 54358, + 9197, 40545, 65000, 18341, 53997, 25580, 63707, 21183, 55949, 27336, 41150, +18582, 48230, 27974, 1040, 45931, 21731, 43429, 18702, 46620, 33050, 20278, +63785, 5387, 59861, 35021, 22694, 43561, 5759, 50929, 29721, 8063, 32007, +38201, 12585, 46132, 7520, 43734, 33723, 16551, 35056, 45873, 22247, 11488, +51887, 30721, 9847, 54777, 1804, 63945, 32860, 7518, 35614, 55625, 5680, +43818, 12467, 58521, 25185, 49078, 15268, 43796, 31604, 11792, 62120, 23454, +36522, 61053, 12647, 43099, 38864, 7933, 44542, 16084, 61152, 22832, 56497, +28276, 12126, 42988, 57856, 13957, 24991, 48488, 34084, 26584, 43874, 1207, +62810, 28895, 54678, 17410, 64686, 38325, 13705, 47228, 4184, 61477, 23029, +54874, 28108, 43, 59928, 24250, 48905, 4327, 42088, 16326, 63465, 33139, +17771, 38763, 62231, 7298, 54582, 31477, 65124, 7928, 37993, 61658, 5529, +48695, 36115, 1316, 41391, 29060, 49517, 4547, 39960, 31870, 13743, 62970, + 5682, 51629, 34836, 20022, 52438, 9038, 64411, 28781, 38911, 8553, 52027, +39705, 21181, 45397, 18103, 63599, 33804, 55253, 5585, 31299, 44701, 3960, +38207, 52954, 6213, 40740, 55358, 21697, 34304, 40524, 17861, 58770, 41320, +12622, 43836, 3112, 41069, 18419, 44951, 17238, 47750, 11263, 38562, 56808, +16317, 59283, 29410, 55479, 12312, 62630, 40665, 4755, 45194, 12783, 35874, +62891, 11054, 57093, 14802, 61066, 6123, 31133, 57429, 4292, 55345, 37366, + 1807, 29207, 51868, 23102, 10270, 57538, 1184, 64911, 38249, 19028, 51888, +16443, 64057, 8776, 41168, 52467, 15407, 33474, 48034, 20451, 40534, 19044, +50757, 1811, 57646, 16310, 62173, 25092, 14442, 60427, 32447, 47820, 30366, + 7767, 62748, 26441, 57424, 28298, 53440, 23924, 41654, 33274, 4056, 54515, +13994, 63522, 10776, 26916, 62122, 19271, 58239, 32275, 2778, 59809, 10170, +26480, 63582, 23614, 17616, 47528, 26201, 6513, 43160, 11977, 42163, 1472, +43535, 11207, 50423, 7280, 63999, 10372, 39897, 61825, 12388, 55016, 6568, +65032, 26822, 442, 51370, 16428, 42184, 17736, 47853, 11466, 30764, 57960, +19759, 41044, 63547, 16578, 60363, 27867, 34327, 53414, 26440, 4674, 54584, + 9989, 26342, 59692, 40939, 17072, 62867, 36657, 19447, 43266, 20830, 46343, +24884, 49486, 16593, 65452, 19498, 53703, 30223, 13748, 34543, 56336, 513, +57987, 37908, 18578, 44316, 1539, 27207, 49983, 4508, 24498, 63165, 22346, +53791, 10875, 43276, 4345, 47794, 34499, 8054, 23402, 50624, 39418, 6555, +54543, 10745, 57614, 31679, 15984, 41942, 4586, 45307, 32179, 569, 55561, +24883, 51548, 19774, 44681, 12093, 47095, 30663, 38970, 9118, 34602, 57608, +21423, 49450, 27784, 10585, 55057, 29738, 12669, 46639, 17130, 41920, 14870, +50596, 33500, 20396, 43518, 26704, 13287, 57830, 17725, 61302, 15271, 30275, +58765, 7638, 50726, 29299, 41236, 22494, 59925, 420, 44242, 31295, 21648, + 3709, 59356, 30984, 16067, 32668, 62406, 6134, 49978, 26425, 8817, 20343, +38791, 64169, 18352, 56417, 15769, 25365, 49578, 16675, 32821, 8490, 63424, + 3352, 49263, 29813, 5690, 54090, 27371, 61162, 10794, 55397, 29965, 36935, + 7005, 63959, 20435, 31613, 48171, 8095, 37154, 21298, 50876, 31517, 17018, +59852, 23597, 55758, 934, 25060, 46535, 30109, 40114, 23962, 49764, 15571, +34845, 45962, 23707, 13449, 35367, 60705, 6487, 36029, 47741, 20724, 49996, +32733, 9276, 46768, 2125, 44531, 25696, 48988, 17754, 29760, 64989, 9268, +28217, 56244, 6608, 59806, 15236, 37356, 27745, 45162, 11751, 36376, 52470, +27233, 8654, 19876, 59104, 38088, 14359, 43702, 9101, 46824, 6447, 65435, +12476, 56681, 37167, 18563, 43491, 21413, 38992, 51783, 13037, 30310, 38167, +17059, 48144, 21783, 34629, 46076, 6749, 37598, 52654, 2914, 36994, 56328, +22128, 60903, 19017, 52739, 16942, 62256, 19868, 36732, 24812, 54410, 15748, +32944, 41901, 25480, 37960, 10082, 52426, 41520, 10744, 48486, 31239, 55277, + 7407, 65420, 38730, 15048, 46350, 3539, 33888, 48886, 6310, 51915, 2786, +21968, 62360, 36435, 18760, 65264, 36150, 5861, 29551, 46880, 3546, 25927, +60186, 15464, 55974, 12568, 61730, 149, 40442, 27948, 46128, 3298, 40036, +63094, 6434, 28955, 45701, 24454, 7806, 48456, 13273, 59113, 39837, 19073, +57494, 41781, 12255, 47969, 2853, 38286, 25647, 65322, 18049, 54944, 29471, +63380, 317, 28362, 61874, 22426, 42591, 19976, 38257, 53593, 12486, 60446, +35833, 15118, 48033, 18270, 41579, 11507, 39671, 2687, 63030, 15674, 55514, +19287, 60967, 27224, 11244, 54008, 1499, 35390, 45841, 4545, 48699, 21334, +35463, 60056, 5299, 55885, 27530, 932, 58310, 11872, 53552, 34512, 30372, +45913, 7240, 33613, 52194, 18225, 45751, 26183, 2763, 55760, 10274, 38175, +32065, 12563, 54826, 36923, 49924, 14384, 41982, 55328, 623, 36593, 30181, +14535, 54346, 32288, 59900, 29028, 246, 50355, 10547, 34224, 62687, 11591, +38672, 60213, 22921, 42206, 32125, 16245, 65491, 23891, 37170, 15370, 30741, +46671, 24601, 1729, 57776, 33255, 14325, 50963, 2407, 40030, 27061, 64439, + 5987, 39213, 1923, 48521, 34933, 9305, 39109, 30955, 50095, 21204, 4596, +53656, 11780, 36264, 64128, 8894, 20995, 53090, 28700, 46737, 15385, 31886, +54108, 4453, 42514, 12047, 25057, 54501, 22036, 59419, 35046, 5966, 32643, +58553, 1731, 38957, 23670, 46034, 16762, 44323, 30792, 48419, 9553, 64692, + 6241, 54581, 29286, 4493, 41457, 65268, 35969, 2551, 29366, 54528, 19004, +61058, 35711, 21843, 32565, 49535, 7637, 29201, 60700, 1982, 57383, 31409, + 6118, 42055, 56065, 4889, 64269, 8826, 29971, 61837, 13837, 57136, 27482, +11762, 60275, 30092, 9919, 50425, 3453, 36305, 29292, 38046, 5149, 32388, +49343, 1916, 42592, 30335, 4511, 59646, 13998, 56852, 31098, 15519, 34075, +61642, 21899, 3274, 26596, 45374, 23273, 852, 54751, 28503, 58729, 14094, +24154, 42162, 18988, 59416, 39273, 8887, 44602, 30888, 1884, 48107, 21029, +58267, 15038, 54470, 42705, 7263, 50640, 4828, 33596, 38808, 23336, 50938, + 8755, 34843, 52152, 11139, 36390, 23208, 49729, 16233, 40306, 65203, 26388, +51929, 32157, 7154, 46084, 14871 diff --git a/src/main/ran.367.179.h b/src/main/ran.367.179.h new file mode 100644 index 0000000..4b1cbe2 --- /dev/null +++ b/src/main/ran.367.179.h @@ -0,0 +1,5995 @@ +/* + * "$Id: ran.367.179.h,v 1.2 2001/02/25 01:58:35 rlk Exp $" + * + * 2:1 square dither matrix file for the gimp-print plugin. + * + * Copyright 1997-2000 Thomas Tonino + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + + 0, 48162, 37632, 16984, 50697, 28820, 7846, 64425, 37420, 20029, 52759, +13180, 46778, 30985, 650, 57324, 27274, 16466, 55035, 36671, 6899, 45453, +23687, 52437, 2894, 41412, 21422, 32368, 53581, 4740, 28409, 48442, 20251, +65473, 2200, 41936, 21113, 35749, 60467, 12638, 31852, 47394, 16110, 58501, +24933, 39633, 2370, 47114, 26386, 56222, 6571, 42820, 26950, 59825, 13893, +48999, 25626, 42799, 1401, 46564, 22992, 61232, 5177, 33693, 51857, 13638, +45589, 20439, 55050, 12218, 37036, 62085, 16469, 32129, 45722, 872, 56381, +28780, 9713, 50928, 36419, 19167, 52421, 10975, 34366, 57497, 1607, 45333, +26565, 64216, 5169, 29190, 59891, 13832, 42288, 22116, 63796, 17024, 41882, + 1964, 34588, 48605, 7763, 61394, 34351, 1207, 55279, 26342, 43616, 5905, +38763, 26997, 47269, 760, 29261, 60565, 19508, 44479, 4188, 36873, 46092, +19172, 50462, 13328, 35734, 59826, 6496, 41515, 21959, 60729, 16445, 38191, +48710, 13699, 31885, 59911, 17353, 43525, 31627, 10371, 63694, 37856, 18135, +51444, 34092, 14183, 57337, 28295, 9933, 49344, 38472, 17310, 36846, 61146, + 8053, 33270, 51595, 18183, 44347, 7058, 37713, 65031, 1631, 34365, 57760, + 6687, 40788, 26111, 49203, 338, 29345, 55342, 16108, 39960, 22744, 48327, + 3267, 59633, 25552, 50992, 4664, 60484, 10318, 36566, 46886, 20370, 57296, +12184, 39472, 21598, 51114, 14062, 58877, 23858, 42810, 2143, 29902, 62155, +18133, 42050, 21843, 37778, 50876, 1649, 28030, 43799, 6812, 55878, 37207, +12604, 42815, 25325, 60204, 10204, 41238, 22827, 64898, 15635, 35752, 46093, +12084, 42410, 4827, 54259, 22726, 31764, 59819, 9655, 37042, 61138, 19636, +53496, 5629, 40837, 23307, 58268, 14597, 41757, 5147, 62189, 23296, 40948, + 1734, 60879, 32569, 13862, 52146, 26473, 44478, 9175, 61428, 31186, 4515, +58753, 11148, 40005, 25720, 55379, 14216, 42181, 22831, 52587, 7789, 44280, +23791, 55077, 8758, 32795, 47900, 18901, 65222, 35482, 7538, 51357, 16473, +29592, 63012, 6321, 43066, 14822, 60968, 25114, 47483, 6637, 50417, 20808, +29805, 56984, 8743, 44256, 31053, 17818, 63112, 21833, 42616, 6122, 31273, +65012, 12133, 40370, 24514, 60241, 2474, 51151, 11373, 40750, 23561, 57134, +14949, 30629, 43944, 4863, 56646, 33343, 7597, 45488, 20327, 56009, 32152, +12179, 44218, 6413, 57522, 21470, 35341, 63464, 14989, 47411, 20572, 60580, + 8795, 43257, 14608, 47028, 25654, 53094, 10388, 31994, 43399, 15997, 54158, +27814, 206, 63320, 31461, 17067, 36938, 51682, 10914, 45780, 34436, 2290, +61944, 24200, 43270, 14803, 49656, 27742, 1024, 54514, 29206, 7126, 62422, +37738, 15446, 57512, 28047, 60586, 11076, 30232, 58839, 4195, 43834, 25281, +53940, 2274, 31992, 42893, 9065, 61200, 25249, 45237, 13695, 35288, 63897, + 4139, 41872, 25060, 58807, 13308, 32833, 60727, 17764, 44427, 10482, 63415, +18523, 35952, 56714, 9429, 32956, 52207, 18244, 44765, 8034, 51477, 28801, + 943, 62161, 34758, 7733, 52013, 18077, 63578, 37615, 13137, 32299, 53546, +20761, 47561, 3325, 39187, 23521, 55836, 11717, 33392, 59240, 14408, 36570, +49643, 16902, 29761, 62693, 18, 41870, 24806, 52451, 4247, 28613, 48603, + 7638, 59371, 25539, 39998, 14690, 64436, 22184, 44855, 2397, 31253, 63252, +16204, 48816, 23748, 38689, 9122, 50777, 18427, 34018, 53026, 2763, 47476, +32572, 6185, 50177, 26250, 60762, 14233, 28174, 44812, 16573, 50642, 23067, +39712, 13417, 63459, 20875, 49601, 11618, 58731, 21901, 38747, 8443, 52870, +32213, 22643, 62330, 9638, 30700, 57032, 5340, 43959, 28499, 18732, 55082, +34861, 8704, 51165, 29798, 4078, 64529, 27564, 8250, 51538, 37450, 3178, +54183, 27186, 7592, 48596, 30406, 4406, 53099, 19500, 38100, 63220, 13502, +27146, 55724, 2190, 29034, 46241, 21515, 63571, 10225, 31164, 56329, 15389, +27299, 50510, 11307, 46635, 22319, 61325, 13696, 31832, 56998, 18159, 46456, + 5067, 31953, 60967, 10425, 45214, 29407, 13957, 38075, 44395, 17230, 29530, +55179, 12, 42693, 25622, 49180, 5022, 64151, 26912, 38643, 9398, 48133, +17186, 55176, 35536, 12428, 49827, 4213, 59466, 27366, 13810, 63880, 36194, +19691, 52605, 15588, 27992, 58060, 917, 49072, 17754, 37077, 55518, 3257, +31185, 48451, 8904, 57203, 28500, 18129, 51710, 37861, 15482, 56042, 2345, +42644, 24644, 47982, 12689, 39362, 26545, 62998, 9433, 31560, 52831, 19015, +46480, 33326, 7541, 54390, 24758, 45964, 10441, 40947, 22539, 59386, 547, +39652, 24588, 54657, 14839, 35953, 46388, 18705, 51270, 6662, 34246, 63186, + 3297, 39644, 26455, 61164, 12732, 38702, 26995, 58961, 4088, 28643, 53505, +12993, 41951, 24150, 57353, 9, 45412, 33395, 17936, 56138, 38077, 9911, +33546, 43021, 16358, 62312, 784, 40117, 24162, 55118, 12987, 39526, 2153, +49602, 24494, 56865, 16391, 43534, 23411, 55851, 7811, 31809, 42636, 18973, +61898, 31378, 4459, 49874, 36592, 8757, 63332, 24882, 48088, 14387, 39910, +24099, 61718, 1118, 40866, 25547, 60801, 16604, 29797, 54144, 44, 43317, +29595, 7054, 41190, 25047, 56341, 17125, 33783, 64512, 866, 39495, 21950, +60857, 4239, 29966, 58863, 11726, 46829, 24696, 40941, 5879, 60160, 19236, +30570, 57265, 13306, 47882, 21869, 39177, 8098, 60610, 34329, 17228, 57232, +37240, 11384, 48608, 31281, 4484, 50290, 19405, 36225, 25117, 53647, 15814, +39309, 20756, 62581, 9676, 35610, 49340, 16763, 55609, 23787, 39363, 6522, +58058, 22526, 50315, 10662, 30503, 53829, 18309, 48515, 1041, 39687, 22739, +55808, 5755, 47338, 24617, 40611, 61, 45421, 22541, 58802, 6290, 30368, +61779, 15143, 39360, 24439, 54974, 13703, 45027, 21581, 31106, 46406, 6044, +28630, 58818, 327, 40088, 15368, 64041, 30622, 19295, 58340, 5844, 50082, +22039, 40541, 3786, 54392, 27433, 6859, 47712, 35352, 21365, 57905, 8560, +35127, 64835, 15167, 42899, 33515, 11203, 54457, 20173, 48071, 6597, 32839, +58367, 12187, 47001, 22762, 41290, 4615, 59465, 14779, 44265, 24392, 56415, + 7830, 39465, 23536, 57508, 13284, 38973, 20403, 54414, 9010, 36813, 58272, + 4120, 32592, 65127, 10086, 47082, 30627, 3052, 52967, 25880, 44670, 6781, +41266, 25077, 64636, 14270, 49801, 1875, 34286, 53584, 16584, 41405, 24177, +61521, 12137, 45517, 26, 63526, 24854, 40334, 10428, 54466, 19413, 34207, +44386, 14107, 62497, 28391, 16839, 38325, 59018, 12325, 35069, 64817, 23387, +46714, 1205, 31411, 50581, 7558, 35123, 48248, 16189, 56703, 5101, 40722, +25224, 49119, 2875, 33438, 60658, 17196, 44056, 30228, 4069, 36213, 52609, + 8257, 43071, 24073, 64878, 12734, 41830, 20913, 36436, 57660, 1344, 34863, +64423, 7535, 49519, 33859, 19181, 62482, 28290, 8469, 35355, 54756, 18671, +42473, 1291, 53468, 25068, 39920, 6045, 64694, 23281, 45070, 16155, 36358, +54721, 7539, 46950, 30144, 3448, 37834, 60505, 9309, 45242, 33298, 20859, +62847, 7783, 29066, 44538, 16368, 60740, 24994, 39747, 303, 63146, 31150, + 6621, 48044, 19935, 34262, 64003, 8043, 30838, 57348, 3494, 48957, 17843, +34524, 44733, 220, 65057, 27998, 11258, 59085, 38367, 15035, 29817, 64087, + 4961, 48600, 17072, 29763, 52723, 10208, 42648, 22899, 65525, 2478, 30451, +57916, 21178, 44974, 11926, 30803, 57063, 17965, 42813, 1857, 48465, 20156, +52043, 14454, 33828, 45819, 5883, 61714, 15976, 40025, 25613, 55162, 8941, +49996, 27976, 3522, 59783, 29838, 11778, 51122, 22769, 31780, 58968, 5514, +45686, 26934, 61364, 14634, 35430, 52532, 9832, 30391, 59281, 1176, 34589, +46154, 14979, 53781, 28078, 9385, 48072, 24716, 57852, 15619, 40612, 21389, +53483, 2679, 34178, 53959, 10609, 46699, 30963, 19464, 52386, 5158, 45937, +37903, 10447, 49921, 22487, 61936, 12450, 52136, 36829, 3729, 49784, 30156, + 9612, 55095, 26330, 45598, 13532, 51953, 37324, 7437, 42523, 20013, 56105, +13727, 48505, 26480, 43946, 1336, 41257, 25436, 64342, 5459, 50662, 18268, +30431, 52712, 3252, 43830, 22392, 59065, 14788, 40533, 24467, 65528, 8856, +42939, 2745, 34740, 49432, 6138, 42824, 24025, 56409, 14856, 28175, 42001, + 3976, 65198, 18872, 47405, 33532, 2768, 40983, 21140, 62163, 7332, 34667, +45022, 16641, 64768, 31354, 11201, 51473, 36725, 15091, 61456, 26044, 54702, +12464, 38954, 26731, 47817, 2505, 53125, 21846, 41880, 10188, 64995, 36009, + 3530, 51096, 19128, 56565, 36946, 11945, 50009, 24561, 44555, 8484, 52995, +38308, 10771, 31710, 45725, 15287, 64615, 30937, 9901, 60281, 37203, 18977, +56097, 10509, 31954, 51282, 17416, 27883, 49199, 1810, 60440, 23170, 41487, + 3466, 61704, 26345, 40841, 16614, 50477, 36146, 7896, 54534, 26922, 39583, +19982, 61332, 1111, 42076, 26969, 64935, 10715, 43824, 25389, 62549, 632, +43013, 23224, 48890, 15072, 28808, 54817, 19878, 42620, 7416, 56240, 36218, +14675, 61986, 18854, 34648, 57068, 4592, 45651, 18125, 39255, 26691, 60248, + 9019, 47019, 29078, 3140, 51878, 38303, 19602, 33899, 47124, 13138, 56795, +23286, 42382, 1924, 58620, 25234, 49618, 6289, 33666, 56858, 494, 45990, +21823, 40650, 5566, 56048, 15311, 37235, 60726, 18611, 27501, 58764, 10452, +42645, 19478, 32411, 59946, 12660, 37088, 54944, 19844, 41700, 6338, 53795, +23659, 62933, 15163, 41355, 21445, 59367, 2717, 38786, 26888, 54262, 6260, +48752, 18749, 28308, 52076, 15006, 27141, 56166, 4400, 45460, 12820, 38031, +57686, 15549, 32048, 46850, 11215, 60774, 19532, 33240, 57145, 11864, 46768, +29524, 388, 58488, 31239, 21168, 42283, 11499, 61978, 25987, 49401, 14547, +29666, 54315, 4569, 42400, 24756, 53048, 13276, 47624, 33425, 5689, 52489, +19503, 46764, 35084, 13855, 59088, 25275, 50875, 10302, 40437, 22164, 52339, +15181, 41734, 26099, 61330, 8737, 51245, 24149, 39939, 13511, 50501, 34871, + 2913, 56091, 21164, 33702, 43477, 8720, 57748, 37470, 18622, 61559, 5818, +35004, 48827, 17345, 44094, 8455, 35163, 60755, 17115, 46535, 5627, 51569, +21454, 30718, 64393, 7113, 39365, 23080, 60449, 10565, 38929, 26338, 49501, + 3035, 64481, 19712, 32215, 43796, 13375, 52770, 21114, 35334, 65159, 6029, +44562, 14787, 52556, 21143, 38734, 7569, 48031, 26170, 42172, 3844, 63529, +21481, 39564, 13195, 48936, 22758, 58681, 3300, 34014, 65474, 19640, 44439, + 306, 35036, 61025, 7873, 29820, 46187, 17318, 64382, 27710, 3879, 58359, +36548, 13124, 65269, 27865, 17392, 58721, 34220, 5996, 45304, 31530, 18025, +59433, 27675, 11162, 57992, 35367, 18108, 41682, 6434, 61499, 33331, 16405, +49832, 24018, 64916, 2718, 38922, 21884, 62181, 9873, 54700, 23541, 38557, +14016, 42671, 26344, 59857, 9876, 40278, 24505, 63432, 7692, 33565, 52017, + 1665, 45729, 33275, 20517, 56317, 44058, 22707, 63752, 13116, 32551, 51621, + 1266, 37582, 60688, 8648, 45732, 30234, 11564, 51100, 26318, 60133, 12535, +42880, 24173, 55631, 14251, 28397, 50838, 5066, 42457, 24182, 57603, 3311, +30102, 43259, 7104, 50236, 23367, 41510, 9684, 63778, 19623, 31705, 57057, + 5028, 45855, 29498, 20183, 59408, 15077, 43693, 27494, 7237, 62875, 31592, +17578, 59682, 34023, 2614, 27653, 62474, 20086, 54009, 770, 39370, 25134, +45128, 16015, 50397, 2163, 40425, 25769, 61598, 4781, 37895, 55420, 9619, +43833, 26410, 38885, 12589, 53141, 30636, 8755, 57320, 28129, 385, 65110, +29790, 18526, 56761, 10267, 47317, 25697, 38565, 14278, 53290, 20738, 47024, + 5345, 33037, 51583, 16729, 29295, 61561, 6629, 37702, 51216, 2123, 40592, +24199, 59943, 17131, 29040, 50146, 307, 43443, 30572, 13060, 48597, 25888, +59046, 7792, 42966, 22253, 54894, 15613, 36106, 63141, 10896, 30040, 57673, + 4493, 27445, 51480, 6954, 30891, 61679, 20105, 39483, 12374, 46348, 22169, +52527, 16037, 42073, 25464, 61858, 11980, 51231, 20939, 29238, 45556, 9535, +38426, 53356, 3730, 30715, 65241, 22558, 44966, 100, 50103, 27637, 8624, +63992, 35229, 14561, 48506, 38135, 1166, 31434, 56300, 7544, 45236, 25241, +50603, 14894, 31296, 63158, 12118, 46162, 33975, 8813, 61491, 38199, 16476, +30028, 60104, 20736, 48747, 2762, 29509, 65227, 6377, 40965, 24508, 50086, + 3545, 43364, 28005, 17703, 61277, 37951, 14504, 52973, 6248, 45759, 24462, +52120, 2317, 41024, 22189, 65006, 12050, 31408, 58615, 18480, 40261, 1620, +64196, 22648, 42897, 14555, 61625, 27556, 9788, 54628, 37424, 4004, 43679, +23979, 60450, 1306, 32260, 58023, 6853, 47233, 16747, 38498, 20970, 58763, + 4568, 55462, 29358, 17999, 48884, 36952, 10859, 60655, 19552, 46953, 27565, + 3518, 50147, 31670, 22113, 53244, 11559, 29768, 56028, 23271, 50643, 275, +39244, 26175, 62410, 10076, 35491, 55614, 15384, 42025, 25197, 56493, 997, +46494, 18195, 55574, 31299, 11715, 37277, 46846, 5103, 58456, 24306, 39752, + 1253, 54977, 16914, 39492, 26495, 56746, 2510, 41679, 25317, 64078, 11357, +54704, 19070, 31620, 50815, 8192, 44817, 26009, 61694, 9057, 38915, 25534, +52524, 6324, 37865, 55658, 13100, 28387, 47329, 18962, 55183, 9871, 35025, +41806, 15390, 50729, 22729, 44807, 8121, 32847, 49472, 2753, 41942, 24905, +50739, 16290, 64038, 1353, 35642, 48504, 20779, 43950, 3195, 62854, 22817, +47681, 28512, 1745, 58420, 36700, 10927, 45917, 26776, 53200, 8106, 34655, +44659, 18906, 49811, 4772, 58049, 20874, 46802, 380, 33764, 55016, 18684, +42012, 12781, 54334, 19823, 30189, 50002, 6783, 61044, 14242, 54085, 7977, +39814, 26416, 57250, 10472, 47164, 19714, 27243, 54239, 15908, 36833, 56923, + 302, 39109, 20168, 53321, 6069, 36693, 48869, 1664, 59313, 20654, 37052, +61825, 8514, 33450, 48189, 21258, 64340, 13603, 35347, 59114, 3973, 46009, +28007, 11093, 50618, 36444, 17777, 60693, 8435, 33568, 49392, 1566, 37398, +54747, 20959, 40497, 4301, 50639, 13726, 38011, 55427, 16560, 34991, 44034, + 9353, 51036, 23109, 58893, 6306, 31828, 63439, 20423, 46799, 13461, 34385, +48192, 16633, 29809, 59926, 20366, 46136, 5959, 64005, 21296, 34253, 45916, +14446, 51519, 33531, 12889, 48143, 38003, 3738, 32721, 63091, 6955, 51174, +31103, 3106, 60251, 35376, 18616, 58627, 9992, 45712, 35227, 12921, 55468, +31731, 18215, 56990, 12445, 37440, 48038, 5278, 33376, 64026, 11377, 55455, +23392, 39774, 3640, 51456, 19177, 35331, 65529, 992, 30338, 50996, 6773, +40306, 24750, 49880, 15061, 38087, 64157, 17412, 35654, 45049, 11011, 53632, +28722, 3592, 65317, 35853, 8420, 59646, 31058, 4249, 49011, 38020, 7900, +33698, 55069, 2508, 62809, 27068, 16455, 49089, 37163, 6761, 52342, 15626, +35113, 61540, 17734, 43455, 30596, 3202, 58881, 20699, 27914, 51705, 12099, +39474, 22972, 61760, 10570, 34622, 57230, 622, 42198, 23758, 59054, 3974, +40254, 21284, 53613, 1833, 34568, 50579, 7906, 41093, 25797, 51881, 16910, +37316, 56338, 13738, 31590, 62857, 10120, 53615, 35156, 5359, 48040, 19972, +32691, 63558, 10697, 39213, 18182, 56927, 34721, 8526, 44796, 26526, 49973, + 6510, 37029, 56813, 15264, 31579, 53874, 8691, 36063, 49861, 2747, 45652, +29998, 20650, 64699, 12437, 46835, 35765, 18567, 51644, 13750, 39938, 26990, +64232, 2251, 42538, 25248, 46707, 14435, 40802, 6110, 63375, 22141, 39364, + 910, 53182, 32966, 15718, 63777, 36569, 12809, 58455, 1509, 36210, 62787, + 6437, 41254, 18882, 33332, 56689, 13169, 43137, 22830, 49398, 2677, 32402, +53421, 12254, 44661, 35927, 20866, 62724, 6585, 43119, 23553, 60125, 16999, +29411, 49300, 11012, 63390, 19129, 32219, 47703, 8188, 61102, 18915, 35487, +46447, 6731, 49386, 23212, 38563, 176, 59652, 17245, 36526, 53646, 4894, +32479, 56419, 17881, 42175, 11106, 49242, 29975, 16913, 59749, 36125, 5091, +62856, 26326, 44696, 1710, 58981, 28563, 6890, 54858, 34401, 20586, 56518, +13684, 62182, 21362, 38865, 6746, 53878, 24071, 40917, 14105, 57466, 28197, + 9165, 54499, 36287, 12068, 52854, 19504, 44504, 32364, 5972, 55673, 20551, +42090, 14416, 59059, 30023, 3857, 61261, 22838, 39919, 11893, 35896, 63834, +15938, 28490, 47595, 5662, 61505, 25582, 38829, 3953, 59524, 26182, 41484, +17332, 30015, 45067, 21726, 60193, 4636, 30805, 43250, 14217, 63267, 35078, + 5121, 49150, 28379, 9331, 64103, 25118, 43544, 14873, 62504, 31316, 16244, +45822, 29514, 11447, 51908, 18809, 28358, 55141, 14520, 39855, 1455, 52415, +20546, 30767, 53853, 15983, 33575, 62687, 687, 40883, 23529, 52719, 13903, +39943, 25176, 58170, 11696, 28348, 60976, 15927, 44083, 23412, 65179, 8725, +30134, 48570, 5076, 61460, 29029, 18639, 42326, 11188, 53652, 24536, 41154, + 3525, 56801, 28802, 7931, 65517, 36882, 1003, 50496, 13230, 35332, 56274, +17567, 41932, 2025, 62190, 24336, 40081, 5380, 60581, 24045, 53338, 15989, +41636, 22249, 45727, 13159, 56014, 23152, 41632, 7553, 50473, 24856, 39683, + 2443, 64493, 20985, 46513, 4603, 41974, 25758, 63304, 9751, 28322, 54103, +15168, 42244, 26080, 46335, 7220, 61671, 31851, 15851, 57514, 27823, 10250, +47743, 37885, 13234, 61027, 21697, 43463, 2272, 59117, 32447, 7993, 28204, +54593, 875, 48501, 18445, 33108, 55910, 13497, 45463, 24730, 39555, 15423, +57581, 19620, 28178, 64364, 13777, 42771, 19441, 36521, 46304, 11405, 54578, +27993, 18397, 38078, 57469, 4303, 29726, 47880, 9714, 53611, 19047, 36691, +55561, 9131, 33143, 64519, 18472, 44373, 4858, 53059, 28612, 16864, 38328, +54855, 9878, 30474, 51115, 13475, 43023, 24010, 63837, 11224, 39581, 22849, +61744, 12422, 33797, 58323, 832, 28382, 48612, 7624, 44644, 23121, 40212, +15073, 58053, 26337, 51009, 1434, 41236, 25155, 59224, 5149, 30956, 48231, +19251, 59853, 534, 33092, 62557, 17123, 27894, 49184, 4381, 41045, 24837, +59740, 12802, 31824, 56560, 18037, 40852, 7142, 55426, 29491, 4699, 62443, +24373, 43271, 5756, 54317, 20334, 31971, 49993, 8204, 61741, 22977, 32714, +51688, 11875, 42781, 25438, 57118, 9754, 45475, 29318, 6256, 55054, 38370, +19834, 28726, 47963, 15897, 43596, 24307, 59714, 8182, 46987, 30413, 4784, +58293, 36315, 19343, 63518, 8324, 29605, 59070, 3848, 32111, 50237, 15554, +35906, 48167, 2058, 54396, 34125, 7186, 44843, 25717, 53364, 3966, 41710, +23317, 50017, 10494, 29664, 57629, 15728, 32605, 62217, 13407, 44005, 23707, +48433, 11750, 27905, 64839, 20016, 44065, 1518, 34534, 62569, 21551, 54288, + 3054, 41131, 20781, 51072, 11797, 38675, 23267, 52570, 13949, 36964, 61305, +18230, 47431, 584, 39494, 26957, 46521, 10018, 55511, 26799, 42566, 11906, +60441, 31110, 5082, 51490, 38234, 16502, 31639, 65346, 6987, 27885, 59876, +14824, 40689, 25527, 63108, 746, 32533, 51000, 17587, 43238, 12885, 55453, +26017, 51922, 7078, 43540, 22701, 56706, 10211, 32800, 42545, 14155, 55364, +22104, 47840, 9083, 35411, 64478, 585, 32001, 11921, 37000, 49757, 18734, +58434, 1929, 39729, 23186, 55306, 17055, 37496, 45993, 12299, 52337, 34558, + 3781, 47199, 21625, 57131, 6818, 34415, 65336, 2680, 46718, 35777, 6355, +60465, 19801, 47594, 32416, 11950, 61241, 4660, 42100, 24433, 47453, 13188, +57552, 30950, 5460, 64218, 20532, 47661, 3063, 53847, 32110, 7581, 51360, +35825, 1155, 46445, 24801, 57730, 14795, 41345, 20977, 35620, 57116, 1643, +47493, 16674, 36650, 59421, 12298, 33093, 52677, 20998, 40179, 10783, 57606, +22733, 32239, 47805, 4378, 29249, 54344, 19514, 44060, 7697, 52189, 34880, +18830, 43085, 9787, 58027, 31360, 1474, 60970, 26549, 39011, 11434, 63856, +19296, 32139, 57027, 13557, 47795, 25869, 38746, 11857, 60106, 21822, 47390, + 1056, 35132, 49887, 20760, 60815, 2778, 38851, 21437, 52370, 14164, 38257, +49306, 6318, 36133, 56015, 17867, 28554, 52343, 5742, 46019, 34236, 20222, +47380, 14201, 56013, 38421, 16014, 62561, 24077, 43564, 5752, 40232, 23196, +62939, 1719, 53372, 34691, 10561, 51964, 36401, 756, 48056, 25482, 57152, + 6978, 29574, 62046, 1541, 33951, 59692, 8771, 44175, 24873, 55236, 14898, +40418, 24606, 63096, 6090, 41459, 24421, 49057, 2217, 40662, 25844, 59216, +14337, 36824, 49265, 7100, 27325, 65382, 18446, 36490, 58466, 5327, 28792, +47696, 19299, 55474, 3326, 31233, 54165, 9237, 41925, 22658, 62359, 16080, +34319, 53268, 2408, 64508, 31206, 9294, 44442, 22555, 61751, 11731, 36072, +46034, 17187, 54153, 9211, 40132, 24282, 52385, 13941, 39775, 7517, 54510, +35499, 19764, 55885, 11109, 42594, 21520, 63448, 881, 34955, 53092, 14195, +45173, 21069, 33111, 48011, 10501, 55832, 26832, 38646, 11848, 59684, 17737, +35241, 44151, 1441, 54921, 16249, 30597, 60113, 4031, 40053, 23895, 62279, +13870, 49592, 22553, 44234, 4637, 64506, 10514, 53742, 32445, 3132, 49433, +27988, 16793, 64945, 38202, 11382, 28385, 48916, 15026, 43676, 23623, 52261, +13339, 41189, 21926, 57153, 8819, 27605, 63107, 14084, 41019, 21670, 61346, +12456, 38686, 27014, 59179, 14260, 33224, 64674, 1774, 42736, 22372, 55274, + 5046, 38960, 26783, 60436, 3476, 37545, 50158, 7144, 29734, 55454, 13961, +46930, 27424, 8644, 45411, 31347, 13921, 58427, 24218, 43681, 6007, 63827, +19981, 48582, 3683, 31039, 42253, 11206, 63517, 22282, 51449, 4811, 38501, +19912, 64788, 2323, 33971, 48055, 15906, 43438, 23714, 58651, 407, 47366, +20151, 37665, 50478, 3048, 30411, 54080, 10214, 46688, 22855, 40003, 6353, +64146, 26931, 38538, 1814, 47571, 18458, 34296, 62281, 3505, 30897, 48823, +19063, 65046, 1440, 34404, 43610, 12362, 52621, 27230, 16430, 55898, 47234, +25090, 62261, 6678, 29021, 46626, 15410, 52591, 33182, 7148, 61513, 29755, + 2561, 58742, 19076, 28933, 60851, 10817, 41553, 25519, 53908, 13000, 40885, +24107, 57903, 15536, 44205, 25230, 40839, 7939, 58235, 23073, 45251, 36488, +14764, 55715, 7570, 35875, 51467, 16828, 46295, 26449, 40706, 10372, 33994, +42955, 19031, 63718, 27163, 12948, 59300, 38381, 11198, 29302, 47360, 3214, +62995, 12679, 50207, 22598, 32773, 62269, 7497, 27449, 50834, 18843, 44345, + 5415, 55197, 25163, 41766, 15112, 63145, 8238, 37252, 58827, 9928, 39430, +25628, 59709, 12110, 28708, 63535, 2866, 48811, 20500, 37024, 52246, 15206, +44425, 5027, 48373, 25254, 54175, 71, 40637, 22667, 62297, 7082, 44441, +26900, 53690, 9345, 30819, 58856, 18634, 44907, 8681, 41072, 24450, 54568, +12007, 36016, 64284, 1409, 27452, 59722, 19560, 41911, 3302, 62754, 31882, +16480, 58044, 27151, 8777, 64844, 37199, 3763, 29992, 50450, 11397, 36271, +60055, 19229, 51062, 9781, 31841, 48493, 16959, 27660, 61327, 6486, 46228, +22563, 60566, 10997, 33247, 53660, 14881, 40412, 24186, 51302, 13032, 39061, +20975, 64664, 7313, 32766, 51985, 974, 45632, 35181, 13463, 52530, 17763, +60257, 36830, 8374, 31257, 51203, 3407, 62016, 20479, 31869, 45519, 1573, +53024, 16053, 44573, 33888, 10091, 59850, 26492, 42752, 14639, 46350, 23996, +51016, 4272, 31160, 55862, 12026, 42927, 27311, 17393, 50493, 37534, 4533, +55720, 18701, 48613, 29402, 2859, 57669, 34255, 20679, 63733, 3742, 42748, +26257, 60301, 18707, 43675, 2108, 65274, 26663, 38912, 5495, 50997, 25634, +46956, 16745, 28999, 58144, 3011, 36960, 60649, 16253, 40798, 489, 65168, +23123, 47915, 3816, 56337, 28562, 9989, 63641, 37359, 20919, 49259, 10541, +43980, 17635, 52362, 30254, 2161, 34802, 56645, 15376, 39961, 25147, 46932, +14024, 38334, 60443, 9342, 34496, 54792, 1614, 44628, 23185, 53064, 6112, +30967, 61569, 514, 38932, 26806, 65354, 5402, 30883, 50994, 16224, 44414, +35325, 4845, 47319, 24179, 55967, 430, 43728, 20747, 50859, 6385, 39129, +25972, 53386, 12539, 34653, 50460, 9666, 45522, 20311, 56066, 31496, 15454, +52899, 38278, 19259, 61450, 6528, 36807, 50718, 17371, 64467, 35102, 873, +52944, 26841, 40336, 9487, 45318, 25363, 59608, 14701, 54278, 26491, 38824, + 8975, 58039, 25490, 45110, 12436, 50116, 22856, 56991, 7798, 30159, 62667, +10919, 41705, 17657, 30707, 55498, 9495, 43124, 23213, 61956, 16118, 36931, +52145, 8538, 33377, 55966, 19551, 41999, 10199, 60362, 24817, 52891, 11351, +40356, 21991, 58823, 8286, 39142, 26590, 46576, 16508, 58335, 28919, 3669, +61393, 37942, 8269, 54798, 2921, 33812, 52004, 20792, 42061, 9944, 64989, +23670, 44569, 13247, 51306, 21236, 35375, 49644, 7482, 40160, 23715, 56133, + 901, 35784, 50238, 19769, 45531, 8940, 31044, 63698, 417, 53694, 34452, +18093, 51450, 2782, 29637, 64651, 18976, 44710, 27847, 1998, 61716, 34333, + 6623, 58483, 23679, 48954, 14637, 54476, 4796, 34932, 45579, 20080, 51998, + 6705, 36440, 56438, 18179, 42543, 25914, 39325, 4507, 55265, 18121, 45410, +30656, 262, 63650, 37168, 16133, 31722, 60064, 2292, 49731, 28503, 19998, +52465, 15984, 32626, 50721, 542, 46242, 20598, 35867, 54097, 13241, 45188, +30332, 6389, 65406, 27815, 17586, 33835, 58975, 8877, 42805, 29649, 10932, +51784, 36469, 18347, 57664, 3514, 41473, 23502, 51622, 5577, 36245, 65288, +15758, 31499, 57287, 6708, 45479, 28572, 17044, 48512, 33166, 7897, 52943, +26115, 46746, 14010, 37699, 50089, 444, 35178, 53953, 18272, 42067, 23280, +60819, 7444, 46458, 27417, 2829, 33753, 55545, 21845, 45872, 4789, 37533, +56584, 13020, 43702, 33439, 16386, 30187, 50707, 3260, 44999, 22473, 63844, + 5221, 42444, 26500, 58576, 2701, 49213, 23843, 39741, 11335, 58040, 19946, +29928, 62187, 4488, 46716, 29877, 11202, 56832, 23692, 45860, 15116, 34184, +42910, 11547, 55621, 38030, 9400, 29362, 63448, 17889, 49775, 422, 40030, +20634, 64933, 6485, 36389, 58784, 17563, 39413, 20905, 49389, 5690, 59147, +36292, 13337, 60611, 20844, 33444, 43479, 7254, 65440, 23505, 41921, 12337, +49305, 29970, 15538, 51262, 33518, 9776, 56330, 21940, 32615, 48866, 8428, +45037, 23103, 58328, 10581, 36408, 61975, 8181, 41677, 22414, 51458, 7582, +30528, 53642, 20114, 44489, 11135, 32985, 42064, 19430, 52338, 15089, 45723, +27457, 6400, 56684, 35371, 21834, 65323, 8409, 37360, 59042, 21057, 42189, + 7182, 61260, 29879, 727, 55627, 20236, 27385, 51287, 15488, 42463, 25321, +63015, 10347, 34595, 56575, 16228, 42435, 23585, 54275, 7976, 47056, 20160, +36537, 57960, 1391, 28098, 52334, 20323, 64209, 10151, 39512, 26704, 53580, +11321, 34692, 62603, 17593, 43559, 7995, 59489, 28976, 18094, 62936, 36227, + 1052, 43104, 10876, 63925, 27350, 2553, 48187, 35040, 21887, 57305, 4170, +28784, 42668, 10224, 47120, 21220, 61947, 12940, 34380, 55461, 1980, 39209, +21440, 43509, 5298, 52939, 23125, 41082, 1540, 61840, 27033, 38607, 10418, +41399, 25771, 52934, 3318, 36424, 51039, 21402, 63797, 4530, 35582, 57143, +12488, 31228, 46125, 2100, 59305, 18543, 28894, 44982, 4458, 57501, 32873, +17010, 46101, 2927, 36171, 55911, 15317, 42928, 23807, 49318, 5110, 55624, +31536, 10524, 51055, 36084, 14791, 45611, 22038, 29149, 63115, 17733, 41376, + 5300, 57740, 26722, 38533, 736, 55600, 27017, 40868, 4841, 57599, 17592, +33094, 64585, 13458, 46183, 31153, 10218, 62881, 27571, 4449, 52565, 36937, +17252, 48057, 27332, 11270, 62331, 37568, 20815, 49957, 7049, 33521, 59568, +12728, 42605, 22022, 52413, 15992, 44498, 29783, 163, 62385, 37635, 16481, +28707, 61328, 2482, 31633, 58154, 15795, 27467, 49326, 8323, 64815, 21891, +46772, 10265, 33540, 60604, 13294, 42117, 22957, 53877, 9244, 48082, 23857, +44912, 11616, 33317, 60943, 3917, 43234, 23525, 64687, 11511, 29795, 58433, + 5126, 42544, 27421, 16990, 55491, 36030, 10765, 50641, 38374, 3357, 46254, +21902, 61700, 15963, 54992, 32580, 6123, 49730, 20790, 31855, 62934, 13162, +39923, 20428, 55637, 28311, 1948, 50548, 37270, 19734, 62546, 4154, 34943, +58647, 11273, 43533, 22347, 61808, 9109, 40741, 24890, 63717, 11495, 28201, +45505, 4807, 56876, 12648, 32779, 52156, 17215, 37748, 59304, 8884, 40974, +14583, 65066, 29850, 18273, 49953, 27139, 2650, 63621, 38419, 8659, 58937, +25160, 39289, 12091, 55913, 31537, 18789, 52822, 9852, 44798, 34893, 13770, +60898, 26234, 41902, 7727, 50660, 22562, 40281, 15672, 54384, 26516, 39390, + 247, 64051, 22181, 48289, 5680, 61089, 27602, 19342, 57991, 35180, 6009, +43473, 22275, 57146, 36741, 13219, 32645, 53301, 10636, 29311, 47611, 1696, +64077, 24687, 42256, 10358, 29642, 47176, 188, 54450, 27484, 15643, 51343, +36778, 8898, 56713, 27729, 1107, 54812, 37228, 6635, 61467, 25189, 40713, + 4166, 52884, 17933, 29948, 62909, 13427, 32986, 48277, 3641, 30875, 54194, +12924, 46338, 27776, 17564, 61476, 37658, 4280, 58578, 26331, 47123, 6633, +62664, 29685, 2514, 37876, 60434, 16815, 31436, 50439, 91, 45212, 28541, +19033, 47223, 11730, 54255, 32614, 17213, 49897, 35908, 11058, 61989, 37631, + 3896, 31061, 58224, 6748, 40206, 21578, 50520, 3449, 27957, 59774, 12969, +41914, 24504, 60540, 10670, 45471, 18821, 33948, 60877, 8224, 42562, 33301, +18223, 49695, 5289, 58087, 22488, 45384, 2917, 30325, 55568, 21983, 40198, + 3761, 51661, 13031, 30284, 53740, 21216, 46684, 16825, 37976, 56592, 9779, +31431, 51798, 14465, 38108, 60057, 16493, 54696, 26112, 39640, 6795, 49806, +30222, 16669, 64714, 26001, 50380, 8422, 60956, 31598, 13818, 55975, 34848, +18162, 48287, 5852, 59643, 20578, 43861, 14715, 61208, 28101, 7409, 45803, +29609, 14023, 49620, 24987, 42365, 6764, 64455, 20444, 35861, 47929, 11485, +54765, 23380, 40593, 12578, 65417, 26379, 49473, 9427, 29510, 63358, 839, +33653, 60108, 13486, 40656, 22331, 63987, 7033, 41533, 25780, 58978, 11299, +37193, 8947, 31118, 54016, 20143, 44018, 12049, 60032, 22306, 39071, 9159, +63382, 20402, 30859, 45028, 2083, 51936, 28289, 6004, 59095, 34098, 16885, +38327, 57401, 12619, 28589, 61098, 9806, 38190, 56257, 4812, 28941, 45835, +15558, 54516, 22503, 39863, 5167, 56393, 31985, 9397, 65411, 36188, 12286, +46966, 22772, 50392, 10106, 55067, 21374, 38170, 47812, 9261, 35059, 60137, + 630, 44350, 31435, 15322, 54214, 37400, 2764, 48926, 24638, 56961, 6173, +39986, 21283, 64186, 6956, 38928, 26835, 54545, 14299, 47527, 34628, 7160, +37904, 55882, 18389, 33290, 49569, 9423, 62688, 31313, 1170, 59903, 27212, +19066, 57431, 28576, 13767, 49912, 36503, 1792, 41440, 24435, 64850, 14234, +38043, 48315, 831, 29841, 52858, 7403, 42790, 17274, 61391, 30076, 8438, +46633, 25472, 53562, 14468, 40522, 24440, 54947, 2539, 38743, 20904, 53412, + 5394, 31102, 48557, 15832, 58936, 24277, 39806, 19841, 44604, 1519, 63947, +28931, 15469, 47449, 25988, 51719, 170, 36836, 58251, 7813, 34673, 53585, +12312, 28324, 51539, 19289, 42999, 6370, 50061, 21747, 47036, 389, 36796, +63170, 16322, 28611, 54753, 3363, 43218, 18312, 56569, 31412, 1778, 65103, +33942, 6584, 58577, 20749, 44517, 13167, 52634, 29229, 17074, 37684, 50333, + 2380, 42209, 15235, 54611, 25544, 48452, 7784, 28574, 62605, 3041, 44099, +25573, 60239, 15100, 34542, 45672, 9017, 57376, 33969, 16972, 63312, 37954, +11374, 32446, 61086, 3287, 47306, 31116, 16459, 38146, 62345, 18985, 45144, +11606, 34465, 47936, 16605, 59521, 12235, 35931, 55027, 54, 43114, 21288, +56287, 15746, 40570, 23725, 64829, 1678, 34369, 48985, 9693, 28885, 52823, +14324, 39579, 21763, 50851, 12687, 33805, 54231, 18824, 43287, 5187, 57840, +27195, 14254, 53346, 32996, 5750, 60795, 37872, 2735, 27590, 63965, 6512, +45804, 23446, 42192, 14990, 53363, 22428, 48029, 12726, 33400, 61052, 18420, +46352, 31909, 7417, 36222, 55312, 2299, 39256, 26361, 56249, 4633, 49113, +16690, 29594, 53741, 2580, 59967, 27009, 41312, 13521, 32713, 61574, 18408, +49156, 10080, 32809, 65414, 15563, 42049, 26260, 61151, 7536, 33870, 57502, + 4337, 27858, 42377, 18900, 63264, 358, 44698, 27629, 7666, 48475, 33956, + 2785, 60554, 19567, 36006, 57165, 4500, 43083, 12166, 29842, 47267, 16166, +38382, 49491, 4016, 28637, 64198, 12731, 39104, 26947, 54554, 935, 35114, +47553, 11644, 57622, 19831, 37003, 60557, 1218, 54435, 22032, 39899, 14922, +51213, 27632, 7728, 60742, 31506, 92, 52505, 34853, 6730, 44375, 19482, +53890, 37500, 11627, 51189, 27886, 17075, 36461, 53509, 2471, 46109, 32972, +18491, 52949, 241, 47585, 40046, 24662, 60553, 2199, 39744, 26215, 48134, + 6036, 52935, 25802, 43437, 15972, 47927, 7032, 61123, 23205, 41348, 15918, +54810, 22002, 40094, 3069, 51345, 19120, 33127, 46545, 1821, 52980, 31677, +19019, 43598, 13088, 58892, 31200, 963, 63606, 25500, 46940, 14277, 28459, +50972, 3307, 41469, 24798, 60249, 5891, 39212, 26851, 44132, 7125, 64307, +17911, 28154, 53775, 12429, 39853, 24252, 56049, 5260, 28940, 61134, 20526, +43026, 11418, 38853, 26796, 58660, 3278, 34321, 52091, 18601, 41258, 1276, +62855, 20332, 28879, 59414, 15574, 46924, 2465, 39608, 23763, 53149, 13787, +37223, 48087, 8647, 38462, 53533, 4473, 34737, 63440, 9986, 30109, 59338, +19279, 44667, 4843, 51462, 27856, 11491, 60903, 35452, 15305, 59475, 26074, +47159, 11071, 34887, 56371, 18130, 43766, 208, 32204, 64992, 7120, 42415, +23227, 57087, 12373, 33421, 60145, 19042, 42996, 2145, 50767, 35964, 9361, +61177, 25777, 48440, 10332, 34982, 57346, 5204, 42381, 21393, 56181, 13910, +40707, 22876, 62135, 17355, 36590, 47217, 1326, 60004, 32455, 16518, 65455, +35792, 10507, 57005, 22675, 45578, 5430, 33489, 48089, 20269, 61827, 28190, + 9355, 38346, 48840, 14703, 53456, 24180, 42488, 8666, 32505, 60522, 3778, +36190, 57398, 8050, 30823, 63213, 21179, 39248, 4446, 60866, 19649, 37486, +46566, 15779, 52160, 22025, 40882, 5040, 55378, 21305, 30593, 53061, 3659, +27543, 51419, 6949, 44651, 22497, 52950, 13683, 40174, 25014, 58671, 11017, +52102, 4683, 32722, 49857, 22946, 64145, 1930, 30893, 44550, 22477, 50795, + 9179, 38820, 26316, 60804, 5316, 34879, 52654, 11000, 43689, 26445, 57274, +15276, 36251, 63937, 8463, 31278, 48719, 958, 61008, 24216, 41192, 9667, +64583, 22228, 33415, 47677, 9253, 38364, 62930, 16336, 43442, 22911, 54884, +13420, 34762, 51442, 18235, 37938, 57793, 2086, 32669, 64783, 8967, 44250, +24725, 55098, 955, 38971, 12006, 63642, 22153, 48775, 16898, 29765, 64570, + 9006, 43725, 21531, 32617, 62505, 11979, 44828, 23750, 38540, 9421, 56141, +23178, 48389, 7038, 40482, 25947, 57192, 695, 44421, 24534, 54184, 5162, +39627, 22303, 50027, 15156, 35711, 60316, 11673, 48921, 30607, 20938, 57774, +15815, 30565, 65238, 13324, 41989, 24475, 54049, 11296, 45925, 28402, 17832, +59033, 36763, 149, 62801, 27462, 9162, 57589, 36467, 19309, 52181, 9516, +44519, 21238, 63235, 15621, 31104, 53797, 3924, 43375, 27121, 16417, 48086, +30100, 8767, 62589, 33030, 3805, 57967, 37355, 17080, 46385, 22226, 61839, +14442, 41369, 25700, 59535, 3399, 31580, 62461, 18729, 44996, 5456, 57984, +29370, 20673, 61247, 12129, 42560, 24903, 64755, 15308, 7432, 45235, 19565, +56023, 32122, 12907, 62800, 36844, 17948, 57221, 3277, 40273, 26458, 50284, +14090, 34903, 56299, 8574, 30776, 48468, 13920, 64243, 23819, 42200, 7026, +60199, 22430, 40490, 8786, 65052, 26384, 51181, 7861, 35719, 49704, 17860, +42211, 8382, 57058, 37051, 16707, 58799, 20461, 48744, 13422, 31831, 56919, + 1918, 51038, 20716, 37518, 55699, 3980, 32788, 50479, 19820, 63217, 10759, +46204, 34934, 16026, 52463, 7299, 65283, 23441, 45060, 13900, 50543, 29581, +10664, 56122, 25918, 45345, 9588, 50148, 36508, 4554, 53884, 26052, 43891, +17189, 61455, 5920, 45996, 27066, 17975, 64405, 29486, 14765, 49236, 22602, +44756, 17931, 52560, 6980, 38959, 25938, 56867, 16834, 37080, 53925, 6364, +45168, 23801, 39473, 3264, 53440, 21943, 39450, 5420, 62121, 22913, 51839, +15173, 39389, 26402, 59245, 9994, 45601, 27005, 51267, 8199, 39617, 23543, +64611, 14410, 29739, 55543, 5610, 41011, 21666, 53542, 16190, 40285, 23566, +62374, 8170, 33569, 49596, 3425, 44492, 32401, 6026, 57665, 22080, 42053, + 9702, 27650, 53937, 3660, 44053, 25465, 40284, 13470, 59510, 24930, 40175, +12371, 53077, 6918, 37726, 57688, 17744, 27432, 46437, 4252, 36101, 62412, +14027, 45461, 21811, 51771, 10495, 42459, 24684, 47933, 12588, 53299, 26071, +44968, 11088, 51144, 32245, 1308, 59289, 30739, 9669, 61995, 37151, 18698, +49155, 11572, 36753, 62905, 13827, 40205, 25362, 59743, 2278, 38619, 26901, +64746, 5978, 46210, 17916, 29493, 43207, 20799, 57079, 7799, 29076, 42547, +18329, 57670, 5760, 33418, 64488, 20015, 44128, 10132, 50011, 29103, 18800, +58882, 6716, 39306, 20519, 51073, 3112, 40812, 22699, 59559, 16472, 34489, +43451, 7157, 56781, 25589, 39313, 1793, 51082, 18280, 58808, 27676, 3216, +36091, 52099, 7889, 40291, 25259, 58530, 8738, 31244, 49022, 13812, 28669, +51829, 19053, 41195, 5470, 32609, 45653, 16903, 57224, 26729, 47248, 4958, +37606, 53871, 11080, 33423, 50755, 15708, 57525, 136, 40376, 26655, 51417, + 5660, 64987, 19930, 46741, 1533, 33588, 63419, 11654, 51409, 21323, 38497, +13560, 58836, 19996, 48535, 11170, 31715, 64119, 1418, 43614, 23823, 54712, + 6184, 34796, 46926, 10361, 53696, 37877, 4849, 51586, 21556, 48065, 1245, +32993, 63414, 8140, 52159, 31900, 19374, 46524, 13018, 38148, 53490, 16831, +29873, 46007, 2129, 59136, 26244, 39760, 5201, 49818, 24551, 41724, 12678, +65133, 32564, 5759, 58991, 37419, 19477, 52599, 12170, 44565, 24521, 41202, + 9464, 56507, 33866, 5284, 50869, 36348, 10907, 45170, 23218, 56100, 8508, +40388, 25625, 47723, 14491, 38044, 49741, 6303, 30202, 56111, 4138, 35221, +50276, 62173, 34017, 16072, 51214, 4733, 45765, 29325, 10217, 50703, 20671, +34970, 65453, 11294, 28974, 59840, 114, 40359, 24393, 62115, 4205, 35231, +44279, 11449, 53510, 26873, 39119, 12327, 55871, 24166, 44984, 2969, 39593, +20210, 59863, 28052, 4240, 62146, 33308, 21324, 53459, 1390, 32831, 44950, + 7487, 63458, 25442, 42829, 17082, 33523, 61974, 8855, 29125, 48518, 16506, +43517, 6212, 38957, 25746, 58349, 1728, 40729, 26371, 49950, 17866, 38524, + 843, 59780, 20001, 36755, 62132, 5160, 39634, 17964, 58332, 31524, 13315, +65061, 22983, 41457, 10348, 51631, 32038, 19713, 56550, 38480, 3206, 35383, +55116, 7603, 31880, 61931, 654, 40543, 25159, 58077, 12869, 47586, 32235, + 2046, 62386, 19828, 30250, 49177, 10613, 63984, 19017, 34065, 57652, 10186, +41583, 25891, 49020, 9375, 30328, 54430, 4526, 47484, 20668, 38576, 1223, +62836, 17945, 32297, 47035, 4349, 52275, 19447, 34117, 46000, 13155, 63347, +32339, 2985, 58482, 35863, 12273, 51031, 29501, 15902, 64057, 24656, 53322, +11481, 30611, 48928, 15253, 61666, 35305, 17139, 49153, 21176, 62593, 6176, +34690, 52140, 1958, 31445, 64392, 17099, 45337, 30058, 672, 36509, 63473, +10640, 50135, 29444, 18429, 53867, 2080, 39266, 26849, 64822, 17958, 38888, + 778, 59925, 32433, 7413, 38298, 64440, 17526, 27147, 56213, 14326, 43445, +23423, 50490, 7257, 28922, 58132, 871, 45317, 20552, 31072, 56576, 8296, +41694, 21030, 55652, 9974, 49365, 21688, 34124, 53275, 601, 63072, 13504, +35503, 47168, 15230, 60485, 32262, 10656, 49490, 24626, 40369, 3370, 56728, +17547, 35590, 63359, 1255, 32711, 47651, 22993, 62490, 11508, 42883, 25750, +54005, 5881, 45999, 21382, 53126, 14620, 30048, 46880, 16128, 61534, 37467, + 8142, 32496, 46075, 21328, 56189, 12431, 31511, 64966, 1140, 47460, 21290, +41592, 4416, 62628, 36867, 10673, 59328, 26013, 47438, 13438, 62341, 30083, + 7824, 41535, 23238, 59615, 14558, 27943, 61824, 3681, 40849, 22690, 47166, +31049, 11365, 59417, 21992, 39317, 13065, 42788, 26502, 58674, 15506, 39337, +26892, 46381, 5984, 60509, 27039, 42804, 2671, 35607, 56204, 16539, 40757, +25280, 59286, 8907, 39767, 22059, 62720, 3222, 41702, 28206, 17806, 61069, +36128, 10651, 29638, 58580, 16274, 39558, 24412, 42643, 5758, 56996, 26589, +49208, 3412, 32150, 65508, 7411, 51023, 23909, 42439, 13068, 34725, 61685, +17877, 56245, 7912, 36312, 48653, 15215, 44114, 23209, 54029, 2596, 32074, +47450, 18073, 64814, 1502, 48580, 29770, 19811, 63166, 16195, 28672, 58280, + 2004, 48386, 21056, 38636, 16223, 51722, 1151, 63476, 27628, 9712, 59268, +37229, 17043, 52256, 27827, 11512, 44449, 984, 41438, 22929, 63928, 17165, +35130, 58649, 1483, 46375, 27735, 7605, 51794, 37952, 17294, 32336, 54136, + 9389, 47718, 28165, 17618, 59419, 32116, 1117, 62716, 20624, 48797, 5435, +32821, 61604, 16841, 47738, 32539, 11104, 52185, 37200, 18761, 48796, 11826, +40945, 26256, 60780, 10216, 39983, 22405, 47379, 3748, 53359, 14099, 40830, +23453, 57332, 1114, 34049, 60342, 20535, 51323, 12211, 45059, 31728, 18957, +62541, 5838, 43741, 26987, 54577, 9634, 46488, 32155, 14919, 47957, 24278, +53045, 1912, 44078, 20809, 39303, 7339, 55382, 30032, 180, 63291, 38256, +11043, 28795, 60242, 15868, 43767, 24126, 50910, 11713, 35386, 54705, 16351, +42270, 4243, 60201, 22753, 45826, 14866, 35096, 55398, 4939, 42469, 25618, +50648, 1354, 28962, 47842, 17415, 58541, 2907, 36525, 63646, 16305, 41966, +24042, 61302, 12999, 48912, 25467, 42220, 6801, 58377, 21331, 37211, 60469, + 567, 27252, 48780, 8480, 28251, 52649, 19285, 46923, 27553, 1126, 55745, +38145, 9189, 45584, 19800, 36012, 60379, 2112, 44193, 28310, 5747, 55421, +37438, 11528, 30181, 54337, 15045, 47373, 24059, 41466, 8860, 49362, 25312, +59867, 13516, 44430, 20060, 33061, 56901, 6280, 42002, 23790, 58969, 16371, +49157, 5855, 33625, 56784, 20932, 43040, 15036, 54245, 28412, 2836, 49040, +36471, 8516, 53096, 33254, 3496, 37844, 65151, 16608, 33162, 52065, 15648, +41938, 4847, 46869, 23988, 63951, 12542, 45834, 24718, 40464, 4334, 58327, +19439, 39613, 26195, 44867, 6147, 55636, 27348, 2964, 53553, 37249, 19339, +62159, 13119, 45622, 26690, 53284, 11741, 40181, 24197, 44801, 14192, 54769, + 5130, 30155, 56916, 18971, 39063, 13656, 58200, 32294, 2598, 63742, 36192, + 5461, 54826, 12008, 28406, 49980, 19736, 63409, 5914, 35138, 49245, 15901, +44494, 29090, 10227, 59878, 24064, 46346, 16342, 28085, 53184, 250, 40087, +21397, 55795, 3261, 34733, 53121, 20299, 43853, 1724, 51220, 36935, 18428, +31111, 50049, 6300, 63921, 18161, 35612, 53076, 2838, 45354, 24358, 55189, + 6664, 31237, 50505, 3579, 56853, 20312, 38683, 10633, 48113, 22845, 61899, + 9606, 29368, 50797, 5407, 46290, 19258, 32942, 52877, 12742, 45045, 24779, +58057, 13886, 33341, 45929, 7251, 55384, 25088, 43757, 4100, 51200, 13826, +61617, 22779, 38995, 10616, 60345, 21840, 44511, 15005, 39653, 20152, 59990, + 8556, 52885, 30065, 2857, 45263, 31892, 22105, 52176, 288, 29217, 62304, + 9621, 42037, 26511, 61039, 10356, 39756, 25897, 55244, 14081, 36528, 45679, + 4344, 53407, 38233, 12800, 42666, 26209, 64418, 5771, 55188, 24510, 44601, +13270, 32340, 54014, 20446, 45735, 2674, 32802, 57531, 20267, 25607, 59861, +14210, 30974, 53071, 8575, 39554, 23817, 55130, 13336, 32893, 61930, 19267, +43280, 5075, 58432, 22483, 41725, 15239, 56512, 36329, 6706, 50999, 25423, +45947, 9493, 41149, 23300, 54604, 14071, 29265, 56692, 283, 41893, 25007, +57871, 6719, 31681, 63127, 3456, 45629, 18352, 55935, 29913, 12177, 59335, +37307, 20431, 65097, 5956, 45009, 30502, 18675, 52972, 9660, 42224, 23149, +64567, 3628, 37040, 53219, 14685, 47503, 22573, 40219, 12981, 56411, 28648, + 4148, 63979, 37561, 9007, 30260, 61837, 15864, 46533, 25453, 59828, 12778, +35061, 48657, 16652, 27347, 52610, 6678, 46734, 33095, 2135, 58831, 18469, +42773, 28914, 9623, 63900, 33778, 18989, 37414, 50965, 8156, 28786, 63053, +12213, 39836, 21089, 59167, 14673, 37489, 64572, 12126, 34771, 45309, 19303, +50917, 28000, 11669, 55549, 31081, 5255, 35989, 56324, 15398, 30132, 53549, +10511, 45030, 28709, 14901, 38368, 54316, 17659, 61530, 36322, 14307, 44195, + 6769, 64883, 36721, 17700, 30430, 59134, 4452, 48405, 27480, 12505, 51883, +37614, 14532, 64691, 22740, 46267, 897, 59757, 25923, 42524, 7271, 62277, +18850, 33357, 55314, 5015, 39125, 22009, 54164, 3551, 47887, 28389, 15768, +61687, 35357, 9100, 43448, 26034, 54795, 12304, 46008, 29799, 4914, 62790, +37076, 10603, 44612, 22379, 61705, 16635, 28548, 57476, 13365, 47685, 24366, +41144, 10421, 60669, 21133, 54695, 29816, 14120, 51124, 37110, 1193, 32030, +60998, 14060, 47666, 31895, 7129, 61565, 16778, 50331, 34425, 12313, 65116, +38471, 9465, 28770, 52111, 750, 39191, 21714, 57301, 4640, 31763, 50383, + 7415, 60030, 20091, 34851, 49440, 13135, 42024, 323, 65476, 26236, 40395, +10210, 45310, 22438, 49669, 17330, 39735, 26470, 59896, 609, 43273, 30786, +16983, 57646, 28068, 3931, 61160, 36597, 18643, 50665, 32360, 7618, 56102, +38195, 14725, 32143, 63138, 9753, 43054, 23981, 48439, 10831, 65084, 17340, +31311, 58738, 8247, 45481, 13340, 55732, 25058, 42890, 9160, 49550, 20754, +30216, 60178, 10368, 36958, 62380, 16788, 44699, 24164, 41237, 12670, 64351, +25540, 53050, 4685, 32888, 43765, 13288, 58054, 36751, 15915, 65062, 29189, + 2173, 56129, 36709, 8213, 29490, 48201, 739, 62445, 22492, 41905, 12486, +36815, 64917, 19906, 33578, 45124, 1655, 55701, 24382, 40695, 5482, 54940, +27025, 50019, 779, 38654, 26769, 43358, 14208, 54874, 20485, 64067, 10391, +34954, 58435, 16027, 40642, 23724, 56667, 6689, 38814, 21199, 57799, 3633, +28938, 43571, 8532, 58728, 27519, 15401, 32896, 61350, 7382, 49393, 19457, +41103, 33219, 9128, 60855, 37581, 4477, 43462, 14983, 65306, 25757, 39843, + 6559, 49465, 8878, 37800, 49048, 3643, 42975, 24940, 59429, 5869, 47181, +21234, 39480, 2504, 53702, 24495, 47266, 13028, 33456, 64414, 1732, 45006, +23439, 40184, 14095, 57802, 18448, 37027, 63294, 2545, 33682, 49450, 8561, +44143, 22663, 64688, 10252, 39879, 23511, 54771, 15300, 39478, 24614, 50235, + 6328, 35904, 52732, 505, 28135, 49190, 16160, 35511, 50780, 10644, 61715, +25418, 39651, 7185, 49147, 29205, 17457, 57132, 28076, 7991, 61478, 32263, + 2360, 59193, 35812, 19543, 49735, 16321, 41389, 25690, 54119, 6639, 35240, +51305, 2961, 40976, 21994, 57459, 5606, 36620, 61088, 20617, 41737, 13389, +64901, 21413, 37375, 47414, 5294, 53146, 22936, 45882, 2659, 30756, 56500, +14141, 38203, 52714, 336, 43973, 26151, 53687, 6618, 31569, 43808, 4085, +55597, 27235, 7786, 60530, 32863, 780, 37943, 47162, 9029, 59653, 21709, +40456, 2074, 63121, 34311, 18780, 50159, 3358, 65432, 34866, 7738, 29904, +45439, 3869, 56459, 25532, 39551, 20575, 54723, 10739, 49458, 22480, 41584, +16416, 61411, 33801, 6473, 57110, 24571, 42266, 9510, 32069, 51354, 13041, +38927, 20633, 53202, 30773, 2607, 46457, 23128, 61293, 10008, 40963, 26468, +65275, 11550, 37569, 51602, 1179, 30366, 48463, 18953, 63764, 3158, 40127, +22909, 59350, 15716, 48246, 19388, 29469, 58484, 6161, 35086, 49752, 106, +42240, 22235, 59810, 6351, 45559, 32343, 2113, 47415, 37274, 9151, 62211, +27302, 17600, 56952, 38252, 7959, 28837, 53659, 16038, 42392, 24476, 55261, + 1768, 29870, 48729, 18714, 36291, 58947, 15615, 45099, 23966, 60897, 8865, +43326, 23068, 63825, 14950, 41168, 25350, 46272, 2834, 61269, 31050, 20652, +52525, 35660, 7044, 51264, 23736, 59111, 12398, 35128, 62782, 4353, 45029, +20996, 55591, 14482, 36788, 47829, 9971, 51652, 22893, 39406, 14180, 55196, + 1839, 42962, 22879, 64244, 4949, 50222, 27263, 17755, 52206, 36038, 6699, +57487, 26635, 39425, 4071, 54626, 19190, 38943, 26833, 60985, 1104, 38617, +17484, 62825, 34477, 4414, 54787, 16230, 47847, 29036, 569, 34605, 53078, + 8416, 57573, 32037, 1711, 45347, 36136, 17431, 63133, 21804, 46878, 65, +27422, 51620, 7833, 42534, 22481, 47197, 14931, 63633, 38418, 19840, 51914, +16105, 31907, 58341, 2654, 47822, 28789, 6915, 53945, 16939, 30358, 48981, +12150, 62086, 26399, 38504, 10131, 63595, 22857, 46896, 11850, 61029, 25013, +39423, 6269, 46655, 24961, 50183, 8380, 28444, 54852, 4440, 43224, 22496, +51919, 12485, 33406, 49193, 16019, 63693, 35056, 20226, 51612, 621, 46310, +37921, 17418, 30459, 59668, 3031, 52772, 29000, 16499, 48497, 21265, 58320, +34005, 10834, 48119, 17689, 61816, 31672, 56967, 27561, 12117, 64625, 32794, +14962, 49760, 36204, 10776, 61220, 25944, 41739, 15027, 63491, 36456, 6259, +51492, 19999, 30496, 53269, 10679, 59984, 34228, 4601, 50171, 28909, 12575, +53051, 27216, 17173, 59327, 37910, 4369, 31914, 53001, 17655, 48042, 2118, +36182, 58279, 12835, 30853, 64367, 19783, 41472, 15063, 61051, 31933, 4880, +57831, 22048, 41556, 2575, 31674, 54471, 15160, 58687, 33442, 87, 46398, +36069, 20344, 51145, 11590, 43278, 23242, 52603, 8239, 32851, 60860, 458, +48483, 21064, 58809, 14672, 32519, 64328, 12215, 28910, 50691, 15462, 45467, +27897, 3598, 53597, 34277, 8431, 55754, 27879, 15002, 61651, 36421, 8839, +58516, 25437, 42612, 7285, 65244, 27386, 17002, 31514, 60695, 9757, 40844, +24154, 61902, 15774, 46985, 20020, 30272, 52861, 13542, 44687, 24549, 65158, +16940, 28695, 45284, 13989, 52366, 26204, 43414, 8765, 56745, 26096, 39888, +13697, 51318, 24886, 57859, 12522, 31940, 47801, 16587, 60132, 2409, 41906, +32440, 7509, 62904, 36679, 318, 29483, 52913, 17421, 35703, 47295, 3002, +58425, 21316, 35471, 63879, 4425, 43798, 16312, 58815, 35252, 11160, 51281, +36839, 16947, 57963, 5957, 43372, 22661, 56259, 14652, 41308, 24006, 57953, + 7030, 38577, 26709, 50811, 8481, 31182, 53787, 1658, 36076, 46767, 13722, +55181, 27091, 17846, 63525, 38282, 8300, 29306, 50784, 18264, 64173, 28300, +12223, 58261, 34327, 3904, 48396, 31057, 10804, 49197, 22420, 59435, 2796, +36415, 63640, 8599, 32820, 43601, 10366, 56251, 27144, 4028, 47635, 30772, + 7243, 36980, 54179, 18778, 33643, 49071, 1602, 37364, 53526, 10499, 34069, +56315, 17935, 43852, 8396, 28317, 62308, 15971, 43590, 31587, 1917, 55199, +28437, 9291, 41667, 24328, 52211, 7240, 28835, 65188, 2840, 41052, 24767, +61945, 6341, 45801, 20582, 58630, 29463, 12292, 38386, 47147, 9038, 33320, +60935, 2537, 46124, 23575, 41198, 12623, 61645, 20581, 33516, 47087, 5704, +52594, 14186, 41328, 25794, 46646, 9938, 57133, 20185, 31930, 43841, 7369, +64640, 25830, 39642, 13877, 47511, 20706, 28731, 61070, 14768, 52096, 27926, + 7141, 53801, 37521, 14249, 59074, 33613, 17901, 60894, 35416, 10168, 50769, +27573, 4630, 34811, 59986, 6393, 45582, 24463, 39525, 11479, 56577, 18765, +35348, 59267, 8747, 39328, 23797, 44805, 2980, 57807, 21227, 40622, 6879, +55918, 34697, 3743, 49342, 18260, 57747, 29471, 1853, 37764, 62803, 13964, +45604, 31339, 16398, 64245, 35742, 1043, 59794, 24969, 45249, 5009, 40951, +11503, 61772, 22654, 28546, 57160, 6056, 47619, 23414, 43063, 14222, 37012, +62944, 353, 41781, 29972, 7133, 55879, 35709, 1898, 42613, 19702, 4931, +35912, 46756, 21209, 55343, 447, 29267, 53950, 18866, 44324, 4162, 52826, +30815, 10154, 49496, 27877, 16577, 57163, 38235, 3451, 28536, 46990, 16361, +65209, 21675, 36380, 43309, 5858, 57565, 35851, 11282, 45861, 21852, 60307, +12564, 42502, 26442, 62026, 9636, 28641, 50894, 3860, 46192, 34295, 8086, +54135, 23004, 45730, 13774, 33733, 48777, 11521, 62964, 21091, 45708, 5512, +39087, 24415, 64091, 16207, 52743, 6083, 39124, 26164, 63460, 3888, 30615, +56212, 12481, 43174, 26483, 38857, 10064, 44407, 26272, 53445, 8040, 46834, +34607, 1421, 56173, 38015, 19709, 63576, 14562, 46331, 23167, 40666, 931, +51516, 30357, 16962, 48927, 34180, 11970, 54332, 20100, 38383, 49907, 4434, +34819, 46237, 18979, 57444, 2297, 32508, 50920, 8585, 37982, 63285, 3164, +40758, 21309, 51679, 6636, 36364, 57848, 3963, 33768, 60948, 10886, 38923, +23733, 48423, 5443, 59912, 21973, 46979, 1447, 39757, 23126, 62017, 6134, +38573, 24119, 48592, 15174, 53927, 23590, 42822, 12871, 56685, 22095, 43877, + 8096, 63316, 19604, 31443, 50056, 11256, 45486, 18681, 29635, 56484, 9115, +39597, 21243, 63031, 28847, 43, 49037, 30890, 19315, 52894, 36320, 2929, +31839, 60115, 11044, 44626, 20404, 55150, 11916, 34348, 60697, 17144, 42619, +24596, 65509, 7734, 32980, 43912, 3688, 51727, 31064, 12903, 56586, 36530, +15507, 44076, 4558, 54043, 24942, 40911, 14756, 55890, 19757, 37735, 65349, + 5175, 44321, 38403, 18290, 27262, 50694, 15034, 46610, 22123, 59991, 17615, +35019, 62682, 14122, 51750, 24851, 42328, 5188, 64853, 12124, 29753, 58051, +15711, 28555, 62037, 6427, 27455, 47941, 12733, 54955, 37577, 4040, 47655, +21687, 59995, 13924, 36355, 50710, 17781, 48269, 32723, 11755, 59558, 37432, +17356, 32073, 56803, 12226, 42964, 35395, 16516, 48829, 31793, 3740, 60585, +35193, 18991, 54688, 28790, 11907, 37806, 58595, 15362, 32284, 50935, 647, +44523, 27662, 10269, 56416, 35485, 21148, 65492, 6763, 51956, 23258, 40024, + 1916, 48857, 24169, 53710, 12382, 41799, 22330, 59509, 5267, 54525, 10282, +36850, 42798, 4032, 48691, 33558, 11910, 56443, 23112, 41516, 6054, 50010, +28071, 2883, 54417, 37755, 12552, 57038, 38488, 16951, 29937, 50093, 9296, +64318, 22873, 31532, 48558, 415, 41750, 25827, 63994, 6246, 53653, 18412, +31290, 50723, 14805, 46014, 28658, 12490, 64851, 26174, 43900, 11049, 35454, +60321, 16640, 32797, 50812, 3272, 27107, 55697, 7696, 43805, 23193, 51326, +13067, 31471, 55047, 17520, 47178, 31139, 8338, 53207, 16462, 35759, 64890, +11077, 31570, 54533, 9407, 27930, 56617, 18088, 50998, 22506, 43884, 13856, +60346, 24957, 51974, 30030, 62333, 7744, 41564, 17373, 34244, 63205, 9255, +39027, 23250, 60511, 12683, 37860, 55817, 801, 45489, 35763, 8638, 62522, +21894, 40768, 7932, 52462, 33121, 553, 55546, 14862, 47391, 20816, 29475, +63963, 1521, 50012, 25645, 38935, 5584, 51940, 20075, 45172, 37192, 14626, +55703, 27084, 18006, 59009, 37304, 1761, 63814, 24771, 42956, 6718, 53808, +26186, 38587, 13006, 59244, 19908, 49542, 9902, 42113, 26775, 55837, 13586, +45207, 21582, 48881, 15650, 41126, 24222, 65206, 5667, 47276, 22107, 61630, + 3394, 31539, 42107, 19780, 59996, 27081, 11642, 49743, 29580, 4267, 37063, +58267, 7704, 31783, 62718, 18808, 43351, 4896, 59767, 22214, 44739, 1588, +62204, 28353, 15467, 58777, 27050, 12358, 51993, 37887, 21337, 45553, 14344, +56698, 27819, 17692, 33738, 57412, 10274, 42182, 26586, 54222, 13204, 47528, +20028, 30740, 49679, 82, 64250, 19352, 44634, 31028, 8330, 36023, 63450, +18516, 43522, 9780, 53262, 26955, 41281, 10488, 64319, 31117, 3984, 58618, +26253, 39948, 5113, 51613, 25885, 39419, 12832, 56263, 29087, 6863, 61010, +37045, 1619, 46779, 25537, 55174, 6244, 44957, 18519, 37992, 60576, 13853, +42499, 7992, 63283, 25876, 50078, 5779, 39103, 26984, 64724, 445, 49341, +24669, 39678, 4567, 52278, 12630, 37769, 55947, 16215, 27887, 61401, 11414, +45951, 24069, 40416, 1505, 60969, 22798, 31759, 46538, 7966, 62585, 35816, + 481, 50416, 27599, 15553, 52442, 29213, 12142, 57925, 34566, 6298, 54925, +30947, 230, 37237, 51137, 8097, 44156, 31777, 2120, 59739, 17709, 46247, +35968, 20993, 47500, 3553, 38060, 51356, 18437, 44775, 36529, 1063, 64267, +29777, 17257, 58016, 34526, 10040, 41699, 26452, 64742, 6257, 30964, 57315, + 1281, 42989, 21642, 54237, 5347, 46055, 22522, 50828, 402, 27711, 63268, + 7442, 54038, 24472, 40052, 15093, 48019, 1211, 64541, 22843, 44252, 5389, +55583, 28860, 9268, 64052, 37060, 16235, 59879, 22933, 49339, 2707, 29930, +44121, 15107, 62143, 28743, 11255, 57908, 33479, 17425, 61301, 3059, 32229, +46170, 16638, 50070, 33345, 18292, 65297, 27130, 15452, 59953, 38463, 2031, +28966, 61735, 19247, 43901, 11457, 64539, 31709, 15560, 49145, 27157, 1314, +62174, 36651, 19136, 52880, 3850, 42409, 14973, 61294, 21503, 52214, 11969, +33420, 48313, 20427, 42584, 7806, 62714, 33207, 1382, 56643, 37213, 18898, +48120, 5543, 54583, 24517, 42114, 9008, 53650, 19379, 47371, 37985, 11461, +32023, 58587, 19210, 39049, 6348, 65192, 23997, 40159, 2773, 60377, 21702, +32883, 50453, 1615, 45802, 22087, 58915, 4730, 35224, 47257, 12384, 40453, + 3578, 64180, 26580, 39275, 10100, 46077, 18603, 35153, 15789, 56513, 24719, +51420, 3243, 42696, 25642, 57418, 5518, 46353, 34646, 15947, 27374, 59210, +18463, 31312, 50452, 12658, 43697, 25921, 60902, 11248, 46205, 28418, 19322, +62066, 37279, 7296, 55019, 16629, 34374, 43743, 8774, 57170, 18039, 34393, +65315, 822, 30343, 59814, 7331, 38343, 51666, 11939, 29556, 48081, 10009, +37971, 51550, 17913, 30922, 56536, 1210, 47722, 26968, 39625, 4278, 60965, +22864, 38583, 2169, 62265, 31980, 7443, 57475, 34322, 1254, 52056, 18596, +31810, 54324, 13139, 39242, 24830, 58009, 11168, 48639, 6028, 38344, 62388, +18662, 33336, 56857, 10123, 42930, 25347, 49494, 12347, 54945, 24874, 38964, +10653, 53470, 32830, 17714, 37716, 50652, 6912, 47008, 35980, 3572, 64672, +29741, 7540, 59949, 34507, 527, 54402, 38422, 6066, 47861, 23683, 60363, + 1580, 38969, 22651, 62177, 5778, 41801, 18188, 55884, 29435, 11631, 38113, +54079, 16879, 47975, 28625, 4684, 56932, 34687, 19399, 59513, 817, 44393, +21073, 36266, 51130, 13579, 44323, 20117, 65340, 9805, 33193, 59918, 1089, +44956, 22381, 54253, 16115, 41109, 23440, 65017, 14162, 34346, 50274, 12036, +57560, 27403, 4854, 34278, 54946, 21086, 40033, 12724, 46607, 24384, 53684, +16096, 41941, 21824, 46298, 8837, 62689, 33329, 20315, 58899, 29146, 2334, +48983, 35611, 19234, 52992, 5148, 32316, 57115, 10144, 49158, 19307, 39080, +12702, 52289, 17208, 29529, 56783, 20801, 45433, 6990, 35174, 60542, 1858, +41227, 23612, 61779, 13808, 45362, 26241, 64662, 11686, 28366, 54002, 15465, +40389, 23734, 56597, 7543, 30471, 55041, 14052, 62831, 27300, 9222, 59295, +31691, 13524, 49536, 23355, 41957, 5714, 52715, 24268, 44970, 3007, 53967, +20442, 47075, 12925, 40140, 25549, 61831, 13927, 39372, 26535, 64153, 8905, +34163, 58382, 15325, 43745, 33334, 18502, 51283, 9586, 57498, 27016, 42258, +13333, 34469, 53391, 17251, 41745, 22037, 47888, 14486, 53300, 29907, 6105, +45581, 36868, 17242, 59225, 33197, 7723, 50561, 37159, 19060, 45851, 5513, +51522, 36902, 21373, 43001, 8035, 62582, 27780, 926, 55985, 37888, 9148, +49449, 32119, 17167, 52528, 37924, 8454, 32671, 53447, 23756, 40143, 6802, +57651, 21253, 34101, 44896, 9980, 55017, 24899, 40617, 13271, 56057, 26733, +39070, 5312, 46316, 23471, 60662, 2270, 29225, 57093, 16255, 40093, 24123, +52707, 9558, 29924, 61501, 15457, 40098, 21280, 59470, 550, 38668, 26365, +57382, 4755, 29336, 63354, 17184, 42355, 2286, 56906, 26706, 47781, 10797, +35915, 54313, 19157, 43088, 11803, 62134, 25886, 39984, 7761, 43604, 24865, +53508, 15790, 60733, 21960, 36343, 49280, 8057, 32192, 57357, 1220, 49800, +11861, 39736, 6131, 45148, 20514, 61515, 31090, 13888, 50805, 19797, 29210, +64950, 2882, 47637, 36853, 6586, 63771, 24763, 54968, 2019, 39143, 17292, +34016, 58780, 3964, 42719, 12227, 50987, 23243, 30902, 47837, 5115, 61097, +19778, 29865, 54302, 10678, 41044, 21970, 49681, 16282, 45895, 27720, 2811, +61244, 36660, 16467, 58084, 27526, 4093, 62054, 14517, 40817, 21657, 65489, + 9142, 32670, 46868, 19336, 53314, 11241, 44229, 25783, 50933, 20460, 42341, +10545, 60016, 26196, 44965, 9756, 35426, 62963, 1801, 42568, 18910, 55331, +36325, 15826, 28404, 45066, 598, 52753, 16677, 39075, 21052, 65339, 2337, +33347, 45430, 6409, 60318, 26748, 42016, 3299, 64138, 30208, 10337, 57211, +21980, 27838, 44308, 11603, 53881, 23233, 40484, 16003, 47305, 27257, 11475, +63534, 37082, 15307, 31381, 53012, 11040, 45825, 24388, 55045, 14472, 35462, +46687, 7085, 58960, 27244, 2215, 61418, 37288, 14276, 52085, 22250, 46508, +11689, 31623, 50551, 17631, 60881, 7927, 28601, 54837, 1936, 35095, 47094, +16086, 53744, 23951, 41153, 14422, 34096, 48672, 4282, 58667, 32647, 8099, +52841, 30057, 2407, 37507, 43388, 20391, 64533, 14884, 48354, 29853, 1510, +57231, 33610, 10510, 62036, 4183, 32901, 56333, 14017, 28815, 51369, 17619, +44904, 6513, 41816, 23151, 63644, 8699, 41489, 23728, 62325, 14130, 47752, +21865, 34248, 64949, 2613, 43606, 24405, 59599, 5410, 39844, 11683, 63352, +23568, 47951, 16762, 30737, 53216, 10539, 47530, 20886, 38861, 5391, 49233, +22419, 58284, 3817, 36113, 63463, 12650, 48643, 25962, 39840, 459, 45256, +19824, 36993, 52659, 4544, 43027, 25222, 55802, 10931, 60750, 21074, 39051, +14363, 63016, 26827, 38877, 8759, 58879, 23469, 44685, 7785, 51890, 35037, + 2339, 53577, 19465, 45231, 29399, 11130, 38114, 55590, 2963, 46658, 23646, +38886, 5185, 62070, 21783, 49098, 3527, 30019, 62841, 7684, 33373, 58874, + 2138, 40440, 24102, 63191, 13642, 55276, 4096, 27387, 47356, 20528, 60272, + 319, 41148, 24863, 63695, 14426, 28756, 58857, 11821, 48616, 19218, 35617, +52985, 14203, 29968, 44155, 3711, 58316, 27863, 12368, 62968, 21913, 44815, + 657, 60159, 18105, 47351, 36220, 4413, 63783, 17608, 31261, 46717, 2452, +59715, 33500, 8078, 48947, 18331, 58082, 29951, 10854, 38398, 54377, 9339, +34715, 47340, 4610, 59072, 19854, 38096, 50137, 3561, 27842, 52360, 10166, +43392, 23660, 64476, 12480, 45761, 20643, 49626, 9514, 33115, 54004, 20142, +40688, 13489, 33027, 59904, 7856, 29276, 41395, 3910, 56822, 21115, 49485, +14577, 34229, 63808, 9784, 31899, 44746, 2231, 51446, 18530, 29330, 59700, +13127, 40946, 23343, 65118, 47352, 19404, 54737, 28355, 9879, 49104, 38358, + 1400, 35820, 56368, 11998, 42275, 22861, 54398, 10444, 44284, 20897, 48573, +14554, 41970, 23270, 56001, 6142, 47182, 30142, 20093, 57397, 35257, 2301, +63406, 21173, 39825, 9885, 52328, 33670, 3051, 47691, 26642, 58198, 4971, +32585, 63619, 13238, 43480, 22229, 49988, 8289, 32103, 53395, 18781, 46493, +35066, 6495, 50544, 25867, 43746, 15720, 59881, 7732, 34652, 58102, 16997, +39893, 5253, 64642, 15289, 38937, 21363, 49910, 4895, 58276, 29254, 14411, +48129, 25856, 51894, 4411, 30382, 64741, 10530, 50088, 22751, 31752, 60781, + 5457, 47524, 24276, 41499, 13265, 56163, 23358, 38558, 11436, 52166, 21109, +43911, 14801, 55184, 36579, 1074, 61439, 18136, 32081, 48471, 4690, 62701, +31717, 9278, 57936, 35461, 20352, 50188, 3811, 44893, 21966, 64400, 7523, +30381, 43303, 2615, 62680, 21120, 31508, 50052, 15793, 44113, 28139, 10359, +57616, 33501, 2912, 63842, 26178, 40640, 5683, 45764, 21972, 38198, 57632, +14292, 30079, 62403, 18742, 42546, 3625, 32328, 61581, 7315, 52058, 20421, +28283, 43561, 12817, 47621, 24695, 62477, 16578, 28067, 54437, 3804, 45613, +36259, 8615, 59914, 22233, 43612, 15375, 50966, 37016, 22866, 45452, 7928, +60341, 37571, 1230, 31219, 53297, 15636, 58010, 31073, 11066, 36959, 54651, + 637, 44450, 26332, 39123, 5663, 51470, 16544, 29839, 55651, 11070, 34344, +47984, 18870, 54385, 30091, 3697, 37513, 56515, 8413, 33659, 64310, 3092, +42218, 24566, 56821, 13220, 43328, 33607, 18605, 29277, 44844, 6202, 52757, +16969, 31661, 61421, 10751, 49689, 29743, 15900, 65298, 21105, 40511, 2436, +33216, 46169, 7812, 51799, 32541, 126, 56436, 18032, 48757, 30050, 3410, +63686, 38065, 16328, 28378, 60572, 10130, 36313, 50267, 4253, 61397, 27095, +17243, 30663, 65373, 13004, 52397, 24889, 41477, 10889, 56247, 20193, 37114, +47328, 12321, 27227, 46069, 19092, 52440, 8671, 31654, 48865, 18792, 43154, +30787, 9061, 52971, 35683, 15547, 56737, 32327, 8249, 49716, 37770, 2248, +44173, 25548, 56673, 4851, 41054, 23929, 63564, 10916, 51001, 20463, 35818, +47327, 5628, 54967, 25627, 39003, 10992, 51536, 29978, 14341, 55683, 25120, +42197, 7620, 53294, 22614, 39822, 14143, 65391, 24198, 44793, 1082, 35787, +63194, 16571, 27895, 45140, 14663, 64977, 27648, 11309, 34099, 44906, 13718, +63509, 31479, 17255, 55691, 34590, 6561, 51440, 26953, 39815, 1677, 59150, +26737, 44004, 5997, 62375, 26297, 49405, 184, 43990, 22609, 63258, 15882, +46902, 36300, 7086, 29452, 58124, 790, 41129, 20413, 55965, 27928, 11925, +62660, 37269, 5570, 46691, 26154, 53814, 4200, 33936, 30465, 60065, 2403, +36629, 63569, 17071, 27493, 57990, 9413, 45818, 32134, 5787, 60373, 38208, +18063, 30021, 58971, 4705, 34878, 61464, 8834, 44290, 25473, 64848, 14235, +40431, 6909, 54300, 25353, 45717, 13087, 59142, 26382, 41689, 14202, 63025, +20786, 43474, 11513, 35770, 54051, 19103, 40244, 5481, 56712, 34382, 20739, +64736, 342, 42449, 29235, 12467, 60656, 22351, 54701, 2666, 40153, 20818, +51673, 29526, 684, 36463, 54007, 19626, 46585, 31342, 2810, 61295, 24842, +42663, 17464, 36705, 56659, 8993, 40257, 21568, 58613, 16572, 37248, 43385, + 7453, 54066, 13820, 40938, 26607, 58194, 9379, 31699, 49185, 17930, 63092, + 4, 41261, 26930, 60778, 5465, 32525, 49361, 18948, 46051, 9456, 38086, +56407, 13980, 28236, 50278, 19094, 43357, 1818, 53502, 29369, 16735, 58924, +38158, 12708, 33049, 51853, 15597, 58594, 26415, 39186, 12195, 56936, 4451, +34113, 64998, 21493, 47245, 7651, 40818, 24283, 51438, 9201, 33382, 61854, +15785, 53117, 27268, 4122, 48159, 36926, 6977, 49802, 26647, 59020, 12478, +44547, 29070, 15518, 63729, 37370, 530, 59593, 19668, 39947, 5486, 51141, +35126, 9831, 61821, 30774, 13452, 53276, 26265, 40380, 6902, 63971, 29298, + 2304, 54149, 16792, 41302, 25162, 47794, 13175, 64326, 21289, 39298, 3873, +48594, 25603, 59720, 17397, 29896, 50655, 9512, 57983, 19994, 32650, 60599, + 7294, 42346, 25227, 63885, 1271, 32163, 42918, 12898, 60164, 24871, 44248, +14397, 49927, 28515, 18062, 58995, 32396, 8964, 37567, 62237, 1321, 46914, +11229, 60332, 21678, 35437, 57144, 2906, 41979, 24578, 55992, 6967, 33894, +47171, 12364, 54480, 22996, 59028, 16192, 29030, 61706, 13187, 43512, 26031, +39486, 11025, 54503, 33591, 19787, 50898, 5840, 32529, 48060, 22045, 56445, +14124, 31675, 42464, 8365, 57117, 38392, 1517, 32929, 44753, 6443, 60184, +26268, 38634, 35, 61373, 18340, 51580, 34869, 4393, 64859, 36572, 21401, +57862, 1014, 35840, 61176, 12791, 45080, 24485, 64709, 6627, 28981, 46968, +21592, 55797, 10476, 31227, 64265, 13507, 39604, 22167, 59276, 6953, 45616, +25950, 39471, 2450, 61017, 18146, 33250, 42971, 14829, 64807, 28146, 7397, +58775, 37810, 2981, 49759, 16512, 30335, 62622, 10864, 47576, 28825, 4832, +51168, 31615, 19479, 53342, 7420, 47850, 36863, 3232, 51796, 21488, 36478, +54778, 20, 47750, 27127, 7241, 49452, 37452, 2499, 60620, 22094, 42662, + 8843, 61979, 23158, 38544, 13781, 52323, 21344, 38499, 10543, 56239, 18110, +34915, 52751, 9183, 30934, 55717, 13063, 44196, 24572, 52310, 16708, 61465, +35645, 6570, 50475, 38214, 17103, 30266, 55409, 11121, 42322, 21435, 58441, +15219, 52300, 24326, 40635, 14382, 50252, 5273, 44688, 33145, 18867, 62769, +27056, 15697, 50197, 27748, 215, 53680, 33222, 12284, 49328, 24215, 39606, +17759, 51879, 1153, 34706, 60081, 17054, 43349, 31643, 8310, 36276, 48431, + 30, 55277, 23698, 38658, 6199, 59970, 22742, 49991, 1419, 30022, 62347, +15898, 44603, 28073, 11350, 36147, 48923, 16658, 56176, 33043, 4808, 48297, +37667, 16702, 31616, 63899, 6850, 45753, 23079, 62421, 8668, 28736, 58871, +13462, 35523, 48322, 8295, 55503, 32865, 245, 44671, 23036, 63850, 6511, +46803, 32991, 2014, 57037, 27435, 18968, 63467, 34139, 2822, 46148, 20691, +55165, 6741, 34613, 44301, 21977, 53759, 9085, 39211, 24538, 54613, 11855, +29794, 63660, 21271, 42936, 3030, 36174, 60939, 8178, 40129, 24528, 65376, +12278, 37376, 49232, 6836, 28220, 61248, 894, 40150, 24897, 46358, 5095, +51249, 19105, 29234, 53289, 14951, 41565, 617, 54836, 35643, 18222, 60177, +13736, 44597, 28811, 1642, 49127, 37506, 10014, 64775, 32085, 20557, 57138, +10921, 39034, 22124, 54123, 2283, 35308, 55850, 9346, 45482, 22556, 31932, +54691, 10904, 42968, 22969, 56638, 15778, 39995, 23924, 47808, 800, 59144, +19809, 32522, 47111, 11331, 57627, 35725, 20922, 62548, 4777, 31894, 50550, + 9568, 42263, 24240, 57330, 14565, 45518, 6998, 35098, 64643, 13737, 41786, +24390, 49557, 3173, 40775, 23288, 55006, 9485, 35592, 48909, 15709, 53573, +28133, 5904, 41035, 20248, 61377, 701, 36646, 51999, 6723, 27788, 48911, +16267, 54303, 27500, 19297, 51850, 38412, 4759, 27867, 46414, 18869, 64102, +10042, 38840, 21897, 59632, 1461, 38655, 26285, 42599, 6601, 50006, 36020, + 3834, 48063, 21661, 64609, 5532, 45741, 24353, 60310, 9248, 37215, 57904, +17770, 43984, 678, 40139, 25236, 62902, 12592, 49455, 20245, 27330, 47972, +15493, 53811, 22474, 40512, 9437, 56385, 26939, 44472, 7028, 28702, 55295, +14096, 44212, 27994, 11051, 38052, 54575, 16440, 28452, 50376, 3175, 40773, +17997, 51730, 37126, 1629, 62006, 16169, 40906, 24188, 52380, 3432, 48108, +30415, 16746, 53396, 34370, 11762, 57453, 22886, 48965, 9378, 28913, 56796, + 1435, 50587, 34410, 18682, 46722, 13466, 33562, 60523, 20619, 45306, 260, +34435, 57493, 15537, 38005, 61518, 9182, 42386, 24922, 58931, 12668, 31175, +60986, 18212, 42963, 8105, 62131, 29382, 18131, 59670, 36028, 12586, 56842, +25463, 45301, 14289, 33181, 48168, 18686, 55367, 5156, 45122, 25102, 64622, + 3110, 43277, 23313, 60871, 5384, 48750, 24929, 39649, 2426, 65430, 22268, +38822, 5751, 46166, 30473, 12991, 47540, 23001, 64560, 3331, 40253, 20565, +60637, 53, 35064, 45282, 9022, 36037, 6809, 48166, 22160, 58878, 29412, +13174, 55113, 37965, 3507, 53426, 38487, 11072, 35522, 64355, 14297, 41455, +21693, 62175, 2788, 32352, 57866, 13561, 45748, 28764, 21333, 53116, 3722, +49476, 24394, 64552, 16000, 29329, 44353, 9341, 56561, 26299, 39981, 14526, +46719, 24979, 52624, 7938, 36912, 57371, 2411, 46822, 23256, 60162, 6014, +40596, 24570, 63043, 14055, 27972, 57720, 10045, 43215, 26514, 55598, 11540, +33560, 50040, 18785, 45491, 5950, 41413, 22807, 63260, 16780, 28610, 53913, +13509, 34950, 49439, 18080, 27753, 60428, 12996, 45546, 35716, 5042, 48453, +22371, 59375, 12641, 40066, 25391, 61792, 14784, 50268, 4619, 30761, 64556, +17185, 43243, 2433, 58424, 35307, 6234, 51044, 25546, 59202, 14810, 29183, +53181, 19725, 48103, 5494, 32384, 55567, 20675, 42112, 14967, 52495, 23274, +44160, 9760, 57601, 20885, 35884, 63190, 8047, 42689, 32296, 22746, 61118, +11292, 29466, 46128, 4988, 55540, 20903, 36459, 58884, 11859, 27980, 44084, +17346, 55302, 138, 41877, 25916, 63144, 6180, 40529, 25469, 49187, 17715, +30427, 57612, 4581, 48155, 16948, 36828, 64206, 1888, 32460, 49174, 6675, +60504, 18138, 42331, 35137, 5857, 55820, 17555, 42868, 27849, 8290, 50046, +37850, 15293, 55812, 19599, 35521, 60573, 2716, 47417, 26981, 38731, 19827, +53771, 1835, 46967, 33488, 7657, 59124, 36522, 18501, 61955, 13445, 44943, +29041, 4881, 62671, 21388, 34699, 57172, 12088, 45178, 26557, 53961, 10961, +40867, 23246, 63192, 2573, 35658, 42841, 9494, 65204, 34412, 15919, 56508, +32666, 12032, 50628, 22802, 43594, 5519, 53095, 26859, 44578, 11339, 63602, +19149, 53706, 30244, 16600, 56896, 38157, 11922, 33041, 55433, 18974, 41269, + 1712, 50203, 27695, 12009, 31310, 64918, 20988, 52054, 7092, 34039, 43680, + 3346, 58859, 36820, 7894, 63906, 31886, 4104, 59645, 34066, 19419, 48317, +11809, 63759, 36812, 17058, 32705, 60537, 2498, 51077, 22389, 42185, 6188, +62515, 34001, 22049, 58782, 8549, 27951, 54904, 19389, 46380, 35026, 5983, +44610, 18600, 61489, 35963, 12634, 42801, 197, 65029, 26451, 46419, 6490, +31586, 63305, 19238, 45724, 13058, 39546, 25214, 61980, 4081, 53641, 24448, +39612, 6503, 56487, 26035, 42779, 11592, 50632, 27504, 17409, 34131, 54634, + 2048, 45593, 22066, 39220, 5710, 56399, 23050, 32920, 48788, 14312, 42223, + 5266, 53665, 23448, 40304, 9877, 65353, 29813, 4140, 53340, 37385, 15827, +31093, 57874, 11084, 39282, 26978, 54910, 12403, 38772, 26578, 44490, 14588, +58843, 20601, 48132, 11417, 32576, 51222, 19853, 59233, 1766, 32793, 51904, +15418, 42994, 25379, 47227, 13482, 53159, 27777, 17357, 63960, 31149, 57235, +18431, 42651, 923, 34301, 65273, 8091, 46751, 27341, 16545, 31432, 58201, + 8459, 43953, 25178, 52473, 7236, 38949, 26320, 50538, 9689, 30419, 62872, + 8044, 41626, 15342, 58275, 33757, 11791, 37977, 47363, 4698, 61549, 34503, +18300, 49000, 3248, 64967, 33968, 10827, 28537, 60741, 18101, 42465, 27276, + 9044, 51762, 37418, 19859, 55034, 9260, 34006, 50128, 1346, 41294, 23391, +53106, 3819, 38692, 20047, 60095, 2043, 31772, 57295, 15610, 33497, 51525, + 3948, 37742, 47046, 10753, 60906, 27206, 3345, 52630, 38385, 8319, 31516, +55445, 17204, 42030, 26422, 53373, 7756, 31334, 51860, 1388, 43284, 29821, +18621, 59087, 38402, 12276, 34234, 52402, 20805, 48046, 13534, 38975, 20252, +43850, 7679, 55789, 32829, 285, 37868, 44987, 17304, 59556, 27712, 2520, +62072, 31773, 7776, 37031, 64719, 16942, 33678, 47482, 1922, 27821, 48849, +17445, 58121, 3905, 37162, 48279, 16052, 64127, 25223, 41758, 8625, 50684, +18779, 34455, 62741, 5471, 47093, 21696, 33648, 52269, 12828, 46413, 19677, +31697, 51696, 7425, 65164, 14025, 41430, 25718, 60361, 8421, 28484, 46366, +20666, 57368, 11268, 39058, 24765, 51364, 12281, 64895, 21353, 29845, 48961, + 3616, 61531, 19795, 30148, 58416, 162, 45770, 29054, 7726, 51772, 33399, +17801, 63361, 6130, 43331, 26503, 61297, 16995, 28547, 52037, 11591, 30405, +47737, 280, 52828, 19948, 36606, 46394, 14771, 50525, 2194, 39691, 23706, +65044, 7194, 38795, 21303, 58169, 15224, 29918, 47780, 12263, 55782, 29735, + 4005, 48801, 27074, 8430, 61698, 37559, 810, 55330, 25474, 40595, 13930, +62216, 20096, 31382, 48892, 4340, 40872, 10112, 60945, 27784, 1130, 50921, +22316, 44615, 10003, 30932, 62249, 16616, 37941, 56762, 5054, 34829, 45020, +15197, 61038, 18963, 30264, 54358, 16534, 27047, 45415, 13711, 50714, 23778, +41362, 14536, 53023, 1902, 39837, 25813, 55900, 5537, 49151, 24519, 40172, +10099, 57457, 30538, 18568, 47253, 11576, 54019, 15799, 36267, 42483, 4263, +59410, 29473, 13194, 51084, 25165, 57014, 7933, 28929, 54907, 21087, 49077, + 9856, 40847, 17570, 54376, 36301, 3200, 41656, 23991, 59809, 5851, 49253, +20187, 32477, 43589, 12224, 63056, 22154, 46057, 8707, 32719, 64658, 3606, +37303, 59422, 7065, 41621, 23546, 64264, 13710, 51155, 26671, 40784, 11655, +52642, 2758, 30046, 64027, 20260, 33964, 50868, 1301, 45946, 19580, 38247, +58678, 11704, 27677, 63027, 694, 42032, 23776, 51983, 5885, 42526, 20685, +63616, 1449, 51678, 32744, 7489, 54211, 26548, 45435, 3745, 62753, 14882, +39420, 25890, 54767, 8740, 36987, 57729, 4519, 32740, 61928, 7480, 37574, +50678, 3668, 22582, 48871, 7714, 61020, 25213, 41151, 15406, 52083, 19777, +37372, 61900, 1771, 42380, 22968, 54838, 4053, 33911, 60601, 19506, 42379, +15087, 54088, 36067, 4542, 55783, 22727, 30152, 46565, 1896, 60404, 19034, +27704, 52662, 10569, 31113, 58384, 13496, 42905, 19749, 38142, 55099, 3949, +35112, 45504, 12094, 58004, 32898, 15570, 64272, 3111, 30013, 44204, 20607, +61830, 16161, 47550, 33374, 12427, 64451, 25775, 42631, 14347, 51008, 23651, +44831, 9948, 65038, 20368, 28070, 58344, 7551, 44365, 19933, 36409, 56118, +12593, 29525, 65460, 21200, 44047, 754, 61155, 11711, 39127, 21512, 64390, +15419, 33622, 55517, 10034, 47127, 27239, 3461, 56771, 28720, 6865, 62144, +26394, 41754, 1557, 64940, 24807, 47779, 16164, 38468, 62853, 11658, 27176, +50940, 6492, 35965, 53915, 14040, 47505, 21523, 55824, 3558, 30729, 50690, +13671, 60677, 37242, 9348, 54381, 25704, 45351, 10682, 30256, 53802, 1292, +39148, 19563, 56749, 32393, 3118, 53743, 25374, 41016, 14627, 61234, 29764, + 8735, 58165, 35447, 3219, 60122, 17169, 43397, 21744, 38842, 1219, 55032, +35351, 19260, 53013, 3998, 34596, 44516, 14677, 62748, 29480, 3259, 46685, +33967, 9321, 57139, 37964, 15835, 32860, 52912, 7024, 43240, 24670, 65234, +14320, 40587, 22000, 54972, 10866, 39411, 23925, 56072, 12343, 40445, 4802, +57195, 21854, 35235, 65403, 8938, 42521, 25824, 58872, 6150, 32014, 55209, +18091, 28573, 59427, 10221, 42096, 25633, 55471, 3601, 34283, 44417, 8203, +59587, 24103, 40071, 14530, 60843, 20034, 38196, 52917, 15204, 28255, 48359, +17839, 58393, 7729, 35783, 46934, 2675, 57432, 15122, 36336, 52644, 19802, +34497, 46904, 14245, 63120, 36244, 6308, 58164, 23721, 46696, 3653, 42373, +21809, 52955, 9592, 48325, 29441, 2267, 50468, 35419, 10789, 62626, 38098, + 885, 57328, 29713, 8933, 55100, 35082, 22134, 62198, 10583, 45339, 20858, +38757, 13500, 61736, 19692, 46638, 34949, 4600, 65155, 26027, 44104, 503, +31091, 63427, 18801, 49018, 9455, 33631, 60891, 1145, 41851, 17758, 47843, +33235, 4439, 62361, 36904, 19507, 29911, 60311, 8132, 44085, 26155, 55604, +10774, 35094, 53047, 16547, 41912, 7850, 58430, 28908, 1949, 51638, 36887, +14774, 55329, 27133, 18126, 48740, 30359, 14527, 55793, 32806, 9699, 48792, +34918, 636, 62516, 21020, 34471, 58720, 15994, 43210, 8490, 57449, 29221, +17390, 55040, 32432, 7528, 49613, 21827, 35031, 47255, 9800, 57065, 16899, +34728, 59625, 11687, 30913, 47640, 16334, 40360, 23570, 61822, 10629, 38560, +19140, 41907, 26998, 53221, 6149, 43500, 21161, 61091, 17979, 28014, 49354, +10598, 41986, 23484, 55873, 14679, 43267, 11666, 39261, 26488, 53074, 12483, +32176, 47350, 4752, 55635, 28872, 10795, 34615, 48534, 14952, 37830, 57464, +10192, 30323, 48874, 850, 65500, 28245, 17978, 48467, 38033, 11288, 63679, +20159, 43829, 31864, 8722, 56435, 35982, 22213, 45815, 1072, 51776, 25390, +61991, 6516, 27633, 47529, 17331, 62659, 29885, 640, 50790, 36864, 22775, +47856, 11067, 58999, 37348, 4468, 30004, 56960, 7200, 40547, 21449, 54911, + 8439, 30172, 61520, 5068, 39329, 26474, 49046, 988, 35803, 53288, 15852, +32025, 62690, 1640, 41730, 23350, 50261, 5302, 40007, 15367, 51015, 34343, +24425, 57468, 3714, 47625, 25957, 40469, 5632, 62823, 19937, 37754, 54265, +16275, 35603, 49631, 10877, 44367, 19318, 57061, 31460, 8868, 54127, 34550, + 4908, 28351, 55353, 18143, 34135, 64217, 10684, 43167, 25123, 39082, 8919, +45157, 26187, 59259, 10427, 43600, 19931, 30299, 41255, 6391, 65136, 19470, +34986, 59326, 14381, 49821, 23668, 44124, 6864, 63540, 22760, 45391, 8183, +35977, 56228, 2002, 48978, 20916, 39503, 13637, 45830, 26582, 53431, 5894, +61782, 24120, 46676, 12713, 29750, 63389, 10531, 48723, 18248, 30579, 54343, + 7312, 37130, 58762, 19074, 27786, 51760, 1367, 43770, 24091, 63674, 13093, +39582, 22011, 51150, 9256, 32764, 59443, 3470, 43787, 25569, 61848, 966, +48956, 21067, 34530, 46114, 15845, 51101, 2481, 39980, 24246, 55868, 13140, +38893, 21174, 64224, 10971, 37278, 47966, 5620, 31384, 52459, 13211, 45444, +22171, 61616, 16434, 31204, 46753, 17, 53557, 34998, 7469, 46224, 30444, + 2269, 63861, 35951, 6605, 45118, 30637, 21011, 60510, 10878, 30112, 43439, +23431, 64454, 8176, 28854, 54328, 5048, 43038, 27177, 17325, 51872, 37564, +15180, 55848, 32410, 12682, 63422, 27450, 19340, 57503, 38105, 14589, 59935, +23500, 47014, 6558, 28297, 48485, 17513, 36306, 65106, 4797, 46943, 16772, +31599, 50166, 3784, 59533, 26383, 42564, 1257, 54251, 28148, 8783, 52274, +37334, 10459, 55997, 22325, 49778, 12582, 36977, 44052, 20869, 53187, 14373, +39069, 26834, 63740, 10162, 50430, 22034, 43405, 14751, 57179, 1871, 46727, +34836, 13450, 61826, 20745, 47472, 795, 31588, 65212, 22610, 46539, 12811, +33403, 54803, 16075, 47265, 28584, 6020, 38082, 61649, 1196, 52271, 23851, +39631, 4345, 57395, 20321, 29155, 46484, 12412, 54117, 27342, 4964, 49900, +36688, 22194, 46371, 3947, 60704, 13990, 42287, 25177, 62192, 2152, 40560, +19189, 54210, 25036, 38854, 2966, 49334, 22017, 61331, 6855, 34114, 56579, + 4047, 43198, 25960, 55434, 478, 49680, 17673, 29864, 64121, 12684, 33765, +45823, 1075, 56818, 31694, 17005, 65073, 38018, 1943, 29781, 59345, 4929, +62264, 20376, 44001, 2312, 63425, 21684, 39728, 13880, 60127, 25306, 50787, + 6453, 64020, 18819, 27839, 51489, 13371, 45160, 24679, 39408, 8741, 57090, +34091, 3255, 50955, 27606, 7422, 53707, 38176, 17947, 48251, 5499, 64018, +20137, 41304, 12353, 37349, 49428, 16559, 32644, 56893, 9786, 39786, 22023, +55704, 14438, 46336, 6747, 32259, 52631, 18316, 27266, 55823, 14975, 43797, +24008, 60896, 123, 31993, 48799, 16179, 42009, 22035, 56729, 11841, 30917, +60468, 18657, 43572, 9567, 48705, 28417, 17369, 57691, 35465, 11404, 59781, +31184, 19710, 62544, 6262, 48687, 18432, 35685, 44246, 13021, 59647, 23147, +48274, 11991, 29342, 45254, 499, 60418, 21313, 30577, 53104, 4018, 39241, +15225, 46401, 21949, 61268, 12514, 37096, 46239, 3209, 49939, 21151, 29515, +57841, 1191, 48342, 22289, 54906, 5581, 38591, 26966, 63004, 217, 51453, +16277, 44542, 23419, 52130, 2687, 43070, 28282, 9762, 60409, 37537, 15682, +31300, 49420, 12204, 59756, 28627, 16637, 43837, 24546, 55008, 6777, 64516, +22456, 41585, 10521, 32166, 48894, 14913, 34328, 59182, 5269, 42585, 23498, +36677, 56313, 294, 43339, 22429, 50668, 15447, 42103, 9967, 60990, 35118, +18545, 55576, 6155, 47342, 34422, 2220, 57863, 26200, 41344, 16850, 52689, +29882, 8529, 35214, 44881, 13392, 59775, 30080, 6765, 63227, 20476, 29586, +58248, 16369, 45456, 4234, 53523, 27040, 41605, 1120, 50843, 22971, 62897, +17012, 36096, 57417, 1652, 29338, 49692, 6384, 41819, 23081, 64602, 16893, +28224, 57442, 11632, 49733, 24680, 40709, 12720, 59107, 22997, 50085, 3508, +34766, 54656, 18289, 48509, 366, 33411, 50696, 17813, 60236, 31792, 12214, +58458, 34189, 2158, 65449, 27119, 8234, 38484, 51232, 271, 36361, 46526, + 7274, 28719, 51676, 4359, 42123, 19845, 36750, 60645, 9628, 51572, 27380, +11675, 43581, 25632, 58026, 12633, 39485, 23336, 53397, 9537, 35434, 64357, +14630, 44909, 32415, 16149, 60351, 24895, 42846, 7219, 34454, 62210, 3521, +27647, 57737, 6697, 45560, 22832, 56107, 2853, 38535, 26179, 59622, 6359, +40486, 23534, 52755, 16279, 28483, 51418, 5388, 40902, 24951, 56506, 14740, +39222, 4990, 59654, 25959, 41391, 3383, 63483, 21048, 35315, 56862, 11753, +43806, 22155, 41090, 12563, 63725, 25575, 44245, 16535, 60403, 7329, 37020, +44025, 18074, 58147, 28470, 10056, 63147, 38345, 18418, 33502, 47863, 6035, +52627, 18023, 33818, 59406, 7284, 45868, 14425, 65020, 26646, 40161, 9325, +45597, 25555, 50442, 14334, 29458, 64732, 12238, 40158, 22810, 60124, 7707, +37174, 47650, 4268, 54054, 23849, 40101, 14126, 50467, 5650, 45224, 27687, +19284, 52177, 35564, 24081, 40258, 8977, 56219, 26958, 38510, 7034, 57516, +26524, 45594, 594, 40754, 21122, 32997, 44481, 3003, 59278, 34408, 6835, +62502, 18763, 47841, 30211, 12587, 60844, 36924, 16854, 58662, 29827, 473, +62389, 25514, 40208, 10128, 46678, 26867, 59081, 7760, 29719, 54228, 2032, +42319, 24296, 65368, 4708, 41338, 26380, 60579, 17468, 41206, 1844, 63672, +37999, 8195, 33853, 51437, 13130, 39081, 26481, 52910, 10487, 34028, 63093, + 2535, 44335, 24634, 51714, 5810, 39023, 22921, 64113, 3623, 33646, 52094, + 6690, 43492, 26075, 53383, 2905, 45839, 26725, 41768, 14516, 55028, 27837, + 8179, 52426, 31754, 2214, 57137, 36129, 8814, 65184, 25361, 39637, 14172, +58142, 8252, 34105, 63449, 23887, 50626, 2013, 40199, 26428, 58494, 14476, +30673, 61752, 10081, 41742, 16819, 32184, 60156, 13193, 40639, 24217, 56736, +11586, 47002, 21613, 34619, 55272, 5290, 39154, 25006, 62351, 13607, 35673, +53248, 4341, 47341, 24717, 41594, 467, 52457, 21197, 39556, 4572, 61657, +32473, 15262, 48093, 28657, 763, 52141, 37560, 20063, 56759, 2915, 40532, +22656, 50950, 17122, 58119, 9475, 28338, 65484, 12902, 39381, 25616, 62167, + 2733, 30352, 48623, 14243, 45583, 24891, 40056, 11604, 62877, 18237, 30351, +47980, 5558, 56587, 13824, 37781, 64482, 18229, 50297, 27426, 3988, 53266, +38417, 14112, 49884, 36743, 9745, 41058, 26366, 62069, 11900, 38502, 19539, +59733, 14365, 43705, 34326, 4566, 47236, 19799, 38134, 63704, 14883, 32349, +56794, 10580, 35624, 51981, 3320, 41678, 21931, 62574, 5713, 33931, 55880, +18980, 41991, 9496, 64972, 26097, 41221, 11582, 61299, 25283, 45833, 13902, +39941, 3228, 45165, 24910, 49610, 9664, 38115, 46303, 19371, 54478, 29954, +13851, 60659, 27044, 17821, 58443, 37630, 11565, 64675, 25610, 54927, 12749, +31854, 44971, 3190, 59122, 37079, 19666, 54715, 424, 32915, 63324, 7110, +46036, 30699, 18100, 49848, 27353, 6390, 56890, 36282, 1989, 48352, 17729, +56440, 28577, 12002, 51331, 38263, 16325, 32854, 65337, 11163, 42776, 20196, +53739, 12982, 47280, 34520, 10922, 64472, 32207, 3753, 58624, 36544, 18874, +62922, 8525, 30475, 50495, 17537, 44364, 21711, 52811, 11230, 36457, 49974, + 9030, 45078, 18916, 32334, 60022, 4751, 53403, 28900, 7967, 48450, 35890, + 1689, 50985, 19627, 30292, 65098, 3064, 40480, 14987, 51932, 30604, 954, +55904, 27479, 12841, 64337, 38366, 9373, 28471, 51225, 20964, 41432, 32158, + 5005, 56140, 18339, 52282, 32822, 1173, 57783, 20000, 36742, 47857, 4762, +34490, 56196, 15258, 44300, 27340, 16771, 58347, 36288, 8198, 62496, 30326, +20434, 59866, 35815, 8474, 55547, 13289, 47160, 34727, 58680, 17632, 42194, +12067, 53344, 22297, 49331, 9824, 32034, 63049, 17311, 47600, 8299, 55166, +23144, 39908, 15928, 53876, 23805, 41132, 1597, 55500, 21429, 40197, 5784, +47021, 33034, 15497, 50234, 37394, 13834, 57727, 22766, 52164, 2702, 39194, +24683, 61136, 15149, 34431, 53055, 8829, 45260, 30909, 19228, 51196, 10721, +30811, 54198, 20863, 44862, 11954, 58091, 28747, 3409, 65165, 20464, 45193, + 5594, 58654, 27415, 17087, 54323, 38299, 12896, 34537, 55147, 14735, 42680, +25934, 56595, 11823, 40585, 23918, 62166, 10251, 39144, 21706, 58682, 7627, +32841, 63931, 1158, 37651, 60191, 16582, 46467, 24456, 39749, 15119, 53487, +21770, 42721, 6337, 47879, 26809, 51571, 17319, 40815, 10138, 32468, 56633, +20163, 45434, 6948, 35302, 55061, 19513, 44860, 5041, 54256, 25510, 43649, + 2815, 63395, 18202, 32165, 42512, 7866, 61504, 14266, 29944, 57878, 19203, +49082, 7463, 46163, 29433, 17897, 64006, 10552, 33959, 57911, 17036, 29545, +65412, 13678, 43140, 23083, 53971, 9546, 36746, 58634, 18441, 30016, 62218, + 7693, 44188, 24648, 64160, 12255, 32487, 47705, 2141, 37866, 52304, 19960, +44042, 5446, 55380, 33574, 19406, 52752, 7883, 32542, 59030, 3739, 53454, +20926, 33338, 46066, 9020, 61127, 20469, 42412, 28250, 1683, 47753, 32275, + 7560, 58800, 37759, 17388, 29059, 56447, 732, 27294, 60314, 7293, 51441, +21821, 43080, 3224, 54879, 26673, 46733, 7061, 29172, 60964, 12052, 53857, +27562, 9663, 51400, 37102, 4825, 27635, 45939, 20227, 58905, 13837, 31321, +44201, 17222, 51764, 27367, 1033, 48935, 31724, 17029, 52475, 5174, 39149, +23141, 56981, 8418, 34426, 54954, 19634, 62885, 7267, 31060, 57429, 14940, +28836, 61413, 4152, 35613, 45621, 7878, 38409, 54048, 2886, 29824, 48537, +18424, 43105, 1405, 40196, 21485, 63968, 16176, 28040, 49714, 8302, 42716, +24100, 48905, 14837, 42121, 21915, 58816, 2938, 33957, 61080, 12143, 46251, +29296, 19448, 64023, 37746, 5777, 32950, 47639, 19180, 60584, 1545, 40730, +25475, 52445, 5609, 38674, 26914, 62828, 592, 28896, 45659, 17254, 50636, +24523, 41681, 11732, 49065, 21240, 38178, 54272, 1592, 35075, 64017, 7580, +28384, 57719, 17258, 29946, 61178, 472, 47742, 27558, 10187, 49194, 37104, +18330, 61988, 31155, 13823, 56775, 23998, 42281, 9145, 53804, 34801, 20880, +46769, 8816, 61360, 34723, 19131, 50653, 37259, 3478, 29990, 56758, 19463, +43771, 277, 58203, 13598, 48427, 26967, 43046, 10701, 63790, 24347, 39515, + 9804, 60816, 18085, 28520, 50199, 8850, 32559, 63216, 1574, 46529, 31226, +11822, 52126, 22822, 43969, 2527, 48429, 16066, 41629, 26653, 63671, 340, +30990, 6177, 50595, 26084, 64708, 2898, 34231, 41418, 18471, 54075, 4475, +39349, 25942, 58319, 12780, 30957, 64429, 4888, 45607, 29759, 9860, 61672, +25963, 43644, 13198, 64816, 22408, 54452, 9540, 28364, 55953, 4485, 44695, +35045, 12786, 64502, 20845, 43558, 5824, 48520, 27949, 20180, 57570, 13668, +38284, 59480, 2851, 34586, 63195, 7831, 39020, 25956, 49862, 16611, 35417, +53497, 10835, 39876, 23579, 50732, 14927, 37594, 47492, 4129, 29270, 64704, + 7367, 31493, 59662, 1937, 49500, 20314, 38545, 16713, 54296, 395, 48117, +34461, 13448, 42641, 24761, 47252, 10758, 50484, 19932, 29731, 43780, 4711, +63591, 11154, 50486, 31222, 3362, 57626, 34187, 19836, 62636, 1260, 44786, +25973, 60134, 4460, 42652, 15485, 63907, 24768, 48494, 581, 38974, 26752, +65513, 9416, 38630, 17383, 52264, 23457, 46180, 4336, 53718, 35549, 20184, +50345, 2331, 42510, 36199, 11356, 61024, 31812, 1159, 54200, 37157, 22131, +48186, 5143, 38286, 50530, 7910, 33683, 55866, 2645, 41196, 25450, 46608, + 5583, 52803, 12571, 35667, 49578, 16097, 29116, 54087, 4952, 43229, 18594, +61282, 29722, 8548, 34711, 60556, 17779, 46974, 10334, 41639, 26002, 64381, +12229, 38876, 26751, 49426, 13706, 60015, 566, 39025, 24396, 50429, 11158, +57454, 36345, 15380, 54455, 22452, 44123, 10072, 64114, 34324, 12454, 48794, +38450, 17324, 31545, 47119, 12917, 63911, 24686, 38845, 10028, 58064, 21780, +49422, 16710, 32091, 42673, 2876, 60050, 22505, 47555, 17791, 37996, 63055, + 7619, 33265, 48502, 1971, 54902, 28845, 8185, 61535, 38036, 20188, 57883, +10363, 33632, 62456, 19662, 44223, 1803, 50387, 27550, 15373, 47408, 35666, +22044, 52447, 945, 36657, 49009, 10628, 27436, 50708, 18534, 63831, 27258, +14744, 49726, 36940, 8821, 61867, 24340, 56210, 11063, 33918, 47190, 5848, +57580, 32510, 18310, 62827, 35254, 5049, 57028, 28593, 10756, 51199, 37878, +17277, 43769, 24369, 53896, 3865, 41409, 13207, 51938, 24241, 58626, 9551, +44544, 21471, 31389, 55457, 10451, 44534, 23709, 58288, 14244, 41609, 20914, +54835, 8552, 35585, 61078, 2341, 30677, 57918, 6060, 45398, 27995, 15878, +56920, 27236, 13819, 48738, 38411, 2771, 34363, 52204, 13309, 40518, 22697, +65478, 16231, 31444, 57785, 2344, 45400, 22803, 49701, 5933, 32202, 59309, +15490, 27692, 48239, 5411, 57880, 23847, 41411, 15430, 45515, 7131, 59956, +21674, 52025, 10788, 32643, 62866, 15666, 39184, 24849, 61759, 2734, 38590, +23076, 45968, 5510, 55310, 26354, 41728, 2193, 53738, 20301, 37798, 52710, +13342, 28200, 59517, 19719, 41812, 6224, 64427, 28982, 19097, 57083, 33441, + 5393, 53429, 18760, 45614, 61342, 23486, 46622, 14895, 38784, 27034, 59272, +10675, 46561, 24147, 61599, 14695, 36130, 49219, 2136, 42586, 22050, 52730, +14699, 37243, 47076, 18366, 51657, 5207, 39146, 26659, 48568, 2322, 43236, +36223, 20755, 61789, 16354, 29613, 50945, 9193, 33038, 56671, 16283, 38094, +63505, 255, 35987, 47444, 7404, 28021, 50023, 14859, 44169, 24453, 56478, + 946, 31293, 62149, 6183, 43108, 25303, 59655, 1544, 36152, 61719, 8567, +27964, 57164, 17641, 48546, 22257, 41140, 11152, 46273, 26843, 63400, 7925, +44107, 25665, 59302, 17656, 30173, 64584, 4142, 52941, 31428, 18250, 56007, +35996, 8558, 56697, 22206, 33454, 41871, 15800, 61861, 24061, 45850, 7622, +42268, 14628, 55734, 22940, 38762, 11178, 52656, 26918, 38554, 9522, 51852, +17569, 32169, 58012, 11496, 46599, 20553, 33393, 48034, 6431, 59659, 15402, +38789, 26846, 64527, 9997, 31240, 58312, 17191, 27668, 45550, 15095, 56332, +23216, 41134, 9371, 59212, 18629, 31014, 62648, 12341, 27546, 45551, 18026, +59874, 10842, 35001, 63270, 17296, 40624, 23297, 60846, 1708, 33677, 58829, +10164, 39624, 25307, 49060, 13134, 55705, 24802, 41340, 3097, 50335, 21112, +31788, 56590, 1055, 43650, 22883, 54399, 6593, 41582, 21720, 31948, 48303, +16087, 65113, 34275, 4251, 45108, 21589, 62100, 5303, 40251, 25513, 51579, + 2856, 42775, 23131, 57385, 5884, 36098, 60835, 2036, 28842, 44814, 6332, +52717, 23591, 41543, 405, 33692, 64907, 8830, 53160, 24548, 39265, 13040, +55983, 877, 29181, 50750, 15714, 40572, 22903, 65518, 12100, 36010, 47385, +16157, 29778, 45731, 3757, 51314, 25805, 42715, 12396, 58650, 32876, 9843, +63766, 37789, 4288, 59598, 11523, 40691, 25664, 64389, 16636, 38289, 58889, + 1972, 33694, 43387, 6095, 59638, 31877, 17275, 51167, 33993, 5437, 45568, +26363, 53605, 15094, 40897, 23245, 50806, 1843, 40500, 14109, 52845, 20978, +36954, 65395, 1066, 30300, 47778, 6780, 62703, 15662, 32109, 58253, 20282, +45912, 145, 39811, 25852, 63042, 5053, 41664, 17802, 61766, 30365, 3321, +48516, 32715, 6984, 60146, 24034, 49934, 15644, 40242, 22767, 53327, 13731, +33709, 64771, 10513, 37862, 47974, 4585, 60870, 31447, 19687, 58520, 10655, +42710, 25183, 56636, 3901, 29788, 54420, 7461, 43204, 23976, 39599, 10712, +64417, 20138, 37457, 45222, 161, 62889, 38014, 17620, 31865, 51471, 2479, +63620, 25466, 39629, 13817, 48652, 25091, 42739, 6366, 46258, 23022, 55525, + 8798, 33226, 52871, 11879, 60261, 20705, 48406, 13625, 37251, 62935, 16810, +29454, 57393, 5811, 40654, 24728, 49323, 3589, 32315, 55668, 17004, 35050, +50929, 9075, 39977, 14908, 60218, 25348, 39523, 10228, 50067, 1675, 32762, +56704, 6844, 44524, 19319, 52742, 1021, 31096, 43609, 8689, 56519, 27574, +17792, 61104, 35060, 7424, 59575, 27568, 148, 57957, 32444, 20656, 60067, +11985, 33848, 63336, 17926, 53443, 7096, 32581, 46327, 1265, 59893, 25386, +41933, 4202, 49702, 30395, 12529, 54395, 27129, 17128, 61915, 37403, 19902, +58637, 5244, 40202, 21624, 49093, 15544, 41586, 22504, 56859, 12744, 33620, +49372, 17896, 30789, 53754, 11396, 44778, 30321, 717, 62051, 33289, 19084, +56180, 4390, 39019, 21860, 52510, 12435, 35718, 49846, 6141, 45324, 22901, +40141, 14290, 60982, 2618, 39817, 25184, 46995, 13752, 59576, 159, 48522, +30417, 9457, 36805, 54732, 18270, 32481, 48245, 5231, 64456, 18951, 31787, +59235, 2552, 44537, 23930, 62296, 5686, 40685, 22323, 51410, 1831, 29285, +62530, 12512, 41953, 24917, 56110, 864, 41331, 22519, 49698, 6923, 37129, +63592, 3691, 48008, 32678, 6111, 52687, 24697, 44426, 3036, 51029, 20357, +36307, 56974, 1432, 48901, 30847, 22138, 51161, 3756, 28446, 56948, 8900, +42416, 25345, 46430, 15209, 51259, 21534, 62844, 661, 32055, 46090, 7650, +63989, 16197, 29548, 58683, 6081, 40515, 24866, 59803, 13005, 34525, 63221, +18423, 45381, 5021, 58216, 29252, 10140, 43165, 25187, 53129, 14198, 31835, +48728, 18903, 59264, 10996, 33475, 62584, 14782, 28359, 45827, 20113, 50420, +15371, 38150, 56950, 18238, 34264, 62444, 13641, 48966, 27566, 15392, 36668, +45436, 4362, 62280, 23265, 41329, 19466, 60497, 9242, 34821, 57094, 3923, +42325, 24789, 59354, 5356, 53366, 13240, 34658, 64255, 21793, 38771, 6398, +53603, 18995, 29084, 55190, 14624, 46644, 21322, 29150, 56025, 17798, 44806, + 6911, 53225, 29674, 14189, 47751, 22741, 55787, 12391, 28876, 46661, 737, +57846, 23135, 41634, 14053, 63200, 3543, 35275, 58908, 8716, 30833, 61681, +19856, 46527, 29893, 7661, 55979, 16555, 41561, 24970, 54406, 11840, 40249, +23701, 50764, 8545, 38825, 22525, 55104, 13878, 49135, 32464, 16004, 53951, +28198, 8880, 50323, 37644, 19039, 56012, 12246, 43659, 36256, 4254, 29967, +62576, 9550, 46748, 25220, 42460, 83, 55722, 28721, 18475, 35577, 44596, + 9703, 54664, 22061, 32531, 62222, 6568, 39838, 20995, 49562, 15144, 32598, +51855, 12908, 60639, 34316, 4046, 55242, 28457, 16150, 52345, 27150, 6728, +56104, 38427, 12003, 29297, 46113, 9889, 56524, 34036, 1420, 65300, 17864, +35537, 57929, 3725, 30121, 49382, 16484, 44253, 25682, 40735, 7642, 31006, +58585, 3309, 34171, 49336, 11787, 44664, 22350, 65522, 14942, 29704, 58113, +10685, 37813, 47939, 752, 27514, 61691, 21311, 46887, 3241, 52517, 34146, +20674, 14398, 64062, 22455, 41150, 12597, 60598, 24878, 39438, 13553, 65387, +21054, 33473, 50144, 5565, 45106, 31488, 10506, 50599, 38181, 19984, 48271, +13937, 35567, 55164, 6240, 45919, 28134, 3658, 50043, 24804, 42066, 15185, +57214, 23074, 39327, 12127, 54938, 28522, 17771, 60931, 34070, 8375, 38475, +51032, 3305, 28568, 52914, 10315, 43018, 26616, 64784, 8915, 33168, 54854, + 3944, 37220, 47894, 7408, 28232, 64021, 3186, 41663, 23275, 59477, 15660, +36183, 51924, 7655, 43373, 25196, 47920, 15858, 57586, 31546, 2394, 61408, +29326, 15665, 56780, 34785, 9727, 53673, 26701, 48824, 17379, 64873, 6932, +42982, 29260, 17019, 54081, 20690, 38451, 59073, 2802, 28143, 61197, 12237, +41358, 24880, 50355, 8052, 42359, 21987, 53616, 12599, 39426, 25624, 56448, + 7705, 35131, 54668, 15934, 43068, 23603, 53102, 8863, 38494, 21006, 60842, +11127, 32123, 55466, 15809, 42769, 27199, 18224, 57359, 36682, 12796, 64832, +38387, 16487, 32341, 60508, 11179, 44325, 23806, 40188, 6926, 64304, 19188, +45809, 37579, 14230, 53112, 31942, 4634, 65059, 37944, 7094, 34768, 45129, +20221, 53888, 11858, 40561, 23574, 53109, 36464, 11145, 46435, 19671, 52040, + 9387, 29080, 49852, 2564, 39725, 25311, 54720, 14518, 34985, 49705, 2102, +63478, 27878, 7688, 57987, 38012, 77, 28603, 46969, 20603, 52802, 3651, +37499, 55996, 8158, 33367, 65305, 10558, 27312, 53726, 3398, 29942, 43482, + 6807, 59321, 19629, 51143, 30447, 11429, 54860, 35563, 7230, 49817, 24786, +44231, 16670, 53499, 30014, 11463, 50396, 36890, 17787, 43888, 25372, 55678, + 2346, 41576, 15523, 46609, 26632, 60763, 575, 42310, 34121, 7584, 51910, +38448, 2504, 31704, 61179, 20486, 43058, 4766, 35599, 62739, 9564, 37198, +45053, 16435, 65037, 25585, 39236, 10010, 54599, 20115, 30534, 48384, 15905, +41666, 24876, 54454, 11975, 39516, 4327, 60358, 22768, 33747, 49948, 9281, +61459, 19758, 34235, 59374, 2208, 43049, 26208, 64836, 4525, 30304, 59884, + 7717, 37421, 45854, 2682, 64237, 34376, 21731, 59090, 982, 41063, 25798, +64970, 14697, 45350, 21278, 54596, 33149, 6654, 57249, 17953, 36420, 49526, +12680, 61753, 5749, 53374, 25072, 40107, 1246, 50803, 16886, 45623, 26525, +63860, 9116, 37986, 58812, 1008, 27749, 45979, 19133, 50255, 11615, 35893, +43791, 9489, 58558, 35512, 14521, 49163, 23436, 61079, 5729, 30976, 49954, +16291, 42145, 23986, 53790, 12183, 40443, 21861, 62577, 7010, 31902, 51503, + 925, 64676, 22387, 42595, 15385, 54520, 27446, 8385, 61274, 32483, 104, +36991, 50877, 7884, 42160, 24037, 62338, 12555, 34138, 54928, 6507, 43461, +31692, 18368, 59125, 7356, 42678, 30797, 48024, 3808, 54920, 26878, 38520, + 5291, 55657, 26856, 41239, 3281, 58003, 18812, 37312, 62656, 14369, 27117, +57272, 3877, 28923, 65030, 8851, 44477, 23090, 40064, 14722, 59082, 34684, +19010, 62272, 10567, 31425, 48498, 4745, 65124, 32232, 7495, 51173, 36773, + 2556, 46664, 22211, 64311, 13279, 33368, 44711, 15642, 60232, 35065, 1632, +50291, 20807, 44653, 14116, 62470, 27537, 17316, 58383, 38046, 20937, 52852, +10167, 32220, 50186, 4899, 40104, 21644, 58108, 13728, 32302, 64958, 6475, +39912, 24304, 45891, 10433, 51505, 26213, 39447, 919, 63062, 20877, 44071, + 5506, 38740, 26167, 51782, 12059, 34913, 62398, 4541, 46675, 27408, 10489, +37855, 51040, 16507, 47101, 30205, 804, 56297, 36605, 16618, 33437, 60410, + 4060, 48640, 32629, 14783, 64695, 27665, 9243, 37081, 59036, 3453, 40744, +26494, 56871, 5104, 43840, 25394, 51733, 2137, 29546, 61911, 8629, 44993, +30314, 349, 49599, 27140, 7740, 55400, 27881, 4456, 34492, 52280, 15786, +59504, 31625, 10383, 55530, 33673, 22, 48834, 22955, 57583, 13394, 27703, +47826, 17634, 59899, 27202, 4065, 57559, 32953, 17151, 61573, 1957, 48382, +22252, 32178, 64847, 4421, 37543, 57369, 15881, 32836, 61712, 7998, 44366, +23304, 60401, 11363, 41403, 20440, 33324, 55044, 12430, 43657, 18102, 64785, +36718, 9382, 44468, 26064, 61366, 13816, 29974, 47642, 1060, 37745, 49559, +19572, 36641, 58449, 12308, 46530, 24253, 40176, 1514, 61133, 25203, 47830, +13574, 29673, 64524, 2121, 32968, 58686, 6203, 39926, 21572, 63542, 201, +31146, 60198, 8779, 47726, 19316, 32376, 62981, 9217, 52055, 21097, 30923, +48862, 12155, 65235, 27189, 16209, 54387, 38124, 8958, 47141, 24911, 56912, +15096, 31235, 54618, 3124, 27586, 51523, 6897, 42166, 21194, 61122, 2511, +37178, 52023, 7892, 28994, 64634, 213, 49892, 21654, 31989, 47680, 15957, +55313, 2605, 44486, 26439, 39475, 5261, 51720, 16869, 29253, 56266, 10256, +34428, 51237, 19121, 43478, 27478, 10986, 57135, 29630, 19606, 51769, 11525, +36370, 46475, 17282, 55229, 7816, 34672, 51795, 1779, 40556, 16007, 49036, +26211, 63527, 3900, 30926, 43715, 20292, 34152, 46715, 9141, 64298, 30246, +14072, 59508, 35339, 3249, 43431, 24115, 54724, 16751, 35897, 42718, 8361, +59542, 32418, 21919, 62405, 1852, 47620, 19638, 29419, 64882, 3212, 43352, +20244, 36957, 58817, 11221, 28274, 61669, 4749, 34623, 51672, 8419, 46657, +27855, 17708, 58940, 38212, 14568, 34362, 56542, 5210, 47977, 19564, 35550, +52547, 13205, 43625, 25215, 56839, 17746, 31266, 54485, 4397, 43764, 22444, +50083, 16250, 28432, 64934, 9892, 41868, 25751, 54126, 16656, 8157, 43800, +23070, 39561, 10059, 63234, 20616, 48841, 11581, 32891, 52011, 15273, 45606, +27799, 1331, 54876, 38467, 12322, 36356, 53032, 16432, 31417, 49345, 1869, +56502, 30886, 8506, 51965, 37721, 730, 55153, 22109, 40347, 13546, 45253, +24027, 58544, 14785, 43258, 25948, 56412, 11195, 41048, 24642, 57937, 6564, +48681, 19116, 29860, 55899, 11108, 39101, 26029, 52333, 8120, 31629, 49092, + 360, 44014, 13585, 34391, 61196, 16268, 42201, 25139, 62850, 8311, 29849, +50589, 1412, 41762, 23434, 53875, 14241, 62321, 21334, 42160, 7103, 58471, +23757, 47922, 12955, 33236, 58927, 19182, 44895, 2051, 57064, 23129, 40131, +14815, 55108, 35627, 19332, 65312, 5539, 32987, 57959, 11493, 44737, 21308, +63707, 10243, 28943, 44032, 13791, 55788, 23699, 41622, 63, 50753, 18758, +29929, 48326, 13364, 63242, 20295, 49504, 12163, 32926, 65213, 14121, 46660, +35945, 19242, 50807, 11909, 59394, 35730, 15255, 61264, 38473, 18158, 36031, +62928, 9833, 47426, 27318, 2335, 50104, 38376, 14644, 27884, 62428, 19726, +43875, 9915, 37443, 61870, 2440, 31648, 51848, 13904, 37007, 43200, 6573, +50926, 25801, 39746, 8398, 59148, 15068, 42027, 25655, 50744, 9927, 45842, +27971, 17636, 56225, 37287, 1247, 30652, 51861, 18390, 45800, 5670, 50726, +22780, 35303, 55738, 6441, 27948, 49812, 19805, 54585, 7112, 40594, 23592, +51781, 15982, 60155, 29113, 5498, 55672, 17691, 35035, 64257, 9384, 31476, +54389, 18581, 43434, 4926, 37145, 56271, 20680, 41869, 15042, 46738, 26117, +52454, 8426, 41518, 23171, 49083, 14546, 39790, 26130, 58073, 6008, 43669, +24754, 39296, 3315, 55480, 17063, 36384, 45555, 4491, 58548, 30103, 13756, +35753, 61966, 74, 41137, 22404, 49132, 12089, 38332, 59177, 18659, 31724, +53333, 11538, 44106, 26823, 58490, 13687, 34224, 56077, 18641, 44031, 10293, +36662, 62475, 5953, 41593, 19494, 31820, 64299, 11115, 48837, 21599, 33135, +63560, 7586, 48415, 24019, 40049, 12857, 54456, 1315, 63179, 35220, 14800, +49603, 38216, 6759, 60405, 27563, 3798, 49136, 30212, 20398, 58189, 11789, +31338, 62164, 20265, 44609, 7996, 40072, 22912, 51736, 15404, 60284, 2522, +27987, 52433, 18848, 38424, 49768, 7999, 29335, 53326, 19618, 47062, 6076, +29688, 61734, 13764, 48818, 27087, 5031, 52650, 38361, 16665, 31984, 55436, +10261, 40377, 25951, 53630, 13993, 47050, 577, 32490, 54429, 18499, 45246, +29377, 14971, 60526, 37212, 1969, 49748, 29660, 8998, 55065, 23825, 45528, +11393, 31737, 63413, 1816, 41494, 23364, 60078, 5994, 39269, 11431, 64159, +21203, 39834, 10242, 60474, 32268, 2775, 56280, 36414, 19673, 51486, 1204, +33253, 62424, 26199, 49080, 13809, 59409, 24619, 45174, 249, 38940, 26417, +59812, 6129, 30741, 63810, 11021, 48202, 29935, 20682, 61529, 4695, 45474, +22499, 60455, 11594, 42396, 19335, 64171, 28575, 15871, 47799, 25907, 43000, + 7758, 63219, 26694, 49039, 1754, 38966, 21474, 62699, 6233, 32947, 54023, + 574, 47165, 30563, 17432, 37343, 62924, 3717, 45513, 24051, 61369, 4782, +34004, 57667, 15923, 36845, 65295, 21835, 51637, 6343, 28693, 54196, 2167, +47818, 17474, 37892, 55883, 13080, 27747, 60494, 8832, 44933, 33660, 3274, +38125, 52839, 17803, 31395, 44701, 3840, 55152, 28950, 7941, 37037, 63795, +14051, 32175, 50884, 8734, 60752, 30305, 1439, 45191, 24490, 52095, 13592, +39997, 24204, 53170, 6869, 32565, 48018, 2333, 61662, 26238, 38724, 9717, +58664, 20263, 33602, 61422, 6310, 43633, 23717, 38953, 1415, 45603, 23573, +54311, 5924, 39378, 22877, 57952, 3978, 32520, 43607, 21629, 53671, 2858, +28312, 46643, 6222, 54821, 21934, 42574, 13107, 35553, 57386, 17976, 30135, +54731, 4125, 46795, 35179, 7351, 53619, 28433, 16632, 38445, 56195, 8611, +28147, 49717, 18565, 63047, 10966, 31441, 54870, 18145, 45267, 35364, 212, +55541, 19021, 36670, 63745, 3495, 42587, 13320, 47884, 22682, 62408, 9679, +35538, 58504, 15232, 30289, 63054, 3265, 45564, 17148, 32574, 60666, 1448, +42186, 31526, 18190, 63143, 4158, 42870, 33905, 11147, 45276, 25556, 51349, + 2347, 42230, 22121, 49877, 5999, 34075, 62820, 14498, 46980, 27671, 8748, +59644, 36103, 3550, 61922, 19202, 31794, 57344, 10578, 33890, 62358, 4092, +51738, 19896, 30816, 49650, 11838, 59230, 19628, 32725, 62059, 9647, 28683, +51006, 19501, 43413, 6515, 52155, 27929, 16752, 58036, 34430, 5766, 63568, +28841, 15486, 46188, 1259, 62285, 25107, 38901, 4987, 46573, 21543, 51057, + 3902, 39835, 23383, 59398, 28850, 13412, 49056, 25409, 57499, 6647, 40708, +24261, 58389, 620, 46056, 18748, 30017, 43836, 3388, 60983, 18274, 31055, +48414, 22019, 42539, 5134, 61551, 27061, 18099, 38460, 56248, 12449, 33555, +63761, 5812, 39696, 25417, 47544, 3166, 37172, 55219, 13165, 32641, 58870, +10374, 45879, 24726, 41919, 11552, 56367, 36513, 4438, 27175, 57876, 15297, +36745, 63008, 11099, 32227, 55690, 2865, 44599, 20083, 37950, 58022, 14640, +27699, 63369, 6361, 42630, 24437, 60131, 4415, 32774, 57708, 18988, 38192, +49296, 7778, 27371, 64453, 3337, 42660, 22683, 56063, 13244, 33728, 63872, +19266, 46984, 3057, 39096, 25291, 57541, 17377, 51043, 9498, 29208, 45938, +16685, 53571, 26019, 49133, 1962, 30248, 45755, 15474, 52692, 22990, 41174, + 8724, 46384, 26349, 57972, 12629, 40574, 2998, 35413, 53453, 6509, 30206, +50305, 18498, 57198, 9391, 43597, 23327, 54187, 15844, 34167, 42941, 8111, +52407, 14885, 39710, 26218, 54572, 7281, 38839, 25889, 50546, 3169, 35393, +53594, 6750, 60672, 21319, 38519, 11464, 56874, 18937, 33333, 55414, 10206, +44412, 23663, 51788, 14221, 39914, 20992, 59693, 5525, 28043, 52619, 12092, +40686, 21230, 51402, 13208, 43515, 20465, 54460, 3046, 28013, 46167, 9842, +35868, 60143, 14281, 43019, 33744, 21260, 64353, 3960, 45840, 36411, 15559, +53334, 29383, 12063, 57751, 27238, 9570, 65437, 36448, 11672, 61135, 21942, +42541, 16083, 52220, 23899, 48644, 5839, 41184, 22368, 47452, 17350, 37479, +59358, 7199, 42395, 23182, 63110, 3139, 38816, 26863, 58894, 17181, 40189, +20883, 52622, 5139, 47467, 16233, 54283, 28092, 11381, 35588, 57190, 15526, +47579, 26787, 62609, 8475, 38552, 26999, 60531, 17695, 47487, 10649, 27969, +64156, 7287, 41722, 18722, 34019, 57701, 14495, 31101, 48587, 1000, 65293, +24244, 39911, 5923, 60973, 24116, 39882, 15363, 64668, 21361, 32280, 58529, + 5181, 47343, 19531, 33830, 60271, 960, 44594, 36027, 20449, 47732, 3182, +58254, 29727, 14390, 62678, 22945, 47610, 6762, 30331, 54104, 19819, 34216, +52789, 5256, 40920, 25201, 53956, 2388, 44691, 21989, 41138, 10338, 56694, +24769, 48412, 12707, 35432, 58074, 8528, 45326, 25242, 55270, 14479, 48285, +22482, 61695, 8415, 33122, 57548, 11736, 29364, 60347, 16124, 42735, 22795, +55439, 605, 31746, 51700, 17494, 45844, 29140, 11894, 50181, 37356, 1736, +54314, 28388, 13432, 45057, 35992, 15217, 64781, 1080, 40892, 26193, 52764, + 5765, 43585, 22670, 40342, 1569, 59793, 33261, 17757, 64557, 37475, 9209, +46705, 19216, 50824, 32331, 9269, 56505, 35497, 21733, 49918, 10273, 43129, +23513, 59934, 12870, 30780, 63736, 17229, 47115, 6875, 34315, 55596, 1626, +43822, 18334, 30084, 53846, 12590, 35488, 52520, 9864, 38055, 59002, 14921, +52019, 24805, 41277, 6478, 57655, 15794, 32662, 45599, 10417, 52575, 32246, + 386, 44654, 24459, 53863, 15353, 42136, 22824, 60929, 10021, 52978, 28771, +16579, 65284, 27317, 707, 50651, 36609, 7218, 60802, 28768, 17873, 38489, +64863, 9821, 32007, 48193, 324, 39861, 22076, 51088, 15677, 34872, 65171, + 8130, 28776, 49356, 776, 36418, 46386, 20325, 51896, 12692, 39720, 22538, +50800, 8395, 28797, 62702, 12906, 36480, 55177, 16400, 33272, 50513, 9250, +40884, 25054, 52648, 6133, 39673, 26667, 59334, 15164, 49266, 6646, 44108, +34571, 21035, 62420, 38259, 3821, 33269, 59719, 13612, 41587, 23648, 63122, + 6925, 35218, 58560, 13444, 30422, 62859, 5438, 39293, 20821, 55425, 60812, +22041, 41170, 17670, 64339, 11896, 34361, 41918, 20849, 62158, 2296, 39916, +24919, 48891, 3615, 57620, 21806, 33194, 62923, 515, 42895, 23977, 59284, +15139, 32277, 61914, 12260, 40804, 23972, 44440, 2415, 52512, 27003, 39681, + 5065, 49911, 16998, 30835, 61431, 3193, 38625, 26896, 65419, 9719, 32474, +54542, 15278, 42059, 24766, 63792, 896, 38621, 26921, 60423, 6790, 30683, +50457, 15137, 37838, 57311, 18810, 27096, 48648, 5307, 55284, 28169, 10375, +52179, 31440, 18299, 48629, 45, 63331, 38442, 16800, 35080, 46081, 1790, +50368, 24311, 39959, 6302, 54524, 30763, 604, 60349, 37664, 15326, 29516, +64291, 3554, 52728, 27255, 10752, 32102, 53513, 12494, 41245, 21548, 55589, +15178, 45153, 7621, 34116, 65021, 13473, 42646, 23456, 35959, 44639, 1977, +63950, 22782, 41831, 4514, 55243, 13037, 40200, 22046, 57478, 11737, 39952, + 708, 53166, 20343, 34308, 54493, 13619, 49853, 23519, 63168, 8336, 37409, +52523, 17367, 28924, 44755, 9271, 53390, 21737, 48562, 12001, 34414, 51669, + 1316, 45733, 12895, 41562, 24610, 63801, 10094, 40638, 22315, 54559, 14747, +29102, 65263, 9789, 41686, 24598, 51518, 5331, 31242, 42985, 12285, 59955, +24607, 39973, 8322, 59274, 16785, 29037, 65389, 11082, 33645, 48477, 8146, +61536, 31322, 17835, 37033, 43220, 4910, 64573, 28277, 16385, 52089, 20438, +39024, 6119, 63768, 35698, 263, 40621, 24884, 52670, 14461, 37972, 48228, + 3635, 33063, 53163, 10296, 41084, 25586, 65176, 12526, 34521, 58373, 5193, +43851, 24787, 63981, 15431, 42231, 23639, 49385, 7617, 57707, 21158, 32024, +45563, 10429, 56457, 18024, 33601, 64044, 11270, 46111, 24616, 53892, 10158, +48696, 31076, 3768, 55894, 26350, 43228, 2050, 55002, 24664, 41573, 5372, +65301, 17917, 36834, 56993, 7711, 32466, 44914, 979, 54021, 25677, 41370, +15450, 51312, 22583, 65015, 13984, 36202, 60171, 4450, 45039, 27166, 16389, +62639, 28516, 5697, 46870, 34355, 11977, 62151, 37623, 21044, 46964, 2518, +65535, 28450, 13354, 59330, 36749, 20023, 50289, 7311, 35147, 57140, 1399, +45171, 21060, 35356, 49718, 5002, 44038, 34438, 21651, 57378, 14483, 44717, +31896, 1919, 54785, 35601, 13610, 27822, 51619, 17109, 58655, 23830, 42232, + 6319, 54299, 21010, 40742, 12876, 56282, 32408, 18631, 61386, 8788, 30582, +57354, 2431, 34285, 64182, 17883, 46519, 35173, 1562, 52681, 22341, 43337, + 5119, 57520, 20218, 30601, 63098, 365, 43948, 22133, 61492, 12086, 33148, +42265, 18692, 65145, 30270, 819, 52785, 12527, 27941, 55542, 18654, 47802, + 5205, 36290, 54336, 18137, 46842, 27487, 457, 50262, 36759, 17776, 52074, +24297, 44402, 9615, 48555, 31689, 1738, 52263, 25753, 46282, 4721, 56429, +28667, 8775, 50973, 36143, 12810, 64679, 26427, 41842, 9711, 50084, 19186, +29825, 53784, 11251, 44431, 5071, 55495, 20268, 30177, 47421, 9058, 57530, +34988, 19397, 64757, 13144, 42432, 23949, 59306, 8857, 40214, 24732, 57433, + 6856, 41461, 21832, 49944, 2352, 34202, 57019, 7788, 44075, 23619, 58172, +11628, 32817, 48128, 18436, 63429, 7923, 44663, 29003, 1124, 62713, 38363, +12029, 32062, 59792, 19519, 41121, 6670, 61005, 37601, 20092, 28011, 47262, + 5305, 56650, 19808, 28645, 59592, 13895, 48126, 28320, 18400, 58155, 35431, +10002, 46581, 21797, 56253, 11344, 34825, 43510, 16286, 61953, 36427, 331, +58306, 26538, 48781, 4765, 31309, 60058, 23496, 49202, 1040, 30373, 55393, + 8902, 61009, 19058, 31632, 50165, 8089, 58907, 30249, 18035, 35467, 52499, + 2706, 43760, 25240, 50097, 17027, 30942, 62226, 5480, 44046, 25796, 38679, + 1581, 44770, 26693, 56463, 4191, 32976, 61811, 13911, 37612, 58925, 3294, +30925, 44187, 9097, 57733, 28864, 19990, 55370, 35985, 2971, 46579, 26517, +56648, 6312, 32543, 51136, 3897, 40012, 22219, 53428, 13055, 36413, 61412, +17160, 48974, 34282, 2631, 55282, 18267, 46569, 32599, 840, 49977, 37914, +20272, 57105, 15512, 40393, 23889, 52243, 474, 59131, 22421, 47560, 10732, +33977, 54934, 2632, 41246, 26362, 50926, 11819, 30904, 54372, 18889, 42516, + 5806, 64458, 28151, 18762, 58097, 27054, 7355, 61288, 35855, 19130, 49166, + 6906, 40710, 16711, 53789, 20537, 38767, 8191, 56548, 32270, 2922, 61345, +36613, 18595, 47823, 4993, 60043, 26855, 38862, 2668, 50733, 20274, 30672, +57656, 8073, 38838, 26203, 44251, 14187, 60452, 23020, 38790, 11536, 62621, +20414, 38624, 12989, 52327, 26240, 47026, 2987, 28838, 50633, 14631, 62079, +24070, 39263, 8824, 58600, 30400, 3368, 45888, 38037, 7164, 27806, 47310, +19633, 55792, 32789, 2109, 50285, 37098, 19100, 55021, 27510, 911, 49632, +28580, 9106, 56430, 33872, 16954, 38153, 53193, 4723, 27512, 47066, 13935, +64530, 28488, 16303, 52139, 31126, 11129, 58338, 18520, 28181, 62798, 12506, +40873, 6047, 50050, 17096, 63393, 25735, 47671, 8122, 37934, 61280, 4163, +32859, 45658, 7687, 62500, 25557, 39223, 2184, 60375, 26368, 42277, 5317, +51212, 24181, 41021, 15876, 44809, 23410, 53203, 7297, 39314, 15134, 60426, +25716, 41353, 9674, 59496, 24720, 38914, 11105, 53481, 17996, 36074, 56975, + 8729, 31243, 51561, 2528, 55811, 27888, 10027, 48695, 38393, 19875, 58862, +36621, 7380, 43121, 23025, 64795, 29292, 9060, 42371, 14460, 61112, 37784, +10825, 57044, 28179, 3892, 65258, 34769, 15577, 7956, 59014, 37189, 19424, +61787, 10438, 33140, 40823, 17376, 60415, 31657, 21262, 55584, 5793, 46372, +16851, 36138, 58824, 6931, 40568, 15884, 65240, 34213, 18524, 37897, 49131, + 1194, 63081, 27520, 14462, 51454, 30764, 8194, 36142, 54481, 76, 44779, +26786, 52948, 12207, 48753, 18614, 31500, 46140, 13622, 62416, 27125, 16901, +50913, 36033, 9983, 46885, 21594, 55025, 1985, 41437, 23576, 34223, 56615, +12502, 49373, 30461, 17137, 54553, 36482, 2774, 46920, 25945, 53745, 13464, +30722, 50799, 8653, 58820, 33394, 12748, 51632, 37839, 7851, 31893, 62950, + 4110, 45325, 12400, 40964, 26069, 62536, 2529, 31611, 48061, 18986, 54703, + 5406, 28961, 50337, 19576, 46193, 9226, 33461, 62899, 19460, 41225, 10044, +53856, 22111, 46029, 14587, 33433, 51732, 3932, 45631, 27336, 15065, 47158, +37626, 9317, 60139, 28898, 19585, 64766, 33755, 6668, 56693, 12844, 41952, +23658, 55303, 11056, 48577, 21146, 58522, 9960, 40060, 22679, 51370, 6578, +47261, 19774, 27961, 50600, 15742, 63567, 23294, 41022, 4794, 61618, 15692, +30605, 52593, 12042, 39963, 20804, 62298, 15564, 43127, 24955, 60806, 7750, +33100, 56503, 1493, 27731, 41177, 10284, 64410, 20339, 29531, 52302, 10841, +40554, 22014, 60911, 7158, 31634, 45608, 4003, 63835, 29519, 13723, 44185, +36051, 6794, 30696, 61157, 15473, 42291, 23596, 59817, 13515, 44493, 21962, +57126, 9126, 33553, 59579, 16719, 47481, 35618, 1369, 50756, 38469, 16511, +29826, 46752, 2825, 55993, 22269, 33448, 62220, 1187, 43015, 23773, 47930, +16042, 52231, 23088, 40767, 11407, 55917, 22459, 39755, 12489, 52186, 23914, +62837, 14681, 47384, 5198, 42339, 23531, 61228, 710, 51609, 21153, 41113, + 5948, 53153, 25235, 48030, 4203, 44510, 23075, 59731, 10738, 34908, 61317, +17121, 42072, 33811, 5718, 52987, 18142, 47783, 34767, 12344, 60921, 21742, +52154, 16803, 33691, 61557, 8284, 40404, 14581, 64574, 24776, 41653, 7011, +59582, 13948, 37030, 63360, 16041, 42098, 23781, 47728, 7391, 60724, 21796, +45368, 33339, 9659, 54281, 37447, 3468, 43792, 24189, 61987, 6469, 36865, +53969, 2385, 31556, 47270, 19027, 59025, 24237, 38753, 3462, 42859, 21182, +58256, 14963, 44021, 24923, 55828, 12065, 30085, 48525, 14457, 55299, 33217, + 9771, 47454, 21621, 58270, 11291, 34479, 63741, 3707, 49737, 32394, 13609, +56826, 24593, 43586, 5448, 51557, 19440, 33008, 48411, 2809, 62123, 26397, +41837, 6556, 27908, 49111, 16266, 41848, 22927, 47710, 7847, 35727, 61018, +14817, 27167, 50339, 3203, 30005, 61613, 16185, 46274, 1387, 32655, 57971, +21297, 52098, 4697, 31614, 48821, 16532, 45469, 37266, 14028, 55781, 27261, +17288, 28777, 50698, 3387, 43931, 23662, 54665, 13611, 45791, 775, 50091, +11441, 41235, 22791, 30025, 60776, 1939, 47890, 22440, 28958, 52115, 3391, +46219, 27834, 9300, 58550, 32765, 16971, 37361, 44991, 3605, 60372, 24550, +41115, 16478, 62071, 20599, 38556, 5626, 63961, 22730, 43472, 1304, 55619, +37531, 8612, 31195, 59287, 3874, 41145, 25615, 64887, 5988, 38880, 27008, +60863, 14793, 47590, 4309, 39563, 22870, 59078, 6003, 43371, 21875, 65091, +11532, 39338, 23024, 62215, 1601, 35634, 44769, 16335, 27120, 64197, 2663, +44087, 22596, 52750, 16295, 33781, 55507, 20847, 47326, 6791, 51797, 23524, +40230, 8911, 59808, 22725, 37661, 64621, 8021, 40240, 24438, 54342, 14448, +44203, 2146, 56881, 26306, 38749, 6219, 63504, 26839, 39609, 12017, 58301, +20695, 34675, 64368, 420, 53263, 24518, 40753, 4948, 50792, 14514, 46534, +38296, 18343, 30198, 59530, 3187, 39352, 26496, 62749, 5003, 34944, 45688, +14739, 64247, 28257, 11476, 35353, 60340, 518, 43353, 32747, 7235, 54415, +29654, 17788, 47851, 36945, 8785, 59153, 25355, 48933, 372, 35728, 53798, + 9146, 30111, 49258, 19641, 45445, 15275, 34683, 58898, 21017, 44190, 5892, +50360, 36506, 3617, 62571, 26412, 43654, 14156, 55799, 27333, 17112, 51698, +36453, 8592, 49222, 21508, 56847, 16826, 49732, 27778, 3847, 55970, 37685, + 7807, 29467, 62119, 1800, 39621, 25382, 50072, 4017, 29669, 43611, 13981, +62918, 27375, 8982, 54831, 37422, 13525, 63666, 26657, 44507, 7588, 49906, +28485, 13914, 60859, 36884, 4318, 31190, 65078, 7280, 46370, 31157, 396, +61818, 25293, 44763, 6626, 34873, 41428, 21773, 56087, 12815, 36090, 49010, +17015, 33864, 63223, 9837, 30514, 57588, 15722, 41955, 26794, 55490, 7494, +32567, 49744, 438, 28260, 45497, 11400, 57810, 21221, 29627, 64010, 2253, +43095, 25287, 49525, 10634, 29651, 54880, 339, 43106, 20871, 57617, 30899, + 4887, 53419, 19857, 44652, 31396, 22684, 51530, 8432, 32198, 57381, 3945, +29629, 50879, 19146, 40714, 1725, 62957, 18509, 29925, 59692, 12847, 49933, +18160, 33229, 47775, 14421, 42495, 22956, 61296, 8343, 35745, 52293, 12010, +46368, 26718, 55106, 11118, 34444, 51905, 1129, 39812, 18928, 63811, 37112, + 3076, 28451, 45034, 17361, 64617, 37238, 1317, 29952, 52629, 17519, 46129, +28716, 9834, 59729, 37522, 48, 30643, 65377, 16607, 36782, 56159, 12021, +29063, 44521, 20751, 49890, 13998, 64963, 36947, 4181, 58993, 29890, 12779, +63962, 37994, 20401, 45899, 4817, 56171, 37670, 18046, 52267, 10632, 34457, +56413, 19729, 48339, 8014, 34979, 43920, 17375, 63873, 27156, 7468, 59766, +30031, 1116, 47535, 38226, 6043, 35748, 57619, 16135, 32173, 64875, 5613, +39118, 26629, 58512, 17983, 34618, 63307, 4489, 52999, 19455, 34992, 43733, + 9939, 57771, 20473, 36598, 61014, 13405, 41107, 22336, 54174, 5890, 47009, +20973, 50131, 12601, 32728, 53201, 4614, 29393, 47285, 10350, 56535, 26303, +41890, 11754, 60489, 19825, 27999, 52277, 15441, 42446, 22806, 53331, 13410, +35054, 55659, 19871, 44384, 7342, 52202, 21246, 32104, 63964, 9596, 40787, +24744, 51774, 15039, 31664, 56295, 4836, 45273, 17928, 52021, 24175, 55674, + 6010, 38074, 48839, 18018, 34051, 57149, 9653, 43193, 27369, 1069, 64728, +38095, 17450, 30081, 56911, 13197, 44822, 33436, 1536, 51785, 17909, 30441, +47436, 3342, 61050, 29691, 18481, 36405, 48306, 11101, 59666, 21412, 42305, + 2868, 55090, 25267, 41683, 6808, 50817, 16953, 29659, 44037, 10049, 61320, +22320, 31905, 57725, 1702, 27616, 61961, 8370, 44561, 21920, 52479, 12470, +47435, 29352, 17662, 55552, 31245, 2249, 37391, 54111, 21023, 41595, 13430, +56223, 24900, 47214, 10897, 34274, 60062, 1932, 51428, 23674, 43004, 6968, +33935, 64483, 14407, 41346, 22689, 55981, 2480, 37301, 63878, 7208, 48448, +28567, 12540, 56071, 32244, 15142, 54277, 24272, 45832, 8656, 37481, 50840, + 1648, 34480, 60352, 11617, 42086, 23704, 62322, 2176, 32230, 45380, 12460, +64825, 35983, 19349, 51152, 11245, 33731, 52480, 20660, 45125, 10104, 65458, +26941, 53902, 7721, 32964, 46099, 17956, 58926, 34196, 4417, 51076, 20861, +39054, 11366, 59688, 18107, 32813, 55020, 9590, 44751, 25685, 50967, 12561, +28807, 54980, 18294, 35309, 49161, 9340, 29109, 59447, 17739, 49627, 1848, +32153, 65418, 7742, 27719, 57048, 3583, 42593, 21866, 48527, 35579, 1424, +64846, 13267, 39900, 22074, 58776, 14274, 35758, 64280, 18919, 47865, 4373, +35458, 52062, 9894, 40124, 20219, 56962, 5352, 36181, 62349, 15921, 39496, +25154, 46276, 9262, 49807, 17283, 35661, 60773, 11635, 48519, 3144, 35692, +54333, 19940, 44044, 14665, 63868, 32125, 9312, 56670, 35857, 22595, 48394, + 7095, 41120, 26375, 57300, 846, 29535, 63978, 9848, 35015, 51061, 16165, +45336, 28833, 221, 64190, 22346, 39278, 5572, 62075, 29982, 16340, 59686, +23650, 45166, 10098, 49380, 22612, 59581, 7076, 30692, 51626, 13724, 44399, +22608, 61001, 6829, 40517, 24487, 47538, 14238, 54515, 22966, 44339, 8954, +49605, 27580, 3883, 61224, 37456, 10364, 58500, 1049, 33303, 43710, 19789, +52331, 10198, 34933, 54469, 1489, 28624, 57142, 17378, 43209, 9051, 29309, +63622, 22502, 45146, 5912, 40182, 24460, 62270, 15242, 28291, 57280, 2212, +36026, 49898, 19150, 42297, 11546, 54108, 26128, 63447, 49979, 22232, 41228, + 9329, 52595, 23975, 47809, 15146, 42732, 7098, 51299, 23284, 45366, 13360, +28674, 48642, 6022, 64089, 17831, 32804, 51172, 7871, 30993, 48077, 2620, +63731, 25425, 40085, 15443, 57086, 34976, 7340, 64388, 21945, 37344, 59152, +15533, 34063, 51443, 3472, 38889, 24581, 50219, 7114, 33810, 64579, 2625, +47308, 32276, 6717, 62032, 28545, 189, 50062, 15628, 40387, 26388, 57202, + 2484, 42802, 18587, 53964, 28661, 645, 61516, 35676, 10692, 50338, 26672, +39907, 8216, 42552, 14654, 59258, 31427, 10794, 61802, 27685, 4448, 36594, +60803, 13702, 49442, 28851, 11045, 53593, 36353, 3667, 63301, 19895, 48533, +28411, 14503, 58734, 36986, 11465, 52382, 25538, 40726, 5831, 65236, 16592, +30257, 46367, 8124, 53247, 26988, 38508, 10176, 62467, 19961, 36774, 59373, + 5633, 33965, 55650, 18859, 45972, 11526, 38025, 54662, 15332, 47628, 36714, +16731, 32076, 65470, 177, 33542, 58825, 7132, 42871, 24156, 60834, 15941, +47869, 5575, 62301, 23703, 38785, 3829, 65014, 22126, 45274, 14727, 38805, +20852, 63111, 11212, 54226, 29844, 17766, 45674, 5644, 60472, 32456, 11446, +52815, 27194, 18180, 35546, 61878, 556, 42854, 25099, 60252, 6942, 39724, +20979, 65048, 12894, 29212, 58167, 17927, 47862, 27825, 5173, 53065, 36996, +18935, 57923, 7555, 41856, 29375, 1004, 47934, 24290, 62955, 16107, 40683, + 5666, 58661, 22987, 38506, 12816, 48598, 20377, 60858, 2483, 42353, 28912, +12737, 47272, 25759, 57804, 57, 43583, 24009, 52452, 4974, 39722, 21615, +57610, 1637, 33639, 60174, 20412, 41540, 3863, 63169, 16377, 37043, 53587, + 4750, 31033, 55140, 20045, 44333, 15290, 37239, 52441, 10547, 47142, 29717, +17946, 59219, 11759, 50241, 20814, 30497, 52779, 3446, 42858, 26022, 53855, + 8690, 41560, 26008, 56242, 14092, 44224, 25993, 58970, 13036, 38760, 22089, +51607, 8600, 32241, 48712, 3839, 63649, 22149, 32549, 56175, 1339, 28916, +42279, 16271, 65093, 27193, 6817, 58081, 37706, 0, 42685, 24611, 52372, +15622, 44172, 4907, 58932, 34694, 19838, 51845, 11812, 45973, 19062, 38243, +54939, 4075, 27190, 59945, 7607, 33823, 55708, 18057, 41995, 10268, 47399, +25069, 50570, 8945, 35182, 42222, 4677, 57106, 32524, 11833, 36339, 54102, +20566, 40042, 4342, 56458, 33128, 10618, 50593, 36907, 2643, 61972, 21517, +39778, 4957, 58709, 32317, 18739, 53598, 38221, 14339, 30280, 47860, 18278, +55062, 28651, 7188, 60176, 25127, 46825, 15578, 42657, 23462, 50931, 11507, +33752, 60325, 20987, 47437, 203, 32003, 58385, 14209, 49033, 33151, 3716, +51749, 37132, 12080, 54754, 21735, 30961, 61542, 4279, 39714, 20920, 44669, +13261, 61168, 11, 46426, 31005, 19595, 56958, 2737, 36406, 62459, 18713, +31863, 59439, 1633, 37143, 57121, 15358, 40326, 24984, 55071, 300, 42138, +24445, 56453, 14566, 43632, 29425, 8542, 59485, 31287, 868, 50822, 25791, +42418, 13669, 55109, 1934, 45605, 20349, 30878, 63391, 13078, 44346, 17807, +58098, 37963, 10833, 28749, 54157, 18557, 44929, 12239, 37802, 58632, 17907, +33147, 63066, 10479, 46947, 20165, 34665, 60605, 8393, 49797, 37444, 14300, +47744, 21157, 58442, 3012, 31518, 63682, 19287, 46911, 28616, 463, 52361, +38329, 20126, 53923, 15805, 44642, 23130, 40678, 7564, 60144, 32791, 15306, +51187, 22427, 42286, 9772, 61729, 35216, 5077, 55805, 21975, 42471, 9372, +54814, 22568, 34942, 43781, 649, 58166, 23812, 40170, 12776, 56019, 23077, +49067, 1504, 28426, 44939, 14102, 49713, 27273, 3010, 62869, 35640, 7507, +29616, 51565, 4193, 27078, 55950, 9740, 43403, 23539, 51042, 13398, 38716, +20638, 52147, 8935, 40501, 19499, 30826, 44482, 12181, 55086, 26242, 40017, + 8348, 50893, 26093, 57067, 6241, 40821, 25969, 46814, 3599, 37646, 58185, +19068, 27554, 50124, 16076, 38029, 46863, 4757, 53910, 23731, 39204, 10594, +51606, 18247, 35207, 49863, 2713, 41183, 25435, 54800, 6301, 30966, 43182, +15111, 64205, 30086, 9137, 46489, 25042, 54820, 14063, 34890, 60187, 18624, +43494, 4259, 36510, 55696, 18076, 31789, 47321, 646, 57471, 23768, 39029, +11242, 51553, 21345, 62478, 35311, 6526, 52964, 17212, 31685, 64710, 13218, +42173, 25965, 62613, 10235, 35744, 50113, 17236, 44003, 7944, 31967, 56663, +21729, 46175, 9951, 40858, 25692, 63690, 12148, 34464, 47648, 5441, 60782, +27160, 16458, 37932, 61843, 6695, 40135, 24320, 44926, 7759, 56835, 18141, +32927, 62199, 6101, 39033, 23770, 60463, 1805, 39009, 22069, 62986, 6563, +31523, 48090, 1115, 65443, 24486, 41826, 15040, 59588, 26553, 38908, 11091, +50779, 18249, 36761, 59119, 10408, 46106, 21463, 33356, 51164, 12259, 28560, +49532, 17197, 61660, 7898, 38694, 26429, 53583, 12487, 29593, 65225, 3049, +40525, 24404, 60833, 9233, 28869, 49408, 14912, 37638, 51991, 20346, 44474, + 4833, 60338, 32453, 19679, 57568, 2035, 30820, 65410, 13419, 46409, 20179, +27683, 62824, 486, 43028, 16258, 60263, 24426, 42261, 14718, 63134, 27577, +18704, 55144, 35190, 10175, 50154, 26247, 42245, 12753, 63420, 1891, 46284, +24902, 62372, 6168, 34681, 45134, 14759, 50796, 22672, 39511, 3372, 63011, +32033, 6883, 58112, 37285, 4033, 49348, 30614, 15049, 53975, 36979, 11506, +27630, 60818, 18913, 43266, 10118, 64566, 25643, 41496, 6756, 51166, 15150, +43446, 25305, 58819, 8202, 31666, 15114, 40076, 25497, 63940, 7445, 37803, +49176, 14171, 28491, 53869, 8371, 40984, 24831, 49670, 10411, 31335, 61558, + 8682, 47187, 35973, 19893, 62785, 5390, 35148, 52745, 20411, 49445, 11469, +35776, 44776, 18350, 61348, 9236, 39346, 26437, 48925, 14612, 60120, 6349, +40303, 26735, 55809, 689, 31029, 48436, 20209, 61593, 5055, 33364, 57506, +22439, 48114, 8265, 30130, 52604, 3648, 39207, 25782, 56038, 5412, 45005, +27536, 17317, 32285, 64501, 6582, 44382, 29859, 16030, 52637, 36316, 5145, +56797, 23127, 44269, 12990, 33031, 65007, 8016, 29960, 50069, 1994, 57861, +24993, 39339, 4933, 55939, 26501, 39116, 204, 46782, 24090, 50754, 16220, +31276, 46035, 1856, 59112, 32738, 11805, 61483, 20746, 50246, 14999, 32450, +63858, 4659, 45307, 31742, 17808, 57302, 35547, 9764, 65104, 20362, 37636, +52720, 15727, 42923, 22935, 47057, 13765, 63676, 38479, 18757, 35135, 60447, + 6196, 40105, 26279, 56354, 3538, 32600, 64589, 25112, 46476, 1492, 59141, +34269, 10065, 49103, 20118, 58586, 30378, 859, 48145, 36043, 18932, 61993, +13872, 49728, 30983, 12264, 55248, 35707, 1351, 64960, 30543, 8994, 58675, +22179, 43556, 16463, 57556, 31393, 5586, 62081, 21699, 30977, 59098, 11128, +47349, 20119, 36701, 57504, 150, 44908, 19686, 34671, 61049, 3308, 42493, +23554, 52804, 6394, 46072, 25729, 59290, 13942, 28622, 45637, 8687, 63326, +26157, 42124, 6735, 54991, 25843, 46628, 4725, 41094, 18532, 56551, 24451, +40853, 8266, 49125, 35572, 3291, 54410, 19584, 46226, 29706, 5622, 64143, +25328, 53455, 13257, 37773, 49790, 999, 28057, 59877, 18164, 48922, 2616, +28009, 58446, 20737, 43074, 33090, 171, 54204, 19866, 31595, 49425, 2755, +63374, 26865, 38773, 10559, 51817, 24877, 45650, 11874, 49905, 18513, 33398, +53091, 9460, 40605, 23939, 55079, 17008, 33597, 43302, 7683, 56352, 31074, + 2642, 53293, 20698, 42793, 4687, 62840, 27438, 7454, 52500, 37837, 2287, +61965, 18559, 36057, 58643, 4242, 40548, 23795, 48054, 19542, 60136, 1953, +42501, 23299, 49090, 16023, 35991, 55452, 5520, 46507, 35443, 19598, 57823, + 1617, 29875, 64900, 12268, 39517, 22954, 49835, 11470, 37448, 53952, 16982, +40447, 24639, 53280, 6456, 31609, 51421, 18258, 37792, 50025, 9307, 29164, +53291, 1767, 31847, 49079, 6270, 43402, 17037, 64790, 30608, 7864, 56446, +33652, 18071, 51056, 35455, 9436, 41105, 21705, 58022, 2314, 31047, 64517, + 8643, 47906, 30499, 19132, 54805, 38297, 16738, 27661, 61432, 9692, 41927, +24185, 65321, 7664, 50133, 38224, 2952, 31130, 53210, 20250, 39513, 680, +58128, 33082, 18440, 62771, 36296, 2571, 48482, 23043, 55087, 5296, 58405, +17171, 30047, 53147, 10953, 32680, 60288, 4375, 46568, 21355, 65180, 16672, +35626, 52818, 3985, 44708, 17291, 27740, 53996, 11828, 29858, 44591, 17419, +60205, 3021, 39571, 24194, 65483, 6700, 51863, 21212, 30586, 57951, 4409, +43406, 28725, 18337, 54707, 36151, 11261, 47037, 24129, 59910, 8501, 36604, +43976, 15667, 50606, 27587, 1691, 36800, 61094, 14970, 41792, 23881, 65230, +13806, 31275, 51054, 10930, 37901, 57056, 2139, 42085, 25709, 54675, 8985, +41559, 21734, 62356, 11865, 33355, 47917, 17097, 59726, 3447, 40670, 25009, +55010, 14906, 32897, 46322, 11817, 61189, 20731, 44226, 9124, 65347, 33914, +18564, 57964, 6100, 37389, 64043, 14049, 28874, 49659, 19561, 42078, 4079, +46883, 28781, 8651, 52768, 22079, 41272, 16245, 60194, 6548, 47859, 25636, +41973, 3852, 54964, 28292, 7122, 60652, 33138, 905, 58474, 37253, 8151, +30369, 53103, 2488, 27769, 48027, 11219, 59453, 22296, 42033, 14261, 50265, + 7766, 35509, 53864, 16591, 28294, 63652, 3215, 42864, 14280, 34094, 61119, +11765, 27816, 52151, 2665, 42176, 21880, 59260, 6644, 40928, 23393, 46067, +10911, 51752, 26484, 40629, 12774, 63523, 1889, 46026, 25983, 41448, 9835, +52057, 16849, 33950, 44520, 4556, 62994, 27328, 14400, 54242, 32303, 10016, +52168, 26824, 48661, 13057, 38754, 17506, 61868, 32168, 11007, 37729, 48302, + 2230, 54289, 33062, 17515, 40292, 12466, 60387, 31548, 15415, 37707, 64191, +10058, 31959, 47741, 1846, 61869, 28796, 15999, 58605, 30581, 10829, 37530, +60431, 15388, 41764, 22263, 47873, 2992, 29694, 58193, 15640, 34634, 52408, +10810, 44875, 31862, 14985, 54540, 36005, 7310, 50079, 14018, 64489, 25089, +43678, 9220, 58188, 34795, 13680, 47316, 22380, 60083, 797, 41061, 19696, +63689, 30901, 3053, 58426, 15318, 43656, 26972, 61755, 3969, 46158, 13573, +60209, 27782, 17688, 47786, 35623, 12000, 57917, 25997, 47357, 15726, 35219, +55375, 20543, 29588, 48714, 9362, 42478, 22902, 53676, 14414, 31696, 64700, + 6251, 44541, 30721, 16546, 57687, 33861, 8607, 61886, 31119, 14179, 44020, +21475, 62592, 10262, 32978, 50251, 15955, 42650, 25253, 54630, 2830, 31618, +63184, 7804, 28131, 46912, 3737, 58619, 15612, 37947, 61967, 10693, 46751, +28262, 4969, 64474, 34781, 12019, 57909, 37998, 15961, 60018, 25010, 40675, + 874, 52187, 24925, 39484, 4262, 60561, 28772, 13465, 55901, 25825, 42970, + 8065, 53813, 36898, 16960, 27288, 56460, 13563, 45021, 624, 52153, 11807, +34164, 44989, 19391, 56866, 2034, 33134, 43987, 16542, 55143, 22238, 44774, + 7177, 55973, 23834, 47430, 13476, 28735, 44369, 10299, 54563, 28234, 12916, +45413, 33551, 20549, 36638, 51311, 2044, 42092, 24465, 55442, 15598, 39359, +25826, 43333, 985, 56037, 12351, 29141, 59672, 20676, 37380, 64612, 2104, +33822, 58106, 7067, 47445, 21104, 34043, 54394, 13843, 46474, 26749, 38730, + 1568, 49234, 17174, 33676, 62366, 8126, 50958, 31701, 2779, 65053, 21423, +42840, 12655, 51874, 28242, 3992, 63913, 20854, 34218, 56089, 11024, 44219, +21424, 54632, 7477, 34240, 45535, 1009, 58860, 28375, 15630, 46201, 22161, +62643, 12866, 39235, 23747, 58684, 1380, 49281, 26079, 40165, 5919, 51294, +21150, 31197, 56451, 9759, 43577, 21640, 63484, 5803, 41083, 25693, 52124, +13393, 30657, 48670, 4374, 41697, 25083, 52738, 10462, 40075, 25986, 56184, + 7191, 30252, 63356, 13629, 38413, 59759, 17820, 33904, 56607, 2446, 46793, +26425, 38916, 13562, 61637, 21181, 50385, 11087, 38159, 48121, 16848, 27155, +50020, 10781, 43936, 22225, 56748, 14832, 38177, 62511, 16456, 30941, 44729, + 1125, 54864, 30278, 17861, 61696, 21482, 41325, 6416, 48462, 36445, 18058, +56885, 25318, 46725, 5434, 38254, 55825, 17486, 32388, 63343, 10560, 39205, +26269, 53307, 14860, 61746, 20175, 38787, 3393, 54873, 32620, 19579, 51108, +36599, 14252, 48986, 23779, 64029, 1160, 39391, 19468, 53324, 30008, 8818, +49909, 37607, 20842, 59534, 4809, 40224, 21808, 65221, 1550, 41468, 22566, +55018, 5153, 28162, 63926, 15056, 42588, 25219, 56721, 3675, 48266, 24163, +44624, 1279, 52329, 20090, 28438, 58351, 14134, 43812, 36160, 20590, 51616, + 6040, 44358, 23559, 50585, 740, 28907, 57260, 8569, 34957, 61748, 20604, +40481, 9096, 64962, 22905, 39867, 6460, 61105, 25080, 39238, 12014, 56376, +18858, 41451, 29684, 6279, 52847, 38083, 15683, 28031, 55977, 5184, 43872, +34137, 16561, 56599, 36360, 9129, 54614, 21239, 46487, 34895, 6283, 50458, +17679, 38732, 26633, 52986, 5595, 37166, 51125, 9738, 64468, 21716, 39994, + 6567, 32319, 58757, 565, 43181, 11343, 64172, 17562, 31867, 55800, 3286, +36757, 45956, 11630, 50174, 27392, 10464, 55309, 37825, 5111, 51011, 21745, +40095, 452, 54266, 26815, 48157, 3764, 40869, 24595, 56855, 5888, 34252, +61631, 9401, 47695, 19104, 34636, 44289, 13125, 56678, 33044, 21085, 49138, +27358, 1486, 34169, 55729, 21129, 41550, 15218, 52538, 24850, 47370, 7278, +28948, 54443, 12566, 48480, 32272, 19553, 58161, 11131, 43914, 21879, 49505, +37255, 419, 64056, 19220, 29568, 47201, 11107, 60348, 38446, 4942, 33292, +61946, 20056, 40955, 26051, 64211, 5246, 48109, 25755, 40832, 10899, 62450, +29641, 4560, 59413, 33117, 15463, 38133, 63746, 8554, 34498, 60044, 4874, +50804, 20759, 35021, 65448, 8990, 49488, 59450, 11908, 28619, 62993, 19198, +45684, 5715, 33916, 61985, 11687, 52478, 32553, 19219, 38342, 45910, 6169, +49925, 11272, 41539, 25251, 50880, 12912, 40019, 25908, 62193, 9749, 28605, +58805, 4760, 42047, 15552, 63162, 23901, 53752, 10959, 40641, 22898, 44825, +15286, 53469, 25822, 41326, 5786, 56428, 19612, 35662, 46634, 14585, 52923, + 6335, 42343, 25744, 62274, 3262, 39726, 25460, 60196, 12417, 48967, 18862, +36540, 61251, 7258, 31035, 47899, 4119, 55874, 28583, 15118, 45820, 32571, + 9854, 60570, 18630, 28453, 64081, 12618, 47516, 36487, 861, 51279, 37548, +17548, 31477, 56677, 2326, 36240, 59482, 16842, 28329, 62509, 12862, 44359, +21211, 60413, 2767, 34552, 48328, 17134, 53550, 35947, 1285, 27153, 51592, + 7596, 40013, 22865, 64563, 8391, 33007, 55334, 109, 44665, 29631, 18319, +63398, 31303, 2784, 55390, 35400, 17745, 64885, 32606, 3765, 50602, 29163, + 7867, 54090, 35687, 19489, 63982, 9600, 46843, 36557, 4529, 51068, 24301, +57969, 12735, 30667, 53357, 8018, 40631, 21391, 65360, 29650, 12922, 48566, + 4608, 43628, 22500, 56417, 90, 33129, 48972, 5791, 44194, 25063, 59941, +15841, 41407, 6831, 61162, 29130, 4151, 57331, 32995, 9099, 45201, 24391, +56731, 13196, 46604, 34791, 2350, 61678, 16058, 42901, 26233, 56635, 11197, +45150, 25217, 58214, 9358, 30472, 48976, 12199, 41846, 23665, 59010, 7359, +38821, 21604, 64932, 9608, 32570, 56006, 16374, 37059, 45892, 4228, 53839, +27357, 8551, 59913, 37654, 18727, 65264, 11815, 34554, 55432, 13952, 32194, +51645, 17876, 43580, 5969, 53110, 24482, 46349, 3541, 29589, 55972, 19459, +42106, 1464, 63893, 26290, 45952, 3986, 59391, 33383, 21275, 62722, 1923, +45478, 31208, 20901, 65211, 12812, 48675, 28264, 6849, 51347, 26021, 39862, +10295, 64705, 19782, 32419, 59273, 116, 44915, 21611, 63256, 15396, 29307, +42407, 1718, 45866, 25370, 61335, 14075, 48902, 28303, 19347, 52012, 36496, + 5624, 47819, 24981, 62738, 15829, 29350, 58168, 1042, 34221, 61437, 18416, +45540, 29915, 13714, 64379, 25681, 43125, 10659, 59061, 17834, 31571, 63634, +11290, 43237, 21315, 49073, 14321, 40557, 24160, 59515, 614, 51495, 23202, +41023, 5634, 63922, 12152, 36574, 59297, 17585, 43361, 7936, 60893, 32654, + 2743, 44884, 19423, 63508, 34544, 3245, 44059, 21815, 61813, 5973, 46630, +34289, 16860, 62578, 8449, 31567, 52829, 15725, 44131, 35183, 3602, 50621, +28455, 15331, 53009, 23163, 43855, 7550, 55217, 14047, 39254, 22823, 56073, + 8450, 33901, 52882, 18746, 42589, 12826, 47061, 24330, 52664, 1781, 27904, +49134, 16683, 45017, 24757, 39854, 14378, 55957, 1175, 39399, 25062, 31714, + 4218, 48043, 37979, 13881, 57886, 23051, 49893, 9234, 30127, 47468, 3237, +63533, 27224, 14935, 57445, 34132, 21694, 61211, 4883, 30576, 56206, 16993, +45691, 606, 37704, 50519, 11820, 30723, 56325, 20577, 44585, 6151, 38521, +27031, 57672, 234, 48340, 35242, 10006, 61067, 28824, 16446, 38336, 62765, + 1413, 29662, 57713, 22123, 38843, 11712, 51436, 19204, 31541, 52915, 8684, +43672, 22607, 30486, 55578, 2670, 41133, 24248, 52903, 11637, 40468, 20044, +34443, 65533, 7886, 49997, 22185, 35390, 52503, 2467, 44963, 34192, 7373, +27110, 62635, 16299, 28466, 58372, 10149, 42034, 21636, 53213, 7319, 38064, +49589, 1133, 32133, 54658, 8461, 39300, 23277, 57569, 6426, 27820, 43377, +12188, 62099, 38184, 15686, 31726, 58476, 11575, 41854, 25046, 51373, 15364, +39957, 22631, 59951, 5743, 35445, 51060, 14545, 27931, 57829, 6350, 41485, +24597, 46389, 13163, 61221, 25820, 41007, 5739, 52003, 24285, 39739, 13805, +59845, 28354, 15631, 45367, 37896, 282, 62120, 23360, 43859, 15593, 51531, + 1699, 37886, 54046, 19951, 34104, 60569, 8698, 40549, 24498, 64568, 13707, +38584, 20707, 50518, 8539, 31740, 55661, 23475, 47418, 11647, 40000, 22721, +52377, 16252, 60568, 36350, 5478, 28126, 64698, 11829, 41300, 24836, 52830, + 8110, 38531, 17789, 51120, 33466, 6839, 36752, 53171, 15603, 61237, 34993, + 311, 50923, 19670, 32552, 53473, 11738, 43518, 26756, 49816, 6989, 60708, +29977, 13248, 63531, 34358, 11551, 49842, 31036, 2627, 45389, 24748, 48982, + 5090, 40403, 25670, 63350, 2195, 39094, 26408, 56899, 12309, 32909, 60648, +16846, 37158, 45420, 11569, 53353, 34290, 21206, 50901, 9598, 39073, 19683, +51735, 8077, 35754, 48403, 17903, 53442, 9376, 40299, 33293, 3344, 61153, +37879, 19107, 57406, 1534, 42809, 24104, 53663, 11194, 42079, 23421, 56787, + 8210, 34089, 48736, 10970, 55663, 34048, 19437, 54044, 8739, 34864, 41774, + 3991, 56891, 30784, 14573, 59851, 21135, 42139, 8730, 34686, 52170, 19109, +43505, 12909, 49376, 27795, 2934, 53312, 35333, 8141, 56040, 19191, 32593, +47219, 6465, 53132, 23324, 39315, 1269, 54212, 26544, 60768, 5063, 30564, +45076, 17206, 36150, 54862, 14492, 30404, 45995, 20043, 52015, 4127, 30384, +54843, 22047, 40536, 12491, 56640, 26726, 40531, 9730, 50590, 17938, 31135, +53753, 10465, 38965, 26432, 56753, 2490, 29195, 54627, 20527, 40696, 5395, +59746, 22293, 55527, 12615, 38239, 65200, 1680, 35939, 57537, 17423, 32060, +47189, 2769, 60075, 29766, 17611, 48622, 893, 61081, 26398, 39190, 5679, +62976, 18236, 36852, 57822, 9438, 31797, 52241, 3467, 61939, 19522, 31937, +46058, 10647, 53708, 15801, 64135, 27681, 7694, 54360, 35394, 437, 41630, +26259, 60558, 17133, 34782, 44097, 8080, 51425, 30484, 1361, 47756, 38218, +19675, 52090, 7530, 35737, 63843, 22172, 42753, 16012, 59786, 37083, 2891, +48517, 25501, 55645, 9405, 39616, 16863, 64258, 20454, 30578, 50625, 3347, +36567, 54071, 7964, 31842, 49497, 18531, 45155, 5379, 64459, 26887, 41081, + 427, 58322, 17448, 36134, 63002, 5243, 47573, 16276, 37219, 63883, 9847, +31799, 57913, 17287, 45357, 135, 53556, 26854, 40602, 4979, 57097, 17711, +29280, 58903, 13894, 37603, 48847, 10929, 54189, 34946, 3875, 47462, 24628, +64386, 13865, 44835, 19590, 27402, 58608, 15399, 42610, 24816, 64922, 11408, +33600, 46590, 18055, 54298, 32548, 5190, 52392, 24503, 48513, 3465, 44598, +20571, 62306, 4975, 31011, 57998, 11297, 42959, 25572, 54755, 8686, 46250, +37700, 19475, 49049, 11340, 59162, 20688, 38610, 552, 48873, 20035, 57901, +16045, 32923, 48547, 2363, 55304, 34495, 9968, 64428, 27405, 17118, 49819, +33680, 6013, 59630, 31503, 18904, 57898, 27781, 7349, 49447, 16580, 30691, +52564, 10074, 45707, 26952, 57875, 2846, 29895, 63073, 19009, 43832, 768, +33360, 65524, 20318, 42622, 3001, 48684, 30377, 10736, 55221, 38117, 18930, +31926, 58610, 4087, 44404, 22561, 63665, 921, 29887, 60451, 20109, 47086, + 3079, 43169, 21154, 28403, 45409, 13681, 62705, 4934, 41271, 22847, 57008, + 2386, 38751, 24562, 41318, 19126, 51875, 492, 39858, 24477, 55646, 15848, +38236, 57407, 7810, 30962, 60682, 20876, 44674, 14828, 33362, 59076, 9796, +42431, 21790, 48387, 298, 55101, 27115, 7645, 62879, 30107, 4667, 58767, +15894, 44728, 27019, 62319, 12559, 42942, 25032, 60529, 5990, 29220, 57812, +16070, 50445, 22815, 44942, 12074, 30007, 47040, 16296, 62435, 37250, 5254, +31078, 52522, 14287, 39595, 24577, 62109, 3724, 41382, 22370, 60626, 5240, +30802, 49535, 17449, 65161, 22783, 46360, 10683, 34381, 53380, 1490, 45047, +26604, 60685, 4482, 39816, 25683, 63945, 7155, 37107, 59519, 14575, 48425, +24082, 41814, 2089, 60315, 20626, 34734, 44764, 13325, 58633, 32195, 19257, +47073, 12874, 36349, 53145, 7982, 64731, 27207, 3091, 58219, 38371, 9132, +61794, 24031, 42135, 14315, 45877, 5976, 65009, 23813, 38984, 155, 61494, +20396, 35633, 59251, 4555, 42035, 23433, 65495, 12194, 41481, 18815, 35892, +45981, 9807, 63697, 27911, 14745, 47868, 30770, 6997, 46359, 27045, 18777, +49707, 28774, 6450, 63372, 21014, 36841, 44362, 11143, 53791, 20735, 36124, +45450, 14100, 57391, 21335, 31554, 51094, 6810, 39884, 21127, 64770, 13743, +39185, 26721, 48470, 6410, 56580, 24430, 42133, 34149, 45151, 17987, 50534, +30751, 12649, 62545, 20881, 45418, 6963, 55566, 28629, 13311, 59158, 35941, +16214, 64219, 27845, 10082, 57780, 31753, 14331, 48606, 27600, 3912, 53886, +33211, 8482, 28042, 64921, 19012, 41142, 13215, 60466, 26732, 42426, 5213, +52434, 12897, 40246, 22676, 58928, 13790, 40997, 25279, 60746, 9424, 39880, +23166, 53780, 13332, 29569, 46177, 9275, 50751, 21976, 29617, 42219, 10397, +57482, 28167, 19781, 50227, 4551, 42740, 26280, 62015, 13652, 38604, 20828, +60245, 11295, 32208, 48511, 8825, 42370, 25278, 61461, 4631, 44455, 27689, +18606, 60296, 38395, 8927, 32322, 51451, 3162, 61786, 33716, 7857, 50842, +37407, 4208, 47838, 22051, 56802, 446, 30533, 61113, 14653, 41859, 22008, +63975, 10335, 38755, 26682, 53843, 14050, 36849, 49762, 18884, 47204, 2328, +39107, 17984, 61063, 29154, 1364, 63809, 25663, 39989, 5089, 52461, 26862, +63224, 15104, 44222, 34812, 4347, 60512, 29016, 12297, 43466, 23331, 51633, + 4036, 37221, 46292, 12083, 54761, 26235, 39658, 10988, 47133, 4229, 36989, +64140, 23379, 42653, 2235, 58984, 23891, 39543, 6543, 53728, 22092, 47439, +11940, 36036, 56873, 16333, 49143, 27862, 7108, 58105, 32640, 13782, 63319, +25688, 44035, 433, 51447, 13716, 39810, 25660, 56414, 9408, 38844, 26979, +49805, 10645, 37330, 57593, 17117, 32059, 64399, 7614, 53601, 31371, 17898, +38118, 55510, 9919, 34080, 62258, 16079, 47011, 5813, 59754, 26980, 48294, +15055, 42184, 5396, 61572, 27804, 17295, 50941, 35878, 12251, 54506, 3792, +49860, 19643, 46945, 28442, 5320, 64597, 35574, 15988, 38425, 50264, 18677, +36014, 47872, 14455, 40460, 24555, 57049, 902, 38725, 22805, 55397, 3491, +41046, 19038, 34029, 42408, 476, 63490, 31453, 8168, 59552, 36165, 4313, +49427, 28170, 13617, 58162, 22204, 44091, 2357, 55919, 30520, 16064, 51670, +32706, 12560, 46135, 24386, 57392, 14928, 43560, 2209, 39356, 25821, 62191, + 7805, 41005, 23965, 57120, 13593, 38832, 22551, 56065, 10343, 32288, 53623, +17195, 42878, 31297, 5635, 63065, 36698, 16208, 29007, 51376, 4642, 65064, +27419, 7548, 50048, 37807, 3563, 62751, 27700, 18438, 45985, 37568, 10763, +50722, 27938, 18028, 48575, 33974, 1046, 56130, 32209, 18689, 50735, 36876, +13338, 48664, 25961, 52865, 6860, 29243, 46308, 16750, 55840, 30060, 1286, +48175, 25300, 57532, 4806, 50671, 17640, 33384, 54015, 1013, 35636, 51514, +16159, 58769, 34763, 4257, 61452, 38434, 15892, 50782, 30735, 8974, 58277, +27570, 3836, 64943, 30704, 7822, 50432, 35226, 2640, 48001, 16280, 55743, +26802, 43416, 317, 46845, 22754, 59169, 12354, 40575, 21249, 61023, 2174, +27279, 9644, 60011, 37583, 3557, 56123, 25268, 39677, 15066, 50248, 36333, + 2420, 52735, 23510, 46554, 5502, 41703, 19025, 54199, 37413, 2226, 61767, +21032, 34956, 58309, 12550, 47258, 20124, 35679, 52911, 6506, 49377, 32362, + 2047, 46013, 23082, 57212, 17960, 33005, 63438, 6693, 42213, 23971, 55721, + 2206, 46257, 17561, 34022, 59315, 4155, 48330, 33881, 15791, 63594, 37712, + 3499, 60021, 18489, 48703, 35199, 1228, 54886, 38287, 22611, 59270, 6683, +41901, 24658, 54489, 3127, 41365, 26448, 53142, 19044, 63380, 1558, 39639, +21825, 55239, 14965, 36874, 49516, 378, 28905, 57266, 16714, 40333, 25605, +43336, 12710, 54926, 27738, 17231, 62788, 30960, 8817, 44198, 25608, 50601, +11047, 28587, 48009, 2637, 36217, 56732, 17685, 45536, 970, 59526, 28694, + 7885, 65398, 32523, 20539, 57564, 10533, 36402, 51463, 15369, 31644, 55841, +12025, 43617, 22096, 47469, 8848, 30539, 54698, 11010, 42144, 21635, 50162, +17113, 62670, 35879, 8808, 57756, 30612, 19235, 61313, 2736, 43190, 21799, +62865, 17219, 50404, 33476, 12594, 54959, 18836, 31464, 44944, 12165, 62721, +18725, 31947, 42746, 8068, 61480, 27145, 4379, 52928, 34312, 10522, 38056, +47137, 19434, 54128, 7874, 39387, 21727, 59760, 18007, 29917, 62651, 5942, +45180, 20425, 54370, 13670, 32904, 56082, 5564, 27624, 45812, 12879, 49584, +24238, 40157, 3377, 59892, 27727, 14322, 48182, 29450, 7953, 52808, 26140, +42559, 17018, 38511, 10382, 64289, 23173, 52776, 9470, 37587, 46209, 1090, +63851, 23771, 41356, 17726, 36925, 62681, 8991, 38059, 56488, 13580, 30324, +53889, 8276, 27942, 58062, 2497, 32107, 65355, 6653, 48668, 17895, 32568, +53648, 11094, 43999, 26781, 64805, 11790, 47714, 23257, 53903, 14257, 46218, +25001, 40527, 11369, 56103, 18341, 37821, 51504, 7210, 32142, 64980, 19137, +40398, 9289, 59782, 21000, 44305, 834, 64064, 37430, 7386, 32535, 51074, +20923, 55465, 11668, 32648, 48458, 18134, 50978, 6446, 31725, 63385, 2790, +46207, 20064, 28239, 47478, 728, 57196, 27085, 20284, 46172, 12318, 53962, +37836, 9769, 46871, 18706, 36122, 56343, 14678, 29934, 57358, 11806, 48140, +34072, 1653, 61000, 31062, 13850, 56983, 37041, 7075, 64266, 24997, 44045, + 7800, 60535, 28599, 3343, 58837, 33228, 10280, 45464, 22053, 57576, 9107, +33387, 51063, 14301, 36842, 60829, 10845, 42761, 22298, 31131, 59071, 7346, +42153, 23712, 62212, 9235, 43283, 19894, 29196, 47858, 12861, 27137, 54692, + 89, 35406, 47919, 16595, 38249, 51723, 12360, 43031, 24383, 60276, 13471, +41425, 23402, 63513, 10703, 38648, 20002, 60698, 9746, 50245, 30176, 4609, +37428, 52646, 14564, 47060, 36068, 54971, 15468, 28535, 49220, 19688, 43037, + 5202, 65095, 31202, 10672, 59862, 20843, 40415, 12178, 62624, 25725, 48682, + 8446, 29257, 45031, 17499, 50730, 5834, 41775, 26595, 62946, 941, 45088, +15207, 29284, 56664, 17517, 37663, 62711, 10604, 30027, 49330, 1139, 45158, +26310, 53189, 11492, 38525, 19755, 65380, 30421, 12288, 50279, 24419, 42723, + 7074, 55182, 20254, 28271, 53177, 12253, 44772, 27290, 15247, 64845, 30010, + 9430, 48151, 17613, 36175, 51476, 12352, 32287, 64637, 16820, 47630, 5597, +33672, 45777, 15534, 57811, 31071, 6599, 51945, 27083, 12283, 65139, 37596, +14275, 52598, 6192, 46821, 21990, 60706, 1403, 36022, 45793, 10568, 55470, +37923, 16238, 63609, 5801, 37282, 58890, 19035, 51215, 29721, 9092, 33829, +54646, 20224, 43176, 11774, 34969, 52824, 3911, 44028, 26298, 53944, 6049, +41299, 23588, 48163, 3074, 37071, 58281, 13512, 32701, 61533, 2018, 40542, +26004, 65193, 6630, 32136, 46048, 1188, 27718, 54322, 21286, 47546, 10353, +38780, 25202, 56992, 7690, 30481, 44475, 644, 60170, 29165, 8404, 51847, +35826, 4924, 55687, 25836, 48395, 1079, 37927, 51309, 17577, 31083, 59101, +14001, 43382, 23191, 62432, 1585, 28957, 45083, 15978, 56131, 32350, 3442, +49673, 35994, 9825, 52210, 26509, 40752, 2457, 61349, 23862, 44050, 16554, +37946, 58706, 1638, 35576, 61999, 11068, 43978, 20516, 51290, 35751, 814, +65068, 37917, 18767, 58396, 3584, 45783, 25326, 55129, 2037, 44138, 34858, +18687, 29215, 59493, 13595, 34166, 48388, 10687, 57731, 27308, 1669, 31361, +51348, 20169, 46510, 3373, 33883, 62094, 11346, 41980, 22043, 52449, 13045, +42837, 26577, 61236, 9067, 40247, 23621, 59100, 7905, 38500, 20678, 56819, + 6500, 38629, 27020, 61994, 2727, 50092, 20007, 29406, 63812, 1010, 41937, +25368, 54053, 10526, 45671, 26880, 50138, 5926, 39041, 25713, 54528, 13278, +28550, 48365, 17140, 62948, 4941, 39897, 26562, 61190, 235, 39026, 22203, +58875, 15220, 41879, 25316, 53002, 9566, 34150, 65361, 15639, 42137, 30263, + 7499, 62116, 33876, 3201, 57819, 23005, 30183, 61099, 107, 44428, 24416, +40930, 8218, 52059, 20949, 42931, 15227, 52890, 23702, 46689, 4307, 41850, +21743, 49395, 14981, 35410, 52191, 11413, 40171, 23354, 53810, 15159, 37357, +62255, 1938, 41662, 24978, 63866, 5439, 44551, 19818, 28314, 47361, 3433, +63328, 13753, 40504, 25768, 56083, 12038, 38944, 25745, 52606, 2892, 60634, +36410, 7765, 57245, 38245, 14868, 62725, 27059, 5401, 59339, 32693, 21461, +54548, 1507, 39028, 26675, 56655, 6347, 33455, 46253, 4027, 52027, 24260, +41897, 13232, 35934, 58260, 17575, 28698, 64496, 5922, 23565, 39705, 806, +63139, 32458, 8557, 58215, 35282, 14237, 51026, 24021, 43783, 4330, 55134, +26852, 38775, 117, 56900, 20506, 36344, 65307, 11708, 32088, 56379, 18723, +38978, 10390, 54306, 22975, 36543, 60962, 9027, 46777, 27641, 4848, 52103, +36232, 14969, 61300, 21117, 38958, 9079, 58006, 26917, 44602, 8107, 54612, +35111, 821, 61621, 29905, 17241, 37257, 58752, 1970, 41881, 31114, 7828, +56945, 37528, 4955, 52088, 21948, 33060, 62891, 2234, 28529, 55757, 8634, +39446, 24046, 56485, 12928, 39056, 22691, 51064, 9187, 37783, 62766, 17904, +34386, 46670, 4840, 54426, 30114, 17385, 62240, 36764, 11490, 30885, 48875, +18574, 59796, 28828, 3323, 34331, 52148, 20225, 46978, 32167, 13962, 45104, + 4308, 64799, 22907, 40502, 6238, 62531, 24224, 50399, 15031, 41040, 23240, +63105, 12291, 39470, 21225, 59770, 9898, 33841, 64623, 17077, 28758, 52990, + 7029, 42364, 23622, 55429, 14160, 38804, 23046, 50944, 11930, 58652, 37554, +15929, 42225, 5608, 64754, 27000, 48734, 13112, 41959, 23804, 55449, 15177, +40009, 23092, 46011, 13887, 61823, 20753, 41752, 11074, 32848, 65100, 15334, +28075, 55145, 3275, 45654, 36533, 8633, 49745, 31034, 18527, 58336, 35597, + 5328, 47586, 24062, 64893, 15019, 42744, 22157, 58974, 12829, 46742, 33906, +17753, 48964, 4590, 65344, 30813, 9191, 51821, 28890, 18626, 53500, 33668, + 7053, 57942, 17531, 45901, 27370, 12109, 50463, 34407, 21956, 62914, 8329, +39077, 26876, 51513, 14693, 56841, 4089, 42311, 25868, 56064, 4890, 32126, +45064, 15668, 61144, 36205, 10289, 55731, 23183, 43132, 14488, 47636, 24630, +59550, 5605, 39607, 24106, 56726, 1744, 38858, 20757, 54498, 4441, 44876, +26983, 52703, 2186, 42199, 25909, 58297, 10724, 43854, 21701, 35589, 55333, + 8796, 45529, 35382, 12997, 60388, 20972, 38892, 3498, 62647, 18355, 34909, +58469, 11364, 43306, 23029, 60258, 3009, 31687, 42838, 21755, 57976, 9792, +44416, 24774, 53007, 12919, 47397, 32607, 8326, 60574, 29600, 17535, 50552, + 4954, 37469, 58868, 13115, 44230, 23784, 49721, 16795, 41102, 10490, 51870, +17874, 32381, 54562, 12479, 63231, 33316, 2611, 59351, 26631, 39198, 8952, +63696, 16653, 34828, 59744, 9914, 30545, 57585, 2309, 29227, 63040, 18357, +43008, 5212, 49637, 28058, 18192, 54684, 30454, 13059, 37817, 52157, 15952, +59827, 33084, 9696, 50412, 35560, 19537, 52809, 2245, 45195, 21576, 64831, + 5681, 31919, 49448, 14250, 45443, 27909, 17906, 51466, 29912, 9415, 46961, +37812, 18401, 49481, 9959, 29922, 61855, 17100, 43742, 11514, 52788, 28394, +16453, 59570, 35935, 7407, 62634, 26227, 54161, 1693, 31522, 44882, 9041, +50865, 57755, 12349, 43749, 21758, 52349, 17495, 47582, 27981, 1495, 56517, +36730, 16808, 31921, 48032, 9352, 60398, 24484, 42384, 14493, 46841, 4676, +51946, 24666, 43183, 2725, 60292, 25910, 40985, 14295, 51327, 3564, 33782, +55422, 19476, 42580, 12661, 59209, 25019, 43629, 5596, 51413, 24825, 40146, + 3437, 62108, 21868, 41741, 15471, 46957, 22548, 51726, 10606, 31658, 48739, +14889, 62439, 24172, 50448, 13066, 32057, 60389, 19005, 45788, 7135, 37525, +50808, 15654, 43418, 23424, 59905, 788, 44827, 26734, 64001, 3501, 29749, +55751, 19794, 44719, 1900, 28015, 59595, 11217, 43412, 23738, 41421, 2365, +50354, 25003, 58492, 4998, 40062, 14392, 53070, 25140, 41865, 12135, 60917, + 1714, 28192, 55999, 21065, 42440, 12443, 35380, 56982, 16806, 46286, 32006, + 2156, 60477, 36369, 8963, 46243, 24637, 57177, 316, 30274, 52249, 19657, +42843, 5429, 49836, 20647, 35997, 60046, 9541, 33637, 47852, 2986, 56869, +20337, 44370, 30738, 4611, 59966, 24709, 53564, 15012, 39592, 1589, 52014, +21327, 63465, 6282, 33132, 48885, 3934, 56358, 26780, 38684, 2009, 57081, +26490, 49588, 5368, 44469, 37388, 12699, 59730, 20304, 27456, 64246, 14956, +53824, 6614, 40324, 22193, 61361, 12441, 41825, 33221, 7448, 57240, 37843, + 1213, 30757, 63067, 8622, 52909, 26110, 40089, 12209, 55408, 23111, 41347, +14088, 45199, 3898, 64012, 21573, 30716, 42508, 9441, 60618, 37538, 4748, +57278, 15627, 32506, 49677, 20205, 61219, 6208, 33458, 44892, 19973, 65501, +12511, 39676, 23230, 54257, 7513, 28099, 50275, 18691, 41186, 6057, 63970, +26129, 39508, 668, 50488, 18116, 32990, 53111, 12072, 44619, 23325, 64096, +15086, 42141, 23970, 62562, 13620, 39084, 22147, 60914, 9274, 32720, 48778, +16689, 53349, 5497, 31814, 59121, 15879, 27755, 50443, 6120, 42925, 25991, +52660, 13409, 47570, 29900, 1670, 50919, 33773, 8012, 53082, 37689, 18360, +54763, 6167, 47128, 31082, 15863, 36104, 64329, 4783, 42352, 23145, 54937, + 1824, 35723, 44093, 20525, 55803, 27234, 9155, 52201, 35565, 1572, 59930, +22239, 32771, 64562, 4297, 42527, 23690, 48786, 5206, 39392, 22423, 46593, +17143, 51034, 5901, 43858, 25404, 55392, 376, 39547, 23157, 51217, 13408, +36407, 46619, 8332, 55262, 20667, 33925, 65252, 12130, 47044, 3965, 36088, +61182, 8037, 27428, 47907, 344, 41538, 24953, 57130, 6075, 39569, 26928, +58115, 11213, 35044, 42974, 17338, 55175, 22086, 41092, 6357, 63889, 33002, + 2079, 58356, 35811, 20595, 64320, 3027, 33714, 55533, 19652, 45681, 4792, +34535, 65366, 19358, 47716, 1084, 31159, 50818, 18087, 44503, 11633, 33190, +48190, 15268, 61722, 35005, 19050, 3376, 41204, 25898, 60330, 5483, 34639, +41853, 11847, 62180, 21955, 45836, 6547, 64401, 23012, 39635, 16112, 53285, + 7023, 34323, 61370, 21536, 40091, 9432, 59041, 35691, 20614, 46356, 7111, +64565, 30877, 21132, 44845, 11488, 63658, 25975, 39922, 2558, 53563, 19924, +32699, 64720, 13474, 48000, 19057, 31098, 55266, 6383, 36185, 58513, 4363, +27521, 64109, 6825, 43802, 22989, 39347, 3803, 45154, 21532, 54193, 314, +41146, 26153, 61693, 14034, 29840, 57815, 7943, 41251, 17604, 30998, 54349, +11871, 40519, 21320, 49347, 6979, 36258, 61139, 13025, 32902, 48378, 20826, +57676, 8221, 33156, 64236, 20081, 44863, 9840, 34287, 48290, 20823, 65477, + 8331, 32578, 45163, 16827, 50438, 35795, 7183, 60306, 24457, 53309, 686, +28006, 43816, 11019, 58223, 27275, 17549, 51544, 30646, 4641, 54216, 36019, +17453, 49192, 8378, 37916, 62360, 16327, 31630, 54486, 815, 44969, 28296, +15277, 61800, 25304, 40863, 8579, 64104, 17565, 35799, 49517, 9428, 43409, +30288, 18157, 60930, 37123, 11793, 31030, 45591, 16005, 59724, 23595, 40721, +10230, 63785, 21671, 47211, 8784, 29374, 61047, 19143, 33843, 52119, 7641, +47344, 31997, 232, 42202, 24907, 46611, 17404, 51655, 30748, 2128, 54713, +23007, 48904, 17214, 28202, 53851, 11927, 43432, 23059, 38991, 6760, 59189, +21336, 47654, 6, 32056, 58314, 24573, 48715, 10379, 37058, 56022, 2132, +47912, 29160, 18455, 53895, 25795, 43496, 1250, 41250, 11825, 47161, 25705, +57832, 9752, 30876, 46927, 140, 52586, 33344, 15024, 62350, 37957, 2698, +58798, 21569, 47183, 33262, 12378, 57462, 20686, 37026, 62945, 7361, 29541, +60040, 3671, 35641, 50044, 8189, 30929, 55682, 10466, 34659, 51976, 5220, +46343, 20132, 41209, 1180, 63199, 25864, 40475, 19113, 46363, 3168, 64444, +31059, 16709, 57319, 34910, 9504, 61522, 23777, 42237, 15348, 65324, 21911, +45567, 10556, 29683, 63292, 14211, 41904, 23010, 56260, 2569, 49186, 18710, +28996, 58375, 10958, 39685, 26286, 62602, 12241, 48544, 3539, 32758, 63816, +14073, 46988, 25113, 40209, 6536, 55327, 20719, 47548, 13075, 29001, 61803, +16117, 55122, 30631, 9518, 65451, 35151, 21631, 53441, 11050, 33750, 47992, +20637, 60227, 6757, 43289, 24556, 61683, 15659, 30532, 50424, 837, 41707, +23915, 57180, 15435, 45123, 19211, 34304, 53825, 11830, 64649, 31597, 16517, +46032, 21858, 62776, 14343, 31473, 47876, 7268, 61073, 30056, 666, 59337, +34531, 13518, 46217, 23370, 53287, 16191, 40991, 6755, 50106, 24741, 40661, + 8164, 60479, 22279, 30493, 53712, 8820, 40808, 23989, 57668, 13944, 39932, +21608, 64008, 3088, 52409, 24839, 42988, 6572, 27796, 53360, 64913, 31915, +16764, 37540, 48543, 15691, 55344, 27305, 3903, 53073, 37617, 15420, 29591, +47131, 2526, 57336, 30599, 17135, 49865, 28539, 1183, 52883, 31007, 16712, +55168, 4305, 29769, 50130, 15629, 35428, 58146, 495, 49499, 30522, 7698, +35480, 46194, 17098, 57777, 7006, 42179, 29224, 32, 60020, 37318, 14600, +49149, 28395, 17541, 52504, 38167, 11897, 33505, 57229, 14123, 46865, 25445, +65111, 10311, 38736, 24675, 55948, 11727, 35518, 46808, 2873, 49214, 21352, +35208, 60638, 4419, 44159, 25017, 62082, 9700, 31718, 52898, 16359, 41373, +24257, 56208, 4224, 39469, 15424, 50881, 26543, 39002, 5928, 55195, 18081, +29791, 56985, 10, 42140, 24479, 53785, 5363, 62371, 29995, 18381, 47875, +37590, 9950, 31944, 49035, 15479, 62062, 30745, 5299, 48357, 37939, 13151, +64335, 21610, 43555, 10937, 60905, 32812, 21518, 55577, 3570, 28095, 46692, +12859, 63543, 19020, 35071, 56059, 4985, 46784, 18699, 33598, 51493, 38, +27448, 57364, 20628, 47244, 3702, 33831, 50024, 8586, 56086, 27185, 2619, +51190, 36803, 7062, 53115, 25706, 43684, 13527, 35569, 54411, 17142, 41398, + 2449, 57521, 27088, 15685, 38359, 54622, 18740, 60033, 34965, 4814, 63710, +11102, 38390, 57788, 13565, 29456, 44061, 4999, 64442, 20717, 32087, 48455, + 2626, 60784, 24983, 44945, 14592, 35544, 63589, 18165, 42698, 6247, 34560, +60947, 15524, 44464, 27210, 11452, 63271, 36733, 6058, 50902, 14780, 64564, +22335, 30485, 54822, 3253, 40448, 23472, 62021, 15704, 39093, 20956, 58326, + 9247, 46461, 29701, 16384, 35493, 52216, 9957, 28447, 54404, 4101, 44946, +27584, 16323, 53678, 38089, 13404, 47299, 28333, 17853, 58524, 36939, 31, +47154, 29695, 15678, 64334, 25352, 55119, 12701, 38599, 22067, 50725, 6929, +56016, 33258, 13369, 49019, 23892, 42169, 292, 53703, 22441, 40183, 4412, +56383, 26750, 38733, 5426, 55556, 26267, 49206, 681, 33004, 59034, 7525, +38941, 26803, 61856, 9380, 34314, 47853, 20038, 52635, 5958, 45889, 21217, +34504, 56744, 16119, 41676, 30610, 7890, 57562, 18029, 50367, 30845, 9484, +38123, 58237, 964, 35264, 44183, 6734, 50409, 23251, 40724, 1931, 58033, +17949, 30911, 61363, 4689, 42190, 17546, 32871, 56255, 2920, 39477, 22125, +53482, 9851, 32530, 59369, 6471, 39048, 26808, 55960, 2412, 48915, 20495, +28675, 44157, 4360, 55570, 10222, 34027, 49050, 1524, 54494, 28810, 15303, +44800, 23160, 51085, 10500, 40037, 26431, 57070, 8709, 43695, 26169, 61543, +11974, 32040, 54425, 14191, 46433, 35594, 511, 49833, 17716, 37691, 59005, + 3703, 32414, 54638, 6866, 45711, 23710, 38707, 12616, 61117, 20467, 36703, +48730, 9525, 44069, 11487, 58423, 2008, 29400, 63468, 8437, 32832, 44643, +19037, 60788, 9573, 33618, 58904, 19569, 43547, 12501, 63329, 36941, 10000, +44978, 25858, 64045, 11246, 34388, 46960, 19486, 62088, 9721, 42701, 24168, +54011, 13570, 41541, 22015, 62324, 9686, 50421, 22605, 31323, 54351, 11612, +43945, 22401, 53041, 8357, 32951, 63103, 2441, 41179, 19545, 60602, 29273, + 1329, 37434, 55100, 6088, 33807, 51058, 18392, 43491, 4632, 59168, 27705, +16964, 63780, 32083, 10733, 55083, 19232, 29082, 50384, 6379, 39742, 22926, +56823, 538, 28844, 64733, 7904, 45887, 21535, 31003, 60651, 1025, 42007, +16310, 61832, 25294, 47113, 13131, 40354, 22633, 59279, 10882, 38561, 26838, +41368, 13327, 52879, 3629, 64486, 25173, 43010, 6604, 51647, 18434, 36754, +55942, 9884, 29008, 50075, 1229, 40267, 25529, 54951, 6439, 28226, 47798, +15366, 37001, 59536, 7945, 40940, 25168, 51406, 9947, 39250, 26434, 53926, +11780, 42269, 21941, 62931, 38084, 6378, 32528, 60254, 12379, 40250, 22825, +65429, 17069, 33774, 43603, 14256, 62223, 30397, 17192, 58134, 399, 48604, +30078, 6091, 64620, 21144, 46214, 32325, 10179, 62645, 29436, 6395, 50042, +12249, 28744, 44872, 21071, 50630, 27649, 6213, 35797, 59428, 16357, 50924, +34387, 10796, 55692, 18790, 37097, 50173, 8350, 30511, 54270, 4289, 28649, +49763, 11584, 56471, 28240, 20297, 52643, 5062, 32916, 47102, 16783, 55073, +31481, 19249, 46074, 35649, 8590, 59127, 18181, 37125, 50969, 7640, 32356, +53850, 3916, 48722, 26542, 41216, 5804, 64395, 22601, 44842, 1309, 60753, +38313, 15210, 34183, 65130, 8640, 47989, 31142, 1506, 57849, 22917, 51134, + 5745, 41360, 24927, 60633, 11391, 49635, 22657, 39800, 2968, 45126, 26986, +59607, 10170, 43384, 29418, 15438, 58688, 36860, 6374, 61206, 18668, 33875, +46131, 8522, 59461, 31147, 14391, 51712, 20098, 42879, 12115, 60544, 21059, +40921, 16173, 44129, 23617, 52298, 12757, 46448, 21505, 40298, 1076, 65004, +31682, 17114, 37705, 60775, 8780, 28365, 47898, 398, 61611, 21259, 44470, +34824, 2704, 63474, 22728, 43356, 14510, 52393, 27383, 17605, 60253, 37747, +13317, 56068, 24585, 45857, 7303, 39788, 19877, 49211, 25831, 64810, 10244, +29477, 45523, 7957, 62745, 26210, 48372, 13840, 42340, 23632, 64093, 10535, +41229, 23514, 60515, 6927, 33608, 58515, 17574, 40410, 23941, 61640, 12407, +42629, 20375, 65157, 33980, 3718, 57738, 37204, 19090, 63123, 4175, 47393, +21367, 38613, 1302, 48332, 22118, 57674, 4447, 28430, 63577, 15922, 43146, +24500, 62128, 11020, 28917, 51578, 15099, 42737, 26438, 60117, 9687, 53451, +25905, 41824, 173, 57010, 18570, 30360, 55133, 27525, 19546, 51182, 38061, +14607, 46528, 23459, 56717, 558, 40970, 26389, 51552, 5909, 39886, 26223, +55662, 3332, 31676, 54159, 20359, 48490, 5179, 41220, 23697, 56464, 1986, +39348, 23244, 59706, 5937, 38632, 26712, 55986, 4024, 48449, 26414, 39152, + 1887, 58559, 17664, 33838, 63853, 4582, 40327, 25767, 56055, 12818, 44243, +23902, 53567, 10133, 49115, 21732, 43487, 15834, 59778, 27898, 9580, 62207, +32295, 15155, 49869, 37708, 6862, 52640, 23866, 45138, 1656, 37527, 65362, +15509, 33907, 59197, 11543, 47333, 18864, 35217, 50908, 14603, 33369, 54877, +10233, 44420, 19485, 53539, 30731, 10925, 51382, 3552, 33665, 62959, 6804, +43216, 23626, 48838, 2279, 56598, 20005, 46206, 26720, 39540, 11324, 57944, +20741, 33427, 63462, 2955, 40506, 20639, 58941, 15987, 33988, 61610, 13825, +45941, 19869, 34981, 65304, 1628, 50897, 20782, 30495, 58059, 4389, 43626, +22191, 64920, 1859, 29943, 58952, 7212, 48249, 16565, 29143, 55424, 14447, +42608, 24652, 53318, 1039, 29793, 46745, 7601, 57419, 27399, 4486, 48003, +38211, 20504, 34081, 60320, 9681, 40690, 23793, 51496, 12250, 37101, 55605, + 3130, 47995, 33794, 19905, 57341, 36426, 1747, 55136, 14396, 37741, 63201, +19934, 45775, 536, 40466, 24117, 62068, 3994, 46438, 27379, 16257, 62906, +33549, 13173, 57161, 36901, 19667, 45547, 1750, 36769, 62329, 12932, 42293, +23293, 60009, 412, 39753, 10577, 61676, 28891, 2848, 48987, 38210, 12138, +27634, 63552, 16538, 43035, 24372, 60539, 12937, 38595, 19785, 54644, 11651, +48542, 37244, 18849, 27555, 55218, 6472, 49322, 23799, 40973, 18623, 61632, +11443, 35073, 43627, 16944, 64683, 9922, 39010, 19525, 54105, 32096, 7060, +61626, 35236, 18627, 53521, 4219, 34533, 65485, 20031, 45082, 2057, 52045, +21813, 28925, 44139, 12081, 62915, 27265, 17312, 49007, 35504, 1976, 63849, +26960, 48232, 4182, 30002, 53279, 8291, 64718, 35463, 3115, 59771, 30759, + 6947, 56785, 25695, 41969, 13922, 53919, 4147, 43029, 23836, 55293, 13346, +36790, 52729, 9846, 27442, 59280, 15324, 36565, 49612, 6245, 32425, 62382, +10838, 45073, 31154, 3276, 49400, 34698, 9170, 62913, 26385, 43318, 13874, +56543, 1201, 34423, 47347, 14934, 54637, 33641, 17235, 40588, 1841, 56516, +21155, 46240, 4821, 32369, 53385, 13370, 38809, 21953, 51588, 8891, 47013, +36046, 2817, 52963, 26612, 38930, 5916, 47353, 17977, 53992, 28352, 11518, +49639, 25406, 40968, 10057, 53914, 26891, 64576, 13179, 42888, 33615, 18153, +52482, 37983, 8498, 31762, 56207, 5094, 47291, 19018, 34371, 64660, 1882, +39164, 20787, 49237, 5241, 34306, 58951, 16308, 32311, 49492, 5772, 13498, +33992, 42916, 4463, 61970, 31683, 7163, 52537, 36920, 19680, 65511, 12022, +38693, 21456, 61629, 11142, 47827, 23236, 42164, 8298, 62455, 18234, 31423, +58795, 12191, 44313, 26358, 52260, 8577, 31660, 47282, 20534, 61577, 14563, +44100, 35072, 10865, 65254, 21045, 42692, 12408, 52178, 24259, 44693, 10326, +50057, 17020, 34916, 61777, 6497, 39369, 26319, 64346, 8165, 31743, 47796, + 2786, 36164, 54027, 20279, 45295, 1097, 28778, 58148, 20189, 40860, 9527, +57213, 26600, 42863, 12295, 51243, 28161, 3329, 42492, 24705, 63247, 5856, +39611, 26190, 60085, 2501, 38671, 25651, 63914, 5280, 37824, 58959, 20326, +46142, 27793, 11905, 54640, 36934, 13915, 63820, 26413, 38951, 8153, 61365, +16449, 33938, 54388, 1436, 46010, 28849, 14757, 47523, 24313, 53757, 5934, +42765, 22738, 52602, 3414, 31576, 57388, 9286, 42476, 25301, 39318, 14316, +53591, 8702, 36789, 49587, 17306, 33091, 52326, 13940, 45738, 34515, 19635, +61279, 2265, 44312, 34808, 7914, 62619, 19492, 48540, 36963, 11260, 53974, +21149, 35170, 64301, 13052, 52144, 7302, 27940, 45285, 15330, 53982, 31017, + 1368, 61731, 28089, 16937, 43427, 24715, 65279, 7233, 41767, 16907, 60865, +26206, 47800, 4246, 32684, 52460, 10240, 30180, 54252, 13245, 43022, 31504, + 9368, 58659, 37962, 1070, 52138, 24314, 40583, 5762, 64633, 23365, 48932, +16522, 30161, 53806, 8688, 34032, 46265, 17727, 56999, 23963, 43925, 13896, +53425, 20891, 32308, 58460, 879, 45665, 34517, 6550, 52344, 21248, 47194, + 1796, 42797, 25371, 59333, 5105, 32279, 63308, 12785, 43032, 31757, 15773, +59052, 3123, 51401, 29807, 20320, 54150, 4248, 46906, 21921, 32673, 56237, + 2355, 45715, 15196, 41894, 25675, 57122, 8937, 45749, 23415, 39991, 11531, +54504, 31711, 14733, 37682, 57825, 7335, 49961, 31727, 2942, 53192, 37657, + 7689, 58138, 21292, 41551, 10902, 35121, 56831, 14762, 33381, 46996, 17993, +27474, 50456, 14595, 37780, 53152, 18449, 45364, 8154, 58722, 29387, 18376, +51384, 35675, 5674, 64042, 29862, 17273, 38174, 46118, 6972, 51426, 28166, +18679, 55742, 37715, 4167, 28972, 53989, 18485, 64174, 27111, 14836, 52034, +37423, 3673, 59648, 21108, 36500, 52578, 12197, 27922, 58729, 4255, 42572, +20505, 52926, 30468, 12703, 61354, 36176, 16315, 49719, 25781, 62508, 721, +43637, 25667, 64365, 15339, 28997, 59379, 19462, 44568, 13455, 60464, 22711, +41069, 7834, 36568, 62377, 1925, 32144, 58611, 18548, 45261, 5194, 36658, +50770, 7676, 27758, 60840, 2708, 44758, 22545, 51325, 13739, 40194, 26107, +57207, 9024, 41903, 24931, 55741, 11419, 29803, 62489, 19901, 41112, 10660, +46161, 23285, 63821, 1288, 57483, 22536, 48942, 17198, 27136, 59989, 12574, +28712, 47910, 4905, 54775, 25568, 41784, 1742, 51140, 32694, 13395, 56779, +25563, 39394, 281, 51205, 21775, 38578, 6229, 65063, 17571, 34336, 57072, +12409, 39290, 1373, 51459, 19098, 29857, 55049, 5475, 49981, 26920, 38568, + 3167, 61378, 19403, 31859, 59401, 976, 28185, 43362, 20448, 56388, 3536, +42039, 22586, 57605, 14451, 52044, 24144, 40226, 8562, 64547, 17583, 36060, +46339, 5109, 63075, 32554, 18466, 49628, 3849, 36896, 58606, 17522, 34832, +53905, 10812, 44918, 20898, 57940, 13551, 42210, 22517, 52676, 7604, 47196, +28817, 14037, 34377, 43844, 1332, 58029, 18512, 29410, 50802, 4606, 44176, +15492, 57712, 23375, 50249, 5216, 29549, 44675, 19655, 59194, 9221, 34780, +60393, 11882, 39441, 26872, 63924, 8499, 35917, 49005, 12492, 28544, 50436, +18660, 61318, 5965, 44165, 22669, 59994, 29105, 12395, 62206, 3384, 41388, +24885, 57907, 5711, 39201, 24568, 54233, 13227, 49270, 17811, 32172, 56631, + 4912, 28149, 44726, 16222, 59299, 1827, 41685, 30887, 19517, 55994, 36633, + 3828, 63288, 18364, 47539, 36021, 10590, 57828, 37847, 4720, 47027, 14551, +52638, 23870, 39382, 8453, 43958, 21730, 57103, 15216, 39445, 25468, 60667, + 7035, 35705, 56273, 15632, 47739, 29283, 19989, 42934, 11311, 60153, 18920, +50675, 30790, 8070, 38223, 58184, 3280, 41673, 22354, 64120, 6602, 31031, +51867, 3989, 38911, 26106, 65191, 5587, 49573, 18770, 29222, 55063, 11120, +41359, 25282, 64867, 14262, 36311, 55481, 16036, 34071, 51211, 9748, 28718, +46721, 381, 57289, 21018, 37591, 45697, 10060, 33246, 60319, 14433, 40191, +25264, 62355, 8571, 48782, 20324, 30303, 63763, 4701, 51830, 17762, 33286, +50111, 603, 60172, 25175, 42535, 5631, 62184, 18148, 46492, 27873, 11176, +64926, 38365, 16184, 29801, 54137, 13114, 44873, 25207, 60853, 5600, 40109, +24653, 62784, 1559, 36254, 57773, 10762, 44401, 28881, 3787, 63618, 22932, +34045, 41037, 2006, 62048, 32498, 15182, 49617, 22590, 43539, 3085, 57237, +20197, 33855, 64881, 1406, 42320, 13331, 58998, 23435, 48052, 8488, 36238, +42913, 557, 58329, 32160, 19597, 44749, 10677, 50243, 29555, 5264, 63996, +38144, 15936, 46318, 24379, 63441, 9034, 37955, 47932, 3487, 27997, 58005, + 7715, 40937, 17234, 31377, 55326, 11510, 41233, 4131, 50701, 31790, 8320, +54748, 35081, 207, 48349, 25340, 53392, 15670, 42882, 22148, 51389, 12119, +39648, 24331, 60068, 17038, 31451, 56441, 15378, 42236, 24947, 55617, 10264, +33276, 62868, 1225, 46189, 20073, 31405, 61267, 4366, 45923, 18253, 35055, +53595, 2793, 48004, 29327, 7872, 52665, 36451, 14404, 31829, 45004, 9963, +38285, 50676, 2361, 35971, 58265, 17937, 32398, 45779, 9088, 59166, 30067, +17675, 64701, 37650, 6631, 46899, 16232, 60878, 26669, 42553, 12890, 53253, +25271, 41106, 3246, 48767, 26347, 63006, 17202, 33504, 59303, 9523, 39828, +23261, 45796, 13999, 55725, 25807, 47632, 9420, 36930, 46145, 18324, 55354, + 8858, 48713, 33390, 17533, 60324, 37808, 11459, 32877, 44559, 5381, 58887, +20976, 33576, 54998, 11271, 27932, 51718, 21480, 40220, 10248, 60957, 25560, +45375, 13262, 29964, 62537, 1428, 40462, 25463, 51179, 4097, 36737, 55572, +11757, 31818, 61359, 16675, 37021, 51640, 9468, 65067, 22384, 32716, 46867, +10097, 60476, 34396, 20569, 41934, 611, 47286, 35539, 21492, 65248, 12348, +40746, 25899, 51498, 4724, 41946, 23452, 55730, 193, 45133, 21826, 57997, +17149, 33295, 62971, 2271, 45526, 31351, 15688, 55253, 34516, 510, 48819, +38312, 16533, 31730, 55554, 11602, 44377, 21487, 63383, 9579, 41545, 27023, +60690, 3083, 45915, 21785, 37867, 63705, 9003, 32687, 50405, 23491, 46083, + 8259, 61462, 13983, 49268, 22301, 29689, 42720, 6491, 55155, 27476, 13503, +50870, 30219, 18673, 58371, 35354, 741, 62253, 26755, 53773, 11639, 34133, +64961, 2797, 44668, 19312, 49503, 27522, 1926, 63871, 34025, 6172, 57956, +26015, 48253, 3841, 35038, 44476, 14082, 61216, 27280, 10454, 55592, 34977, +13472, 50979, 25171, 43173, 9985, 59241, 21383, 47596, 12986, 42332, 36555, + 9199, 62195, 20313, 37734, 58065, 4539, 33068, 49198, 8029, 27809, 62486, + 2798, 43909, 23917, 61356, 17602, 33913, 52737, 8200, 27960, 63629, 22140, +48521, 6888, 35696, 57268, 818, 43172, 18362, 33844, 59077, 10344, 44348, +24478, 38800, 11983, 62819, 20559, 31010, 47480, 10720, 29038, 52592, 20971, +40565, 1258, 55727, 35117, 19803, 47575, 4653, 59750, 22529, 38992, 531, +50984, 18262, 32157, 52672, 12621, 41654, 21521, 54716, 6691, 31201, 60458, +15707, 36519, 49783, 9466, 57438, 17328, 47991, 27377, 8584, 56165, 37222, +11403, 60909, 25954, 47598, 10108, 29187, 48831, 16320, 52711, 26355, 38988, +11193, 61485, 19762, 27967, 52787, 16010, 46395, 28715, 6466, 62172, 35632, +16859, 57073, 22718, 44214, 8544, 34889, 59456, 25, 29262, 51342, 18240, +34398, 55132, 11079, 32004, 49114, 20363, 59870, 5517, 46629, 20986, 35664, +57965, 16444, 43082, 24921, 63273, 10705, 39925, 20840, 61417, 4778, 34757, +56860, 7187, 30282, 63788, 3210, 46313, 29563, 10600, 49249, 370, 34186, +65040, 6974, 40295, 23291, 49421, 16556, 29871, 54896, 7151, 36862, 50511, +16715, 28685, 59467, 10165, 43272, 24540, 65218, 15599, 40063, 21500, 60862, +24580, 53204, 6094, 62884, 20564, 29539, 54347, 15573, 43784, 7747, 63656, +24195, 39795, 14366, 52900, 4118, 43651, 27892, 20116, 57614, 33491, 10532, +45635, 4860, 63470, 36186, 14584, 57994, 21713, 44721, 8137, 28636, 52686, + 4686, 43166, 25225, 56681, 633, 33085, 62610, 7567, 41030, 20071, 58693, +27524, 6030, 63341, 38035, 14500, 29457, 54309, 6935, 46942, 28004, 469, +61968, 25711, 49367, 12798, 30371, 47369, 3104, 36891, 61380, 15417, 43060, + 97, 54743, 33198, 16955, 53075, 6237, 48169, 21300, 36536, 56492, 9381, +32430, 62148, 15393, 27906, 49754, 279, 43093, 24266, 57298, 4396, 28064, +42335, 16198, 56051, 2841, 39618, 25756, 51777, 7590, 29095, 62709, 17988, +54801, 9891, 31844, 46776, 2099, 56863, 18613, 32478, 61756, 10853, 48716, +26574, 38534, 14188, 52938, 5006, 47034, 24376, 38936, 9844, 59064, 26356, +40652, 10639, 64007, 19112, 27412, 57425, 6992, 40263, 26654, 53519, 930, +38495, 26254, 51840, 6250, 38765, 20430, 55784, 10637, 30279, 52792, 16917, +40745, 3622, 55328, 18593, 38849, 26965, 44051, 890, 56472, 34417, 11254, +60766, 20771, 46617, 34158, 2205, 64085, 38404, 8119, 28531, 49462, 19311, +45927, 5530, 30606, 50395, 16732, 40789, 23192, 55435, 9091, 36466, 53119, +17253, 44782, 22366, 51687, 12530, 36675, 65424, 17918, 28207, 51542, 691, +36582, 49183, 18196, 45404, 28228, 2041, 62990, 29811, 17065, 49813, 35404, + 1398, 60460, 31092, 17480, 52611, 3108, 47777, 27491, 15617, 53415, 29560, +12709, 57427, 38068, 16905, 30701, 53358, 11048, 40337, 4387, 49729, 19384, +36189, 55524, 2154, 40814, 16188, 53831, 28755, 12175, 49747, 25865, 55131, + 6055, 40907, 22286, 51252, 1777, 58192, 26829, 40766, 5313, 56629, 16558, +36968, 64073, 8187, 32437, 58806, 17199, 42828, 9000, 61564, 25528, 41161, +14199, 48760, 26444, 64290, 10381, 41864, 23894, 61381, 8008, 33857, 49725, +17007, 42601, 23614, 53544, 59, 46597, 20670, 31272, 43588, 4678, 37292, +65514, 20310, 41798, 856, 54118, 30439, 13531, 36293, 58452, 3809, 41503, +22374, 62805, 6018, 30633, 46261, 2460, 54816, 33257, 5873, 65208, 35741, +12827, 55854, 23372, 47672, 1785, 31230, 50821, 13451, 55611, 27492, 18983, +49399, 37634, 7014, 61877, 14379, 41731, 24803, 65107, 1360, 43927, 24699, +39576, 14330, 62001, 27447, 1720, 50102, 34162, 6113, 46491, 23361, 57281, +13912, 31723, 50565, 16896, 46379, 23363, 40835, 14227, 54739, 33795, 17990, +61763, 37482, 20873, 52698, 14070, 29308, 58232, 3876, 34746, 60266, 11928, +42204, 23011, 64341, 12705, 33779, 48977, 733, 39754, 21985, 54857, 6686, +33340, 51368, 3528, 42206, 9143, 39972, 26030, 45626, 12951, 57259, 4225, +41727, 22373, 30510, 48654, 884, 56359, 21794, 33136, 47508, 11794, 60186, +36041, 2149, 50425, 19138, 55523, 31015, 17335, 48345, 1051, 30888, 51178, +10883, 60169, 37184, 16158, 32344, 64492, 13330, 41521, 22485, 50946, 16140, +29834, 54092, 2356, 36246, 52456, 16411, 30863, 50244, 1770, 41625, 22978, +65466, 15974, 35609, 43991, 20087, 54566, 7863, 37547, 63553, 18252, 27411, +48647, 8909, 56291, 22752, 30119, 47337, 8131, 59698, 24828, 39903, 14988, +64411, 5189, 43937, 28107, 17989, 47985, 38384, 7973, 63492, 32844, 19881, +48883, 12357, 36388, 60811, 7012, 50343, 34693, 21444, 63137, 12053, 32247, +57282, 14807, 34930, 49859, 6404, 43126, 24310, 60717, 15669, 29957, 50528, + 6830, 44529, 23605, 40908, 3943, 65024, 18333, 39403, 26944, 59751, 12240, +43017, 21764, 48284, 5469, 53341, 20950, 33173, 51907, 3922, 47320, 35583, +10963, 64689, 20214, 45334, 12695, 59703, 22475, 43292, 14676, 65122, 25763, +41330, 297, 48122, 24132, 62104, 12156, 31999, 58917, 5870, 47007, 21603, +65019, 15967, 40438, 24159, 44928, 5242, 53169, 15696, 41127, 22920, 54930, +14002, 33388, 60114, 9820, 39706, 24973, 56568, 10912, 36988, 59109, 4538, +32475, 62503, 12970, 42674, 28806, 8026, 61568, 38351, 2685, 31020, 46028, + 9520, 56942, 32866, 16103, 62488, 27052, 6858, 59628, 33573, 15719, 54308, +36802, 7396, 57962, 20147, 28334, 45015, 11796, 56690, 22706, 34427, 43179, + 7467, 63239, 36690, 545, 50762, 21432, 41033, 6375, 60045, 19556, 35276, +57899, 14758, 30229, 64993, 11867, 45258, 29551, 20547, 61883, 5165, 43967, +36758, 20969, 65282, 9337, 38638, 26942, 61451, 13913, 47675, 34484, 7669, +53405, 19681, 31785, 50964, 2781, 43993, 24039, 48316, 4927, 54686, 21416, +31490, 50892, 2461, 34047, 55386, 6071, 44102, 16581, 31232, 56612, 4009, +45292, 22979, 58345, 2320, 29051, 64581, 13106, 39535, 26613, 61644, 11329, +51238, 18893, 59340, 28223, 7051, 50562, 31566, 14878, 44646, 23959, 63418, + 7371, 40125, 23850, 56108, 15501, 35874, 44820, 12591, 60487, 22934, 40763, +14470, 51261, 25724, 43245, 3061, 49947, 16443, 39455, 26716, 60532, 7242, +33313, 43294, 3842, 57827, 12442, 45470, 22192, 33302, 56666, 4963, 46992, +19243, 34395, 50091, 11986, 55693, 33325, 7907, 52417, 37772, 19168, 64715, +12686, 32558, 54363, 2710, 44043, 28284, 7472, 65469, 36468, 1165, 59690, +27502, 8293, 50440, 38372, 4520, 28465, 56757, 7860, 46053, 36224, 19571, +51574, 9698, 45426, 28298, 2444, 52691, 37435, 5692, 57448, 19575, 29482, +63218, 13987, 44590, 26237, 58725, 12319, 30472, 56370, 48532, 33477, 390, +64251, 37776, 19568, 33280, 51809, 10254, 61230, 19187, 44888, 37066, 6937, +63014, 18931, 29011, 53852, 9393, 44509, 24454, 39331, 5709, 59003, 22407, +35320, 62034, 15766, 43092, 23638, 40607, 2494, 55501, 21550, 48007, 5826, +37313, 60734, 9868, 34219, 48296, 13104, 64947, 23349, 43051, 5196, 61041, +18744, 35962, 58199, 10237, 31352, 48270, 3927, 56763, 13522, 41252, 25012, +51224, 1942, 32974, 59612, 13700, 44322, 35205, 4703, 65177, 19003, 34806, +44120, 2636, 55940, 31928, 19515, 49001, 10283, 60433, 35655, 2130, 58110, +27169, 16225, 38129, 56306, 3121, 29784, 51980, 19256, 44225, 15288, 28650, +47386, 5696, 53837, 20291, 45372, 1776, 40628, 22299, 59514, 17364, 38608, + 3509, 52821, 35808, 10474, 62583, 20541, 29923, 57543, 11625, 43727, 22653, +56160, 7782, 31745, 49546, 1085, 64537, 29177, 16900, 37991, 58179, 9074, +44850, 30330, 14636, 60135, 25421, 41976, 5161, 55920, 25199, 39461, 2842, +53085, 32397, 7304, 46234, 19367, 60376, 35106, 6684, 40006, 26826, 51250, +17508, 38529, 12934, 51989, 31489, 3233, 53682, 35877, 9841, 62821, 32495, +20281, 58741, 6152, 44285, 25930, 51992, 3607, 42374, 21490, 64490, 1303, +46790, 29039, 14892, 51431, 27977, 20061, 48243, 183, 53880, 37717, 14843, +27260, 58911, 16589, 49554, 27172, 4350, 53938, 38486, 10898, 37268, 46993, +19721, 52559, 5491, 39279, 24582, 47103, 14724, 38099, 64344, 4174, 36278, +46773, 8351, 61192, 19886, 32382, 48491, 10689, 43803, 23962, 64059, 13917, +46775, 25515, 42472, 1582, 51392, 26568, 47055, 5716, 41244, 22645, 58498, + 9743, 32170, 47969, 17609, 59944, 2681, 31406, 46063, 17396, 54623, 3891, +42581, 30261, 15456, 64464, 23888, 42187, 8805, 60583, 23237, 39215, 13785, +61912, 26763, 38948, 10209, 45013, 18947, 63630, 27425, 11368, 59254, 36395, +20645, 47916, 9311, 53716, 38103, 14206, 31732, 51748, 10306, 45920, 36000, + 5131, 55275, 22151, 42163, 2867, 35932, 44816, 13233, 55949, 21851, 36505, +61799, 5142, 52834, 17815, 33539, 51253, 9409, 46763, 31603, 196, 57900, +24992, 42000, 7632, 56905, 24305, 39226, 9297, 58756, 20488, 32518, 63546, + 9797, 42217, 21274, 48320, 14731, 64923, 36797, 16932, 29808, 61209, 2164, +50401, 27785, 16102, 38415, 54195, 8381, 27400, 62652, 3067, 29623, 45299, +21759, 59529, 8960, 30220, 49015, 16791, 41832, 23673, 58250, 11923, 51884, +19693, 31069, 43707, 12653, 55582, 36319, 16452, 62965, 21963, 47764, 11274, +31811, 61055, 1625, 43301, 25714, 63310, 17182, 33824, 59130, 14035, 47708, +27733, 15839, 52123, 38131, 8534, 32383, 50295, 2052, 41208, 20393, 62138, +16213, 24036, 55322, 14772, 28569, 49840, 5556, 59637, 16047, 46755, 34649, + 3005, 27581, 57491, 15946, 34892, 49952, 3434, 41492, 23276, 64323, 13600, +52363, 26465, 41268, 11640, 54013, 4260, 29152, 49091, 7574, 63286, 26728, +45870, 8924, 31008, 57806, 16646, 27434, 53131, 3967, 44398, 24972, 39697, +11265, 55971, 20529, 28281, 48421, 7879, 44057, 24468, 53629, 15250, 40039, +23406, 62604, 5695, 35286, 55337, 17141, 41920, 6767, 50637, 27773, 15956, +54341, 38273, 9357, 28337, 61592, 21961, 46694, 8503, 40459, 25736, 54607, +14219, 31063, 50749, 12632, 37064, 54167, 6454, 44462, 22390, 64046, 8565, +32649, 58543, 878, 37933, 62049, 10746, 42116, 24032, 64750, 13694, 33511, +56081, 5474, 44396, 25526, 64376, 13841, 40386, 24655, 46575, 998, 49788, +16498, 31509, 53909, 2521, 40698, 25066, 61872, 15977, 36643, 44734, 13672, +54000, 34924, 2723, 28157, 62763, 20271, 43016, 1496, 52924, 21741, 31422, +47041, 8841, 63082, 29067, 18652, 59047, 36161, 11527, 51324, 28990, 14175, +47237, 21204, 64049, 2116, 43452, 25440, 61253, 7518, 41627, 24959, 59917, +14818, 28761, 47312, 101, 51240, 26936, 38737, 11183, 61217, 17968, 36363, +50098, 12267, 31642, 53626, 16297, 37732, 60953, 6087, 34798, 45537, 10342, +64288, 21466, 30587, 56004, 7124, 45177, 32358, 12060, 63502, 38050, 18804, +27843, 58557, 2243, 30884, 64776, 13022, 42491, 21765, 60700, 222, 54791, +31806, 10450, 50829, 27069, 16392, 55215, 30226, 1944, 59557, 27893, 17225, +53016, 31551, 3824, 37765, 53834, 9984, 60941, 23512, 38808, 8895, 62665, +18072, 33346, 54482, 962, 42707, 23666, 56657, 7128, 40432, 23094, 55679, +13121, 33183, 48371, 19950, 59748, 11472, 35809, 45845, 1330, 54866, 33621, +18313, 49943, 9649, 45916, 34294, 157, 57389, 22159, 49230, 6663, 35409, +52281, 17336, 45451, 29032, 980, 62352, 37256, 15694, 27802, 63537, 6479, +41013, 25344, 60286, 15993, 30987, 47198, 8842, 63245, 29527, 15838, 58451, +33310, 1668, 49301, 11252, 42929, 19955, 29236, 45880, 2330, 59501, 29023, +14753, 64632, 34779, 10654, 53267, 19897, 32708, 46838, 1327, 61757, 18818, +30665, 52626, 6293, 40552, 25387, 54738, 774, 29909, 52131, 8397, 40932, +25494, 54248, 10445, 34881, 43724, 6685, 63357, 20556, 31607, 58672, 14003, +37598, 46828, 16218, 53461, 4712, 39172, 26871, 56606, 863, 35278, 60927, + 9801, 39040, 25367, 47676, 3482, 59227, 22344, 48707, 6137, 27900, 53774, + 2349, 42143, 25359, 57778, 14893, 41210, 23060, 55412, 12952, 39433, 6373, +54286, 24367, 43191, 8081, 35888, 60686, 3353, 42731, 22781, 61692, 13101, +54110, 26973, 38669, 4746, 43640, 11054, 31403, 61420, 8088, 42992, 23465, +32135, 41339, 8794, 65162, 18536, 37763, 51033, 9811, 30399, 61866, 14777, +46649, 29570, 7176, 49045, 36674, 1605, 61283, 20369, 33337, 44859, 13946, +56546, 23437, 38827, 11192, 54346, 19884, 34765, 47383, 1515, 63738, 38009, +19697, 49475, 8327, 57026, 32274, 199, 51920, 35164, 14087, 64050, 30562, + 2591, 59923, 34868, 9377, 50074, 30011, 18695, 46451, 10213, 64762, 31066, +19268, 58008, 37480, 1239, 46708, 18172, 57447, 32828, 4052, 51322, 16528, +30659, 59096, 719, 42597, 21784, 64968, 4522, 45344, 29392, 18802, 61689, +34268, 10405, 40657, 26462, 53666, 12893, 46126, 27483, 16523, 35306, 52810, + 3341, 39344, 25974, 49563, 11548, 30753, 53628, 18747, 42097, 7474, 56722, +32026, 18067, 59841, 34971, 8245, 63340, 20037, 35769, 51109, 8968, 30009, +55072, 4174, 27278, 48854, 7333, 60587, 23195, 46422, 12141, 34250, 56510, +16610, 39076, 7512, 58525, 17851, 36726, 50437, 12941, 42075, 1705, 48635, +25106, 57765, 4187, 36973, 54809, 9094, 40993, 23682, 57973, 10799, 33359, +55512, 20104, 45997, 4855, 37187, 57136, 18773, 40218, 12614, 63574, 23399, +43142, 2378, 56756, 30203, 7377, 62369, 24013, 44067, 4034, 55931, 23409, +41486, 13517, 57013, 25238, 39536, 4768, 51159, 18507, 35866, 61143, 1446, +42834, 22774, 52163, 5829, 34003, 50504, 11702, 41193, 24985, 51474, 4656, +33137, 49251, 13916, 44309, 27326, 18193, 62706, 38357, 6837, 33940, 51790, +19277, 39682, 5967, 56910, 36994, 12363, 58946, 27306, 17799, 33212, 45121, + 5045, 56702, 20726, 31472, 52466, 10814, 39670, 26119, 64249, 13177, 38712, +26874, 52108, 10184, 28552, 63454, 276, 40559, 24591, 50679, 5820, 29009, +62539, 16163, 41780, 25873, 59431, 4095, 30621, 65174, 16376, 51651, 25498, +41406, 12107, 58478, 27801, 3427, 56283, 37300, 12926, 51280, 21511, 30796, +55078, 2999, 47485, 32731, 20775, 52542, 1197, 42786, 22981, 56070, 14030, +39092, 24563, 52279, 6407, 47053, 25837, 64352, 16628, 34310, 60094, 8789, +53474, 26086, 40608, 6430, 49984, 22227, 39193, 17424, 48726, 4508, 63178, +29062, 16501, 50657, 36921, 4771, 45312, 23810, 57609, 13713, 35984, 62587, +15867, 42953, 22632, 59143, 4494, 30710, 48323, 21600, 56035, 15498, 35871, +52196, 493, 42856, 28124, 7269, 57059, 34789, 20262, 63747, 12139, 42243, +20981, 49534, 15211, 31662, 53120, 5107, 62743, 18014, 43086, 33070, 14522, +37511, 63939, 15904, 46557, 32017, 19554, 51210, 6820, 37714, 64187, 4298, +32879, 50956, 19056, 46344, 30940, 41, 65401, 20918, 49292, 16852, 30204, +55606, 6314, 39210, 24881, 47017, 9682, 64861, 22200, 50582, 58093, 2742, +35846, 52311, 20164, 46288, 1389, 57757, 20921, 29517, 54101, 5100, 43122, +24227, 55952, 68, 40493, 21256, 60356, 17126, 33742, 57754, 12174, 30638, +48045, 6346, 65421, 25110, 42006, 410, 60591, 26003, 40286, 5074, 59727, +17606, 43327, 28901, 10286, 35346, 60027, 14886, 41793, 24112, 61880, 17351, +41159, 6200, 46496, 23874, 51017, 16143, 41566, 21602, 57050, 808, 33429, +60268, 20648, 42330, 3788, 49118, 28937, 9782, 63366, 25415, 39439, 10848, +49173, 19919, 35143, 63730, 11685, 39065, 26584, 52518, 7265, 38705, 25478, +57066, 15624, 49272, 1278, 42489, 23115, 59978, 4959, 48280, 19625, 37139, +57480, 7282, 30262, 60141, 18791, 45713, 6532, 55450, 22998, 39305, 363, +61188, 21626, 29384, 48683, 3075, 42857, 12939, 55311, 26813, 41761, 6596, +46516, 17476, 61058, 33711, 12727, 38414, 58826, 18053, 32949, 42514, 10493, +55625, 29708, 4842, 48198, 26246, 61243, 19596, 44736, 30375, 3624, 54736, +28117, 17057, 61472, 33335, 9445, 43942, 22951, 62518, 16025, 29670, 52896, + 5133, 47793, 26340, 39160, 1417, 50201, 17162, 64727, 29585, 10398, 45288, +25037, 49285, 6677, 55660, 19864, 32925, 45549, 14418, 52836, 22075, 41478, +10401, 33484, 47278, 17380, 63363, 1999, 31638, 46651, 15757, 59641, 32746, +11002, 49349, 20436, 28423, 57551, 9025, 29906, 60563, 15013, 42756, 22571, +62241, 8358, 35841, 57366, 16423, 29111, 61606, 7275, 34936, 48310, 2946, +57758, 23207, 45742, 10055, 65364, 26232, 44998, 14804, 50032, 28953, 2463, +38194, 64528, 8492, 49191, 26082, 39333, 13768, 60382, 3171, 44318, 21969, +50864, 5977, 45767, 20021, 59481, 3483, 37201, 50253, 18301, 30894, 57943, +10972, 33921, 53644, 19382, 43811, 6555, 55767, 12154, 39704, 22874, 52782, +13120, 43493, 29219, 4869, 62614, 37922, 15975, 31218, 47406, 10641, 64872, +24205, 40820, 7071, 59543, 17854, 35392, 43223, 11580, 58264, 18745, 37608, +65049, 7710, 31686, 48880, 3649, 61124, 17207, 43007, 36856, 10456, 30225, +55548, 4210, 45189, 24407, 39045, 12966, 57642, 19385, 30682, 61410, 2901, +54215, 26252, 43550, 12946, 34100, 55716, 10178, 41704, 21712, 64231, 11389, +34198, 49471, 3375, 45156, 27551, 7718, 52881, 36455, 19837, 64463, 12087, +41534, 3160, 60365, 29250, 13212, 48971, 21558, 65343, 11004, 31019, 50612, + 1906, 39737, 26308, 54793, 6658, 61780, 26043, 46223, 11620, 41175, 26660, +51366, 8576, 28431, 56926, 537, 44777, 29663, 9308, 60121, 36054, 11992, +56149, 30200, 15761, 48370, 27757, 9978, 61879, 36524, 12386, 56200, 26825, +40302, 9283, 58311, 34372, 14761, 48222, 19792, 59253, 929, 42405, 31635, +15495, 38067, 27486, 17783, 55954, 29468, 11610, 63724, 17268, 36299, 50309, +12754, 40474, 22567, 59275, 10718, 39132, 26370, 52579, 7937, 28396, 54254, + 3918, 42649, 23938, 56096, 14890, 39827, 21399, 51582, 9149, 31456, 45330, +13096, 55839, 20696, 30073, 49276, 6356, 57367, 24535, 46729, 3073, 30686, +54327, 7039, 38744, 21938, 57658, 12799, 34155, 59156, 4497, 32283, 63157, + 7556, 43723, 25981, 54185, 8685, 39502, 23334, 52733, 13879, 34962, 53840, +20484, 41828, 5026, 59361, 26740, 52771, 2395, 42943, 24153, 56194, 9766, +33167, 62009, 17395, 46844, 8717, 40043, 26364, 58240, 13397, 52288, 29561, +16906, 33234, 65207, 2696, 40790, 22615, 50768, 12394, 39935, 26579, 63303, + 9617, 32090, 58080, 16966, 46997, 10122, 35042, 63699, 15461, 52219, 23643, +38882, 4547, 53224, 21519, 28855, 56707, 460, 42284, 24622, 52259, 9491, +29162, 63770, 1808, 47507, 19108, 35405, 65506, 13932, 39538, 129, 51548, +11729, 35310, 64383, 20496, 45740, 6165, 36495, 47643, 18021, 56727, 30529, + 698, 46792, 35067, 11283, 58761, 20563, 44655, 14225, 61619, 24447, 42540, + 8128, 34709, 51828, 2711, 58575, 30434, 16355, 37758, 47911, 4464, 65490, +25646, 38562, 629, 60381, 18942, 49829, 29926, 9166, 51663, 36483, 19395, +54802, 6461, 43390, 24509, 65215, 3145, 37449, 46549, 13845, 54671, 35598, +18246, 47746, 895, 53402, 37472, 17736, 27597, 46275, 2503, 52203, 36892, +19357, 53978, 11641, 42129, 29219, 13717, 56232, 35152, 1015, 41218, 21703, +59835, 9452, 33970, 55117, 15964, 41896, 23625, 55964, 94, 45978, 23138, +49688, 17363, 30342, 62975, 12323, 34813, 57099, 15453, 41036, 24822, 62442, +12783, 47486, 4976, 41886, 22686, 64763, 2932, 38859, 23302, 49739, 17463, +34701, 57921, 1890, 31778, 47736, 7845, 54848, 33891, 19743, 50155, 1438, +60383, 21042, 34130, 43546, 3843, 54202, 20149, 28775, 50142, 9734, 62095, +27418, 4496, 50569, 28686, 14816, 36168, 57104, 11533, 41361, 20480, 32697, +58092, 483, 53749, 22386, 39605, 14067, 51928, 21162, 63539, 1143, 36268, +50895, 11691, 44271, 24113, 40028, 9047, 59629, 22461, 39731, 6724, 60259, +27001, 48261, 2204, 54154, 18529, 28816, 61075, 11891, 33267, 58438, 17768, +47554, 1523, 32177, 54844, 23811, 45457, 17649, 37373, 53446, 5454, 44352, +24627, 40764, 15477, 60142, 22974, 48229, 9399, 44206, 24288, 38664, 3776, +58609, 21776, 38523, 2189, 64514, 18832, 34899, 47140, 13403, 61889, 22786, +41188, 4094, 50118, 24428, 40192, 981, 59618, 18410, 34937, 54719, 3047, +42528, 21993, 47956, 5509, 52932, 25395, 44716, 2295, 62762, 26277, 38566, +11973, 51967, 23106, 60221, 5688, 46328, 63079, 8650, 37655, 49456, 4019, +41652, 22890, 54639, 6535, 32862, 62700, 2594, 45092, 34243, 19678, 64582, +12854, 47613, 37177, 16171, 32043, 63506, 8530, 46462, 29687, 3038, 58255, +36793, 17828, 62673, 26472, 48242, 2638, 35914, 64827, 15199, 42247, 33617, +11961, 62429, 23326, 45349, 15566, 64627, 26645, 43751, 1618, 52536, 20951, +40162, 14842, 54825, 22938, 39497, 11932, 49771, 17871, 35122, 58855, 2117, +30725, 61072, 7119, 43497, 15175, 62080, 23735, 45340, 12846, 39970, 21142, +58213, 6023, 48291, 22255, 39487, 1797, 51994, 20612, 36077, 64302, 3646, +32120, 45577, 7090, 36373, 56622, 10920, 44125, 25502, 54711, 8005, 33499, +61445, 1470, 47871, 19921, 35528, 51219, 4074, 43264, 25343, 58942, 5986, +39874, 25101, 45828, 9257, 60274, 33113, 14394, 64906, 36586, 10385, 47694, +20642, 62335, 5072, 35362, 49758, 16330, 41111, 24704, 57850, 8362, 50918, +26894, 43569, 16048, 58885, 25878, 47608, 8175, 32810, 58014, 14375, 27469, +63521, 4549, 40558, 22340, 52129, 13495, 65334, 26868, 41628, 7882, 33771, +54694, 3895, 30363, 49621, 18052, 60538, 22187, 40981, 13860, 35397, 61907, + 9554, 28819, 51383, 18326, 42118, 13399, 54680, 26475, 40310, 5728, 58118, +22719, 41039, 3807, 61791, 26225, 40397, 14318, 53164, 19119, 30480, 56400, + 7481, 27296, 43848, 4172, 63974, 25635, 40067, 13361, 58196, 6468, 32351, +65011, 20962, 40429, 9544, 59473, 22627, 32668, 63815, 5753, 47895, 21016, +43793, 16304, 61815, 32914, 6504, 51485, 22521, 43520, 4320, 62236, 30380, +12646, 36783, 61290, 10333, 32969, 58361, 4774, 41928, 23526, 48979, 1198, +31531, 55875, 7554, 43521, 32561, 16868, 54717, 35481, 8346, 45649, 26373, +57340, 13988, 29437, 62087, 9120, 41288, 21364, 63957, 14329, 39580, 24368, +59716, 9111, 44823, 18386, 29145, 55318, 8637, 49454, 27324, 13907, 63083, +33245, 328, 37637, 44641, 13034, 56708, 34793, 19661, 54725, 2062, 46347, +23222, 62575, 29167, 8642, 48361, 24896, 42014, 7324, 60736, 25584, 43407, + 8145, 47814, 28654, 15208, 55365, 31562, 5044, 64973, 17092, 49764, 36422, + 670, 55112, 25893, 46374, 14920, 38586, 25292, 43424, 8493, 55438, 37337, +21736, 51022, 5287, 43962, 25276, 60709, 14594, 39772, 5975, 62483, 28309, + 9929, 57768, 32032, 19888, 61582, 3336, 46213, 36108, 6258, 57456, 31952, +17849, 63197, 10887, 50140, 26927, 44048, 14169, 55084, 23958, 41860, 5763, +53464, 26288, 38919, 10836, 55771, 18276, 32880, 64991, 13210, 44803, 26050, +52199, 6218, 40649, 24950, 60536, 13630, 38833, 23645, 63857, 10597, 38618, +21597, 49809, 7394, 56987, 26949, 39488, 10095, 49182, 20186, 33889, 44713, +27219, 13663, 58923, 31259, 15265, 60673, 25492, 45863, 11352, 28959, 48709, +17104, 58368, 6263, 31791, 43367, 2095, 59815, 24629, 51627, 10745, 40591, +20899, 61765, 16617, 47810, 32659, 5370, 52875, 11811, 41748, 22988, 51242, + 9521, 27899, 56511, 738, 51634, 21093, 39655, 5589, 50059, 31289, 10881, +56191, 24960, 42109, 8031, 62186, 26805, 38660, 2759, 48548, 27038, 64312, + 5308, 44186, 24226, 50826, 16183, 40243, 21254, 56782, 36114, 322, 30868, +51906, 8177, 64164, 34441, 15520, 45966, 25443, 60640, 12004, 44781, 24731, +54708, 10815, 29055, 48216, 14875, 61158, 24790, 49623, 146, 39405, 21247, +59436, 13314, 47039, 29484, 17041, 54025, 37826, 10934, 29316, 57092, 18041, +39940, 12793, 50332, 33858, 19523, 55926, 1215, 30470, 49464, 19375, 45232, + 2792, 40834, 24001, 55587, 13178, 39490, 22312, 53898, 11191, 30453, 56192, + 5693, 44255, 22757, 38720, 3289, 62238, 21892, 38503, 5416, 56029, 23478, +42709, 1287, 52922, 38051, 16477, 31583, 55360, 6854, 43504, 24474, 38898, + 2972, 59578, 23176, 48725, 16399, 37387, 63865, 12805, 39052, 5418, 47881, +26181, 53933, 1121, 42672, 22816, 56322, 6993, 32318, 59939, 3191, 44877, +21015, 63677, 15060, 30931, 54037, 12920, 46227, 29133, 8660, 58318, 34261, + 500, 38201, 62779, 10601, 50008, 34458, 19117, 51482, 31450, 8055, 59498, +21816, 34212, 49152, 14825, 43408, 5178, 55581, 25330, 44773, 642, 50170, +17590, 40248, 25840, 54512, 3721, 30841, 49327, 11902, 57574, 26705, 39006, +10851, 48554, 17507, 52702, 21050, 44029, 6236, 50571, 27701, 16492, 37542, +55230, 8976, 33609, 65431, 11646, 27944, 48137, 21285, 61057, 1996, 29077, +59320, 20468, 49321, 10142, 36303, 52190, 767, 42755, 25185, 53254, 5661, +38653, 26497, 56053, 3213, 48446, 20494, 35746, 64373, 5408, 42747, 31879, +16247, 58083, 37925, 7462, 47683, 23247, 60165, 16483, 29756, 46486, 6589, +64024, 26284, 39548, 16882, 43647, 5426, 53478, 33947, 18939, 65272, 11839, +29537, 50280, 2585, 37752, 62413, 17920, 35403, 58804, 9557, 44879, 20999, +34809, 47398, 8268, 29479, 62005, 19862, 40676, 12013, 51608, 4223, 65427, +19378, 47657, 30233, 258, 63240, 16654, 40615, 31004, 8811, 53807, 34334, +20579, 51439, 11483, 47079, 36265, 1127, 50163, 16877, 34352, 54287, 12863, +29173, 51895, 19695, 42986, 137, 47622, 35119, 19396, 60691, 7893, 33649, +47525, 12455, 60334, 32164, 20758, 58032, 2612, 43631, 23982, 51927, 6579, +39283, 21782, 56454, 8465, 32686, 62669, 19952, 49831, 8913, 31890, 57649, + 1410, 43986, 26533, 54508, 13555, 41163, 23926, 45944, 3831, 64542, 18117, +30827, 53717, 1782, 17014, 56431, 38322, 7330, 48362, 34598, 599, 51973, +18307, 35414, 56420, 8928, 41990, 24826, 54615, 14351, 49480, 21552, 38782, + 5835, 44080, 26771, 54808, 816, 28553, 43138, 8244, 59636, 25410, 39415, +15924, 55319, 34513, 4445, 59875, 37969, 16201, 32488, 43682, 13099, 60950, +35838, 17723, 53664, 37352, 4064, 60225, 17083, 30882, 50774, 11318, 45355, +24295, 55712, 13272, 38522, 20785, 57238, 10437, 33989, 62484, 4471, 46439, +28591, 10716, 54678, 38330, 18479, 48435, 28016, 3199, 37819, 55706, 7667, +31821, 41009, 19390, 63099, 5466, 34621, 58700, 18571, 42990, 9402, 38650, +22547, 63528, 15551, 51021, 5553, 41802, 23033, 62457, 3614, 41242, 24840, +64179, 5360, 44614, 23552, 59565, 2256, 30235, 65441, 10576, 40600, 26055, +62468, 11684, 35109, 58187, 17210, 50757, 30865, 5949, 59403, 25752, 43548, + 2338, 63430, 36780, 12415, 27459, 60723, 14349, 50055, 26144, 45678, 11112, +53243, 27018, 40871, 13133, 62851, 20120, 28867, 49257, 10249, 60246, 19215, +34340, 48895, 9224, 57519, 21465, 45506, 11662, 31628, 55907, 409, 27826, +52905, 21058, 43718, 9249, 59385, 19064, 31512, 63479, 11342, 40731, 25894, +49889, 12355, 38870, 25243, 52450, 9883, 37840, 48298, 1511, 34205, 64857, +20198, 42952, 15548, 52104, 23767, 47297, 13111, 28346, 44703, 2306, 61941, +15517, 35986, 54057, 19890, 42082, 1673, 56573, 29005, 18243, 51603, 38172, +13246, 34399, 62038, 15008, 37613, 57362, 9853, 34755, 63031, 14125, 40203, +23464, 46173, 1458, 64737, 20125, 32355, 59664, 2937, 38976, 26353, 63864, +14138, 34726, 57473, 2342, 43212, 24513, 51814, 14943, 36178, 53620, 6239, +40287, 17612, 52257, 36624, 12340, 44149, 4197, 63238, 30217, 16615, 33572, +59888, 11645, 44748, 22027, 61046, 10005, 32412, 42531, 14900, 53558, 29866, + 9509, 46552, 23384, 61148, 2414, 41187, 19728, 54899, 31048, 9258, 49027, +38088, 3288, 53492, 23716, 42571, 8366, 32801, 60543, 13772, 46894, 22462, +58601, 3431, 36135, 46800, 14977, 57069, 34384, 10791, 27585, 53588, 4604, +40367, 23466, 50410, 1960, 60665, 27706, 15476, 53727, 33035, 7059, 48569, +23868, 56957, 15568, 33026, 40959, 10320, 58066, 20533, 34562, 47118, 12538, +59752, 23214, 42728, 2098, 63874, 26103, 40771, 15090, 58833, 23099, 30730, +64292, 7083, 42600, 25734, 59791, 9694, 33943, 64864, 14790, 28160, 53319, + 4799, 41568, 24887, 55934, 1340, 29427, 44975, 8921, 49935, 17529, 33961, +63603, 9462, 41740, 26171, 60923, 1809, 30613, 48685, 17079, 44041, 3664, +39789, 26230, 51581, 15316, 39239, 20712, 59972, 4626, 34964, 62073, 9049, +30075, 51415, 21094, 41972, 8270, 61022, 35448, 3143, 50498, 29451, 20050, +65325, 12923, 42417, 26886, 62065, 4835, 39532, 23342, 63876, 1233, 38999, +26294, 61187, 11395, 45592, 23063, 65039, 15391, 34476, 57169, 12913, 35956, +50611, 19222, 44161, 1453, 64362, 20017, 28988, 45098, 10908, 49416, 22622, +63497, 7500, 47225, 27714, 2087, 58439, 28848, 14623, 44723, 21648, 48649, +36809, 523, 65160, 20293, 40912, 6418, 60668, 26850, 42855, 1168, 52053, +29414, 12331, 37573, 49755, 15594, 65302, 27191, 5775, 58583, 33605, 13589, +61797, 38491, 18106, 27880, 59649, 562, 50785, 15437, 46632, 25839, 40655, + 2307, 51502, 25523, 55238, 4264, 46024, 33528, 18009, 38253, 57186, 12098, +32404, 52428, 9812, 45377, 21251, 55250, 13835, 35048, 42264, 16375, 51675, +22349, 47163, 6311, 43486, 21395, 52794, 3777, 27388, 43956, 8852, 64281, +35960, 19081, 49958, 10048, 32337, 45958, 18782, 52647, 38294, 824, 31646, +58342, 9302, 39466, 20896, 64812, 2496, 32191, 50292, 8440, 35845, 56526, + 3975, 45043, 24847, 41164, 2045, 64254, 28332, 14844, 53698, 36985, 6382, +63129, 18414, 35337, 45365, 8321, 57313, 32140, 16921, 50324, 37648, 4591, +46598, 21400, 57547, 2093, 34136, 62778, 19158, 43985, 5087, 60642, 28696, +16838, 57351, 27289, 7184, 50841, 37461, 4385, 59056, 32452, 6798, 60813, +36970, 16761, 55719, 25121, 41509, 5925, 47479, 12747, 64450, 25246, 39163, +10050, 62567, 31617, 3631, 56290, 27319, 7801, 49108, 30072, 2368, 52895, +28069, 18693, 48422, 5157, 55405, 30209, 16878, 37827, 53590, 8833, 43162, +24057, 56199, 7854, 44952, 21787, 53477, 11243, 30333, 62012, 18194, 41558, + 3800, 59017, 30508, 19608, 61646, 33791, 8736, 47207, 24184, 56021, 14826, +42058, 21369, 54224, 6867, 40301, 26536, 56442, 2667, 34280, 46156, 17523, +63493, 27594, 551, 57618, 37095, 13440, 50853, 33689, 16697, 53054, 37260, + 5036, 65407, 27567, 15280, 57864, 35245, 11438, 61850, 20025, 49856, 28934, + 794, 51766, 38193, 9117, 29599, 45321, 19521, 54941, 28254, 6012, 38230, +59894, 17105, 32387, 48305, 11996, 64149, 29984, 17372, 38010, 55815, 3995, +43839, 19250, 63772, 36045, 1460, 43753, 26940, 60869, 5449, 49014, 24990, +42741, 3719, 56525, 28288, 6521, 52052, 36492, 18946, 49715, 7519, 35079, +55286, 4290, 46264, 13584, 39500, 22139, 56902, 2493, 38690, 23455, 51067, + 5821, 37462, 57975, 17262, 32454, 62493, 9645, 43712, 22442, 65260, 15681, +37487, 56788, 5419, 28882, 46160, 20201, 52958, 12541, 44146, 22642, 57236, +10124, 34601, 64604, 21205, 53766, 12169, 33163, 56424, 6848, 46602, 31386, +19281, 50210, 12493, 37815, 56672, 269, 34481, 52994, 15359, 45322, 27049, +16419, 37408, 57290, 5442, 41020, 23095, 53988, 10339, 44747, 20360, 58107, +13528, 30824, 46418, 18221, 53000, 7648, 34631, 57954, 3519, 32029, 51251, + 8949, 45091, 22468, 62876, 6534, 30558, 57511, 15067, 33638, 47346, 6006, +61161, 24089, 39367, 3512, 52550, 31328, 16695, 54160, 38039, 10579, 33120, +51275, 4917, 61686, 27407, 10073, 52110, 32712, 14114, 53767, 22703, 46403, + 9976, 31404, 63045, 14549, 45186, 24898, 59768, 2536, 32206, 43299, 17780, +52632, 38041, 11337, 27082, 49766, 4726, 32912, 54070, 10572, 43535, 35136, +20379, 57805, 8139, 31912, 65408, 11845, 39259, 19313, 60730, 29310, 8950, +59012, 27112, 2078, 49512, 27592, 16421, 60885, 37328, 696, 30355, 49317, + 7708, 61942, 28038, 4232, 57621, 36476, 17280, 61387, 32212, 13418, 59981, +38304, 15762, 48724, 28088, 1350, 54669, 37829, 16811, 58737, 28595, 7516, +61376, 23572, 48217, 15148, 35771, 55178, 5913, 42807, 24210, 46686, 15822, +60925, 22329, 41847, 14781, 33072, 61958, 12697, 30098, 54993, 17482, 44620, +33566, 4351, 51694, 20443, 28615, 47609, 12329, 60048, 24506, 40262, 2824, +64608, 28812, 10589, 55251, 26784, 39302, 12927, 54130, 29732, 7793, 37523, +53281, 15717, 34405, 49636, 8405, 43890, 35949, 22448, 61486, 11714, 29680, +48920, 17429, 42413, 22357, 53608, 3574, 30456, 45612, 10890, 57837, 23220, +30573, 44666, 4977, 52790, 22540, 46971, 16174, 36285, 43929, 12046, 59165, +33417, 16802, 65150, 38092, 8442, 44311, 24579, 58197, 11156, 36615, 61563, + 5849, 28210, 50635, 18814, 41207, 11846, 31604, 58842, 726, 40452, 25449, +46973, 5444, 51135, 20924, 28504, 46819, 12557, 55361, 442, 41400, 26048, +64407, 5335, 39130, 26956, 60644, 1555, 38770, 24674, 65250, 12918, 48469, +19558, 28349, 53778, 6002, 37620, 49570, 11915, 43773, 22709, 59916, 6726, +27876, 62864, 12162, 29428, 49987, 17992, 45233, 32962, 1593, 51885, 25984, +44898, 5725, 33664, 55893, 17558, 27174, 63155, 13221, 35267, 59195, 1806, +43187, 16063, 64491, 24143, 44682, 121, 56117, 28829, 19754, 42525, 5452, +58031, 33468, 10103, 52132, 24841, 41857, 11614, 30892, 58540, 18167, 50122, +10872, 39451, 21232, 62750, 14048, 36255, 45913, 17266, 65069, 31669, 10354, +45431, 24844, 61250, 16470, 29730, 42711, 21270, 62254, 8518, 49478, 26971, +44119, 16313, 55610, 11332, 46662, 24395, 40499, 2007, 49518, 21083, 39463, +13769, 50990, 34411, 3150, 53991, 27205, 18961, 62171, 35175, 304, 58470, +38023, 7658, 29182, 50353, 17717, 47072, 5935, 30026, 42817, 692, 59516, +24298, 41262, 16148, 65076, 2530, 29434, 58973, 20426, 46570, 13876, 27623, +64034, 6399, 31929, 59725, 54307, 27850, 9556, 47510, 26453, 61265, 2266, +38666, 25857, 52476, 7063, 36034, 49867, 3801, 60546, 26766, 41935, 14045, +47090, 29682, 17023, 56423, 25419, 40880, 2358, 33230, 46860, 11530, 53607, +25881, 40851, 9977, 50164, 18975, 31848, 56168, 12606, 42915, 21605, 59099, + 8608, 45496, 22732, 63786, 12659, 42228, 34222, 16649, 56889, 37711, 6000, +44905, 26482, 58657, 3192, 34557, 56302, 18450, 39206, 5468, 52690, 20522, +36684, 56069, 9515, 28152, 47025, 1513, 57775, 35880, 17398, 64594, 38443, +13939, 27229, 61392, 6525, 50228, 23762, 41961, 13788, 54369, 22273, 49175, + 7630, 34456, 51990, 17269, 43748, 34239, 13746, 64551, 37919, 6851, 28840, +47218, 19855, 56815, 12076, 33556, 43153, 15611, 54138, 32635, 8710, 48538, +27792, 60, 51123, 36365, 7608, 57227, 20810, 34599, 62007, 9552, 27132, +44725, 3555, 50970, 36261, 18156, 42165, 4364, 64066, 28945, 19327, 49414, +12531, 33865, 59115, 6880, 36728, 52376, 347, 57317, 23944, 47846, 5263, +35091, 46405, 10023, 61060, 23840, 41135, 13798, 62307, 32584, 1802, 55211, +37078, 7364, 30408, 51573, 16089, 45169, 35559, 19962, 61344, 5910, 48197, +24710, 43391, 16767, 58985, 27844, 253, 63934, 31420, 18861, 54329, 2880, +45628, 15889, 38156, 56227, 1164, 27697, 63051, 8881, 35108, 47757, 14700, +63610, 21662, 39436, 66, 60359, 18720, 35185, 57015, 7175, 30064, 61315, + 1280, 48333, 28788, 20290, 51308, 4756, 46667, 21914, 31337, 60836, 341, +49697, 33104, 20510, 42800, 13396, 54895, 34548, 2064, 63175, 25087, 47935, +16987, 37217, 64928, 9174, 31822, 57856, 15990, 37247, 63663, 6656, 33126, +45202, 20588, 52780, 14317, 42808, 22646, 57108, 10446, 46020, 23337, 53122, + 8207, 45298, 34862, 3754, 61859, 36642, 13813, 58987, 27173, 16974, 54726, +33767, 4613, 38109, 49043, 20121, 42937, 1096, 57254, 35287, 9680, 61444, +21637, 40239, 12736, 59234, 18825, 37054, 64752, 10755, 38423, 48618, 4767, +28304, 52778, 18048, 40692, 25256, 50064, 10367, 38884, 20490, 52350, 14173, +36156, 59151, 8965, 45575, 22794, 49630, 16341, 29474, 62630, 3296, 45492, +22215, 53218, 6261, 38680, 26498, 56017, 2398, 32084, 50850, 7955, 27395, +53302, 951, 41372, 22212, 56334, 3481, 33319, 52431, 11253, 48369, 425, +34972, 56279, 18521, 39046, 4996, 63708, 20887, 33124, 60997, 8901, 30318, +54888, 15873, 59537, 31474, 6891, 61507, 27696, 17124, 47849, 38360, 8429, +49290, 13651, 44917, 31021, 15532, 63349, 36228, 2939, 57894, 33051, 19672, +61218, 14548, 48214, 35391, 7963, 52427, 21717, 34400, 49017, 9875, 43825, +33867, 5790, 53610, 38459, 18422, 36376, 47733, 11706, 1038, 36047, 63435, +14450, 39769, 20812, 48614, 12105, 55475, 31390, 16718, 43208, 21564, 57020, +11818, 38541, 20459, 64111, 337, 49665, 35296, 6881, 62096, 20583, 50213, +13796, 60424, 24220, 38987, 3125, 63208, 17026, 29552, 59405, 128, 40020, +26304, 64988, 5767, 38645, 26836, 55603, 1030, 30666, 49002, 19377, 59577, + 2931, 47148, 29557, 19244, 63995, 11831, 40402, 21138, 51646, 7644, 48404, +26730, 43340, 16306, 61351, 7901, 40446, 24587, 63715, 14711, 31022, 44232, + 9147, 55102, 29107, 2850, 53053, 37948, 16442, 33723, 45782, 1684, 60525, +26739, 38542, 3919, 45293, 26698, 63754, 1019, 30709, 55794, 6190, 47519, +21489, 52959, 17512, 34208, 60278, 4906, 39975, 25065, 62987, 1897, 46785, +27220, 18461, 64665, 37558, 11960, 54922, 29355, 17878, 47250, 31693, 4734, +52107, 13689, 46898, 37008, 15535, 65266, 30914, 11892, 57489, 24795, 47235, + 9571, 34127, 56715, 1763, 53433, 30000, 16624, 48737, 27396, 10856, 31866, +43979, 19453, 65185, 12066, 39237, 22057, 50867, 1018, 31564, 56557, 8617, +43635, 22678, 50942, 14340, 41665, 21800, 62033, 9725, 33278, 58695, 803, +49507, 14094, 40582, 21971, 65154, 3547, 33434, 51171, 10127, 46509, 25206, +40458, 11269, 58035, 20417, 31307, 64194, 9336, 46522, 18972, 31927, 50293, +13302, 56888, 23353, 38891, 7353, 54321, 26305, 42551, 15698, 49899, 9443, +40952, 25809, 50890, 12452, 39320, 23485, 63417, 9231, 35938, 57873, 16294, +41017, 11567, 52378, 26411, 39113, 15414, 64137, 4062, 47274, 23188, 59363, +16011, 30367, 43846, 7019, 52317, 28597, 13341, 54759, 23680, 42758, 1812, +49922, 22398, 40682, 13231, 60260, 27750, 8036, 58388, 35295, 2402, 50951, +31162, 19417, 41529, 13514, 58047, 17374, 30588, 47424, 20765, 51660, 7475, +33020, 46647, 1988, 64908, 29371, 19142, 53320, 11174, 31223, 56308, 15069, +40201, 24292, 52741, 4001, 47307, 25342, 43235, 6905, 53527, 28401, 2367, +51010, 31176, 15589, 60037, 37514, 7994, 33535, 62767, 3575, 31295, 58220, + 6871, 45881, 26477, 63645, 3044, 40761, 18918, 31581, 61710, 1016, 36949, +51341, 13991, 34002, 59133, 9529, 41073, 24038, 64666, 14671, 44354, 22534, +60486, 11232, 38205, 57920, 15729, 32894, 60071, 9322, 43453, 25902, 63489, +15701, 40142, 24333, 60524, 14528, 28918, 51316, 10317, 42267, 25336, 53040, + 1067, 36379, 48641, 18225, 41275, 3957, 45275, 23671, 49030, 12145, 36332, +57361, 5630, 32128, 59307, 20732, 28371, 55388, 5016, 51079, 22910, 40564, +12834, 52613, 24999, 40149, 8631, 54963, 28400, 17267, 62551, 38085, 5237, +27861, 54856, 14523, 63149, 27046, 16734, 58436, 30309, 3562, 61643, 22619, +43928, 57939, 17502, 31655, 52555, 4256, 42830, 24381, 59936, 6102, 35022, +64927, 1636, 45897, 25050, 53559, 5385, 40672, 23898, 44467, 15103, 54490, +26334, 42484, 9614, 39481, 26207, 44635, 7795, 52569, 21756, 35142, 54290, + 9208, 42212, 23755, 52116, 13506, 44177, 23229, 50952, 14903, 40190, 20878, +62302, 9214, 39519, 25383, 43468, 11089, 55550, 35251, 1335, 50221, 25530, +60039, 15246, 38670, 23014, 64903, 50, 31056, 47054, 19536, 53636, 4086, +33485, 50943, 6999, 60861, 23792, 40660, 15192, 46436, 22949, 62966, 5304, +29442, 55301, 18452, 42604, 9672, 57127, 24325, 49510, 11005, 39449, 21601, +58447, 14415, 38869, 26817, 42745, 2911, 56384, 12806, 41715, 23413, 54781, +14871, 35384, 50277, 10163, 31373, 52618, 5238, 42119, 25030, 58739, 3211, +35562, 63983, 15058, 42360, 22918, 60506, 29550, 6198, 55172, 22004, 42682, + 532, 53018, 32938, 16425, 62552, 22188, 43592, 14166, 40748, 23826, 63298, + 4617, 37874, 59976, 17518, 50909, 3485, 40419, 26315, 54365, 7121, 29117, +58670, 15459, 47807, 26461, 39221, 5682, 64013, 25599, 48656, 3626, 28557, +54063, 15338, 42825, 27267, 18282, 60147, 36346, 8992, 45643, 25533, 55012, +14808, 39443, 22055, 59859, 4124, 47277, 23955, 42063, 6292, 52222, 22150, +34917, 59314, 5297, 40801, 23921, 44443, 1876, 61334, 19511, 31883, 48803, + 4602, 65396, 34338, 20580, 58048, 3114, 32190, 60129, 18539, 44587, 4231, +54603, 29758, 19617, 43630, 2803, 59988, 21172, 45876, 8712, 54588, 19101, +40266, 31385, 9578, 49544, 37124, 4579, 57210, 19529, 35200, 61083, 3087, +45115, 15138, 39427, 26405, 62150, 8344, 54035, 31284, 3436, 49560, 38314, +17354, 29748, 63424, 9486, 37526, 48807, 4844, 62694, 25486, 40256, 46, +56658, 11421, 43456, 25461, 60270, 15713, 40345, 21725, 50306, 7025, 34676, +63153, 3531, 43761, 25611, 60491, 6401, 39066, 19510, 63841, 33954, 13548, +58135, 38200, 16182, 46827, 23027, 57246, 10029, 42057, 21507, 54173, 14165, +44958, 26216, 51003, 13182, 40050, 22694, 55283, 9750, 43573, 24625, 54180, +11764, 47962, 20957, 43077, 7455, 56504, 27852, 17220, 36913, 54441, 520, +48314, 30660, 5897, 52956, 35506, 17856, 29139, 44351, 4902, 49384, 23932, +39240, 18697, 50389, 7273, 35761, 54511, 4136, 32267, 47121, 6784, 59400, +32050, 19850, 45552, 12047, 57204, 28571, 6304, 62967, 26062, 52324, 13229, +33065, 64413, 656, 43231, 22869, 51630, 16138, 42575, 2396, 63998, 34061, +18358, 46460, 9908, 60025, 26924, 43623, 4856, 64293, 22410, 45072, 1963, +32752, 46761, 11947, 58002, 19467, 36206, 46003, 1268, 37814, 51139, 10534, +43330, 24196, 49179, 8521, 29996, 50680, 10420, 44556, 22385, 59051, 13423, +30122, 45948, 15931, 50743, 22516, 40954, 10818, 31246, 61528, 16206, 50318, +28769, 9973, 63037, 36328, 4706, 58774, 21494, 51825, 1086, 65359, 31568, +18759, 58334, 5146, 46002, 31391, 18484, 56943, 8144, 36093, 61316, 3282, +31834, 57283, 7193, 46864, 32726, 18304, 54885, 5311, 49652, 28782, 17265, +61255, 38045, 9553, 30997, 44371, 4649, 55139, 12956, 40918, 25774, 56843, +11437, 35350, 59353, 21562, 45935, 15995, 29848, 49139, 854, 34020, 59921, +10096, 51543, 19922, 34716, 47902, 12451, 64865, 20763, 31871, 40428, 5863, +62521, 19910, 31986, 52577, 8436, 45669, 23647, 63334, 10542, 48207, 20780, +29693, 65125, 7868, 46190, 27836, 3938, 57251, 38013, 14359, 59798, 22821, +47988, 12804, 39553, 21076, 49520, 7947, 30679, 56977, 1647, 45376, 18924, +35444, 47889, 11353, 59831, 25855, 41089, 7009, 36801, 46663, 3208, 59468, +34989, 7746, 55482, 18856, 47012, 34245, 9451, 29068, 57554, 20841, 47427, +13688, 34669, 63032, 18335, 42782, 32799, 3180, 59624, 20232, 45264, 13062, +37696, 56997, 17475, 34011, 46285, 6754, 56203, 34919, 4178, 51268, 30561, +20190, 57400, 1899, 34688, 62919, 6681, 44706, 19402, 35030, 53685, 13367, +62303, 26163, 39281, 2524, 49410, 16461, 29511, 64811, 12056, 52230, 26820, +38537, 10246, 57602, 17452, 46317, 28343, 8932, 53540, 36435, 17470, 51681, +10792, 41324, 26762, 49411, 14118, 34637, 64387, 10067, 47662, 26869, 38530, + 5915, 62641, 25737, 43417, 1363, 53427, 21916, 62284, 14857, 42110, 23953, +46185, 11585, 49928, 21356, 32867, 59538, 5794, 48237, 20133, 43655, 35591, +14543, 65092, 23139, 44501, 5998, 54742, 20294, 46624, 27663, 11545, 53631, +32504, 14417, 50521, 29263, 18851, 64223, 37362, 4348, 31350, 55340, 8304, +44022, 25808, 57732, 14499, 41110, 22060, 51594, 13202, 32732, 48627, 10257, +55974, 28318, 210, 49600, 27226, 7826, 62310, 32298, 4285, 44310, 25970, +64185, 639, 39586, 23609, 60305, 5536, 38612, 20989, 62058, 1529, 30251, +49633, 14914, 33813, 60499, 6230, 39238, 26758, 65318, 14932, 32423, 47659, + 4487, 63124, 19849, 29043, 42522, 13626, 61586, 21762, 49169, 3023, 64327, +19524, 34325, 53942, 13467, 62328, 2239, 31366, 58957, 20570, 41858, 14012, +64129, 23820, 41447, 17203, 52531, 2953, 65527, 33743, 16084, 49685, 37549, +19784, 43379, 9547, 56556, 21982, 40054, 15301, 56220, 30001, 6363, 60577, +35909, 19704, 49727, 11733, 41108, 25479, 54521, 1102, 38812, 20767, 50077, +15940, 34271, 53350, 13402, 60157, 23374, 40186, 3758, 53134, 30855, 9354, +60831, 27298, 17560, 57173, 32941, 5337, 64448, 37915, 19469, 2428, 60100, +32961, 7224, 38350, 54468, 167, 37011, 62783, 8376, 29767, 58535, 19348, +47996, 6673, 33730, 56691, 2054, 47464, 31960, 18635, 53438, 13293, 38721, +26819, 46376, 10610, 37122, 50980, 14288, 41341, 22984, 63966, 1826, 37515, +49325, 16429, 28822, 52868, 12075, 40942, 23872, 58914, 2284, 38796, 23086, +65520, 13890, 33155, 52432, 3732, 41917, 24411, 63433, 16034, 47589, 21451, +35223, 60616, 7298, 28652, 49883, 3418, 42555, 27622, 9803, 63322, 37599, +13301, 57349, 21041, 43951, 31236, 3146, 38454, 58468, 7493, 28623, 44922, + 248, 53954, 24935, 47293, 14833, 42935, 2578, 61111, 25151, 40308, 4490, +50145, 19171, 31527, 57009, 404, 37072, 51422, 11276, 32049, 61654, 18016, +45639, 29575, 1101, 35316, 63276, 8408, 45379, 26637, 60890, 13956, 40982, +25385, 53729, 10573, 30548, 63647, 4236, 39264, 21110, 51507, 13709, 61181, +27759, 19630, 49924, 30557, 12880, 52806, 25760, 40167, 1150, 64445, 22328, +44647, 6642, 37578, 61195, 1883, 28012, 49524, 9671, 55446, 23700, 40537, +10808, 52444, 25027, 60787, 27, 27723, 43895, 9015, 64925, 23916, 39871, +13035, 62573, 23089, 46620, 7703, 37854, 50564, 17366, 31283, 48025, 12797, +61110, 27582, 924, 32700, 44672, 10047, 56532, 21208, 33674, 53921, 8180, +45120, 23604, 41861, 6048, 55292, 21483, 40485, 2820, 33493, 59139, 21229, +43829, 995, 63148, 25452, 38695, 5684, 60996, 22812, 53720, 590, 38955, +24974, 50692, 14657, 58888, 22887, 42011, 10686, 57029, 29340, 13655, 46244, +34845, 7686, 58266, 31596, 187, 64212, 37849, 8531, 55459, 27921, 16427, +53060, 30655, 908, 57168, 28505, 10473, 50776, 37857, 16550, 32424, 60832, + 1152, 36079, 59024, 18281, 44148, 3952, 55564, 35213, 7918, 46299, 23766, +52756, 14730, 39284, 20491, 62394, 870, 45992, 29919, 8667, 55671, 37502, + 2144, 62118, 23845, 45454, 16816, 37624, 54340, 14802, 36585, 45618, 19163, +53714, 36137, 9351, 50724, 17068, 32354, 55756, 12102, 43827, 26870, 56776, +11240, 33571, 51686, 17399, 38122, 56254, 4105, 29240, 46397, 18124, 53167, + 2276, 41249, 23562, 57102, 12873, 35166, 46765, 6743, 57759, 25076, 40275, + 9988, 31574, 46305, 15057, 56197, 27560, 9134, 45576, 37616, 17579, 27656, +46636, 8229, 55887, 29800, 1296, 49932, 36534, 9936, 30396, 48353, 22731, +40434, 4663, 58287, 11570, 31976, 60478, 2282, 46455, 35923, 7266, 51113, +24743, 47260, 12971, 41581, 23551, 55024, 3534, 30975, 62696, 7154, 42708, +23584, 61496, 11409, 29512, 58517, 6736, 40508, 25333, 49622, 9658, 29620, +65442, 21417, 47997, 14039, 35464, 50364, 3020, 41769, 22013, 52616, 14714, +28136, 46089, 20074, 41610, 11454, 64764, 27131, 18964, 49244, 27963, 14580, +53197, 35750, 2945, 44684, 25917, 64277, 13487, 39219, 21951, 43213, 11199, +59362, 25320, 42070, 2748, 49055, 18027, 61636, 29426, 4091, 59902, 28096, +11315, 48690, 30640, 20683, 62083, 5473, 47518, 18296, 33118, 64207, 9697, +43639, 26617, 51499, 7547, 40674, 26430, 58069, 11583, 45390, 21981, 53503, + 6657, 31733, 58294, 1755, 43089, 19178, 52244, 33630, 12549, 62271, 18259, +55009, 36120, 2261, 52239, 25104, 41895, 6041, 54416, 18354, 62114, 27440, +15449, 51127, 37236, 17833, 56886, 33010, 8241, 59554, 35530, 18730, 50654, +12652, 33273, 54449, 16488, 36351, 59992, 9492, 42108, 24466, 54354, 15313, +44921, 22976, 41201, 6962, 55423, 21922, 49915, 15756, 42532, 23865, 55747, + 2589, 38713, 19860, 56345, 5908, 36950, 50746, 15862, 41791, 23940, 58283, + 8173, 33898, 45182, 2094, 54121, 10652, 37366, 61920, 4984, 41916, 23174, +57055, 15601, 31099, 48526, 12146, 55193, 18845, 32199, 52488, 12543, 44127, +33640, 5427, 64747, 17699, 48896, 31397, 7779, 36066, 47185, 12476, 57800, +31941, 20392, 52439, 1451, 44808, 32367, 17487, 58364, 11456, 28327, 64366, + 3392, 40477, 24341, 55688, 9139, 36875, 49059, 14723, 58291, 24470, 40328, + 4548, 62662, 18322, 28604, 57890, 451, 34353, 60603, 11539, 43974, 24708, +63757, 14821, 49124, 7681, 39047, 26996, 47429, 13050, 56350, 21277, 45036, + 8246, 33550, 47067, 18467, 57233, 6834, 40279, 32045, 2181, 53019, 36611, +17034, 33081, 65530, 3524, 51300, 26217, 40807, 15360, 53928, 27528, 18287, +46754, 33616, 4338, 62691, 36625, 13490, 46302, 19160, 38401, 61372, 2752, +27513, 56710, 12444, 42687, 22222, 51292, 8609, 39285, 25053, 62956, 15416, +42102, 21721, 60912, 1726, 33745, 58226, 10126, 42403, 24174, 52295, 12034, +36837, 64555, 16540, 28510, 48116, 19700, 39693, 5136, 57736, 30158, 8337, +65228, 31706, 2941, 59691, 12459, 28800, 46559, 20848, 61641, 5930, 39014, +23952, 53347, 3128, 41078, 22469, 65114, 6574, 47126, 27472, 13675, 62852, +37227, 10205, 58245, 21639, 33685, 50986, 8887, 43449, 25070, 61095, 10743, +31041, 53917, 1911, 45107, 23156, 59603, 7400, 33611, 42099, 70, 63377, +21864, 50823, 6329, 34209, 61032, 16332, 40318, 22959, 53476, 12755, 62695, +21596, 44068, 7464, 60211, 19162, 53277, 26273, 42074, 16666, 51649, 27579, +14101, 62283, 30569, 19738, 58271, 1688, 31517, 65167, 8201, 39257, 26061, +57007, 16448, 36429, 51741, 14656, 32442, 53891, 2799, 43935, 35427, 18451, +62093, 102, 44771, 36472, 16855, 55938, 4586, 43943, 19069, 63782, 28377, +12792, 59171, 37488, 8969, 34450, 54828, 31125, 57021, 16178, 47903, 35449, + 3939, 56382, 37790, 7835, 47157, 21554, 56062, 17329, 38651, 9343, 53037, +26745, 60213, 4388, 50991, 29583, 7972, 63551, 35557, 21839, 55959, 9836, +34318, 45647, 16043, 54661, 35898, 7272, 58158, 38437, 13979, 44471, 23878, +55956, 841, 39108, 21819, 53232, 13042, 34083, 60817, 16363, 48805, 364, +38982, 18839, 56800, 34816, 13588, 49826, 38438, 17158, 29760, 63204, 5723, +44451, 20561, 37668, 48059, 8138, 29409, 44851, 19286, 65025, 10772, 39171, +25958, 49594, 11914, 44607, 35847, 4331, 59068, 11322, 41062, 21667, 52319, +29193, 4967, 64402, 23694, 42242, 1341, 57860, 29460, 6470, 46740, 33064, +18349, 62318, 8196, 34606, 50408, 2289, 64100, 26124, 39090, 12275, 59102, +31025, 6205, 52396, 33277, 11347, 64852, 26916, 46546, 16691, 27967, 62921, + 913, 34303, 48421, 13184, 55352, 28477, 17809, 65027, 23943, 44137, 14923, +29294, 51826, 17730, 46470, 8075, 36673, 60555, 2897, 42094, 24784, 62672, + 4795, 40137, 24201, 59890, 15302, 46105, 25296, 39832, 2273, 53283, 21647, +63342, 16853, 28429, 50047, 5800, 42120, 15784, 61775, 26592, 48474, 5035, +35674, 51851, 15749, 42040, 23030, 59239, 6096, 30311, 44276, 18327, 65311, +33509, 7261, 51464, 19964, 46115, 32527, 12584, 52734, 37169, 14846, 49975, +20502, 30337, 53043, 6489, 41744, 31695, 19689, 54853, 11534, 61469, 23142, +42447, 3440, 37358, 64670, 16922, 29200, 59613, 10323, 42177, 23737, 63706, +13237, 46117, 20567, 56185, 5321, 47506, 22520, 38878, 10313, 61275, 20794, +48258, 6140, 30775, 60312, 12463, 51461, 23841, 41014, 9023, 58614, 25205, +48931, 7466, 33937, 52192, 15646, 46365, 31254, 4534, 64607, 34102, 19091, +57639, 3004, 45950, 34174, 8978, 53918, 26634, 44790, 13047, 49668, 29131, + 4727, 61199, 33165, 20966, 49238, 3033, 34193, 53747, 7562, 59341, 14364, +44326, 25319, 51787, 11903, 41173, 23445, 50178, 17879, 37451, 56914, 1837, +40603, 25290, 51899, 9691, 45848, 18275, 60793, 32255, 10523, 45763, 36880, +16302, 53906, 34541, 354, 50294, 25128, 42292, 5084, 64094, 17400, 30567, +54779, 1162, 39768, 21896, 50014, 16699, 36338, 64821, 12310, 29985, 47580, +16278, 54380, 24127, 39820, 9858, 57538, 23378, 48676, 3603, 32008, 56767, + 6037, 45383, 26591, 39128, 2609, 55539, 26893, 38616, 13708, 46468, 238, +35358, 64760, 7853, 44938, 34112, 4392, 37918, 54448, 17102, 45570, 35063, +14066, 53176, 20512, 43864, 9773, 49128, 28930, 4405, 64671, 37881, 10714, +48017, 23085, 56455, 12404, 29129, 50705, 20123, 59226, 10807, 31329, 41419, +24202, 55110, 7774, 32035, 48975, 573, 42914, 22889, 62480, 6252, 50126, + 1840, 29086, 43347, 9458, 62023, 31713, 18079, 59681, 25298, 40875, 5939, +60960, 23732, 49196, 682, 40770, 17209, 34118, 46246, 14036, 54985, 31357, +16049, 49990, 6107, 41651, 24501, 57360, 508, 40031, 20233, 50610, 27373, + 2995, 33919, 60483, 8732, 41876, 26741, 62797, 6797, 30873, 57495, 3423, +44211, 20531, 31904, 62498, 10287, 47146, 29381, 4214, 64479, 27187, 8606, +53186, 37920, 14371, 48601, 25156, 58779, 665, 31760, 61003, 17094, 50588, + 4813, 34604, 47566, 20471, 56229, 1214, 29367, 63958, 8885, 48473, 22925, +30347, 62858, 2780, 45371, 16799, 37136, 46797, 9153, 53422, 26134, 39122, +13505, 61404, 22713, 52198, 3349, 39074, 26652, 57553, 11722, 29590, 43421, +16938, 56716, 3510, 40665, 25115, 62176, 15154, 40271, 20456, 50394, 4657, +34342, 57550, 11944, 44927, 29640, 19305, 61453, 6440, 42961, 32652, 3830, +36520, 49298, 7390, 58938, 34818, 169, 63494, 21235, 29174, 49776, 14279, +34611, 51918, 9926, 30798, 46903, 20122, 53329, 586, 35379, 56791, 9084, +29508, 61390, 14008, 44627, 32223, 3914, 54986, 36527, 11700, 59329, 24794, +38947, 8770, 53367, 18189, 29191, 57098, 544, 46991, 34034, 13928, 48666, +20909, 53462, 1662, 41343, 28681, 16242, 60720, 38373, 2232, 28046, 48351, + 6894, 64538, 25823, 39601, 3871, 61829, 17307, 35738, 58465, 1966, 48241, +26713, 38574, 5286, 49822, 18003, 55372, 30556, 12305, 52193, 1765, 40782, +25674, 55056, 3894, 38492, 27029, 60886, 9338, 39456, 26715, 60126, 12808, +50622, 25263, 45113, 2525, 35527, 54570, 10913, 43503, 34449, 1322, 64722, +17614, 49645, 31167, 3298, 37205, 63604, 17467, 27204, 58011, 9632, 40910, +22846, 49370, 6227, 44488, 24141, 52125, 13400, 30697, 60123, 20407, 38909, + 6381, 65467, 19452, 35486, 55005, 15158, 43160, 6893, 59843, 25138, 46962, +15731, 42152, 20704, 34052, 62654, 1273, 39139, 20655, 58716, 4652, 34097, +63314, 7263, 31013, 48158, 13023, 64680, 29343, 16415, 36965, 54649, 1064, +27962, 49364, 19153, 58554, 4469, 30012, 61447, 19544, 44463, 12376, 55448, +23263, 39156, 7695, 59271, 26137, 44466, 14430, 62137, 29823, 7080, 52028, +24676, 43316, 2826, 58880, 36214, 5656, 61400, 18061, 45959, 37087, 12886, +28656, 64532, 15592, 41777, 23780, 61903, 8987, 34040, 59045, 18638, 42474, + 5649, 63300, 25095, 54156, 19624, 30253, 49369, 10998, 59222, 22524, 48176, +10331, 28461, 63085, 5369, 40366, 26810, 58958, 468, 35092, 61147, 13763, +45302, 27208, 17890, 55698, 30972, 8272, 37698, 63554, 3987, 33244, 42361, + 6425, 47587, 22243, 62953, 2155, 35900, 46571, 15540, 61131, 23911, 53128, +13483, 39368, 26324, 32051, 63653, 11748, 52228, 24065, 40241, 13303, 53751, + 1371, 34050, 51379, 16100, 44380, 32217, 11782, 62245, 25346, 43975, 5612, +65134, 23846, 39928, 1491, 58218, 19337, 32675, 62454, 12453, 43582, 18625, +64838, 31421, 9103, 56856, 38288, 16748, 46666, 24488, 54722, 12385, 45963, +20941, 40684, 15499, 48194, 25541, 55232, 5226, 42823, 24966, 59126, 15016, +36433, 43923, 19991, 59937, 27912, 2997, 56621, 36576, 10481, 41606, 21722, +52795, 12330, 39988, 25819, 58145, 9043, 30283, 60282, 14361, 43091, 34555, +17580, 53398, 38179, 12247, 46547, 19715, 54975, 32070, 10749, 61874, 19269, +29729, 58581, 5336, 44880, 21101, 49029, 10768, 41415, 25169, 63188, 13493, +40148, 21414, 53439, 5676, 47614, 35051, 20372, 54082, 8641, 33939, 48571, + 266, 58561, 26369, 42077, 9448, 53005, 31738, 3129, 59708, 35321, 16372, +47471, 21944, 51902, 13898, 57710, 22994, 46225, 19008, 28319, 43513, 13298, +56060, 37794, 5641, 58533, 27507, 16433, 65363, 37105, 6285, 57722, 13951, +43310, 22530, 48624, 17323, 37055, 50847, 7300, 41273, 23905, 60430, 15296, +40923, 22814, 45760, 2700, 55928, 19965, 33187, 63711, 6274, 43161, 24691, +60429, 8333, 39826, 26443, 63297, 11034, 34643, 54505, 5827, 47241, 27201, +10727, 58713, 34451, 20728, 54683, 9790, 43062, 22271, 46929, 13794, 50957, +28469, 10614, 45266, 22507, 65109, 13892, 41900, 24192, 58861, 9048, 36712, +48288, 19029, 33033, 62807, 13594, 44878, 21099, 52183, 6358, 43673, 25439, +54003, 785, 31924, 42712, 6703, 57338, 31140, 14406, 63908, 19953, 28077, +57981, 15565, 45500, 25493, 39615, 10004, 56201, 22510, 42509, 11705, 50971, +38242, 369, 32727, 61881, 12144, 54526, 26882, 38601, 9945, 63910, 26680, +40992, 651, 48076, 16598, 57199, 25832, 41578, 2476, 48393, 28081, 18510, +56157, 37995, 11137, 30348, 63583, 4207, 50699, 27768, 9467, 54532, 26658, +43323, 12723, 52574, 24711, 46314, 15333, 42661, 21620, 54960, 4177, 33732, +58983, 7633, 44197, 20067, 63953, 35843, 8888, 41721, 26327, 52113, 7052, +40180, 25996, 60183, 2914, 33154, 52483, 20174, 46340, 11412, 36195, 48997, + 3772, 34651, 55870, 20953, 39531, 11422, 53286, 28628, 14015, 44009, 25491, +51227, 2056, 30969, 55138, 7755, 44954, 34540, 786, 51739, 20140, 48097, +14384, 29796, 52252, 11262, 34751, 49855, 15541, 39610, 3306, 60744, 17713, +38895, 26426, 43814, 1240, 57587, 36470, 20181, 52212, 11994, 44576, 22178, +50542, 17444, 29829, 54169, 7790, 34935, 48766, 1547, 59426, 21665, 44327, +14078, 48851, 19166, 60922, 27936, 15752, 52568, 33371, 12581, 58157, 21033, +40909, 4877, 29843, 45041, 8002, 58707, 18140, 47096, 20791, 34181, 44363, + 4621, 55593, 20453, 29333, 48188, 10990, 63323, 29064, 4876, 57752, 36105, +18369, 50734, 10039, 32667, 53735, 18115, 44986, 11912, 52335, 26992, 48363, + 3955, 39145, 25920, 52312, 5640, 36825, 53723, 15023, 27923, 63246, 4810, +40055, 22550, 59872, 2134, 37133, 54178, 8069, 32798, 64717, 13499, 39316, +22362, 53034, 7088, 31663, 56078, 1087, 49140, 12938, 33017, 51773, 17589, +28617, 65335, 5270, 45904, 24265, 62683, 2652, 44242, 19622, 38007, 52775, + 3954, 27327, 46999, 7256, 61235, 27248, 2063, 34082, 58358, 6806, 42438, +23418, 52859, 578, 36234, 49489, 15085, 40488, 24952, 64782, 1967, 36956, +55346, 7649, 31767, 50037, 845, 59349, 31279, 17969, 65348, 10964, 42272, +23219, 59880, 16273, 39304, 23601, 44705, 12462, 62796, 21498, 39842, 14775, +49483, 23308, 53854, 8742, 36888, 64183, 1376, 31755, 40796, 10483, 62363, + 4521, 36102, 53056, 9949, 46823, 27063, 18404, 38337, 53330, 1522, 29268, +48938, 17875, 41101, 25621, 60215, 7979, 33595, 64294, 4394, 27779, 58472, +19493, 48238, 882, 29279, 52149, 9280, 65450, 25982, 40626, 13571, 50689, +21427, 38626, 11624, 54467, 19106, 33203, 52101, 2849, 44745, 22361, 57524, +13602, 31991, 62091, 17391, 37492, 50466, 4319, 42026, 17170, 60202, 35979, + 1100, 57500, 32016, 7922, 62952, 36713, 18665, 55737, 6733, 33089, 51876, + 272, 40156, 25871, 61923, 4822, 28814, 53355, 7984, 39262, 26485, 59393, +11041, 39050, 19298, 56705, 13802, 45473, 21218, 61919, 16018, 40606, 23045, +48784, 7940, 37396, 52878, 4123, 32100, 50839, 6840, 61481, 20286, 33478, +48141, 6305, 60140, 28421, 20497, 53306, 15015, 45370, 24481, 41526, 2115, +59360, 21131, 47112, 6852, 55713, 22597, 35093, 51862, 5378, 44192, 14434, +37504, 63290, 10345, 31368, 51526, 305, 45179, 19159, 35322, 56491, 12837, +32386, 46152, 18741, 60980, 6156, 39645, 22234, 55746, 462, 30099, 61519, + 8831, 39764, 25785, 49565, 15092, 41380, 23860, 51269, 3532, 31480, 56938, +11949, 45414, 21214, 63431, 10968, 35330, 48552, 18490, 41624, 13072, 57906, +31577, 5500, 63010, 19264, 28060, 59656, 15345, 44795, 6099, 62598, 19505, +34612, 49162, 8718, 65385, 18954, 35568, 58694, 11724, 27659, 53080, 17172, +40520, 24274, 59975, 6616, 34874, 46137, 1741, 55070, 28857, 20562, 58175, + 9251, 48338, 25773, 42881, 6154, 63846, 14613, 50381, 31121, 16760, 47117, + 3799, 60001, 32112, 7478, 37121, 64099, 3334, 41337, 23867, 60687, 15590, +40562, 26132, 52545, 6128, 39674, 24418, 51175, 942, 35490, 44567, 8112, +56162, 25980, 39384, 9156, 51598, 26697, 64959, 16786, 34784, 53939, 3439, +61292, 8765, 27775, 57763, 15812, 35665, 65497, 7309, 43133, 24088, 40207, +14103, 54339, 21186, 48375, 1982, 30566, 59113, 21672, 39294, 3600, 61435, +26309, 38512, 7449, 59626, 20499, 31000, 47268, 11225, 60670, 23678, 44063, + 1337, 34632, 51566, 10910, 47470, 18111, 33862, 50256, 11556, 28138, 58679, +18242, 46417, 1565, 34627, 49482, 17681, 62951, 27393, 11739, 45683, 37273, +22158, 57814, 8367, 35387, 47143, 15907, 55416, 29677, 11989, 34884, 54536, + 9548, 49287, 31804, 16212, 64641, 36944, 18279, 55937, 32658, 13203, 52184, +38464, 17216, 28540, 65487, 13091, 40414, 25244, 60684, 8854, 32681, 56270, +11557, 35225, 51353, 19196, 28588, 60588, 14918, 44026, 24271, 41060, 6720, +46382, 25834, 51864, 1681, 31786, 49647, 5409, 63877, 30133, 7685, 49171, +34923, 2202, 56456, 26782, 44403, 5030, 29006, 59027, 15561, 42028, 23855, +56095, 14578, 44697, 25180, 54682, 16726, 30807, 64603, 2721, 35168, 59372, + 9390, 42892, 22183, 61768, 8869, 32815, 54378, 3322, 47203, 28407, 15744, +38261, 52893, 10734, 33153, 45907, 13545, 62534, 32579, 17300, 49642, 36870, + 6648, 31540, 59772, 1758, 42306, 26293, 62448, 4612, 49346, 27751, 14489, +61405, 35948, 6821, 42734, 26419, 51709, 131, 46334, 30054, 14960, 63434, +25412, 52092, 10458, 29247, 45806, 18751, 53423, 26297, 41171, 2610, 50157, +24809, 44608, 14984, 61082, 21177, 47633, 11999, 34593, 56609, 16090, 44184, +22175, 55537, 1178, 31077, 48850, 22737, 63102, 3205, 38603, 26898, 51713, + 9086, 36118, 53645, 1855, 32835, 62471, 17459, 41708, 22471, 59616, 13793, +40659, 24360, 46005, 2039, 57053, 18464, 31925, 43730, 4090, 65331, 34424, + 8135, 58262, 17974, 48830, 35541, 11341, 31220, 43285, 18370, 62262, 12311, +29073, 59685, 18218, 47239, 27578, 7352, 56709, 36686, 16414, 61721, 24011, +48632, 5860, 40857, 21462, 65060, 2029, 37160, 50033, 16660, 33287, 60192, +10563, 47864, 35944, 16822, 51097, 22796, 58019, 2311, 35571, 62512, 8155, +29301, 59721, 14553, 42640, 25131, 54867, 1598, 39245, 24529, 56375, 6336, +30356, 64946, 865, 42549, 24808, 53700, 13628, 37427, 49791, 1697, 33708, +54674, 17823, 31207, 42994, 589, 57820, 24526, 40513, 5288, 47883, 20474, +37930, 62842, 3244, 30662, 57746, 9394, 42833, 25659, 65141, 15052, 40276, +22146, 61769, 5275, 44341, 33241, 18771, 57309, 10173, 32342, 52265, 22099, +41479, 8663, 61739, 24574, 41319, 13355, 55516, 22930, 46816, 14904, 31402, +57178, 11184, 47440, 35637, 4680, 65281, 18855, 35292, 56837, 10434, 31194, +53537, 13056, 64330, 23394, 41381, 3174, 60371, 19326, 30623, 43885, 1181, +49916, 12961, 39671, 25393, 45392, 19401, 37386, 50948, 397, 47458, 18284, +30676, 50192, 3065, 60299, 33159, 8452, 45007, 24005, 64592, 15421, 42254, + 7823, 56046, 24980, 41852, 13814, 53062, 23155, 40454, 15131, 64384, 2516, +39852, 21650, 49255, 13008, 56482, 29939, 16394, 37945, 65229, 7153, 29025, +60641, 21387, 41789, 5955, 52303, 30864, 21242, 61508, 11133, 42273, 3596, +34600, 48413, 18700, 64184, 4918, 40510, 26162, 60660, 1864, 32099, 43537, + 7521, 61745, 38430, 18059, 28229, 58876, 160, 46326, 11035, 28368, 50737, + 5219, 42008, 24233, 63151, 9196, 37347, 50358, 3619, 33705, 56711, 6126, +44133, 21549, 48779, 3098, 30401, 59785, 16622, 46473, 4287, 33487, 48380, + 9219, 57183, 19698, 33537, 62426, 9869, 28889, 58321, 21043, 45610, 12772, +41823, 23765, 56915, 13822, 53472, 22260, 38907, 11042, 65175, 20128, 32913, +46424, 8067, 52892, 30693, 3312, 36859, 61062, 7680, 33798, 48311, 11468, +41915, 25096, 50362, 15985, 30141, 55822, 4244, 46236, 25022, 39793, 13123, +63643, 20373, 35586, 56296, 1365, 42088, 23608, 57109, 5535, 39966, 21360, +53640, 3685, 43788, 24499, 56581, 11123, 44849, 23509, 52580, 13015, 34214, +45638, 17150, 37768, 56331, 9335, 28832, 48255, 19727, 64957, 11779, 40073, +23187, 57060, 8458, 33402, 47971, 3119, 41003, 23473, 64229, 5008, 39297, +11354, 60475, 18031, 32546, 59057, 9276, 38874, 26844, 43381, 7577, 64069, +29626, 2979, 49549, 38219, 12579, 33900, 65271, 17863, 45886, 9726, 35526, +52940, 18454, 42161, 5123, 64321, 29431, 16950, 59037, 27870, 9981, 37929, +56026, 507, 29275, 49068, 8853, 30630, 63302, 16504, 35780, 47526, 7360, +54106, 23054, 40411, 14043, 51535, 25968, 39770, 5108, 63052, 23100, 53143, + 2648, 46260, 36330, 7808, 50793, 32513, 1425, 54391, 34906, 19621, 49964, + 4035, 44549, 29061, 10668, 59190, 37165, 15080, 53139, 24934, 46936, 9704, +29888, 54113, 3400, 27966, 41778, 19581, 64439, 4787, 40828, 12202, 45455, +26670, 52840, 13645, 32538, 48968, 20935, 39723, 5447, 50491, 18417, 33130, +62019, 13537, 43344, 23013, 49357, 16530, 33557, 57225, 8212, 39773, 23260, +45495, 9650, 64262, 24076, 40074, 10623, 60683, 21690, 49402, 13296, 30090, +53734, 15121, 56913, 32486, 10555, 46311, 25141, 50629, 13624, 35469, 56093, + 4354, 31521, 52658, 10520, 47784, 27654, 16393, 38206, 64242, 927, 28434, +53858, 19892, 39598, 2695, 56427, 26860, 38567, 5550, 53052, 26765, 39008, + 1903, 62781, 26699, 51674, 8489, 43795, 21847, 29711, 54892, 12745, 46095, +28372, 2599, 62406, 37575, 16671, 29398, 47150, 7005, 32426, 49667, 15021, +55569, 35540, 11524, 61590, 20445, 30448, 58370, 5637, 14405, 55834, 28502, +10200, 62370, 25035, 42146, 12031, 57167, 22840, 39572, 15082, 56529, 26789, +38921, 6408, 52018, 20308, 29754, 46963, 11313, 63734, 3, 32196, 57744, + 6457, 46150, 31874, 17810, 54483, 35561, 5952, 62225, 24956, 42697, 3593, +52876, 20066, 35281, 55259, 214, 45353, 16236, 34904, 56940, 9482, 39872, +26583, 50837, 16796, 60188, 29472, 9347, 54829, 35929, 20330, 50772, 10110, +42158, 23371, 54177, 14471, 48048, 27429, 3752, 52481, 36733, 15575, 43465, +21707, 60798, 37820, 14993, 57327, 21426, 45335, 989, 30507, 47376, 15869, +60066, 27368, 17638, 51695, 37291, 13633, 63784, 25231, 41669, 7161, 53217, +26312, 42529, 14246, 63536, 25434, 39560, 2531, 53033, 16001, 43939, 36917, + 4423, 54994, 17790, 35782, 61612, 2970, 39600, 26270, 45239, 5792, 58207, +25384, 47952, 491, 39371, 17663, 62684, 27604, 12051, 56719, 38465, 18078, +28724, 51457, 777, 59807, 21408, 39785, 6786, 63156, 33746, 14077, 52165, +37416, 10574, 59679, 23753, 42907, 6084, 51975, 17111, 31910, 62985, 13084, +44030, 25397, 60111, 9665, 38637, 26989, 64088, 15078, 39684, 21837, 61262, + 4273, 36702, 58204, 7578, 28339, 64471, 1147, 47474, 18443, 33814, 55853, + 3704, 38918, 25900, 59948, 5625, 41690, 21652, 55029, 16114, 30907, 58412, +12562, 50427, 33727, 15616, 44848, 23906, 54291, 5754, 40539, 23329, 53107, + 1700, 57912, 19364, 36644, 52493, 15263, 27345, 60109, 7073, 50810, 23385, +40449, 5868, 57481, 30117, 12498, 60547, 26072, 47302, 10648, 36978, 49949, + 4386, 45093, 25097, 51301, 13097, 33626, 65146, 16175, 37100, 52272, 5554, +44461, 27530, 13382, 62219, 30164, 9723, 57452, 32515, 1530, 61100, 19271, +48191, 29476, 9446, 37961, 58545, 20088, 28325, 64315, 15567, 41522, 24350, +61357, 8859, 39711, 26441, 64862, 14110, 35712, 55430, 2579, 31258, 43734, + 7181, 57420, 19601, 36443, 62414, 12123, 34345, 58562, 7594, 45957, 26478, +56150, 17732, 30866, 63061, 6207, 38820, 19472, 55535, 7, 35169, 65505, +17073, 30295, 57986, 9744, 46047, 28050, 4006, 55612, 36193, 10146, 51948, +19642, 28904, 60047, 4391, 50557, 18547, 32306, 55338, 3457, 48401, 30306, + 8046, 38154, 63927, 4204, 44797, 23871, 39429, 1423, 59292, 21126, 42453, + 5823, 63516, 22307, 47051, 15735, 39680, 23321, 59255, 2895, 31180, 56626, +12677, 45316, 17088, 35162, 47721, 11878, 61227, 24138, 42318, 13859, 65047, +20631, 45813, 9440, 58568, 21614, 42787, 6272, 38602, 20139, 61976, 709, +49634, 18255, 33078, 60386, 9344, 43048, 25079, 49391, 4265, 54758, 21504, +37044, 62004, 10063, 28342, 45980, 5176, 52022, 25447, 41967, 9819, 52848, +32890, 64639, 2835, 46444, 33803, 20041, 52820, 4472, 33690, 46033, 7546, +63021, 36058, 957, 47315, 18550, 61738, 32591, 2804, 58428, 36154, 19518, +50136, 16337, 43386, 22218, 51255, 13263, 27652, 58759, 8472, 45277, 28664, +19645, 48106, 10069, 59318, 25770, 40953, 12635, 49314, 23061, 29696, 62002, + 4673, 47475, 24096, 58410, 2255, 32507, 45095, 6952, 52502, 26138, 40933, + 480, 61891, 29716, 14991, 57314, 36304, 6986, 63756, 19872, 37643, 57611, +12750, 29432, 64252, 8613, 48946, 27101, 3250, 51837, 35442, 10467, 61703, +26561, 54672, 12149, 32960, 43433, 7817, 55506, 31171, 1500, 48064, 28273, +10957, 54594, 35858, 18228, 61185, 15, 32042, 45023, 7820, 56158, 20968, +30409, 48035, 11935, 60779, 19944, 33125, 51160, 8812, 29305, 48104, 10742, +60087, 19752, 32627, 50717, 9595, 34703, 60564, 20855, 43217, 6125, 50798, +34931, 19880, 45696, 7000, 63751, 22668, 32683, 42725, 13039, 55269, 24048, +44623, 2191, 58362, 20353, 28280, 49660, 332, 34320, 56897, 12027, 41049, +22773, 50415, 8500, 29779, 52620, 2336, 41292, 23545, 54496, 12508, 42458, + 242, 55366, 35630, 9198, 48773, 30568, 16744, 38024, 54172, 12112, 41424, +24530, 59075, 8910, 43464, 23800, 53180, 14086, 48611, 18750, 34446, 45211, + 1587, 61699, 24026, 39623, 6209, 43359, 25459, 62524, 747, 48663, 19213, +30310, 64743, 14506, 44154, 32011, 10245, 48795, 28211, 4466, 55969, 37740, +16918, 31684, 42884, 2293, 61608, 27953, 16867, 50259, 34685, 14, 44656, +21872, 58569, 14974, 33517, 56851, 19516, 42023, 6448, 54990, 21078, 44629, + 3588, 56838, 27090, 18944, 60629, 37695, 969, 50649, 19874, 45721, 36806, +15344, 50204, 23856, 44557, 6688, 34199, 55148, 17539, 42639, 10943, 49591, + 4310, 33386, 56928, 11690, 44932, 22750, 52221, 6622, 41512, 24859, 50514, +11561, 45932, 23499, 63773, 13789, 29237, 49383, 973, 40645, 23404, 51098, +15651, 38881, 20864, 52929, 1328, 35047, 50414, 10136, 44586, 24815, 61096, +11173, 43621, 23153, 51931, 12882, 40309, 2624, 53068, 20409, 37724, 61007, +14467, 29540, 45677, 2246, 63522, 35494, 10884, 43156, 25612, 58523, 12636, +40887, 22923, 45033, 16168, 59050, 27365, 11589, 35017, 52722, 17006, 61950, +29881, 9575, 52245, 36899, 16676, 32534, 54965, 330, 30165, 61298, 8916, +41706, 19496, 49521, 36260, 5798, 51623, 25407, 59596, 4111, 30648, 44506, + 7754, 54869, 33422, 19, 51329, 37089, 17045, 31938, 49413, 12994, 59627, +26275, 46191, 10276, 40528, 24427, 58355, 5705, 41439, 22859, 53722, 11933, +38860, 20144, 59711, 15354, 45407, 226, 34447, 57896, 17436, 40498, 22367, +63173, 2053, 47684, 19949, 36665, 43196, 27241, 16324, 58043, 37967, 10853, +60757, 28243, 17712, 50541, 29847, 13569, 55271, 26101, 42018, 10741, 51089, +24724, 44983, 8697, 40966, 26573, 59459, 7350, 34888, 62810, 2244, 49024, +32842, 16977, 63626, 37363, 933, 55889, 32345, 17644, 46757, 5093, 64118, +36035, 9817, 51706, 17812, 43256, 33703, 12030, 40924, 20191, 63894, 14691, +38631, 21885, 59316, 12763, 48033, 18257, 33410, 52424, 4030, 45356, 18123, +32469, 49830, 1348, 42128, 24870, 53637, 5931, 35269, 42125, 14283, 59765, +30881, 19043, 47790, 5769, 40739, 20681, 48790, 4023, 64074, 24796, 41544, +15284, 62196, 20203, 34288, 58034, 4801, 47514, 24332, 40699, 15281, 58689, +22813, 48943, 11293, 35925, 64578, 5024, 40102, 26047, 54433, 627, 40791, +23578, 64939, 14264, 36447, 52143, 1516, 42647, 16022, 57158, 28494, 4325, +36617, 48539, 15755, 59420, 28987, 1865, 57597, 37181, 17256, 49054, 9715, +61306, 28249, 5047, 50110, 35029, 17145, 38228, 46605, 8719, 62292, 31012, +14682, 44182, 25672, 64990, 3068, 39358, 26597, 61583, 14995, 32870, 58755, + 6822, 45042, 19903, 60650, 32536, 16113, 28456, 63507, 20068, 53155, 2509, +46498, 20952, 30285, 61037, 5234, 50428, 22242, 39856, 2103, 57882, 32853, + 9450, 63955, 27927, 11390, 53168, 37127, 14046, 49794, 22280, 57342, 10707, +38528, 27037, 55946, 8254, 34159, 46490, 3630, 58537, 20094, 35049, 63401, +13275, 42969, 23581, 62417, 7791, 46680, 25074, 53582, 14538, 36798, 56509, + 8683, 41495, 25269, 64830, 7473, 37645, 54301, 2592, 28467, 62124, 11310, +39157, 26424, 60084, 9677, 34997, 42542, 11113, 48530, 31156, 14670, 58726, +25638, 41554, 6021, 63691, 28017, 3855, 54616, 37484, 16612, 64796, 27516, + 118, 60210, 37099, 23312, 54040, 13658, 43249, 28019, 3142, 60560, 36140, +20723, 58176, 712, 34270, 61860, 19366, 39437, 5371, 52727, 35146, 17410, +60607, 26121, 43134, 5677, 63263, 10729, 44741, 25161, 60008, 14661, 39622, +23124, 53796, 2988, 39319, 26773, 59214, 5893, 33188, 47731, 18992, 62901, +35090, 7515, 49945, 22394, 42241, 8619, 56639, 24601, 41064, 15407, 53178, +21680, 48500, 186, 31513, 65216, 7316, 36687, 51997, 2348, 31983, 56406, +19988, 46637, 5079, 41335, 13885, 48441, 25481, 60663, 7046, 41462, 19083, +49756, 37293, 13291, 45893, 24086, 64721, 7656, 28927, 57798, 20177, 41079, +10824, 46669, 23722, 63445, 16068, 39962, 22528, 60438, 10917, 28276, 57702, + 4333, 40702, 24275, 53561, 2308, 30861, 64791, 13803, 48295, 28155, 16489, +55615, 33749, 1740, 63909, 26677, 48236, 6594, 41182, 24084, 65112, 14185, +48173, 30045, 7134, 56848, 37669, 16410, 28748, 55114, 8352, 13183, 49412, +30479, 6432, 54412, 24308, 43815, 1904, 37404, 58429, 9298, 43090, 22205, +64011, 5669, 39229, 21495, 60864, 13428, 34394, 55791, 3751, 47834, 23919, +39933, 15866, 42743, 21510, 56674, 4702, 41834, 23133, 52414, 11140, 38391, +60277, 14917, 30785, 43677, 19502, 55855, 3177, 30846, 63034, 8306, 46208, +25812, 51132, 5722, 55680, 26974, 46831, 3037, 43123, 24968, 65147, 6712, +41930, 20789, 58953, 29612, 12356, 62882, 22594, 47413, 10001, 31332, 59285, +16956, 45786, 27707, 1577, 55785, 37629, 12984, 63001, 25742, 52543, 9419, +38701, 22965, 56126, 10234, 35942, 52079, 6424, 45670, 17278, 39355, 21984, +65214, 8621, 51898, 35203, 3647, 28268, 55508, 16251, 42299, 23783, 58912, + 8403, 30849, 47669, 16920, 56276, 6145, 46442, 30003, 17710, 63086, 24287, +39407, 11444, 52718, 18676, 30999, 64126, 9184, 41087, 24759, 52352, 11257, +30170, 54064, 3690, 43485, 20768, 37233, 57303, 12333, 29324, 64806, 7145, +27463, 56008, 18865, 35700, 49195, 4928, 53955, 17489, 34265, 57858, 7204, +41891, 20255, 49761, 11663, 38564, 26173, 53006, 3489, 37544, 51448, 6386, +45270, 13329, 40904, 26801, 57384, 9709, 48418, 18040, 33389, 44715, 13164, +63172, 30390, 16002, 46944, 36819, 4512, 55634, 20592, 29774, 45719, 7965, +65479, 32690, 2861, 47043, 20072, 60692, 13566, 43011, 24250, 54999, 12644, +29494, 51818, 5963, 41097, 24442, 54446, 555, 39195, 21704, 51313, 11756, +33206, 63833, 5476, 43893, 19974, 31183, 52229, 11971, 46511, 18923, 31394, +48447, 13934, 42945, 22216, 52588, 1384, 32463, 49773, 16686, 63109, 28062, + 2936, 55798, 34592, 8582, 51816, 22451, 47689, 16743, 35781, 57767, 12078, +30505, 51957, 9080, 45422, 31922, 19209, 48152, 5871, 31589, 63376, 16647, +34772, 54913, 9240, 46025, 16407, 32413, 53885, 9774, 28414, 48437, 15514, +59623, 22900, 42083, 3794, 46616, 12468, 52313, 37477, 18151, 31700, 54958, + 4080, 33141, 47998, 8256, 64774, 20278, 33009, 56450, 12387, 42490, 21828, +54601, 9192, 44170, 28306, 15951, 58473, 30839, 734, 64619, 32596, 19079, +51276, 4661, 30277, 61526, 7637, 38902, 26847, 54368, 13960, 47324, 28097, +17696, 61276, 37902, 8793, 43470, 26042, 63275, 17845, 31174, 57370, 2621, +44295, 21630, 29692, 64071, 10999, 55924, 27523, 2377, 54145, 36799, 17521, +50549, 32234, 1352, 62354, 33897, 17773, 50342, 3236, 35958, 53406, 7107, +30955, 48677, 15525, 43759, 22173, 63719, 11650, 34467, 50407, 17086, 43241, +34305, 3666, 57750, 38097, 9078, 49838, 21749, 44002, 11092, 33446, 57654, +16098, 30160, 51163, 4675, 39151, 21082, 53570, 11958, 33789, 50827, 4306, +31667, 60101, 45571, 729, 62833, 36871, 19708, 47631, 12822, 64295, 30821, +19355, 52258, 4126, 35261, 48195, 17676, 54878, 30905, 1583, 52814, 28084, +19161, 65265, 14427, 33218, 54312, 10109, 61002, 28960, 12496, 47770, 36249, +15382, 30945, 58243, 6758, 27539, 50240, 1878, 61663, 24029, 40282, 13661, +53672, 20481, 35105, 58840, 771, 42690, 23743, 39258, 9068, 60942, 17674, +31572, 55068, 11802, 39111, 26127, 53949, 8205, 50497, 38169, 2908, 33893, +56309, 21092, 39909, 4570, 50916, 22626, 65071, 11151, 29962, 50035, 19980, +43744, 2563, 33541, 58143, 19365, 42984, 448, 49579, 20729, 28487, 60328, +12279, 30412, 56444, 1872, 43613, 29710, 16769, 38130, 62728, 10115, 46245, +32933, 1433, 52330, 18586, 35201, 63404, 10484, 38802, 26024, 43030, 20542, +57596, 3779, 31766, 49575, 6874, 61114, 26231, 46408, 2572, 39501, 23718, +55160, 6588, 46041, 21929, 65526, 13729, 33385, 58685, 16314, 47687, 1277, +33047, 54479, 15656, 36080, 51716, 2805, 43667, 11233, 60797, 19911, 30435, +45562, 9865, 51192, 22056, 31043, 56497, 961, 42757, 22688, 65128, 13995, +46357, 27461, 17302, 62391, 34597, 22324, 59488, 4735, 38756, 25657, 65231, + 676, 28798, 56675, 6995, 39251, 24824, 51834, 10989, 59597, 19049, 31846, +43813, 423, 56908, 24740, 40461, 15189, 52886, 26220, 39562, 4742, 51248, +21080, 41070, 1527, 62077, 37417, 17622, 47520, 22110, 59257, 8602, 32760, +48392, 17862, 59800, 3715, 29655, 45814, 16226, 57739, 37609, 1952, 60394, +24620, 42428, 4066, 62764, 23432, 50615, 5833, 30074, 64025, 18209, 46787, +27152, 5309, 53311, 37864, 21063, 43779, 13073, 64971, 37875, 2185, 31217, +60461, 7436, 46361, 25216, 40694, 2833, 56479, 15741, 37775, 59296, 10596, +51273, 22352, 39732, 1243, 50441, 18834, 30267, 64507, 4962, 47717, 18382, +35659, 56777, 2878, 45079, 30455, 8778, 57174, 34148, 19822, 64144, 29100, + 1940, 58414, 22604, 43717, 13143, 61812, 26626, 41025, 15689, 50825, 5012, +40673, 25872, 63881, 1443, 38627, 25354, 60414, 4270, 48694, 37175, 10430, +53649, 25150, 47513, 11863, 36081, 57769, 17261, 33096, 46603, 11314, 62717, +20515, 42180, 3694, 55863, 35381, 10460, 49782, 22565, 58295, 705, 33769, +50975, 7739, 40118, 23984, 47588, 14593, 52918, 3993, 35671, 44261, 18056, +48791, 32555, 6725, 60839, 14376, 43913, 26156, 54440, 9857, 41982, 25648, +57455, 12968, 41104, 23310, 62862, 2517, 32930, 56106, 8822, 39459, 26681, +55371, 6447, 28486, 61059, 10642, 46481, 27048, 17551, 62883, 34968, 5276, +59364, 25040, 47412, 2903, 36294, 54589, 12764, 44480, 26183, 61076, 1512, +43595, 23652, 63744, 14207, 40994, 21849, 32656, 54905, 15522, 28048, 52307, + 3756, 41709, 22792, 49324, 10393, 32921, 61166, 15819, 28858, 45363, 7081, +59973, 35160, 11734, 38104, 48988, 9172, 43981, 28979, 628, 47130, 37005, + 6143, 51903, 24621, 64526, 2617, 42695, 21513, 53691, 37978, 12277, 33552, +45105, 9323, 57792, 26552, 38920, 6189, 49694, 18528, 28760, 64820, 12510, +53161, 21298, 33696, 49998, 5982, 41363, 23587, 61440, 1146, 34995, 46050, +16824, 27702, 60713, 10782, 43643, 16147, 62506, 29134, 9365, 47946, 33687, +17625, 55014, 6436, 35359, 61074, 16781, 46432, 29565, 10982, 64818, 32604, +16055, 56799, 36999, 3310, 50719, 33820, 14835, 48383, 24913, 58310, 4557, +49810, 20153, 31089, 56969, 14079, 43171, 24773, 57868, 5492, 44410, 24493, +49460, 2151, 61833, 13095, 35484, 53614, 15314, 44883, 23752, 40314, 10135, +58538, 22416, 44372, 14033, 62179, 26640, 38635, 84, 41855, 26610, 50287, + 5938, 41313, 25748, 62525, 18525, 46085, 5342, 41303, 23268, 58972, 16352, +39161, 26407, 48336, 1613, 64148, 23886, 38904, 5339, 62501, 17384, 35898, +54026, 8028, 30393, 50242, 9946, 36786, 56403, 1472, 47918, 11611, 32547, +54962, 19290, 43584, 10747, 52816, 35259, 17040, 47901, 20587, 62014, 3207, +40943, 25913, 48810, 7207, 62812, 35344, 18232, 46713, 5907, 61174, 31659, +12168, 57945, 34494, 16123, 63793, 36626, 11210, 27690, 45566, 4343, 56521, +13601, 40296, 26423, 65058, 11267, 42060, 26058, 55053, 14135, 35701, 52748, + 8255, 27509, 49487, 20740, 39946, 10852, 55336, 33431, 15571, 37150, 54008, +11744, 43599, 34460, 9202, 58514, 38406, 14152, 30383, 59886, 7123, 49235, +20022, 28272, 55348, 15129, 40781, 23177, 54227, 13833, 34182, 62804, 20762, +43185, 28497, 3741, 46096, 26534, 62205, 13358, 43874, 25764, 57264, 10327, +41166, 22532, 31241, 61109, 11111, 42468, 21874, 65379, 14567, 40442, 25571, +54345, 6957, 39694, 16740, 49502, 36681, 7337, 55804, 24751, 39197, 615, +53261, 19151, 31825, 58770, 10646, 46972, 18112, 31897, 55968, 11836, 46465, +29822, 14635, 56925, 33268, 18178, 44589, 5315, 55391, 26262, 41374, 1825, +59293, 22652, 40023, 5941, 51202, 25351, 39165, 15895, 63800, 30779, 5567, +46354, 36881, 12205, 55654, 29148, 15960, 64982, 35581, 10201, 59697, 31538, +19771, 58437, 8553, 28079, 63009, 15937, 41364, 24599, 56373, 4277, 39452, +21404, 47495, 5450, 65459, 18897, 33416, 55060, 8171, 29481, 50272, 16364, +42020, 23593, 61908, 1156, 48069, 20483, 33412, 52118, 13391, 37023, 56058, + 429, 29544, 52404, 18822, 42556, 12189, 37890, 63251, 17490, 28121, 58844, + 8473, 40687, 17156, 30782, 56156, 10272, 39665, 26302, 59110, 7862, 19240, +42087, 9114, 58622, 34242, 17471, 61954, 36511, 5887, 57084, 24663, 44244, + 287, 54206, 23689, 40231, 14891, 50765, 22309, 61892, 5319, 31398, 55258, +16514, 62611, 27287, 18173, 57297, 38316, 9001, 31850, 49430, 18887, 61173, + 8143, 30185, 48963, 18811, 65415, 28949, 3997, 52507, 21844, 43435, 13236, +56024, 32946, 7532, 47908, 36894, 2410, 62076, 19048, 29884, 56966, 10823, +47789, 15782, 29980, 57761, 5571, 49312, 19995, 32068, 55167, 335, 34838, +52921, 19656, 42628, 3379, 60437, 37315, 21591, 49058, 12316, 27859, 54276, + 4454, 40927, 22036, 51407, 5854, 44453, 23442, 61309, 10025, 41232, 22256, +64213, 8222, 31647, 42333, 13351, 61708, 27097, 6342, 37586, 51416, 12077, +39937, 21904, 61115, 8103, 33015, 52270, 19201, 45736, 27979, 9383, 63967, +32633, 971, 56319, 35439, 19077, 52001, 4589, 34626, 50300, 12048, 47144, +20584, 61638, 9559, 31849, 59689, 19813, 39188, 7839, 53452, 21341, 37425, +63848, 10696, 28436, 47221, 6333, 54352, 21405, 40362, 13350, 55536, 26879, +43892, 10787, 49277, 27974, 15309, 59495, 37799, 4532, 61358, 28673, 20694, +43916, 15943, 52453, 23489, 40041, 7277, 61545, 26201, 39584, 14303, 60036, + 5991, 43175, 23398, 33761, 54458, 10083, 42150, 16874, 51005, 28566, 11959, +54033, 37584, 19102, 49200, 1935, 41351, 24547, 53362, 6527, 31009, 50347, +15422, 60954, 34556, 20307, 53084, 28326, 2203, 50759, 36071, 6299, 47240, +22245, 60770, 1027, 41736, 18842, 63206, 33701, 4800, 58801, 17661, 29282, +47331, 699, 57426, 20367, 28195, 60679, 3116, 48992, 19882, 27673, 56363, + 243, 46231, 18060, 32775, 61548, 4546, 44964, 34254, 10485, 64178, 807, +44677, 29422, 6544, 51587, 12838, 60955, 36172, 18708, 55694, 6182, 39227, +21574, 52582, 3928, 35869, 59038, 15352, 49085, 1650, 38819, 26857, 53305, + 6519, 31626, 50914, 168, 43335, 22042, 62106, 30334, 11773, 59396, 33725, +18492, 47301, 9731, 57023, 27006, 45286, 6428, 38924, 26541, 62267, 3634, +51511, 21509, 39158, 5664, 61653, 22892, 40893, 2794, 63379, 23522, 39518, + 9473, 60600, 20928, 49164, 14453, 35788, 53417, 12523, 31501, 60182, 1283, +48101, 21567, 53035, 14247, 27674, 58896, 20206, 40697, 4647, 48688, 21986, +54431, 1553, 40838, 23376, 50939, 12230, 38291, 47730, 844, 37155, 52916, + 8225, 30915, 51050, 13228, 59084, 28581, 16871, 49699, 36951, 571, 46798, +21883, 60794, 12500, 34473, 57155, 6887, 38685, 26095, 42767, 14798, 64168, + 4157, 45100, 27231, 16152, 60326, 38317, 8768, 46744, 26176, 55374, 7787, +30958, 50195, 1002, 32733, 45596, 20836, 64420, 5451, 46618, 22635, 53444, + 2732, 34666, 51390, 5112, 65327, 25668, 39354, 1727, 50855, 28679, 11649, +53046, 20865, 40530, 14429, 65002, 33563, 8918, 58252, 30089, 2896, 46112, +36748, 19873, 51423, 12930, 34390, 45465, 4536, 50127, 29681, 14354, 60035, +22418, 44833, 5638, 39906, 24043, 55111, 421, 43501, 14167, 37111, 56878, +16111, 33909, 62395, 1538, 39588, 24781, 60070, 16288, 28246, 45394, 13161, +51334, 37402, 4516, 42617, 21191, 64378, 36948, 9690, 42043, 24646, 63177, +11978, 42655, 23726, 60014, 7855, 38981, 23105, 50553, 14057, 28684, 56483, + 900, 38081, 63408, 9969, 31075, 48331, 15171, 62434, 25484, 39482, 13153, +46659, 26450, 55638, 5343, 35722, 47099, 19255, 54527, 761, 45424, 33526, +18233, 59640, 27752, 3217, 53633, 36804, 17138, 55369, 27550, 11728, 36247, +59325, 4198, 41027, 22028, 53044, 16134, 46706, 28044, 8348, 64735, 38258, +16720, 29647, 56789, 7327, 40168, 24422, 54956, 14778, 44830, 2451, 56604, +29121, 12979, 50230, 31109, 655, 55410, 34468, 18149, 61952, 31903, 9646, +59499, 34249, 4055, 51971, 18969, 33306, 57463, 2544, 44657, 31916, 18879, +46982, 12914, 53543, 35265, 7794, 64681, 30552, 3795, 54078, 34332, 18633, +50004, 2413, 56179, 22640, 31744, 49335, 15429, 58616, 1356, 29209, 64598, +21700, 39847, 3627, 58841, 30490, 8792, 62397, 22585, 30336, 56174, 10319, +45247, 21646, 59135, 174, 28476, 43219, 8986, 57443, 17299, 31637, 44743, + 9770, 62293, 30199, 12963, 49992, 37693, 16821, 28813, 55642, 9795, 48070, +22919, 36374, 51433, 8981, 65457, 22033, 40394, 6901, 36040, 47294, 15130, +32461, 64505, 9829, 43489, 36982, 21676, 52961, 11367, 41482, 24775, 56917, +16265, 39350, 24489, 49720, 11709, 58966, 36591, 21524, 47432, 27864, 1764, +50179, 24452, 42309, 9920, 63991, 30754, 19139, 44916, 8264, 55075, 32751, +20032, 60098, 12911, 44499, 23426, 62760, 11383, 35605, 55042, 15792, 41537, + 4531, 52709, 25861, 41172, 2777, 65123, 23072, 38652, 12225, 60785, 20776, +49787, 14576, 40099, 24458, 43701, 13388, 58094, 26563, 44679, 8434, 34966, +54861, 12725, 48321, 28602, 17588, 45213, 36906, 3404, 64910, 29624, 8095, +57323, 23764, 42422, 15033, 34833, 44105, 7222, 62311, 36018, 3006, 47109, +25067, 61506, 9207, 43722, 30912, 16661, 62640, 33662, 5009, 57077, 28862, +20390, 60406, 15081, 27123, 63806, 17995, 44266, 33209, 2171, 37787, 61487, +12158, 30650, 55630, 14732, 43459, 28392, 4665, 52237, 24702, 44824, 17232, +59858, 9089, 50712, 31136, 18955, 54815, 37641, 5878, 50260, 31188, 20322, +65381, 3133, 40070, 23430, 61395, 13863, 37660, 57515, 9602, 51517, 25129, +41600, 13543, 36279, 62183, 17434, 28321, 46390, 21612, 43641, 12610, 30063, +56583, 15098, 46671, 33530, 6885, 59311, 37161, 3413, 47993, 22850, 43295, +16099, 49358, 24777, 63852, 8347, 29697, 59001, 2030, 40786, 22603, 64780, +10939, 34389, 54059, 1251, 36180, 51209, 15591, 63442, 29445, 10969, 58507, +33029, 21190, 50631, 8504, 47623, 30175, 11674, 51432, 22343, 44533, 4978, +54597, 35293, 9444, 63573, 29192, 16946, 58555, 24223, 46563, 1995, 32622, +54495, 18831, 47772, 3791, 33796, 52106, 14720, 40372, 25853, 57789, 5018, +31652, 63917, 8510, 43404, 32937, 18495, 45554, 23266, 58699, 2340, 33200, +43233, 7880, 59261, 34747, 1190, 52497, 18537, 29099, 58592, 11862, 40378, +24406, 63662, 15141, 38241, 49087, 8849, 34882, 64416, 15025, 30583, 49088, + 219, 38183, 65388, 7252, 43887, 23375, 56669, 12845, 34190, 42307, 5538, +59919, 30733, 20108, 49154, 1927, 59346, 18089, 32739, 51838, 3929, 43141, +21366, 34583, 63412, 15926, 46851, 34532, 8349, 60420, 25266, 42147, 14848, +51049, 3360, 46031, 23232, 41265, 14469, 48041, 25815, 61090, 8412, 39570, +23015, 64406, 6590, 52701, 26717, 40080, 496, 59242, 22801, 41892, 14667, +46100, 24645, 62890, 10090, 40792, 26687, 45283, 12662, 64115, 4919, 35012, +45192, 19632, 50038, 11587, 33109, 55335, 14944, 43300, 20703, 51995, 35578, + 5338, 43919, 17447, 64997, 37471, 8363, 32509, 48426, 13012, 64259, 35554, + 4909, 47081, 24359, 54140, 15775, 39807, 22748, 58259, 3428, 32467, 64595, + 6059, 45162, 32149, 19534, 61172, 2438, 43315, 30943, 13599, 46325, 25329, +62084, 10255, 52357, 24344, 40903, 6038, 54474, 16797, 29523, 62888, 8045, +33736, 59569, 1913, 30457, 48138, 6895, 61940, 20036, 42729, 30843, 4728, +53013, 16549, 37611, 65178, 11028, 32638, 58117, 17477, 45785, 498, 33983, +61425, 23786, 41994, 5477, 51223, 26045, 39422, 2430, 56258, 17915, 46908, +28532, 8085, 60867, 21346, 32494, 45395, 10816, 57518, 20052, 31430, 50537, + 5217, 43255, 24191, 55194, 2165, 32657, 64363, 8094, 54484, 34177, 286, +48053, 15673, 65277, 30591, 19527, 51882, 1172, 33655, 62334, 7173, 50175, +28265, 16144, 47465, 36571, 18709, 49673, 4871, 64142, 28122, 17648, 51549, +29880, 11776, 55203, 38034, 14606, 32911, 52485, 18409, 49205, 6254, 41866, +25082, 51761, 13972, 35926, 44951, 7737, 50003, 38277, 3585, 29462, 56949, +11038, 46369, 21873, 52305, 6600, 40491, 24075, 63222, 9956, 35794, 48806, +18715, 64487, 1672, 33788, 48610, 21410, 40426, 2647, 58832, 29033, 10121, +62227, 23390, 43918, 11749, 34677, 56530, 19275, 51753, 4793, 44258, 27559, +18365, 47754, 36564, 2321, 60175, 31108, 6672, 49795, 37687, 11851, 57326, +53842, 8278, 48852, 34745, 4625, 63524, 23422, 43789, 18010, 50451, 27984, +13424, 60445, 31884, 5569, 56030, 37666, 11180, 33300, 52401, 15343, 43686, +25284, 56534, 8015, 46882, 26078, 41818, 12272, 57919, 18413, 28440, 47173, + 4245, 35312, 52209, 18070, 44638, 3113, 63838, 26113, 40584, 5515, 59378, +36340, 18097, 64469, 15117, 40800, 23143, 46600, 79, 55200, 34974, 7150, +52026, 27829, 14232, 59389, 28883, 8392, 38062, 57428, 11098, 30240, 65287, + 1729, 45003, 18820, 51359, 36838, 15028, 46873, 24554, 59601, 5623, 52673, +13616, 41596, 24742, 57095, 11579, 48937, 20070, 29495, 44846, 14539, 63214, +34179, 2956, 37984, 51813, 7490, 29751, 53154, 2595, 28176, 56824, 21443, +42304, 5293, 46107, 23262, 57333, 13899, 31815, 41940, 16873, 51148, 30255, + 1609, 62731, 24351, 48067, 11890, 37652, 55806, 14704, 41948, 25288, 45401, +10478, 64369, 26895, 48708, 9072, 28144, 51378, 4788, 42154, 22412, 54619, +17438, 38774, 5733, 65286, 20669, 36716, 57715, 7724, 30061, 63472, 142, +43410, 18323, 32224, 55317, 11428, 48459, 25457, 38605, 10365, 56683, 17668, +48265, 33352, 8942, 57704, 37049, 1731, 47766, 21587, 55494, 6721, 36866, +50874, 20217, 29920, 57703, 8997, 40669, 24668, 60754, 6419, 39202, 26341, +63282, 826, 41422, 14248, 59523, 25431, 48496, 3367, 28534, 54258, 16348, +41130, 23931, 52498, 10584, 39528, 21244, 62991, 1379, 33722, 55847, 7418, +43663, 26038, 52029, 14729, 40470, 23518, 53699, 11578, 46402, 27715, 16798, +54872, 37147, 4237, 56408, 19451, 34031, 44637, 1716, 59180, 23018, 33079, +51346, 3695, 46583, 22337, 50644, 14945, 37188, 53960, 12201, 44247, 27722, + 2724, 54609, 37718, 19274, 60053, 7599, 45137, 19889, 56231, 28367, 6991, +51157, 36967, 22220, 53725, 10924, 47559, 17939, 29645, 63678, 9177, 42818, +21198, 49941, 34876, 4864, 57813, 38149, 19059, 49051, 1501, 63503, 23876, +38748, 6709, 54041, 16779, 33453, 62984, 10258, 46425, 25990, 40765, 16513, +48680, 29259, 12383, 36916, 59865, 20800, 42044, 6396, 45666, 24755, 57571, +15140, 41314, 24632, 56148, 10152, 33920, 61623, 475, 43065, 25656, 54682, +10843, 36491, 47180, 1993, 60749, 23093, 41688, 6531, 64446, 27378, 105, +58174, 36452, 21139, 59927, 10611, 37873, 65182, 1920, 27618, 58055, 16892, +33699, 53828, 13558, 42569, 25879, 64654, 8487, 38768, 26736, 56549, 2943, +44977, 20902, 53733, 5992, 30307, 41811, 14609, 57625, 28244, 7196, 53968, +33322, 14259, 49553, 35435, 18034, 47735, 1467, 54045, 27934, 7064, 45846, +36669, 17003, 59823, 32036, 7451, 63059, 14350, 28495, 52982, 16127, 43552, +22277, 59451, 72, 32480, 41661, 23839, 59830, 14113, 41234, 21314, 54326, + 1203, 31698, 62246, 8307, 42561, 21998, 53420, 17237, 29114, 63150, 898, +40846, 23255, 60243, 5155, 39326, 17352, 50485, 35608, 3548, 61339, 22070, +32778, 45974, 8861, 62513, 25936, 40799, 9783, 60562, 26902, 38620, 13660, +46551, 20764, 53761, 10101, 32292, 48131, 2855, 56623, 32250, 11060, 50766, +25602, 41456, 12262, 59852, 20555, 37727, 49431, 5341, 35097, 61656, 17426, +45936, 22403, 55640, 13733, 38776, 26546, 54445, 9958, 29274, 61239, 2630, +40476, 21924, 48602, 17176, 35468, 54890, 6575, 38961, 26321, 65445, 3709, +38047, 54584, 8715, 27454, 47836, 19759, 60913, 10551, 32707, 46018, 17743, +62336, 36403, 11214, 51065, 18981, 35702, 62893, 7877, 28964, 49940, 3422, +61933, 27346, 8494, 58754, 37309, 20538, 43755, 9536, 52666, 27475, 3636, +32958, 62286, 6474, 52653, 23948, 38698, 813, 56465, 18533, 36070, 61783, +13491, 31808, 58163, 1563, 48078, 26523, 43543, 14080, 49598, 28247, 12186, +52763, 34679, 16156, 46855, 23961, 58813, 5059, 40154, 22267, 45319, 1961, +62028, 20530, 30777, 42933, 4372, 63802, 27990, 18291, 51916, 31414, 12111, +58865, 34656, 16319, 28732, 62276, 49, 48267, 17544, 35854, 54217, 2749, +30518, 51233, 10871, 44821, 22244, 49789, 17941, 33057, 52601, 9605, 39688, +22100, 60181, 6922, 33840, 61959, 2641, 43847, 23563, 58186, 15236, 29286, +48658, 11981, 41191, 23600, 61726, 9569, 38611, 21107, 58617, 325, 36003, +63670, 5330, 34616, 57572, 8632, 41751, 23523, 50193, 12159, 28767, 57884, +17652, 39416, 11026, 61788, 20399, 38691, 12282, 42427, 25285, 65296, 7320, +28963, 58365, 17682, 35492, 63566, 10116, 29018, 49466, 13568, 39695, 25766, +53394, 2977, 33713, 44215, 16093, 63068, 4852, 40185, 26016, 59571, 3403, +35831, 45221, 16794, 55759, 30762, 11682, 64994, 27437, 15198, 46127, 30223, + 9635, 53315, 27002, 42442, 13564, 60244, 25581, 47603, 928, 39012, 21213, +58607, 7503, 34823, 60592, 3354, 52283, 22101, 40489, 4561, 56531, 33131, +16881, 54022, 37445, 8733, 31575, 59737, 3878, 39647, 21683, 52420, 13297, +30513, 58231, 6624, 40280, 22166, 56538, 16564, 32151, 44678, 13064, 57062, +30624, 15831, 48039, 38333, 9360, 28746, 46054, 3825, 53536, 18306, 31673, +50508, 11781, 46411, 30126, 5268, 62730, 24097, 41057, 274, 47638, 23016, +58574, 15298, 42683, 32589, 11792, 59382, 36897, 22644, 62110, 8620, 45645, +35556, 19707, 61222, 12097, 44617, 22375, 64914, 5346, 41536, 24319, 59157, +16339, 31973, 63605, 12988, 48698, 29344, 618, 50666, 35790, 19418, 55240, +38305, 4165, 33179, 64808, 7639, 29571, 48181, 16756, 63892, 2548, 39138, +25874, 55835, 10161, 35823, 49539, 12108, 41223, 23788, 55579, 2419, 33088, +49676, 11798, 42454, 25274, 54129, 13754, 46910, 20943, 30982, 62343, 9907, +28733, 53214, 16378, 42967, 6634, 53600, 24362, 39341, 1721, 54635, 21838, +43321, 6106, 49823, 23571, 58736, 972, 39510, 26768, 61820, 13457, 29110, +42960, 20298, 53493, 4292, 62832, 18813, 31631, 44164, 3458, 64677, 16256, +40632, 25025, 51221, 653, 32210, 42362, 6481, 50096, 21013, 62309, 4368, +35824, 47958, 17178, 55908, 28106, 11853, 64520, 38227, 119, 28688, 61634, +18271, 46449, 12767, 51792, 28424, 17430, 57974, 36458, 5017, 53488, 26011, +43239, 16431, 55723, 6179, 40681, 24345, 59218, 1370, 44580, 27473, 15966, +54036, 37990, 21263, 47242, 14738, 35542, 54330, 18419, 48813, 5183, 32403, +63668, 16524, 36601, 58149, 12688, 43961, 23161, 41157, 11553, 60705, 20933, +31331, 47792, 7610, 41514, 24337, 50674, 11250, 39334, 22967, 60103, 9254, +34291, 62607, 2236, 44707, 22685, 56520, 6019, 38166, 50298, 12858, 30788, +63104, 15027, 51664, 26395, 38945, 7139, 59848, 19212, 50983, 36083, 15356, +44575, 5774, 60838, 26830, 42948, 3913, 54279, 37907, 13838, 42048, 24995, +60152, 7775, 42659, 22533, 65330, 16094, 37232, 58130, 7099, 31138, 61784, + 2373, 44296, 26464, 55860, 11678, 30574, 50107, 17924, 45718, 27764, 9168, +53609, 36197, 5329, 51343, 18806, 32884, 56747, 2872, 44356, 26848, 54565, + 6710, 31107, 50517, 13828, 44264, 29828, 19968, 47220, 15751, 60482, 32948, + 1138, 64282, 36914, 7848, 48864, 26091, 54734, 6458, 44496, 26560, 56235, + 887, 48994, 20099, 35791, 45750, 4286, 51315, 14304, 41317, 22495, 57034, + 348, 32983, 62686, 9629, 42876, 23828, 60444, 11600, 48731, 20280, 29497, +56467, 8906, 32313, 49378, 14305, 58007, 27372, 835, 51468, 38155, 7357, +33103, 59705, 3094, 50400, 36001, 18373, 56750, 3909, 45998, 21279, 40349, +11220, 56056, 26943, 51247, 13776, 42763, 29908, 18457, 44962, 11588, 63791, +25310, 46591, 9742, 28051, 49178, 2601, 62969, 22207, 47497, 13685, 43263, +26727, 64525, 7602, 47891, 23879, 44260, 15602, 31466, 63095, 4171, 46392, +27197, 8056, 49576, 36398, 2821, 60308, 23527, 51877, 18880, 34561, 56033, +12694, 41260, 23999, 61785, 8076, 40027, 20997, 58766, 35342, 12545, 50371, +19776, 61077, 10298, 33981, 45408, 4431, 54325, 18840, 28823, 46144, 1045, +50459, 16862, 31002, 55233, 3906, 47970, 25978, 39428, 158, 56730, 30848, +13019, 36616, 52072, 9305, 45297, 35717, 4492, 27237, 57928, 15412, 42550, +23248, 56939, 9320, 44648, 24770, 52315, 11425, 40222, 24516, 56461, 12814, +35274, 9599, 50271, 20550, 44536, 5348, 62756, 28123, 17678, 52615, 33804, + 6592, 64494, 26056, 44447, 9004, 61584, 21307, 39001, 7362, 58526, 34356, + 2547, 51986, 18783, 45961, 37067, 143, 63959, 21339, 33759, 59381, 13771, +48772, 20167, 34959, 57209, 16033, 31494, 63279, 11872, 42398, 24918, 55278, + 8211, 41280, 22593, 57741, 7338, 45841, 34225, 14509, 38073, 47668, 8772, +57248, 21358, 33721, 53135, 10635, 44606, 20908, 56034, 15076, 63487, 25272, +40259, 9324, 44570, 24210, 58101, 12768, 32676, 42157, 5250, 50357, 32256, + 9822, 53345, 20135, 44422, 30308, 8223, 59464, 37483, 1686, 32934, 45294, +15205, 59998, 22024, 41205, 382, 65045, 20766, 35873, 49982, 14178, 30703, +55135, 9708, 47700, 36895, 4716, 60837, 10384, 32573, 58061, 2294, 44595, +31318, 12380, 55989, 25100, 45196, 454, 54244, 20884, 29657, 50034, 2751, +57252, 26068, 39620, 5078, 53379, 16491, 59097, 29017, 3093, 64521, 33697, +19865, 53036, 4511, 46297, 30241, 18555, 53930, 37298, 10396, 31452, 64618, +17439, 27853, 53792, 3227, 35955, 44109, 9032, 57709, 21862, 41571, 13326, +47652, 28967, 2808, 55204, 25877, 48808, 11328, 38793, 20632, 64912, 9678, +31600, 52369, 5064, 47348, 19425, 34042, 55528, 12872, 31996, 49262, 4169, +27209, 53841, 13478, 40535, 23598, 56978, 5867, 38761, 20710, 63548, 1059, +34719, 58532, 14911, 42836, 24339, 64128, 14029, 30616, 59764, 9970, 39230, +21930, 65247, 12423, 33161, 47108, 17816, 59589, 28105, 7908, 61844, 36493, + 3239, 52368, 22198, 45265, 13385, 30062, 53088, 19225, 42366, 2812, 34960, +63799, 18144, 39208, 13884, 60264, 31911, 8451, 57745, 27246, 18645, 61340, +34731, 6327, 46415, 24044, 52314, 14909, 40350, 21252, 55607, 6034, 38553, +26963, 54777, 1284, 35885, 46840, 12401, 64431, 23315, 41401, 7719, 34559, +62533, 18430, 43933, 24603, 54784, 12664, 40038, 22829, 62289, 10599, 39053, +24133, 64199, 8240, 30836, 58181, 18576, 44331, 6164, 33055, 54219, 1671, +61849, 26715, 38879, 5837, 53768, 18254, 35779, 59066, 14098, 44006, 30136, +11286, 55213, 34975, 1543, 50863, 16631, 38592, 20663, 60119, 2434, 52786, +35498, 10253, 50560, 19338, 34373, 65481, 14042, 54006, 24409, 39115, 11333, +45058, 4818, 63585, 17032, 30970, 57479, 1192, 33577, 47647, 17666, 54488, + 2719, 45745, 25194, 39740, 6502, 52077, 21431, 29927, 49207, 14032, 60163, +33707, 9563, 65219, 35335, 20102, 56828, 11278, 40223, 23180, 63348, 9392, +36155, 51398, 15221, 43721, 25503, 55644, 3013, 28398, 61865, 18336, 38347, +52533, 10197, 34463, 64682, 5864, 40701, 21867, 61030, 1357, 34814, 58249, +20585, 42957, 3405, 51699, 28586, 38301, 13510, 60722, 33146, 16621, 46848, +37267, 3107, 59440, 24583, 47466, 14044, 39527, 20003, 51528, 35154, 3951, +57039, 26539, 43475, 12691, 65475, 24148, 41071, 9350, 56075, 17556, 30041, +50878, 11535, 41383, 4383, 30245, 65087, 10202, 41506, 2993, 53079, 24121, +39153, 5081, 51019, 18743, 36504, 64975, 2227, 30190, 49275, 16928, 61383, +27181, 1312, 59211, 30157, 15350, 50563, 28020, 2462, 62044, 37354, 7563, +30872, 47665, 3151, 52438, 19733, 35329, 59266, 1036, 29718, 53586, 8019, +45468, 24552, 62663, 15706, 40215, 23118, 60526, 4073, 34987, 55733, 14360, +43098, 22941, 64150, 9110, 31024, 49031, 11236, 38714, 26674, 51284, 12569, +28561, 60490, 2871, 43370, 19435, 33205, 63840, 13425, 30087, 50786, 18938, +45766, 27848, 15542, 64786, 23751, 40727, 9050, 60963, 19833, 33825, 40633, + 8251, 65083, 18256, 34257, 47854, 9461, 62794, 19730, 34678, 47023, 10777, +36740, 44976, 17782, 55562, 10041, 40368, 26148, 58715, 15945, 43117, 6679, +57004, 21418, 48665, 1261, 36699, 45991, 9942, 60887, 27126, 17342, 54773, +29835, 829, 65383, 32471, 8695, 58282, 37675, 14021, 63233, 23298, 41817, + 1037, 51254, 25623, 43567, 17190, 56680, 27950, 14511, 63623, 38260, 1487, +28299, 61414, 9732, 45402, 37909, 19086, 29971, 64313, 8654, 43115, 25252, +54620, 13755, 41501, 23279, 51362, 7247, 28983, 55707, 3546, 40877, 22435, +50316, 583, 45313, 26624, 52991, 5097, 41618, 20750, 56164, 2022, 39277, +24118, 48124, 14458, 55255, 25446, 40136, 7015, 59322, 26359, 39885, 10105, +62378, 24575, 48096, 12666, 30353, 51693, 4982, 45931, 22692, 52705, 16237, +36680, 45084, 1603, 49228, 29963, 19574, 64819, 38147, 9119, 31231, 59747, + 2379, 47153, 25136, 63325, 8630, 40668, 21411, 60884, 16609, 28287, 44759, + 2223, 53912, 20010, 28977, 48068, 10766, 57185, 4420, 34046, 46766, 19915, +52250, 403, 42122, 26686, 48697, 14840, 54268, 35573, 2477, 48434, 22395, +65428, 15064, 40040, 23203, 47755, 12714, 56903, 20646, 30418, 49966, 772, +41420, 23328, 61319, 5172, 40001, 25784, 63556, 19082, 32491, 58553, 5768, +45867, 24647, 39955, 14480, 61423, 20618, 28316, 55573, 912, 43957, 22680, +40956, 6063, 62251, 26685, 53448, 20351, 38642, 8355, 49585, 26126, 44329, +19646, 64055, 7087, 38758, 26877, 59735, 10837, 33073, 64371, 15875, 42316, + 2061, 57653, 25130, 39596, 5814, 44605, 23309, 52398, 3126, 43268, 26678, +58552, 5531, 45243, 28893, 17738, 59540, 33086, 6539, 63976, 19648, 37602, +50482, 12465, 30809, 56186, 1879, 46440, 27868, 17566, 51472, 32577, 12667, +49963, 30416, 18045, 46195, 8731, 61901, 33471, 18494, 57563, 30669, 49226, + 802, 27589, 51563, 8944, 57208, 22223, 43750, 7821, 34577, 55161, 449, +60900, 16199, 30460, 46428, 10888, 53599, 19744, 33112, 48584, 6520, 35014, +60800, 20356, 47003, 5841, 34978, 58104, 22765, 46482, 15128, 52049, 33633, +19227, 61580, 13098, 45900, 34203, 20912, 59822, 10307, 44505, 27789, 15903, +56161, 38309, 6085, 33048, 51397, 18004, 37723, 54265, 5815, 46040, 23833, +41502, 13480, 56619, 25583, 43150, 12266, 55103, 37891, 10492, 31134, 47135, +17785, 64874, 14181, 38848, 21096, 51711, 2131, 31307, 56269, 8728, 33299, +49825, 16541, 45634, 27846, 6811, 50794, 34929, 18658, 55043, 5585, 61490, +23416, 43738, 4160, 57234, 34857, 9012, 48219, 25422, 56177, 5658, 45290, +24303, 41446, 685, 59849, 33529, 7057, 51770, 37289, 3535, 53656, 22914, +43355, 5832, 52121, 15370, 46774, 25455, 54718, 6961, 30550, 43313, 14226, +55903, 27947, 1325, 63597, 23980, 49309, 5642, 42654, 23769, 60994, 394, +31367, 50073, 10821, 39833, 26433, 61730, 11751, 43835, 24764, 58635, 15754, +34792, 50932, 5562, 37842, 46087, 11962, 50029, 23071, 42356, 16092, 51455, +31294, 6186, 45911, 18737, 58521, 33754, 8274, 61749, 37371, 2646, 32314, +49614, 7389, 44153, 24136, 51540, 16553, 33288, 59069, 12258, 46877, 387, +51731, 32952, 17460, 60006, 3990, 47070, 31051, 9881, 36423, 60635, 18615, +46852, 31169, 10737, 57125, 35453, 19369, 62637, 13529, 42475, 24234, 60551, + 8273, 34846, 45248, 17152, 63036, 5706, 43423, 30469, 11385, 65126, 33896, +18317, 54047, 2313, 46830, 30828, 6160, 55273, 36765, 20605, 61092, 10709, +34247, 42602, 3238, 64385, 27572, 11936, 55595, 32889, 15432, 53352, 3474, +27531, 57659, 12116, 45906, 23582, 41633, 15266, 34086, 47987, 13349, 52127, +31151, 5222, 38439, 58491, 15585, 36109, 61667, 6015, 42679, 23234, 40929, +16196, 64693, 28737, 6611, 58225, 32497, 18043, 61514, 5552, 29303, 43882, +12367, 60995, 26239, 38933, 7152, 51734, 26219, 58286, 3692, 32919, 45960, + 8491, 64828, 17360, 33944, 55978, 10801, 32161, 52942, 17542, 46674, 7066, +52194, 14059, 42455, 26897, 55655, 8726, 49616, 31816, 4563, 48717, 38416, + 8995, 32710, 59348, 12693, 51377, 30870, 17651, 48308, 1635, 43395, 27011, +61175, 15515, 54229, 3500, 39750, 24971, 52142, 13740, 43995, 22531, 56052, + 4189, 48630, 28906, 19512, 53574, 34900, 10605, 63598, 21856, 49696, 15583, +31870, 62464, 10486, 38835, 20900, 49820, 11854, 32113, 54261, 2435, 47616, +23210, 40599, 10259, 45757, 24315, 60212, 7246, 41635, 21753, 62554, 11919, +36400, 58873, 3645, 43188, 23542, 63346, 5504, 36826, 54318, 15079, 27410, +47477, 6352, 58658, 11626, 36253, 63117, 21055, 41397, 15291, 32399, 64942, +12287, 50977, 29676, 18033, 44990, 36777, 5989, 64053, 23782, 39549, 1537, +59563, 16909, 30275, 51604, 2845, 39976, 26261, 55023, 14383, 42054, 1411, +60435, 25509, 39159, 6277, 44257, 24915, 55532, 371, 49333, 16408, 30920, +47656, 4622, 60676, 35053, 11462, 48110, 23463, 63402, 9135, 43894, 28024, +13883, 65504, 36818, 9710, 59687, 22174, 45499, 5096, 35340, 64116, 16509, +27828, 60621, 5675, 41839, 25119, 49375, 3872, 33102, 57405, 15145, 46211, +23676, 41350, 13544, 63986, 27314, 1135, 57782, 38396, 21377, 62228, 3101, +45602, 25967, 40375, 13792, 52927, 19282, 31958, 46431, 15394, 64498, 22788, +40364, 11119, 34842, 61589, 18203, 53524, 12622, 39366, 22251, 57721, 17031, +47018, 28585, 13226, 62507, 30658, 18890, 58582, 35946, 1997, 42351, 21685, +60454, 36736, 4044, 51218, 20615, 33877, 53057, 12173, 40305, 18511, 57247, +31795, 8658, 51352, 36835, 14604, 65010, 22073, 46890, 2889, 33032, 51791, +18398, 41074, 4015, 55226, 29855, 13815, 62792, 27896, 18359, 57128, 35424, + 6541, 61500, 28331, 3567, 55923, 36449, 22210, 49920, 11761, 28998, 53278, +14953, 44558, 23162, 57546, 11554, 35621, 60593, 13494, 29914, 54125, 3273, +42257, 27739, 20287, 62733, 35570, 7591, 50231, 26114, 39421, 14599, 64798, +25730, 48900, 1759, 39802, 13366, 63386, 23555, 41749, 7735, 49690, 31653, + 3956, 54789, 37677, 16051, 30727, 57726, 10102, 52024, 28330, 18996, 58867, +37628, 664, 50483, 23864, 45543, 14357, 35760, 58050, 16915, 43152, 22835, +58814, 103, 29672, 47428, 18393, 56766, 30930, 13608, 50742, 37774, 5274, +60545, 21340, 36078, 44181, 8147, 49971, 35158, 19868, 61596, 7458, 54293, +29579, 3676, 65494, 36561, 19278, 55207, 27076, 8314, 49854, 31410, 13541, +52010, 26925, 60185, 1591, 31939, 50018, 14108, 43467, 23438, 49304, 9722, +35101, 55081, 19325, 47699, 32281, 4599, 53643, 18263, 46698, 35289, 10725, +43374, 21169, 60298, 14766, 40822, 25015, 51554, 6884, 39589, 24424, 57833, + 2757, 38547, 21008, 40961, 26367, 60999, 218, 38910, 21853, 65036, 17852, +37379, 57372, 11752, 27075, 62799, 17848, 45663, 27754, 3936, 55844, 37254, +11918, 59021, 21095, 39311, 5521, 47022, 19194, 34397, 59399, 8899, 31270, +62384, 612, 40373, 18753, 34958, 44618, 12746, 60647, 4870, 41211, 26530, +48012, 766, 29522, 57390, 6944, 42436, 24066, 54891, 1539, 34754, 64591, +16035, 42634, 24537, 60952, 14058, 34126, 58152, 883, 49047, 17120, 39267, +26703, 44997, 4936, 53541, 28357, 16774, 37831, 54751, 10906, 29513, 48993, +19763, 41997, 2066, 65242, 37468, 21123, 33955, 52487, 17153, 46022, 5726, +30711, 54768, 1979, 48247, 25662, 38917, 4474, 60090, 24525, 53058, 10052, +31749, 49388, 14610, 54908, 25142, 41960, 7659, 63496, 24860, 48206, 8664, +32852, 63041, 18585, 29447, 53872, 9534, 45532, 21818, 59123, 11394, 38580, +26993, 64016, 9472, 41490, 23425, 52248, 17401, 29188, 54936, 823, 41711, +19445, 35440, 56994, 3284, 49256, 32823, 19876, 51963, 267, 32796, 54062, +17925, 29223, 47247, 1811, 50695, 19207, 34984, 56244, 9624, 30482, 61893, +19183, 42806, 7003, 60958, 28489, 4862, 47760, 37019, 17557, 51591, 29378, +12016, 48586, 19239, 30706, 59718, 9934, 32785, 47925, 949, 62618, 28936, + 7250, 36229, 51589, 1737, 57772, 16912, 29619, 42567, 3161, 47226, 26281, +64285, 4503, 44112, 30509, 7987, 56473, 36827, 1131, 50373, 38483, 11039, +28665, 63225, 17485, 49293, 11814, 28723, 46459, 17483, 62111, 6666, 41862, +25506, 59837, 2392, 39072, 22168, 61896, 16985, 45574, 28479, 6392, 56139, +35024, 16221, 59298, 29598, 9374, 64210, 35519, 22127, 49469, 7809, 33559, +48334, 2390, 43184, 24063, 53408, 12855, 33998, 47216, 17855, 64347, 8010, +32763, 59663, 2042, 39718, 21506, 62649, 6079, 30344, 51046, 18459, 41788, + 5251, 57047, 22108, 36283, 49032, 9181, 55686, 15508, 40712, 23339, 56346, + 2288, 45771, 21310, 54163, 6360, 32955, 59357, 19314, 45921, 32767, 4467, +54166, 28191, 17752, 61446, 38300, 11086, 28270, 64473, 1313, 45987, 23517, +39715, 4266, 48748, 32310, 13171, 54586, 20748, 41286, 5137, 62668, 28301, + 9508, 51515, 33365, 11747, 37966, 50206, 15426, 63033, 6665, 41296, 24151, +45668, 8781, 58180, 18342, 29161, 48466, 10226, 63919, 30632, 17498, 54996, + 1053, 33196, 44919, 12612, 50912, 25600, 39541, 11312, 59204, 52, 37329, +45109, 20276, 63839, 3231, 38872, 16673, 45821, 22186, 56489, 11433, 35966, +63165, 2949, 30362, 59324, 16866, 42852, 1378, 63636, 23772, 40319, 14428, +59118, 30036, 88, 62849, 24892, 48263, 6362, 34707, 54552, 2068, 43457, +22281, 62202, 14484, 42238, 26556, 60023, 7902, 50575, 16071, 30644, 54205, +12471, 47089, 29752, 3176, 51822, 16021, 43400, 33945, 1773, 53522, 37275, +15201, 63941, 32137, 7002, 50728, 24054, 42665, 14223, 64886, 25277, 50356, +11621, 40978, 21459, 55755, 14403, 46839, 26188, 51195, 7660, 57239, 27973, +18090, 52491, 36517, 12023, 61603, 19045, 36211, 50709, 14621, 33110, 60425, +13250, 47125, 28511, 7435, 51650, 35850, 4408, 53069, 29578, 8661, 42456, +22501, 55451, 33710, 11114, 61355, 20328, 48980, 9533, 33330, 64122, 326, +44118, 22399, 60247, 6103, 34144, 56774, 16437, 28182, 50555, 7383, 27142, + 3540, 56272, 37455, 19957, 61761, 13866, 42282, 22799, 58565, 9577, 41322, +20554, 47170, 12836, 37671, 62117, 3374, 28687, 45320, 12171, 56754, 21282, +38867, 12943, 58300, 22348, 44611, 4068, 37852, 48125, 13368, 32939, 64614, + 3270, 42046, 23620, 56434, 5932, 39762, 21301, 58239, 2495, 35836, 63023, +12867, 43411, 24110, 61132, 7471, 30879, 46641, 16655, 27259, 60412, 10497, +41809, 26194, 62532, 8564, 36648, 57630, 14302, 40819, 24109, 59043, 11537, +40022, 23306, 52636, 521, 39166, 26343, 55325, 11302, 33986, 50031, 18927, +58997, 7322, 34774, 63315, 4424, 37319, 53137, 7678, 42887, 24098, 54629, +12043, 39743, 17337, 56971, 21264, 40861, 10665, 48886, 31961, 22145, 60214, + 9404, 52128, 23179, 38588, 11701, 55126, 19547, 35345, 60643, 14854, 48651, +27232, 17985, 55473, 32769, 4885, 36990, 53039, 8038, 44953, 34119, 190, +56845, 21579, 36532, 49845, 13978, 30752, 55185, 11680, 46558, 33594, 4216, +54659, 37619, 12761, 42900, 24496, 53014, 5375, 47825, 21079, 39174, 597, +53883, 19093, 37683, 57577, 14642, 27351, 64834, 7378, 40457, 21789, 60331, + 261, 39126, 26527, 51760, 16353, 42280, 24269, 55521, 10638, 48893, 26143, +40471, 634, 64002, 21081, 46497, 33704, 8108, 65115, 18883, 30590, 45737, + 4815, 59667, 29648, 10026, 62458, 36498, 12842, 41840, 24654, 51949, 8401, +28110, 55300, 16046, 42404, 12082, 58792, 34820, 2459, 51917, 21125, 47711, +14946, 33087, 50283, 12280, 57129, 29464, 15721, 63371, 36284, 8749, 60000, +25049, 48218, 12524, 36558, 55022, 3506, 27240, 64685, 8219, 44145, 28608, +20161, 53369, 34980, 2422, 61684, 21907, 34201, 54660, 613, 42848, 24420, +40325, 5598, 58943, 26076, 40057, 15807, 62596, 22425, 42367, 5962, 53010, +23146, 46221, 16768, 27824, 57111, 12069, 33922, 47612, 20963, 58847, 6892, +40441, 25884, 50989, 8601, 40016, 21830, 53471, 7842, 38903, 26522, 52731, +12950, 33547, 56644, 5736, 42727, 20451, 52553, 34021, 12962, 38394, 57485, +17998, 28022, 64095, 9987, 31263, 47578, 4506, 55641, 12425, 34140, 45063, +22176, 63739, 4930, 34664, 41649, 8477, 59478, 21049, 36310, 61932, 9412, +27527, 58017, 20358, 47419, 10402, 28473, 44249, 18721, 60606, 36025, 368, +56217, 31298, 7673, 36823, 54833, 2454, 45176, 25365, 38956, 5138, 65345, +17009, 32326, 41833, 1791, 63135, 30948, 8479, 45210, 24299, 54492, 6307, +39590, 26131, 52867, 3759, 40433, 21619, 55869, 16773, 40061, 22413, 63077, +11455, 36727, 50065, 16657, 65438, 6226, 29562, 48050, 2247, 40842, 23896, +57352, 15705, 40755, 25289, 56378, 13222, 39902, 26123, 52226, 8893, 36015, +61287, 13861, 44886, 18000, 64374, 29334, 10661, 46810, 26202, 52837, 8061, +33784, 46116, 17030, 63728, 32940, 1157, 57801, 22288, 48136, 15954, 36050, +60317, 5099, 42847, 26026, 53658, 539, 31720, 51004, 14978, 28130, 59699, + 7398, 52843, 27627, 19376, 50527, 36131, 8540, 47727, 26393, 54089, 13644, +31830, 50685, 8897, 45585, 27593, 4365, 51636, 37674, 20364, 58534, 11972, +36390, 53621, 5503, 47592, 30414, 15489, 44545, 21668, 53123, 6676, 31557, +62894, 4008, 45280, 33495, 7192, 65173, 18311, 48252, 34421, 12904, 45311, +21645, 64350, 2012, 43642, 30500, 22202, 54581, 14111, 45014, 27503, 17056, +57262, 34185, 2661, 65326, 22291, 33941, 52541, 4587, 43247, 25373, 63373, +15797, 44465, 5902, 49706, 35876, 19637, 62979, 7295, 41954, 26779, 50624, + 2082, 45883, 28263, 10575, 36053, 65253, 8957, 45878, 25195, 59063, 14490, +30425, 64132, 19306, 43568, 12740, 53566, 27762, 3386, 65468, 38139, 8152, +29108, 50974, 20101, 63918, 15285, 27608, 49555, 1707, 63202, 22544, 40151, +13654, 60207, 26551, 43025, 10595, 62050, 30230, 4779, 50778, 38279, 16574, +33242, 52174, 10415, 46441, 24589, 54882, 12547, 40578, 4323, 63070, 35363, + 7505, 46147, 31756, 15652, 58919, 36577, 10288, 54924, 28405, 15637, 50586, +38152, 1667, 53538, 24681, 42875, 13378, 37753, 53027, 18015, 27851, 49551, + 3656, 61677, 20240, 37725, 47855, 80, 65416, 29997, 21593, 48910, 9070, +43429, 25487, 60128, 6313, 41531, 22264, 62022, 2989, 38883, 24733, 45055, + 5880, 53401, 22863, 40313, 1842, 43350, 26378, 58510, 15470, 46373, 31439, +19280, 56067, 36545, 4201, 60107, 13970, 46937, 25337, 40728, 11244, 50273, +17180, 31023, 62390, 13901, 50905, 22950, 45569, 10880, 52628, 29889, 3072, +55485, 35212, 16284, 60219, 30854, 8744, 63005, 37937, 4000, 51371, 29573, + 9652, 53015, 35373, 18367, 61927, 4283, 32959, 55472, 13280, 46724, 34547, +19997, 62156, 3790, 40862, 23204, 50512, 10395, 29185, 64605, 16575, 40935, + 7392, 61384, 28762, 3156, 49209, 37224, 15584, 52469, 38444, 16645, 28951, +49609, 20237, 61595, 1430, 31401, 43226, 19341, 56963, 13347, 44291, 24823, +50522, 5866, 45720, 17081, 30867, 49273, 7486, 35524, 58848, 2877, 52060, +33443, 13657, 27352, 49441, 10351, 45227, 22549, 62912, 15229, 29272, 60173, + 8669, 51691, 20006, 34337, 46255, 11758, 54569, 23168, 47509, 16039, 35756, +59567, 3283, 41950, 22018, 65026, 12537, 44142, 23730, 62008, 8325, 32692, +59163, 413, 45890, 30364, 19147, 58785, 3247, 44007, 28171, 18583, 54213, +36619, 14285, 62278, 31268, 4215, 50045, 36314, 7433, 51567, 31703, 3084, +62642, 17725, 46989, 29932, 1237, 48887, 37853, 32028, 50788, 6941, 35635, +60380, 192, 39424, 21740, 55921, 4904, 29667, 50683, 14806, 44754, 25846, +40737, 7485, 54487, 18411, 30506, 40374, 11345, 65195, 18064, 36073, 46078, + 9016, 62055, 34330, 17260, 46421, 36707, 1022, 56768, 14507, 31346, 62572, +18147, 40774, 1646, 61479, 27830, 17693, 38112, 57292, 14959, 33366, 64800, +10893, 29031, 48374, 1431, 42904, 24128, 64403, 13108, 35020, 58828, 2180, +49533, 25228, 42470, 12513, 48178, 21606, 54806, 15460, 40664, 25696, 56662, + 3520, 29872, 60007, 6261, 51810, 27743, 16908, 37940, 58244, 10416, 46454, +33669, 301, 62056, 38110, 9422, 51319, 24948, 41038, 14159, 48686, 8678, +59606, 23199, 38532, 2260, 55594, 33923, 17481, 28142, 56854, 67, 44379, +24533, 58645, 12899, 34211, 62140, 17597, 38307, 56236, 5485, 42609, 22613, +53815, 2590, 39448, 21906, 50216, 4399, 38813, 25925, 60759, 9838, 31920, +51835, 14728, 45360, 24436, 60354, 862, 42461, 31286, 7712, 57881, 38048, +17658, 32843, 47191, 8090, 55774, 32532, 3726, 51374, 24365, 45754, 13484, +41453, 22490, 61042, 1786, 28596, 58350, 19562, 42252, 5387, 34741, 59359, +19443, 49353, 28558, 13882, 58072, 23503, 48254, 2923, 28594, 52070, 19605, +44015, 4498, 61665, 27364, 14074, 57989, 35204, 6566, 63089, 22254, 48022, + 852, 32872, 57363, 8803, 35507, 44316, 11638, 58305, 27128, 16639, 36654, +45259, 5455, 57219, 31224, 17440, 53260, 37210, 11886, 30670, 55156, 18216, +43587, 9459, 58398, 19428, 49069, 30276, 10769, 64110, 33512, 20418, 49881, + 7838, 37493, 61963, 994, 41993, 12147, 51236, 31392, 17687, 38311, 54371, + 9528, 29715, 65351, 5092, 44579, 25786, 39591, 2697, 57414, 37190, 7238, +32588, 64613, 21034, 43983, 14117, 50212, 28114, 1829, 48111, 33932, 20945, +54397, 14174, 41790, 24012, 64888, 1099, 43866, 26421, 49444, 15165, 41753, +23225, 65233, 580, 29361, 56170, 16272, 43149, 8746, 60395, 36116, 19943, +49160, 1965, 32097, 55943, 21673, 44273, 11997, 54201, 32251, 8001, 56490, +27390, 533, 59390, 37640, 8662, 32892, 46567, 18019, 58018, 10018, 48619, +23239, 39342, 2170, 64309, 32741, 18674, 56661, 37539, 673, 63228, 23774, +45187, 16153, 40399, 21595, 64497, 5734, 37152, 58001, 16830, 32545, 52519, + 4565, 43297, 35157, 20867, 47228, 13292, 58866, 27761, 3444, 61019, 37662, + 6996, 29577, 55622, 13118, 48564, 27505, 16630, 51951, 35489, 1968, 55588, +30874, 14937, 48718, 27301, 12233, 52287, 37183, 7970, 47771, 26249, 55125, +13285, 34761, 49640, 9186, 57728, 24785, 41783, 10650, 53756, 20894, 28877, +64996, 14813, 45837, 20734, 36811, 42849, 10088, 59871, 23853, 55399, 12399, +44515, 22345, 56558, 15655, 41644, 25593, 58078, 11134, 41066, 24827, 62677, + 8791, 35475, 56877, 4258, 30688, 64308, 21066, 43775, 2263, 58740, 24309, +47200, 6766, 28880, 53063, 19970, 40769, 4824, 55553, 27281, 11966, 60924, +37786, 21326, 43110, 5159, 52410, 24962, 46159, 11816, 33391, 59434, 5400, +41804, 22476, 49878, 2791, 37093, 55447, 15381, 31292, 52740, 18572, 40663, + 4731, 55157, 22820, 40343, 17719, 63823, 5900, 39268, 26406, 60220, 1113, +32182, 52133, 8635, 43907, 22606, 50536, 16194, 35731, 42290, 9215, 61409, +29518, 3771, 53551, 20085, 27138, 49026, 14819, 28631, 59220, 19414, 46861, + 5773, 61180, 30035, 20130, 44992, 10322, 54068, 26840, 45808, 13313, 64952, +37541, 11218, 51747, 21103, 39176, 6499, 48472, 29602, 4011, 52446, 27060, +15930, 33220, 61223, 12433, 41354, 26811, 62880, 10847, 32737, 57843, 17963, +47877, 6136, 42606, 36064, 20452, 58994, 6910, 40898, 18683, 35253, 56810, +13848, 44811, 21870, 50361, 5761, 61498, 28109, 19540, 43972, 11895, 58547, +36359, 17500, 63669, 6907, 31324, 55411, 15365, 47725, 36659, 8845, 45590, +25525, 63923, 14444, 30965, 43376, 1318, 55833, 33850, 6583, 43366, 18857, +62368, 33158, 12320, 59844, 22811, 32900, 41445, 8823, 49779, 31105, 20238, +44899, 16142, 54794, 35177, 11868, 43570, 24022, 64559, 16095, 28507, 51599, + 4884, 32071, 50282, 10468, 60901, 23064, 40936, 12878, 63781, 1109, 44925, +23181, 51020, 4819, 34695, 64904, 21321, 41053, 265, 33657, 54447, 17680, +44292, 4070, 55867, 13959, 30675, 52213, 16248, 28252, 57075, 20813, 44625, + 6966, 63244, 27481, 1445, 57961, 35638, 21100, 51846, 13199, 56323, 20283, +47522, 11785, 28513, 59959, 17223, 40949, 4618, 57162, 31433, 9178, 55951, +37094, 18042, 61399, 5453, 43579, 25334, 59799, 10536, 39585, 21575, 57647, + 8127, 31876, 60550, 10078, 47499, 18667, 35297, 51978, 10873, 46151, 22300, +30006, 47311, 5936, 57275, 27730, 16050, 52068, 36775, 4968, 60005, 26018, +39434, 13786, 63210, 18967, 34487, 46120, 11014, 51925, 22576, 65144, 3970, +39453, 26648, 52294, 5561, 35708, 58750, 15837, 28549, 52682, 10557, 42520, +21754, 53296, 13146, 32307, 59931, 4238, 29449, 47965, 9688, 55123, 23993, +40294, 2197, 61289, 19415, 28037, 48836, 11304, 57561, 1071, 41176, 21988, +31736, 52296, 10328, 41375, 21527, 63887, 81, 34739, 43634, 8971, 62291, +29856, 10826, 46762, 18754, 38466, 58122, 4892, 34602, 64316, 16367, 42993, +23532, 60502, 5098, 40289, 21769, 62892, 1394, 31591, 46080, 5601, 34026, +59590, 18608, 45342, 986, 33984, 49424, 11235, 57885, 27496, 4513, 52797, +34713, 19975, 40969, 2686, 49850, 13113, 33363, 62392, 6016, 48364, 18096, +34961, 53677, 2816, 28360, 49320, 17761, 42183, 23533, 50196, 13054, 37439, +51897, 10442, 32601, 55402, 15194, 37117, 61108, 1822, 43690, 23558, 64106, +15259, 32899, 51230, 3670, 29331, 48817, 8953, 57938, 32052, 16457, 65367, +37846, 7924, 47202, 24735, 53491, 13269, 32441, 56688, 9863, 42451, 22305, +59039, 6985, 35689, 62178, 14618, 45640, 32875, 10156, 52663, 37057, 20302, +56335, 13216, 29348, 47667, 17955, 62092, 36883, 13635, 30933, 63628, 1499, +46506, 23852, 54060, 15004, 33679, 50598, 13147, 38340, 64748, 8297, 35085, +55001, 3935, 43821, 31418, 15859, 38292, 50816, 748, 33375, 62437, 20907, +39192, 7876, 53220, 30728, 3665, 58330, 25400, 42148, 15200, 54114, 19329, +64624, 37311, 11504, 38478, 57460, 610, 44136, 23507, 55669, 6367, 38906, +21037, 52078, 1068, 38581, 26764, 54818, 15464, 62407, 2040, 29625, 44526, +22591, 54124, 10172, 46931, 28018, 3066, 62943, 36928, 15038, 31998, 48553, + 2604, 54282, 29940, 20387, 49215, 1136, 33910, 52416, 19826, 40014, 5135, +62364, 30617, 18905, 52716, 2832, 36295, 53948, 10035, 48092, 27322, 16659, +65515, 37464, 22236, 53378, 8536, 37286, 50053, 1094, 43144, 16146, 57228, +28802, 3026, 63743, 36628, 10496, 59215, 4296, 28380, 51984, 19913, 46954, + 2837, 37299, 56010, 13830, 34650, 63164, 19555, 39824, 2114, 54050, 34482, +18609, 49577, 29572, 10263, 60471, 37882, 16397, 28028, 51803, 12975, 46975, +25565, 61648, 6873, 39199, 26814, 60661, 18892, 35396, 45521, 6388, 65018, +34712, 2957, 40421, 22710, 52766, 14291, 37365, 49243, 18266, 45864, 7514, +41835, 31621, 3793, 60977, 34501, 22628, 49638, 1324, 35323, 52233, 20472, +42656, 12203, 63453, 26025, 41693, 7827, 49515, 19557, 36942, 50594, 2442, +31179, 55488, 13217, 41282, 25211, 53816, 2740, 39324, 26205, 57294, 5417, +38818, 26192, 54667, 2329, 64273, 18394, 35222, 43706, 9620, 62400, 30139, +14686, 48020, 22777, 43014, 1743, 51291, 24152, 41963, 5929, 60748, 25545, +40581, 12931, 44702, 23910, 56314, 15260, 29910, 62597, 11379, 40238, 26141, +49286, 3560, 31356, 57786, 7802, 39345, 26905, 50856, 11359, 36739, 56128, +17309, 32154, 43526, 12976, 53173, 22834, 46329, 9252, 35990, 64740, 17814, +34013, 50026, 15909, 62547, 5906, 44306, 24553, 58075, 14308, 28361, 47029, +18227, 58648, 33052, 5085, 49224, 21102, 60883, 37065, 8701, 28001, 50820, +19737, 40260, 2593, 54470, 30995, 14646, 35918, 53310, 10905, 43192, 24193, +48224, 15261, 63916, 21354, 39657, 9880, 55192, 26479, 60715, 6828, 41808, +19134, 33372, 63311, 15188, 46387, 7611, 61509, 25754, 29604, 53932, 4084, +45361, 20944, 30207, 65394, 9882, 43831, 19768, 59206, 37069, 11529, 61962, + 745, 34095, 58025, 8208, 27684, 62974, 18958, 41597, 5764, 49606, 27808, +17741, 57410, 34729, 10278, 38389, 54310, 20223, 45580, 12959, 63545, 24423, +39738, 13829, 50314, 3081, 28045, 55458, 19756, 42397, 178, 62708, 27771, +17164, 38143, 63701, 3767, 28065, 49095, 16805, 29202, 51045, 697, 27307, +60961, 7730, 29496, 46625, 2738, 35802, 58712, 7345, 43334, 27644, 4311, +57045, 38441, 10360, 28248, 59397, 17981, 41000, 5023, 62775, 22509, 44868, + 2300, 29959, 57661, 18774, 42174, 13132, 51900, 23290, 63501, 7429, 27803, +56340, 16958, 41965, 5182, 57595, 25829, 43393, 14395, 36450, 46857, 8692, +61664, 28393, 2458, 46139, 32252, 7414, 59365, 27716, 18833, 51129, 31843, + 9917, 45699, 25378, 60019, 14177, 43113, 24524, 64462, 7537, 46627, 21070, +34570, 50492, 11305, 58227, 36847, 4672, 64813, 17760, 32704, 52332, 11326, +41805, 25190, 59388, 8939, 40926, 16343, 65217, 37553, 9909, 60527, 24998, +43902, 11153, 54689, 24712, 43225, 12196, 58895, 23319, 46941, 16814, 29632, +61650, 4584, 35916, 51955, 11378, 45308, 3701, 31468, 56336, 14996, 28328, +64430, 9982, 36983, 46820, 18562, 51241, 12231, 41212, 25687, 49044, 17200, +37154, 62252, 6732, 31534, 59977, 10773, 42554, 23504, 48721, 7921, 29420, +59019, 14684, 47409, 28219, 6612, 56616, 35905, 20406, 46178, 7587, 56044, +32944, 3397, 58696, 37562, 9830, 45462, 23197, 56602, 12819, 42445, 2224, +52833, 21294, 27612, 47678, 11336, 58631, 25762, 43186, 8846, 61527, 30512, + 4435, 58864, 33107, 22231, 63613, 14154, 48165, 19541, 44286, 9657, 55778, +17825, 30143, 61887, 6315, 48400, 24739, 39004, 528, 53849, 20700, 34867, +64470, 11435, 27610, 58415, 15329, 34445, 45811, 4994, 50218, 17136, 33684, +64004, 12164, 43312, 23873, 59856, 9093, 41878, 20415, 32736, 50239, 12392, +58418, 27062, 849, 51350, 38066, 7748, 65328, 19321, 34947, 58704, 11424, +47896, 33407, 17389, 55048, 2371, 36342, 59900, 7172, 33534, 49976, 1035, +42494, 21269, 54463, 6560, 33821, 59758, 15003, 44563, 24408, 65371, 1895, +41555, 22599, 61570, 6793, 45824, 27337, 876, 63657, 36432, 6266, 59160, +26467, 41770, 3080, 55363, 29156, 8082, 39993, 26719, 53255, 17233, 35263, +49593, 4025, 31519, 53901, 11519, 41567, 23520, 56125, 14368, 34073, 42983, + 1171, 56527, 32492, 11784, 59940, 24941, 44640, 9543, 63499, 25722, 40905, + 6782, 61167, 17497, 34341, 56005, 8160, 30184, 51208, 3581, 44577, 23495, +38942, 16211, 47599, 24734, 54234, 1847, 43222, 31449, 18205, 55780, 38162, +11186, 35472, 19221, 59503, 10562, 37073, 53136, 1471, 40225, 23461, 55212, + 5334, 30436, 45252, 16074, 53098, 29266, 19570, 48016, 36922, 3218, 46342, +23749, 59352, 13256, 32434, 51501, 7837, 46893, 27431, 2606, 58906, 30732, + 7498, 35133, 44174, 671, 56653, 34041, 18999, 52849, 36667, 10706, 60622, +30150, 15472, 48761, 36595, 7264, 52468, 19740, 46805, 33737, 9304, 57536, +37766, 12528, 54235, 33885, 18008, 38001, 50322, 10775, 64697, 27203, 16593, +53257, 37415, 20345, 47172, 14741, 51435, 21156, 35165, 45117, 8445, 54851, +25085, 39310, 12306, 56221, 26012, 50223, 6445, 39292, 25727, 60636, 1386, +32637, 45503, 18315, 49101, 30671, 11189, 60028, 35008, 19004, 50058, 1520, +63753, 20341, 29988, 51228, 12700, 34905, 55711, 16289, 49552, 24072, 43290, +13092, 54550, 4575, 36201, 63890, 16725, 50015, 3152, 34573, 53252, 11783, +41367, 17358, 30296, 57242, 3723, 45573, 27672, 15973, 30889, 51475, 20853, +43720, 6546, 60876, 22650, 49167, 1, 30350, 55206, 21051, 47425, 4715, +28422, 46097, 18875, 56630, 3972, 38678, 22006, 64544, 525, 41590, 32002, + 8064, 56887, 37308, 11032, 43020, 21557, 58502, 15054, 30101, 49684, 20054, +60735, 7017, 35827, 44437, 19408, 53958, 27070, 4951, 61204, 35076, 21514, +54407, 309, 30120, 56041, 9447, 40797, 22790, 49919, 16590, 29874, 55373, + 1256, 35720, 57613, 18841, 44913, 4192, 41873, 23642, 61341, 15638, 43033, + 2532, 64324, 25641, 41307, 14224, 49875, 27468, 17298, 63154, 32228, 4646, +51104, 28887, 16809, 63520, 31128, 9287, 59802, 37140, 17052, 50927, 5727, +33700, 53980, 16122, 46483, 27099, 9867, 50481, 37245, 229, 53947, 26644, +39121, 5946, 64756, 24334, 45525, 10735, 39850, 23272, 57631, 12852, 33860, +59317, 15543, 46891, 28886, 3785, 53337, 37679, 7388, 47964, 18664, 62679, +22163, 30341, 56188, 6483, 40382, 21771, 51138, 1222, 32117, 52872, 13692, +63013, 27183, 4048, 45673, 37035, 10220, 54538, 31320, 17573, 45642, 24473, +55772, 3350, 29278, 45296, 5324, 63813, 21166, 30433, 50523, 14269, 45807, +29255, 18325, 64656, 35349, 13547, 47704, 25204, 62013, 10940, 41139, 22630, +55171, 9056, 38585, 20743, 53984, 12518, 32998, 48702, 15634, 58403, 34680, +19751, 49538, 29955, 13446, 51336, 21448, 45378, 11036, 36724, 59908, 20487, +42487, 1575, 64343, 9861, 39307, 22363, 59376, 7700, 35848, 64849, 2684, +30609, 51562, 9673, 62789, 27198, 17427, 49074, 36618, 4509, 52952, 17106, +32857, 48037, 714, 57334, 20714, 29961, 50862, 2921, 40544, 25456, 58292, +15890, 34891, 61717, 12600, 52399, 4753, 35919, 64279, 13460, 29094, 59138, + 9828, 47403, 27329, 600, 64652, 51590, 6484, 44082, 24068, 49625, 16017, +29047, 60582, 13141, 34453, 47747, 9532, 61198, 24131, 40725, 6981, 65033, +13968, 50903, 28710, 15770, 53457, 36821, 47, 62466, 23190, 42778, 16406, +64868, 37351, 13807, 49188, 22001, 61835, 18346, 47886, 10036, 29058, 63131, + 5580, 47698, 22819, 40509, 4022, 57781, 31945, 12598, 61758, 24137, 43735, + 1908, 60226, 23417, 40363, 5060, 64169, 25850, 42178, 3402, 55982, 23062, +43346, 15017, 33952, 48164, 23, 63017, 29878, 7772, 58079, 33150, 2870, +65399, 19014, 28986, 46983, 635, 58730, 34512, 8041, 48010, 17865, 32431, +56879, 11228, 40704, 21718, 53215, 9073, 35639, 65140, 3070, 43508, 23760, +52850, 6868, 31267, 48260, 17339, 40734, 4741, 59555, 25712, 39707, 6792, +62932, 31234, 1267, 37015, 60807, 17829, 29461, 48503, 8283, 42337, 28362, +18579, 58440, 31124, 5285, 61554, 26300, 49137, 12910, 32145, 63648, 8253, +38354, 60010, 1385, 47289, 24511, 39409, 12977, 33793, 57645, 18656, 40237, +10860, 33294, 59806, 15222, 35420, 51913, 12719, 41981, 25733, 53113, 9633, +33651, 50081, 14736, 60820, 24678, 40211, 2178, 55173, 25396, 50269, 6268, +33586, 63557, 120, 40577, 26037, 47646, 14140, 51775, 2502, 30783, 58278, +16566, 45184, 30771, 6354, 38275, 65256, 15969, 44616, 23696, 58724, 2384, +33054, 63973, 8555, 39950, 21192, 51388, 6206, 30442, 65085, 17050, 37555, +51823, 9152, 32200, 54451, 21541, 39440, 10508, 52551, 34079, 914, 57494, +36932, 8676, 49311, 19426, 36302, 55285, 8312, 34614, 47033, 19993, 53736, + 488, 45026, 30070, 19491, 63886, 27741, 2000, 38324, 60617, 19261, 29439, +56934, 11657, 42638, 21368, 58233, 15442, 35860, 53030, 2242, 32501, 54544, +16619, 47077, 4173, 29440, 44766, 6796, 62234, 18885, 32392, 45976, 14769, +60919, 24975, 39974, 308, 51858, 12795, 43674, 25708, 58913, 9499, 34843, +61477, 15965, 44126, 28100, 6876, 38321, 49498, 17637, 59184, 27667, 13725, +61742, 35616, 5599, 49547, 27919, 13413, 53823, 37680, 15950, 32309, 48769, + 9931, 61449, 27285, 4321, 53995, 38323, 7825, 27937, 55358, 3324, 45068, +19724, 30428, 52234, 36, 43044, 25561, 60732, 5069, 43899, 26668, 63035, + 2644, 29415, 41810, 10849, 54764, 3689, 37179, 57156, 7819, 32053, 61806, +18351, 48282, 5271, 30949, 56632, 15425, 44787, 26948, 55440, 12134, 41077, +26493, 50472, 15595, 45352, 27284, 19205, 47512, 37743, 6411, 44911, 13468, +65291, 21458, 28237, 57887, 11415, 43878, 18607, 34702, 54631, 13192, 42774, +22763, 65129, 10247, 29015, 48995, 28, 42642, 22617, 29867, 57071, 11097, +39851, 21801, 50711, 5648, 35248, 53516, 14590, 42607, 22761, 37788, 17201, +31559, 63444, 8162, 35587, 56439, 3933, 46143, 27511, 17472, 50845, 31950, + 1886, 55665, 35459, 21371, 43700, 5168, 57582, 38452, 10862, 30595, 54783, +19454, 40392, 4666, 50494, 29830, 9816, 53719, 25595, 42995, 4875, 39168, +26581, 58666, 15252, 42976, 31376, 9241, 55076, 34259, 19310, 49537, 25315, +56167, 6211, 40732, 18702, 30492, 54610, 10754, 49913, 30429, 14065, 46933, +20501, 58348, 9138, 36953, 61473, 5645, 27646, 54652, 12041, 44444, 23602, +41231, 12888, 55308, 22960, 49316, 6480, 36177, 61152, 15527, 43064, 27728, +19976, 64253, 37047, 2541, 46289, 24753, 63024, 4769, 28915, 58394, 14534, +40430, 21669, 54746, 11849, 38726, 26976, 62732, 9105, 33191, 56572, 22083, +42669, 10962, 54969, 22882, 41264, 14323, 52793, 21380, 45507, 9418, 58020, +33963, 20014, 62653, 1682, 49116, 36235, 11172, 46039, 21447, 54517, 377, +35976, 43688, 19022, 53941, 27116, 11995, 34551, 52908, 9887, 62563, 26507, +43260, 3529, 51996, 25779, 64080, 5927, 43896, 25597, 57339, 1485, 32189, +63411, 7568, 30110, 59987, 18636, 44497, 28700, 5744, 48118, 18186, 65055, +31845, 12663, 38306, 46732, 16059, 54208, 23630, 43638, 9011, 57051, 22577, +33606, 63295, 11165, 38320, 49274, 9144, 27588, 57558, 13530, 47457, 27499, + 7197, 34466, 51707, 12497, 45245, 22081, 53762, 13264, 43842, 25686, 56348, +11006, 33647, 48346, 431, 27256, 62758, 18795, 46905, 4973, 59441, 30625, +17869, 62256, 23362, 42425, 12346, 46012, 24273, 59247, 1599, 41222, 22513, +61028, 5979, 41128, 28474, 14827, 57474, 38470, 10658, 34646, 47498, 14619, +55294, 31861, 5239, 48758, 17264, 35859, 62723, 3559, 30491, 51007, 8943, +41075, 20182, 59868, 28472, 8410, 64195, 37091, 21528, 56844, 13929, 41426, +23038, 54875, 2084, 35483, 44236, 8804, 57365, 31594, 19967, 63688, 36381, + 4370, 49254, 19770, 29389, 46321, 3455, 56778, 34357, 19051, 60627, 30053, + 8248, 36055, 52773, 2683, 44298, 22449, 57124, 16952, 32743, 62740, 8596, +44560, 22943, 56806, 321, 42991, 19773, 35695, 57889, 16240, 43401, 22097, +59093, 14602, 32856, 63486, 9442, 39217, 17022, 56752, 33432, 13485, 48755, +36039, 19089, 57033, 9845, 35764, 52844, 18486, 44780, 23352, 65081, 15048, +40854, 24665, 52320, 254, 40644, 23903, 63272, 12698, 39539, 24812, 52930, + 5748, 38515, 20832, 61884, 950, 34153, 57677, 7211, 31708, 52777, 3654, +60195, 27902, 18363, 51842, 35739, 2183, 49495, 38189, 6174, 62383, 24324, +48853, 4106, 28853, 56931, 7130, 36515, 51746, 18478, 33233, 62780, 8956, +53165, 17504, 33380, 48058, 2469, 61066, 24354, 41080, 16835, 62977, 30840, + 3734, 58765, 12958, 54393, 2228, 43006, 24797, 51012, 15193, 41015, 21228, +64063, 6162, 36316, 58397, 15730, 28703, 48593, 11965, 60069, 27517, 17923, +32861, 63859, 4021, 45587, 28208, 12729, 56812, 36335, 17900, 61385, 1396, +33248, 55861, 12625, 49740, 20802, 41247, 2125, 57147, 23631, 44438, 16380, +64235, 1199, 41643, 11386, 32735, 48036, 15781, 65245, 36489, 5576, 42421, +19484, 62305, 36923, 1468, 52484, 31758, 22085, 45778, 13977, 51684, 31555, +19926, 60496, 35801, 5248, 58949, 26147, 46252, 10203, 40878, 25793, 52075, +11659, 32405, 55263, 5318, 48590, 12773, 41434, 23042, 54203, 9972, 35192, +51597, 17800, 46824, 32065, 6617, 61252, 26376, 45797, 1974, 55648, 20589, +43867, 16067, 47455, 516, 64222, 26772, 38517, 4137, 48579, 24964, 65423, + 3022, 39085, 26531, 51685, 5604, 40008, 25578, 52724, 14797, 43941, 25061, +65156, 7209, 41958, 24916, 59651, 13854, 47551, 4921, 37053, 58030, 19742, +42704, 31340, 5593, 54757, 17972, 47765, 35566, 12602, 41756, 23835, 55632, +10037, 39679, 22230, 50431, 16688, 47080, 37505, 2933, 55749, 12448, 36584, +57243, 21706, 43737, 7615, 52353, 27678, 3292, 62029, 28773, 8059, 36933, +59763, 17942, 39522, 5332, 45539, 19945, 52817, 27200, 1392, 61905, 37771, +20266, 52405, 3870, 37532, 62861, 15047, 39934, 26287, 60653, 5151, 38536, +27015, 61981, 3339, 41274, 22415, 60238, 14388, 37002, 54819, 8414, 43636, +23739, 40269, 15179, 55267, 7165, 35646, 50304, 3977, 29883, 65499, 14571, +39868, 26177, 56850, 10879, 33582, 48856, 17527, 64553, 36257, 4537, 27055, +61871, 7405, 51970, 22460, 40264, 12101, 65196, 26348, 41141, 8262, 49929, +23231, 43747, 14794, 62102, 25845, 46238, 5058, 35374, 50672, 18444, 43860, + 978, 51303, 30649, 10314, 48576, 25045, 65434, 12256, 28787, 48301, 16818, +51092, 5993, 45205, 27817, 16318, 55826, 38267, 10502, 65043, 24569, 41984, +14239, 47558, 181, 50748, 22588, 40950, 16350, 64744, 30862, 9279, 37113, +51849, 1263, 41147, 25377, 60189, 6339, 39018, 25369, 64228, 12411, 28132, +46485, 9164, 52496, 30951, 1349, 49781, 37989, 22958, 53517, 5386, 45530, +26135, 64434, 3806, 29989, 55667, 7072, 46181, 24327, 40717, 14139, 60256, + 5314, 38570, 26853, 49141, 8936, 60899, 19300, 35714, 54909, 7336, 32689, +51274, 2550, 46337, 20079, 60446, 13556, 43886, 25483, 51078, 11138, 41822, +22723, 63378, 12884, 35629, 42563, 11003, 57201, 32981, 16104, 61443, 27057, +10033, 52633, 32321, 15516, 36696, 60294, 11837, 42126, 23987, 46046, 2316, +58088, 13453, 39758, 25016, 45490, 6402, 59383, 21306, 44200, 12839, 32054, +56119, 8892, 44008, 20008, 49453, 28428, 62239, 18170, 47078, 33979, 11888, +61434, 36708, 359, 48073, 24838, 54830, 10436, 40352, 23003, 63159, 7561, +34103, 42577, 1061, 55941, 37709, 10022, 52114, 20408, 31949, 60353, 7205, +48432, 24821, 41460, 14841, 46280, 22671, 59547, 5903, 31707, 65102, 14419, +37368, 51767, 6552, 30690, 46854, 17885, 59789, 26335, 44852, 3170, 52969, +29323, 12853, 49021, 24706, 55520, 7844, 28663, 43998, 18541, 59291, 4455, +36062, 64983, 10336, 41696, 2376, 46504, 17721, 50545, 21024, 39274, 1659, +63875, 34912, 19891, 59497, 3586, 40523, 22284, 62399, 16961, 33358, 57842, + 7283, 29597, 61740, 15724, 43856, 27404, 165, 57277, 37241, 13380, 41623, +17784, 53475, 25313, 39552, 5323, 58228, 27027, 38742, 12420, 50833, 20788, +59701, 10181, 44278, 33394, 18338, 56372, 11887, 44073, 22402, 61379, 12824, +32429, 59223, 3591, 39846, 19407, 32590, 56868, 10153, 39175, 23034, 63026, +16979, 29492, 49459, 2827, 64596, 14535, 40122, 25349, 58929, 8623, 30224, +61371, 2201, 48996, 20019, 36416, 62655, 4382, 27946, 59170, 9314, 29106, +45197, 16073, 51740, 27228, 1231, 62752, 30265, 17177, 35068, 59231, 13766, +45984, 34429, 19324, 52306, 1866, 31936, 64648, 21522, 49528, 12631, 34700, +59412, 17315, 43845, 28286, 10387, 35446, 55339, 17722, 30812, 46553, 888, +56884, 19720, 42670, 11917, 46981, 20627, 51926, 15582, 30858, 45664, 6776, +50229, 28217, 17348, 58511, 35360, 1817, 51387, 25504, 43298, 16897, 61191, +21999, 47359, 8961, 33772, 54382, 5208, 44419, 21152, 52395, 2852, 30138, +46016, 12106, 54305, 38186, 17428, 32560, 44111, 3352, 59332, 23854, 44810, + 789, 57624, 19852, 33021, 60432, 11375, 39308, 1526, 52515, 16930, 30339, +57870, 10054, 39287, 25676, 63071, 16031, 37441, 58955, 4717, 40779, 18261, +34054, 60060, 3172, 38950, 25454, 58539, 10075, 35502, 61838, 1772, 33210, +48416, 17837, 54176, 5588, 38998, 26519, 63278, 11746, 31399, 55222, 4901, +41971, 23844, 58126, 15101, 43282, 21814, 55341, 12656, 34364, 50872, 18069, +44012, 7646, 53515, 32742, 2693, 62895, 37116, 19201, 60275, 28231, 11968, +43763, 18113, 61272, 21207, 40351, 10145, 50320, 23451, 42188, 15944, 62449, +33239, 1119, 54197, 22437, 45516, 17858, 57416, 2072, 42684, 30551, 11249, +46532, 25375, 59511, 14474, 38997, 26788, 55922, 8930, 32803, 40573, 3229, +64155, 18966, 36475, 56202, 4785, 28267, 48049, 19815, 55383, 310, 29489, +50403, 7841, 45510, 38375, 18109, 29104, 64550, 1503, 40646, 19474, 50379, +30388, 7915, 63565, 37959, 19920, 30991, 55643, 3814, 50455, 26692, 38672, +10150, 64841, 26172, 51512, 838, 39260, 25181, 57978, 5843, 34830, 10207, +51930, 29092, 4543, 55404, 20053, 27818, 57910, 9108, 44700, 19032, 33157, +52100, 2662, 45101, 26296, 54537, 14712, 47354, 28460, 16880, 61917, 25647, +40995, 2218, 46654, 34505, 18690, 64577, 3766, 31741, 52700, 11022, 39968, +24958, 53987, 8258, 46919, 20078, 27800, 61214, 12825, 35693, 53560, 4791, +39079, 22409, 58298, 14596, 34883, 62773, 434, 45002, 17270, 33204, 61121, +12245, 47693, 27548, 16020, 49753, 29804, 19052, 55675, 34926, 14338, 63284, +29328, 11209, 54465, 32514, 17078, 48798, 7101, 29700, 51107, 14464, 46540, +28668, 1242, 52301, 36231, 18871, 49619, 3464, 33715, 55695, 9227, 47774, +30850, 20089, 63867, 4153, 48918, 32370, 10475, 62031, 35789, 14013, 49100, +23104, 61106, 6988, 41884, 31211, 16790, 49876, 6139, 61949, 25477, 41278, + 233, 55225, 34859, 7931, 46959, 23477, 55976, 16040, 50670, 5836, 45040, +26139, 55602, 1525, 31770, 51880, 9477, 43383, 27669, 18592, 55779, 35762, + 688, 50500, 20824, 39395, 15942, 54192, 32618, 6813, 46186, 15529, 52781, +33481, 19548, 48991, 36878, 5051, 64270, 20946, 35262, 49086, 9121, 37823, +53779, 4478, 42387, 25052, 56603, 10305, 41402, 24714, 57510, 11777, 44262, +28390, 4199, 55796, 30374, 7672, 37039, 51176, 3122, 64840, 22465, 41913, + 5659, 60029, 24229, 50619, 10087, 38490, 27042, 54602, 7832, 64233, 34508, + 1594, 58205, 19330, 36215, 63335, 3796, 30906, 45514, 13268, 64706, 28965, + 8062, 57181, 37084, 2694, 32544, 53479, 11402, 41572, 23113, 58131, 15738, +31827, 62644, 13442, 39577, 23395, 60200, 1234, 27547, 49474, 13857, 56352, +29157, 10439, 53351, 37377, 16926, 29013, 45769, 6595, 54970, 25092, 49053, +19040, 36692, 64855, 6062, 42714, 23444, 55892, 3380, 31487, 53188, 8652, +28214, 49566, 20657, 56281, 9648, 41988, 23677, 55074, 13852, 41608, 21848, +52150, 15319, 45856, 28221, 8384, 60767, 23637, 43128, 16129, 53304, 7406, +36981, 57753, 20602, 45218, 14056, 51201, 29780, 3815, 63575, 38217, 7077, +30766, 59106, 3019, 38622, 26707, 56474, 13704, 47365, 24936, 40836, 11308, +50791, 4180, 34545, 55816, 7479, 47835, 30903, 1584, 54148, 35378, 17749, +58922, 2924, 31349, 51635, 13316, 43511, 26666, 64201, 6104, 39064, 25122, +47489, 13965, 63451, 33874, 3867, 50704, 21031, 42614, 5464, 65519, 22358, +45102, 15671, 57941, 23389, 47729, 7496, 31145, 49882, 16723, 61129, 33990, + 9228, 43252, 25816, 64000, 14616, 31578, 59301, 4322, 35089, 56054, 12300, +43396, 26158, 58909, 5350, 53731, 35176, 17826, 48028, 10671, 59929, 22948, +42301, 14151, 54529, 20199, 41267, 5200, 46710, 18886, 30147, 60789, 14370, +46478, 22584, 39216, 44349, 19252, 63832, 33116, 10956, 38435, 49284, 14399, +31252, 64772, 5050, 41008, 22311, 61556, 10901, 39059, 21022, 60657, 8383, +36008, 50682, 4776, 43194, 13963, 56286, 23091, 49672, 9670, 29607, 55544, +15840, 35279, 62248, 345, 45693, 29559, 16681, 60216, 35922, 2887, 38474, +49123, 10470, 29199, 63612, 20215, 43107, 7566, 50167, 25286, 39393, 11667, +57436, 26463, 40391, 3497, 53409, 34238, 8368, 57926, 37495, 769, 61778, +27254, 7452, 53826, 37466, 3263, 45676, 22749, 62145, 9526, 36784, 56988, +18685, 33681, 64915, 6275, 44090, 25570, 59932, 13190, 44936, 24444, 64509, +11636, 40035, 22875, 59455, 12369, 34629, 42792, 15125, 56153, 22287, 46518, + 7797, 30301, 57215, 2831, 44328, 18794, 33464, 53465, 1828, 58701, 26569, +38887, 19046, 53416, 10674, 30634, 45074, 16730, 63952, 26603, 41742, 2268, +31327, 61725, 19979, 38810, 8657, 48443, 22196, 59217, 16362, 33361, 61056, + 6050, 48185, 31868, 11100, 62067, 26228, 45397, 7616, 65413, 23550, 43719, +13847, 58457, 25004, 40609, 355, 54966, 13343, 60116, 24793, 41315, 11263, +54280, 18949, 28194, 61229, 14342, 39189, 20388, 51600, 758, 32248, 62495, + 6775, 47169, 35195, 17154, 61382, 37722, 10977, 48107, 24829, 56895, 14958, +30989, 45871, 12335, 56112, 25658, 39373, 14076, 44199, 20793, 61544, 2806, +47745, 24108, 40436, 12887, 44512, 25601, 53973, 8934, 39999, 25021, 55618, + 9654, 34485, 48842, 16069, 41165, 23008, 46642, 13083, 60110, 20069, 30695, +63929, 29, 35266, 50348, 7741, 43818, 24400, 55852, 9113, 48292, 20715, +33869, 63074, 8093, 39708, 21188, 61406, 33915, 5862, 50317, 13686, 63684, +35418, 18127, 42091, 2813, 53697, 27746, 10528, 32994, 59415, 18936, 49256, +12769, 34810, 44931, 14858, 61141, 33370, 1476, 43758, 26661, 62367, 7004, +46501, 33775, 743, 64558, 30689, 7527, 36678, 55052, 19394, 47151, 30817, + 2500, 58760, 33599, 19351, 48742, 28196, 1608, 38477, 60880, 8745, 34418, +48804, 18036, 27334, 52554, 15433, 45511, 24685, 64897, 9616, 39530, 20796, +60904, 5611, 34668, 58822, 18553, 44847, 27359, 12830, 65186, 35975, 15772, +57968, 28482, 11175, 47824, 37314, 21009, 61011, 7585, 39272, 20230, 49873, +11832, 31344, 51048, 9299, 58663, 28480, 17370, 55231, 37333, 13079, 60224, +30192, 16887, 48599, 31968, 561, 54361, 36056, 10137, 28323, 59674, 19914, +44760, 1921, 39949, 23537, 58519, 15715, 48846, 3056, 40072, 23785, 44272, +13307, 53208, 22999, 48578, 8292, 39545, 21663, 45704, 14660, 28164, 61909, + 546, 43554, 32138, 7226, 37656, 63787, 1694, 32174, 58794, 21996, 50214, +12366, 36170, 52774, 7951, 32594, 56725, 1611, 26104, 54740, 6752, 45229, +24183, 60453, 2899, 35460, 54010, 17161, 28621, 56143, 12766, 43139, 25398, +52945, 3642, 32193, 45615, 13304, 58527, 30889, 19276, 64167, 37551, 8032, +32330, 59963, 19603, 43752, 6077, 50846, 27397, 18508, 56555, 37086, 5295, +44166, 22400, 57387, 15733, 27192, 55355, 907, 34587, 51668, 15070, 28478, +61605, 4164, 46556, 22120, 52747, 6523, 30546, 64545, 13831, 46196, 23428, +41041, 11266, 51162, 21202, 33281, 48556, 15545, 42626, 24894, 57683, 5954, +40339, 24056, 52534, 391, 47004, 11808, 41086, 21881, 53986, 10182, 30916, +40233, 4867, 51338, 19410, 37194, 52947, 2182, 28565, 49851, 6163, 60728, +25971, 38759, 1184, 64985, 26649, 40715, 14760, 47821, 25250, 63547, 9613, +40128, 23618, 46300, 13538, 64422, 3416, 34053, 48430, 21183, 57490, 4384, +39418, 14197, 48454, 22687, 54186, 9618, 41513, 26798, 64891, 14311, 42350, +36241, 3946, 46268, 23351, 53777, 15658, 41435, 21886, 43076, 4571, 57413, +34350, 18640, 41136, 3137, 51105, 30163, 8233, 63607, 35940, 18515, 45790, +31084, 7731, 35870, 47979, 2059, 58387, 33208, 6557, 45620, 24165, 64037, +12120, 43118, 23893, 49723, 15645, 29356, 55064, 2689, 27225, 46410, 19450, +60392, 455, 39100, 21464, 62074, 6799, 36729, 48951, 1975, 31605, 63767, + 6449, 52006, 26753, 38769, 9587, 59430, 18535, 51030, 33185, 5528, 46895, +22638, 60875, 12743, 41874, 21681, 62430, 724, 30768, 59004, 6171, 50741, +26377, 38831, 4361, 52238, 18477, 46502, 27939, 12516, 59424, 38222, 3573, +31348, 42850, 16186, 58409, 5424, 44452, 25680, 52960, 2159, 47284, 18829, +39630, 26602, 56452, 3845, 30984, 48099, 9328, 61795, 21159, 35206, 56585, +16285, 44981, 124, 40047, 26643, 62528, 6530, 29728, 47839, 17011, 58100, +22321, 38826, 11205, 50185, 18775, 28082, 54418, 12675, 42812, 24738, 60148, + 4128, 40300, 13549, 62822, 25998, 41051, 12005, 51833, 6577, 64338, 36298, +18120, 27113, 54706, 13223, 38432, 61938, 799, 32932, 58337, 10740, 42017, +22743, 53118, 1687, 44405, 24079, 49094, 15014, 29394, 54428, 595, 37331, +51257, 17516, 46079, 4754, 40700, 23627, 63299, 6476, 30477, 51126, 14748, +44649, 25788, 57579, 4057, 35237, 59954, 19165, 41325, 744, 35301, 44689, + 7583, 49583, 27360, 2315, 53555, 38356, 8485, 62263, 25075, 41637, 13945, +52595, 38408, 4300, 33465, 63007, 13849, 47400, 29601, 5560, 53230, 36507, +20381, 56405, 6936, 62698, 26742, 38699, 1092, 61620, 17598, 33816, 59753, + 3484, 52513, 37503, 9961, 49106, 24158, 57817, 15405, 52161, 27620, 17645, +48324, 37202, 9656, 27763, 61814, 3330, 41408, 23366, 65267, 15226, 40401, +50319, 16701, 35063, 56316, 11555, 41603, 22511, 50583, 8301, 38138, 47658, + 1305, 36562, 58933, 7217, 29429, 65532, 16202, 37604, 51532, 513, 27149, +49221, 6365, 44267, 22142, 52266, 1623, 40618, 25721, 63351, 14215, 38120, +48135, 9637, 27924, 63977, 13673, 52169, 33263, 6287, 62057, 38276, 18688, +46296, 8079, 58692, 37550, 18049, 32201, 55897, 9524, 41306, 25953, 49798, +16663, 35813, 58621, 2657, 31288, 63726, 18176, 44220, 4900, 59738, 30287, + 9850, 51429, 19055, 34567, 60702, 13176, 43009, 25364, 61553, 17313, 31148, +58462, 2926, 36840, 63338, 16032, 42667, 25093, 60944, 8610, 32557, 57623, +16716, 45215, 23657, 40824, 9542, 51911, 20936, 45135, 12228, 55246, 33507, + 5652, 50308, 17466, 30517, 56000, 8389, 34129, 52383, 16300, 43563, 27666, + 9267, 54424, 37013, 17994, 60612, 32238, 7079, 58331, 34440, 17827, 51412, + 782, 29814, 53211, 7803, 58221, 28063, 12905, 64175, 37859, 1830, 30639, +55377, 13747, 47375, 28921, 9264, 53484, 25125, 60718, 12752, 37135, 48066, +16531, 27443, 56344, 3661, 50334, 23154, 64954, 16682, 30052, 43440, 13081, +55487, 26797, 48344, 3163, 38855, 21421, 59016, 4965, 38126, 65322, 9176, +37014, 53025, 12813, 40353, 25937, 53589, 9995, 43084, 23890, 50873, 15546, +28705, 58354, 17175, 45689, 22283, 42045, 12637, 55208, 24893, 46068, 166, +28032, 65372, 17406, 37832, 56760, 2930, 35247, 49968, 7245, 28120, 53554, +19164, 44418, 11786, 34870, 63022, 14870, 43148, 24557, 56741, 6903, 36523, +51570, 17672, 27320, 65065, 10219, 53072, 34911, 19716, 41125, 12794, 64404, +29634, 16728, 36710, 59993, 10730, 51728, 22266, 43143, 15596, 58454, 25588, +39097, 13209, 51408, 5533, 29712, 64035, 20806, 50559, 11679, 38641, 21641, +55097, 3854, 34787, 45656, 5819, 51893, 25671, 63396, 2869, 35372, 47288, +20658, 57226, 9204, 32044, 48706, 18563, 52501, 35189, 5374, 55428, 20435, +45843, 29448, 15409, 38319, 59532, 4117, 47673, 33351, 7623, 29069, 53435, +21450, 39792, 4591, 50211, 17572, 35389, 57567, 12054, 31330, 62197, 6965, +42132, 19701, 63898, 30959, 9888, 57222, 21967, 33624, 52506, 8468, 43380, +26185, 55775, 383, 33581, 64924, 9589, 40881, 23942, 52308, 12315, 46584, +22784, 63956, 10585, 52242, 30445, 18468, 62697, 37804, 11967, 29357, 57000, +18220, 44314, 6774, 61323, 30426, 18764, 55616, 27323, 8133, 51841, 35830, +16172, 64504, 25270, 44959, 9033, 33658, 49736, 18647, 41977, 10329, 46132, +22382, 55257, 30221, 9511, 45010, 16925, 31260, 65464, 20961, 41924, 4872, +35402, 44564, 11033, 62606, 30237, 6114, 57123, 38481, 17584, 34226, 53511, +11721, 45385, 31364, 4897, 20382, 62907, 29417, 920, 37848, 59463, 14710, +33695, 63500, 17970, 27291, 57263, 13643, 31424, 48855, 19350, 41729, 8920, +54780, 28216, 18293, 62811, 37028, 11387, 55191, 28607, 16739, 57200, 37068, + 8773, 30466, 51596, 3452, 58564, 19362, 34402, 49302, 1717, 40895, 19237, +47501, 30020, 11560, 54146, 32141, 21679, 44033, 2259, 64075, 13705, 38962, +21231, 60681, 1596, 29699, 56499, 8134, 42811, 24834, 52356, 7105, 38871, +26812, 53273, 13760, 34896, 65205, 1319, 46683, 28093, 8190, 54772, 31978, + 4186, 37993, 53534, 7609, 43005, 24590, 49261, 12553, 29044, 56545, 857, +48756, 22570, 41293, 10979, 30438, 63080, 3696, 54931, 31649, 15914, 60337, +36547, 3181, 29071, 59137, 19422, 36126, 61587, 711, 42497, 24094, 60130, + 5186, 47866, 19530, 32188, 62526, 1141, 46110, 29122, 12567, 49419, 26221, +42450, 5215, 63132, 20870, 45849, 35529, 15257, 49181, 19125, 34486, 50645, + 6641, 44381, 25649, 59734, 8353, 34875, 63367, 17417, 37280, 48523, 1105, +42036, 22764, 56805, 5192, 32124, 62011, 10341, 43608, 29385, 11931, 36653, +52031, 5383, 59773, 23019, 39567, 9794, 56904, 18201, 34122, 52694, 10463, +45922, 32682, 16594, 51112, 20229, 28266, 62676, 4650, 45509, 18650, 59040, +31561, 3621, 64377, 35697, 8261, 53990, 32698, 10619, 60567, 37676, 4275, +32619, 62588, 16749, 35936, 52309, 10546, 45183, 29097, 14582, 52954, 27321, +16929, 60367, 38281, 10089, 32312, 56462, 21583, 49189, 1469, 31446, 58431, +10980, 40084, 21516, 61578, 2280, 33826, 45046, 14888, 49674, 29048, 940, +56480, 24640, 47978, 4312, 33342, 54643, 8456, 45480, 27717, 392, 36494, +65400, 7228, 33291, 48838, 1815, 43996, 24361, 54745, 14214, 35810, 46572, + 7348, 58563, 25026, 43180, 10461, 63775, 27576, 15808, 59583, 37272, 13213, +31333, 44415, 16287, 59221, 5164, 39091, 26679, 44473, 1334, 65257, 29226, + 9706, 43731, 24235, 61337, 456, 34803, 56852, 8377, 50220, 27557, 17179, +37497, 65507, 11238, 44856, 19176, 60088, 34123, 14386, 62980, 27292, 5968, +51481, 37744, 16383, 46423, 24565, 52988, 4465, 40793, 25357, 46955, 2055, +62657, 18378, 29332, 59200, 11911, 39507, 20622, 49438, 16758, 29168, 56582, + 2475, 33878, 61266, 6442, 39036, 25591, 42388, 15916, 57555, 4946, 32271, +51099, 22088, 47085, 3556, 31161, 51665, 21433, 39798, 1531, 49738, 12105, +37197, 58269, 20629, 43762, 677, 41091, 12236, 59458, 22360, 54914, 2513, +30664, 51643, 16344, 64758, 35894, 4594, 50172, 20204, 35412, 54319, 2106, +47116, 12495, 29050, 60495, 16759, 49683, 27158, 2756, 54995, 38209, 16060, +27051, 51025, 257, 60926, 27736, 8815, 58111, 37884, 54295, 12843, 43820, +25255, 49581, 7571, 29118, 53772, 3517, 44355, 35743, 6067, 52208, 23053, +62438, 2362, 34620, 59262, 21233, 45926, 4944, 32127, 48177, 15513, 35023, +61707, 4501, 42582, 23215, 60707, 13359, 46578, 21061, 31442, 43398, 8387, +61352, 22715, 31817, 51278, 9897, 64905, 27335, 3684, 57718, 36474, 15913, +50687, 26436, 45520, 5788, 52167, 24286, 42278, 15555, 48524, 33283, 12062, +61368, 20798, 45449, 17413, 56092, 3746, 47332, 24209, 41607, 15190, 56425, +20930, 37017, 45198, 18030, 64432, 27331, 10933, 50028, 34885, 19433, 55413, + 5668, 34608, 46712, 17891, 36551, 65521, 5114, 44294, 21723, 50336, 13974, +39110, 24312, 47663, 7234, 52902, 23340, 41800, 8193, 51194, 15340, 41123, +22515, 54547, 10505, 38994, 26515, 57675, 12891, 40034, 22103, 52791, 9890, +34854, 64751, 2843, 53467, 21791, 38628, 12998, 55478, 28530, 10325, 60936, +38280, 3045, 27218, 62185, 20171, 53097, 14348, 40123, 22546, 51229, 3782, +28118, 57835, 15161, 31645, 64495, 11623, 39717, 26440, 52036, 15885, 35007, +54491, 1567, 60503, 21798, 42414, 15088, 47442, 34794, 227, 63750, 25341, +44317, 7201, 29566, 61601, 13439, 27626, 56361, 1177, 45011, 31951, 8214, +55467, 35361, 11141, 50470, 25057, 40855, 13954, 48478, 24689, 43024, 798, +51156, 19867, 28975, 56389, 14367, 46918, 5943, 40986, 22939, 58299, 3887, +33982, 63510, 7946, 47776, 37167, 2092, 51815, 24377, 42921, 5265, 64880, +17070, 40348, 25787, 44834, 4763, 54598, 30536, 13875, 47949, 23586, 57458, + 5918, 36441, 62755, 18917, 39533, 11573, 60397, 22724, 43671, 15172, 62232, +20257, 32703, 57119, 14519, 42466, 23278, 55381, 11445, 29891, 63296, 19660, +41012, 4274, 59933, 18716, 30547, 41962, 2187, 54083, 32098, 18837, 38244, +52762, 554, 29628, 48863, 7375, 55315, 19887, 32824, 50982, 11710, 61064, +21460, 49847, 16813, 37264, 58408, 14658, 48005, 32380, 12507, 52855, 23041, +43549, 13869, 32621, 58653, 2001, 42872, 24848, 56613, 3420, 28419, 48626, + 8828, 45279, 37146, 19490, 29587, 55307, 2560, 59882, 10809, 38938, 26911, +61012, 12457, 31860, 49075, 15109, 35924, 53387, 3406, 42583, 24291, 62154, + 5507, 36501, 53196, 13061, 45943, 28293, 15243, 49352, 21317, 56182, 1804, +45773, 34860, 20200, 59631, 10019, 42406, 17365, 63776, 35814, 9238, 59181, +25799, 45278, 17259, 64986, 31889, 5789, 48026, 26793, 61737, 19226, 31137, +47986, 7677, 39829, 25158, 58758, 6080, 43199, 28676, 12967, 56679, 25860, +42062, 7542, 60932, 28010, 18514, 57422, 33661, 8341, 38173, 53803, 14314, +34633, 46315, 6950, 64079, 32776, 13773, 46212, 30818, 19586, 48213, 34093, + 3672, 18122, 51506, 33169, 10020, 64457, 21899, 46743, 12580, 31387, 61322, +15745, 48172, 38251, 11171, 32502, 44744, 15304, 49967, 7385, 29096, 58099, +17594, 53924, 2077, 40667, 24813, 50063, 14570, 31291, 53371, 762, 36237, +65333, 6870, 54269, 24799, 39803, 14380, 58217, 5776, 44495, 19682, 37465, +48638, 12426, 30537, 62627, 9118, 40010, 18719, 59525, 34470, 10177, 65456, +37338, 4668, 57690, 26401, 40919, 240, 32301, 62908, 13030, 38594, 21570, +59092, 5404, 32249, 49248, 10625, 60327, 2489, 30489, 47496, 15734, 58211, +29621, 1579, 62260, 38121, 16733, 60041, 8271, 29833, 52117, 14355, 27772, +58503, 7934, 35699, 61796, 417, 43809, 18476, 64610, 29846, 11813, 57855, +34010, 21372, 63265, 4407, 31813, 46720, 18269, 65310, 2562, 35215, 50647, + 6628, 44818, 26165, 57082, 15836, 40044, 25008, 44588, 8466, 60291, 24820, +46939, 2075, 31768, 43908, 16263, 57434, 30654, 9054, 46711, 37164, 147, +30116, 58723, 10985, 46164, 36738, 9913, 52232, 22062, 42947, 2655, 55264, +21137, 47222, 6722, 41378, 18909, 49749, 25650, 39716, 6325, 62441, 18487, +29035, 53272, 13501, 48941, 20524, 36111, 55320, 2418, 46631, 35517, 21659, +60628, 11976, 38338, 48699, 15494, 27221, 63196, 1788, 43977, 22064, 61156, + 5843, 55007, 15949, 39566, 26454, 64951, 7725, 36744, 50270, 18873, 31455, +61107, 9367, 42411, 26372, 55015, 13623, 43444, 29536, 17902, 61754, 33928, + 9037, 54839, 30140, 20316, 47145, 10412, 60972, 22355, 49038, 16259, 35515, +64086, 9478, 43221, 20042, 30594, 53805, 8972, 42321, 25512, 46884, 6959, +52639, 34760, 3032, 38093, 50995, 7743, 47459, 30458, 5020, 61061, 37234, +17804, 52962, 8042, 31946, 56959, 15234, 33800, 48529, 8962, 65117, 23796, +44854, 14026, 60548, 7870, 43557, 22722, 61633, 12131, 40029, 23468, 64092, + 2353, 43248, 25609, 40749, 6779, 34419, 55647, 3587, 27978, 41458, 6135, +63912, 21407, 40423, 3131, 62122, 25849, 49329, 9900, 38837, 21829, 52375, +12334, 36832, 55858, 16347, 30988, 50669, 141, 64628, 13172, 43865, 21909, +32289, 48408, 17239, 54574, 7202, 42250, 22787, 58357, 9369, 45090, 21446, +60614, 11064, 31375, 48499, 15663, 43274, 22397, 58313, 4235, 35978, 62903, + 7117, 43687, 30054, 17922, 65239, 11719, 48771, 25895, 39167, 111, 56039, +28158, 14083, 53432, 37970, 4130, 30059, 54236, 8760, 41316, 23973, 56882, +13345, 39086, 4651, 54120, 16596, 35099, 63854, 11023, 31923, 47488, 15157, +53818, 37491, 154, 63237, 22068, 48153, 11169, 36877, 50960, 4007, 43415, +23084, 64409, 1031, 31317, 58703, 18308, 28508, 44158, 9979, 59834, 37563, + 5351, 55456, 14346, 62357, 28083, 46645, 1983, 58400, 26435, 38990, 5211, +57529, 25841, 40776, 127, 52754, 20982, 28103, 60725, 4324, 55180, 27161, +18997, 64356, 38032, 9815, 31213, 44704, 22391, 63760, 8462, 33790, 59174, +10731, 45874, 27651, 15491, 49595, 29636, 18065, 45161, 2391, 55280, 29251, +16557, 33590, 59580, 95, 53004, 24170, 43081, 5118, 54733, 25411, 46171, + 1054, 30501, 53688, 17568, 27693, 50090, 14064, 44837, 21553, 54621, 10413, +43692, 26664, 52030, 8980, 40058, 26120, 63563, 16776, 43538, 28741, 14716, +57141, 36372, 6033, 43499, 22285, 51545, 9785, 28159, 48312, 20441, 33833, +56907, 2049, 35920, 47132, 19611, 53376, 29201, 15030, 40738, 26466, 54095, + 5960, 35644, 50099, 1733, 42851, 13996, 48208, 26229, 56402, 7395, 39641, +26054, 52195, 11541, 30645, 61035, 19054, 39228, 4696, 48337, 11226, 59462, +19535, 31438, 50217, 6412, 36575, 63716, 19779, 48620, 5699, 40643, 24146, +54032, 12741, 65035, 23211, 48759, 15767, 33309, 62911, 20036, 44163, 5735, +61622, 25109, 39133, 14709, 59611, 34161, 12381, 63116, 29671, 4220, 58669, +32787, 11502, 44683, 26191, 57985, 3408, 33561, 42221, 5875, 51330, 17488, +30799, 62962, 8580, 42511, 18597, 50849, 28590, 5397, 58037, 37231, 17217, +51721, 33315, 12216, 38272, 47300, 18888, 30680, 57193, 3378, 44826, 17857, +30467, 57604, 2241, 43910, 22082, 53788, 15857, 38972, 1186, 50233, 21876, +58000, 5720, 41321, 23223, 48674, 15687, 59548, 36367, 3271, 53900, 37960, + 7341, 29198, 55912, 626, 40677, 25749, 59742, 3712, 48914, 17433, 35807, +61997, 1757, 32361, 57592, 16279, 27297, 64204, 18075, 28671, 59680, 13634, +27067, 44864, 19942, 50391, 2656, 28701, 49107, 21090, 43262, 867, 61926, +26469, 38934, 15925, 56003, 4643, 41283, 33451, 18038, 51615, 37006, 6215, +56362, 26039, 45257, 14441, 34044, 53332, 10015, 62710, 22818, 46059, 13254, +32602, 57112, 15861, 44491, 25842, 53861, 11016, 35438, 46589, 7037, 30668, +60265, 18960, 44583, 6405, 63466, 26109, 41416, 4873, 59288, 17840, 39155, +26792, 53711, 6740, 36061, 61798, 3198, 45682, 19471, 33462, 65392, 889, +39252, 26381, 51941, 5780, 38806, 25811, 56846, 1444, 34948, 64696, 8604, +41240, 25081, 50030, 16428, 32064, 57284, 9497, 41602, 24214, 53701, 5974, +32818, 60738, 19381, 41384, 6429, 49120, 34865, 20713, 62514, 15953, 46640, +21786, 60731, 2417, 34990, 51014, 17957, 45225, 25689, 57437, 1630, 49451, +24371, 40514, 4144, 60390, 27471, 17718, 51133, 32695, 6316, 41528, 26504, +62487, 14770, 29690, 56574, 9066, 40450, 26295, 51593, 11607, 47602, 36627, + 3165, 56278, 27465, 17279, 50516, 23000, 41604, 8364, 35470, 61624, 22470, +41909, 13526, 56036, 21189, 45085, 9425, 34128, 65070, 18680, 43293, 7116, +37688, 47314, 10537, 33809, 53245, 1095, 41570, 25172, 56892, 5428, 51086, +19071, 29347, 41836, 3254, 55620, 18617, 37353, 59797, 4718, 34007, 62339, +10571, 48283, 20347, 36239, 63088, 9310, 45710, 22388, 39619, 14220, 60799, +26889, 38559, 11320, 57273, 21566, 48299, 8597, 36602, 59172, 2455, 32907, +63436, 6326, 39396, 24243, 60830, 2947, 33274, 57182, 18104, 45768, 953, +35188, 55154, 8020, 41508, 23382, 50891, 12261, 62808, 31888, 14477, 54624, +37090, 4480, 64030, 12933, 45065, 26142, 40228, 11880, 57477, 4326, 34420, +49658, 10148, 59887, 21088, 44901, 13274, 55769, 28509, 17868, 60630, 35304, + 9758, 45139, 24024, 62139, 13745, 43056, 21565, 56268, 1616, 41648, 25098, +64014, 17884, 35901, 52042, 428, 43039, 22922, 58467, 10750, 29137, 52340, +13775, 32786, 61842, 17793, 45512, 4495, 31833, 42789, 7989, 56840, 27178, + 1981, 50596, 38171, 16856, 29733, 56116, 9087, 45062, 28579, 607, 51520, +20211, 37908, 45756, 14737, 48872, 22494, 54218, 8308, 30312, 50051, 15810, +65143, 21958, 28751, 58448, 11284, 39839, 25673, 57269, 3492, 36100, 64475, +20990, 40809, 10169, 54028, 29065, 4134, 59546, 27515, 9246, 63381, 35255, +12865, 48973, 25862, 60262, 9039, 39178, 26593, 62992, 7276, 32225, 48633, +19863, 64635, 12595, 35034, 47188, 10941, 31702, 64032, 356, 43661, 13013, +28340, 50677, 17850, 32750, 63392, 15022, 42196, 23713, 53271, 8125, 38665, +26919, 56183, 10861, 44571, 20576, 27916, 51804, 8546, 38362, 49117, 11081, +36514, 45924, 1298, 53721, 36233, 9707, 62835, 32886, 15740, 58116, 35910, +10238, 54889, 23759, 41713, 6878, 53384, 20925, 28843, 50882, 13287, 58851, +27401, 1549, 64723, 31798, 19591, 49558, 3319, 60230, 28026, 17509, 48230, +37673, 16, 58238, 25198, 49066, 9439, 35842, 59402, 1820, 39638, 23373, +63229, 15700, 54893, 22322, 41427, 1007, 51110, 23974, 39727, 13636, 53021, +20560, 33892, 46665, 7753, 60399, 23794, 40616, 14161, 49986, 21160, 29175, +55786, 11277, 43042, 23744, 57396, 8537, 33001, 63514, 20155, 43934, 13933, +50330, 27770, 17387, 54571, 33440, 12613, 60233, 938, 45387, 20371, 33748, +55298, 3000, 39964, 26785, 51929, 11285, 45281, 25055, 64303, 9763, 28935, +51933, 1182, 43476, 11723, 39214, 26601, 53348, 10480, 28902, 63541, 6505, +41929, 21025, 38572, 11763, 62194, 19115, 46121, 34839, 8754, 55586, 37931, +12711, 59484, 20888, 46679, 1863, 53223, 34509, 17166, 48420, 21563, 61242, + 4524, 39286, 19231, 63140, 30559, 10869, 52937, 37949, 1249, 64936, 24649, +43524, 15408, 4635, 31095, 52907, 7777, 35120, 48754, 16479, 59562, 28399, + 3411, 49240, 25011, 58230, 16933, 28785, 63044, 13971, 43484, 21952, 59586, +15053, 32790, 46613, 10174, 37851, 62098, 15996, 44239, 24512, 52418, 9488, +41441, 25542, 51142, 14683, 40108, 25226, 56303, 3959, 41311, 24688, 53695, + 7291, 35283, 51027, 2990, 42443, 20470, 63920, 6153, 40613, 24633, 55013, +14692, 43662, 22747, 50930, 11767, 31355, 55385, 15458, 41366, 22508, 49514, + 7629, 30242, 62047, 22393, 48625, 12860, 31887, 64192, 3930, 44424, 25789, +39668, 112, 59471, 23305, 47122, 16381, 39699, 24356, 50959, 7513, 62632, +22906, 43926, 16203, 61415, 24111, 42979, 2622, 38900, 25164, 64117, 7097, +33022, 48732, 3907, 40390, 21888, 58803, 37, 34594, 53151, 5951, 37510, +48514, 16583, 31853, 54606, 9136, 46082, 28518, 15074, 62320, 33101, 13273, +37431, 54061, 3727, 41747, 22712, 56477, 1294, 35704, 50346, 21633, 55777, +14144, 35954, 45447, 17954, 60810, 31891, 9668, 54072, 35198, 3968, 49923, +19614, 65280, 36573, 13552, 57484, 27143, 8007, 64134, 33634, 1760, 37681, +61732, 20027, 45706, 10241, 37958, 54556, 987, 32855, 44890, 6109, 53866, +19619, 45680, 14680, 29363, 47318, 42, 56610, 18566, 35677, 46472, 14954, +52472, 37296, 1452, 53873, 22885, 40272, 6117, 43430, 21272, 55744, 13148, +46760, 23589, 41320, 4816, 56349, 26587, 39865, 3618, 55814, 25166, 39135, +15075, 52696, 21165, 37092, 62332, 8294, 46404, 27071, 2405, 34563, 57697, +11993, 47664, 20819, 65169, 13735, 32674, 47381, 5643, 59512, 35107, 14494, +62999, 29012, 4670, 56652, 31735, 12673, 58791, 20890, 29603, 51715, 3920, +46875, 22443, 39936, 5653, 64278, 18328, 47292, 33405, 12136, 37281, 61226, + 2960, 46256, 30954, 10212, 48127, 38168, 21385, 53770, 9259, 35575, 42344, +13033, 52173, 32516, 7919, 54727, 29953, 19969, 43116, 4859, 64965, 29646, +20389, 52389, 11770, 45667, 29204, 4443, 48180, 34349, 14505, 61743, 31836, +10995, 57244, 36273, 2351, 64154, 29313, 14939, 52063, 22569, 44340, 1404, +57637, 34317, 10349, 63142, 4299, 36915, 52384, 13277, 29802, 50584, 16741, +40813, 3880, 55963, 30910, 7647, 61502, 37345, 3153, 48250, 30443, 19174, +51944, 29115, 8334, 62097, 22662, 46281, 13647, 63212, 20817, 38850, 2168, +54799, 17767, 38197, 57191, 13029, 34009, 60056, 22681, 49543, 5358, 35726, +55995, 15783, 33483, 48561, 12900, 58948, 26572, 44140, 7288, 52188, 29124, +13867, 65088, 30437, 3024, 49646, 24049, 43828, 10688, 39162, 19954, 59979, + 5874, 45024, 31774, 13520, 52571, 24370, 43541, 6694, 55223, 22458, 45896, +13048, 29837, 47878, 7379, 53679, 37597, 60357, 16101, 42861, 24722, 63954, + 2486, 32031, 42271, 14272, 55033, 36776, 12176, 32903, 51921, 1784, 46614, +30830, 7962, 50378, 35793, 4042, 65181, 19750, 52544, 27639, 251, 32887, +57544, 6284, 39137, 21895, 64646, 1554, 32846, 58402, 6713, 45747, 18772, +35280, 57535, 12303, 32476, 64738, 17322, 29810, 56020, 13142, 47567, 35766, +16626, 52511, 31282, 3533, 62838, 37692, 8017, 29246, 60112, 19283, 47564, + 4559, 34894, 64477, 11515, 53624, 20246, 40891, 6414, 37262, 58811, 17493, +28090, 47955, 10077, 57682, 18379, 33636, 45694, 8706, 30193, 55220, 3117, +60368, 19291, 41691, 31001, 934, 55807, 37845, 8979, 32642, 52585, 18736, +58041, 10757, 40455, 26708, 51950, 14633, 62608, 27004, 43917, 10946, 50108, +18651, 30104, 57836, 14611, 27460, 63076, 6815, 42376, 24270, 59901, 4149, +37473, 50899, 7635, 27489, 46592, 18717, 65493, 11426, 30128, 44600, 16526, +60355, 28238, 7260, 38369, 63209, 3184, 27638, 52596, 6845, 41838, 24431, +59366, 13889, 48080, 26255, 41542, 10440, 54617, 30096, 2984, 38341, 52387, +18288, 28856, 56267, 12515, 42873, 27430, 4588, 59584, 35088, 15176, 48304, +22720, 63455, 13344, 38644, 26774, 59404, 6620, 33596, 61675, 12402, 42577, +22649, 65452, 8441, 31115, 43325, 18544, 62020, 11211, 33734, 49404, 15813, +64133, 31087, 519, 51935, 35619, 11055, 62168, 34168, 18644, 45012, 14128, +61256, 22248, 42420, 7115, 58857, 26092, 44408, 4168, 29547, 55601, 11376, +38140, 60608, 19214, 45268, 5124, 39664, 24946, 43906, 2672, 58085, 23936, +40848, 16872, 50202, 195, 46094, 22717, 42298, 15327, 50663, 23875, 40422, + 6609, 64969, 18345, 38868, 26180, 59486, 12474, 44178, 24605, 52641, 2020, +28034, 59120, 16439, 44117, 27109, 8840, 63113, 34999, 17084, 57795, 6768, +30814, 62127, 15986, 47719, 27349, 5484, 64397, 36861, 16775, 58976, 10410, +36772, 50616, 17610, 46818, 7483, 33524, 60920, 16525, 36652, 51396, 9604, +58392, 25018, 40252, 7354, 53835, 18546, 47031, 27670, 10223, 49770, 37588, + 5732, 62433, 18375, 31917, 48998, 14938, 41949, 24543, 47626, 15933, 32114, +61145, 2250, 45476, 19549, 59755, 34409, 13239, 45967, 24977, 52557, 10587, +42724, 21484, 63631, 6097, 37317, 58140, 16721, 34569, 50613, 4418, 30554, +43954, 7836, 58056, 22010, 35735, 48205, 5004, 27466, 50224, 18994, 45954, + 7920, 31345, 65404, 18711, 44130, 393, 61482, 24335, 39218, 3655, 54409, +16991, 36317, 60097, 1232, 41680, 24300, 47045, 15802, 58141, 33074, 6770, +63972, 25619, 51628, 15147, 40845, 22294, 65201, 432, 34154, 58195, 15248, +41287, 32688, 2603, 59186, 38428, 16766, 33667, 57356, 11881, 27621, 560, +33328, 55763, 12936, 39763, 23283, 53238, 8847, 46479, 21715, 63365, 6243, +41883, 24007, 61591, 15618, 40297, 25521, 57776, 13105, 39878, 26476, 48379, +11563, 35774, 60419, 14265, 46881, 26346, 50464, 11062, 36756, 54099, 16884, +28644, 49109, 10129, 63481, 28156, 860, 50263, 21932, 45185, 5524, 40614, +23303, 62025, 1362, 28256, 58296, 8838, 41733, 21965, 48013, 15739, 55961, +35543, 608, 42503, 26518, 57012, 14310, 44967, 30908, 1769, 47627, 24661, +55444, 16016, 51497, 2177, 35533, 61201, 21617, 42031, 5233, 53617, 20319, +64858, 36719, 12389, 47973, 28692, 7036, 53970, 36481, 18286, 48678, 13662, +65187, 27518, 3523, 46653, 35441, 20609, 54813, 1103, 46149, 23347, 38640, + 6267, 57220, 19936, 37610, 65056, 8316, 33718, 45358, 3071, 52784, 32928, +20692, 49016, 13615, 30370, 55186, 16409, 38420, 57258, 1749, 32072, 49112, +20333, 54989, 5011, 34849, 47287, 10503, 57671, 20405, 32449, 48939, 11929, +30320, 64716, 19088, 45965, 1012, 39529, 20955, 61470, 5007, 34750, 46407, +15980, 62594, 23656, 41619, 6493, 50344, 16500, 35943, 60814, 9576, 49531, +30927, 20774, 57042, 7093, 40110, 26049, 53365, 2015, 46400, 22026, 51321, +15825, 41577, 25553, 55158, 5647, 39689, 25020, 58380, 3240, 50349, 21378, +29899, 55489, 4945, 41059, 23691, 45739, 14145, 59906, 20833, 49814, 2676, +29438, 47981, 8464, 51393, 28968, 1375, 54551, 34565, 19169, 48457, 12242, +60109, 34057, 16125, 47924, 27791, 6533, 52351, 21774, 31966, 62579, 12585, +50567, 31671, 19308, 54685, 6417, 30213, 64535, 19013, 37340, 58263, 9912, +33712, 61680, 2399, 47697, 25587, 43012, 13982, 54636, 587, 48204, 33832, + 8696, 62440, 38232, 19346, 32503, 47831, 6529, 56793, 32082, 19420, 50369, +37835, 3812, 28717, 52651, 19111, 44767, 1047, 37397, 55151, 18011, 29057, +49959, 2096, 46279, 20711, 32379, 62485, 2962, 28871, 56387, 21201, 41357, + 667, 55519, 20062, 28315, 43304, 3313, 65074, 22535, 45228, 30317, 4644, +61270, 35314, 20839, 58133, 12608, 42730, 24772, 52977, 3504, 29965, 59665, + 7988, 54039, 23322, 40567, 10066, 54952, 26598, 38727, 6089, 49891, 22587, +64396, 209, 39521, 19858, 59062, 34529, 11599, 49247, 24212, 42423, 1621, +53887, 19806, 37170, 60944, 14632, 47653, 25977, 40922, 8763, 58916, 16876, +33171, 62030, 3077, 39987, 25103, 52625, 11052, 39896, 21293, 30856, 47071, + 9651, 56380, 19870, 32180, 49808, 8150, 28125, 48203, 19431, 61851, 5678, +39857, 22339, 55003, 13323, 37519, 47271, 3395, 32422, 56929, 7770, 43052, +26420, 49824, 9716, 29322, 62157, 18926, 48692, 8896, 27613, 63599, 3893, +43843, 21859, 51102, 11223, 28582, 46615, 6751, 62259, 30407, 16890, 57430, +38016, 977, 29618, 48211, 20340, 55843, 10017, 34807, 59779, 5214, 44613, +22537, 54557, 2608, 30231, 56449, 6934, 45075, 23108, 40473, 3632, 62638, +20693, 29658, 44785, 2844, 61159, 20040, 36531, 43203, 13967, 54811, 37512, + 8486, 60991, 26608, 49661, 10822, 33066, 53205, 17595, 34748, 45250, 12751, +60378, 28634, 6976, 45714, 23900, 64999, 17146, 51395, 8694, 39534, 23487, +58411, 12336, 32924, 61697, 5636, 42246, 30808, 19810, 46222, 11769, 55821, +31565, 15912, 38017, 49129, 1645, 27413, 44180, 16551, 57584, 33978, 11208, +63189, 26339, 43360, 5708, 36121, 51351, 16981, 59198, 30297, 6659, 63617, +37062, 18163, 53246, 12643, 42300, 24403, 53799, 2126, 27760, 47828, 16085, +60910, 23069, 40463, 12071, 58781, 1034, 35415, 64513, 8926, 45437, 27065, +17775, 62887, 37050, 9476, 42816, 26073, 61054, 14586, 40427, 25273, 51018, + 543, 42579, 17048, 54942, 36580, 5354, 50095, 25887, 58095, 13077, 32448, +44794, 22714, 56880, 8649, 31497, 48492, 10936, 60002, 21649, 32264, 55080, + 401, 28213, 44066, 17892, 64673, 2714, 36663, 47330, 18838, 61935, 12421, +41841, 31680, 8113, 60549, 34478, 2902, 49063, 19495, 33543, 56986, 13102, +45533, 23775, 40718, 7869, 61347, 16861, 32205, 51576, 10012, 57857, 26571, +38623, 7520, 44077, 25778, 59067, 17062, 36685, 63262, 11771, 32226, 46702, +16210, 65003, 5496, 40826, 23026, 54171, 1695, 38388, 63737, 14409, 35110, +56833, 851, 46182, 27575, 9127, 61163, 38182, 14763, 34523, 43591, 10717, +51559, 27272, 4966, 53450, 29786, 16396, 37730, 56941, 10844, 33972, 61212, +19610, 42205, 27389, 13260, 52087, 30571, 4453, 45332, 14557, 65299, 22660, +40487, 273, 54250, 13811, 41323, 22072, 63593, 8072, 33189, 50340, 22842, +59704, 9814, 34037, 61448, 13664, 42130, 25495, 56870, 9045, 41613, 24125, +52708, 10667, 35186, 63769, 17552, 47709, 32019, 6737, 57423, 35902, 17910, +51742, 12416, 37883, 55406, 17511, 48751, 414, 40344, 26638, 56099, 7068, +36085, 63720, 13591, 42590, 25413, 38899, 638, 64956, 21939, 43419, 12716, +62064, 25260, 41598, 9076, 32216, 53667, 15833, 46806, 28119, 3678, 38119, +55776, 15223, 28564, 64571, 13200, 45977, 27506, 6640, 55497, 35032, 490, +64789, 19745, 31558, 51534, 10324, 41471, 22463, 54645, 14294, 30077, 61004, + 4432, 45145, 14994, 59788, 25726, 40235, 6372, 64626, 22090, 35552, 56995, +10271, 31931, 44949, 17629, 53259, 34191, 742, 50499, 18952, 28992, 59105, +11358, 39361, 24085, 53859, 12775, 35998, 55580, 4986, 44930, 22828, 35806, +53317, 14456, 46324, 31264, 19175, 61205, 37108, 22836, 59086, 17932, 33976, +50506, 4082, 45423, 27790, 11370, 60457, 35268, 16698, 51239, 3576, 43965, +28039, 17943, 53031, 32304, 10981, 36438, 60946, 15519, 42869, 25132, 64260, +13090, 34855, 54710, 18602, 47275, 7239, 35052, 56951, 13335, 47074, 29197, + 4823, 59229, 21219, 31407, 48531, 15062, 41763, 3301, 59985, 22557, 39875, + 5947, 64275, 24058, 50591, 2219, 33019, 54531, 18663, 40338, 5025, 48607, +33430, 21175, 62373, 3235, 46928, 26575, 39498, 14972, 49955, 22804, 65374, + 9140, 36969, 50702, 3419, 28307, 63063, 11075, 53017, 21359, 35680, 61847, + 5413, 50176, 23049, 39233, 2285, 47335, 21068, 60856, 14789, 28445, 41998, + 9293, 50208, 23960, 44288, 10512, 29176, 58489, 4780, 34483, 62035, 14089, +49374, 32156, 9585, 37196, 51293, 4294, 29499, 54957, 20106, 43691, 15763, +50150, 29123, 3856, 53638, 34462, 6517, 47402, 22112, 58920, 2664, 32039, +49655, 7771, 64336, 21118, 34313, 58599, 9303, 28111, 61977, 20058, 41404, + 8417, 34109, 51683, 3382, 63249, 17962, 29128, 52678, 1535, 42949, 25408, +39402, 5281, 57694, 19246, 47179, 36556, 11608, 53683, 25943, 46070, 14142, +32261, 52509, 4915, 28680, 48489, 20049, 56391, 11440, 39330, 23066, 63685, + 8871, 49942, 28215, 939, 59237, 35656, 15166, 48220, 25314, 54573, 1893, +39801, 23241, 43079, 4059, 65202, 21766, 52749, 12503, 32012, 55287, 6001, +41122, 23346, 56827, 3915, 39759, 19846, 30935, 57698, 8955, 35631, 49212, +16529, 27362, 51484, 7701, 43120, 30589, 17822, 58419, 35798, 4185, 53999, +25892, 47660, 1905, 59869, 18184, 35647, 44709, 9158, 63456, 21708, 46283, + 7334, 29088, 53127, 4113, 31636, 49872, 8148, 60680, 36377, 16967, 58461, +23497, 49288, 10785, 35368, 56146, 17591, 30039, 60625, 10403, 42759, 24818, +55538, 15213, 40152, 5088, 43605, 24867, 53325, 3516, 39761, 21927, 54353, + 6387, 35686, 60571, 14698, 31250, 49493, 5489, 43618, 27168, 13185, 59980, +38456, 10232, 29072, 47591, 1570, 62848, 27376, 7975, 32982, 44889, 22426, +64443, 10839, 32240, 50194, 17420, 28363, 48281, 5399, 58787, 17035, 50844, +33413, 7376, 53212, 35327, 2692, 56098, 15152, 45152, 26041, 57636, 7916, +33544, 51083, 18902, 61215, 8917, 44235, 32583, 4828, 37822, 57523, 10802, +42368, 23649, 49556, 15817, 29776, 54012, 5898, 43622, 25906, 63475, 1459, +33785, 57608, 7381, 47463, 32850, 20033, 53485, 2651, 31533, 50299, 17817, +42874, 1723, 51452, 15550, 37335, 63675, 3835, 28614, 59824, 11740, 42795, +23934, 63345, 5382, 34730, 48300, 20378, 61567, 2229, 46042, 28168, 17950, +64306, 31840, 12079, 59621, 1397, 28496, 56656, 10155, 41217, 5615, 49803, +45487, 1885, 53822, 12161, 40805, 24294, 64745, 15849, 32374, 53692, 8471, +40147, 26317, 64070, 11904, 35657, 48924, 623, 63198, 24631, 40901, 5817, +51234, 20141, 38925, 1333, 53458, 28344, 9737, 32816, 59885, 15044, 41657, +22991, 51779, 8983, 33873, 53897, 18191, 43868, 2033, 65131, 28740, 17991, +51800, 34799, 11643, 55555, 26609, 47038, 14867, 39068, 20811, 61857, 10850, +35006, 58042, 15097, 28706, 53144, 11122, 43685, 35694, 17704, 60364, 6660, +52549, 36417, 464, 29239, 47015, 17017, 60013, 22201, 39892, 6652, 46199, +34084, 17281, 56301, 9777, 31901, 42777, 14306, 59347, 25188, 51968, 7997, +33353, 46341, 296, 56234, 31729, 19065, 61627, 3082, 36375, 51052, 16441, +47531, 30049, 20243, 44961, 5746, 59683, 21098, 43394, 15135, 63847, 35832, + 7070, 41504, 24050, 61484, 10290, 37818, 57930, 12654, 43320, 23816, 56275, +11889, 30093, 51744, 16137, 44332, 24004, 39614, 4403, 46596, 15747, 53936, +37411, 2101, 44690, 24293, 60017, 14910, 43645, 28183, 10119, 49468, 35313, +14377, 64843, 19814, 54122, 13168, 45787, 31052, 9071, 63559, 24527, 40381, + 6235, 61202, 21855, 41284, 9326, 59031, 17456, 35033, 64105, 625, 43002, +26325, 52851, 14327, 29921, 44832, 17626, 37898, 52725, 10780, 29533, 64777, + 4598, 44750, 18896, 33593, 62473, 10867, 53612, 29742, 15272, 48646, 37899, + 1032, 27797, 46416, 15843, 60761, 34060, 10275, 49102, 25562, 61438, 12520, +45743, 21128, 53518, 29026, 3223, 59083, 37302, 20296, 65342, 10592, 50900, +15856, 44861, 22963, 39951, 11410, 63828, 20574, 32696, 55905, 12603, 49662, +23863, 40077, 1057, 59248, 23369, 48367, 17013, 35856, 63667, 14267, 45459, +28188, 1422, 55036, 38339, 7575, 31165, 62063, 2705, 43425, 24745, 49653, + 6011, 33307, 58153, 1789, 46500, 30992, 20665, 64877, 14119, 47259, 33003, +19254, 62757, 11480, 30038, 51002, 18649, 40467, 1282, 57657, 27766, 16219, +61828, 34491, 2445, 50831, 20895, 33397, 56243, 13575, 44079, 20889, 35614, +58505, 15865, 53565, 5132, 39332, 26007, 54898, 2157, 34945, 56544, 9609, +45625, 32459, 21288, 43947, 11466, 59500, 28635, 16996, 49012, 37137, 20150, +60407, 4983, 39779, 22054, 62846, 1862, 40597, 23954, 47494, 13985, 59732, +23035, 49004, 17441, 29668, 62929, 3314, 33527, 60369, 9223, 41987, 23869, +58623, 11942, 38615, 20361, 50423, 15386, 40550, 25800, 64061, 10710, 42896, +23172, 62564, 8836, 34514, 59377, 20482, 30024, 55842, 7001, 42424, 24800, +49529, 16187, 30218, 55245, 8425, 41829, 25339, 56256, 15310, 41735, 8776, +30837, 57927, 15896, 42702, 4146, 51184, 21561, 37310, 49366, 15679, 43102, +24093, 65356, 17016, 31963, 25580, 61960, 18766, 34967, 56836, 6975, 37325, +52016, 2715, 43532, 23654, 57640, 4923, 45703, 21452, 59104, 14136, 29762, +46393, 9203, 57285, 18731, 32020, 61983, 12122, 49239, 20983, 36219, 55529, + 4628, 43100, 24965, 64511, 477, 38979, 26628, 61846, 6092, 38828, 25731, +52869, 9292, 36024, 45847, 5032, 58381, 21469, 41386, 320, 32562, 56834, + 7366, 44383, 26006, 49904, 4077, 39464, 25577, 63625, 1110, 31981, 56686, + 8318, 45534, 21810, 29869, 57723, 12128, 43269, 23829, 56113, 8263, 34603, +44789, 13719, 58444, 22942, 51375, 703, 29792, 48484, 20055, 64354, 3853, +35928, 44167, 12140, 58285, 27381, 16648, 64580, 37459, 8627, 49231, 25620, +42345, 14437, 59454, 27545, 1497, 64773, 36630, 11157, 55305, 26108, 39442, + 582, 54383, 25182, 48397, 13110, 32075, 55930, 2421, 47670, 27439, 17091, +35740, 59964, 264, 40114, 25426, 62568, 5425, 33401, 55493, 9904, 61263, +32685, 19654, 51618, 11231, 31688, 64028, 17701, 47372, 5847, 31198, 53755, +18703, 37833, 60578, 6146, 42069, 24780, 47536, 2847, 34506, 58567, 20509, +43648, 3682, 52993, 17211, 48541, 29740, 1429, 54987, 33817, 23249, 49926, + 8520, 40106, 24932, 54871, 7370, 33251, 62409, 3832, 47848, 31918, 6518, +61015, 21857, 43041, 14022, 37801, 56466, 8573, 28235, 47832, 19977, 40975, + 5544, 58417, 36002, 12028, 63596, 20216, 38302, 53274, 3055, 27104, 44548, +18083, 52086, 110, 41332, 33585, 6904, 63128, 17894, 42675, 30743, 6070, +48878, 25126, 41887, 2900, 29576, 61764, 8399, 54897, 25135, 46548, 7372, +28954, 41672, 3475, 62401, 31979, 16057, 54285, 36869, 11558, 27869, 56353, + 2555, 41616, 22616, 57847, 10051, 32999, 43698, 18752, 53535, 27694, 11856, +48366, 37536, 14163, 64158, 23429, 39799, 17226, 52825, 11665, 37653, 56172, + 8764, 28878, 59149, 482, 42312, 24074, 48917, 4693, 34753, 65446, 12851, +46652, 19925, 37149, 53424, 9406, 46203, 19438, 37546, 64297, 5737, 40144, +25516, 59790, 3783, 51149, 11619, 31271, 42944, 19421, 60313, 8674, 41620, +24067, 62317, 15191, 39797, 20166, 61374, 1715, 49951, 24211, 41475, 4410, +63230, 32526, 9469, 52767, 26828, 42889, 11843, 50258, 30293, 14615, 53486, +34952, 6886, 54497, 30082, 759, 36226, 56311, 7720, 45545, 25045, 52084, +16684, 39460, 20984, 50854, 3733, 45617, 26904, 56647, 5523, 44023, 21850, +51198, 820, 34368, 57325, 14524, 39881, 25071, 53865, 5037, 45393, 12980, +40213, 22493, 58628, 9531, 33763, 62843, 2881, 46330, 35365, 18407, 51087, + 1477, 33953, 64856, 22020, 49969, 10549, 35535, 54419, 19817, 33023, 62423, + 6919, 30394, 58597, 3100, 35343, 50487, 8159, 39917, 44456, 4596, 51624, +28944, 14776, 48147, 20004, 28140, 62492, 9793, 41849, 17451, 38633, 26804, +51725, 6960, 37760, 55228, 15920, 43131, 23357, 54034, 2233, 39410, 24080, +45989, 8923, 59000, 17796, 31761, 52443, 12222, 40405, 21638, 56552, 14374, +32780, 47748, 11509, 59634, 22589, 40870, 15887, 62742, 30555, 13918, 47785, +25703, 63321, 9955, 42749, 23688, 59669, 12269, 31112, 54230, 9230, 44784, +20772, 50474, 15528, 40743, 26243, 63176, 2567, 48508, 18612, 37625, 62010, + 4738, 31601, 48621, 19987, 63845, 2772, 31177, 43158, 15170, 61454, 24219, +39550, 8989, 53705, 28659, 17297, 56733, 31026, 5911, 50883, 35930, 13136, +45386, 22554, 53879, 4502, 33445, 55515, 7929, 38021, 46737, 15279, 52412, +22327, 41712, 7511, 62926, 33706, 17446, 44680, 5195, 61890, 23282, 42234, +16261, 37070, 64931, 6005, 50740, 21072, 30681, 54655, 10424, 41821, 22479, +48826, 15282, 29351, 42193, 1383, 58177, 26271, 45557, 4029, 39299, 26081, +56740, 12607, 35456, 58939, 73, 46913, 20342, 29945, 56366, 11934, 37894, +61333, 9683, 28868, 51555, 14356, 38847, 23345, 59673, 11164, 35474, 63069, +18987, 43286, 4395, 58374, 36167, 13158, 45630, 20410, 59818, 10800, 41875, +24092, 57467, 15434, 41099, 25146, 50250, 2746, 58854, 30694, 16307, 52008, +36848, 284, 60149, 25143, 46312, 16870, 32338, 54827, 8827, 49096, 28863, +14830, 56147, 37209, 8123, 64465, 31280, 20355, 57011, 13648, 43970, 26790, +49962, 9157, 54918, 34641, 19528, 60805, 12787, 51745, 36855, 17064, 32086, +49252, 453, 37119, 59058, 16438, 51147, 25511, 43045, 7069, 48843, 30315, + 4332, 65523, 38271, 15387, 31016, 53794, 6309, 35002, 48154, 15009, 64661, +27086, 5163, 59805, 36327, 19848, 53308, 8394, 31251, 51069, 3459, 61043, +29349, 22259, 45314, 4315, 49126, 34309, 18171, 52046, 10947, 32078, 56701, +15187, 43870, 22647, 55350, 8228, 29319, 44391, 3999, 59472, 30928, 11319, +49742, 28279, 18380, 53943, 8970, 46443, 19821, 38792, 26622, 65357, 1148, +49368, 21910, 34299, 52674, 11139, 29397, 47593, 4850, 54600, 25265, 38811, +14598, 57693, 31285, 13003, 48293, 22881, 45661, 1065, 64208, 17859, 34085, +58705, 3937, 43660, 21539, 65472, 17053, 41470, 24843, 61873, 15502, 43332, +22541, 39506, 11988, 57335, 1978, 36326, 65120, 14925, 33024, 59522, 9042, +39181, 24875, 62326, 12973, 36115, 55092, 9319, 28956, 46263, 3566, 49545, +35913, 15958, 61594, 26336, 51081, 231, 44040, 23705, 52936, 13923, 39273, +21350, 57470, 10938, 28766, 59344, 19706, 45544, 5568, 39901, 25567, 61085, + 62, 48234, 13429, 41719, 25148, 45902, 10948, 52655, 18425, 29056, 60234, +13784, 54472, 32639, 10400, 64170, 36720, 295, 58136, 33238, 13435, 49076, +24398, 61016, 1426, 44692, 20107, 65425, 32992, 3185, 28370, 62565, 7840, +41827, 26532, 51961, 6704, 63930, 27007, 44411, 2542, 27874, 61433, 6467, +42369, 23808, 50036, 4072, 63587, 16911, 30029, 44374, 1248, 55813, 28059, + 7190, 50763, 37216, 3710, 53931, 17492, 38745, 20424, 52158, 1860, 36446, +65309, 16883, 40916, 23450, 55623, 5472, 31178, 59048, 11605, 38750, 22634, +54804, 8873, 32905, 47388, 16662, 27534, 56980, 7431, 41160, 24694, 54641, + 8519, 32979, 47434, 4829, 57824, 18826, 34251, 49849, 1209, 41580, 15510, +63287, 23556, 40636, 2523, 59736, 32436, 17952, 62315, 12738, 45149, 28413, +17525, 57424, 31123, 3637, 35010, 60190, 18805, 49780, 27831, 9799, 53242, +35423, 19199, 57350, 9112, 49700, 29459, 14007, 46420, 32792, 8507, 63046, +18554, 37731, 52983, 2302, 34770, 65223, 8101, 54421, 24247, 40680, 12985, +61701, 21739, 52680, 7859, 30291, 50257, 17051, 42760, 27625, 9194, 64375, +33815, 4271, 49896, 27282, 17028, 48711, 36305, 787, 65393, 25882, 42168, + 6742, 52162, 21266, 45226, 10031, 32186, 54422, 16680, 28952, 65089, 3060, +48835, 26910, 38514, 17293, 51500, 1542, 36497, 64317, 10300, 34786, 47441, +20234, 40586, 7047, 63863, 18356, 34300, 50039, 9765, 28939, 62735, 2369, +44636, 23460, 40268, 4481, 61910, 34817, 13154, 46677, 22332, 50160, 5225, +40026, 24342, 62446, 2310, 39032, 25327, 59846, 15202, 44934, 1216, 41100, +26161, 57821, 5717, 43949, 21917, 64600, 14452, 30168, 55234, 9507, 38718, +21036, 61040, 14149, 52736, 22837, 42717, 7818, 57171, 24721, 40825, 18482, +61457, 27857, 3333, 38128, 51843, 16801, 30281, 47042, 764, 57711, 24329, +44319, 16062, 34901, 47105, 10566, 58556, 19609, 36153, 62042, 12875, 43112, +23567, 63985, 6214, 39038, 26724, 60993, 1874, 33192, 47679, 21677, 63421, +15818, 40120, 23897, 57078, 239, 36248, 62203, 15294, 40979, 24713, 60796, + 7216, 41815, 16697, 46130, 30154, 13618, 57035, 3099, 37524, 63405, 16426, +31181, 45346, 10147, 65210, 29159, 5816, 51317, 35999, 18860, 56591, 10270, +39247, 25931, 52039, 6216, 38783, 24522, 56262, 8227, 31837, 47047, 2885, +52704, 10453, 33806, 50377, 4316, 63364, 26621, 46813, 18305, 29081, 43989, + 6738, 54191, 23335, 42195, 17582, 53270, 2823, 46582, 28023, 16724, 58980, +37383, 11501, 65313, 19001, 28745, 55349, 7227, 39493, 18213, 32000, 63824, + 6264, 41449, 25594, 60237, 4442, 31193, 48095, 7363, 37150, 53093, 14638, +32616, 57270, 8092, 44540, 29166, 16650, 55252, 36762, 5197, 63259, 21167, +36366, 56883, 891, 39417, 20338, 6281, 47273, 24853, 42530, 15395, 50727, +22224, 46004, 5966, 36623, 54362, 15212, 30153, 58604, 8309, 40829, 13319, +53158, 37290, 16754, 31380, 59938, 12377, 46853, 21222, 38496, 14271, 57790, +19883, 35234, 46291, 15820, 55877, 31196, 10830, 45289, 36263, 21039, 57895, +10071, 33756, 46668, 19722, 61466, 32047, 12823, 57322, 26570, 42003, 6619, +58988, 24909, 45175, 14335, 48899, 28556, 3355, 60907, 35839, 14184, 51533, +25149, 46783, 6971, 43072, 25833, 64797, 14282, 51755, 1366, 36822, 46049, +19273, 60825, 11876, 38614, 26641, 65082, 14542, 41199, 25323, 46006, 10231, +62451, 21486, 33106, 52152, 6946, 29852, 55709, 19772, 47782, 9463, 39182, +26757, 51564, 796, 34572, 63936, 9212, 44502, 24380, 56252, 12274, 45994, + 2027, 32717, 59023, 21585, 48822, 3361, 39088, 25496, 55571, 1236, 35140, +60699, 19835, 44390, 3657, 50225, 28739, 13387, 59263, 27607, 16402, 45141, +21918, 50205, 6671, 31027, 48094, 10779, 41638, 23341, 63765, 2729, 36666, +59776, 11693, 45054, 22091, 54788, 14845, 36640, 62874, 7244, 30678, 57440, +18934, 44718, 12807, 55324, 27032, 38527, 2327, 56979, 25470, 47263, 7213, +37433, 50736, 15083, 42603, 22065, 56570, 5602, 46038, 25558, 55664, 13318, +29737, 53303, 4878, 27985, 59713, 12645, 43790, 24483, 54981, 5872, 41297, +22119, 52897, 14011, 34682, 57006, 7702, 31495, 51304, 18447, 45300, 29812, + 1576, 60150, 32470, 15979, 57845, 36354, 11327, 54403, 21439, 46703, 4947, +32485, 53100, 20783, 63482, 9232, 39468, 24167, 52576, 12270, 35466, 48481, + 4597, 43507, 24262, 57379, 1674, 46202, 26884, 39335, 11136, 60384, 34630, +16703, 46464, 69, 50461, 36785, 13649, 58768, 21299, 44268, 7980, 62978, +22377, 40960, 13513, 30044, 61904, 6210, 54912, 22844, 41732, 1226, 50554, +27391, 7663, 32417, 54181, 2549, 41923, 24464, 58497, 11688, 49307, 20540, +39954, 13936, 52080, 5236, 34260, 54744, 12730, 43275, 22512, 51177, 7780, +32179, 48673, 2649, 55121, 34012, 22716, 50286, 4714, 58886, 36132, 20689, +51783, 12388, 42951, 26505, 59387, 58, 34354, 52175, 12345, 42780, 25262, +58509, 2400, 44574, 26913, 60882, 13535, 42329, 22867, 62040, 10728, 49415, +26639, 39603, 12339, 57869, 21184, 30744, 60158, 13533, 38791, 20573, 54786, + 8550, 34800, 61511, 13732, 49708, 28212, 5, 60589, 31747, 12434, 36879, +64238, 20253, 42624, 4710, 49263, 21312, 31042, 52693, 1914, 41646, 25639, +58363, 10593, 48257, 19718, 36600, 54693, 12314, 33119, 45716, 17076, 64220, +23359, 41579, 2389, 61776, 27549, 17912, 48787, 35013, 9622, 63862, 32242, +19099, 46758, 12715, 51759, 29643, 9739, 43777, 26149, 61750, 40229, 21820, +59591, 3677, 37767, 55149, 10991, 30494, 63659, 18632, 43992, 4295, 33882, +47490, 16784, 55653, 25402, 42481, 5322, 58150, 22432, 40627, 13, 56326, +25792, 40625, 4470, 50922, 29950, 7981, 64860, 37782, 1017, 27658, 60297, +19075, 52683, 3381, 39859, 24747, 54292, 14286, 41844, 2660, 50121, 24279, +45586, 11190, 64561, 34708, 16603, 51405, 4457, 35747, 56620, 10607, 33028, +47940, 19030, 42303, 56, 62704, 16945, 36158, 57557, 3760, 40505, 21420, +34266, 59838, 10681, 30129, 52358, 4121, 43664, 20822, 56437, 1868, 48200, +35100, 6581, 59444, 23720, 42334, 3652, 47473, 17735, 60099, 35134, 11018, +44712, 25429, 58399, 5180, 41910, 23458, 54900, 14004, 41167, 25851, 52965, + 4911, 39374, 20558, 30708, 65255, 14650, 43807, 7949, 40811, 26588, 63344, +11613, 42832, 22326, 51806, 9741, 38799, 25818, 58508, 16552, 36918, 52359, + 9059, 46399, 36141, 4574, 63423, 38070, 18538, 57891, 662, 36975, 54152, +14115, 29465, 48897, 15780, 28074, 55845, 5557, 40221, 24659, 51556, 1850, +41224, 25522, 53946, 10194, 39713, 22478, 60959, 5128, 41410, 23711, 63997, +12414, 39904, 18285, 59207, 27840, 179, 60689, 35028, 9768, 30603, 63416, +18847, 43261, 6842, 33786, 61291, 21185, 45217, 15872, 51180, 33252, 2122, +60712, 37225, 15769, 30793, 46977, 3762, 59502, 22962, 41794, 16200, 65482, +27813, 10422, 55407, 23946, 42972, 12085, 51265, 26274, 47374, 7434, 29269, +43502, 14649, 64823, 23492, 39915, 12058, 47921, 29153, 16742, 55522, 33834, + 2111, 59507, 28865, 19456, 62535, 10952, 33006, 41124, 18899, 64098, 8570, +31881, 48276, 2954, 55091, 21455, 32159, 62770, 11698, 28443, 55492, 6649, +40987, 25331, 51080, 10666, 35545, 55849, 3050, 45794, 20635, 37342, 49142, + 9173, 31721, 63789, 13567, 37191, 57681, 16106, 43968, 22029, 55760, 8882, +38543, 27024, 45701, 7438, 57818, 22944, 32027, 61948, 10761, 46859, 28542, + 3096, 64787, 35336, 19600, 59265, 14459, 28859, 44543, 10955, 63829, 18377, +28551, 43988, 8502, 61888, 25606, 39042, 6928, 48264, 22122, 54107, 15823, +40827, 23368, 62560, 8243, 38717, 20929, 53661, 7421, 32730, 40406, 3220, +54546, 19658, 33036, 44171, 333, 63818, 19380, 34921, 49995, 5555, 45945, +25507, 41507, 1293, 48969, 24690, 56365, 4662, 42441, 20661, 33513, 52860, +10840, 45829, 22705, 55838, 7909, 30051, 51812, 15748, 34141, 60287, 8388, +43774, 23009, 62103, 13734, 31255, 51854, 2512, 45838, 28420, 7899, 61128, +27269, 1077, 55773, 35145, 13053, 50566, 30685, 10229, 52236, 37131, 3827, +58369, 24723, 50303, 1753, 40069, 26283, 60654, 4099, 34877, 57699, 14041, +48844, 17630, 31225, 7674, 35062, 48591, 16450, 28734, 58934, 2416, 41985, +23838, 56933, 12706, 50311, 22472, 38518, 2028, 61793, 20831, 48184, 11057, +35319, 54500, 15605, 32755, 63255, 11401, 45399, 18718, 54423, 33650, 13801, +47804, 21351, 50860, 6727, 34059, 47091, 15335, 65480, 29248, 5421, 58717, +35974, 18788, 62553, 8003, 33225, 40999, 830, 49436, 19938, 30600, 61225, +13109, 43368, 22077, 64022, 7305, 30174, 58493, 20621, 34284, 52813, 10279, +29028, 48768, 19185, 55906, 6345, 41549, 23490, 48212, 15703, 63397, 25838, +39860, 13283, 51510, 29242, 19748, 55146, 15690, 49457, 27030, 38739, 11913, +54141, 23056, 42315, 1564, 65463, 16496, 33123, 50076, 11549, 62867, 20640, +38579, 7671, 60971, 16678, 43170, 26818, 55085, 6501, 47446, 34434, 18277, +60411, 22759, 50232, 4830, 34157, 57684, 15487, 31492, 64412, 5527, 43553, +11489, 48006, 31370, 892, 60269, 27102, 17642, 54846, 29703, 12446, 51365, +34777, 20395, 62520, 8862, 33486, 57486, 3833, 37566, 52273, 19253, 32597, +62188, 9431, 42751, 21434, 60300, 15572, 32868, 49648, 2958, 46334, 35260, +20051, 53354, 9490, 42877, 26746, 51892, 5876, 35385, 55159, 21655, 41548, +14497, 52584, 37010, 2597, 47629, 24455, 58333, 14851, 42115, 716, 37490, +57187, 7593, 28799, 46108, 19411, 51701, 11574, 64415, 20207, 36212, 49435, +11110, 30549, 45858, 572, 52109, 37690, 5961, 60992, 21496, 39686, 3549, +64065, 19026, 34584, 58642, 704, 49241, 30921, 8232, 56468, 35273, 3708, +61285, 38090, 6896, 49417, 22826, 41655, 8800, 53520, 36608, 17408, 49938, + 6397, 54679, 25940, 40133, 13606, 57933, 25356, 41645, 12765, 52318, 4654, +38335, 48908, 17967, 35862, 64256, 1928, 32324, 59610, 19354, 48209, 15427, +33202, 65220, 4925, 27617, 52235, 17047, 40620, 24872, 53083, 5150, 29404, +63203, 12469, 40545, 23672, 52796, 3417, 64546, 19331, 29898, 50503, 909, +42239, 27382, 18054, 58304, 38237, 9506, 30115, 46704, 4853, 53512, 35074, +20458, 52066, 773, 37572, 55902, 15641, 34553, 50954, 2275, 45111, 18505, +57318, 30626, 8959, 37038, 55909, 3594, 32724, 50068, 11372, 60208, 24539, +43135, 15355, 64725, 24207, 45382, 8004, 59505, 15788, 47976, 25034, 41119, + 9123, 61142, 29503, 18470, 51820, 9481, 64441, 31906, 12484, 37463, 47607, +15870, 63758, 6086, 39944, 25979, 61429, 3445, 33927, 44435, 19248, 63060, + 1149, 40483, 26226, 53972, 12556, 33847, 48860, 5805, 42853, 20834, 64909, +34582, 14997, 52600, 37777, 16311, 49479, 21863, 43428, 6032, 59897, 23628, +44903, 15530, 65496, 22574, 41525, 13666, 45230, 21653, 56289, 7903, 30410, +49463, 16061, 44799, 28356, 2179, 65008, 12192, 44168, 23594, 62845, 9334, +49710, 19705, 33592, 53156, 8006, 39457, 26145, 64408, 9611, 41601, 26959, +51298, 13799, 30162, 64953, 3899, 42134, 24208, 50547, 5665, 39112, 22888, +61602, 1915, 43566, 26447, 58733, 9952, 30043, 62917, 18442, 43519, 8751, +32838, 51859, 17368, 44731, 9641, 53414, 30598, 20606, 56187, 13744, 44304, +26311, 54564, 5795, 40065, 25295, 52760, 1551, 39246, 26744, 54714, 13665, +49397, 5292, 41114, 23377, 60462, 2081, 32092, 43879, 14702, 62327, 30986, + 588, 54241, 38049, 7960, 32365, 57446, 4523, 45542, 36216, 10007, 61566, + 175, 41055, 20623, 63687, 6175, 36394, 50539, 18551, 29024, 54539, 7215, +39663, 26023, 46601, 3120, 57666, 22961, 31413, 47541, 1666, 59323, 13759, +40195, 24041, 57902, 125, 44937, 12033, 29052, 56285, 21136, 44221, 2097, +39467, 23165, 53480, 17914, 29004, 62419, 15126, 38111, 49664, 11053, 44457, +36971, 2888, 60895, 27996, 6220, 44840, 25322, 49511, 15020, 40888, 24040, +65137, 12219, 43903, 1044, 50471, 28385, 13415, 53185, 34638, 6344, 56050, +27631, 16875, 62476, 29079, 11450, 58850, 36399, 1299, 48770, 20596, 62830, +29815, 12777, 47569, 4051, 62224, 27615, 16625, 38400, 54086, 8665, 35167, +49548, 20039, 65290, 10680, 31498, 50574, 21584, 62961, 8790, 33929, 43288, + 1275, 55560, 27414, 7168, 62200, 37869, 14968, 58202, 27162, 17405, 48528, +34635, 13842, 53028, 25005, 41779, 6643, 54760, 22016, 40217, 10657, 61996, +25804, 42803, 15606, 50857, 27611, 18082, 58151, 35981, 11661, 64941, 26224, +44487, 3095, 60217, 22878, 30584, 42784, 828, 62053, 22318, 45403, 5828, +31199, 65050, 20057, 45089, 27159, 8543, 54591, 29941, 13201, 52348, 22985, +43441, 7504, 29300, 56514, 11338, 41491, 19292, 58749, 36697, 2060, 61310, +10748, 46544, 19200, 33554, 49769, 151, 59355, 30196, 16366, 45032, 35796, + 6819, 56553, 17443, 36539, 60396, 6051, 44247, 13679, 50054, 23482, 56152, +12210, 41256, 24904, 63039, 10111, 42462, 24213, 60520, 6715, 47020, 29554, +13906, 64870, 24231, 40604, 5619, 60981, 21029, 44566, 13846, 64136, 29413, +16789, 35508, 46701, 834, 56921, 28946, 6826, 50578, 30542, 19073, 36656, +52904, 4595, 31606, 56321, 17665, 44072, 2221, 58542, 35819, 16229, 42783, +23675, 59947, 2741, 29861, 51399, 18066, 34475, 57194, 13966, 46938, 22030, +54654, 7147, 28738, 46858, 13691, 58089, 20718, 38673, 4020, 56293, 28145, +16889, 59250, 38377, 8996, 27482, 47281, 3890, 57017, 30742, 9675, 63446, +38207, 18044, 32171, 53929, 658, 40274, 29819, 7652, 57024, 36636, 4820, +53003, 27913, 17491, 62949, 36704, 9167, 58858, 21329, 35988, 54133, 29505, +56318, 1174, 38875, 26861, 41588, 5252, 61458, 17218, 28335, 57865, 718, +45687, 18219, 31776, 60507, 7522, 44522, 20095, 33949, 48701, 9849, 60255, +19368, 31372, 56043, 13383, 41006, 23824, 52217, 5980, 39573, 22130, 55124, + 2884, 35672, 48930, 21660, 61048, 202, 41158, 23028, 34448, 47960, 2319, +60222, 25039, 39007, 9102, 63683, 18755, 33908, 57844, 11520, 42317, 23388, +59907, 9169, 33408, 46499, 18169, 30794, 64426, 12626, 35277, 46948, 17510, +58183, 28177, 7572, 51119, 37103, 17183, 28345, 60293, 11652, 42249, 22916, +64203, 16217, 39509, 26567, 51819, 13103, 43938, 24701, 56539, 9899, 31374, +60408, 4161, 44344, 22422, 61388, 13082, 33654, 52516, 17344, 42385, 11207, +64460, 36397, 18982, 28991, 48536, 8354, 53434, 31977, 17536, 63999, 36634, + 7589, 52807, 14902, 47931, 26821, 59813, 6696, 45675, 36404, 3269, 56641, +27356, 7419, 64072, 32759, 20994, 56134, 15233, 47167, 33627, 19078, 59336, + 2393, 32265, 56909, 7675, 46709, 21040, 33457, 60701, 16606, 36499, 47104, + 4109, 64793, 23137, 40015, 12294, 50627, 34500, 6982, 48004, 18302, 29958, +56608, 14284, 43898, 8866, 38106, 54098, 18978, 32595, 44241, 7524, 57375, +30939, 13992, 61668, 29042, 3921, 41185, 24078, 54796, 17347, 44436, 2863, +39035, 26723, 57644, 13242, 31256, 45167, 16888, 53234, 29074, 4304, 50372, +35903, 8071, 63712, 28620, 2658, 57187, 37226, 8867, 61690, 26696, 46391, +13741, 31624, 53265, 18878, 48161, 2565, 33419, 56965, 7531, 45624, 30834, + 246, 51972, 20851, 39782, 12942, 55748, 34852, 8279, 52374, 19992, 47537, +33671, 12167, 58921, 38042, 18207, 50775, 1488, 34297, 61326, 17129, 36460, +57496, 3962, 45440, 28381, 16620, 62404, 37621, 406, 50620, 24389, 46176, + 6861, 29359, 54770, 15383, 42051, 26122, 56571, 7459, 41615, 21347, 47923, + 9925, 33729, 62620, 13160, 47069, 25229, 41010, 9013, 51802, 30749, 19963, +62795, 37733, 1473, 33144, 60154, 18648, 47597, 3568, 35967, 54919, 12718, +32372, 41443, 19123, 58206, 4209, 31573, 54413, 10987, 47387, 25995, 39397, + 1590, 52812, 24988, 48812, 5373, 39672, 19917, 52661, 33460, 12206, 62727, +38188, 2085, 55914, 14131, 41760, 26014, 63087, 8427, 39971, 24028, 50819, +11478, 30097, 55915, 5719, 46531, 19653, 35785, 57996, 7460, 43281, 27540, + 965, 52494, 31582, 8787, 37980, 59283, 16420, 35191, 50597, 6072, 42004, +24752, 64421, 14648, 46907, 36454, 465, 54335, 19293, 33496, 62615, 13255, +40096, 23117, 53228, 3015, 27901, 59049, 11522, 42437, 25028, 62257, 12406, +47517, 19473, 30734, 61286, 10515, 34928, 46396, 487, 51310, 23508, 41660, + 5463, 50426, 18318, 10053, 45086, 24609, 59723, 11448, 51445, 21005, 32218, +46946, 8912, 52182, 35805, 20838, 55991, 5700, 47193, 25044, 58708, 1252, +40407, 17290, 53765, 29504, 2744, 37109, 46736, 8280, 59203, 32935, 18197, +64370, 12410, 46672, 38215, 16298, 27508, 58234, 7843, 39559, 26036, 54797, +11883, 64123, 19694, 29832, 43574, 6201, 51758, 23403, 46888, 3040, 28794, +49734, 16193, 62491, 4943, 38688, 26248, 53264, 2699, 36908, 56214, 8049, +50531, 27164, 4518, 53506, 37627, 12208, 45641, 25261, 65278, 5349, 47605, +19458, 31080, 52572, 2447, 34543, 53769, 7358, 46134, 21752, 60756, 3503, +34474, 45429, 14231, 53066, 23447, 40990, 15699, 30747, 47601, 450, 56390, +23877, 38803, 6074, 54522, 21979, 49777, 3889, 34788, 62590, 12953, 41797, +23320, 51116, 2776, 47049, 19928, 30619, 62170, 9185, 41782, 19830, 32963, +55752, 10236, 48889, 21375, 35171, 51648, 18655, 42084, 5000, 50650, 30106, + 9545, 64601, 37401, 11482, 53282, 28027, 16988, 51427, 38379, 4427, 27293, +45600, 9031, 54427, 20770, 30178, 44581, 8345, 57022, 28203, 343, 59572, +37988, 23132, 64534, 4535, 46091, 33237, 23116, 59423, 1987, 28056, 64215, +11566, 49960, 23990, 40651, 1195, 51340, 22058, 47006, 12073, 58965, 33580, + 5203, 48774, 26189, 60295, 16120, 42570, 6368, 48945, 23968, 59236, 8496, +39102, 20687, 56410, 32273, 12475, 47534, 38295, 18155, 50720, 31191, 10960, +45287, 20784, 51856, 1909, 35388, 60575, 5579, 42151, 24221, 64240, 10309, +40290, 22162, 62153, 14662, 42894, 25574, 60500, 5970, 46434, 17961, 29293, +63748, 14605, 39719, 4212, 54338, 27854, 9285, 49070, 30194, 14645, 56522, +24242, 42533, 6973, 48235, 27498, 15798, 60370, 36139, 5741, 47088, 19978, +58120, 30069, 13001, 63388, 38436, 17422, 33011, 51186, 4067, 64938, 23332, +38593, 14655, 60791, 26396, 51394, 4616, 41056, 23098, 53704, 1692, 33098, +65316, 16694, 47893, 4328, 28061, 54595, 16028, 49062, 27271, 8478, 38262, +57946, 15998, 27640, 49278, 1959, 63257, 22995, 47909, 14629, 35628, 43531, +20277, 56496, 7968, 32943, 62165, 19577, 42041, 12940, 59243, 24130, 44307, + 8535, 55291, 27664, 16264, 48112, 31690, 20947, 61441, 9895, 47010, 18558, +30268, 53411, 3700, 37392, 65285, 13780, 40103, 26089, 53295, 9870, 28600, +48223, 15483, 60892, 23624, 40894, 12972, 64944, 19480, 27959, 43732, 2588, +62777, 29818, 18098, 53602, 10378, 44162, 32046, 7491, 60888, 21501, 31619, +49649, 5247, 41908, 25508, 57714, 10435, 34674, 45082, 14964, 48417, 36011, + 4980, 51488, 16994, 33548, 54935, 2557, 45898, 22924, 40255, 16382, 58173, +29264, 12960, 64518, 38187, 16599, 32214, 60848, 23635, 40155, 4803, 47820, +18853, 34413, 65303, 3371, 42248, 15855, 29606, 61998, 11287, 42105, 26409, +38894, 15448, 51958, 21537, 31173, 63469, 10704, 42477, 24879, 61233, 14609, +27783, 49332, 663, 41569, 25111, 53575, 4141, 31088, 62481, 10993, 32512, +53237, 17617, 47254, 4540, 36808, 45466, 7476, 55932, 16346, 34920, 62027, +10767, 30952, 57080, 8639, 43658, 22636, 35210, 55249, 10392, 43576, 18817, +61918, 27679, 11300, 38058, 44357, 16139, 63119, 31484, 18933, 59600, 1690, +39196, 21542, 55534, 10516, 35129, 59128, 12760, 44761, 27903, 17524, 58191, +30769, 11078, 37793, 54953, 17042, 29317, 62958, 2067, 33686, 49888, 8864, +64678, 19233, 34591, 43536, 10491, 61807, 25640, 45636, 9426, 30526, 56804, +16338, 44297, 27495, 5574, 61213, 38026, 16924, 33160, 58067, 5014, 40002, +24267, 50041, 522, 65433, 18303, 30778, 43966, 12611, 61575, 1606, 30527, +58930, 14200, 39131, 22433, 53730, 211, 46650, 24357, 42372, 6607, 63163, +34549, 12901, 58071, 31212, 17951, 63680, 37659, 2196, 58487, 15347, 35141, +51355, 18669, 46587, 30055, 9090, 52761, 15614, 41530, 19747, 51403, 7691, +36097, 53148, 16787, 42845, 33494, 5355, 58702, 17698, 33042, 64869, 8066, +39398, 25859, 45103, 15254, 62348, 22078, 39979, 10954, 52007, 20429, 34564, +61819, 3338, 32253, 47577, 18210, 65023, 1706, 42632, 24612, 60609, 5038, +27891, 58869, 14850, 36518, 63309, 6294, 41385, 23842, 55735, 17543, 39099, +12957, 51537, 29709, 17301, 53578, 36535, 3454, 55031, 31990, 10820, 50153, +21547, 35551, 56830, 1624, 42191, 21540, 57634, 31935, 17205, 60003, 37332, + 3226, 63250, 36048, 10362, 52548, 20620, 32881, 63891, 975, 50444, 31358, +14157, 54052, 25124, 42162, 8513, 34735, 53157, 3569, 27541, 56377, 9921, +39632, 20659, 47392, 11697, 31872, 53994, 2325, 45494, 19651, 32278, 59915, +11355, 29423, 58114, 19619, 44839, 10923, 34585, 56770, 20967, 44622, 6958, +36442, 64419, 19334, 46146, 29675, 5964, 61249, 36683, 18226, 30166, 45338, + 9449, 53343, 27315, 526, 63980, 37323, 17805, 50307, 27686, 7179, 53463, +37410, 2862, 31363, 65022, 18372, 41414, 4112, 57851, 35891, 6576, 52215, +26932, 39458, 1154, 55093, 35338, 15436, 59671, 27794, 19983, 48368, 548, +59132, 21468, 36632, 63181, 3846, 45048, 32540, 10432, 56829, 21588, 48634, + 5171, 33538, 55502, 11568, 45442, 21555, 36722, 57803, 1657, 28729, 52477, +17633, 37797, 55857, 11800, 28493, 61670, 18666, 44179, 1374, 51386, 20725, +64647, 30313, 8705, 58013, 20651, 30191, 60937, 9396, 40896, 26651, 63938, + 7214, 49218, 32603, 3611, 54887, 37485, 8074, 27591, 47641, 3017, 53249, + 8769, 63495, 35425, 15323, 56392, 29178, 10369, 48870, 23148, 55575, 37261, + 2281, 49972, 22342, 63904, 4645, 46294, 9359, 57304, 34996, 3565, 46249, +20591, 51653, 6943, 37935, 56654, 16316, 31362, 51258, 9313, 28104, 57635, +15580, 37576, 49387, 2010, 42772, 24628, 59962, 13583, 31800, 57216, 18114, +28305, 49580, 1300, 42635, 22209, 52589, 17971, 33170, 65166, 416, 47811, +20112, 31070, 59487, 4150, 36095, 48227, 20317, 56976, 783, 28521, 49121, + 8807, 42485, 24727, 54670, 14436, 43716, 26554, 50398, 3304, 40494, 23547, +62729, 6271, 49271, 35933, 1297, 65013, 25000, 41647, 5651, 48399, 20026, +37384, 57578, 12628, 44660, 28682, 4593, 57217, 21223, 49105, 29502, 2429, +37985, 63732, 19372, 46537, 990, 36966, 58954, 14431, 45930, 28543, 10621, +53965, 20825, 45428, 13016, 60751, 36872, 16586, 28827, 53800, 4681, 47715, +25896, 39386, 16570, 52951, 23476, 47763, 5944, 62243, 26512, 39777, 13742, +59694, 19588, 29558, 48970, 1479, 43516, 21627, 52957, 5707, 47967, 29093, +13926, 43782, 25308, 61550, 3706, 40913, 13010, 63126, 35149, 20872, 57955, + 2506, 32385, 61876, 21968, 46452, 9996, 30705, 61126, 14268, 45427, 24901, +52067, 10770, 42052, 20960, 56955, 2225, 31448, 48256, 7326, 55321, 36230, + 86, 30095, 56649, 14069, 41429, 22776, 54961, 9277, 39808, 21893, 31248, +49513, 11442, 53547, 20958, 35155, 46157, 334, 54375, 27601, 16503, 58068, +33902, 9965, 47615, 25772, 59269, 1073, 34273, 46901, 6606, 58852, 28041, +15315, 48809, 38268, 4528, 62982, 30118, 13519, 48148, 24375, 51605, 5673, +41197, 11227, 45143, 23947, 53133, 16293, 28660, 47184, 4743, 58644, 12864, +39830, 24035, 43997, 9818, 59678, 37206, 2582, 64707, 23408, 48123, 12064, +37263, 61116, 21686, 43772, 1142, 49956, 26404, 58945, 6487, 40048, 24906, +62244, 9125, 43756, 17778, 52379, 36184, 7971, 48704, 25684, 42013, 2587, +61585, 28805, 13436, 53174, 31383, 346, 50934, 11720, 40751, 25596, 52805, +10691, 38410, 56734, 5013, 31995, 60309, 19409, 48636, 29281, 11943, 45865, + 3775, 55486, 36089, 16205, 60473, 26258, 45774, 11204, 51891, 21618, 28690, +44972, 13891, 60703, 20386, 42375, 12015, 64082, 23386, 49785, 5431, 33604, +46215, 9009, 56627, 32922, 18128, 43982, 7027, 52048, 27805, 17249, 54868, +36484, 2291, 45728, 24736, 62209, 15675, 40939, 24228, 60541, 6843, 48199, +15505, 33498, 63654, 10918, 46021, 27098, 3148, 50745, 38461, 8340, 33934, +58598, 16840, 29390, 40843, 4550, 55526, 17872, 34194, 50419, 1894, 44361, +23616, 56501, 12789, 38710, 21124, 59238, 11766, 44727, 22376, 52857, 14559, +33463, 61525, 19320, 43529, 53681, 13720, 27982, 49885, 164, 36795, 58407, +19461, 43823, 8236, 32906, 59176, 18726, 43488, 12499, 38555, 26906, 53195, +14767, 43646, 26282, 59416, 12759, 30446, 65259, 21502, 44342, 5057, 36816, +61817, 19206, 46235, 33924, 7292, 56155, 18435, 29396, 63428, 6872, 40112, +22317, 50226, 3251, 35510, 64630, 14726, 39701, 24833, 60760, 5227, 46184, +14298, 40357, 25928, 54359, 12040, 39432, 17503, 51478, 29443, 7289, 64765, +33201, 15251, 53087, 36042, 20769, 61493, 4281, 32550, 47208, 7127, 63915, +18050, 36962, 56735, 9517, 30131, 42706, 15271, 54188, 23039, 46700, 8646, +32389, 52346, 14877, 59506, 27889, 7084, 51266, 22152, 37322, 53460, 14439, +41863, 7465, 59154, 35194, 13581, 51811, 28463, 10863, 55750, 32628, 20154, +51558, 7089, 34647, 64842, 1838, 42452, 25073, 52558, 6464, 31132, 58629, +12113, 40451, 23655, 63289, 8084, 33045, 57517, 3693, 42691, 32556, 19644, +45493, 11990, 55345, 33379, 8209, 50134, 37805, 15664, 61781, 24682, 39669, +11306, 60470, 20354, 35600, 56364, 6877, 47283, 19941, 33071, 54267, 22839, +45862, 5691, 42336, 25430, 49999, 14572, 40619, 5019, 54260, 24811, 40322, + 479, 55026, 20518, 38548, 3488, 60739, 27036, 49751, 12790, 37018, 63580, +16485, 28261, 42764, 19766, 64554, 10159, 45588, 35872, 5422, 62860, 25191, +52419, 15680, 43932, 6494, 61588, 25790, 39791, 7849, 64163, 19011, 32377, +43714, 11760, 50169, 28973, 4056, 65090, 36392, 7917, 43159, 22527, 62580, +13539, 43880, 20610, 35187, 65420, 8708, 27286, 52436, 19647, 44282, 7446, +36781, 59342, 15328, 34110, 64437, 20432, 48259, 497, 35238, 60498, 8810, +42917, 37061, 21479, 30544, 56809, 7328, 47938, 28187, 18696, 51601, 33279, +10553, 54923, 18582, 45206, 31520, 5945, 52371, 18374, 34276, 62542, 12642, +42227, 21936, 56956, 14293, 38846, 26907, 55437, 652, 39969, 22579, 64031, + 5140, 55761, 18361, 32041, 49786, 8313, 42954, 23985, 59011, 15000, 33887, +55819, 21003, 47192, 2770, 65152, 27470, 16668, 50129, 37437, 15102, 41599, + 8618, 58572, 36159, 22518, 61510, 14000, 29179, 49246, 9735, 40840, 20275, +58732, 252, 36614, 62275, 7670, 32266, 49144, 2570, 56578, 26166, 38575, +10419, 43881, 21001, 62436, 14515, 28955, 42505, 4837, 61560, 24545, 48907, +14750, 31823, 64655, 8161, 42831, 26594, 56292, 8929, 35995, 50100, 299, +30197, 52925, 19245, 39721, 25145, 51256, 5414, 41442, 20306, 59968, 34437, +15736, 65101, 22841, 48763, 5921, 35961, 54143, 13650, 47724, 25078, 42766, + 7745, 63193, 22592, 39385, 6132, 46749, 25517, 52336, 983, 40569, 26292, +62447, 5701, 39542, 26098, 56953, 1546, 39114, 24944, 32782, 6422, 38027, +62113, 17359, 46065, 27596, 5405, 64225, 38318, 16181, 28008, 49204, 6159, +60664, 22915, 40794, 400, 62960, 21267, 39557, 6542, 50781, 34433, 1813, +47065, 17774, 58479, 28861, 13085, 42578, 1208, 64692, 21497, 36425, 50605, +11695, 44724, 25451, 54207, 12617, 30258, 58979, 19007, 44554, 9213, 54507, +32022, 11392, 50752, 37276, 21004, 59116, 7665, 30247, 63030, 2470, 46998, +22338, 55499, 13381, 40856, 23913, 45373, 5549, 57948, 11692, 41156, 25924, +55962, 13554, 39848, 23194, 52856, 373, 28115, 46606, 19154, 61353, 32106, + 4014, 57724, 37138, 13357, 61790, 20613, 43053, 842, 33271, 47243, 17250, +59847, 2730, 32131, 62510, 16807, 27787, 50871, 20011, 43157, 5882, 60329, +24586, 41088, 4076, 47914, 25932, 59717, 15357, 40409, 22891, 55011, 9724, +38996, 26702, 49571, 2935, 33719, 55505, 9581, 43460, 21778, 50125, 15444, +29027, 64230, 10117, 36269, 58639, 1991, 41018, 21632, 65341, 27925, 3460, +52112, 35369, 7137, 55105, 26778, 43050, 700, 50608, 16717, 31085, 64263, +11810, 39766, 1641, 60179, 18118, 31553, 55205, 8672, 65534, 30259, 18965, +57316, 34432, 10846, 63822, 26933, 43279, 9356, 56676, 25866, 46037, 6225, +40648, 22641, 55987, 9662, 32849, 52984, 4376, 49064, 31858, 13386, 57950, +27682, 17720, 46807, 36911, 956, 30423, 58551, 19723, 45795, 2468, 32630, +56816, 13721, 48662, 27253, 6945, 57409, 37320, 21692, 53920, 12721, 45660, +25023, 52769, 11279, 39322, 26630, 56190, 2387, 47999, 18473, 37880, 57982, + 781, 33178, 61541, 16986, 46648, 28049, 2789, 53832, 29245, 8166, 38380, +55039, 14481, 27833, 50388, 18388, 65276, 2119, 49028, 16949, 33837, 62129, + 3797, 42536, 13690, 57947, 25678, 39982, 1663, 63064, 22290, 42987, 14550, +57404, 28970, 8215, 36974, 53382, 3016, 33139, 47767, 5757, 63485, 20241, +34173, 50568, 11870, 45962, 26291, 39321, 10114, 62402, 20145, 35046, 53724, + 3861, 41117, 22980, 60821, 5614, 40051, 17893, 31369, 44147, 7829, 57663, +29416, 1212, 63572, 24497, 43785, 4583, 53552, 16667, 33482, 44535, 1463, +64276, 32611, 6166, 55764, 25488, 43940, 14525, 50532, 24230, 40265, 15777, +45483, 21386, 50198, 6197, 58063, 26747, 47618, 1880, 35688, 55403, 17108, +47230, 34088, 11317, 38255, 57717, 1482, 41214, 22655, 53198, 11885, 38939, +21215, 58317, 14669, 33987, 65439, 12570, 44762, 3713, 58846, 35290, 13969, +53489, 29787, 8703, 55484, 38405, 2127, 30919, 45329, 12243, 62736, 22052, +38723, 122, 60422, 19110, 33180, 45695, 14463, 58308, 28519, 10591, 65226, +33492, 18844, 55864, 13994, 30516, 50896, 19958, 42865, 10870, 48262, 17465, +60077, 42354, 22564, 51887, 9315, 31475, 54442, 14487, 42496, 22552, 51226, + 1634, 35817, 56121, 11046, 32221, 47874, 17684, 54948, 30322, 13712, 49078, +25559, 57766, 11275, 40944, 24594, 52996, 8048, 35681, 55945, 23169, 48149, +10723, 31781, 59541, 4302, 39271, 20611, 61427, 568, 36207, 52539, 6127, +39015, 25883, 62415, 1832, 47968, 17289, 28752, 56817, 3610, 35401, 52284, +15623, 44631, 23745, 41143, 9775, 32653, 60073, 1465, 52286, 18068, 31873, +47232, 22880, 63538, 2264, 38706, 26977, 60385, 10891, 49041, 21053, 34406, +58324, 6847, 41776, 14345, 50731, 21691, 28526, 44485, 5365, 55514, 36649, +22851, 63530, 9349, 43838, 35230, 20475, 52064, 8583, 47563, 36909, 1167, +65358, 29981, 14717, 48588, 36462, 17130, 63399, 22117, 43073, 9245, 36044, +56328, 4479, 30463, 62793, 13437, 44791, 21406, 62024, 16009, 41096, 24236, +60091, 833, 35772, 54436, 7055, 44387, 22808, 51969, 12821, 30361, 54151, + 6322, 45908, 18580, 56230, 30831, 14473, 46362, 22572, 62970, 9594, 40540, +24346, 57441, 4882, 42065, 25949, 52430, 16486, 28831, 48828, 12151, 44385, +24087, 39479, 996, 47083, 13353, 49522, 24135, 39379, 6682, 52526, 21477, +39043, 14666, 62078, 35027, 17919, 52292, 1098, 44423, 24700, 59411, 15556, +39280, 23686, 54030, 3109, 33629, 50885, 8217, 60059, 23164, 48940, 10798, +36029, 56045, 16141, 41042, 22895, 52612, 3810, 35548, 44792, 17554, 62712, + 1442, 42005, 32357, 18239, 61312, 3197, 31491, 57695, 7232, 33614, 51873, +15759, 45200, 30215, 11477, 51047, 21381, 39771, 6554, 55297, 19144, 35258, +49291, 11941, 58485, 21038, 31215, 62499, 6223, 32661, 46179, 13362, 40355, +25803, 55830, 8328, 36961, 50738, 19807, 32148, 46027, 6565, 59842, 30286, +13299, 50614, 32610, 4476, 47100, 24142, 64287, 15917, 44378, 22575, 59777, +13049, 30825, 43151, 16588, 54432, 6714, 29353, 61071, 14093, 33172, 54790, + 1106, 45025, 27713, 14591, 64176, 37350, 9643, 47961, 26276, 52535, 10239, +62290, 21467, 33628, 51491, 13235, 46580, 34722, 11571, 55202, 19761, 31249, +49978, 10061, 58090, 24914, 40134, 15587, 52354, 21877, 39388, 8169, 63293, +31079, 3926, 58450, 34742, 8835, 65172, 31982, 18103, 40329, 11577, 60417, +22313, 41755, 8117, 63882, 27077, 3317, 54461, 28475, 16894, 34035, 60096, + 6278, 44592, 26063, 61728, 3136, 41298, 25810, 52172, 5724, 38661, 26650, +49429, 16847, 27935, 62294, 791, 38040, 49217, 17090, 27213, 51158, 15238, +59140, 25631, 41180, 9272, 56554, 26970, 48659, 10180, 28759, 54841, 2720, +35852, 49839, 19583, 42338, 4010, 48876, 35246, 8379, 57689, 37701, 2473, +64726, 31353, 21077, 55128, 4227, 63152, 12992, 39662, 25324, 60786, 2754, +35184, 57154, 12035, 31457, 60206, 15001, 42089, 23904, 64794, 3034, 45081, + 9993, 34759, 62313, 4398, 44841, 18297, 35895, 60079, 2982, 29611, 63106, +16916, 43458, 6024, 29775, 53862, 15970, 42167, 24203, 55460, 7990, 30944, +48953, 16418, 42071, 23681, 57435, 13252, 43214, 20380, 34953, 53662, 10316, +44217, 24338, 63888, 12704, 30971, 49663, 6046, 61430, 25707, 45970, 14332, +39675, 25105, 62744, 6551, 39505, 14213, 50180, 21141, 54355, 8220, 33296, +42215, 4805, 64645, 12892, 45077, 29430, 16891, 55198, 36198, 1783, 64058, +18421, 47926, 29485, 12153, 50382, 18907, 28606, 56304, 5061, 41213, 23006, +58046, 30273, 12868, 44940, 20708, 52699, 33724, 3018, 56624, 10062, 31065, +46155, 329, 58499, 28233, 16536, 50830, 37284, 18756, 41867, 1343, 51977, +29897, 7643, 54020, 31913, 13868, 48002, 27384, 16931, 61321, 34581, 4217, +41922, 25554, 62802, 14896, 38722, 25245, 42965, 7948, 61281, 37142, 2519, +51051, 18314, 32634, 54100, 11083, 34232, 48486, 18387, 58677, 7814, 37796, +62600, 3864, 33545, 51095, 7286, 59635, 29543, 19939, 62761, 35684, 4116, +58212, 18403, 32819, 59614, 2366, 48240, 30018, 8497, 46836, 26508, 63130, +19592, 41511, 7430, 33510, 61021, 11073, 44275, 21250, 63327, 15195, 42308, +29241, 12784, 37997, 64657, 4230, 28163, 47382, 8559, 63187, 31129, 19665, +60322, 10875, 47815, 29705, 21002, 55057, 8693, 44582, 26065, 50352, 14313, +40045, 21724, 63248, 9953, 28870, 59520, 4380, 42480, 25617, 63905, 13128, +45501, 24289, 60974, 5166, 40424, 25444, 44392, 1881, 53606, 18852, 41463, +24624, 52255, 4145, 61065, 19898, 29652, 46682, 15608, 63443, 172, 29002, +52974, 16576, 41795, 22756, 56144, 7579, 36936, 60696, 16968, 41450, 529, +32067, 56135, 7013, 39594, 26611, 51717, 1941, 60492, 23259, 36065, 45204, + 3511, 51372, 17303, 40653, 24560, 58743, 7559, 50556, 29216, 17540, 56137, +32187, 1799, 36810, 46320, 16317, 55469, 3515, 41116, 25630, 59605, 5488, +40850, 26800, 62774, 2533, 40173, 23516, 47870, 7041, 35736, 60166, 3438, +46216, 34578, 16597, 53669, 20856, 47368, 13126, 52573, 24991, 42203, 880, +54116, 25694, 44433, 5144, 52552, 30800, 15274, 49678, 38453, 12915, 36596, +62125, 9597, 48084, 24461, 39602, 13051, 51277, 18835, 30832, 55872, 10819, +43343, 23928, 59864, 15127, 54834, 6591, 32197, 43924, 20835, 57505, 12712, +36013, 64076, 6846, 44508, 32660, 3328, 53323, 23058, 45869, 7174, 35450, +64239, 15684, 42394, 22964, 59448, 6692, 31543, 53836, 15862, 27871, 62646, +17929, 44337, 27179, 13492, 52429, 36588, 7533, 47339, 26323, 1123, 33396, +53138, 8013, 46750, 20231, 27965, 48720, 6789, 44209, 23301, 53651, 7654, +33327, 48745, 18943, 28578, 56972, 15771, 39996, 24576, 54331, 9574, 31750, +50209, 19288, 47416, 12439, 34188, 51737, 21245, 60674, 3134, 34215, 63901, + 9266, 40778, 23470, 58591, 11964, 33447, 65390, 3443, 29720, 51246, 7768, +61562, 27444, 4206, 59392, 33243, 18618, 41575, 1001, 56124, 16687, 38704, +20684, 50572, 4041, 56386, 35495, 10950, 48102, 20212, 57312, 34062, 3813, +44979, 25152, 59449, 15480, 47423, 28425, 18816, 53233, 36412, 3157, 62625, +23273, 47149, 11371, 32976, 42314, 7595, 58638, 34831, 2976, 60646, 38161, +13253, 31343, 64271, 15824, 46200, 4241, 37912, 58883, 7306, 27217, 61615, +18211, 37870, 49319, 15821, 54676, 23420, 40711, 12265, 64616, 33459, 6265, +48150, 26125, 60908, 11037, 35625, 46248, 19356, 65075, 3390, 37118, 56233, + 9062, 29976, 48645, 19398, 57966, 8679, 31801, 49590, 443, 59620, 19927, +48196, 29232, 13646, 44673, 25441, 59164, 5490, 39312, 26322, 64984, 2928, +43619, 20733, 34145, 53655, 14674, 27464, 56470, 11001, 41759, 22698, 53654, + 8149, 41095, 14719, 51786, 26245, 45327, 9910, 39967, 23540, 65119, 12573, +33846, 57100, 3818, 38890, 14190, 58241, 26301, 50661, 1794, 39895, 25875, +49930, 6651, 34710, 55235, 2787, 46277, 21779, 51801, 14085, 34522, 53893, +18396, 44263, 669, 40307, 25381, 51824, 5479, 36731, 59437, 15136, 33231, +64296, 5899, 41671, 23661, 54264, 2, 44299, 23474, 49629, 16521, 36179, +54232, 9154, 32409, 56088, 1347, 29421, 42973, 10900, 49985, 21590, 64802, +13122, 33962, 47758, 9284, 59183, 17246, 34689, 43652, 11430, 57279, 5353, +34776, 43043, 22958, 58719, 9502, 35887, 65000, 2944, 28415, 49841, 10370, +47797, 21376, 28517, 54209, 11842, 43177, 23927, 65465, 10409, 33506, 48091, +18895, 41845, 8727, 57054, 21580, 30179, 64902, 10813, 46976, 19383, 33879, +42519, 4627, 60080, 13639, 45132, 24635, 61709, 6545, 29085, 43412, 20065, +64711, 13905, 38764, 22897, 52471, 7557, 45116, 21842, 57036, 13572, 31712, +65531, 17603, 27721, 49604, 10586, 29244, 56944, 1669, 42794, 26795, 38649, + 5842, 61271, 19179, 29949, 58697, 13007, 34230, 62898, 18575, 37605, 57345, + 98, 27477, 51789, 19986, 42867, 4317, 53494, 18119, 33186, 64268, 906, +46332, 36563, 7091, 63020, 20915, 40083, 1851, 46747, 36331, 22457, 63570, + 9600, 35000, 48343, 2904, 28980, 42722, 11360, 56861, 20991, 39499, 12690, +61853, 31988, 18798, 51677, 4426, 30684, 55998, 11601, 39905, 26102, 61711, + 8844, 37478, 47401, 362, 32320, 59787, 6562, 46560, 29488, 16543, 56218, +23560, 44902, 21472, 40874, 16326, 65149, 30871, 10538, 58325, 36439, 17886, +63615, 3802, 39179, 26842, 61495, 12762, 37405, 51654, 6323, 31429, 60822, + 1475, 43307, 21978, 64283, 5617, 40496, 26313, 56547, 108, 39841, 11200, +46119, 24814, 49965, 14713, 27920, 53399, 1676, 45303, 21933, 54750, 10141, +43915, 35243, 18694, 48903, 37795, 14204, 45762, 22953, 50101, 8894, 57830, +34898, 25715, 47954, 9562, 64974, 26929, 42688, 15120, 30620, 60873, 139, +43801, 29218, 15910, 65510, 37474, 11984, 31719, 51577, 1137, 34826, 57528, + 8801, 41004, 25043, 49711, 6553, 30290, 59895, 21268, 52073, 15029, 40601, +24355, 53206, 10330, 44532, 25416, 54408, 8, 49264, 19449, 29119, 53848, +14031, 35682, 50022, 11957, 44110, 28205, 4773, 63003, 37214, 7606, 29745, +52685, 3471, 45094, 24693, 57016, 14129, 39733, 21751, 58982, 5230, 42498, +25358, 50288, 14852, 40078, 24145, 63624, 1751, 35298, 45271, 15743, 53418, +24643, 40598, 10612, 36208, 56792, 4517, 34528, 63804, 11834, 41194, 21370, +55929, 8826, 32018, 47068, 12657, 61184, 29973, 21, 47905, 38265, 17381, +30978, 63627, 2726, 34840, 46453, 17838, 61407, 32101, 1480, 50021, 20419, +55115, 6082, 41674, 25237, 53336, 16843, 43709, 24348, 54580, 5712, 42705, +17132, 34778, 65375, 11648, 29868, 59007, 16379, 40383, 25392, 62472, 9082, +39106, 26700, 60849, 7146, 29686, 59013, 15349, 33917, 56351, 9583, 46866, +22434, 40435, 2005, 52953, 28373, 16858, 57113, 32269, 12848, 60765, 37926, + 7552, 31734, 64684, 2925, 41309, 23150, 50433, 13943, 36622, 62287, 18002, +31302, 56562, 3886, 39654, 26251, 55517, 5783, 38986, 26689, 51117, 1122, +64060, 22578, 30994, 48358, 17382, 55290, 7935, 39913, 25904, 51185, 12546, +45159, 34575, 16131, 61992, 38348, 5141, 33903, 59490, 18598, 49746, 3242, +38676, 21019, 57716, 4940, 29831, 63174, 15657, 37968, 49870, 7138, 34835, +55351, 2456, 29993, 62900, 15874, 48273, 22621, 39730, 8886, 53997, 35249, +20830, 53140, 9318, 32753, 48693, 130, 57271, 31409, 16331, 61336, 37809, +10965, 35326, 54263, 723, 38378, 51754, 6320, 31529, 59091, 13836, 41524, +24002, 63655, 9630, 46220, 23400, 50993, 10669, 37381, 45052, 4367, 49446, +27094, 9530, 46781, 29789, 16024, 64540, 34536, 11015, 59438, 31189, 22464, +57031, 8655, 42294, 28458, 15124, 54271, 23397, 48567, 13352, 29207, 60771, +18086, 50351, 4356, 29045, 45374, 19217, 53748, 14240, 61471, 22115, 33644, +46673, 5802, 58518, 25258, 41552, 1048, 47547, 24397, 60631, 16992, 36391, +50328, 1660, 43311, 21476, 51235, 15108, 57218, 24317, 40740, 12095, 54473, +34378, 3728, 62910, 38180, 9046, 58773, 34822, 55359, 4578, 42750, 23032, +51575, 535, 41498, 24434, 49443, 14296, 56540, 20641, 40803, 918, 58646, +22136, 47364, 11953, 40998, 26060, 56265, 14061, 38926, 23859, 58835, 9935, +44518, 22276, 65099, 18295, 32757, 59145, 4639, 43130, 35593, 16844, 62715, +38080, 6598, 28209, 48402, 15787, 63207, 27124, 256, 58209, 28989, 7307, +64499, 31807, 17046, 40379, 5377, 60615, 19664, 38493, 2983, 49294, 22970, +57046, 6914, 41452, 24178, 54561, 9183, 45852, 21882, 52970, 7318, 42022, +24187, 62213, 14212, 43694, 21586, 60938, 12472, 34170, 57091, 18941, 44039, + 641, 31483, 65094, 5740, 48409, 19301, 33083, 62381, 8242, 40320, 21457, +33827, 60987, 5985, 42997, 24449, 64894, 1450, 32132, 59658, 10431, 48144, +19676, 31784, 58853, 13701, 42029, 21304, 61362, 8423, 32612, 54373, 2401, +46909, 33960, 18332, 53313, 11852, 33312, 57188, 7255, 43447, 20594, 54774, +27958, 12372, 59960, 37326, 5877, 64690, 22156, 48800, 15445, 27798, 52388, +19488, 45646, 1169, 51487, 24239, 42434, 15811, 57784, 24017, 39781, 9866, +50848, 23356, 58346, 5618, 37034, 49970, 15804, 28033, 55984, 5154, 39813, +23544, 57451, 12057, 38551, 27021, 61031, 15267, 48868, 268, 35622, 63948, +10013, 31679, 48617, 20416, 55810, 9316, 45096, 23107, 51743, 509, 32472, +57166, 12365, 44293, 21021, 56241, 1639, 33350, 50000, 19087, 45685, 4744, +40977, 24651, 65314, 13459, 31032, 60082, 19270, 44019, 11095, 48689, 37195, + 3609, 50658, 19498, 28113, 56476, 14601, 46450, 29287, 19663, 57526, 6744, +43876, 25174, 52093, 7958, 46837, 14309, 33059, 59920, 15968, 42429, 22093, +61659, 12397, 40113, 24003, 49371, 14664, 41002, 2765, 62674, 21997, 33452, +47701, 4352, 57735, 21226, 31359, 53568, 1454, 27316, 55829, 20285, 45746, + 8023, 41807, 25699, 60949, 14133, 44838, 25629, 53530, 11027, 34359, 48950, + 39, 27595, 59702, 17772, 43826, 25476, 50953, 8517, 34940, 56523, 753, +30340, 49168, 18084, 59432, 3159, 30898, 62591, 12534, 40495, 25157, 44394, + 8753, 51028, 28753, 3981, 56205, 20247, 28189, 47532, 15269, 27154, 62089, +19812, 46512, 35239, 4916, 54240, 17403, 34510, 57787, 2673, 31308, 64761, +16934, 28408, 56898, 14855, 33282, 60138, 3612, 50915, 24410, 41716, 5582, +55216, 21027, 46892, 2381, 36560, 48825, 17193, 61314, 35294, 3415, 59006, +38447, 7969, 35009, 45702, 11742, 55418, 20385, 33018, 58691, 7510, 39845, +24491, 44813, 1532, 55896, 18504, 31467, 51320, 14957, 35104, 65384, 9918, +43620, 32672, 5578, 58125, 27657, 13931, 63681, 33886, 4737, 45524, 30450, + 9823, 64391, 22208, 43422, 15750, 49406, 27986, 19538, 50760, 14205, 7259, +48660, 28523, 11439, 56369, 37173, 19208, 62268, 32329, 5886, 45709, 35300, +10517, 52251, 25233, 44829, 7952, 33016, 62920, 19170, 50617, 8411, 31210, +53199, 3639, 47845, 32664, 14773, 52097, 38072, 6459, 29169, 47806, 13447, +55323, 27064, 8467, 50758, 30896, 17751, 60283, 37339, 5272, 32499, 55753, +12509, 36094, 52800, 21237, 42482, 2602, 48631, 26499, 54018, 13074, 44389, +25167, 55685, 11380, 45816, 18488, 32363, 62570, 12419, 38905, 26070, 60167, + 2427, 34773, 56246, 17905, 47734, 4992, 39253, 26714, 52290, 2147, 46165, +28055, 10448, 50524, 35729, 17247, 53981, 37498, 11898, 29211, 57347, 2551, +42785, 23883, 55089, 11177, 47246, 17159, 30105, 57052, 9206, 40772, 22862, +51260, 15586, 39709, 26077, 55509, 1950, 42958, 24171, 53783, 10406, 39942, +23252, 49682, 16705, 29388, 64438, 6832, 40879, 23344, 62559, 93, 39377, +26506, 60456, 10903, 36173, 49359, 3608, 46270, 27277, 17341, 33039, 44122, + 2175, 58160, 32332, 8282, 60854, 38101, 17553, 30210, 63254, 6488, 35520, +52657, 3421, 45050, 22180, 64359, 13069, 29376, 45425, 20724, 61982, 8581, +33414, 48139, 19533, 64759, 10764, 44376, 26564, 52668, 4314, 43341, 21295, +30294, 58602, 11664, 45305, 22789, 40115, 2492, 60772, 26885, 38766, 4920, +61894, 17944, 43276, 23882, 48861, 5687, 35433, 51460, 15581, 42694, 24413, +63692, 8766, 31341, 54405, 20172, 47606, 2909, 35849, 52205, 7978, 39404, +25485, 57970, 7007, 29947, 62362, 22486, 42399, 5117, 52227, 34576, 9363, +61713, 38310, 12271, 31641, 60304, 2540, 39700, 19487, 63544, 24122, 43736, + 293, 52667, 10043, 31122, 48115, 3385, 57030, 29886, 7253, 54367, 36275, +20273, 50402, 12182, 28066, 60513, 18047, 39249, 10602, 64188, 18990, 37987, +48062, 9095, 30792, 63550, 15484, 37509, 50529, 1062, 31969, 56625, 7736, +39931, 22190, 61468, 16413, 46052, 37295, 13356, 53963, 4135, 39224, 21491, +60596, 14019, 42111, 24928, 65262, 7401, 44645, 23983, 41701, 14746, 49815, +23295, 58222, 6027, 34657, 63457, 18584, 46847, 33177, 12558, 38160, 63903, + 9055, 53430, 36341, 2807, 43483, 11085, 59974, 21628, 30530, 48550, 12185, +43195, 21130, 54849, 8713, 36200, 46921, 1310, 53229, 20213, 36473, 44054, +12350, 61103, 18013, 39340, 26351, 44633, 10373, 63313, 29101, 6181, 52464, +27249, 10622, 47251, 31305, 19765, 57206, 27488, 5116, 63949, 24660, 42932, + 191, 48783, 17479, 64826, 30801, 10945, 50313, 35144, 8400, 62834, 27529, + 3749, 48990, 28618, 13431, 53907, 22424, 46269, 17607, 37811, 55431, 7045, +28678, 48407, 18321, 58475, 36851, 2318, 51954, 31585, 7016, 60012, 37737, + 1481, 31238, 61771, 22453, 39990, 16065, 64040, 33766, 3486, 50301, 12289, +27680, 54055, 15633, 60042, 30319, 4107, 65516, 37171, 16537, 55496, 28153, + 2207, 36479, 44720, 17621, 63582, 12096, 39491, 25002, 61957, 2472, 27642, +57679, 17194, 34076, 61555, 1088, 37390, 46771, 19587, 56193, 2766, 43078, +22514, 52322, 14755, 46383, 23338, 40385, 9327, 62614, 18245, 32781, 59560, + 8595, 39476, 22491, 63407, 7189, 38788, 27026, 58797, 1762, 40371, 21442, +51708, 5325, 43111, 18433, 49084, 27832, 11411, 63714, 31214, 20178, 54650, + 8515, 32333, 64515, 16370, 36791, 58789, 3826, 27451, 62989, 7954, 45548, +22217, 51521, 16837, 32185, 60031, 6498, 38738, 26908, 63318, 2258, 48700, +18569, 37595, 54147, 3941, 31141, 57540, 6669, 46759, 18589, 33046, 64131, + 5782, 38931, 26807, 62365, 751, 33426, 58366, 12044, 43291, 26547, 56820, +10435, 31962, 50906, 18796, 44885, 4747, 51658, 20048, 28846, 57408, 13975, +38163, 61810, 9607, 47556, 23969, 41118, 14651, 49792, 28468, 5001, 54386, +36676, 14924, 49227, 27835, 12061, 60517, 31127, 8109, 37911, 47504, 2107, +56751, 13958, 39818, 25433, 54001, 749, 42819, 25338, 38856, 7048, 59460, +17750, 34263, 63370, 8966, 47389, 18604, 34256, 50968, 6538, 57700, 30524, +18807, 46794, 13761, 52325, 25302, 40671, 7887, 59676, 19363, 29135, 64833, +10608, 32761, 57993, 4422, 41931, 17531, 36814, 61183, 10266, 28993, 58727, +15847, 43147, 23742, 63048, 1112, 31956, 53709, 18474, 45982, 12342, 37529, +59762, 16904, 27355, 49355, 899, 43034, 22637, 54567, 15321, 45419, 26683, +53715, 5493, 34056, 57402, 17066, 40018, 25740, 63097, 13804, 35124, 45752, +19224, 65386, 15374, 32373, 59545, 6178, 46917, 35057, 725, 54356, 26266, +44036, 6482, 51690, 28141, 14513, 59155, 35087, 3958, 53150, 19345, 28689, +62201, 12782, 42296, 23848, 52455, 3679, 30327, 55055, 8903, 31898, 64510, +20131, 42826, 11427, 51987, 26459, 47129, 5861, 39140, 19739, 52765, 34579, +10548, 56790, 36437, 1560, 47215, 19816, 30137, 52009, 14508, 39780, 2198, +60086, 25701, 49409, 5731, 32665, 44802, 19302, 57995, 32462, 16812, 51035, +37828, 367, 62996, 28230, 6785, 50123, 33802, 22466, 58990, 14168, 41642, +24352, 62465, 6540, 30354, 50266, 1992, 35211, 52989, 7484, 58021, 31838, +16644, 54730, 38076, 13540, 32917, 65034, 18405, 51751, 1338, 38137, 49582, +15562, 33777, 52889, 10404, 38989, 23201, 56396, 4922, 41392, 25702, 60235, +13157, 45792, 19416, 37975, 57598, 16568, 36770, 59553, 7634, 30387, 63118, + 2576, 42513, 23078, 51844, 14617, 35429, 53977, 8315, 27233, 61084, 20258, +41454, 14792, 46123, 24176, 53675, 11799, 44714, 2629, 32010, 52425, 8872, +46594, 29291, 20082, 57931, 38175, 2003, 47761, 22292, 42862, 13844, 48563, +27416, 5259, 52695, 38315, 19732, 59950, 6650, 49381, 20911, 34724, 56922, + 8799, 46826, 20450, 35271, 52846, 7682, 43778, 22446, 51339, 14980, 29120, +64824, 9872, 40521, 26278, 59310, 7096, 29986, 61836, 2162, 44098, 25137, +51059, 4658, 47097, 20862, 29386, 56875, 702, 42131, 23967, 52069, 14054, +43528, 25518, 64325, 8288, 34764, 54973, 23134, 61688, 8914, 37246, 51411, + 3441, 35668, 44819, 15018, 56864, 23653, 40915, 5981, 48888, 20453, 37858, +55396, 14475, 41547, 24845, 60845, 4739, 40864, 13449, 45388, 23634, 55728, + 9561, 41670, 22084, 34258, 52435, 12190, 27841, 63638, 15010, 43904, 24792, +60632, 9855, 40783, 22581, 51868, 14916, 44546, 19918, 55656, 7796, 41692, +24363, 53531, 3062, 38741, 20917, 47904, 6158, 61488, 29771, 16460, 37703, +63969, 8512, 33214, 52863, 1011, 28241, 50623, 19122, 58944, 3866, 33740, +65170, 11500, 44459, 21831, 61389, 2423, 32395, 57025, 19582, 42796, 15521, +58796, 33056, 17966, 52180, 24469, 42919, 5995, 60721, 18998, 35159, 57085, +13414, 46735, 22904, 50814, 1892, 41270, 21890, 55476, 31857, 2991, 62431, +23956, 42015, 15244, 53627, 36274, 7526, 64283, 33314, 3369, 54543, 35911, +14255, 48233, 38397, 2305, 53572, 27890, 13348, 47134, 23530, 52842, 216, +39930, 25666, 50715, 6093, 30515, 55846, 12180, 41505, 21928, 50937, 9040, +36431, 64876, 2140, 31622, 43776, 10134, 57924, 30403, 17683, 62540, 38006, + 6157, 33076, 65153, 11388, 38967, 21750, 49894, 12477, 30476, 59452, 6707, +47106, 23021, 55038, 8372, 28570, 43265, 2076, 52240, 21710, 28969, 42518, +11146, 62342, 23789, 48390, 13748, 32631, 61426, 2343, 41996, 23454, 54845, +11982, 36589, 49097, 5657, 46001, 25221, 57958, 10321, 36052, 63774, 14372, +43206, 24542, 50187, 5462, 40193, 24515, 57151, 1270, 36252, 62707, 15050, +31748, 58665, 3604, 45458, 27184, 16387, 63805, 29098, 9718, 54364, 38225, + 4798, 59178, 23741, 45069, 9417, 41098, 17747, 57399, 28670, 13166, 52321, + 4629, 27975, 64461, 8260, 45942, 27170, 15270, 56642, 38440, 18922, 61673, + 4580, 44062, 32181, 8063, 51915, 37761, 16664, 46301, 22364, 65338, 13604, +28873, 42558, 20727, 49484, 504, 43523, 25133, 58506, 4553, 44632, 36157, + 9640, 59483, 30316, 21609, 61805, 6933, 41611, 26576, 62938, 13778, 35584, +46514, 18827, 54558, 2073, 39203, 26759, 55347, 6221, 30653, 51869, 418, +40177, 21525, 50673, 15893, 36357, 56872, 10974, 33000, 64892, 757, 44752, +17095, 37429, 47813, 10760, 56825, 32826, 4903, 65028, 18552, 36032, 58963, +23761, 56142, 14786, 40833, 21656, 59728, 6334, 44024, 31172, 17402, 62747, +34752, 7203, 57256, 20503, 34165, 61845, 9893, 28888, 48385, 14485, 41885, +25761, 54776, 731, 30188, 44336, 16627, 60161, 5258, 40331, 25462, 63762, +11562, 32439, 57329, 4401, 44870, 33467, 18132, 49122, 12758, 54530, 36706, +16520, 33164, 55210, 10915, 35478, 60480, 16044, 43202, 11676, 49914, 35663, +17765, 61442, 5083, 36903, 53763, 10519, 29453, 49657, 17462, 42214, 944, +30980, 46965, 16970, 57439, 28903, 13027, 61154, 37185, 289, 29724, 51263, +17343, 62107, 28383, 10113, 47943, 29956, 1414, 52697, 36900, 17647, 49267, +26627, 65294, 903, 34538, 46588, 16081, 61552, 4620, 31205, 58352, 7858, +42142, 34210, 484, 50182, 19373, 36262, 56085, 3154, 30523, 59425, 8605, +47688, 25179, 38656, 13038, 50001, 19684, 63480, 11298, 44237, 24245, 54605, +13590, 34030, 56567, 2584, 46796, 22258, 42095, 15880, 62661, 36695, 7769, +42623, 24976, 53820, 15604, 40365, 24385, 56027, 9052, 39095, 26866, 51886, + 7365, 46879, 36099, 916, 49099, 27423, 6969, 65308, 34783, 14947, 48746, +27910, 9081, 49574, 29321, 3925, 63870, 32663, 15413, 58127, 28866, 7344, +44074, 14754, 53042, 37378, 11239, 28691, 59795, 1264, 44531, 27933, 13026, +50117, 29931, 17101, 56811, 27214, 9002, 62230, 32108, 18012, 37889, 59492, + 7317, 34078, 62791, 19412, 48671, 11745, 33469, 64424, 17528, 45127, 32967, + 4950, 61579, 29049, 17496, 49216, 27603, 14880, 55227, 24053, 47769, 4719, +37321, 53240, 10643, 27303, 51692, 20397, 42313, 1746, 58236, 25029, 44514, + 3680, 54297, 18940, 43103, 32093, 1252, 37453, 61013, 11775, 33264, 58445, +17334, 45241, 9265, 53760, 35821, 18493, 41050, 4691, 55096, 36992, 16562, +29637, 58076, 8476, 44869, 27774, 16254, 64435, 31365, 20593, 40967, 2515, +51807, 19114, 32366, 41276, 1752, 58612, 17263, 36428, 61186, 8100, 28826, +53236, 20742, 43665, 8984, 28137, 47565, 19080, 55531, 32772, 6816, 46463, +37346, 17155, 61943, 27609, 11609, 50189, 32421, 15539, 64650, 24667, 48221, + 991, 36858, 61193, 22369, 42389, 14273, 49269, 36209, 18426, 53860, 38151, + 3335, 33152, 52597, 10498, 29698, 48171, 17697, 64019, 27490, 3028, 57762, +34156, 8673, 54915, 38008, 4083, 59860, 15466, 33260, 62000, 11656, 40634, +21788, 50747, 16269, 28269, 54132, 13997, 45348, 4196, 35829, 47584, 18993, +53998, 2973, 32094, 59185, 7974, 29337, 48549, 21318, 62346, 11432, 41714, +22265, 64536, 14579, 43348, 25536, 46562, 8925, 61424, 29014, 4159, 49297, +27108, 13281, 56277, 30651, 21560, 62208, 3256, 28527, 42507, 13310, 50576, +24864, 41285, 7636, 46876, 51244, 10694, 28108, 61951, 952, 36082, 49572, +14424, 27103, 52862, 10171, 46780, 23723, 40693, 237, 51053, 17847, 36119, +58989, 3221, 32286, 62556, 9434, 39831, 23907, 64981, 12620, 37412, 49279, +18646, 31650, 54109, 1845, 46364, 20934, 41203, 13795, 50454, 24016, 58086, + 619, 39866, 22144, 46812, 5516, 64269, 20336, 29299, 49289, 1408, 39921, +24760, 65270, 6438, 30953, 55419, 12440, 47107, 30946, 19861, 57604, 3747, +33995, 59961, 13009, 45203, 25299, 64911, 5807, 40716, 23055, 49828, 10357, +46015, 22102, 59602, 7757, 42342, 32814, 3090, 57897, 35479, 19328, 63515, +12639, 31415, 57002, 7534, 39965, 21134, 51979, 10944, 56720, 28127, 19184, +50686, 35837, 13523, 47213, 22005, 54541, 16567, 29142, 62126, 9295, 41467, +24443, 50861, 14236, 36086, 65190, 2110, 43562, 26390, 59922, 5545, 38513, +27010, 57888, 1262, 39703, 26328, 51937, 12193, 39170, 25551, 58783, 5125, +48461, 29614, 12722, 54976, 21499, 46986, 6148, 36943, 59909, 312, 30702, +48833, 18950, 43244, 10978, 64101, 20235, 28875, 59816, 11486, 37516, 55000, +20084, 43960, 2974, 62235, 32748, 17049, 59161, 37106, 12651, 52866, 23740, +46071, 9661, 35457, 61547, 19148, 48085, 27394, 4669, 64929, 38355, 15935, +47238, 19444, 58459, 34670, 10139, 61652, 36711, 836, 47264, 38213, 20420, +50938, 4846, 44527, 24615, 55856, 14385, 29622, 43871, 4132, 55059, 22894, +40396, 2406, 59232, 21147, 48156, 13577, 36998, 57343, 3293, 33854, 60915, + 8206, 41243, 22071, 63855, 16008, 32183, 45657, 3025, 57148, 30829, 14872, +50386, 36352, 8230, 61416, 26945, 38598, 10477, 64485, 21728, 50469, 14127, +44240, 24544, 51434, 5646, 39276, 23884, 63779, 3155, 30504, 58977, 14899, +44988, 22928, 65080, 9565, 50925, 20202, 34197, 49611, 361, 56032, 37395, + 7393, 59564, 14929, 44189, 25854, 60448, 9200, 49394, 21954, 29346, 54653, +11772, 47644, 19230, 34195, 46333, 4866, 59246, 16722, 33472, 64333, 2065, +39666, 15649, 61053, 22302, 52365, 501, 34024, 47686, 19589, 57834, 3774, +37148, 46044, 7913, 30575, 55066, 19791, 44500, 9964, 34379, 59205, 2069, +28971, 62387, 7492, 30243, 55558, 13632, 40865, 25239, 59457, 674, 34307, +53899, 11361, 44730, 31100, 15899, 48347, 28094, 19593, 52448, 25747, 46103, + 7223, 39232, 24140, 56618, 8197, 34439, 64332, 2678, 40931, 25480, 60624, +16919, 29341, 57692, 10092, 39956, 26028, 52082, 12739, 34663, 43145, 15830, +52713, 5224, 38600, 26222, 56566, 9761, 49608, 33819, 4545, 59942, 35650, +16422, 38476, 54576, 17959, 37936, 47174, 5487, 36371, 51075, 10160, 33849, +55004, 18206, 59594, 34, 34055, 61517, 17308, 30602, 4692, 34834, 45136, +17060, 54249, 30088, 8628, 64638, 37580, 3720, 58751, 31964, 13469, 63735, +26760, 43345, 11467, 53532, 24592, 44233, 13676, 47448, 20545, 56593, 7167, +33519, 50962, 3868, 28818, 59551, 8614, 41230, 23693, 62353, 7399, 38703, +22852, 60427, 9332, 38597, 26964, 62870, 11801, 52047, 25604, 39655, 9610, +57662, 19096, 32115, 59032, 9171, 34841, 51724, 18784, 44103, 27983, 1990, +63933, 37953, 15693, 51391, 22411, 39702, 6514, 56374, 20012, 38709, 14849, +54031, 34624, 4221, 63215, 28150, 16121, 34805, 54374, 12935, 46788, 25870, +51943, 6898, 42093, 25723, 50329, 3983, 44593, 23122, 58962, 14933, 31974, +44572, 6638, 37756, 60303, 1679, 40777, 25064, 64398, 3644, 36732, 57355, + 6291, 44897, 35011, 18200, 57999, 7149, 45986, 28897, 17059, 34217, 54762, + 8931, 48350, 21795, 41215, 15123, 46138, 22858, 60737, 7412, 42924, 21530, +65502, 8235, 45705, 32521, 14560, 56421, 37757, 2017, 64331, 30440, 13627, +51757, 27313, 16963, 62873, 36337, 5223, 56628, 25985, 41001, 3571, 54093, +33999, 17653, 50688, 4605, 30936, 56634, 12324, 39414, 23685, 51808, 1552, +45432, 26059, 39587, 5508, 56486, 20910, 40546, 541, 54978, 30092, 10312, +51524, 33348, 21438, 56614, 8470, 31640, 50771, 3674, 42633, 23754, 53335, +14749, 27945, 60052, 6824, 30298, 63512, 17238, 41248, 1345, 51333, 35476, + 9639, 58315, 28112, 13839, 51128, 35209, 11264, 53226, 25776, 41181, 7764, +44429, 24636, 51614, 16563, 37022, 54379, 379, 28899, 49774, 12070, 60151, +24559, 40534, 9014, 63333, 29312, 18204, 47433, 13150, 53105, 20662, 41523, + 5917, 56433, 25520, 39225, 4037, 62813, 20544, 34459, 57549, 13305, 41349, +25739, 50312, 8129, 33142, 55886, 1586, 38968, 26636, 44270, 5432, 62629, +17599, 28895, 43189, 11453, 51093, 22040, 32807, 53776, 6249, 34951, 45781, +18385, 63029, 6771, 35786, 44135, 2959, 65135, 27114, 12945, 49691, 37694, +21923, 53501, 11029, 41975, 26620, 50813, 5458, 42390, 30585, 18678, 56307, + 7301, 43469, 21546, 29633, 62141, 13614, 50888, 17224, 35197, 63182, 4115, +29608, 54519, 12257, 46697, 23821, 41650, 16349, 48021, 21761, 64899, 6073, +45051, 20110, 50700, 14706, 39514, 24322, 60072, 6729, 36581, 62726, 1128, +43067, 11132, 58838, 18150, 31665, 63532, 1795, 51483, 29553, 15106, 46586, +23636, 55935, 8761, 34939, 51307, 643, 42922, 24105, 61240, 5607, 45000, +20394, 65197, 1163, 46809, 26961, 60743, 17973, 42517, 2818, 47456, 29446, +19790, 53172, 12301, 27533, 57310, 1823, 32443, 62529, 8102, 28809, 49834, +15397, 63608, 25955, 44115, 6204, 48832, 29933, 20523, 46469, 10032, 38266, +57291, 48669, 22182, 63100, 6569, 38985, 23023, 51207, 18891, 45789, 27875, +16365, 52032, 36583, 8115, 55289, 20249, 39013, 6098, 57854, 22406, 38546, + 1651, 53049, 26881, 42515, 15883, 58045, 24791, 47690, 11323, 34067, 54840, +15336, 42104, 25719, 55483, 3102, 42565, 24858, 53793, 6170, 48307, 21111, +38539, 2874, 55639, 27012, 43436, 4861, 53819, 17411, 45955, 27283, 3327, +60777, 36612, 14466, 56198, 24134, 46061, 7942, 32756, 62344, 14192, 50502, +26665, 42950, 2534, 60828, 30642, 19446, 50592, 9802, 37710, 56696, 1901, +40316, 23405, 64809, 11103, 38571, 22618, 59196, 14643, 36430, 61747, 12172, +33751, 43227, 2703, 64226, 24374, 49564, 12332, 28750, 45859, 17841, 53504, +10784, 42906, 30239, 15500, 49506, 22884, 63136, 1189, 32066, 52276, 20335, +61068, 4938, 41557, 22872, 58589, 13730, 33533, 64047, 4156, 51066, 30376, +10778, 55504, 36144, 3279, 53844, 28035, 17940, 60279, 38353, 9301, 27196, +50988, 17394, 35822, 44017, 7470, 58052, 34293, 12221, 50526, 23479, 44210, +14158, 61702, 21357, 39291, 10046, 47404, 26550, 63562, 14147, 42430, 25543, +53713, 7279, 40971, 21338, 63078, 8335, 54091, 34645, 13596, 64569, 24888, +46935, 11924, 37749, 62231, 17654, 42433, 2160, 48762, 26094, 61149, 13582, +38700, 21817, 64130, 5603, 37442, 49804, 16170, 34941, 54984, 10722, 47990, +21545, 28514, 65203, 15576, 45406, 20744, 37075, 60975, 5808, 41888, 24206, +62453, 735, 34142, 49508, 19370, 63635, 5366, 32063, 46309, 11061, 58986, +20636, 35070, 44446, 6983, 54950, 19929, 33966, 43768, 4552, 56355, 25919, +39353, 593, 58950, 27022, 47913, 15037, 34339, 53604, 18344, 44955, 10806, +28462, 47355, 96, 54162, 18908, 29532, 61170, 12361, 43057, 24139, 48820, +13441, 58676, 20773, 35324, 47224, 6608, 60823, 24567, 40288, 3469, 64854, +17842, 29020, 56807, 853, 39784, 25710, 51639, 15240, 28435, 55247, 16782, +33284, 57705, 290, 30795, 61862, 7022, 44089, 20508, 56031, 13897, 33215, +60442, 12418, 44552, 25912, 65378, 10277, 35804, 53957, 1870, 42170, 23708, +56743, 6435, 40890, 22708, 50080, 16474, 37399, 58182, 8000, 32258, 60231, + 1395, 39489, 26456, 51765, 11117, 38582, 26975, 63437, 5235, 46523, 19241, +53576, 29230, 14705, 51188, 37382, 22523, 49624, 4804, 41178, 21396, 48179, +12671, 43096, 36664, 5445, 50109, 19323, 30186, 62599, 13089, 47064, 20730, +38609, 11289, 55163, 26994, 38606, 13613, 54221, 21900, 38509, 6463, 50716, +24541, 58992, 15151, 37928, 63798, 7895, 36831, 44866, 20948, 51121, 13783, +40957, 25566, 58422, 19685, 42926, 1393, 38913, 21224, 60714, 14253, 35477, +52035, 3884, 64161, 28253, 16497, 1798, 42285, 14020, 55626, 26615, 41563, + 2586, 60827, 10805, 34000, 56808, 1416, 42068, 25814, 47950, 4013, 61278, +26985, 41773, 8999, 64202, 26133, 41342, 10874, 60711, 31469, 2628, 44920, +19400, 64588, 27866, 313, 36717, 60868, 12647, 46681, 32237, 10713, 65350, +17407, 31143, 44368, 13002, 61207, 26520, 41333, 10449, 63723, 21436, 34077, +49641, 12929, 37719, 55127, 10407, 29584, 50115, 4573, 41617, 20192, 58593, +28285, 441, 46520, 35318, 11144, 58103, 24558, 47378, 8444, 41943, 25297, +58570, 14068, 45508, 20850, 32079, 52827, 5152, 44277, 20264, 54625, 549, +45751, 30519, 6317, 51013, 27734, 18876, 53191, 35690, 9778, 56080, 20882, +36694, 62266, 5770, 32291, 58772, 20134, 48098, 8680, 32827, 53449, 13864, +43615, 27270, 10858, 47942, 37460, 15346, 31458, 52798, 270, 47209, 28506, + 9370, 42251, 19956, 62136, 37863, 16088, 28791, 47674, 9736, 34744, 50350, + 570, 44994, 20466, 61924, 33811, 4190, 59191, 19843, 47833, 28793, 2783, +55666, 38204, 8407, 32874, 52297, 1407, 45758, 24161, 58453, 5853, 43495, +22854, 38526, 198, 60280, 16651, 33856, 57533, 11096, 31550, 47549, 17534, +27991, 51295, 3473, 43354, 19711, 57377, 27726, 5364, 36323, 54246, 20795, +39821, 6661, 43905, 24060, 57373, 10719, 47762, 18945, 30996, 58900, 1956, +45328, 23184, 41899, 3885, 58590, 38164, 7549, 32146, 54590, 2975, 47502, +18139, 29046, 56305, 9229, 46230, 16957, 29564, 57633, 10215, 40021, 23200, +55740, 15440, 29994, 42920, 3979, 65512, 17458, 32718, 46197, 1457, 61150, +16817, 50866, 35501, 9954, 64083, 23396, 42618, 7427, 37032, 59957, 2383, +30464, 61934, 7722, 50007, 36549, 19916, 64644, 15341, 36387, 49470, 3823, +40958, 20942, 63183, 6940, 32784, 50296, 2722, 41263, 22693, 54220, 13322, +30531, 57685, 15723, 35732, 48785, 11860, 42844, 23120, 61647, 9932, 31716, +58413, 4194, 36995, 50489, 8339, 45655, 23235, 51154, 15186, 39234, 25401, +59574, 2487, 36929, 50190, 8054, 27954, 55376, 3103, 40138, 22498, 49541, +14812, 31416, 59982, 12554, 38817, 26559, 53209, 10469, 33688, 65108, 3078, +27538, 49486, 14926, 42981, 23140, 56765, 13334, 32965, 60979, 2432, 42754, +22295, 54549, 12944, 31796, 42504, 3430, 58156, 27134, 8809, 64587, 30386, +19041, 55368, 34850, 6900, 59331, 24832, 53067, 17116, 32646, 58229, 3479, +41377, 24604, 52316, 6217, 64124, 23031, 42207, 2437, 59395, 25086, 41480, + 9330, 63232, 27043, 40479, 10377, 34347, 54170, 855, 28029, 48341, 18503, +58109, 3650, 31602, 64713, 10423, 48764, 4790, 33946, 52684, 11505, 57321, +24908, 41944, 8237, 54681, 22278, 44768, 12965, 35328, 58571, 51689, 17532, +31152, 48079, 8386, 58178, 21116, 31336, 50215, 15372, 43666, 23449, 65237, +12024, 38697, 21889, 50016, 15411, 33839, 55557, 19361, 49260, 4989, 39039, +23292, 53845, 14998, 36321, 50659, 6549, 32484, 53404, 16936, 48464, 28803, + 5039, 56094, 21760, 35421, 51494, 1241, 58668, 23746, 39000, 5738, 56798, +16737, 36955, 51560, 40, 28632, 61474, 6938, 41720, 22771, 63243, 17244, +37494, 54401, 9163, 34241, 48278, 17333, 65183, 23221, 41032, 4913, 52514, +18556, 35678, 63807, 1200, 31437, 49042, 7118, 62737, 15011, 42625, 24778, +60343, 9410, 39544, 23330, 63869, 16943, 37570, 55268, 15295, 42378, 5127, +62815, 25835, 40270, 194, 48051, 15712, 52262, 24783, 40400, 2464, 65444, +25880, 39401, 4722, 60488, 19578, 36516, 55395, 2854, 64779, 24677, 39323, +11699, 61597, 19192, 36655, 55030, 14696, 48583, 27344, 1713, 57267, 38449, +12788, 63114, 27118, 17272, 57590, 36383, 6610, 28369, 52135, 16006, 46088, +36477, 11125, 63673, 21807, 42615, 15312, 59639, 27955, 17899, 64729, 38248, +12551, 32729, 50327, 18453, 61497, 9195, 48348, 26937, 44738, 5191, 50852, +22931, 41698, 2023, 61137, 36817, 15796, 59585, 38270, 8527, 32348, 49722, +16634, 59053, 9471, 30851, 65471, 15113, 52721, 35016, 115, 45343, 26391, +56136, 7781, 40245, 25153, 62060, 12877, 33852, 52540, 17639, 27135, 56537, +14847, 42908, 24650, 61937, 8163, 34856, 50094, 20303, 32236, 64978, 4839, +42479, 26100, 52838, 1945, 34206, 61661, 8533, 50508, 21379, 38238, 54042, +11629, 28184, 57534, 22262, 40126, 6340, 31463, 46259, 18728, 51697, 11474, +57150, 20158, 28830, 48510, 12978, 41379, 23912, 56637, 3450, 32009, 43786, + 8447, 59710, 18005, 32015, 56596, 10196, 39150, 26845, 57808, 14445, 29892, +64090, 11126, 33579, 48815, 1358, 43454, 24033, 55762, 4700, 31400, 52546, + 7773, 37048, 49210, 20046, 43251, 11161, 63306, 22137, 40705, 12424, 30071, +64125, 4674, 33842, 52888, 12114, 45359, 29656, 14721, 63549, 37913, 16454, +32359, 52933, 6749, 61614, 24986, 39796, 4461, 48934, 19631, 58486, 200, +45142, 28763, 15842, 55649, 38054, 21047, 61733, 4761, 36281, 52381, 8750, +46427, 20568, 29455, 58477, 9239, 40806, 24912, 62340, 10631, 45934, 35196, +17623, 54223, 37906, 2210, 44207, 13821, 61628, 22793, 45234, 315, 35865, +65503, 11149, 44259, 27409, 15932, 56564, 36639, 12413, 32608, 46623, 14799, +50374, 33656, 7180, 53108, 20097, 45315, 3268, 56109, 20980, 46621, 14194, +31943, 61655, 6674, 40889, 24949, 52474, 15609, 43164, 23629, 39375, 14708, +61895, 19145, 31379, 45969, 3086, 65447, 37294, 15256, 31775, 56533, 7402, +40413, 23427, 33584, 63830, 5129, 45498, 23861, 39992, 13477, 62558, 5799, +34902, 57706, 9333, 40145, 26625, 54728, 6701, 30755, 59642, 792, 44530, +12717, 32406, 61609, 20940, 43471, 8305, 63488, 24507, 40762, 12296, 57176, +22673, 43794, 9503, 36049, 63266, 16260, 45396, 8951, 39698, 25992, 47136, +11423, 53592, 18877, 30736, 48589, 8541, 32936, 57791, 20931, 46728, 15854, +35721, 51344, 1561, 45565, 28728, 13011, 61773, 27122, 3149, 54881, 37762, + 9990, 30758, 60074, 15888, 44664, 27968, 11835, 53029, 36603, 16770, 40900, +26791, 55758, 2238, 36885, 48585, 16471, 32290, 53809, 8051, 46471, 29315, + 1807, 60528, 21121, 34143, 46023, 8802, 58480, 20228, 33311, 43481, 8011, +57770, 18797, 30869, 46098, 11703, 56699, 17880, 34233, 48581, 10143, 30349, +50961, 20820, 42127, 6803, 56395, 26010, 44891, 3544, 31507, 60054, 7056, +35669, 52562, 18208, 31319, 48419, 4879, 37186, 49654, 11768, 41519, 25038, +65005, 8806, 32005, 56169, 1144, 41497, 26053, 49931, 6380, 32121, 53545, + 4058, 34973, 48130, 7875, 27810, 57513, 2324, 40332, 23798, 54462, 11795, +38779, 20309, 65051, 15169, 30094, 53370, 12055, 44858, 27222, 4889, 48859, +29258, 21046, 62746, 1185, 42664, 34519, 24364, 45331, 4039, 49295, 17501, +29665, 62617, 12200, 39270, 17386, 51611, 21075, 43670, 5102, 49338, 29401, + 8303, 63094, 38457, 436, 29969, 51805, 10676, 40116, 23096, 58935, 1610, +43197, 14541, 53670, 35058, 18733, 59811, 12125, 47336, 20030, 43817, 27745, +14796, 58640, 30618, 7613, 36465, 48572, 3426, 43242, 14413, 62229, 25614, +54582, 2026, 38778, 26875, 44865, 4770, 65105, 16642, 32734, 55296, 9453, +42686, 22310, 58690, 14006, 50646, 24284, 39927, 5987, 52566, 22165, 47557, + 693, 31593, 51901, 18881, 44525, 5122, 56894, 19639, 28714, 62300, 10380, +39520, 21394, 63590, 12883, 28313, 59370, 1644, 34732, 52864, 17442, 30765, +47290, 2653, 54535, 24254, 44900, 16241, 40086, 21392, 61257, 6193, 48858, +23101, 42226, 793, 58596, 25427, 47298, 11166, 35043, 45884, 16777, 64300, + 9549, 43726, 34383, 20857, 61125, 11182, 47155, 30880, 7347, 50809, 12770, +44910, 29089, 18399, 63700, 35377, 3881, 55768, 17646, 48014, 36004, 24, +52801, 32957, 20400, 60671, 7050, 28730, 48286, 12037, 57545, 26118, 39169, + 9130, 52529, 28386, 14831, 49343, 31419, 7881, 60493, 38165, 1427, 48376, +22114, 57892, 4831, 29506, 61971, 16692, 40341, 25915, 60049, 11222, 38663, +26837, 64015, 4972, 36149, 50533, 16757, 44049, 21544, 59308, 8677, 33720, +60533, 291, 44742, 24819, 54741, 6524, 41574, 22704, 51288, 17435, 27636, +59108, 827, 42627, 26212, 60302, 11458, 50281, 28374, 18637, 56930, 36166, + 439, 52739, 25661, 47521, 18353, 29186, 53498, 2879, 42998, 20797, 63028, +11031, 36512, 51912, 18251, 29083, 47377, 3463, 56347, 16975, 34502, 46849, + 1377, 59175, 21163, 38596, 4143, 61463, 24657, 49509, 2188, 30462, 52832, +20176, 59969, 4357, 32061, 64349, 22620, 42383, 2491, 62214, 25192, 45061, +14014, 38993, 4339, 64749, 30635, 11416, 59146, 33077, 20608, 52614, 6376, +36552, 49561, 16696, 45416, 22274, 56250, 7502, 34008, 49903, 3339, 61273, +24258, 45238, 4694, 59343, 18769, 30483, 50060, 13426, 28441, 62411, 3755, +42260, 24343, 58302, 13587, 35899, 49165, 11718, 27453, 55818, 16973, 30108, +49360, 4261, 61259, 27917, 14393, 51286, 36843, 6827, 54225, 26487, 43155, + 683, 62941, 24729, 46306, 5170, 59761, 17690, 34175, 50139, 12609, 63269, +22700, 40566, 13488, 46477, 21925, 64590, 8058, 43955, 23992, 59044, 15403, +29534, 60501, 2354, 44191, 20871, 53976, 14876, 40100, 23483, 57205, 16601, +34111, 62479, 10726, 44553, 23264, 60590, 13086, 37791, 49868, 17550, 31612, +62719, 6753, 43819, 26087, 59544, 3042, 34335, 46536, 7508, 58439, 32885, +18868, 64009, 34416, 9813, 56770, 36542, 12669, 53250, 19002, 48215, 11159, +60719, 19900, 32971, 56849, 7162, 43378, 25911, 58246, 3043, 32869, 64686, +14501, 36578, 59769, 19124, 46060, 11707, 35398, 57411, 18724, 33069, 64068, + 6025, 48960, 30498, 19024, 55790, 37454, 8568, 28538, 50365, 3687, 39734, +24613, 64314, 6276, 35833, 52197, 1005, 46900, 23832, 63171, 12504, 55565, +21261, 29610, 47206, 8505, 41658, 23607, 60841, 13363, 52931, 21398, 29773, +49750, 932, 40187, 25576, 62595, 5522, 38682, 26951, 46731, 1701, 61762, +26136, 43322, 11330, 65249, 25679, 40703, 8030, 60678, 34827, 16494, 37672, +50638, 6833, 42042, 24996, 53235, 3285, 33449, 48444, 18921, 42486, 14402, +56261, 27724, 6420, 62101, 36286, 19746, 59836, 9591, 31782, 57041, 1311, +46951, 28609, 11460, 56498, 36587, 17677, 51959, 9290, 40524, 19829, 59494, +28454, 1604, 51942, 32625, 22952, 56563, 5232, 40420, 25929, 54134, 2574, +37258, 64097, 19793, 33958, 57600, 847, 41614, 14193, 50132, 25428, 45190, + 8275, 30521, 65243, 16154, 27544, 50120, 4429, 36308, 46856, 14146, 62863, +23289, 41589, 5559, 53868, 33255, 17794, 63337, 37393, 5034, 55120, 21664, +45903, 16845, 29010, 63125, 10285, 41253, 25489, 48919, 9101, 31656, 55362, + 75, 42611, 22624, 52178, 13243, 43342, 23348, 54690, 9631, 30171, 55876, + 2688, 39646, 26159, 50247, 12438, 30033, 56947, 9560, 47195, 26761, 38696, +12432, 62299, 5333, 36610, 48679, 13938, 53830, 20664, 38781, 2978, 14907, +55256, 38141, 8948, 30487, 64866, 17221, 41465, 4527, 35648, 62043, 12681, +49223, 32465, 14905, 46168, 26160, 54142, 5511, 34625, 64484, 13621, 39794, +26085, 52218, 6916, 29158, 54687, 13379, 45216, 26767, 52071, 11185, 42637, +34720, 17559, 57980, 7529, 42208, 26540, 50580, 15806, 40492, 9483, 56154, +31856, 19573, 52285, 7440, 60421, 26656, 43668, 18786, 53410, 27485, 5671, +47447, 38071, 15377, 57794, 29372, 8876, 62916, 35291, 858, 41591, 26197, +64549, 14533, 30541, 40996, 12831, 54850, 21836, 38729, 10793, 65402, 34640, + 5694, 56284, 20059, 30113, 51625, 11013, 41387, 22365, 65042, 6805, 38127, +52608, 2948, 35256, 64036, 12983, 42621, 21529, 35103, 47617, 2038, 63709, +23633, 40068, 13693, 58247, 22445, 39787, 9403, 33012, 54024, 14982, 44287, +27552, 1907, 47583, 35366, 6297, 55988, 26528, 50447, 915, 30201, 40630, +16927, 53732, 3705, 34580, 51541, 10983, 39383, 26418, 50540, 4995, 31158, +61140, 10260, 43964, 3258, 28172, 51204, 19832, 40321, 502, 53101, 30329, +15939, 55801, 4935, 46377, 19442, 34367, 52367, 13578, 41772, 21781, 55142, +16804, 28086, 49337, 679, 42733, 14668, 52590, 25232, 46915, 3234, 40571, +26360, 63611, 5830, 38873, 26816, 52364, 2466, 39667, 23664, 54513, 10079, +38719, 21757, 52391, 9190, 30535, 47892, 1462, 27989, 54115, 21689, 42289, + 4623, 52976, 13667, 45502, 26307, 39147, 13017, 60623, 5433, 45595, 25309, +62937, 18051, 32493, 57040, 12685, 45799, 28804, 17921, 60061, 37974, 9798, +31482, 40720, 18619, 51037, 5361, 34115, 64523, 17320, 49061, 29507, 6920, +46045, 33635, 10386, 62954, 17624, 33612, 56216, 12605, 44454, 21273, 52946, +10527, 31187, 54320, 20195, 38852, 7423, 55677, 33926, 15153, 53525, 20630, +28199, 46970, 2994, 59319, 20289, 31975, 61329, 14150, 45208, 22308, 58339, + 9539, 29746, 65488, 4953, 39805, 23610, 45485, 15760, 50161, 7716, 40315, +26403, 51610, 13434, 34660, 62839, 17168, 43363, 32427, 3303, 65001, 21768, +31875, 56786, 5029, 43308, 18371, 62314, 37265, 11938, 48146, 19023, 30553, +60481, 12974, 44409, 18496, 49130, 28225, 6253, 52645, 27338, 17769, 62160, +31277, 9943, 59883, 34134, 19566, 54982, 5672, 37785, 59008, 11420, 29936, +56935, 17314, 43602, 1029, 33536, 51024, 15439, 29022, 56738, 2801, 45953, +23228, 41431, 14319, 59821, 32910, 3862, 51289, 35077, 18793, 54077, 2252, +36541, 64976, 19735, 44213, 15600, 36889, 62633, 6889, 33758, 56398, 1730, +39626, 26446, 65320, 13919, 33014, 48023, 6116, 63058, 22848, 41162, 17473, +32347, 64274, 1973, 49772, 20457, 30938, 56288, 16151, 28704, 45262, 6823, +61375, 24920, 41992, 29639, 5541, 59952, 22356, 48574, 11743, 43506, 24782, +59312, 16082, 45240, 27619, 7140, 58830, 37120, 2090, 60978, 21325, 40472, + 9962, 48948, 22542, 58258, 8566, 36169, 62631, 18561, 32895, 41336, 5590, +60197, 18540, 31779, 64139, 8670, 47186, 23978, 39243, 14625, 62983, 485, +33490, 59274, 21348, 45971, 3750, 39809, 15162, 49437, 22947, 40733, 1058, +56964, 12217, 34938, 50413, 19731, 64112, 2277, 40563, 23580, 50390, 14752, +27767, 55288, 18092, 44228, 6603, 54284, 23640, 49313, 8883, 33930, 57935, + 99, 42229, 23935, 53227, 16136, 37736, 46076, 8752, 57394, 37128, 1093, +50149, 33114, 16126, 47059, 24441, 56651, 10294, 39953, 23644, 53934, 8495, +59928, 16978, 31459, 44650, 9021, 56084, 34837, 3858, 49081, 16356, 60675, +25414, 40925, 7321, 64162, 32745, 18522, 54502, 23827, 42576, 10942, 58481, +20239, 36127, 61258, 8889, 42909, 23641, 63794, 13576, 44871, 21607, 62039, + 8457, 29360, 57816, 14097, 35881, 49423, 19359, 63902, 31535, 12317, 57734, +23885, 45609, 9555, 34298, 65409, 22677, 42055, 10504, 58793, 28448, 1238, +64165, 37649, 8721, 31970, 57796, 10895, 36378, 61882, 21291, 40478, 5592, +60872, 20077, 30271, 58714, 13373, 42080, 23831, 55865, 7961, 43863, 22484, +59531, 14170, 41843, 26777, 63277, 6017, 41796, 23494, 56724, 15753, 37593, +59129, 10297, 32623, 63452, 16865, 40579, 24316, 59971, 2172, 50325, 20536, +33642, 53437, 16013, 41684, 64, 51337, 10690, 37633, 48226, 2800, 31826, +55925, 13508, 44995, 22270, 61969, 2439, 42911, 24471, 59256, 14864, 39524, + 205, 56954, 21028, 35604, 58579, 3179, 43059, 23837, 52254, 6144, 40934, +23318, 58015, 2940, 35232, 64380, 15850, 44141, 4250, 60559, 30781, 19333, +47063, 2024, 37230, 62523, 12338, 32954, 55088, 9930, 44134, 27354, 185, +54663, 38069, 8022, 34886, 50370, 19509, 46104, 15105, 53693, 28275, 591, +57542, 34539, 20455, 64667, 3822, 42358, 25170, 53130, 5310, 27645, 54865, +10564, 49170, 25056, 41169, 12665, 48488, 20511, 36386, 50558, 7170, 27497, +55058, 3493, 38107, 52920, 8114, 41394, 23880, 62818, 9905, 34963, 56989, +14823, 36734, 46862, 5403, 51680, 21772, 42255, 1861, 47334, 24703, 50761, +14930, 41226, 23044, 49146, 7926, 37446, 64804, 20702, 27535, 59695, 8523, +44000, 19393, 36087, 62045, 9601, 29391, 50577, 10803, 43514, 23964, 56320, + 8172, 42155, 22543, 58343, 13070, 30488, 51296, 4562, 57472, 28002, 12544, +49586, 29979, 19615, 59696, 16309, 47210, 7229, 42835, 22359, 53838, 16510, +35775, 46577, 4103, 55477, 14228, 42700, 23401, 54366, 8448, 34714, 44027, + 3351, 63519, 33863, 19265, 46815, 11955, 52563, 37678, 17756, 46102, 31470, + 2374, 57415, 33564, 7767, 50607, 36434, 1134, 55881, 31549, 17478, 51414, +23208, 43849, 12525, 57461, 24749, 42912, 85, 32305, 50156, 20433, 44202, + 2814, 55479, 15625, 46271, 26314, 51106, 904, 39804, 26000, 55629, 4709, +34204, 52041, 18456, 44096, 29060, 6615, 36382, 51103, 18518, 65138, 32882, +10093, 58289, 35399, 17671, 46574, 24846, 59924, 7021, 32636, 43329, 13986, +56079, 31037, 5282, 60716, 38349, 11484, 30066, 59528, 21012, 39504, 2828, +63403, 26083, 47092, 15283, 29736, 62147, 7668, 44941, 27756, 2623, 60745, +33409, 17934, 27339, 61984, 14091, 28985, 58584, 4655, 43230, 20018, 32677, +62586, 805, 44973, 26558, 38946, 5249, 53190, 19959, 29288, 47256, 12672, +62494, 21241, 30525, 45038, 1381, 53081, 28341, 14196, 56700, 37639, 4504, +61841, 16475, 32624, 45130, 3008, 52299, 17980, 31803, 55563, 5376, 39565, +25939, 56294, 133, 33933, 47362, 17982, 38091, 54677, 1836, 27073, 45885, + 7762, 38229, 53764, 4577, 36760, 61307, 18776, 41289, 2633, 51703, 20649, +31018, 45627, 14687, 49407, 22436, 30034, 53622, 3736, 42393, 23269, 49946, + 6625, 29528, 55927, 17795, 36107, 49936, 8277, 45541, 33050, 375, 51358, +18542, 36893, 64372, 11866, 31388, 47692, 1026, 51285, 18610, 36243, 60250, + 3537, 33480, 49597, 6787, 44064, 23481, 50480, 2819, 29395, 55037, 7815, +34705, 43729, 11681, 64599, 28626, 9862, 38274, 61398, 20384, 30402, 57934, +16765, 27598, 63410, 8782, 36191, 50359, 4764, 28592, 54444, 17000, 37436, +49530, 7911, 32428, 53389, 23226, 40816, 9216, 50789, 16832, 31221, 60273, +11952, 38896, 26676, 61863, 8723, 32021, 50476, 11596, 28449, 41813, 21695, +52020, 9729, 36747, 49793, 13186, 58910, 23994, 41301, 6068, 49477, 18573, +30712, 64548, 13249, 47323, 30392, 17285, 62940, 27406, 2254, 59712, 32323, + 7456, 36538, 61537, 16465, 47928, 29757, 10617, 54182, 37458, 18283, 60229, + 9386, 46017, 37208, 18022, 57922, 30720, 7314, 59829, 34527, 2262, 63384, +29171, 15816, 57915, 33880, 13955, 64734, 28821, 17667, 35615, 58401, 1202, +28757, 48445, 20076, 41820, 3230, 59089, 23159, 40163, 13129, 56397, 26606, +39173, 18803, 64181, 7308, 35233, 60289, 2543, 31068, 55608, 18784, 45472, + 4002, 34717, 47451, 16054, 54439, 29782, 6537, 47098, 25458, 57380, 706, +35883, 64500, 13677, 39745, 26599, 61723, 6369, 45484, 24857, 40090, 10443, +47707, 35516, 21384, 60928, 2507, 43804, 36723, 9906, 51667, 20846, 35272, +62090, 936, 28173, 57648, 11735, 29478, 61238, 19767, 38569, 7225, 60333, +26926, 45928, 13189, 58747, 22240, 41723, 10281, 54932, 30857, 1342, 64322, +27343, 53993, 7198, 62896, 23933, 41068, 15071, 54847, 20146, 28102, 63703, +13953, 48381, 35505, 9414, 65072, 38403, 4732, 33567, 47574, 16602, 63180, +27310, 11901, 58786, 38269, 17437, 31668, 65436, 6406, 39141, 22304, 57779, +14148, 43565, 20305, 61990, 11542, 31274, 58536, 9859, 47543, 24939, 61120, +12696, 28186, 44658, 1954, 53737, 27882, 8167, 63601, 37622, 4098, 30478, +49008, 16403, 61897, 28647, 8509, 47959, 35724, 19304, 51909, 1685, 33175, +47706, 8009, 53251, 31608, 18914, 43545, 5971, 52291, 35715, 20136, 55417, +12624, 36794, 49110, 19760, 54190, 5306, 36385, 46690, 9603, 51070, 34662, +21571, 60940, 10855, 51641, 18391, 29354, 48879, 7600, 59103, 17742, 33053, +64712, 2750, 40465, 25209, 50341, 5889, 38980, 19717, 57465, 11946, 45949, +35652, 8762, 51385, 22195, 29723, 48360, 10107, 65329, 24190, 38807, 11259, +49989, 19497, 28884, 59889, 9827, 41310, 22417, 52671, 7043, 28259, 64896, +13181, 48560, 33845, 15579, 58718, 27361, 17576, 50321, 28633, 12045, 46515, +24564, 56682, 8594, 38240, 63241, 4293, 35828, 60710, 10030, 40119, 20103, +59094, 12949, 33623, 62947, 15379, 44400, 32702, 2583, 65246, 14336, 28302, +57074, 20625, 43036, 10529, 58038, 28984, 4576, 50634, 35834, 20721, 61571, +11008, 31326, 46198, 13094, 53256, 27441, 16679, 65268, 29851, 9728, 35957, +61546, 19272, 47175, 12627, 57678, 21255, 30269, 47720, 4433, 55389, 27188, + 7565, 49434, 34147, 3490, 38482, 53466, 14132, 44283, 21634, 58901, 14955, +34151, 46730, 10928, 64919, 27970, 20009, 60552, 5781, 44274, 15531, 63721, +24855, 42323, 4991, 47994, 23611, 53194, 1402, 43704, 20701, 54988, 16935, +36318, 48545, 408, 59604, 29644, 17545, 63511, 4688, 29304, 45255, 14865, +52968, 21287, 35228, 56432, 4026, 41738, 23443, 53668, 5279, 35768, 51430, +12390, 43490, 21698, 54903, 13757, 40311, 23950, 42598, 5621, 58274, 22378, +44458, 2105, 30432, 49796, 15676, 32141, 63942, 78, 44894, 21473, 51170, +15451, 41889, 23548, 52508, 10389, 38002, 45220, 563, 49983, 23287, 43889, + 5639, 51146, 16270, 37556, 55827, 6964, 31987, 65422, 17033, 44413, 31765, + 9593, 63261, 35969, 4269, 53870, 12248, 46517, 26537, 42010, 13251, 53381, +24746, 39894, 9197, 57839, 29228, 13300, 61026, 38455, 1698, 33025, 63866, +21453, 40340, 11963, 52033, 20462, 30842, 46786, 3365, 52919, 17888, 32825, +49765, 1108, 64193, 29314, 18217, 53634, 8593, 31229, 46791, 17819, 63749, +28524, 5073, 57159, 30379, 13374, 38220, 48650, 9180, 34200, 51091, 2890, +44960, 25499, 53089, 16345, 40810, 602, 51966, 25524, 38662, 5865, 60826, +20129, 36059, 50112, 13156, 34749, 16989, 48075, 37218, 9505, 32080, 60594, + 4063, 46723, 37144, 10892, 44092, 27058, 3340, 53985, 29184, 20194, 56755, +14694, 28347, 51206, 8988, 37647, 54501, 4358, 28439, 50640, 11090, 42302, +24943, 59804, 8879, 35500, 53548, 3225, 29380, 45894, 22639, 50066, 1709, +40178, 21878, 54464, 4886, 37508, 57253, 11065, 30900, 48565, 16162, 42676, +22003, 55051, 12676, 45071, 23381, 53529, 278, 41726, 21430, 58391, 12093, +43003, 24014, 63884, 13149, 41200, 23488, 61006, 10191, 36092, 57575, 16857, +28180, 60228, 3590, 46555, 23407, 64480, 10157, 29138, 43168, 15846, 63651, +23809, 39574, 1933, 54592, 16401, 31584, 45772, 3480, 36715, 57650, 14614, +41945, 23815, 51947, 10292, 42903, 22659, 53904, 12104, 34172, 61639, 14734, +42770, 24095, 64522, 4038, 29772, 49034, 17616, 58745, 435, 39877, 26214, +53298, 5859, 41898, 26198, 58902, 2070, 35244, 47572, 16145, 63330, 32375, +11593, 58096, 36546, 3882, 42940, 22177, 60769, 5940, 36123, 46897, 947, +64447, 32768, 6242, 59855, 35713, 16390, 53758, 28227, 11237, 48507, 27304, +17731, 55936, 6194, 43551, 26471, 51585, 1600, 39016, 24788, 54766, 11725, +47937, 19360, 37025, 51768, 4233, 30806, 62316, 16301, 39870, 23995, 45805, +14820, 54782, 7653, 41433, 25376, 57988, 6421, 40277, 22937, 55613, 576, +37973, 48142, 18199, 56404, 4291, 40004, 22785, 32989, 44804, 948, 62003, +18174, 32783, 42866, 13775, 59479, 36857, 18591, 65352, 27053, 7102, 32482, +61101, 812, 39412, 26457, 57255, 6403, 31805, 43862, 1498, 51656, 35921, +18735, 56342, 30726, 2669, 36593, 54647, 19798, 41076, 14809, 65435, 30804, +13225, 57638, 33851, 5357, 63281, 22353, 45988, 10352, 34360, 55895, 20827, +43094, 9053, 57893, 31478, 993, 63896, 27180, 9500, 38057, 60360, 15292, +32754, 57643, 10699, 40589, 24671, 56611, 7109, 33435, 48244, 3188, 63661, +18670, 46086, 32945, 12532, 62247, 36396, 20892, 56601, 6121, 47944, 22809, +41517, 11196, 35083, 62460, 4054, 30124, 47791, 6286, 61367, 27165, 17870, +54509, 35778, 11653, 61852, 20270, 31038, 59380, 9288, 40980, 24810, 51962, +12522, 29653, 54560, 426, 48949, 28498, 15337, 43593, 23040, 58573, 30674, + 1244, 61539, 20752, 44238, 6191, 62685, 33080, 18175, 51865, 38116, 7323, +27079, 55046, 18265, 44788, 5367, 33996, 59997, 17089, 42860, 8645, 60916, +25448, 39200, 11948, 58744, 21957, 42839, 14104, 36272, 57175, 4012, 42159, +23577, 55770, 10698, 34015, 50411, 15041, 42171, 23695, 52744, 7891, 60092, +24608, 40988, 14853, 65054, 21349, 39869, 5526, 62826, 34281, 19699, 57853, + 9018, 49396, 26946, 42977, 15428, 55916, 4638, 44662, 29233, 59609, 182, +51183, 21964, 39890, 12596, 52901, 19000, 29424, 61674, 7343, 52253, 38079, +17188, 59958, 38485, 8027, 35161, 45441, 2568, 59549, 31315, 19294, 47000, +14622, 61361, 35125, 1867, 52874, 18298, 48741, 30714, 12290, 63339, 37306, + 7178, 54917, 18152, 37074, 64543, 13259, 28742, 49052, 17455, 41765, 24623, +63101, 6331, 33520, 59617, 2760, 40610, 26057, 61034, 9999, 39030, 26020, +65486, 7325, 33799, 53983, 3513, 28416, 46319, 18395, 56937, 4834, 39134, +26619, 48559, 1320, 33133, 51381, 13312, 42548, 29408, 7008, 35270, 50911, + 648, 58024, 31325, 11216, 45369, 18959, 59983, 26116, 42149, 8588, 64871, +22982, 49703, 11873, 33760, 63185, 1571, 39819, 25691, 60105, 6587, 36976, +56588, 55, 31301, 50949, 7662, 36735, 46832, 20422, 55237, 9273, 36559, +42898, 21171, 60792, 13145, 44676, 22132, 62462, 9411, 32457, 54807, 13377, +44216, 27245, 4483, 50904, 38431, 17248, 27583, 49282, 10518, 55689, 31133, +19804, 53430, 9755, 41939, 21805, 55094, 15241, 45131, 27072, 1787, 49540, +37501, 19559, 57591, 32651, 51, 47645, 34392, 18672, 64702, 10620, 45035, +22012, 60240, 5262, 40962, 26066, 59249, 9538, 40785, 23110, 54056, 7410, +33895, 48962, 1661, 59677, 30385, 18166, 64792, 34617, 2359, 46952, 30592, +14038, 62692, 19851, 45194, 32095, 11406, 52583, 25652, 42262, 14863, 60519, + 6921, 51380, 25653, 39985, 9205, 56968, 22986, 46739, 1854, 28036, 54073, +11399, 37517, 51662, 15661, 43253, 22860, 52997, 10308, 41219, 23569, 48398, +16077, 59445, 27532, 12583, 38004, 45499, 9839, 61308, 27250, 11595, 58123, +34302, 7983, 45561, 26005, 51617, 9584, 41493, 26529, 49724, 14218, 39017, +26521, 53328, 3196, 48105, 24417, 40169, 16329, 51071, 38250, 11788, 32840, +52423, 19741, 47768, 2546, 27744, 45700, 20520, 64964, 1206, 42216, 22665, +60521, 15444, 39431, 24600, 52411, 9064, 27737, 47395, 4857, 53495, 14743, +39336, 26046, 61093, 8285, 28713, 57527, 16227, 43653, 22272, 56090, 13481, +33174, 42401, 9808, 56970, 31528, 4826, 47542, 25399, 42402, 2375, 49615, +33717, 18177, 62517, 3982, 47410, 35534, 9069, 61165, 20879, 34704, 59539, + 8184, 48272, 17001, 34518, 52394, 10455, 39021, 26105, 51328, 14574, 47787, + 384, 27807, 63555, 16965, 49023, 35595, 10951, 58748, 19947, 49003, 30146, + 2150, 54434, 33514, 18560, 47649, 4707, 55441, 34038, 7450, 61403, 26618, +51584, 11303, 32679, 63280, 16515, 39380, 524, 60339, 24673, 39078, 3477, +64466, 18911, 45417, 32517, 1595, 56665, 36368, 9998, 55137, 31544, 17830, +49201, 11494, 46412, 23564, 39083, 17093, 64801, 2485, 39889, 25505, 62469, +10085, 41241, 15877, 45744, 25806, 65397, 5702, 43055, 24707, 58673, 1849, +35041, 46030, 10355, 31170, 49858, 631, 27247, 62295, 13762, 53258, 24264, +39945, 9886, 64730, 25738, 44011, 7631, 30844, 56215, 21577, 45438, 5392, +41085, 23253, 50609, 15481, 44528, 25193, 59650, 3942, 32977, 44406, 7709, +61607, 31819, 675, 55726, 20837, 45147, 13797, 49937, 29679, 18738, 52051, + 5043, 34493, 56559, 13384, 44539, 22247, 49994, 15959, 37900, 62538, 9395, +33675, 44924, 20803, 52470, 14966, 65016, 22696, 44254, 8424, 61809, 21145, +37618, 58996, 14552, 47016, 27171, 17601, 36779, 55831, 4437, 47947, 30628, + 6580, 57308, 37592, 15607, 28911, 46466, 5616, 54058, 20288, 31552, 57089, +13640, 47052, 19344, 27860, 45784, 15511, 60595, 27215, 17728, 53579, 28666, + 2372, 59839, 33522, 14887, 51778, 28697, 7159, 55765, 37841, 3396, 29289, +46429, 19796, 49686, 28481, 7749, 56011, 36550, 20365, 59660, 1307, 34654, +62282, 18768, 45446, 3029, 39978, 26596, 61804, 13659, 49866, 29373, 7985, +38352, 62886, 17327, 29405, 59356, 6924, 40989, 15059, 62427, 23467, 52652, + 8226, 39776, 26982, 55559, 13290, 31269, 46262, 19879, 53514, 869, 33735, +61246, 14915, 43857, 25366, 63498, 12458, 41327, 23538, 53361, 9916, 39929, +22031, 50114, 16177, 56973, 35937, 4786, 51642, 28559, 7713, 63722, 35558, + 2011, 58137, 19839, 48476, 31651, 11124, 62871, 35513, 19028, 50681, 6296, +37557, 58710, 17660, 32770, 45933, 4108, 62734, 27458, 9036, 57641, 36672, +20722, 63946, 3838, 34983, 52490, 8267, 32970, 63019, 3356, 48814, 29538, +17740, 51191, 37871, 755, 48882, 22833, 61600, 3996, 39060, 19842, 59277, + 2166, 32777, 60758, 6645, 43703, 19703, 64837, 12840, 33321, 58546, 6288, +28003, 61254, 18154, 40886, 6772, 62658, 29714, 16833, 58778, 37085, 8359, +52458, 31203, 16895, 50706, 29738, 9701, 57261, 31908, 811, 59159, 37406, +17147, 65292, 24387, 42233, 1478, 47156, 19786, 52688, 37600, 2919, 32058, +54247, 6800, 39661, 25471, 65077, 1722, 49250, 27915, 17240, 60203, 37905, +12375, 64033, 21777, 55356, 10346, 39575, 26510, 43575, 14137, 56047, 26168, +41029, 17824, 53011, 2731, 40516, 25531, 56495, 5785, 42891, 22454, 64937, + 3638, 34106, 59282, 19392, 43699, 37426, 10125, 31046, 56298, 3135, 41031, +23945, 45692, 6778, 61864, 25698, 41743, 9306, 65118, 26962, 41026, 13286, +50664, 23048, 43810, 2690, 39022, 20548, 48867, 7042, 54475, 26289, 44227, +18970, 52038, 13715, 47945, 31247, 6255, 58171, 22778, 43897, 15478, 27725, +50783, 4430, 43319, 24672, 60694, 2087, 32282, 58956, 6452, 50509, 30717, +20860, 46804, 12517, 51939, 22735, 58464, 32438, 7020, 56494, 19481, 29702, +48984, 14401, 38132, 54642, 17669, 27295, 64361, 15245, 37056, 57566, 19095, +44055, 33912, 4898, 48789, 17724, 55254, 35150, 1078, 52005, 20653, 40335, +10811, 63990, 29320, 16706, 60619, 32353, 352, 57594, 35970, 10195, 29983, +47788, 14814, 56151, 27089, 16613, 51988, 36984, 11471, 40876, 26040, 54735, + 7384, 36972, 62666, 15007, 31751, 49225, 20447, 40408, 2148, 59832, 32077, +10624, 55684, 24737, 48428, 722, 29744, 58531, 11059, 42101, 4226, 38728, +26935, 56061, 17949, 45572, 2124, 32013, 54823, 10630, 38102, 61538, 8118, +42324, 24251, 62925, 14529, 40384, 23528, 52105, 357, 34914, 62061, 17505, +43314, 28533, 9941, 50363, 35889, 3290, 65261, 33323, 8591, 49709, 38246, + 4404, 35018, 63581, 10973, 45448, 25403, 40036, 4997, 62233, 19387, 47953, +32407, 12018, 63944, 35710, 15828, 56394, 720, 37297, 64663, 14569, 30968, +52422, 8797, 44016, 27148, 11899, 53020, 36919, 22450, 57306, 7374, 33075, +47367, 2257, 35407, 57867, 19753, 51465, 4462, 33997, 44095, 12521, 54697, +25186, 45269, 5896, 38589, 20906, 61642, 2211, 33297, 48845, 7171, 63755, +16527, 38836, 26883, 50152, 10857, 31120, 55633, 2951, 38677, 21276, 57241, + 6702, 32575, 47396, 3950, 62112, 29290, 10663, 42821, 24249, 61245, 12212, +46446, 22674, 40283, 15475, 53507, 26754, 38708, 5209, 45619, 21898, 54065, + 2566, 41968, 24399, 64177, 14432, 49283, 28852, 10310, 55169, 38000, 16482, +29991, 46925, 2216, 49666, 17157, 29053, 54943, 11473, 40747, 24047, 55700, +15132, 40130, 20965, 58891, 5591, 33589, 64166, 16292, 43324, 31209, 11247, +53657, 25335, 44101, 13631, 52746, 22695, 40204, 15043, 56594, 24868, 41488, + 1272, 50535, 20507, 36075, 45873, 3580, 55551, 24015, 44088, 13390, 50434, +34499, 5685, 54357, 25059, 43952, 11516, 61087, 37305, 4648, 46874, 19155, +36017, 49908, 12947, 29075, 51272, 10190, 44947, 31515, 16585, 60459, 38293, +12020, 27105, 64241, 16941, 45219, 23057, 58735, 14258, 34403, 43163, 10885, +53239, 32988, 3366, 48377, 23818, 41500, 6061, 45341, 23114, 52835, 1508, +60790, 24157, 38735, 4937, 63803, 10828, 33508, 45538, 20157, 62018, 11334, +33503, 50366, 15299, 40831, 24000, 53162, 11116, 29019, 57507, 4729, 50435, +21616, 44434, 15133, 64701, 29256, 12576, 51131, 35733, 14838, 55955, 22666, +38866, 228, 53222, 19353, 32211, 62988, 9937, 46541, 24641, 57743, 14478, +42591, 30145, 4377, 59015, 34511, 8756, 61402, 26088, 43246, 12090, 34610, +49523, 7576, 59035, 33868, 18823, 63943, 12572, 33741, 53817, 15228, 45323, +24318, 41787, 13973, 55443, 36910, 8087, 61532, 30037, 3769, 18095, 36645, +45044, 13559, 51832, 36362, 2795, 63355, 30760, 8406, 49350, 36110, 3773, +55718, 28598, 6632, 51831, 12011, 29596, 63461, 21343, 42703, 7262, 30979, +57809, 12307, 45056, 26374, 53833, 2712, 35950, 47545, 12995, 51763, 26146, +43254, 6052, 65032, 19526, 38053, 50254, 2303, 36187, 59469, 9388, 43426, +22560, 64394, 3183, 28642, 58964, 20127, 42902, 1227, 57696, 27542, 8714, +64189, 30149, 17021, 53175, 35531, 6078, 42274, 19432, 61338, 36203, 14263, +49767, 24963, 62829, 16246, 49148, 5845, 41295, 25144, 64147, 17110, 48170, +28699, 3971, 52355, 32300, 18241, 49687, 2448, 34925, 54096, 8870, 42726, +20974, 56401, 12326, 32390, 54901, 4045, 44735, 25048, 58028, 15860, 40417, +21802, 55224, 12640, 29339, 52406, 16262, 41803, 23606, 57223, 8287, 50832, +17836, 31262, 45164, 1484, 54067, 23102, 40972, 6039, 59368, 25765, 40236, +18956, 47759, 5080, 43061, 22396, 62786, 15737, 33404, 47740, 6118, 65365, +16464, 40859, 26033, 51469, 14936, 63387, 23802, 41423, 10340, 28834, 47169, +15962, 65096, 23667, 39136, 3138, 60439, 26909, 50713, 9896, 40503, 25208, +58528, 14986, 40444, 24030, 57299, 3359, 42592, 21559, 64955, 6108, 45527, +26032, 51529, 13443, 40111, 24954, 59079, 14423, 43873, 19173, 55387, 35003, + 1224, 53596, 17650, 36502, 50889, 3744, 32808, 59820, 9077, 42738, 23217, +65086, 13433, 49299, 29999, 17514, 55944, 32089, 8598, 45405, 36112, 517, +60824, 23314, 44081, 5655, 62130, 18846, 35422, 58360, 7439, 32435, 45853, +19195, 60402, 350, 43542, 30540, 7169, 46801, 23557, 53124, 13014, 27952, +46084, 6415, 57257, 18348, 36270, 64669, 7545, 30724, 47552, 4436, 63084, +30302, 8626, 48733, 37009, 16029, 61973, 29147, 8281, 54131, 37374, 15647, +30389, 59741, 470, 39891, 23729, 64141, 14941, 38983, 3424, 49671, 28492, +13908, 53821, 26150, 64360, 6698, 39783, 21995, 61682, 3731, 34064, 56772, + 7387, 48906, 29136, 4505, 55281, 33354, 8711, 51332, 38019, 922, 30698, +46994, 7501, 62927, 27242, 16468, 57838, 37283, 9642, 54084, 30345, 16693, +58810, 38028, 13401, 32709, 46345, 8636, 57276, 22333, 49902, 16823, 30169, +55170, 4402, 47407, 29214, 19127, 57018, 1947, 46916, 30420, 7626, 62393, +35886, 16447, 41483, 25592, 61194, 7136, 34107, 52486, 967, 42537, 21871, +57197, 4335, 31502, 48776, 11694, 60267, 25424, 45918, 5467, 40210, 17887, +53827, 31144, 1372, 65462, 35285, 18517, 56127, 12833, 47152, 23037, 41065, + 1951, 54709, 21748, 62463, 16755, 29180, 47304, 134, 42363, 25564, 52137, + 5277, 40166, 22128, 57539, 9263, 35532, 63253, 1006, 28080, 48958, 14879, +38399, 54274, 49895, 1578, 28528, 62323, 8039, 27080, 54074, 11824, 42713, +24020, 60809, 12756, 45097, 20329, 33973, 47229, 16243, 58897, 35882, 2240, +45940, 25084, 60808, 15710, 40907, 23727, 62396, 6187, 39288, 22800, 59022, + 8104, 38639, 21170, 56695, 11348, 40580, 24055, 52679, 12252, 27655, 62273, +17627, 28662, 46639, 5398, 51424, 34743, 16490, 38458, 48318, 10189, 35706, +52853, 12293, 45662, 37535, 19118, 51780, 3837, 44086, 23097, 57450, 15110, +47110, 27698, 7447, 56422, 38136, 2600, 32257, 46278, 20513, 59898, 13076, +33808, 53393, 6655, 40346, 14834, 60989, 25847, 39958, 9364, 65079, 19985, +28525, 59407, 13674, 47084, 26738, 38834, 7428, 64305, 16424, 38777, 21195, +52081, 7143, 32420, 61171, 1877, 43232, 26329, 62379, 6371, 33232, 59026, + 937, 43527, 32559, 22853, 65148, 11398, 41978, 25976, 61169, 13479, 51118, +34775, 17694, 44432, 8572, 51729, 26938, 57189, 12232, 35525, 50071, 3582, +28711, 54400, 17986, 44935, 31097, 351, 60089, 9923, 43921, 30822, 5199, +56339, 21257, 50151, 809, 32587, 53674, 9366, 43097, 22261, 48898, 13357, +30860, 57043, 17454, 45914, 4176, 52981, 35473, 8908, 47048, 25926, 54883, +12674, 32243, 40507, 19650, 56264, 8174, 30810, 63057, 156, 52134, 26890, +38516, 6231, 47983, 25964, 60026, 9454, 41043, 22007, 64248, 13456, 29500, +47249, 19223, 56475, 259, 40011, 32378, 7628, 59573, 37739, 4061, 27918, +60180, 16643, 48743, 24883, 40293, 13282, 54453, 20383, 31166, 51508, 12565, +42814, 24520, 65041, 5106, 39120, 26585, 51479, 16623, 63477, 37156, 14182, +56310, 32805, 2091, 38063, 60889, 19899, 33213, 49467, 1556, 40097, 24402, +55357, 15504, 34815, 45114, 18198, 58376, 27691, 3820, 55187, 35039, 11671, +47345, 23136, 65332, 6994, 48479, 20208, 35907, 53090, 9809, 42295, 21812, +57877, 33770, 18828, 63050, 36393, 1622, 44630, 21119, 51952, 14389, 42038, +25941, 54666, 11827, 40555, 22908, 63426, 12856, 36771, 43971, 15231, 57184, +20261, 28646, 61658, 12482, 53569, 20893, 35481, 50446, 4960, 44388, 28727, +19520, 64503, 236, 49013, 35555, 7986, 29112, 62997, 19317, 41520, 14861, +47205, 34272, 886, 59833, 25933, 39692, 13605, 63988, 37004, 9791, 31934, +60350, 13597, 44070, 22755, 48609, 1456, 56600, 11844, 32203, 54304, 15948, +40032, 25108, 59442, 9695, 39031, 26566, 63993, 15764, 43450, 34228, 8369, +57979, 21719, 30125, 60747, 12198, 48225, 26067, 40736, 9685, 51153, 27013, +43296, 5698, 63579, 30924, 17581, 48848, 38290, 4211, 35653, 53639, 11362, +61036, 20709, 38550, 10291, 62221, 27041, 49025, 3401, 30398, 51629, 16412, +44732, 21441, 32908, 59707, 7506, 27309, 12012, 34068, 55681, 15183, 46922, +32254, 18185, 36905, 59188, 4981, 40234, 22868, 52467, 1295, 61576, 23549, +41926, 6115, 49308, 20778, 54752, 8616, 33474, 51671, 3613, 48268, 19085, +30195, 55766, 13779, 42021, 24263, 63614, 4043, 46062, 18925, 34033, 58242, + 1437, 47138, 33318, 8060, 53686, 35514, 14544, 57421, 30981, 12121, 54348, +27093, 6065, 57001, 29194, 17163, 63161, 32613, 5505, 48319, 25051, 61964, +13071, 39748, 29903, 1834, 64778, 33304, 22241, 43994, 13653, 60764, 27812, + 8675, 55513, 37779, 223, 29707, 47231, 20024, 58421, 23908, 43069, 1217, +56946, 21623, 33583, 48952, 5501, 41668, 23597, 52567, 3058, 60344, 22431, +33570, 47634, 1020, 58746, 24401, 41956, 13950, 49379, 23198, 55891, 9720, +39183, 22467, 50418, 13406, 29894, 55107, 15569, 47422, 3686, 52783, 20868, +39057, 6680, 46656, 30713, 2893, 54933, 23923, 61875, 16836, 38863, 1627, +60335, 23480, 40358, 19427, 61231, 10615, 34279, 56814, 13416, 39444, 23501, +50326, 17276, 58967, 37476, 13947, 42658, 25380, 61045, 11804, 41464, 24321, +58656, 7573, 34756, 64200, 1289, 42347, 32864, 21622, 63353, 11597, 30750, +44010, 18187, 62543, 6814, 35864, 48929, 1873, 60391, 15496, 44448, 36289, +18653, 48410, 11349, 42467, 21803, 65426, 12964, 44621, 20162, 31163, 52492, + 2864, 43420, 25728, 55415, 5730, 34237, 44783, 16281, 61130, 24280, 48074, +12244, 40658, 22629, 52050, 10976, 34642, 56742, 4510, 31510, 64631, 7752, +47682, 27363, 1355, 57003, 36221, 9479, 46543, 21738, 55990, 12405, 36148, +47803, 4102, 27614, 49567, 10702, 62418, 25405, 41067, 14689, 52002, 8973, +28677, 60034, 21415, 42742, 10070, 62288, 28087, 33, 54069, 36297, 10588, +49886, 31192, 16753, 59566, 38407, 1819, 31771, 44343, 10909, 57107, 28783, +18320, 62052, 2424, 47461, 30151, 6295, 54842, 11167, 41532, 25388, 56178, +10457, 31040, 58711, 2761, 47885, 18578, 36854, 57977, 374, 28128, 46889, +18590, 59965, 2577, 31563, 50005, 6064, 45477, 25828, 39343, 2133, 60850, +18406, 31306, 59187, 11280, 46505, 25946, 40121, 14540, 59873, 21281, 45776, + 2860, 53528, 30791, 6477, 65189, 23803, 43047, 12160, 52561, 21390, 44980, + 6711, 51169, 26486, 39823, 18465, 52873, 5542, 33991, 65369, 17321, 39690, +26460, 49568, 3770, 28640, 63226, 13749, 43365, 21106, 53966, 7018, 46307, +28464, 1884, 55260, 37336, 16923, 51363, 3266, 43087, 34736, 6444, 55670, +20954, 62152, 2918, 38505, 20111, 53292, 14976, 36997, 57509, 10525, 27732, +64948, 14707, 44584, 23065, 39636, 6031, 56074, 26710, 45975, 13372, 38823, +20331, 65289, 11155, 34790, 58070, 4775, 47005, 19135, 37585, 64575, 23822, +50836, 5362, 40551, 21478, 61311, 411, 49843, 28942, 14811, 54979, 33424, +10183, 48595, 37956, 14537, 31769, 64531, 11517, 39400, 26333, 60051, 14496, +38864, 26090, 65251, 9188, 34922, 46323, 848, 52726, 31465, 10544, 48959, +25598, 61210, 9582, 29271, 44150, 15702, 63895, 25966, 41640, 3429, 60918, +20644, 44320, 144, 38038, 65319, 18214, 33305, 50604, 2554, 44460, 22237, +58771, 15237, 30661, 42827, 8373, 58273, 18460, 50773, 37642, 12473, 54608, + 4970, 48160, 18929, 34609, 50981, 15853, 43922, 24692, 63317, 11884, 39376, + 4956, 52675, 18628, 36242, 46833, 11301, 54699, 16736, 31045, 61834, 12533, +39765, 24446, 45633, 9626, 53400, 18020, 30236, 42699, 8874, 63362, 36886, + 4713, 29725, 46287, 18661, 64107, 3147, 41152, 25927, 60988, 6930, 39883, +22170, 34661, 57403, 10301, 29366, 50375, 19607, 63632, 15249, 35496, 48637, + 5796, 41983, 25031, 46595, 13909, 54929, 5534, 44330, 25817, 51271, 2581, +42357, 25579, 63584, 8402, 46233, 28779, 3295, 32975, 64048, 7248, 52887, +18588, 31454, 51659, 2728, 37720, 55201, 14502, 27872, 47303, 16116, 56114, + 5540, 39301, 26858, 59619, 471, 50310, 20672, 28653, 58208, 14325, 42885, +22383, 29403, 50667, 4346, 61033, 23535, 33525, 58129, 2635, 39898, 23937, +48628, 5326, 62250, 16727, 33603, 58821, 8700, 40216, 23957, 62527, 9940, +29170, 52799, 3364, 34488, 57076, 19788, 42677, 1748, 63274, 23615, 41612, +15214, 50393, 21903, 41417, 10786, 33871, 61774, 14449, 40079, 26152, 54094, + 2709, 32984, 61396, 8946, 29567, 58588, 18168, 44334, 35606, 5440, 54112, +21682, 43099, 3577, 58210, 35250, 17326, 53179, 5052, 46958, 19966, 37981, +50693, 14106, 27106, 64358, 19616, 44985, 5895, 52607, 28278, 20697, 60966, +14333, 35284, 52061, 5229, 46612, 24938, 40914, 14352, 60416, 20677, 50422, +35602, 17286, 47897, 5228, 62337, 37565, 16109, 45209, 24414, 62816, 6330, +32346, 52341, 10038, 34696, 50573, 21302, 41444, 10994, 63702, 35139, 19036, +58395, 13321, 48955, 24480, 42980, 6882, 51871, 34292, 3597, 55628, 22702, +50947, 5822, 39357, 25212, 56660, 12771, 34994, 50886, 18506, 38970, 7888, +58463, 31610, 3204, 61284, 36163, 17127, 57680, 113, 42391, 24492, 55980, +14440, 29747, 46872, 9150, 59055, 20242, 36162, 51551, 7930, 47325, 30449, + 2910, 36607, 62242, 17025, 33097, 47581, 10868, 62817, 24378, 40623, 14176, +64286, 24225, 47568, 15557, 39628, 25041, 45726, 11544, 60534, 23333, 49871, + 959, 31678, 46542, 7040, 52223, 33619, 2639, 59661, 24602, 49837, 16167, +41675, 1528, 60038, 25247, 52758, 6913, 41034, 22973, 50105, 13550, 29231, +56211, 3194, 41785, 62878, 29126, 17039, 57088, 35370, 10935, 46378, 20489, +37750, 58307, 6917, 27251, 63727, 17107, 28072, 56924, 4444, 45018, 24256, +53114, 224, 30167, 47279, 7106, 56312, 21974, 43136, 15351, 58549, 27765, +17702, 61925, 35767, 14961, 41476, 2950, 51335, 36767, 19971, 54633, 5120, +48802, 21428, 38752, 10303, 48015, 25952, 56360, 15503, 28091, 47533, 9225, +59527, 25903, 39864, 9733, 33739, 49712, 466, 54824, 21187, 34442, 47562, + 6908, 28054, 61724, 21419, 41964, 10540, 64348, 29521, 3663, 59252, 35993, + 7156, 54983, 22896, 48989, 16132, 33195, 58918, 7706, 29615, 63600, 4114, +42938, 25669, 55933, 1494, 50191, 29487, 14328, 58257, 35757, 6451, 61523, +20256, 48329, 28218, 15361, 56356, 38231, 11451, 52000, 31965, 20348, 54273, +12328, 36007, 48356, 18462, 62973, 5301, 41641, 23506, 60290, 244, 33227, +43739, 8317, 57797, 20597, 29144, 64979, 11181, 52979, 37728, 18402, 31739, +63090, 9474, 39117, 21193, 58404, 5797, 32586, 52247, 18984, 36309, 55888, +12536, 44694, 23254, 38801, 4184, 46133, 21533, 62759, 16505, 29916, 44445, + 8390, 61343, 34267, 19909, 49527, 12234, 54076, 22623, 42276, 15203, 37182, +51889, 4736, 33726, 53413, 7865, 64586, 17530, 31878, 41746, 8922, 54294, +16495, 29582, 50835, 9282, 56605, 26688, 38657, 11030, 53894, 19659, 28892, +49917, 1548, 33256, 51197, 14641, 42156, 23719, 64767, 6508, 29836, 54523, +16180, 45817, 29470, 7166, 60597, 35202, 2965, 56209, 24023, 43101, 17844, +48765, 4704, 60093, 23047, 41695, 15891, 50141, 25218, 39650, 1221, 52224, +31542, 9627, 65194, 26711, 48424, 16078, 31525, 46525, 10700, 63826, 25999, +39660, 13170, 60514, 29987, 7031, 56224, 37327, 2839, 41259, 24924, 58698, + 9572, 36236, 43205, 3961, 50013, 27264, 17085, 63819, 32130, 11951, 36661, +55736, 9063, 43713, 28410, 153, 59476, 22600, 42596, 28376, 7950, 52975, +34738, 10984, 28920, 53916, 14659, 41393, 24532, 64884, 6970, 28932, 53183, +16373, 44484, 28193, 3940, 54916, 36347, 8547, 30123, 65454, 15886, 41047, +23599, 62566, 12461, 44836, 18383, 32931, 62041, 10582, 42019, 26387, 60516, + 2021, 47867, 24349, 44013, 16056, 55394, 23515, 41291, 9519, 49390, 22106, +34120, 62612, 8483, 45001, 36334, 2364, 61436, 24945, 42448, 5218, 54859, +18642, 33266, 57374, 12801, 44757, 24618, 49461, 9161, 58625, 19263, 29806, +44360, 5010, 52171, 32537, 10471, 54949, 440, 31094, 59745, 8433, 53625, +26954, 38667, 7625, 44923, 25535, 59418, 13976, 40490, 21026, 56918, 17114, +46043, 29091, 7852, 64084, 35755, 21538, 48100, 9625, 43498, 26923, 59213, + 512, 36196, 61885, 17349, 32233, 45291, 10626, 1775, 33663, 53038, 7206, +43338, 24762, 65132, 4284, 51193, 17686, 34804, 46153, 2071, 53618, 36145, + 9826, 40723, 20477, 58496, 12803, 36117, 62616, 17061, 32400, 41771, 3105, +53689, 31485, 7699, 37686, 50087, 4932, 43930, 23206, 60024, 17362, 30372, +57492, 8890, 40317, 25332, 59201, 13536, 42506, 23175, 62452, 7195, 32118, +52373, 4050, 41396, 23583, 46266, 6788, 63817, 21332, 43624, 13454, 62196, +26903, 40780, 4499, 60336, 16976, 45810, 36280, 968, 53316, 25033, 40538, +15184, 46726, 22334, 51923, 11281, 32566, 42573, 2739, 65370, 24255, 45008, +14420, 39751, 22314, 51568, 17908, 38647, 10399, 44208, 18912, 64659, 37341, + 4371, 49159, 16700, 32563, 53922, 2332, 34907, 44686, 7612, 60518, 27398, + 506, 37271, 58603, 8186, 45734, 28350, 1704, 55676, 31426, 15051, 51756, +37180, 10926, 48391, 24869, 55316, 13873, 31505, 51888, 2192, 43711, 35172, + 7270, 28427, 59294, 596, 43369, 24432, 55958, 12849, 41279, 23052, 47032, +15032, 61929, 1466, 41659, 25732, 58159, 10193, 47773, 26899, 56589, 12393, +33249, 48335, 5809, 54238, 24302, 40760, 1946, 59029, 25922, 44857, 3908, +31957, 64345, 8511, 44681, 24101, 61475, 11498, 39887, 25741, 46789, 1081, +57383, 20374, 45223, 35670, 4893, 63637, 19152, 33378, 43578, 765, 60874, +22770, 47443, 6053, 36927, 63935, 13295, 45087, 22221, 55599, 8024, 32371, +46550, 18577, 50507, 9810, 33428, 58566, 12548, 43305, 24861, 52225, 16436, +32845, 63639, 6462, 53388, 31067, 20829, 44483, 12103, 52521, 34227, 6124, +64054, 20720, 43178, 15115, 59657, 24155, 39873, 12220, 55241, 579, 39351, +20600, 50858, 6228, 33836, 57096, 1955, 41474, 22625, 48667, 16829, 32500, +62550, 13044, 44338, 21767, 48727, 15320, 63160, 33223, 10554, 57488, 37697, + 1083, 51111, 24083, 45798, 4355, 30580, 65121, 16091, 34574, 46693, 11716, +54459, 19386, 36250, 64629, 1780, 48460, 19193, 36553, 60933, 3435, 47296, +17707, 37046, 56132, 1132, 32489, 61906, 9975, 48456, 22098, 40227, 17705, +56668, 616, 32582, 54243, 7368, 38797, 26864, 57288, 1359, 38659, 24281, +49363, 5257, 54832, 21007, 39849, 14362, 63471, 29203, 4868, 48655, 35451, +13421, 64593, 30895, 5850, 51934, 19674, 30687, 55214, 13152, 49229, 21196, +39067, 11325, 45905, 26263, 64152, 559, 40312, 23311, 60951, 5846, 38715, +22197, 53635, 1235, 36277, 56226, 16130, 28222, 60102, 18894, 37552, 44853, +14874, 49607, 23613, 41371, 3789, 64653, 21180, 51702, 10185, 39005, 26770, +63167, 4679, 32878, 42500, 10711, 55859, 32511, 18799, 52347, 5070, 31613, +56769, 18366, 39062, 10627, 53375, 25432, 42886, 6232, 54673, 20777, 48438, +60400, 14229, 39659, 21946, 57872, 11660, 38830, 26915, 44397, 9501, 60374, +19429, 28926, 43683, 14009, 61913, 25644, 42762, 6423, 51297, 22797, 44513, + 9767, 49799, 21062, 60934, 13024, 44948, 24835, 64234, 14443, 31086, 56120, + 9966, 35116, 52581, 540, 43075, 22135, 64703, 6745, 34472, 52906, 1739, +45983, 29127, 17227, 57607, 36486, 12850, 61503, 30182, 14869, 52706, 35773, + 3089, 56101, 24967, 38711, 10084, 52403, 19061, 32918, 54017, 11009, 29520, +49172, 17786, 58386, 8136, 31802, 63038, 1703, 39089, 26614, 57114, 17119, +30227, 53882, 8589, 35115, 50184, 564, 59784, 32834, 6838, 62772, 21342, +48174, 34090, 8342, 51527, 20927, 28765, 56718, 10894, 40164, 23920, 65461, +13411, 49651, 19885, 33787, 53812, 15981, 42557, 24502, 64803, 13758, 35299, +46770, 19067, 59228, 7221, 30042, 64433, 18001, 42768, 4671, 61324, 37367, +16388, 27223, 58641, 20170, 47139, 14531, 53750, 34108, 10949, 49879, 29854, + 3699, 65199, 35436, 8083, 50936, 26623, 38977, 20148, 53368, 4865, 32451, +64606, 17797, 39231, 225, 59801, 22199, 38841, 10744, 65491, 18599, 32162, +47816, 9218, 36554, 56528, 16395, 39568, 21792, 54477, 2404, 30918, 48083, +19006, 58788, 13871, 38687, 26831, 49901, 11150, 60118, 17414, 30746, 47313, +10068, 55714, 26184, 41687, 11670, 30238, 57949, 16980, 42978, 27811, 4179, +59192, 37134, 19436, 60984, 659, 41334, 24698, 63018, 4624, 39105, 21526, +55710, 1028, 36787, 48913, 9026, 27569, 46232, 15084, 37520, 62519, 132, +28638, 57307, 10967, 45019, 26357, 53436, 8603, 32632, 46695, 4276, 56739, +33780, 17643, 62169, 24989, 42235, 13751, 54648, 22021, 45016, 14688, 31216, +61524, 4607, 53782, 27182, 8116, 38326, 52122, 715, 30346, 54997, 7231, +27092, 47844, 15991, 43740, 21908, 61770, 8578, 33105, 58379, 19141, 49006, + 6857, 38952, 26400, 60063, 3851, 49418, 29785, 13266, 43883, 22447, 58139, + 9270, 30973, 42681, 21935, 59199, 8563, 40082, 25863, 51866, 15620, 42348, +26555, 59491, 5344, 46811, 24052, 41718, 13682, 48183, 21937, 61203, 11634, +31486, 48047, 17461, 64769, 9028, 43708, 32105, 11987, 59446, 36485, 7426, +51827, 32811, 19847, 56764, 1612, 41947, 25360, 46949, 15776, 59999, 3595, +39435, 26392, 63713, 6455, 32293, 58190, 17706, 50119, 8524, 31168, 52998, +14742, 42842, 25637, 51704, 9903, 39578, 26743, 61801, 8033, 33587, 50143, + 3502, 46355, 27420, 6939, 62601, 34644, 12302, 57615, 22580, 47212, 14412, +33067, 56357, 2142, 43201, 22745, 48275, 12954, 60847, 27708, 690, 50200, +37589, 15046, 62768, 23793, 42791, 2996, 61303, 22664, 46141, 14353, 33470, +64214, 12157, 39180, 24937, 42419, 26352, 51982, 3542, 41436, 23684, 61720, + 1161, 49675, 21643, 33199, 54749, 7598, 48355, 32335, 3389, 56002, 18620, +33762, 64930, 1756, 40323, 25590, 56481, 5573, 38507, 26695, 55463, 1323, +40439, 22246, 50976, 4133, 27709, 62555, 13376, 47948, 26264, 38963, 11497, +50302, 19016, 28258, 63211, 14992, 33285, 49403, 4758, 42259, 24862, 51404, + 1091, 44874, 22559, 57914, 16548, 30424, 50963, 7290, 44740, 23669, 65224, + 2382, 42349, 22143, 59561, 6195, 44315, 34160, 19690, 55739, 13258, 44302, +21330, 61419, 5423, 47095, 13043, 40719, 23189, 57742, 12370, 30647, 46174, +15674, 53848, 24852, 40059, 3316, 58834, 17271, 31462, 62142, 152, 43389, +22871, 59173, 5551, 46073, 25935, 39098, 3735, 62814, 10414, 31547, 51547, + 5086, 40759, 21409, 57879, 3526, 32973, 43109, 23002, 54168, 2691, 40795, +21403, 33884, 47030, 8025, 53377, 38433, 10376, 33099, 64221, 4838, 40092, +23316, 62133, 17469, 37816, 53022, 14556, 28655, 58845, 18712, 42081, 6042, +61304, 16239, 49310, 24584, 40576, 9133, 54863, 26489, 45181, 14948, 51793, +25200, 41546, 4891, 52966, 21084, 62650, 13800, 29379, 48551, 5654, 60168, +25116, 41305, 9705, 62376, 32749, 3662, 45644, 23119, 56018, 5703, 40756, +25024, 44116, 1984, 58390, 24232, 38897, 6739, 65142, 21841, 51836, 2213, +35580, 54155, 14897, 48210, 31314, 10550, 51960, 28501, 16704, 56327, 36768, +11069, 49315, 26513, 44144, 14358, 65498, 28947, 19262, 54139, 38264, 3698, +56469, 27100, 9747, 51090, 38283, 16451, 30852, 59208, 2559, 39924, 23493, +61921, 14153, 39295, 21425, 51367, 7751, 44887, 29876, 3141, 58406, 34847, + 7457, 65405, 25094, 51509, 10394, 35800, 43696, 18384, 59384, 28116, 11920, +64753, 34546, 17596, 38429, 60076, 3348, 30641, 56238, 12577, 40361, 25420, +53979, 2298, 41155, 25257, 57157, 9874, 45272, 21947, 40647, 15455, 61727, +37153, 5056, 50887, 25550, 45698, 16216, 54518, 5563, 34074, 49864, 20437, +62623, 11877, 39044, 3189, 53935, 19613, 31972, 63836, 9513, 44722, 26605, +57749, 4428, 39454, 25989, 55464, 2967, 40553, 23323, 52200, 15911, 27956, +53786, 461, 45875, 27688, 15765, 62105, 37369, 9991, 50406, 21658, 58290, + 6951, 29132, 44281, 20521, 54579, 10011, 41717, 24429, 52400, 2016, 41631, +21912, 35835, 59675, 10832, 28025, 64879, 2538, 34718, 59080, 19904, 48735, +11677, 43869, 21905, 65163, 13191, 35844, 56723, 17538, 29542, 50801, 1654, +44152, 25994, 39462, 5547, 61635, 18415, 29365, 54587, 9210, 34844, 51041, +16519, 38022, 45119, 20300, 58790, 6667, 28978, 48495, 13117, 36264, 51361, + 8356, 30560, 58495, 2453, 41390, 22063, 56541, 5548, 18863, 63561, 10024, +32837, 56076, 13214, 45558, 31054, 15803, 58636, 5245, 40526, 23017, 63236, +15695, 38185, 49844, 8875, 28754, 47515, 19775, 59518, 11869, 39055, 27035, +62972, 9098, 47713, 17284, 34897, 59854, 11622, 44303, 37893, 16360, 29938, +56426, 5721, 45648, 24124, 57286, 3780, 36324, 42946, 9035, 53911, 22129, +60783, 11234, 38681, 19907, 64889, 10304, 33985, 40679, 5436, 62942, 18483, +32231, 55332, 12039, 39656, 25901, 56687, 9435, 38815, 26684, 63932, 3014, +41028, 25848, 50656, 6433, 39537, 24323, 52819, 18017, 34058, 60852, 3859, +43211, 25743, 62425, 5825, 28639, 42327, 13046, 55702, 19669, 33184, 48749, +11316, 40899, 25210, 54729, 8587, 38549, 27028, 52390, 12447, 57293, 21210, +43963, 28928, 17628, 59474, 36631, 11956, 48877, 23922, 53231, 9924, 62675, +16404, 34927, 48793, 11187, 57628, 27643, 14647, 63394, 29678, 1274, 56115, +22734, 45909, 15400, 31265, 52268, 2425, 46351, 27132, 7441, 57101, 36766, + 1023, 47749, 24114, 55401, 13206, 29661, 45112, 2088, 60285, 22489, 43530, + 6613, 35972, 62162, 3039, 30452, 57764, 11937, 45244, 24926, 39918, 713, +58378, 20478, 32391, 46064, 13224, 51546, 28053, 17748, 53086, 36792, 10695, +64108, 19550, 34375, 50449, 8460, 62806, 33013, 14512, 53339, 20220, 40590, +12519, 46229, 33349, 18439, 27427, 63368, 6273, 41352, 23814, 61916, 2916, +35651, 46293, 6841, 31304, 60323, 19923, 52669, 8360, 33058, 47358, 5529, +57932, 12881, 32222, 61512, 16569, 47309, 31955, 20493, 64449, 5033, 48309, +19072, 35317, 54438, 7249, 29863, 49303, 1735, 58849, 27907, 19197, 63586, +36689, 11598, 49351, 18497, 45831, 28839, 1050, 33176, 47058, 15653, 56773, +29901, 2634, 50168, 37115, 20498, 47420, 9104, 53746, 28336, 18500, 49693, +36647, 5546, 64452, 17882, 34176, 47177, 13858, 50907, 20492, 33040, 63588, + 1290, 48487, 29151, 9005, 56418, 33259, 18787, 64039, 660, 39643, 26662, +60223, 14005, 43754, 2222, 30214, 46503, 21746, 58303, 36637, 10790, 50515, +23087, 39037, 1910, 53008, 18549, 34797, 64227, 10426, 46122, 19156, 34087, +60366, 4682, 47604, 33776, 10708, 58353, 37751, 19483, 47322, 4049, 54350, +30068, 13925, 45690, 33792, 17305, 64261, 37141, 825, 47491, 22736, 60613, +12359, 38794, 26822, 63000, 15732, 48615, 4222, 37176, 54555, 18231, 47702, +30719, 13698, 41527, 4564, 55585, 26991, 38798, 2237, 52623, 24531, 40330, + 5283, 59060, 19594, 35596, 63664, 8231, 48944, 20350, 35408, 50465, 12132, +38331, 57826, 3620, 27211, 65232, 7488, 28995, 53241, 12568, 36635, 56145, + 4329, 32147, 64739, 20259, 42056, 16234, 46817, 24982, 52617, 9480, 32858, +46495 diff --git a/src/main/ran.509.131.h b/src/main/ran.509.131.h new file mode 100644 index 0000000..f6dd323 --- /dev/null +++ b/src/main/ran.509.131.h @@ -0,0 +1,6084 @@ +/* + * "$Id: ran.509.131.h,v 1.2 2001/02/25 01:58:36 rlk Exp $" + * + * Square dither matrix file for the gimp-print plugin. + * + * Copyright 1997-2000 Thomas Tonino + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + + 0, 54481, 28629, 16669, 50007, 36603, 8133, 60381, 20398, 30495, 48890, +10730, 62798, 23970, 40322, 2802, 54344, 21688, 38442, 10209, 56353, 25482, +38320, 2124, 62617, 23786, 48600, 10308, 39832, 22001, 63565, 1184, 43579, +25561, 54292, 10403, 41040, 21906, 57902, 5990, 30748, 45450, 19953, 65463, + 2046, 32297, 44526, 13515, 55978, 24038, 41526, 5487, 63718, 17032, 37060, +50207, 10248, 28360, 62025, 17711, 41907, 1927, 54848, 34655, 20809, 45069, +11007, 59493, 26847, 40535, 2713, 51548, 28271, 12561, 62923, 37996, 16374, +29028, 48217, 675, 60338, 24251, 39673, 11001, 48607, 21548, 56750, 2856, +33891, 45663, 15665, 59890, 27975, 7615, 49365, 37553, 19984, 55682, 10616, +42429, 25285, 58403, 1259, 32401, 52086, 19355, 43194, 10741, 63987, 26867, +39972, 6453, 48528, 21545, 61487, 10237, 34918, 44087, 20496, 51690, 2914, +32050, 62153, 12872, 42852, 23635, 51702, 1359, 32813, 65367, 20101, 46196, + 9728, 37522, 52534, 16718, 30182, 57089, 6229, 43656, 21601, 51358, 10572, +32555, 58716, 18260, 48003, 732, 38598, 26902, 64930, 12411, 48153, 30803, + 2789, 54680, 35624, 17222, 50347, 8071, 33372, 58016, 21033, 44269, 13152, +31394, 61158, 6915, 48730, 21913, 39460, 14506, 57671, 30309, 4605, 49736, +37823, 18459, 61110, 686, 32886, 47994, 17271, 54551, 10422, 39263, 23326, +64754, 8270, 32141, 51869, 16805, 47852, 28974, 52, 57719, 35743, 10833, +47309, 23281, 65071, 13849, 31614, 50729, 4104, 45189, 28005, 15482, 59521, +35393, 741, 48737, 25845, 54453, 9375, 41626, 21578, 58478, 14048, 32352, +45900, 6450, 65471, 23712, 42191, 9239, 52173, 17111, 31042, 57970, 4788, +44913, 28176, 15462, 52291, 35497, 2181, 64853, 21691, 45228, 9396, 33026, +61727, 16918, 44731, 27418, 917, 55703, 38133, 15671, 29448, 47046, 3278, +65005, 24723, 39589, 14307, 57141, 30498, 638, 51230, 35996, 17877, 58770, + 4442, 47228, 27128, 39483, 13413, 60090, 21967, 43681, 4984, 56553, 29154, +15259, 50549, 36370, 10306, 60064, 25190, 48121, 3424, 39333, 21505, 59129, +10842, 30865, 50469, 20018, 41894, 3107, 63160, 31076, 17015, 50266, 37726, +10021, 53087, 20380, 33854, 65169, 5244, 41873, 17519, 52200, 30762, 9114, +58287, 38045, 15738, 28089, 48900, 4537, 62391, 22662, 40876, 11988, 55112, +26901, 38757, 9620, 60223, 17370, 47452, 30772, 3233, 62181, 34922, 18709, +53934, 9634, 44026, 35206, 20301, 56560, 6846, 49173, 22245, 41009, 10690, +64725, 31343, 15869, 49795, 37034, 2310, 57563, 23634, 43283, 12105, 52468, +17782, 33953, 64217, 8829, 43360, 24976, 56341, 12755, 38991, 21869, 52565, + 4449, 33246, 65300, 15052, 44342, 27421, 9687, 53878, 35434, 14957, 60988, +28118, 3284, 50031, 37002, 16470, 64983, 29159, 539, 49751, 36358, 18438, +62371, 5386, 32673, 53728, 15267, 46284, 27728, 7963, 58927, 37508, 14582, +53933, 28828, 9595, 50133, 37382, 21042, 65240, 2872, 41948, 26053, 57912, +13865, 48678, 32990, 1741, 62774, 35536, 17775, 53117, 7747, 32237, 47777, +21022, 55260, 11511, 39239, 26718, 61911, 6384, 48640, 25100, 41694, 9720, +60009, 19784, 36623, 50568, 5577, 29184, 60845, 19804, 47245, 8254, 31891, +57708, 18983, 43063, 5282, 52609, 21138, 32551, 61341, 1879, 46989, 18286, +32040, 60255, 11172, 45422, 20953, 30127, 55231, 6769, 44568, 20340, 32212, +59678, 11112, 48800, 21783, 40293, 3219, 55636, 25750, 39175, 12512, 58720, +22746, 48302, 6298, 34077, 54156, 18739, 42463, 2451, 60030, 26430, 40000, +14648, 52630, 29423, 315, 57001, 37117, 17701, 49576, 10666, 30528, 65130, +19133, 41338, 7240, 50482, 29211, 14047, 56734, 37660, 4565, 49557, 27311, +16884, 61202, 35447, 13174, 64425, 23599, 44288, 3461, 31633, 57703, 15434, +43949, 27535, 6460, 55011, 38106, 12669, 29836, 48467, 19609, 65089, 7500, +40814, 27256, 60214, 12428, 40055, 21313, 50986, 6304, 34108, 56069, 12053, +46174, 28273, 16564, 61314, 37946, 3829, 31363, 53527, 14125, 43058, 24547, +60771, 9092, 34855, 52207, 15612, 48524, 27681, 3458, 59917, 37169, 20843, +49639, 8294, 32363, 57015, 20630, 45958, 6755, 32930, 58311, 15541, 47870, +28324, 5745, 52543, 35826, 18519, 65165, 9529, 44159, 20959, 32845, 56712, + 4094, 43620, 22437, 53461, 9550, 31565, 62440, 13619, 47062, 25556, 38502, + 5083, 49266, 25161, 65147, 12671, 40728, 21763, 54687, 442, 35819, 51099, +15058, 31071, 64411, 5284, 45972, 28096, 16418, 61179, 38221, 8953, 29619, +49214, 18028, 57044, 2112, 38653, 25373, 52989, 13371, 32480, 58182, 7224, +45310, 27956, 16870, 54356, 37244, 4581, 59392, 27336, 16165, 49298, 35917, + 7897, 57835, 27954, 15304, 49756, 35442, 4037, 61899, 25139, 47503, 12379, +39957, 24253, 64251, 4331, 41900, 22718, 56478, 9699, 32328, 53489, 16045, +45411, 28824, 6628, 61994, 37115, 19723, 45407, 10183, 60360, 26879, 38962, + 4529, 55371, 25450, 48004, 11209, 40717, 25195, 64151, 1215, 34324, 53963, +16797, 45676, 27873, 6852, 59506, 35674, 20859, 51734, 12293, 41255, 26663, +61593, 2142, 46156, 28746, 14667, 55971, 36922, 4247, 45875, 24819, 59913, +13004, 40538, 24670, 55071, 5685, 43057, 21382, 61121, 9313, 37825, 51877, +17050, 30624, 57715, 6594, 46349, 23920, 38658, 12743, 63637, 22518, 47221, + 4637, 37759, 56783, 16662, 28608, 50124, 1577, 34738, 59725, 20692, 45882, +11947, 41495, 25771, 63030, 7005, 33521, 47118, 18945, 56832, 11882, 38993, +26843, 51280, 4412, 37555, 57541, 14256, 30464, 48197, 7537, 62892, 22193, +40157, 11757, 54096, 26939, 43546, 7106, 61750, 19956, 33038, 46585, 8841, +55624, 22624, 39729, 11363, 65185, 25517, 43303, 1893, 54181, 17939, 35663, +49755, 8596, 31639, 64217, 19079, 46703, 6049, 40493, 26662, 55456, 12817, +43834, 22800, 64544, 878, 33622, 47216, 14847, 52950, 28226, 6465, 58241, +35527, 14222, 49387, 27633, 1473, 59639, 37296, 13477, 45753, 25249, 56063, + 3216, 38970, 21785, 63435, 13407, 44825, 30445, 6848, 52147, 37129, 18281, +60742, 2495, 33657, 50414, 16291, 45975, 28719, 6266, 56979, 37752, 20755, +51696, 11681, 42688, 26342, 64071, 224, 30431, 47562, 13548, 60608, 26001, +38503, 3060, 54860, 24259, 43530, 9152, 59423, 17954, 30037, 47817, 7419, +62817, 25406, 39526, 4723, 50293, 19148, 30469, 58439, 1777, 41333, 23103, +62197, 10002, 30757, 46908, 16869, 57142, 28665, 2335, 49447, 37272, 19451, +62125, 8152, 42826, 25381, 52507, 13150, 33901, 56144, 6839, 42971, 23452, +58341, 9349, 34489, 52051, 14298, 42439, 25552, 61813, 1327, 35377, 49859, +16571, 31575, 63530, 4522, 45124, 27655, 15611, 60120, 38212, 7746, 28946, +55068, 18725, 47550, 4497, 39205, 23256, 56514, 10191, 30237, 44744, 14181, +63824, 24716, 39320, 4242, 57383, 18274, 31409, 45626, 2013, 58647, 22409, +38310, 12697, 54774, 26088, 43829, 3094, 63170, 17040, 34690, 52392, 10126, +41923, 25030, 55513, 37, 38670, 27083, 63573, 11666, 48025, 17393, 34267, +56719, 8206, 42228, 25656, 51011, 3634, 34257, 62351, 13222, 42029, 24520, +56767, 2279, 39432, 22493, 52733, 14157, 31934, 65013, 7585, 44755, 30961, +18499, 61095, 4430, 43928, 20825, 31511, 55480, 9385, 41332, 22622, 62969, +12935, 33207, 50238, 4225, 42972, 22593, 63787, 13494, 32486, 44375, 4939, +52678, 20691, 34683, 59171, 1439, 43497, 23119, 52172, 9984, 32941, 62874, +16012, 45284, 27864, 6013, 53021, 37634, 19647, 41663, 7603, 48651, 26740, +56158, 13135, 34594, 46537, 1609, 64052, 20854, 33760, 45815, 4710, 57678, +17975, 33864, 51707, 561, 43476, 25699, 53597, 14096, 32937, 59035, 3308, +45060, 27463, 16893, 64734, 38099, 7499, 30136, 55233, 11401, 47688, 20415, +33720, 57385, 649, 45983, 18015, 29736, 64036, 6826, 43784, 35482, 17518, +53947, 10533, 34612, 62416, 17207, 42268, 263, 52515, 29132, 14613, 63872, +37106, 3677, 50143, 27337, 16393, 60077, 38128, 1019, 30610, 55309, 15580, +48291, 27710, 8114, 63466, 37101, 17572, 49828, 2246, 33674, 58357, 19662, +44461, 7142, 33523, 50128, 14399, 59137, 26513, 38623, 4302, 47906, 24581, +61619, 8619, 41134, 24064, 56082, 12028, 40488, 21767, 51055, 2763, 33300, +54929, 17301, 45510, 5952, 33099, 62230, 20779, 42805, 11783, 48841, 26846, +63499, 1121, 40183, 22970, 50667, 11115, 32948, 64689, 14158, 44601, 27822, + 6551, 52343, 37607, 20502, 63026, 445, 42948, 26481, 54699, 11665, 39014, +21384, 59314, 1668, 33538, 52859, 15556, 45039, 28668, 8195, 60738, 37505, +19548, 51029, 2466, 42639, 25925, 59194, 13837, 31782, 51406, 1352, 42724, +23893, 65108, 12942, 41024, 21595, 52324, 2955, 35677, 59045, 15421, 29753, +49979, 8078, 42499, 22709, 62568, 11719, 40666, 24987, 54858, 3650, 43730, +18102, 57918, 30044, 9542, 50106, 37039, 18728, 62843, 6692, 33515, 52610, +20444, 43003, 9856, 63843, 21986, 38481, 3067, 48867, 26682, 56332, 13043, +33278, 44381, 1802, 64012, 27525, 14859, 49831, 36777, 8722, 55899, 26635, +43368, 3090, 61266, 29475, 14695, 53506, 37003, 7960, 46571, 24167, 63724, +10524, 39274, 22197, 56192, 3468, 37727, 50460, 16114, 29598, 60603, 470, +42421, 23802, 53131, 8682, 31623, 63904, 16697, 44420, 27763, 1839, 53303, +36948, 17029, 58581, 28628, 5024, 49780, 35596, 17777, 59619, 2467, 37650, +53016, 15539, 29430, 45282, 5461, 57850, 29014, 16812, 50766, 36237, 7418, +61218, 24625, 42516, 12204, 56845, 22528, 39037, 1417, 53402, 30605, 16005, +62325, 35359, 4096, 49814, 28632, 16831, 56617, 37273, 5023, 45416, 25173, +61072, 12329, 40783, 22805, 55350, 8297, 45938, 30646, 16570, 62235, 35163, + 5872, 47760, 23460, 54113, 10968, 40784, 26299, 56817, 601, 49113, 20379, +34174, 58073, 8975, 42776, 24560, 53725, 13382, 31710, 64809, 1367, 43903, +27452, 14735, 61099, 36512, 5837, 49860, 18045, 32922, 56922, 9129, 44264, +32009, 19332, 53827, 6399, 42352, 22669, 63185, 12055, 33745, 52092, 20158, +45119, 890, 35186, 54390, 14888, 30630, 60471, 11229, 42361, 24226, 52160, + 5989, 34120, 54544, 15053, 44466, 27546, 7469, 60234, 37433, 12313, 51375, +21398, 32508, 57983, 5102, 45660, 18255, 31590, 63276, 1014, 41463, 21829, +51194, 14874, 31987, 64210, 3556, 47377, 24151, 39737, 11156, 57493, 21472, +43599, 6889, 54700, 26044, 39218, 11201, 56648, 19754, 34103, 51963, 406, +42838, 23210, 62424, 10683, 36135, 50715, 15429, 30728, 59358, 6705, 48939, +24791, 40988, 1087, 60162, 22536, 47164, 9568, 33546, 53973, 13517, 42113, +24568, 65320, 5850, 34115, 51584, 17323, 42835, 8772, 57895, 32637, 20942, +49825, 4665, 30595, 62219, 20504, 44548, 13318, 34374, 59920, 6724, 42772, +24123, 54629, 3124, 40654, 22939, 65410, 10315, 36689, 53806, 16381, 29223, +48187, 6379, 58459, 18825, 31355, 46909, 10699, 60535, 26356, 38380, 223, +49046, 22632, 56860, 10143, 33890, 46755, 14995, 62313, 27900, 1628, 51155, +36125, 17259, 58208, 5564, 47537, 30502, 16170, 53213, 37388, 7250, 57522, +23889, 46009, 12587, 31244, 62142, 8151, 41953, 24004, 54829, 12592, 39508, +21813, 60027, 2542, 42827, 23165, 51552, 10615, 31628, 59496, 33785, 63386, +14938, 46736, 22626, 39259, 5515, 60937, 29658, 16134, 50937, 36432, 9197, +55834, 24726, 42925, 13027, 59630, 24188, 38768, 5627, 61605, 22351, 48431, + 9107, 36538, 56881, 15461, 29546, 52317, 1429, 43331, 23299, 60191, 13840, +36846, 50063, 5715, 29407, 62632, 19322, 44003, 10245, 32071, 49632, 20963, +58175, 2729, 31130, 46598, 19702, 56645, 5904, 31035, 45293, 21176, 60979, + 9278, 34797, 44231, 12812, 57650, 23370, 41274, 7425, 51143, 33799, 17932, +62199, 11802, 42129, 23571, 52366, 4631, 33434, 55964, 19941, 46499, 8859, +40902, 26203, 61646, 12252, 48783, 22818, 40373, 1373, 54101, 18387, 34308, +63422, 10885, 45348, 17955, 35376, 53652, 1738, 30359, 60398, 14510, 45142, +27432, 7735, 64972, 36221, 19840, 52566, 10374, 41763, 26021, 59205, 4348, +39685, 21952, 55416, 9403, 33233, 46822, 18485, 60996, 5983, 38639, 26461, +57189, 2395, 47743, 18479, 33569, 55814, 8833, 41744, 24464, 60089, 13137, +32904, 50922, 4844, 42543, 24688, 57373, 10780, 34681, 48578, 19744, 62421, + 5910, 34055, 47091, 17387, 57978, 10198, 39721, 22668, 53196, 4324, 33698, +62622, 16339, 45957, 28678, 5954, 56759, 35777, 17550, 50643, 9912, 43389, +23507, 62271, 4894, 36548, 51403, 16054, 29232, 57253, 1880, 46567, 28616, +15004, 65496, 37937, 7928, 31834, 48326, 20457, 60392, 5366, 34706, 44796, +16100, 56784, 27991, 1248, 49778, 36258, 13464, 58155, 23787, 42098, 6503, +62349, 18253, 47061, 29128, 10582, 53889, 37247, 19042, 58522, 4931, 34149, +50899, 18476, 41209, 10481, 59673, 20889, 33317, 51640, 249, 42568, 20226, +59031, 29199, 5134, 54296, 36335, 19267, 49548, 12758, 32497, 62339, 6052, +41095, 22404, 55037, 12907, 33863, 46408, 18221, 59090, 5062, 41772, 23321, +50644, 13056, 34483, 61465, 7995, 42787, 23778, 55343, 12236, 41205, 22398, +48068, 8610, 64511, 24780, 40924, 12265, 49327, 21700, 62095, 1043, 32565, +44655, 15401, 54960, 28923, 3594, 49575, 35184, 19772, 61823, 8009, 46232, +26058, 41513, 11208, 58034, 21925, 43633, 7025, 52233, 31051, 14370, 63655, +35884, 10271, 49933, 21954, 44456, 2101, 32369, 65091, 15406, 48829, 28435, + 4230, 56812, 36670, 19234, 50116, 7891, 34166, 64202, 18195, 45442, 12156, +32078, 60903, 5294, 47915, 28852, 15967, 63152, 36622, 7189, 51770, 21170, +35002, 48234, 10120, 58801, 20271, 32260, 45133, 2781, 54875, 25061, 39507, +12353, 64446, 22182, 48871, 1902, 34101, 60197, 15119, 46481, 28476, 3664, +57979, 36418, 16487, 50770, 27938, 8025, 63987, 37624, 20305, 46214, 2752, +55960, 26746, 39723, 12427, 64610, 22063, 48695, 382, 33778, 62682, 19865, +42686, 4163, 55390, 29809, 15782, 49677, 36534, 7791, 59616, 24102, 42319, +11673, 53487, 27181, 38339, 5496, 60248, 21157, 38316, 12814, 54874, 27159, +48942, 2023, 36791, 62999, 15947, 30041, 51096, 3885, 41994, 23942, 64899, +12856, 47034, 29355, 8080, 58766, 34539, 19884, 53258, 2317, 32798, 46223, +20991, 64588, 12582, 33352, 45351, 8532, 55563, 29971, 16632, 51047, 37256, + 2928, 62439, 21998, 46017, 10394, 32210, 57111, 19528, 48471, 723, 38902, +26992, 64008, 11025, 35032, 53053, 17539, 46251, 2773, 32840, 58128, 16240, +46011, 29222, 8728, 53314, 38078, 14412, 31191, 58929, 19115, 43890, 627, +50275, 31380, 14998, 62849, 37827, 4911, 44961, 24915, 55059, 8130, 41669, +23862, 63756, 13328, 39257, 21074, 51104, 4071, 36062, 59007, 16678, 30217, +49710, 7803, 42643, 23885, 65209, 11217, 39127, 21730, 55216, 937, 43831, +26654, 61558, 14085, 36278, 50757, 2736, 28431, 56078, 16941, 45037, 27747, + 6065, 64873, 35084, 16901, 49058, 29632, 8866, 57266, 35582, 18214, 50567, + 1198, 12432, 43977, 28496, 3685, 52849, 36306, 12248, 57900, 25153, 47207, + 7252, 41307, 18898, 62059, 30101, 2470, 49964, 35828, 17153, 55052, 10601, +44805, 19411, 30918, 62936, 4473, 42535, 23421, 50221, 9963, 33594, 63832, +18356, 47035, 3642, 40354, 22509, 58589, 15007, 32510, 53578, 1803, 47199, +28232, 14654, 61337, 37308, 8060, 44730, 25551, 65249, 12208, 40762, 23027, +51655, 3823, 33407, 55056, 16844, 47808, 27473, 1982, 64761, 36323, 19187, +53726, 5417, 42992, 26572, 57026, 9075, 39264, 17248, 60828, 29597, 56, +50112, 36856, 15435, 64198, 28528, 3655, 52288, 37998, 15398, 29987, 57639, + 9106, 42921, 21114, 51625, 29054, 6593, 60813, 37588, 11758, 49724, 27513, +16961, 58673, 37830, 3813, 50636, 28887, 15222, 55674, 38000, 163, 31137, +63307, 12777, 47175, 28485, 16615, 52238, 37517, 3210, 58398, 23861, 42889, +12941, 53843, 22383, 41044, 9838, 62674, 29770, 14588, 50449, 36989, 3320, +64465, 22646, 46948, 14782, 36307, 53692, 7691, 29938, 63621, 17341, 44664, + 3590, 30320, 55033, 14710, 43911, 28112, 301, 65433, 35439, 19970, 45100, +11624, 55445, 26548, 39424, 7501, 58385, 23644, 48597, 12443, 40543, 22357, +59986, 577, 31676, 53836, 13914, 47023, 25568, 40222, 6525, 60497, 19250, +34538, 53185, 9989, 42882, 23824, 56782, 352, 40294, 23036, 51929, 13409, +31754, 64402, 3407, 41903, 22569, 51448, 14322, 31993, 61892, 8087, 45544, +28561, 16628, 54527, 37913, 512, 31402, 60040, 20225, 49140, 8340, 31874, +44083, 21103, 65217, 1962, 31472, 52820, 16507, 45075, 28488, 5631, 62571, +35776, 17530, 49531, 9456, 32736, 64522, 15946, 45224, 27729, 1865, 52746, +37156, 18238, 57732, 10278, 42027, 26970, 49052, 2952, 65312, 25694, 39629, +10231, 52150, 19120, 31592, 57767, 3990, 46828, 27615, 15149, 63606, 36060, + 192, 50361, 29205, 16321, 58214, 36050, 3846, 44840, 26050, 56132, 7726, +39072, 25071, 48870, 11014, 63893, 21605, 38938, 6653, 57368, 27021, 38789, +10094, 51420, 17599, 33565, 64863, 2648, 48205, 24445, 38470, 12646, 60265, +26168, 41615, 247, 56340, 29587, 15615, 51275, 36685, 7230, 58424, 23710, +46978, 10898, 40963, 22427, 61726, 1050, 39974, 27125, 51872, 14392, 32534, +59569, 2890, 42626, 22603, 55140, 12933, 39909, 25311, 45991, 1953, 57002, +17446, 30966, 44137, 4461, 62754, 27758, 15202, 50122, 35956, 8542, 61509, +23357, 47112, 4749, 37061, 58313, 16341, 28798, 44675, 7613, 54697, 24772, +40989, 10322, 61986, 21889, 40073, 13342, 56107, 31773, 4460, 49446, 35542, +17867, 61336, 9469, 34550, 51689, 19589, 43982, 6537, 31759, 56827, 16616, +45864, 28886, 9204, 58664, 36266, 18167, 51803, 1956, 43440, 26651, 65190, +13907, 38404, 21194, 54780, 3016, 43714, 25944, 58025, 10178, 41601, 23819, +46715, 7409, 61514, 19384, 31249, 44230, 5172, 58506, 23064, 41180, 10529, +53091, 31173, 16956, 57343, 35934, 3271, 50368, 24243, 43507, 11432, 61858, +17482, 36967, 54254, 4146, 29487, 44057, 13861, 61277, 24368, 39981, 5245, +56735, 28533, 15635, 49771, 35223, 11883, 59926, 26026, 41315, 4414, 53274, +22485, 40372, 13089, 60505, 25248, 40339, 6408, 56587, 20019, 30167, 48490, +12021, 64524, 22928, 39651, 1589, 55995, 28102, 13084, 51345, 36890, 4589, +63820, 25824, 42582, 8675, 53309, 28337, 12371, 56819, 36195, 20186, 49941, + 1829, 35564, 59217, 15087, 31287, 52163, 5992, 42979, 24669, 62651, 11656, +40951, 23070, 53399, 3368, 33742, 57222, 13654, 46758, 26108, 41059, 6475, +60206, 20171, 33544, 51546, 9432, 42730, 18318, 64259, 31971, 5365, 49922, +36482, 14848, 57762, 29523, 580, 49883, 37657, 14642, 61778, 28022, 4267, +49345, 37878, 20707, 59060, 63775, 22282, 49159, 9930, 32405, 55600, 18870, +43095, 272, 65304, 23393, 38485, 11056, 54047, 26615, 43747, 6333, 63338, +20443, 32434, 47898, 983, 57976, 23993, 40569, 11739, 53872, 18659, 31227, +59404, 5598, 41877, 24799, 55897, 13325, 34419, 51469, 6994, 42324, 25839, +64413, 12061, 41386, 23838, 55566, 5160, 34492, 48809, 20199, 54412, 793, +39056, 27058, 59860, 13390, 46459, 28179, 7695, 61948, 38176, 15613, 30440, +56360, 10062, 45902, 21084, 31598, 48562, 2958, 63320, 20414, 34699, 44505, +12135, 55101, 24731, 39877, 6471, 58718, 19293, 30811, 53746, 11340, 42935, +23266, 59979, 5393, 32385, 48738, 17286, 64747, 2933, 32229, 44661, 15372, +57306, 29455, 5743, 49017, 36559, 20298, 62457, 8147, 42170, 26182, 47996, +11160, 57774, 21458, 39000, 5713, 53679, 30270, 14978, 60387, 36141, 8470, +50235, 27797, 16506, 65206, 37971, 816, 31647, 48678, 19940, 56224, 6186, +32093, 44864, 19780, 57029, 11178, 39503, 27096, 61541, 1011, 43235, 22154, +52103, 11790, 35034, 60566, 20427, 47780, 8557, 36387, 57078, 15456, 31480, +48384, 6411, 61389, 23780, 41587, 1957, 51788, 30060, 15797, 62944, 35399, + 3544, 49652, 18342, 33475, 64437, 8848, 41733, 23620, 55793, 11948, 38330, +21531, 63462, 3222, 48811, 26672, 39246, 11375, 54286, 17310, 32723, 62635, + 8394, 45658, 28182, 15769, 58362, 36107, 6158, 54510, 24490, 46855, 11349, +41548, 22135, 57260, 4359, 40383, 26370, 64599, 9774, 39308, 23253, 52124, +13429, 34590, 61743, 6091, 47015, 28266, 14676, 54233, 36978, 9132, 60213, +25017, 46895, 12342, 41325, 21814, 57747, 3360, 40424, 25074, 53867, 13045, +35573, 61101, 8688, 29974, 47727, 20179, 63195, 4528, 38326, 23463, 53466, +11630, 38282, 21314, 61769, 1308, 45621, 29280, 15698, 54555, 38038, 6814, +31391, 59286, 19182, 43516, 10755, 54464, 26755, 38867, 6206, 63202, 21333, +47642, 11786, 33263, 60328, 18692, 45151, 3095, 34106, 54226, 14015, 43594, +24425, 60939, 510, 41644, 23369, 54361, 12054, 39314, 26550, 57450, 6508, +43952, 21280, 52666, 8883, 33392, 62716, 19217, 42464, 4500, 54790, 26082, +40165, 13341, 63071, 25924, 38401, 5002, 54627, 21431, 43827, 11946, 58764, +24044, 41457, 7228, 53645, 25828, 38968, 10092, 64959, 19559, 48863, 30720, + 5839, 59384, 35735, 20928, 53203, 10743, 46916, 18927, 37542, 57966, 492, +29575, 53414, 19490, 42039, 9317, 63426, 20964, 31346, 53100, 12609, 47831, +34657, 3956, 65241, 18577, 32064, 50290, 593, 43719, 26181, 59764, 9764, +29701, 52986, 14196, 42953, 24063, 58898, 1261, 32590, 46949, 14733, 61979, +27785, 4388, 53183, 37587, 13679, 48149, 25178, 61112, 5735, 38980, 22447, +54182, 12823, 31954, 47246, 7128, 61860, 24665, 40083, 11159, 51932, 18282, +31900, 64666, 10, 48748, 26689, 38493, 11846, 56544, 17980, 33060, 47818, + 8844, 63728, 24846, 39577, 1149, 48663, 21672, 60803, 13551, 40051, 26876, +56191, 6123, 39177, 25262, 49191, 10114, 64010, 19486, 34063, 47518, 207, +57677, 18862, 34252, 52241, 8139, 43072, 24189, 61919, 1653, 32691, 47628, +18682, 58881, 9215, 33185, 46728, 20336, 55506, 2212, 32122, 44811, 15791, +61941, 35825, 5529, 51585, 25680, 42864, 9650, 61017, 30560, 17034, 49520, +35398, 6536, 57573, 24101, 41176, 10838, 49906, 19552, 32014, 61748, 4076, +44354, 17368, 30817, 64260, 8740, 42981, 23664, 54773, 12788, 39565, 21388, +57590, 775, 36719, 50263, 15444, 28964, 61869, 8684, 42097, 23600, 52876, + 2092, 37094, 63548, 15632, 29592, 47835, 3497, 54759, 24722, 40580, 10978, +58593, 23160, 48924, 7724, 41643, 25590, 60569, 12036, 40356, 21948, 52901, + 7116, 32054, 55933, 15870, 44411, 30456, 6545, 13291, 45427, 24928, 39986, + 3118, 61505, 23793, 49038, 13035, 40921, 21729, 58172, 4299, 32935, 46105, +17548, 55617, 12273, 40406, 26400, 60754, 8250, 46464, 29957, 14552, 64999, +37621, 2825, 51815, 22323, 46014, 14575, 32315, 60978, 172, 43416, 23986, +56611, 10460, 38557, 21142, 52514, 3052, 32439, 59538, 17870, 45090, 8951, +30806, 62850, 11856, 44074, 18473, 35604, 57931, 4957, 29573, 52803, 19931, +47398, 1141, 33620, 60615, 17554, 49195, 7168, 38566, 26804, 59154, 10711, +31305, 54184, 17723, 47469, 1753, 31379, 65310, 17167, 43464, 9685, 50804, +20981, 34649, 61296, 760, 46438, 18746, 35557, 56747, 7916, 29920, 46994, +20641, 55229, 10787, 40148, 25251, 61650, 998, 35060, 51510, 12792, 29285, +56331, 18556, 40977, 2965, 63940, 27292, 49264, 12047, 42632, 23581, 61872, + 1691, 34451, 47647, 19885, 56892, 5049, 34116, 45428, 15332, 59757, 28212, + 8574, 50877, 36408, 17461, 60943, 2621, 42552, 25860, 54297, 9509, 31904, +45594, 13879, 58100, 25056, 40632, 5297, 51292, 18042, 31810, 64577, 2796, +45839, 23792, 41154, 12534, 53014, 17832, 30393, 59765, 8922, 42045, 22602, +48140, 11333, 56919, 26886, 39253, 5500, 51607, 19729, 29850, 58252, 2351, +43609, 26596, 50712, 7326, 31742, 57503, 13264, 45396, 31356, 20054, 59797, + 4477, 34907, 50341, 19015, 42683, 2261, 53701, 30365, 12183, 61071, 37708, +19566, 49668, 1549, 36631, 63324, 15337, 29883, 52672, 7248, 46108, 20371, +30581, 57627, 2388, 44302, 27499, 16999, 59042, 38197, 4242, 30924, 48585, +20084, 56609, 1131, 39272, 22835, 64201, 7528, 33852, 51918, 15530, 45871, +28714, 6320, 58762, 37863, 17655, 51525, 778, 42701, 25539, 55677, 14280, +32097, 45745, 7312, 59962, 26304, 40407, 12537, 55965, 22838, 39559, 5550, +64717, 25037, 48965, 12508, 40342, 21959, 52005, 3227, 31255, 60958, 13927, +42271, 23794, 55204, 1393, 36691, 50319, 15272, 29396, 56630, 10366, 41348, +22645, 65459, 6107, 35319, 50171, 16836, 31248, 55916, 4338, 43437, 21622, +63433, 15131, 36184, 49655, 1677, 29056, 59178, 16733, 45785, 35063, 9970, +51924, 20618, 33826, 60462, 2321, 43071, 17306, 51666, 30996, 9472, 64027, +35290, 18769, 49797, 3778, 43561, 26944, 61901, 15433, 31413, 54530, 26, +44390, 27847, 15051, 52079, 37860, 8562, 63698, 25390, 43841, 3997, 34321, +60920, 13807, 42821, 23626, 50651, 7035, 34708, 57391, 17666, 45750, 1546, +41547, 23379, 60405, 9008, 40482, 26225, 55757, 12492, 39590, 22855, 51383, + 6927, 34163, 63649, 18694, 47131, 3204, 40992, 27155, 56576, 12072, 39471, +21687, 51077, 7153, 32143, 64872, 20531, 43947, 2480, 33180, 55832, 18805, +42488, 10648, 63709, 26292, 41449, 779, 57224, 34773, 16799, 50296, 28625, + 3952, 60043, 37393, 13518, 45452, 23604, 57657, 8203, 41339, 21855, 52483, + 2502, 29018, 59841, 16226, 46288, 28398, 6789, 55533, 37982, 15409, 30337, +65446, 8984, 43205, 22100, 52893, 1832, 36451, 58434, 15646, 28752, 44831, + 4909, 54523, 25015, 38762, 9417, 59687, 21666, 46597, 14321, 37713, 53799, + 5583, 28609, 63128, 15201, 44935, 28248, 6708, 52491, 37371, 12661, 64971, +24430, 48873, 8874, 41835, 21629, 53242, 457, 33721, 58519, 13763, 46686, +22177, 41346, 3408, 63190, 28736, 16236, 52142, 35130, 1185, 59763, 22288, +46550, 13430, 37579, 56217, 7052, 28304, 47088, 20646, 59666, 2484, 38347, +27258, 49746, 10358, 29985, 64766, 19185, 45629, 5538, 32280, 54616, 16166, +44504, 27807, 10576, 59278, 35165, 17843, 50622, 7457, 41050, 27156, 56848, +13208, 38338, 21221, 62873, 1538, 46962, 31065, 15776, 53702, 35179, 3145, +64091, 26232, 46366, 12398, 41592, 24352, 62467, 1854, 34725, 53720, 60390, + 4726, 31842, 48271, 14631, 55220, 26016, 38519, 6991, 59575, 18489, 30531, +47704, 9870, 63851, 23222, 38950, 1949, 53543, 30623, 16019, 50077, 35639, + 4192, 56369, 28466, 16883, 49577, 35332, 9280, 63161, 26155, 39967, 6478, +50813, 18696, 31720, 62129, 7810, 48321, 26579, 39815, 12906, 65045, 22290, +43277, 5938, 51899, 34141, 20564, 55222, 2457, 45701, 30780, 15022, 63473, +36617, 8345, 44761, 25170, 54701, 13191, 38838, 22230, 64497, 3421, 32349, +51624, 14982, 45164, 28037, 6071, 60344, 36749, 20997, 51874, 8741, 42094, +25638, 62008, 4826, 31967, 45096, 13231, 54712, 24446, 40527, 9569, 62775, +26810, 38795, 2061, 50707, 17170, 36960, 59351, 5191, 28509, 49341, 16006, +37763, 65393, 6990, 31787, 53979, 14609, 46488, 25260, 38261, 5395, 58966, +22034, 46253, 14219, 32334, 55586, 7313, 43869, 27368, 12708, 62309, 37343, +20863, 54199, 3956, 47705, 26515, 40460, 10543, 52749, 20613, 33580, 64174, + 7338, 47813, 18169, 34978, 62173, 2038, 46983, 17019, 37148, 59730, 10408, +29371, 48824, 20922, 56344, 7188, 39183, 26821, 62513, 3921, 48833, 19156, +34025, 55901, 1129, 39650, 24216, 63964, 14117, 34046, 46817, 8273, 61744, +24564, 40697, 13200, 54688, 23096, 39297, 9254, 64699, 18534, 34132, 52220, + 1044, 42705, 24108, 62242, 9353, 39896, 21936, 52536, 14561, 34583, 65083, + 6632, 44886, 28366, 16492, 51972, 34450, 10745, 58160, 24794, 44145, 3531, +34041, 55809, 17873, 48836, 10418, 37312, 62890, 14343, 29748, 53831, 7772, +46339, 27296, 15594, 61452, 36251, 10025, 50559, 25978, 42715, 13418, 54843, +30501, 2533, 61890, 36046, 18951, 49783, 10479, 31975, 64982, 15616, 45761, +29001, 5808, 60840, 35920, 17380, 48635, 2721, 58256, 20035, 34423, 47165, + 9153, 51598, 18337, 35803, 60330, 874, 30095, 47895, 18472, 57448, 9451, +33294, 46844, 20577, 64416, 6996, 40008, 27147, 52970, 8900, 34421, 62383, +19526, 43286, 2295, 52684, 28594, 15459, 57636, 37100, 8220, 47540, 22948, +61493, 12354, 39665, 26190, 51768, 5796, 32791, 55850, 13733, 43035, 23336, +64628, 3489, 31406, 46891, 17601, 57882, 7911, 38528, 26720, 48855, 11520, +56141, 24324, 41771, 1517, 59643, 21648, 38849, 13405, 50844, 34842, 6560, +57311, 20361, 46665, 35835, 9405, 60049, 18198, 35246, 53981, 2298, 29244, +47303, 20439, 56243, 11251, 39133, 26758, 65087, 5462, 32392, 52084, 10712, +39785, 26455, 61838, 14219, 36001, 50868, 5022, 31040, 58740, 17667, 45842, + 2214, 32562, 61054, 20676, 40999, 8326, 54923, 25735, 38735, 10854, 61737, +22548, 45576, 4820, 36765, 59938, 15540, 29453, 53539, 8567, 45306, 27552, +14941, 59490, 36531, 4988, 52589, 23278, 46650, 14454, 32826, 60633, 6668, +43399, 22503, 56104, 9797, 32871, 47836, 19295, 64059, 4898, 39409, 26381, +51216, 10867, 33682, 62867, 14801, 44067, 35504, 4234, 53891, 23562, 42275, +12637, 59460, 34672, 4886, 51720, 25416, 44720, 11252, 32037, 63182, 20257, +48766, 7513, 40581, 26055, 60517, 12811, 49522, 22738, 41175, 2489, 64755, +31084, 16790, 50101, 36134, 10991, 56688, 23399, 43865, 953, 32085, 60140, +16368, 43845, 28010, 4075, 58299, 38004, 15377, 30771, 54471, 10901, 43480, +23287, 60113, 7437, 35730, 50692, 14495, 31094, 56512, 8302, 47225, 24969, +40256, 12215, 64686, 26546, 39395, 3072, 51441, 17910, 32487, 61263, 9370, +42028, 24343, 53333, 13792, 32806, 56670, 4601, 41731, 25407, 60262, 12484, +39538, 24344, 56237, 3999, 47320, 20012, 36357, 65391, 82, 31273, 52482, +18955, 43920, 4308, 61439, 26399, 39659, 12344, 54258, 21565, 38690, 5248, +48400, 24111, 56559, 10564, 39630, 21415, 58620, 5896, 33700, 50810, 14350, +41230, 21632, 24289, 46025, 11328, 40203, 22888, 64387, 1077, 43332, 26892, +52016, 13732, 34729, 54330, 3509, 42949, 25103, 60687, 13563, 41185, 22226, +57274, 7406, 39760, 26391, 61835, 11058, 43339, 21325, 52949, 1744, 33899, +58027, 13270, 42462, 24591, 60063, 3209, 40091, 22121, 52933, 14386, 33581, +57217, 1344, 46491, 28064, 16485, 59020, 36104, 8522, 47937, 24234, 61449, +12623, 41178, 22213, 55851, 4360, 32976, 48087, 18366, 58645, 6708, 41892, +25703, 55803, 11460, 41207, 22029, 62661, 548, 33684, 46268, 18672, 57932, +10495, 39287, 27143, 53522, 2476, 35008, 59033, 16450, 47725, 28836, 5697, +57339, 36728, 19806, 52871, 11436, 43456, 25698, 63673, 8332, 33183, 54231, +20046, 45778, 10400, 41544, 24710, 58269, 2528, 41484, 23333, 49122, 10417, +62926, 21106, 40873, 603, 54345, 26808, 38741, 10416, 61317, 18185, 31878, +52500, 2172, 45113, 17600, 31814, 64812, 11642, 43130, 24098, 57972, 77, +36819, 50243, 15565, 29693, 55694, 4944, 44022, 21140, 31113, 56897, 8832, +49420, 18909, 33242, 45048, 618, 63706, 17187, 33235, 44143, 11141, 55203, +25141, 38830, 8320, 46894, 21681, 60614, 12359, 41899, 26318, 54479, 4190, +30786, 45200, 17894, 59104, 114, 35072, 49597, 15363, 30263, 60977, 4903, +46922, 27687, 15244, 55544, 38023, 7050, 33083, 57930, 12948, 43731, 24827, +50157, 4782, 32627, 58538, 19946, 43411, 764, 54660, 26664, 39571, 7998, +60884, 21866, 48162, 14434, 35369, 64844, 5792, 42503, 24550, 50754, 137, +31448, 60878, 16792, 44020, 27567, 3213, 52254, 37837, 19281, 63598, 5193, +33237, 47874, 19008, 53320, 11522, 39814, 26110, 59019, 8236, 47414, 23559, +40821, 2029, 57346, 19315, 33429, 51115, 9348, 42126, 25371, 64157, 13951, +31145, 44453, 4283, 54880, 25721, 40809, 11371, 61832, 22093, 45355, 7576, +35212, 55758, 15100, 44209, 28885, 1967, 59512, 34935, 19090, 51169, 5203, +42154, 17750, 58485, 30264, 9717, 49343, 37128, 20362, 62880, 3745, 44863, +29249, 14660, 53376, 35649, 956, 59655, 23638, 46378, 11370, 38992, 21149, +60983, 7926, 48319, 26573, 40857, 11766, 49238, 22491, 62321, 701, 32735, +45325, 19950, 53930, 6358, 39306, 26757, 65430, 14514, 32396, 52723, 5409, +43201, 25018, 62466, 12789, 39678, 22861, 50458, 4616, 31156, 64527, 14132, +41926, 23368, 50752, 7485, 33933, 60444, 17795, 45597, 1182, 30520, 55187, +14815, 43183, 22284, 59499, 3134, 30436, 48715, 18956, 64122, 8342, 39944, +25401, 48672, 11871, 57074, 22211, 42310, 5881, 53235, 30541, 15419, 65483, +35283, 1687, 49903, 18641, 31691, 57594, 11960, 47380, 25460, 38912, 266, +64017, 19274, 31555, 47521, 11285, 56769, 17816, 31309, 44628, 1818, 62608, +27833, 12326, 51241, 37999, 16910, 28965, 54294, 2744, 42152, 23049, 59252, +14143, 46445, 31095, 1415, 54039, 36577, 18590, 60755, 8582, 30412, 48892, +18460, 56241, 498, 32128, 45910, 17580, 62486, 14003, 37373, 50260, 3460, +28942, 56322, 14904, 44176, 34696, 823, 61996, 18508, 32808, 47916, 6655, +55755, 26576, 38578, 9722, 58368, 19435, 48088, 30242, 3268, 63633, 37496, +14264, 53614, 22556, 46888, 7561, 31820, 61671, 16984, 48053, 27606, 2429, +62668, 37287, 14718, 50053, 27631, 4839, 65278, 37452, 20835, 45602, 1728, +61276, 18436, 32213, 52793, 6208, 43403, 23428, 58430, 11515, 29973, 54498, +20816, 45943, 353, 35266, 62982, 18273, 42808, 8199, 50996, 21060, 35048, +63795, 1480, 47678, 17670, 35381, 51965, 9757, 29626, 57798, 13463, 48398, +24030, 40528, 8396, 59968, 22389, 38254, 10455, 55198, 27284, 43752, 6934, +64590, 25631, 40650, 11591, 59572, 19423, 32830, 51769, 428, 45857, 28423, +17018, 65175, 37004, 8523, 54220, 61952, 36629, 17999, 50805, 6309, 33842, +57585, 17500, 45814, 8727, 31768, 62777, 17191, 40920, 11762, 50564, 31361, + 5014, 58942, 36796, 17522, 47516, 514, 54187, 22988, 38441, 13600, 64582, +26977, 44328, 5279, 50474, 17959, 31425, 55466, 10829, 45276, 17555, 36034, +61707, 5048, 30081, 51445, 12317, 40898, 23973, 63641, 4138, 39247, 18953, +54044, 29039, 305, 50057, 37231, 19286, 64221, 11443, 40393, 26946, 51333, + 2223, 34441, 61785, 14444, 44671, 28215, 8464, 52715, 37317, 16875, 56877, +28881, 5818, 49239, 35320, 20489, 63511, 11589, 43016, 22867, 50328, 8376, +33645, 64632, 18099, 44660, 3484, 31152, 60596, 13321, 41714, 23498, 50338, + 356, 30524, 58115, 17581, 47986, 4380, 38956, 26500, 61070, 13178, 38411, +21620, 47639, 7423, 55780, 27051, 38824, 12945, 64638, 24793, 43992, 6130, +50840, 19926, 29449, 58358, 9715, 42006, 23006, 55163, 5391, 35508, 51394, +14894, 29756, 61309, 6892, 47276, 24493, 40225, 10820, 60057, 19238, 33600, +46111, 3466, 63092, 25672, 40193, 11299, 54595, 27001, 40180, 5691, 58460, +19226, 47684, 29800, 2574, 61775, 35872, 15577, 53281, 29167, 6233, 49850, +36162, 19036, 64956, 10170, 35091, 47552, 21066, 56362, 6280, 40139, 26211, +51511, 10058, 34802, 58499, 19585, 45125, 3808, 29944, 63943, 16265, 47172, +28446, 2513, 53063, 35898, 16048, 63248, 29186, 8585, 49299, 35913, 17517, +62477, 11699, 43214, 26015, 56668, 2851, 31812, 46593, 19169, 56277, 10874, +34087, 52894, 20796, 45820, 6656, 37649, 54802, 13833, 31886, 58090, 9579, +44722, 27783, 16385, 59711, 38160, 609, 29370, 55882, 17803, 42020, 3815, +62081, 26730, 48754, 13154, 35410, 53238, 6479, 28448, 61333, 20869, 45574, + 1, 33907, 57216, 18978, 48393, 8903, 33716, 62759, 17653, 44147, 2304, +33530, 58326, 16185, 48251, 27650, 4153, 53495, 37736, 16589, 63905, 27498, +10124, 49466, 36793, 20578, 54927, 316, 43075, 26385, 59903, 13394, 32495, +51915, 7201, 43779, 34667, 19928, 64781, 10598, 48818, 26898, 40690, 4766, +58207, 30402, 16426, 50919, 35686, 2536, 63914, 20042, 35367, 50231, 5162, +29805, 57355, 18586, 42795, 9198, 61499, 29265, 16354, 49894, 36575, 2749, +56954, 22076, 46754, 11398, 30573, 59013, 1282, 41718, 25778, 55195, 10383, +38693, 21053, 58036, 3389, 43773, 26723, 52539, 9937, 31838, 62896, 13274, +42454, 24391, 52549, 6517, 33793, 57313, 17888, 46415, 10348, 39083, 26965, +54593, 146, 32440, 46712, 16037, 63005, 29491, 4012, 49932, 37301, 18201, +58174, 11035, 41964, 26214, 48191, 8954, 54604, 24005, 39173, 3764, 60509, +17875, 33164, 52006, 9842, 43048, 23992, 61644, 3238, 40405, 21722, 52072, + 8111, 36852, 55235, 15313, 29871, 45611, 6009, 63429, 24112, 40970, 10464, +56828, 18511, 35703, 50219, 7130, 28880, 64389, 20323, 42910, 10459, 50789, +21551, 32755, 57911, 5512, 44839, 20568, 35927, 58976, 8524, 29356, 52456, +19300, 45134, 6528, 32641, 64847, 19037, 49225, 8637, 39462, 26709, 57537, +11870, 43274, 21443, 51327, 5065, 33494, 62606, 15018, 44322, 27506, 7896, +51880, 35172, 17757, 57968, 5039, 37907, 49966, 13671, 28734, 56350, 10197, +42247, 23669, 51239, 5686, 35133, 57644, 16725, 29464, 49318, 10052, 34551, +55782, 13571, 42165, 24579, 58242, 4303, 38890, 22045, 50146, 14645, 33764, +63522, 5490, 44317, 33599, 17129, 52339, 9693, 31858, 58798, 20331, 46373, + 3867, 32063, 55170, 15068, 44810, 27914, 9027, 61684, 37419, 18941, 45893, + 5885, 58733, 27064, 38597, 2360, 53939, 21158, 44254, 13828, 62413, 25992, +41310, 1270, 51206, 17734, 31542, 55691, 3734, 44623, 28260, 15450, 61626, +38055, 7678, 30519, 55573, 15125, 47839, 27974, 2271, 19626, 42389, 8006, +52714, 21101, 31459, 60973, 5295, 43954, 20701, 34197, 56577, 1590, 48680, +19493, 35679, 65513, 7883, 29073, 52703, 19237, 42662, 10475, 60143, 26581, +41206, 7007, 56696, 24096, 39845, 10073, 53366, 19779, 33488, 64094, 931, +47794, 25452, 39330, 9301, 58057, 21110, 48038, 15077, 34223, 55729, 6643, +42446, 25928, 59830, 10016, 46920, 17061, 32870, 56216, 5455, 42728, 24000, +60293, 9185, 30986, 46678, 16267, 53654, 29559, 4006, 64722, 36194, 15653, +49596, 27609, 1904, 61049, 37844, 14791, 50371, 28306, 4176, 59465, 38051, +14438, 29337, 54873, 1102, 42848, 24570, 56492, 14551, 33253, 51842, 6998, +43751, 21953, 64072, 14173, 34497, 53587, 6040, 44399, 32234, 19273, 62253, + 9671, 49488, 27118, 40193, 3540, 52222, 30123, 15997, 59559, 35503, 1916, +49395, 29531, 16601, 60605, 37772, 4182, 46783, 24535, 62646, 12015, 38874, +26908, 48912, 3114, 58816, 19055, 34299, 44537, 12984, 64004, 29275, 1515, +50582, 37683, 12940, 55227, 23689, 42128, 4628, 60453, 21466, 38755, 14128, +52206, 32545, 7664, 65281, 36625, 20739, 50341, 11722, 42847, 23434, 55545, + 1564, 32852, 62295, 14347, 43220, 24863, 51879, 3098, 31529, 59591, 12324, +44533, 28553, 15908, 63316, 38066, 1683, 31020, 55208, 13533, 48791, 24523, +41025, 8171, 60645, 22141, 39336, 11573, 55150, 27006, 38847, 4915, 57337, +20476, 33714, 50782, 1732, 41730, 22587, 60051, 13131, 34301, 53674, 7452, +44009, 27295, 16022, 59388, 38169, 4052, 28697, 64311, 16498, 48117, 27379, + 1727, 61975, 37410, 20268, 51404, 5664, 33677, 48556, 20887, 65366, 9832, +32977, 46256, 20848, 54661, 5501, 38941, 22386, 63926, 14163, 37345, 50601, + 7619, 31048, 55272, 17963, 41236, 11184, 59885, 26868, 39169, 3541, 53459, +22582, 48363, 13086, 31440, 65152, 10264, 42427, 23531, 51506, 5787, 36005, +57846, 14469, 29838, 46740, 7511, 61343, 24392, 40159, 12103, 56354, 22088, +46233, 4928, 29507, 62047, 16695, 45973, 28036, 1996, 57085, 37990, 16003, +30839, 55288, 7714, 49161, 22594, 41370, 11093, 60525, 25159, 40020, 6801, +52385, 17297, 33814, 55431, 12517, 39491, 24869, 59263, 3716, 33187, 51279, +13772, 42515, 25099, 63471, 7710, 33858, 53161, 19398, 45386, 14569, 33807, +63236, 6897, 43471, 24149, 54069, 12391, 39953, 21903, 61407, 661, 34536, +46850, 18402, 56337, 4214, 39724, 27046, 48784, 14115, 64627, 35041, 5354, +44649, 24885, 61429, 11549, 41471, 21414, 58213, 6318, 38750, 24263, 52629, +13128, 35621, 61906, 1025, 29994, 46094, 19768, 59276, 7292, 41092, 25461, +64329, 13199, 43649, 23385, 54038, 4916, 39447, 21432, 57384, 12988, 38418, +27102, 48295, 10497, 65055, 24519, 40299, 4155, 59742, 20408, 47847, 31377, + 576, 52972, 36899, 13710, 61603, 23534, 44210, 3580, 32901, 55890, 15260, +47555, 28449, 1964, 61884, 37243, 17239, 53266, 11967, 42592, 26410, 63623, + 2832, 40713, 22657, 55006, 12040, 40053, 25706, 58547, 1457, 42692, 22834, +52447, 13603, 33609, 64081, 3035, 44534, 30343, 13438, 54741, 24294, 41781, + 321, 61247, 20148, 37896, 49493, 9018, 29166, 65200, 20063, 46103, 1396, +32703, 60700, 16681, 45919, 28478, 8138, 64185, 36837, 19669, 53717, 139, +42198, 23091, 62378, 6799, 32715, 48090, 17847, 54745, 9268, 41201, 27010, +61829, 1009, 30596, 53887, 13899, 48182, 25646, 40439, 3254, 65074, 25021, +39582, 12388, 56126, 24073, 38745, 6809, 60069, 19366, 31837, 51576, 2982, +43508, 25813, 64405, 14223, 34022, 50871, 7774, 43289, 24972, 60501, 11293, +38891, 21792, 56447, 6356, 34814, 46596, 20239, 63323, 9286, 34070, 52326, +13450, 41401, 25244, 58319, 5082, 40389, 22839, 52145, 10372, 33213, 56795, +38949, 12345, 59119, 26431, 47137, 134, 37512, 54442, 14964, 29963, 62263, + 9088, 46829, 24866, 39632, 12216, 55912, 23558, 47208, 3386, 34020, 63265, +15768, 45607, 29718, 2132, 51600, 35443, 16438, 62119, 29264, 4103, 49367, +35775, 14293, 56182, 23042, 43703, 8050, 62556, 26973, 41777, 1949, 54408, +21960, 41108, 13249, 65397, 23479, 38431, 2635, 53118, 26652, 41418, 12144, +62985, 20430, 34346, 48334, 1416, 54459, 23200, 39725, 12024, 59282, 26161, +39475, 6985, 51697, 19874, 33086, 55905, 11986, 43208, 24165, 65521, 6845, +33848, 52824, 17093, 44948, 27598, 7835, 60871, 37339, 19663, 45601, 10841, +62662, 23269, 38676, 2193, 54435, 26772, 42123, 10087, 56926, 28288, 16181, +50463, 36834, 1269, 59199, 24133, 45277, 14851, 34151, 63216, 6421, 42792, +23814, 56613, 11585, 40224, 21711, 53411, 7855, 35841, 57648, 14993, 30198, +50139, 1069, 42533, 22195, 65455, 14190, 30618, 46666, 7698, 53245, 27958, +16439, 57262, 36351, 5675, 49492, 27794, 15858, 62045, 36727, 9452, 53485, +23038, 47382, 1209, 30026, 57811, 15405, 45033, 27667, 5003, 60340, 34642, +18097, 51498, 7530, 43833, 25941, 58775, 12143, 41048, 21471, 55118, 5934, +34513, 47774, 18877, 61560, 7829, 41396, 25295, 52842, 11283, 41150, 21587, +65253, 4197, 30804, 51507, 14345, 35131, 56578, 265, 47708, 23672, 42314, +12542, 60391, 21332, 41867, 9578, 54000, 28943, 16188, 65420, 37020, 4486, +49646, 28185, 16703, 51674, 31363, 1313, 62713, 35073, 19932, 50365, 7193, +34254, 56263, 15040, 44226, 29359, 8169, 53879, 35766, 18132, 60013, 12794, +43770, 30110, 2342, 57560, 37376, 17315, 44896, 11072, 55989, 27097, 40375, + 1478, 58173, 27803, 16787, 49450, 37126, 4536, 64801, 23693, 44885, 13395, +32373, 56389, 8042, 44695, 27591, 17001, 59638, 37714, 708, 54070, 25752, +41337, 12816, 48941, 22225, 63243, 1641, 34505, 44315, 15227, 51489, 28172, + 3382, 65309, 38215, 15037, 31393, 49138, 7933, 54323, 23750, 39863, 12003, +64211, 22246, 47060, 3797, 34339, 59074, 14696, 44872, 29076, 123, 54242, +36119, 13925, 62573, 25856, 42524, 1801, 48300, 23334, 64919, 8218, 41023, +26424, 53277, 11918, 38731, 21521, 57909, 396, 44571, 29879, 13539, 60440, +37722, 4098, 51152, 28193, 16445, 59806, 37940, 4941, 30691, 56738, 14364, +48689, 24945, 39421, 8414, 63726, 21902, 49300, 11742, 38336, 23118, 58165, + 1625, 47431, 29819, 15992, 52358, 36667, 3400, 56537, 24839, 45230, 14596, +33350, 64751, 7634, 44629, 27841, 16370, 55746, 37598, 4585, 50775, 28523, +16557, 56962, 36316, 1975, 49448, 29625, 16009, 61187, 36701, 8418, 48773, +24864, 62991, 877, 41806, 17841, 51309, 30224, 6806, 56223, 35958, 18801, +50416, 9044, 34109, 57843, 16011, 45056, 28553, 6412, 59514, 36886, 18938, +48750, 10102, 65121, 26315, 40122, 8164, 51188, 19455, 33272, 59982, 5985, +47586, 25274, 39328, 10456, 57050, 18691, 33752, 47724, 5204, 61368, 18572, +33769, 47421, 7935, 56450, 24593, 39886, 11173, 59164, 21718, 47669, 4582, +33872, 60379, 15480, 45514, 28389, 11075, 52863, 35955, 17149, 57334, 4481, +42300, 26826, 54919, 12526, 41301, 23820, 56853, 3591, 39698, 21847, 50586, +12901, 32887, 58267, 9189, 46289, 27361, 16405, 59964, 38214, 2838, 30627, +56906, 20011, 43622, 11107, 51063, 34809, 17682, 57744, 6967, 42525, 21989, +60655, 10133, 34208, 51436, 17912, 43509, 1162, 54068, 26993, 40893, 8426, +62007, 24497, 38936, 12020, 54839, 22304, 42423, 538, 57382, 28816, 15856, +52231, 37951, 3542, 30075, 64967, 13497, 43216, 24241, 53403, 5377, 30069, +59914, 16106, 44987, 35507, 917, 49130, 21793, 62387, 12821, 34413, 45057, + 2991, 63974, 24712, 55910, 6899, 45215, 18240, 35605, 64756, 10719, 28111, +50079, 19656, 41740, 2913, 53562, 33369, 17312, 61193, 6150, 44561, 20111, +32308, 57148, 8717, 49186, 23527, 38747, 12876, 61077, 25890, 43104, 6139, +54742, 22110, 40669, 12327, 60230, 27071, 38381, 3342, 51170, 18074, 33214, +59279, 11741, 48569, 25220, 38681, 4432, 56316, 26924, 43989, 10484, 60883, +17374, 35510, 50972, 4901, 29676, 58824, 18228, 44914, 9844, 32277, 55717, +19986, 42148, 2929, 62765, 24639, 48554, 10350, 39435, 21796, 57858, 145, +31586, 51387, 13269, 42402, 22330, 62082, 2737, 31991, 47854, 15310, 50976, +28490, 4013, 57045, 35456, 17275, 50037, 9433, 32665, 60153, 20668, 47293, + 4253, 33151, 65077, 14379, 43938, 29483, 5312, 57716, 36615, 10249, 51517, +22223, 47144, 13716, 30984, 64392, 243, 43704, 23154, 51479, 13212, 33367, +61133, 6341, 45178, 28105, 16820, 54018, 37417, 9004, 56327, 23964, 43971, + 4038, 34711, 63310, 20419, 42733, 9974, 51425, 21255, 32951, 58727, 2880, +46319, 25209, 40677, 11765, 64552, 18289, 36646, 50604, 8705, 31105, 54940, +17299, 42418, 354, 63228, 27241, 38532, 10641, 54318, 22252, 38356, 2853, +64264, 27113, 42824, 13760, 53334, 29085, 817, 57106, 36950, 20334, 49640, + 5552, 32910, 59010, 14974, 45572, 23542, 40430, 6962, 62301, 29067, 16500, +50059, 34634, 7728, 64100, 26517, 48472, 2733, 39562, 21904, 52229, 6395, +32867, 58656, 14033, 45522, 27304, 8190, 54229, 36917, 18461, 57194, 11641, +46013, 25996, 39374, 4830, 61199, 21673, 49065, 11740, 41117, 26157, 63660, + 3143, 32215, 46374, 16704, 51935, 27349, 8840, 62461, 36218, 20249, 50311, + 5025, 33082, 63113, 14984, 46575, 29643, 8108, 60787, 35043, 16193, 50136, +28724, 1797, 53747, 37221, 20287, 61637, 6020, 36656, 49936, 14839, 30707, +62386, 9611, 47132, 24175, 38810, 6844, 54676, 19767, 31214, 60487, 5446, +45959, 29268, 16957, 53841, 37405, 10512, 59644, 24475, 47136, 1079, 35174, +56022, 15031, 44662, 28683, 5672, 60204, 36820, 16556, 50987, 27799, 8983, +63717, 37437, 18991, 49607, 5778, 30902, 58429, 17077, 41369, 10450, 51804, +20715, 34540, 60291, 2995, 43428, 23087, 55935, 9692, 32712, 47373, 16606, +64328, 27727, 8660, 49665, 35328, 18416, 55774, 1789, 44787, 34749, 20351, +65381, 9643, 42413, 22551, 52297, 2599, 33816, 55226, 18908, 47842, 4965, +40532, 27288, 62544, 12613, 39913, 24119, 48887, 7740, 62092, 22393, 38846, +11957, 55091, 26854, 49023, 2428, 40217, 22422, 59839, 11337, 31432, 47851, +20565, 63563, 6716, 32752, 44705, 14714, 53010, 28240, 11799, 58891, 35111, + 5486, 46356, 26719, 54454, 10899, 38248, 22754, 58637, 13713, 34462, 47435, + 2314, 62277, 22826, 41446, 12098, 48962, 25937, 63912, 3064, 39997, 21877, +54051, 13246, 45026, 30747, 989, 57600, 35940, 14543, 45448, 23828, 55279, + 3206, 39383, 22041, 62669, 14136, 35161, 51988, 106, 30216, 65360, 12221, +44048, 28170, 15991, 54084, 38013, 2609, 30969, 62766, 16549, 45177, 28329, + 6357, 52369, 37647, 20479, 56093, 8073, 42182, 24977, 64432, 2156, 33991, +47587, 20516, 61871, 9973, 39004, 25155, 53009, 7089, 33428, 63722, 14287, +43571, 23078, 52538, 2022, 31162, 62711, 16042, 44314, 28401, 6301, 51808, +37194, 18703, 64831, 9811, 48684, 26036, 39600, 5167, 62616, 19740, 32564, +52976, 2195, 45397, 28497, 15876, 57036, 38009, 6062, 29792, 62710, 20202, +48180, 10679, 34609, 58443, 17840, 43097, 5105, 52034, 29666, 16626, 63023, +37138, 6745, 49570, 24316, 43520, 11627, 58388, 19021, 31539, 50753, 1862, +35505, 48070, 19244, 56007, 9014, 40045, 25847, 60853, 14122, 31668, 53873, + 4572, 41674, 25487, 51203, 14477, 32075, 1974, 30122, 52423, 20615, 42657, + 4441, 60226, 29525, 14591, 51612, 37293, 7753, 58472, 25228, 41462, 13117, +48996, 22779, 64913, 866, 39649, 27062, 53491, 5077, 43712, 21572, 58437, + 9745, 36643, 50120, 15184, 30092, 63453, 43, 43322, 24293, 54118, 11032, +39038, 21556, 64658, 5526, 31246, 45608, 15589, 53158, 29554, 8170, 63259, +35714, 19667, 49417, 680, 31493, 55086, 21034, 44007, 8463, 33813, 64113, +17218, 49278, 5960, 38274, 27214, 59704, 14620, 32426, 46442, 5300, 52432, +29287, 16801, 63702, 36360, 7587, 48227, 26482, 57054, 11132, 41139, 21434, +53954, 6045, 34964, 58597, 20210, 42203, 11402, 64513, 26207, 40789, 652, +55580, 18205, 44920, 30042, 6796, 52119, 36276, 18931, 61532, 11587, 45657, +20806, 31323, 55341, 2882, 41709, 25476, 58549, 8838, 35712, 49381, 16692, +28710, 55750, 3702, 41930, 23080, 62249, 13804, 35432, 50382, 2424, 31399, +60310, 12321, 45265, 28316, 16138, 58426, 37977, 504, 30702, 55602, 17561, +43723, 7681, 62446, 19788, 36030, 51227, 6172, 29087, 56666, 20498, 44429, + 3261, 33825, 61269, 19681, 48703, 12892, 41866, 26383, 57236, 6672, 33965, +47063, 17499, 60196, 11463, 39901, 25247, 50888, 5079, 32305, 63027, 16314, +44674, 27662, 9023, 61326, 36499, 17948, 53775, 2078, 30175, 48539, 12696, +58068, 24181, 39955, 5480, 55406, 21422, 39748, 12323, 56809, 24958, 46340, + 9019, 35668, 63371, 16899, 29868, 49368, 647, 37806, 61401, 15551, 30670, +47732, 3262, 64772, 22039, 41030, 10177, 47862, 27211, 57823, 355, 38332, +22670, 54989, 12198, 48231, 28342, 6857, 59345, 37659, 14605, 54326, 29006, + 909, 49276, 35108, 18714, 58951, 10813, 42103, 23057, 54446, 3340, 40160, +24094, 56694, 12772, 39726, 21755, 63516, 9267, 35539, 49285, 16345, 28982, +58613, 2524, 44285, 20589, 32991, 57067, 3928, 49003, 18106, 33390, 64082, + 9437, 43177, 23236, 50584, 13263, 31667, 57372, 2656, 44883, 20207, 32156, +61959, 8777, 43839, 20972, 31268, 63283, 6898, 49451, 19588, 33162, 43942, + 2277, 56793, 17706, 33625, 46252, 11597, 61102, 20862, 32796, 52821, 4544, +46405, 19279, 31063, 56879, 12886, 44915, 27884, 6520, 61690, 35995, 16040, +50531, 29120, 4778, 55303, 37069, 19573, 46039, 7171, 62279, 24739, 41142, +11134, 53230, 17808, 32769, 58862, 6458, 46202, 28067, 16723, 57033, 38139, + 7512, 30650, 60074, 17523, 43745, 9571, 53555, 20897, 32173, 56286, 830, +46163, 17717, 33639, 59311, 4899, 45859, 19571, 33786, 62822, 8822, 49330, +18917, 33735, 45381, 468, 57980, 25250, 38764, 9630, 48532, 21703, 62537, + 3066, 41243, 24341, 55657, 13601, 39211, 20880, 64503, 3660, 43825, 26637, +52295, 7737, 32657, 60426, 14960, 45440, 24879, 38893, 4986, 55796, 18157, +33462, 46243, 7939, 61148, 24950, 39187, 11448, 49291, 21590, 62264, 5135, +41749, 25980, 48527, 12392, 58793, 29768, 6943, 50297, 37198, 20252, 46599, +10041, 57799, 26277, 40307, 4156, 49311, 21574, 55592, 10515, 40990, 23999, +58114, 13122, 48591, 30478, 1109, 63400, 35230, 18105, 50916, 10716, 32055, +48530, 17619, 58468, 5723, 31473, 44933, 16094, 50774, 28492, 610, 57815, +36843, 19064, 47429, 8349, 59660, 26178, 40941, 11650, 55239, 22575, 47695, + 3830, 33131, 61419, 14936, 45589, 28436, 789, 55699, 36943, 17070, 46419, +11678, 59898, 26807, 38664, 7471, 48623, 23927, 64074, 11748, 41112, 22737, +55536, 4325, 33604, 52822, 17055, 44656, 1646, 30380, 65441, 21171, 44565, + 9344, 35417, 54251, 15089, 30560, 60637, 2601, 41585, 22588, 52956, 9573, +34203, 63646, 15723, 44199, 28661, 6245, 57819, 34280, 17567, 51124, 2586, +46381, 34859, 20487, 61524, 9387, 45886, 18345, 37140, 63382, 55143, 28615, + 8408, 49912, 37155, 12520, 56973, 21381, 32643, 47588, 1351, 62955, 18138, +31295, 45203, 5614, 55181, 25811, 38488, 9792, 59859, 21018, 48858, 14789, +35771, 62658, 2676, 31938, 52415, 19073, 46041, 6494, 33513, 57908, 20353, +49184, 7839, 41317, 26557, 55880, 12973, 42960, 23654, 58773, 1251, 39186, +21463, 51676, 14417, 31573, 59635, 6574, 44942, 27808, 15289, 62315, 37041, + 2778, 46757, 25770, 57329, 12801, 40892, 21251, 54245, 933, 43122, 25553, +61692, 12291, 40198, 22915, 54099, 3239, 32546, 46168, 13919, 60493, 23123, +39230, 1290, 49067, 26007, 63014, 13796, 32438, 44344, 3370, 53261, 18419, +32361, 46605, 7958, 58335, 25578, 38683, 12879, 62418, 22989, 49151, 1800, +39275, 26912, 57126, 8446, 48118, 17996, 37270, 60848, 12668, 28793, 52931, + 4888, 43152, 22016, 63616, 14812, 35879, 50826, 7114, 29703, 57230, 18478, +47880, 10449, 38977, 26554, 64969, 5542, 33166, 52283, 19164, 48093, 8433, +41063, 25732, 60911, 12784, 39897, 23877, 54824, 2127, 45845, 17085, 32454, +63773, 7493, 49028, 24516, 39326, 11438, 59316, 23585, 38989, 4459, 53735, +18595, 32188, 65057, 2014, 43386, 23239, 52977, 8645, 34043, 59055, 14090, +43076, 22827, 54784, 3638, 33696, 47186, 13092, 56814, 24801, 38943, 10489, +52351, 19009, 33673, 64603, 3555, 46739, 28762, 15708, 52224, 35361, 1172, +62123, 29409, 14949, 50233, 37622, 4819, 57880, 27401, 14700, 53287, 38225, + 7494, 28928, 59822, 19595, 43584, 12250, 54670, 26702, 38300, 5283, 62221, +21217, 48667, 13161, 40095, 25855, 65120, 4193, 32730, 45136, 16086, 61018, +27817, 9755, 51298, 37931, 20490, 64446, 6415, 45104, 29026, 15865, 52739, +35753, 8932, 60258, 26217, 43470, 270, 51834, 17384, 31709, 59149, 5180, +42593, 23473, 52650, 12985, 35040, 64589, 7787, 47502, 25459, 40338, 11980, +55892, 24812, 39455, 420, 60054, 17595, 33618, 52390, 7159, 42378, 22714, +58928, 11755, 29725, 51444, 17809, 47841, 4050, 33578, 57688, 13758, 42001, +23940, 55060, 8467, 31403, 48407, 20338, 65254, 3153, 40969, 24938, 55184, + 9863, 39340, 23934, 58892, 863, 38422, 22547, 64528, 9292, 30580, 48184, +18184, 54162, 2152, 39370, 25884, 63130, 13032, 44423, 28667, 973, 58658, +35935, 14052, 51716, 26159, 46449, 3486, 30230, 61581, 15204, 44447, 27330, + 292, 64274, 35941, 13805, 50957, 24513, 42053, 2846, 63317, 19232, 34242, +51264, 7141, 42676, 25104, 65044, 9805, 39418, 22046, 53272, 13258, 31200, +56878, 5768, 44135, 27540, 16769, 54119, 37142, 10547, 65375, 23149, 42608, + 4863, 51638, 29965, 16323, 60900, 36028, 1303, 50573, 26906, 43157, 10098, +58091, 22366, 40167, 13134, 55673, 28884, 172, 50112, 36455, 9979, 65321, +22149, 48243, 13782, 30189, 59181, 1496, 34950, 52496, 16598, 44597, 28056, + 7051, 56137, 38019, 16211, 32145, 63723, 1866, 41528, 22727, 53639, 13721, +33340, 61103, 5758, 45008, 28747, 15753, 60139, 36744, 8593, 46035, 25949, +64286, 2102, 32880, 44138, 20107, 52918, 8706, 33109, 60082, 14225, 42964, +25312, 55590, 3382, 38686, 24376, 61023, 12626, 41377, 22312, 53840, 6664, +34444, 63065, 15177, 45295, 27993, 4208, 51683, 35682, 15041, 65517, 28874, + 5935, 50198, 36261, 19844, 58118, 12351, 41981, 26056, 52091, 7482, 31016, +61052, 18483, 44183, 3418, 31195, 54750, 14976, 41988, 22220, 59343, 198, +31863, 50989, 17602, 45354, 10138, 31158, 60710, 20934, 48758, 7166, 33079, +56934, 13794, 48066, 24447, 40961, 4454, 59083, 18458, 36234, 49897, 8058, +29213, 61818, 16665, 45899, 27592, 299, 59437, 37886, 19690, 47322, 8150, +65137, 26291, 41053, 12408, 54778, 26165, 40300, 4905, 57789, 23220, 43498, +13417, 49270, 692, 33524, 62551, 19104, 44404, 6544, 34407, 60731, 20471, +42205, 9182, 53787, 26093, 40189, 12776, 64159, 23720, 48261, 3788, 40686, +22456, 57557, 13259, 30192, 44416, 7624, 55568, 24632, 40168, 12170, 64385, +22673, 44777, 1897, 37323, 61249, 15214, 30044, 46054, 4030, 62373, 25313, +40504, 10983, 48691, 22875, 64941, 3552, 33874, 46312, 12589, 56868, 23864, +41319, 8141, 52624, 19271, 31208, 61195, 4433, 48445, 23965, 39237, 11118, +65208, 21935, 48769, 7264, 33637, 58413, 17884, 41832, 10807, 55653, 27100, +38559, 4918, 64224, 18874, 34121, 46246, 10225, 55146, 22464, 39766, 7375, +61425, 24878, 48424, 12343, 39806, 23902, 63815, 3074, 48438, 21932, 40465, +11850, 55100, 25499, 42983, 6526, 60129, 17016, 33779, 49599, 807, 30119, +65227, 18968, 47241, 10557, 39588, 26545, 53920, 1973, 32317, 59877, 12757, +44410, 24924, 40524, 951, 59183, 21541, 43766, 13187, 55069, 25204, 41299, + 2704, 62553, 29339, 15172, 53673, 36803, 4268, 48428, 26237, 59944, 12118, +39086, 22717, 48427, 10277, 57270, 26778, 41165, 835, 52020, 18845, 32241, +62450, 10212, 41521, 25677, 50747, 7333, 38505, 21417, 58227, 12533, 48787, +26428, 39618, 1371, 61978, 17755, 36199, 50352, 8201, 29585, 63873, 19058, +41997, 534, 46250, 26339, 60773, 7268, 35095, 43873, 17474, 54779, 11181, +40788, 25526, 59789, 6035, 48341, 24369, 39505, 11469, 54514, 18290, 30844, +64226, 3765, 43746, 22982, 50560, 13285, 33421, 57447, 2121, 42142, 23205, +52266, 8489, 32912, 59225, 15996, 44940, 29269, 6476, 52188, 36109, 19393, +57685, 2256, 34574, 50001, 17586, 44044, 5318, 32089, 57195, 21119, 49031, + 1836, 41229, 24984, 62002, 12551, 48260, 22074, 40853, 6223, 65527, 27190, +38563, 10975, 51054, 19278, 31533, 56199, 1288, 45197, 27793, 15325, 59479, +35860, 6263, 51491, 21875, 42004, 12505, 63661, 25874, 48045, 4304, 40455, +24323, 54507, 13567, 34045, 64907, 1463, 43069, 26202, 52945, 9429, 29888, +60651, 16284, 46397, 27845, 588, 58969, 36101, 11012, 52398, 26025, 44431, +14335, 33222, 61766, 6731, 42302, 26266, 49034, 12333, 54517, 18510, 33318, +46136, 4005, 60904, 24973, 41602, 10185, 55594, 21603, 48846, 14680, 36563, +57214, 5830, 29731, 48151, 20247, 64121, 8249, 39224, 23131, 56375, 9365, +33970, 52745, 12764, 42520, 22885, 53664, 5468, 32898, 60740, 14956, 45404, +27904, 10846, 58627, 36398, 17298, 49535, 3264, 33004, 57894, 14431, 42346, +25558, 50331, 1729, 36616, 61041, 14786, 29419, 47180, 3917, 60017, 28415, +12747, 50324, 36845, 20817, 55347, 7092, 33015, 47548, 19153, 59420, 9062, +38413, 21752, 51646, 5325, 32068, 63476, 16935, 45976, 27493, 8686, 60763, +38114, 16847, 30907, 54244, 3287, 43659, 24485, 56387, 12546, 41068, 23197, +64448, 3973, 34390, 50150, 14873, 30211, 59611, 8038, 44714, 28068, 16846, +56975, 36861, 3820, 50780, 27649, 16892, 64696, 35748, 927, 50166, 20519, +31129, 55936, 9888, 47640, 17748, 29845, 62049, 6481, 46085, 27983, 15784, +57250, 35944, 4446, 50259, 21684, 41945, 11968, 65084, 26484, 49237, 1514, +32587, 44260, 13657, 55893, 23374, 40353, 9076, 60572, 30532, 16679, 49463, +37254, 1216, 56655, 25243, 46976, 10532, 40549, 22198, 63531, 2345, 34924, +54048, 20900, 46172, 10452, 34891, 64612, 20672, 47965, 6371, 33140, 57797, +13525, 43876, 26371, 52570, 7733, 34572, 64349, 19832, 47349, 2793, 41620, +26747, 62411, 12464, 41487, 23052, 55002, 848, 38872, 26964, 63918, 11500, +43826, 20520, 51617, 33582, 5623, 56699, 36521, 14910, 49793, 28225, 4081, +55273, 36601, 14595, 45847, 23924, 58859, 1491, 38499, 17464, 52814, 29484, + 8931, 64322, 36356, 19212, 41791, 25417, 52053, 12996, 30649, 55474, 3422, +46866, 27850, 15487, 57485, 36730, 1787, 49658, 20422, 32700, 59231, 8512, +44206, 19163, 36262, 61715, 552, 33218, 52680, 18565, 46756, 11313, 32664, +60361, 5254, 48718, 29256, 16865, 56808, 35623, 9097, 50523, 20574, 32367, +55278, 5789, 47448, 17511, 35366, 57891, 8579, 29983, 51071, 13689, 42989, +22492, 61660, 1850, 39517, 27196, 50768, 14201, 34903, 58564, 9098, 45072, +28445, 16420, 55444, 38024, 3694, 29381, 60002, 20416, 47700, 1743, 34732, +53047, 20076, 43846, 6718, 59370, 25275, 39992, 12662, 52879, 29258, 4119, +58226, 36920, 16550, 50181, 28077, 1972, 60329, 36097, 17615, 49835, 9232, +32109, 57446, 16720, 46773, 29834, 4065, 63140, 37609, 21096, 53526, 9584, +42487, 25909, 54383, 13419, 32760, 59172, 4346, 43327, 24187, 51281, 14512, +36990, 63101, 6113, 30499, 49044, 17927, 53443, 9519, 38309, 27239, 64325, + 4724, 38268, 22857, 50684, 10908, 32995, 57572, 20573, 44321, 8766, 31416, +63158, 20473, 43103, 1736, 53265, 18160, 33209, 65345, 6141, 44844, 17096, +34530, 54893, 12483, 42993, 23961, 57521, 3720, 34567, 52648, 14065, 42408, +23910, 64177, 6058, 33081, 46213, 19459, 56563, 9861, 31946, 44191, 21054, +53948, 4847, 36249, 59191, 15069, 31080, 48265, 10036, 57389, 20781, 32477, +45222, 2960, 62613, 19846, 32466, 44478, 9965, 57247, 19683, 33537, 51341, + 1843, 42511, 23659, 60618, 11022, 40685, 17964, 52940, 31100, 6630, 62989, +35386, 18197, 49701, 11423, 42784, 25227, 64073, 1192, 34333, 53929, 17822, +47347, 10645, 41424, 21068, 62903, 28803, 8124, 52712, 36621, 19395, 63388, +11291, 46189, 31015, 15268, 52139, 36058, 4422, 58392, 28286, 15022, 50078, +36205, 8409, 55095, 25411, 43372, 3582, 61416, 28467, 16017, 50291, 38166, + 8664, 30970, 62949, 19328, 43861, 2888, 55098, 26940, 38698, 9001, 58484, +18616, 35845, 50125, 6561, 30001, 61226, 19558, 46790, 11336, 39689, 22487, +56684, 3554, 34491, 44559, 12868, 62198, 23653, 40049, 9209, 48806, 21895, +64105, 5157, 30726, 46565, 19178, 57179, 1600, 34190, 45209, 17342, 62410, + 5390, 34916, 43871, 14656, 57498, 21638, 38328, 7562, 47037, 27176, 65148, + 2650, 34484, 45031, 18277, 60147, 12004, 40817, 25827, 54158, 4496, 34073, +45749, 15657, 62135, 27732, 2460, 49669, 37241, 18614, 59202, 8826, 30137, +48548, 20673, 56397, 1345, 39512, 26559, 51943, 6334, 30908, 62722, 20297, +43457, 9487, 52042, 18352, 32060, 64144, 6837, 43070, 24607, 52532, 10791, +35185, 56048, 19776, 45967, 1053, 35229, 62034, 14365, 28789, 44493, 3193, +64615, 25503, 41000, 13620, 54999, 25424, 44765, 2051, 37554, 57740, 14529, +29511, 51103, 6169, 42576, 25198, 62772, 11864, 38626, 18463, 52299, 31752, + 5946, 57910, 36416, 19150, 46794, 9545, 61447, 25764, 40359, 398, 54307, +21709, 48339, 9749, 31414, 63133, 13346, 43518, 23568, 49562, 7144, 32601, +58493, 12950, 41883, 24763, 51451, 3310, 34920, 59594, 13531, 42096, 23230, +51835, 478, 32672, 63738, 19688, 43413, 10428, 55074, 27224, 38294, 7622, +58770, 20089, 34987, 46967, 5299, 51149, 19414, 31885, 63901, 2712, 43462, +25273, 58918, 11129, 41198, 21397, 53351, 7056, 34386, 60873, 18678, 45176, + 9051, 32316, 59431, 17105, 44031, 4139, 31909, 56279, 13967, 49396, 24919, +40274, 1825, 62186, 23668, 38666, 11951, 54333, 21562, 41489, 4185, 56261, +25947, 39070, 11131, 59453, 24219, 38898, 6599, 53166, 18575, 32819, 48869, +10046, 57734, 25792, 38448, 2411, 53439, 17835, 30831, 64819, 9420, 42998, +23033, 52102, 13443, 32931, 60418, 6502, 43877, 30314, 19678, 63012, 11019, +42915, 22656, 50634, 3818, 33766, 58145, 10984, 31282, 47030, 5008, 65267, +23330, 41305, 14328, 58982, 30491, 6997, 50646, 35311, 17504, 63662, 10263, +41598, 27132, 52097, 4416, 30488, 55917, 15809, 47569, 27612, 8992, 65371, +38209, 16639, 28384, 54966, 1204, 41765, 23392, 59156, 12780, 32919, 47084, + 2784, 63942, 24944, 38863, 12660, 60745, 22516, 43575, 489, 53503, 28442, +16062, 63507, 38230, 5744, 30854, 55647, 17965, 43670, 7055, 53896, 21006, +32902, 63921, 217, 41269, 22494, 52284, 14024, 34517, 62705, 8299, 44077, +27755, 16746, 56053, 38153, 9801, 31417, 65008, 18196, 42285, 518, 48409, +26412, 62176, 14372, 32968, 44658, 6919, 56605, 30894, 18581, 53420, 11040, +42159, 26246, 64875, 16, 34771, 52921, 14843, 44654, 27838, 8016, 58657, +35139, 17067, 51752, 2301, 34408, 46468, 21193, 63869, 7443, 38572, 22538, +55877, 9778, 46782, 28084, 15925, 58288, 34800, 3050, 45962, 23349, 61490, +11936, 41921, 25725, 56449, 7305, 40481, 17156, 52919, 28269, 176, 61840, +36022, 17150, 49414, 5047, 33414, 55983, 14440, 46853, 25093, 38522, 8468, +59241, 20029, 30589, 48229, 2242, 61579, 19793, 30057, 45767, 9539, 63341, +19479, 31475, 47295, 27, 55259, 25523, 38989, 11659, 61090, 22407, 47838, + 2728, 37332, 63166, 15771, 28610, 51920, 8812, 41596, 24888, 65497, 1931, +39104, 23207, 54124, 13727, 48917, 29352, 8371, 58515, 37483, 17242, 47939, + 4498, 65031, 20968, 31809, 45897, 9441, 56562, 26305, 38537, 947, 48446, +22342, 58523, 10339, 38965, 27093, 55818, 3096, 35362, 50897, 15499, 30938, +60825, 9059, 43091, 26542, 58396, 3549, 37333, 51583, 15451, 30268, 47076, + 558, 59184, 23756, 40502, 7182, 55241, 25806, 40047, 10192, 62283, 19851, +34985, 53457, 1089, 30124, 47393, 18649, 63865, 9962, 38826, 22710, 56644, +12740, 34427, 53475, 4675, 42636, 23818, 57617, 10466, 31880, 50659, 13516, +43492, 22811, 62583, 1819, 34176, 53378, 15605, 43968, 28199, 5214, 58024, +36348, 14751, 48413, 23848, 63536, 5834, 32031, 47033, 16975, 53669, 29560, + 1955, 58176, 37815, 12044, 50191, 28222, 15544, 54956, 38131, 7279, 29898, +59548, 20317, 48859, 11483, 39648, 26776, 63630, 174, 49519, 24206, 40451, +11219, 53820, 17243, 30829, 58304, 9228, 42845, 24509, 51079, 1261, 31845, +61342, 19401, 43052, 7802, 55805, 20870, 35580, 51504, 13042, 31464, 64989, + 4774, 44967, 24899, 40760, 13103, 61749, 34621, 8104, 46446, 22824, 59640, +12642, 40651, 26086, 54867, 75, 38777, 24805, 57182, 12180, 41423, 21473, +50882, 2777, 31687, 63357, 15520, 44045, 28071, 7468, 58286, 37840, 20325, +52705, 10211, 34478, 48418, 18711, 56579, 6064, 34284, 46508, 12374, 60174, +20388, 33319, 46452, 4389, 52872, 18579, 33843, 58622, 894, 47375, 23425, +41511, 10132, 48760, 26260, 63876, 2236, 40007, 22258, 55324, 11139, 33143, +45254, 13610, 60233, 24728, 38668, 5029, 55683, 18364, 35923, 51240, 2315, +29057, 61995, 14780, 42641, 22693, 53042, 8161, 32091, 61443, 16143, 45205, +28302, 4695, 56677, 37022, 16740, 49443, 28592, 5816, 60399, 36709, 18354, +48279, 2260, 62811, 26198, 40071, 10116, 53433, 17102, 29589, 57554, 7398, +41952, 23944, 55014, 12155, 38462, 22586, 51072, 3693, 31844, 62865, 15730, +44179, 28030, 413, 52692, 35976, 20068, 57451, 11950, 47161, 26833, 38771, + 7900, 60490, 21633, 43282, 10973, 55097, 26734, 41774, 5829, 63665, 18291, +35127, 50669, 9606, 31545, 61123, 18783, 45083, 2006, 36552, 55635, 15621, +29485, 46224, 3687, 63360, 23860, 41420, 12600, 47298, 22246, 60819, 7673, +39124, 26589, 48834, 1111, 62361, 21665, 39847, 12298, 56528, 26387, 49250, + 2898, 34564, 47465, 13848, 55375, 24148, 40838, 7617, 61780, 19899, 57127, +11646, 32823, 45408, 17612, 54526, 211, 38633, 25442, 61303, 11239, 43676, +21815, 54105, 2532, 33773, 58652, 13754, 45787, 23451, 41125, 6365, 60554, +29431, 14428, 53940, 36919, 4003, 49545, 20680, 33435, 62959, 7303, 45476, +28187, 16701, 53565, 37168, 9613, 57494, 21771, 42350, 6310, 51825, 31441, +14672, 60192, 35919, 9680, 49078, 27347, 16384, 59015, 36303, 3859, 49628, +30116, 19703, 60541, 9233, 42115, 25389, 50313, 13000, 35761, 57764, 4523, +30002, 49829, 15287, 34198, 61725, 2850, 45238, 27642, 14683, 54570, 38018, + 7722, 30721, 58799, 19543, 49156, 10491, 40741, 23133, 63322, 2830, 35001, +47308, 20555, 60752, 5643, 33376, 46302, 13646, 55843, 24823, 39116, 4947, +62707, 19902, 37082, 49539, 10196, 28586, 61224, 19330, 41504, 3637, 56443, +26432, 41261, 13060, 51995, 30408, 447, 60779, 37729, 20313, 50132, 7809, +37336, 54832, 16212, 31658, 47159, 1644, 63736, 20916, 33557, 44710, 10500, +58089, 20184, 37584, 50286, 6805, 29019, 60639, 19417, 41270, 10765, 64069, +26546, 39969, 3131, 49331, 22552, 55976, 11958, 34965, 43975, 17789, 58592, + 4545, 33370, 51245, 17200, 44170, 8743, 30064, 60046, 18305, 49120, 5339, +40462, 26764, 53324, 13302, 33094, 58273, 4533, 45221, 20669, 31932, 55637, +11039, 47269, 19554, 31847, 59966, 6605, 45449, 17913, 36325, 63119, 210, +28439, 44295, 18693, 55023, 11706, 40402, 25543, 61706, 6230, 33590, 52080, +18984, 42777, 12195, 64674, 25545, 41633, 5736, 47606, 21310, 62167, 12887, +39727, 26479, 54494, 4868, 39525, 23347, 56032, 10296, 43626, 21894, 61540, +13812, 33216, 54440, 6051, 44068, 27899, 16410, 64705, 36687, 2780, 50396, +28926, 15979, 57599, 37848, 9517, 45835, 23443, 60083, 6518, 41173, 27142, +52303, 2352, 43818, 19028, 60933, 30173, 14069, 49284, 37302, 666, 65115, +27700, 16542, 52221, 38111, 7413, 29899, 56842, 19822, 47450, 10011, 31721, +64364, 21046, 44637, 59, 32190, 54917, 10695, 42345, 25730, 59337, 13566, +34791, 51267, 6420, 43809, 27380, 16903, 61260, 35745, 3346, 47078, 23032, +65022, 10214, 39388, 26962, 51862, 3814, 31223, 55684, 15425, 45025, 29012, + 7049, 61213, 35840, 18994, 47961, 3136, 62815, 20724, 32943, 52585, 6522, +39653, 21955, 57064, 10925, 36932, 49825, 16171, 29179, 62554, 614, 47111, +23825, 40991, 11612, 55003, 21549, 48997, 2154, 33277, 57705, 15189, 43310, +25758, 50672, 3588, 33201, 65167, 18756, 45403, 7927, 34010, 61375, 16054, +47417, 29644, 5689, 60272, 37548, 20265, 49836, 8736, 34835, 56779, 18359, +47342, 4357, 32311, 61526, 16424, 44874, 28432, 364, 63923, 37975, 16422, +30852, 49013, 8353, 62449, 24310, 40798, 11063, 54563, 21965, 39441, 7380, +64996, 26647, 49217, 12470, 39040, 21352, 59432, 5728, 33108, 53304, 15985, +47886, 28473, 4293, 62645, 35562, 19098, 52000, 8632, 43065, 26199, 65491, +11999, 40826, 22877, 59130, 6261, 31707, 47226, 18648, 56913, 1479, 39451, +26751, 48451, 10875, 64947, 21302, 39546, 7143, 51133, 34750, 12621, 57495, +24199, 45158, 8445, 40272, 23798, 54684, 11667, 43583, 20877, 61655, 31420, + 54, 49765, 36215, 20291, 64585, 4595, 42665, 26889, 60289, 13985, 46656, +29228, 6608, 56917, 36812, 17898, 47171, 9885, 65172, 25923, 38982, 5385, +48810, 22584, 63081, 1119, 33972, 46101, 16619, 52201, 29746, 3781, 58989, +37558, 16218, 49444, 27748, 654, 57400, 37086, 14691, 47733, 25525, 65314, + 5666, 31897, 44131, 19664, 58643, 8930, 35977, 50566, 15591, 30933, 55685, + 4841, 42175, 25324, 58661, 11168, 46482, 30539, 16833, 55081, 36178, 5456, +47967, 22439, 64606, 10272, 31599, 44494, 15894, 60966, 28131, 2074, 51594, +35693, 17764, 26118, 40410, 4419, 49111, 22833, 60059, 9656, 33247, 46048, +16080, 52756, 28121, 5908, 62226, 37746, 15209, 50015, 27765, 8229, 64315, +36483, 20278, 49666, 2065, 31697, 58264, 16995, 44615, 27384, 9756, 53006, +37655, 18912, 59881, 4456, 31949, 50230, 15046, 44696, 27931, 2167, 65056, +37413, 16620, 54932, 27632, 4729, 49484, 37904, 19535, 52854, 1507, 32692, +64704, 17563, 47192, 7971, 33502, 56787, 15610, 46247, 29508, 2155, 64415, +37454, 19472, 53646, 7959, 46734, 25050, 40688, 11862, 59557, 21924, 49127, + 5208, 33904, 63628, 16304, 45531, 28317, 1567, 52118, 35836, 15166, 57123, +27670, 9017, 51429, 38161, 14947, 28735, 54521, 7773, 41591, 23627, 59662, +11743, 41280, 22131, 52271, 1223, 32766, 58099, 18046, 43020, 7004, 51421, +30862, 14948, 62154, 35587, 5532, 49386, 20466, 33679, 64759, 10912, 45174, +18527, 29649, 57424, 4216, 48485, 27969, 14741, 59706, 38094, 8395, 30234, +54624, 17514, 47784, 3296, 31180, 59629, 14661, 42823, 23171, 51653, 1291, +34537, 55281, 17470, 45380, 9612, 35790, 57794, 15932, 29216, 47434, 6758, +62417, 24487, 39930, 11373, 53623, 21093, 35064, 57082, 1563, 45798, 20873, +33944, 64811, 10193, 43187, 18999, 51283, 30096, 6958, 62039, 36824, 18360, +50194, 904, 34648, 62741, 17114, 42937, 5320, 56665, 27091, 40264, 10805, +51464, 20690, 34358, 61039, 7643, 47012, 29757, 15999, 53689, 37295, 2408, +58999, 28029, 15536, 49277, 36405, 4070, 53632, 29480, 16421, 58274, 35954, + 8653, 50200, 24913, 41567, 70, 59825, 19632, 36957, 49734, 7750, 30723, +65355, 18532, 47648, 2514, 39596, 25816, 53079, 10964, 31474, 60337, 18179, +45853, 7635, 33728, 56026, 20946, 44799, 4092, 31988, 64345, 14373, 42703, +24600, 54630, 11664, 38271, 21403, 62523, 5418, 32897, 51439, 17926, 43176, + 9305, 58045, 20884, 30097, 54019, 4118, 44996, 27539, 15072, 61933, 37468, + 2768, 50741, 27683, 12731, 55903, 36913, 18634, 48745, 7694, 61536, 22153, +40967, 3046, 52711, 28890, 16609, 63073, 37335, 7966, 48199, 23898, 57278, +12751, 41029, 21580, 54388, 757, 32164, 45077, 13478, 57929, 21747, 38515, + 5493, 60142, 25434, 49328, 13872, 32123, 44173, 8528, 55688, 24845, 40843, +12725, 47178, 23872, 63796, 2244, 31050, 46886, 18932, 59876, 5171, 32500, +44709, 14300, 57365, 26074, 38489, 6541, 63452, 27228, 38335, 10235, 52668, +18638, 30016, 62408, 6043, 39943, 22126, 55807, 9843, 30516, 47665, 13307, +54104, 22866, 40102, 1808, 58142, 26955, 39478, 10340, 53296, 17591, 32629, +64771, 2196, 43774, 27438, 14647, 53437, 36710, 9830, 58777, 24524, 42404, + 7258, 54449, 21878, 40723, 3508, 57297, 30012, 16088, 50314, 35296, 1723, +61373, 23929, 45525, 14490, 33228, 56862, 3688, 42663, 23254, 51549, 13487, +29922, 62058, 8186, 43908, 27310, 16488, 57421, 37441, 1309, 49536, 28013, +15919, 53415, 37924, 3654, 31993, 55045, 17553, 48700, 9175, 40551, 26188, +63224, 12450, 38437, 23019, 54305, 3736, 32832, 58865, 14466, 42866, 23015, +53140, 834, 32285, 64338, 15923, 47497, 29372, 3482, 59963, 35143, 18163, +50253, 6421, 34601, 59287, 15964, 45673, 27835, 8872, 57121, 35310, 18486, +52106, 1631, 41811, 24948, 54634, 11660, 40491, 22732, 60591, 2961, 49348, +27266, 41232, 11149, 55349, 21077, 39792, 14207, 58112, 28510, 6507, 50002, +35344, 14091, 64898, 22691, 44479, 7321, 30340, 55072, 13666, 42877, 22470, +59992, 8581, 33648, 48793, 12993, 54762, 22960, 40197, 22, 62083, 26002, +48358, 12096, 39634, 21371, 64556, 2764, 38383, 23338, 52010, 8518, 32580, +60198, 15362, 44096, 29781, 481, 53191, 36500, 19166, 59306, 5991, 33896, +49694, 20717, 42416, 9987, 64079, 14768, 44603, 28100, 8052, 52817, 35906, +19197, 63396, 2903, 31375, 50499, 11930, 44219, 31023, 20651, 57822, 1040, +34352, 44936, 18137, 53690, 10936, 40415, 25661, 61981, 6660, 36369, 50570, +14243, 30701, 64620, 325, 43987, 27673, 16259, 54297, 37749, 10232, 61302, +30533, 18828, 51202, 6866, 44085, 30240, 13880, 56226, 35036, 8708, 62193, +23744, 45283, 12104, 40622, 22206, 55437, 5362, 38780, 27012, 60097, 10801, +43926, 21790, 50815, 6853, 32365, 61168, 15642, 44237, 28151, 985, 57113, +37962, 15533, 30150, 47592, 6330, 55017, 24633, 40319, 11121, 60563, 20404, +37743, 49858, 4663, 29441, 64565, 19587, 45781, 832, 34102, 61291, 16220, +44789, 27767, 3415, 65398, 36650, 17395, 47546, 8677, 54603, 26574, 39430, +11565, 64147, 22010, 47307, 1694, 36940, 57508, 16735, 28718, 50808, 9235, +42704, 23567, 58967, 2582, 33251, 52965, 16547, 44046, 27313, 9736, 65510, +35069, 19871, 51748, 5164, 42328, 26525, 63416, 13435, 34291, 46791, 7376, +56647, 25606, 39030, 11989, 64937, 22644, 48702, 5658, 41083, 25818, 59761, + 651, 33727, 52926, 15060, 44672, 28231, 3373, 64314, 37697, 14707, 50151, +27646, 7568, 59808, 38036, 16219, 30367, 55432, 2445, 48674, 24426, 40105, +12651, 57670, 22071, 48894, 8471, 40251, 25693, 54486, 12834, 38715, 22438, +64209, 3250, 43364, 25795, 52943, 13129, 31366, 56612, 5018, 41783, 22956, +51125, 13744, 33002, 63627, 8077, 43392, 22122, 55661, 11551, 41288, 24681, +62842, 2049, 43805, 21730, 52158, 11301, 33211, 63932, 15043, 45376, 28008, + 6286, 52667, 35024, 12995, 58944, 23186, 44620, 9052, 34449, 57009, 19199, +48771, 1431, 41016, 25597, 62519, 13408, 48693, 28519, 9007, 52968, 37149, +19689, 57863, 175, 48360, 26972, 39910, 7793, 59067, 23466, 43964, 13544, +55471, 26302, 38858, 1997, 63176, 32933, 14547, 49969, 36835, 6077, 56231, +21072, 33238, 48278, 9361, 60454, 20497, 33454, 45159, 4672, 65374, 25255, +39603, 9712, 54359, 24706, 45011, 14083, 32827, 55894, 1176, 43874, 27691, +16197, 60847, 36319, 4474, 50480, 29295, 15927, 64312, 35812, 8188, 48195, +26478, 60781, 11304, 41200, 22933, 54367, 1584, 34743, 48334, 17492, 65534, + 4375, 38345, 27254, 59160, 9747, 49205, 17673, 34599, 44912, 7353, 55284, +25581, 39474, 11965, 64688, 23642, 49030, 1742, 40305, 21856, 53481, 13819, +32250, 60290, 3307, 42478, 23477, 51211, 13484, 34756, 59069, 943, 44089, +28122, 16736, 63808, 35249, 4700, 51560, 25801, 42377, 12728, 62879, 22483, +46294, 6435, 29615, 56159, 20736, 48778, 11289, 41347, 22797, 60899, 2981, +33075, 46846, 18435, 52244, 10924, 33644, 65225, 15506, 45651, 27929, 5038, +59716, 36731, 18086, 51393, 6547, 43139, 26883, 63595, 10886, 30567, 52886, +17953, 46530, 643, 34323, 58999, 15534, 45927, 28893, 6276, 54193, 34861, +20008, 64042, 7317, 42673, 25736, 56619, 12781, 39762, 22317, 61137, 220, +31351, 45775, 19327, 57462, 5619, 32893, 44345, 15599, 52062, 30389, 7588, +61912, 25759, 47285, 11770, 40494, 21958, 56361, 5454, 34144, 51751, 20510, +42651, 9342, 63468, 26463, 41502, 13366, 55454, 30900, 2941, 50728, 37761, +17057, 62052, 29393, 9821, 49453, 37139, 20182, 64171, 5879, 32967, 45430, +14482, 57773, 21407, 38249, 7444, 48216, 26372, 62497, 2054, 34760, 44167, +19797, 60849, 9435, 40098, 26221, 52913, 2723, 32415, 61945, 12570, 48273, +25627, 38728, 1587, 51522, 19017, 29502, 63174, 4680, 44493, 28300, 16649, +57873, 36986, 9527, 53088, 23339, 43513, 6059, 56532, 26915, 41267, 10593, +61060, 19087, 36952, 49410, 4164, 28127, 62584, 18024, 46457, 9791, 41225, +26163, 56468, 13637, 36826, 51119, 3314, 29072, 58414, 54337, 36696, 847, +47305, 24505, 59443, 10106, 40276, 26095, 56024, 13636, 34329, 47977, 5581, +65098, 24727, 40674, 12748, 48392, 23051, 61130, 3659, 38660, 27073, 54668, +12336, 43699, 21685, 59150, 5302, 32635, 52437, 19653, 46924, 8182, 33339, +63353, 20801, 45110, 3943, 33903, 57242, 16969, 47597, 27393, 1045, 60327, +37589, 17128, 53637, 27564, 3401, 50214, 36849, 13945, 62846, 25386, 43278, + 444, 53788, 22874, 39797, 12766, 63304, 26588, 39453, 3322, 55115, 20155, +30954, 48152, 8798, 65323, 25678, 41241, 13148, 49042, 22418, 61406, 2337, +32974, 44544, 18276, 57801, 9465, 34099, 52544, 13707, 42373, 25400, 58724, + 6077, 31618, 52202, 18946, 48411, 10203, 31240, 56687, 20584, 43628, 4679, +59250, 30604, 15511, 50045, 36968, 6182, 60319, 25328, 42007, 13966, 54771, +30556, 4074, 52445, 37370, 19206, 61924, 12383, 45493, 31250, 6016, 60594, +37442, 18492, 46811, 700, 55215, 27234, 38319, 11393, 57964, 23691, 49192, + 1947, 39051, 21693, 61300, 14202, 31437, 53777, 3755, 44376, 20723, 31342, +60786, 9177, 49428, 20363, 31970, 46456, 6073, 61698, 20169, 33603, 48228, +10940, 58782, 19969, 31907, 44820, 4036, 53043, 27411, 14161, 62820, 36982, + 9735, 46747, 25808, 59293, 4323, 33332, 44985, 16109, 61721, 28770, 2178, +53027, 34356, 17689, 47039, 9222, 59429, 19787, 34769, 45695, 1502, 64888, +18111, 34079, 45337, 9737, 58024, 24921, 39275, 465, 52472, 30331, 16000, +60016, 36069, 7133, 49315, 28272, 15911, 55133, 38082, 4333, 30008, 56946, +17030, 47879, 27346, 1700, 61325, 36429, 16920, 54206, 29548, 4066, 49989, +37067, 12861, 63210, 23994, 44983, 6637, 34452, 58058, 19319, 44153, 3191, +34558, 61242, 17807, 44054, 10913, 32488, 55065, 17079, 42064, 3891, 64978, +26420, 38966, 10870, 48457, 21328, 53254, 6926, 40815, 25802, 59457, 10751, +46362, 17573, 30457, 64088, 907, 41394, 24212, 52696, 11170, 40137, 17525, +57702, 30165, 1718, 50743, 36179, 19193, 59929, 6722, 35166, 48843, 20770, +63883, 9256, 33977, 46802, 13201, 58450, 24891, 40120, 6200, 53099, 18520, +32837, 56495, 2472, 43081, 21161, 52363, 14553, 36562, 62485, 6867, 29889, +45974, 19747, 56598, 11723, 40223, 23041, 52882, 455, 31713, 62246, 13393, +41858, 23444, 52916, 3536, 33335, 56333, 18412, 46836, 10267, 32062, 61724, +17793, 48379, 7088, 39003, 26467, 57263, 14805, 31862, 47214, 5141, 53769, +27541, 15799, 61617, 36618, 6983, 47129, 23978, 55135, 11010, 39055, 21409, +57602, 3570, 37015, 50618, 15182, 31495, 61461, 681, 44894, 28042, 16785, +55126, 38025, 8359, 29929, 62596, 17195, 49180, 1423, 31518, 44330, 12306, +58315, 23631, 39545, 8022, 54964, 21393, 38975, 12980, 60323, 27281, 38433, + 2843, 55291, 19679, 32653, 44487, 8904, 64764, 27460, 14362, 50273, 37725, + 3169, 56894, 24940, 41647, 10407, 51555, 17272, 31535, 62554, 4673, 47865, +29300, 14704, 52107, 36875, 8380, 64214, 27736, 16636, 50065, 37268, 1969, +59834, 21960, 44930, 14027, 35907, 53834, 3211, 30791, 62972, 15174, 44278, +27787, 7705, 60701, 37342, 17407, 53768, 1078, 36972, 49518, 15151, 28622, +65358, 7853, 46578, 27314, 14323, 53512, 35854, 4786, 59144, 27840, 16810, +51675, 35635, 697, 48432, 26395, 63405, 10202, 40514, 22752, 53187, 13800, +31902, 57160, 5027, 48158, 29025, 16363, 55255, 37250, 10490, 45359, 23774, +58042, 5974, 41836, 23074, 61353, 14080, 31442, 53530, 7119, 40972, 24126, +59141, 13615, 46857, 30005, 2280, 51809, 35235, 12409, 63585, 29391, 16214, +49601, 35533, 1220, 54744, 25081, 42545, 13337, 57851, 29301, 8003, 51110, +37366, 20906, 65523, 1704, 48163, 23226, 40781, 9327, 61216, 32242, 16992, +63822, 10932, 40867, 19608, 52039, 31692, 6225, 62861, 37402, 19707, 50954, + 1765, 45294, 29024, 16909, 58861, 35953, 7260, 51100, 19749, 31828, 56496, +10425, 42956, 22667, 63761, 2867, 37605, 49302, 15322, 28447, 55854, 11613, +42169, 24545, 58623, 1798, 30125, 52997, 12471, 41076, 24335, 59589, 7675, +36879, 49898, 14360, 30734, 65422, 9483, 44625, 28573, 15913, 58540, 35255, + 4704, 51595, 23810, 41603, 11288, 56990, 18812, 31204, 47068, 6072, 58921, +17806, 33484, 51608, 11644, 43267, 23840, 59946, 4178, 39035, 21274, 53992, + 8020, 38691, 27216, 64011, 13934, 30602, 47013, 3899, 55012, 24157, 39251, + 8118, 62910, 21523, 46594, 12977, 35085, 55420, 2464, 42065, 24301, 63740, +12421, 39597, 23589, 52406, 338, 32444, 61805, 20391, 44146, 12149, 32112, +56568, 7769, 46691, 27894, 16247, 64326, 35793, 1161, 49656, 27697, 14967, +58019, 35637, 8176, 51123, 23890, 42938, 12951, 62854, 21286, 41678, 5875, +48421, 25963, 59182, 12893, 33725, 45041, 7054, 51376, 19216, 33962, 63874, +10979, 46116, 17892, 36275, 53494, 2611, 29751, 58447, 17986, 42411, 10285, +55639, 26569, 39174, 1164, 52157, 17179, 29663, 65306, 8406, 46871, 28722, +15681, 56567, 35506, 404, 51742, 21504, 42483, 14292, 64033, 30940, 6021, +50446, 37267, 19229, 60173, 11103, 42406, 26800, 55932, 3992, 32787, 48447, +21017, 54171, 11224, 40153, 26174, 61825, 6490, 49177, 17420, 31728, 46041, +12425, 62509, 25511, 40355, 3502, 51659, 19240, 30895, 64531, 8346, 45546, +27712, 14581, 59604, 34896, 5586, 51114, 38194, 14330, 28440, 63551, 8665, +45425, 27504, 15492, 55200, 38196, 766, 29150, 59941, 17198, 49106, 8244, +39039, 26735, 55373, 14178, 48491, 29600, 5099, 63642, 36620, 20655, 49986, + 8372, 33844, 58583, 19541, 43482, 1221, 55967, 27251, 38304, 12331, 62696, +21882, 48096, 3198, 33761, 55041, 20051, 42368, 8569, 60050, 30362, 14290, +53649, 35802, 5261, 49905, 20941, 32857, 62699, 10562, 45313, 17428, 30130, +56997, 3909, 44261, 27425, 15516, 54465, 38178, 2203, 29728, 61866, 20426, +48535, 8657, 41565, 25720, 63281, 11143, 39007, 22117, 47873, 3970, 59081, +25966, 40301, 10069, 52141, 17049, 34135, 63332, 4989, 44280, 28207, 15849, +58136, 36792, 5893, 49896, 28546, 14966, 61237, 36139, 8652, 44338, 24651, +59288, 2798, 39864, 22707, 53628, 12655, 33356, 64417, 342, 44236, 29468, +18143, 60820, 8149, 37803, 52159, 12315, 30942, 45120, 19353, 65365, 1469, +37005, 49970, 16582, 29035, 59811, 7907, 41798, 25040, 54185, 9513, 40063, +21921, 64096, 13612, 34446, 51179, 5173, 42654, 25070, 59204, 13454, 48105, +22144, 40503, 3911, 49688, 25571, 63138, 13778, 34185, 46316, 39, 54025, +24589, 42279, 9369, 63277, 22465, 47714, 13142, 37465, 58092, 5337, 30643, +52111, 20587, 43099, 11507, 61639, 21327, 33023, 46636, 1617, 58962, 19671, +34588, 44554, 11686, 54789, 24319, 41140, 2804, 58904, 19864, 32051, 46270, +10563, 55385, 25650, 39744, 6485, 65113, 24960, 43096, 10474, 51136, 19598, +32908, 57034, 1756, 46344, 19063, 35286, 59036, 9920, 29986, 51349, 18920, +45155, 4369, 33585, 58296, 16807, 44092, 28294, 1948, 56313, 38119, 15651, +30333, 48723, 7836, 61144, 23909, 40377, 12881, 55147, 21082, 38266, 3024, +47114, 26824, 62005, 8749, 35234, 44514, 19272, 59865, 257, 40917, 22371, +64249, 14756, 31829, 52342, 3302, 46333, 19927, 33939, 55629, 9698, 43143, +17924, 64726, 30330, 3777, 50003, 37404, 20053, 61268, 10341, 42622, 22542, +56947, 5313, 32763, 51322, 18322, 43395, 9395, 64271, 20294, 36336, 50093, + 3617, 31935, 59729, 18634, 45305, 6947, 34994, 56965, 15514, 30063, 52064, + 5635, 43547, 24336, 12752, 35295, 49800, 4064, 29696, 57256, 17143, 45353, + 9105, 30466, 60533, 13015, 42008, 23246, 54252, 4130, 32469, 61770, 14474, +45377, 27351, 679, 55330, 36180, 18321, 50094, 9558, 33448, 60891, 21155, +45487, 5950, 33811, 62723, 9958, 41523, 22659, 51310, 14452, 34315, 64116, + 5773, 45796, 28444, 16277, 53092, 35419, 2654, 56415, 19919, 46249, 30732, + 6163, 63214, 37783, 19192, 54017, 8654, 43655, 26363, 62224, 2446, 33633, +52426, 13609, 41686, 25028, 64289, 1267, 38859, 22133, 52625, 9803, 33459, +58261, 14918, 43837, 25942, 55484, 126, 41164, 21786, 59220, 10294, 35982, +50797, 15501, 31477, 60730, 1493, 42811, 23221, 51903, 14388, 32494, 58181, + 5345, 46660, 19994, 33613, 60877, 8955, 44681, 17251, 35683, 53792, 5052, +29606, 63326, 18809, 48542, 2128, 40035, 24975, 59308, 10445, 33401, 54426, +20092, 44334, 4564, 37797, 53753, 16767, 30170, 64510, 2344, 40624, 26328, +56190, 11088, 38638, 22607, 52187, 2994, 31068, 62207, 14401, 42145, 24484, +57460, 282, 40513, 22794, 54716, 6595, 39315, 26978, 62655, 12417, 48488, +24894, 39687, 5016, 63576, 20933, 32596, 45965, 9639, 57731, 19463, 34645, +43879, 3769, 60829, 22782, 39683, 12159, 54022, 26675, 39514, 7641, 58184, +22716, 48484, 12173, 40861, 26027, 52232, 1230, 30277, 65133, 14889, 44644, +28241, 8085, 61021, 38033, 14636, 29314, 55734, 4652, 47728, 20975, 33754, +60127, 2210, 42630, 23671, 54807, 9226, 38585, 21624, 58676, 14906, 37085, +49642, 826, 32656, 60646, 19001, 41443, 10494, 55802, 20961, 30645, 49696, + 2364, 37751, 58231, 17066, 31531, 48940, 5086, 64886, 19907, 32526, 46441, +10129, 51955, 19799, 32177, 62826, 1670, 43374, 24820, 58316, 12529, 39469, +22346, 54457, 2689, 30599, 47185, 17335, 62030, 11421, 40191, 25761, 51631, + 4914, 42932, 23284, 58827, 13066, 37679, 50509, 6355, 29204, 56978, 17045, +46786, 27399, 2402, 64730, 38210, 16522, 29534, 48108, 8279, 55547, 25600, +39331, 519, 61415, 20174, 37716, 50969, 8685, 30622, 64842, 19046, 45560, + 5670, 36722, 56406, 15756, 28765, 51680, 250, 42678, 24018, 57298, 15393, +35798, 50086, 8858, 30855, 61831, 20384, 46321, 1208, 30534, 54710, 20984, +49092, 8648, 41384, 25468, 64867, 12048, 40441, 22904, 51841, 1466, 31526, +56669, 19959, 46396, 9806, 32286, 62734, 16629, 45525, 28374, 6213, 51013, +36581, 19434, 59213, 9502, 33592, 46117, 20837, 56850, 2702, 39807, 26191, +58512, 13852, 30420, 52767, 5633, 44531, 34393, 13704, 63559, 22560, 46905, + 4521, 33534, 58012, 18652, 46566, 2498, 39176, 26982, 55930, 10665, 38396, +21248, 64434, 6678, 38372, 27204, 56460, 10009, 47113, 18942, 31039, 60907, + 5556, 41823, 22864, 57091, 14403, 35094, 50699, 3602, 29081, 56062, 16882, +44847, 27889, 1060, 62426, 36007, 18471, 53814, 8513, 37910, 49721, 14658, +28531, 65180, 5227, 40022, 22496, 57728, 9534, 36410, 49794, 15426, 29642, +62278, 4316, 41715, 24185, 51167, 13476, 32018, 57935, 575, 45527, 29021, +16546, 61398, 37218, 6972, 47968, 25782, 54888, 11543, 40877, 25513, 64384, + 5236, 39736, 22571, 53467, 13940, 30788, 61898, 8407, 48681, 23781, 41826, +12352, 62781, 22344, 46543, 4025, 37204, 57321, 16189, 31176, 47829, 5959, +64800, 23883, 41882, 12162, 56777, 17345, 30820, 51927, 5340, 41808, 25347, +54261, 13218, 34534, 47969, 7870, 56705, 24825, 40289, 12034, 62956, 26911, +39977, 1013, 52691, 19854, 33647, 57420, 8092, 45747, 27647, 14643, 55040, +34910, 747, 45630, 23931, 61554, 13007, 41505, 22157, 52866, 2507, 31405, +56840, 14241, 42920, 24377, 63093, 8871, 40557, 23503, 54460, 12632, 39728, +26885, 62103, 2370, 38277, 21123, 56111, 48001, 22564, 64963, 14026, 39945, +26006, 58681, 105, 43136, 18292, 51290, 34918, 7668, 64501, 28309, 15480, +49384, 37721, 5506, 53237, 27950, 16230, 64150, 38177, 7919, 28585, 57601, +17176, 43449, 1368, 51950, 28990, 15957, 57102, 36680, 3559, 49868, 27804, +16505, 55638, 38015, 67, 31297, 61833, 20740, 47945, 8909, 40060, 25625, +60093, 10951, 49116, 22124, 41053, 896, 56179, 29966, 16430, 49246, 36481, +10261, 59507, 29520, 18103, 46160, 6534, 57550, 35178, 20024, 50490, 11158, +43040, 26878, 61289, 2805, 38460, 22813, 51670, 7442, 38279, 21169, 62543, +11923, 48348, 26072, 41697, 4785, 57299, 29967, 16962, 49723, 36443, 6629, +64449, 24628, 41825, 9828, 54961, 17761, 30274, 49018, 2927, 57808, 24966, +39425, 10122, 49105, 22549, 56956, 13140, 34798, 45058, 8193, 51314, 18647, +36739, 61043, 6204, 29111, 47283, 15531, 57437, 27503, 8902, 49921, 35880, +19083, 60263, 5580, 45706, 20857, 34172, 60954, 9213, 44607, 19383, 33956, +55124, 4982, 47810, 18339, 35195, 65178, 9936, 30222, 50948, 14712, 43288, +21686, 58152, 1895, 32850, 46330, 17496, 54846, 12006, 38551, 27088, 61459, + 2946, 49280, 24339, 40311, 11227, 56064, 17544, 48011, 29929, 5541, 63645, +35017, 18873, 46114, 2807, 61440, 26953, 38608, 10390, 54881, 21253, 48401, + 7206, 36694, 58378, 16336, 30022, 53313, 711, 44506, 27635, 15765, 63835, +38189, 7577, 28739, 53573, 18131, 41004, 10685, 63377, 27107, 48454, 5213, +35496, 57084, 13588, 27985, 53516, 9638, 42840, 24843, 65195, 3326, 33526, +51652, 13323, 41986, 23827, 60304, 7989, 46776, 25622, 40110, 11971, 55775, +22003, 39613, 3270, 60967, 25579, 42799, 11879, 56190, 23440, 40571, 6775, +51409, 18993, 33315, 64521, 9676, 43297, 25408, 51789, 5527, 35015, 57390, +20858, 44546, 9151, 36158, 65479, 16891, 30013, 53263, 330, 44818, 27624, +15821, 63349, 38186, 9742, 34953, 51824, 14880, 28480, 57410, 4177, 42617, +23159, 60682, 12138, 33717, 46921, 15801, 52367, 28168, 4772, 58122, 36063, +17373, 49554, 11090, 30544, 60588, 21433, 44021, 7140, 37389, 54669, 14288, +29796, 65212, 3406, 43381, 22539, 53497, 6631, 33567, 58507, 15099, 43764, +27819, 12523, 56242, 38129, 2904, 33140, 59717, 18023, 46049, 4754, 33919, +55013, 17258, 42605, 6925, 64156, 29428, 15507, 51080, 37396, 4685, 58400, +24007, 41979, 13348, 55501, 21640, 39631, 4345, 64912, 27007, 48587, 13108, +31917, 54208, 6798, 43344, 22736, 61956, 11541, 32552, 47032, 18718, 56275, + 201, 36350, 50912, 15855, 30228, 62462, 7464, 42002, 23770, 49147, 12231, +59872, 26085, 41212, 993, 53312, 22621, 48565, 15340, 32754, 62169, 2633, +43211, 24656, 53493, 12151, 39686, 21636, 59951, 6702, 36465, 49692, 15709, +31303, 64216, 10251, 42295, 24540, 51158, 6297, 31777, 59323, 15645, 45299, +29526, 2544, 60369, 35732, 18698, 52380, 11017, 42868, 26527, 54152, 792, +32499, 59624, 18637, 43465, 6913, 53656, 20820, 34846, 63532, 9516, 47080, +19354, 34335, 56239, 4653, 49175, 23981, 40329, 12299, 62612, 22329, 38679, + 3333, 49040, 21330, 57739, 12858, 35169, 44289, 286, 55773, 25245, 39553, + 5806, 59739, 21230, 38692, 10320, 54840, 32561, 14831, 51480, 28267, 962, +60154, 35946, 19600, 45097, 10594, 53958, 26192, 39279, 1557, 60885, 20200, +33191, 46826, 10067, 65392, 18394, 31019, 45169, 2262, 59299, 26231, 38423, + 6683, 51776, 17292, 31919, 60470, 10307, 44290, 27869, 15693, 62529, 36783, + 5523, 50924, 29353, 17013, 65182, 37072, 7594, 47903, 25469, 59960, 11649, +39765, 26776, 55552, 6500, 38821, 21902, 49857, 384, 31103, 58755, 17607, +46615, 4840, 32705, 49691, 14578, 60239, 25616, 42017, 7396, 11459, 51668, +30479, 3678, 55404, 35692, 20399, 46028, 10492, 62520, 21153, 32185, 44457, + 2177, 57039, 24896, 40068, 10876, 59469, 20151, 30640, 50587, 2628, 41624, +19625, 59924, 30868, 10291, 54057, 36663, 18906, 49580, 7082, 32280, 65025, +12983, 46702, 23776, 41767, 10511, 60536, 25544, 40479, 7243, 50946, 18551, +32599, 57613, 3075, 44050, 27984, 12320, 62029, 35418, 14981, 51062, 27442, + 7378, 64571, 37741, 20767, 49810, 3938, 34014, 55979, 14044, 42339, 24174, +62938, 5092, 31557, 53275, 18018, 45249, 9393, 32144, 64944, 14426, 43431, +24610, 56356, 3311, 39903, 22234, 53210, 14244, 35014, 63279, 8548, 46727, +28001, 15909, 53595, 38022, 735, 31002, 59467, 20727, 47481, 12271, 40660, +26256, 64860, 7421, 45852, 18363, 34123, 59925, 1003, 41671, 24439, 53305, +14853, 31340, 65160, 3391, 42583, 24088, 51857, 13649, 34980, 62755, 73, +45320, 24471, 40031, 11824, 53198, 17161, 31928, 57422, 1456, 47252, 27923, +15695, 62548, 35928, 7779, 50880, 28312, 15368, 58706, 36836, 4179, 46799, +25317, 55865, 8411, 40328, 23260, 61241, 11068, 49072, 26279, 41355, 6238, +57265, 19052, 33422, 47222, 7435, 64660, 20741, 33067, 45247, 1632, 60302, +20241, 37807, 49965, 9421, 28811, 56087, 14760, 42342, 24204, 56998, 4938, +32537, 45509, 14124, 63094, 24883, 40435, 5599, 51373, 20827, 34430, 61444, +10631, 46997, 19143, 36780, 57698, 3672, 30053, 51800, 14641, 43317, 22015, +59530, 1613, 32854, 46008, 16742, 51166, 29492, 6531, 61740, 37381, 19196, +46927, 11751, 54791, 26759, 39416, 5873, 63020, 18604, 36122, 50312, 303, +29843, 62146, 15347, 44489, 28348, 8820, 52673, 36973, 18423, 59077, 5503, +36025, 49295, 14694, 31307, 59835, 527, 42075, 22957, 55860, 11963, 31538, +46061, 18937, 59576, 1790, 31688, 52531, 14977, 45479, 27709, 7968, 60205, +38202, 14727, 31197, 55681, 3443, 47251, 20891, 32058, 61779, 7294, 45127, +19356, 35746, 54619, 11287, 30407, 44739, 2130, 64419, 24351, 40601, 10096, +55321, 20773, 32496, 44952, 1360, 63609, 19849, 33743, 52409, 3760, 46467, +19420, 32289, 58667, 9408, 45881, 25013, 39712, 12206, 60623, 26866, 39148, + 2520, 48752, 22165, 64396, 9157, 31382, 47101, 16301, 53202, 28328, 7211, +61508, 37111, 21026, 47258, 9535, 58780, 19287, 33499, 49875, 758, 43189, +23472, 54175, 11331, 31093, 61559, 2192, 43490, 22941, 51330, 10088, 32681, +56108, 19824, 42316, 1076, 62987, 29774, 16223, 50759, 35744, 3874, 59321, +25232, 42277, 9012, 54513, 21740, 41120, 11189, 60600, 26956, 38415, 4999, +52481, 17450, 31624, 64953, 9083, 44433, 28660, 14171, 54855, 35719, 6279, +57989, 23767, 41258, 10376, 50679, 18060, 32623, 65415, 1372, 47212, 26272, +41303, 12746, 57610, 23291, 39476, 2379, 61383, 20216, 33412, 46671, 7912, +54431, 25300, 38882, 12593, 56023, 22849, 43887, 5995, 63342, 30664, 15715, +51144, 35695, 7642, 47202, 24621, 64575, 12723, 39573, 26599, 50525, 2491, +30718, 60163, 14764, 43852, 27577, 8260, 52693, 36474, 18309, 58237, 1326, +31802, 50705, 13875, 43572, 25140, 63273, 7973, 33092, 47718, 19177, 52510, +10853, 36240, 65066, 15862, 29764, 50109, 2404, 43131, 24764, 63151, 6761, +34674, 46844, 17456, 55587, 8998, 39434, 27195, 63937, 4540, 34719, 48679, +14072, 58863, 23308, 40089, 3695, 54884, 25899, 49157, 8450, 38967, 23696, +63282, 12504, 43821, 21619, 49992, 4405, 33708, 55438, 20418, 47934, 1881, +40936, 25838, 57923, 11778, 40562, 22314, 54506, 2874, 44834, 29170, 15073, +57609, 35445, 4228, 52181, 23821, 43706, 10784, 61905, 18154, 33860, 52503, + 7596, 42415, 26216, 64655, 11054, 38477, 24374, 48627, 1375, 57727, 21030, +38463, 46411, 18704, 61507, 12498, 39335, 26529, 48534, 5424, 60480, 17238, +36828, 52728, 9024, 28897, 47121, 18564, 54515, 6193, 33730, 62267, 13115, +42718, 24003, 52213, 4817, 32765, 63537, 13913, 41215, 24937, 47466, 5449, +61164, 20409, 34290, 44957, 2138, 58931, 19128, 33264, 54191, 5055, 46377, +28929, 15614, 64436, 36683, 10084, 55054, 20544, 47749, 30447, 5451, 52413, +37891, 19438, 57301, 2028, 32578, 46667, 17043, 60121, 10997, 40388, 26397, +54437, 658, 30221, 47243, 17205, 60455, 8148, 34152, 48255, 20980, 54434, + 1702, 40730, 26888, 59734, 13432, 35515, 49686, 5602, 29102, 58530, 18584, +45245, 1992, 33436, 60469, 20778, 42461, 11099, 54582, 26180, 40725, 6166, +61445, 33323, 17115, 51093, 3772, 32751, 54854, 20133, 47966, 11495, 31056, +62531, 17460, 47364, 5412, 39800, 22092, 57883, 12624, 30607, 46410, 6940, +54626, 19503, 32020, 59190, 10238, 43046, 22720, 50814, 4295, 29682, 64905, +20990, 42382, 10759, 54445, 23115, 40897, 2824, 47399, 25298, 60657, 11753, +41398, 21758, 52853, 1039, 33467, 64335, 17768, 44851, 4720, 34952, 52197, +15016, 31151, 62494, 606, 44538, 28702, 15710, 53758, 37368, 9300, 56531, +25222, 42027, 13583, 52234, 31031, 6893, 62261, 35837, 18446, 49530, 101, +34175, 64304, 12974, 43459, 22349, 51938, 2602, 32065, 59994, 17802, 47726, + 9355, 41786, 26505, 55236, 1909, 41290, 22804, 65416, 13173, 32610, 46823, + 6719, 54540, 23492, 39758, 12045, 64391, 25094, 43243, 4090, 55344, 22127, +41291, 13841, 59452, 29758, 1276, 50033, 36340, 17403, 56473, 9312, 43223, +23132, 53346, 12824, 33423, 57433, 4555, 46165, 27387, 16527, 65337, 35203, + 1999, 50379, 27726, 16675, 54879, 38167, 8037, 28972, 63100, 16732, 47529, +27878, 4775, 53177, 37857, 16299, 64065, 28354, 7203, 49807, 37775, 19597, +62344, 4056, 34905, 47846, 18676, 54015, 9288, 40567, 26726, 58527, 13026, +36080, 50165, 1001, 28775, 63098, 16573, 47345, 27478, 5537, 58280, 35524, +15293, 49915, 29349, 6241, 60277, 35441, 14297, 49664, 27594, 7573, 53749, +37762, 17075, 62284, 12875, 35820, 50307, 999, 30887, 63013, 18268, 47454, + 7030, 32403, 56952, 20073, 49585, 10958, 32661, 44642, 18764, 62066, 15, +39288, 24613, 56437, 13491, 31979, 51198, 3069, 40865, 24553, 62314, 12647, +39817, 22261, 52740, 6720, 33795, 57967, 12249, 44793, 27796, 16914, 63891, +37987, 3557, 29913, 47278, 17479, 59893, 11057, 39457, 25871, 54902, 7479, +48740, 21610, 39823, 12666, 64576, 26748, 49142, 3187, 39047, 24515, 57534, +12956, 43850, 21726, 54986, 1892, 33556, 48830, 20110, 58822, 3753, 41628, +25881, 50973, 14989, 32067, 62899, 4437, 45578, 27943, 16111, 51798, 36574, + 8678, 58925, 24223, 43054, 5217, 52074, 17516, 34431, 55082, 9090, 43977, +29595, 17569, 64833, 335, 49274, 21720, 41177, 10127, 60896, 26976, 40807, + 3355, 48404, 23718, 55051, 11974, 39932, 21737, 58290, 4117, 33873, 53315, +17287, 42513, 10698, 56972, 21252, 35487, 47646, 6105, 61887, 20627, 32710, +44676, 9957, 60599, 28760, 15851, 53329, 38181, 5561, 29140, 56358, 17752, +41054, 2817, 61255, 21186, 33883, 46682, 7223, 52009, 19099, 35646, 58810, +11136, 30652, 50978, 20292, 40662, 3113, 61632, 21272, 34165, 52840, 10099, +45994, 18947, 31592, 56573, 6364, 44894, 18141, 33812, 62232, 10800, 42482, +17732, 52151, 31789, 574, 57259, 37965, 16279, 28455, 60705, 9425, 43548, +23467, 62319, 14215, 35992, 50427, 4857, 30156, 63877, 16398, 46693, 28206, + 7015, 60916, 37436, 12092, 49750, 27854, 16015, 64160, 38054, 1659, 29960, +48497, 13167, 60370, 23799, 39140, 3196, 54618, 22231, 49215, 13138, 40231, +27018, 63533, 5931, 32524, 42177, 24828, 58869, 963, 31638, 53961, 13523, +42092, 23975, 55956, 3150, 40323, 22610, 65362, 14183, 36984, 50459, 1175, +28960, 45148, 16687, 58009, 28152, 9021, 49809, 35565, 20684, 56479, 415, +43769, 17616, 53243, 29379, 7684, 57458, 37680, 16691, 49408, 28753, 9810, +63074, 37457, 18147, 51352, 1450, 44954, 21126, 33205, 60814, 4007, 44907, +18266, 32674, 63770, 13287, 47527, 27686, 7894, 61531, 36151, 18376, 51750, + 3548, 33021, 48717, 12457, 65285, 36170, 20165, 44336, 4397, 56755, 26918, +39812, 11433, 62336, 18599, 36600, 50952, 6735, 30178, 63737, 19752, 47578, +10736, 40881, 26003, 55961, 7632, 30360, 47438, 15382, 65475, 28259, 3017, +50145, 36676, 19066, 56213, 11708, 42803, 25440, 63600, 8539, 38927, 22295, +59113, 2343, 29254, 44442, 20052, 55302, 9522, 38480, 27269, 61606, 1342, +34467, 50904, 15010, 40859, 23025, 63564, 3139, 30506, 47674, 18424, 56051, + 8404, 32965, 45961, 17665, 59891, 5996, 38466, 26895, 57052, 13205, 48967, +23783, 39429, 6786, 62954, 18732, 30696, 50084, 10321, 35468, 57833, 20470, +42950, 7328, 54378, 25615, 39103, 11566, 59515, 24767, 43673, 5169, 50993, +17972, 31819, 63040, 2479, 46427, 27930, 15755, 58438, 36994, 4221, 51212, +22365, 42994, 11236, 55603, 26655, 39064, 6684, 60780, 19350, 34585, 46023, +10488, 57213, 22862, 38999, 4402, 51711, 30740, 15663, 59239, 36039, 8223, +50023, 28382, 16396, 62609, 37947, 162, 31061, 57205, 19397, 48710, 10772, +38984, 26620, 53065, 8063, 34326, 63721, 18109, 45085, 5383, 34083, 58628, +20830, 47313, 2746, 37599, 64241, 14861, 28689, 50832, 6613, 41617, 23661, +59318, 9841, 37813, 53951, 15158, 28989, 46683, 3628, 61473, 24256, 41306, +10493, 56330, 32136, 14814, 49549, 35540, 3109, 58097, 27453, 13932, 48821, +35425, 9622, 55950, 24183, 43990, 13422, 32070, 61390, 2250, 49252, 24179, +41902, 6192, 59859, 22254, 41452, 13986, 55788, 33520, 7992, 50828, 37400, +17925, 61124, 10840, 42190, 23328, 53965, 2999, 41257, 25118, 65102, 11466, +46469, 20682, 35684, 57836, 4470, 28687, 48080, 20800, 59541, 10008, 40478, +26293, 54996, 13485, 34343, 44602, 2053, 63947, 24554, 41043, 5814, 54692, +23112, 43321, 14486, 58890, 29478, 6466, 49925, 35950, 17494, 65454, 10483, +43088, 27085, 56351, 4108, 35055, 50706, 14146, 41573, 24563, 60924, 4983, +32168, 48835, 14832, 52523, 28313, 7920, 57467, 35648, 20870, 49981, 4620, +33386, 61517, 15692, 45333, 29212, 1674, 56963, 36860, 17897, 45950, 8413, +61794, 30080, 14944, 51138, 35891, 6131, 60686, 25356, 47355, 10007, 39145, +22303, 63802, 12713, 45173, 29947, 450, 54458, 37162, 19717, 60713, 11547, +42162, 23088, 53667, 2823, 33889, 63735, 19092, 46478, 10681, 32458, 49248, +20853, 60490, 4332, 33915, 47133, 14353, 58895, 26235, 38297, 5579, 48922, +21115, 57147, 13149, 38461, 25840, 61564, 1663, 33612, 47038, 18350, 62840, +10001, 30750, 45836, 20592, 51554, 125, 32287, 65461, 13528, 44785, 27412, + 3692, 51780, 37320, 14678, 56702, 27343, 1915, 49568, 36226, 20142, 64469, + 9225, 42534, 26464, 51565, 14313, 30392, 59912, 4598, 44853, 27716, 16465, +55393, 38063, 1249, 28534, 64595, 18519, 42430, 8153, 49060, 26388, 57896, +13553, 32549, 44117, 90, 61209, 24585, 41107, 14459, 51855, 28805, 2516, +57614, 35537, 20711, 47337, 5605, 63650, 23461, 41854, 13049, 54334, 31043, + 3449, 50602, 36161, 18996, 56446, 7339, 34158, 47430, 12237, 59030, 21071, +33867, 43880, 160, 56236, 19811, 33917, 46056, 8243, 59262, 18802, 36091, +50756, 5905, 28521, 57185, 20026, 44749, 8719, 33595, 62296, 18178, 44384, + 5154, 35314, 56557, 15192, 29420, 53373, 9187, 33583, 50799, 8256, 44845, +20551, 34438, 64323, 4987, 47908, 17054, 36138, 52049, 8387, 30158, 60123, +12576, 42856, 23204, 53070, 7109, 34486, 62611, 19110, 47816, 3490, 41735, +27056, 64693, 11061, 39412, 23047, 50647, 13472, 31960, 62218, 3785, 43984, +27363, 15215, 53915, 36018, 6405, 57442, 26338, 42312, 14252, 53409, 29859, + 8265, 59002, 38035, 15374, 28570, 54300, 261, 42895, 23700, 56607, 9711, +39646, 22966, 59012, 14730, 30756, 53680, 5582, 43988, 27933, 15733, 61921, +34921, 9000, 51973, 24862, 46032, 3079, 31770, 58653, 14749, 44193, 27885, + 407, 54263, 38149, 17004, 31796, 61637, 4157, 43535, 22620, 51651, 10472, +35066, 57598, 17971, 44329, 5738, 34373, 62162, 20958, 49002, 234, 41074, +27222, 52088, 10393, 34524, 57284, 16216, 46375, 32934, 4443, 64133, 25628, +48981, 13020, 41862, 21445, 60253, 6335, 32517, 53630, 12111, 44786, 28264, +16463, 61323, 36519, 1979, 53810, 26592, 41754, 11445, 63897, 21276, 40170, + 544, 51805, 31497, 16064, 59349, 37328, 3784, 49424, 27521, 14483, 55210, +38184, 2267, 28679, 63643, 16803, 47245, 34341, 3607, 56659, 21845, 45291, +14028, 36389, 60101, 8125, 28862, 53152, 20495, 44223, 6195, 33267, 65396, +13308, 42085, 24663, 53381, 8061, 32790, 58986, 15574, 47467, 29437, 1489, +52708, 36844, 16473, 64646, 28153, 7045, 49867, 36942, 18876, 61999, 11956, +43700, 24693, 56271, 3184, 40608, 21218, 48979, 11702, 60420, 26673, 39153, + 4922, 51410, 17621, 35226, 62327, 2285, 31259, 46296, 20601, 57366, 12121, +41233, 26037, 52144, 7293, 32734, 61232, 18441, 44060, 10404, 32441, 60185, +16049, 47458, 29191, 1094, 52204, 36359, 19428, 63798, 12178, 44324, 30751, + 6100, 51678, 35291, 18667, 60726, 1459, 43128, 20908, 52571, 30812, 8478, +62862, 37547, 18462, 50516, 748, 32624, 64502, 16536, 45344, 28537, 6861, +54477, 35871, 19019, 46737, 10895, 65271, 26936, 39892, 4482, 52937, 19696, +30976, 63484, 1701, 44228, 19620, 31984, 56314, 7783, 45960, 28540, 16256, +59667, 37473, 476, 50346, 18481, 31585, 55812, 8121, 44225, 17818, 33496, +61286, 2718, 46833, 17219, 36671, 53231, 6155, 29173, 58067, 18220, 47232, +10588, 38601, 27198, 51985, 4851, 34624, 61005, 12810, 42160, 25150, 54215, + 1395, 30857, 47056, 19863, 59196, 8718, 30849, 46510, 19723, 62981, 1778, +30503, 53685, 19142, 46010, 9091, 34723, 60175, 18781, 43958, 508, 37490, +64776, 14819, 29062, 46645, 10055, 53802, 22268, 41070, 6689, 63206, 25819, +48903, 10361, 34580, 55317, 20118, 44870, 798, 33750, 64242, 19303, 41939, + 7370, 57240, 30029, 16228, 52355, 38080, 5225, 28331, 62097, 18317, 46713, + 9467, 33635, 56125, 20737, 48529, 6396, 40288, 26132, 57910, 14034, 30818, +53205, 864, 40471, 25031, 62869, 15114, 31110, 44719, 7283, 55355, 24337, +39677, 11734, 47742, 22683, 64035, 4070, 31729, 44717, 14348, 52665, 29844, + 8165, 57049, 24923, 44034, 6369, 37403, 60437, 14837, 29088, 54965, 5372, +41872, 22983, 53616, 15674, 31078, 62566, 8428, 44356, 28280, 16399, 60836, +38067, 6780, 31504, 54475, 18213, 43754, 619, 57934, 34949, 20369, 49832, + 9521, 31467, 61981, 13854, 43758, 23004, 52583, 6422, 33693, 57100, 14513, +45817, 23662, 38539, 5076, 63036, 21141, 47651, 12611, 35493, 53695, 6951, +30809, 65221, 16036, 45454, 27422, 9128, 55103, 37970, 15618, 29444, 59448, + 7706, 46749, 27339, 16782, 58399, 38213, 1307, 29418, 46077, 16743, 65075, +27921, 3930, 53285, 36037, 18526, 50242, 9854, 30328, 63356, 21175, 42635, + 2682, 54617, 26054, 39323, 11848, 65478, 17186, 32100, 47992, 572, 55422, +25749, 40948, 11669, 59409, 22748, 47778, 2584, 37488, 63257, 17064, 4213, +54325, 37299, 15549, 58104, 28505, 10671, 49612, 33451, 18068, 61783, 1821, +45484, 28270, 16254, 57215, 36264, 4356, 46748, 25073, 55230, 11614, 39282, +22523, 59122, 9434, 38595, 26064, 53913, 2372, 43354, 21756, 60308, 8594, +36489, 52546, 16942, 29998, 47496, 615, 65462, 24036, 39411, 11235, 48144, +22247, 62482, 2690, 40583, 25519, 48458, 11341, 51774, 20062, 36337, 64739, + 6388, 31088, 50515, 20949, 42762, 2239, 63407, 19029, 35114, 47583, 10312, +58328, 23556, 40953, 1145, 54695, 22138, 42815, 10817, 64064, 34805, 19770, +49827, 7085, 32529, 60104, 15555, 44999, 27408, 9011, 54816, 37984, 14937, +28698, 62928, 1394, 41298, 24930, 54306, 13185, 30047, 47109, 7813, 58703, +24128, 38500, 13195, 55348, 21964, 42725, 5662, 60659, 29581, 14176, 50441, +35850, 9923, 58511, 22466, 39293, 2893, 47765, 25235, 56164, 10141, 40248, +23730, 65344, 5231, 39358, 21717, 51908, 9900, 30832, 47482, 14218, 58576, +24486, 38250, 5352, 48028, 22013, 55752, 11105, 41132, 26511, 64714, 8010, +32324, 46501, 18285, 61358, 12503, 31067, 45884, 7759, 58964, 25667, 39624, +12513, 48726, 24034, 64790, 1441, 39990, 22606, 55096, 10435, 37656, 50403, +16350, 30153, 57040, 802, 46878, 27886, 16967, 61616, 37036, 3888, 45567, +24121, 62983, 11785, 40910, 22009, 55372, 3446, 31033, 45213, 13921, 58466, +22173, 39540, 1021, 54036, 27005, 38727, 10309, 64166, 22468, 46382, 6326, +33753, 56121, 14002, 43004, 24249, 58855, 7183, 41629, 23829, 54659, 9533, +48860, 17184, 35592, 65047, 632, 30216, 48145, 15956, 55022, 27574, 4021, +51339, 35936, 19248, 56379, 8995, 43089, 23125, 61001, 4945, 32258, 48165, +13787, 57184, 22998, 40895, 7794, 64743, 26436, 39799, 12350, 57129, 25566, +47790, 5280, 41705, 20238, 59743, 29010, 10560, 53310, 37178, 20759, 48102, + 3686, 60635, 26448, 39670, 12355, 55885, 21395, 38649, 111, 58123, 29576, +15255, 49789, 37691, 8715, 55299, 23540, 48415, 12658, 39058, 26535, 57658, + 3378, 48617, 18533, 31622, 64162, 9443, 43026, 24752, 53295, 13751, 34494, +57470, 5457, 45328, 20349, 30989, 62155, 9142, 43158, 20245, 51462, 30921, +12718, 59461, 36699, 810, 49025, 22301, 64640, 14911, 30685, 46132, 3578, +57296, 20109, 33990, 44600, 10779, 63610, 17169, 34685, 53057, 5987, 44246, +17168, 34815, 56683, 11684, 41908, 25253, 64195, 3168, 39422, 25101, 55084, +11981, 47463, 20685, 34794, 58463, 5545, 41831, 25580, 56030, 13768, 36179, +50513, 2550, 29724, 60194, 16452, 43900, 28253, 4574, 58158, 36866, 17652, +50579, 10578, 32257, 55777, 20633, 46313, 2247, 34679, 60307, 19845, 48665, + 7323, 37511, 52927, 15262, 28956, 59284, 1662, 45036, 27818, 16471, 64386, +36399, 7597, 50783, 21969, 42042, 11454, 57076, 26813, 49026, 3049, 41466, +22623, 62252, 12981, 46226, 29820, 1212, 53570, 35300, 18524, 58617, 9118, +33930, 50861, 15352, 41886, 21947, 64442, 2162, 32453, 52287, 16175, 46315, +27828, 8544, 63657, 37506, 19930, 49372, 1038, 33301, 57445, 13123, 48385, +24315, 40540, 4465, 58806, 22535, 48919, 10075, 40023, 26020, 63788, 13564, +31943, 53023, 7581, 42687, 23856, 56122, 3752, 39139, 21427, 63599, 12261, +30823, 48245, 1794, 59497, 24784, 41335, 11122, 48928, 22160, 55915, 3507, +40365, 25106, 59125, 13588, 37748, 49507, 4509, 29255, 61739, 18971, 41483, + 1769, 50953, 32099, 14563, 64458, 36551, 4479, 49754, 27604, 15509, 61591, +37044, 9094, 48958, 24436, 60072, 14318, 32518, 44542, 5098, 55530, 27570, +15465, 38165, 60467, 8978, 29853, 50545, 21092, 42245, 3766, 53661, 19452, +34829, 62793, 9884, 45617, 17576, 36657, 52443, 6862, 28517, 61178, 14457, +45419, 27492, 64045, 19942, 42660, 278, 52277, 21554, 35551, 59553, 6933, +43961, 20927, 37868, 53139, 9943, 30655, 63230, 14029, 42595, 21706, 51356, + 795, 33057, 64023, 17880, 43638, 6754, 50931, 30076, 15510, 61745, 36626, +11487, 46131, 23580, 58421, 6053, 41089, 24674, 54576, 12394, 43441, 21594, +59188, 7017, 36815, 50465, 16855, 31483, 57221, 9403, 42633, 22825, 55598, + 3263, 33971, 46307, 17491, 60275, 9273, 39071, 27172, 53244, 14237, 32375, +55551, 4966, 45417, 28774, 16324, 60355, 35657, 8281, 50426, 31169, 17978, +57202, 5328, 43610, 26241, 52033, 13697, 37439, 64793, 2563, 29405, 48594, +20263, 57879, 5232, 31277, 45757, 19249, 59582, 8988, 32820, 44004, 18594, +63885, 2318, 32419, 51871, 16283, 46095, 29780, 3730, 64736, 36430, 16737, +49533, 27979, 887, 54447, 37448, 20297, 63186, 8024, 43342, 26958, 52100, +14030, 33152, 59207, 386, 43249, 25983, 53040, 14833, 33304, 56761, 3525, +43505, 23395, 60931, 8598, 40872, 27149, 49045, 12480, 60181, 24700, 38671, + 1664, 54271, 20529, 29376, 50914, 5446, 36291, 56410, 21181, 42218, 194, +52070, 18858, 34873, 60712, 7076, 31238, 51191, 11836, 45756, 18155, 31595, +62074, 4743, 45459, 27668, 14686, 60929, 37976, 8604, 31374, 54799, 14194, +48638, 27730, 5543, 38138, 53221, 16804, 31569, 58183, 9120, 48034, 25880, +41049, 6154, 62288, 25121, 47530, 11472, 33767, 60669, 17284, 42878, 3883, +55460, 29528, 15881, 50462, 36682, 1452, 61651, 21761, 47876, 12895, 39489, +27205, 60371, 3586, 38419, 22294, 56142, 13621, 44419, 28229, 7605, 61988, +38223, 12466, 31089, 46404, 21057, 63569, 2426, 39751, 26627, 50666, 11155, +34391, 58882, 17716, 45262, 31, 36802, 55171, 15934, 31128, 48246, 3372, +53794, 21470, 38614, 13260, 58778, 31219, 2373, 50289, 36048, 17562, 62280, + 5641, 44984, 30934, 15239, 58153, 36874, 7307, 50929, 24724, 43597, 10048, +63924, 18403, 31889, 52056, 4884, 44807, 27887, 16072, 61664, 36065, 6470, +46655, 23649, 62712, 11282, 40837, 22229, 52518, 4278, 33810, 58585, 12494, +47512, 23390, 39798, 1543, 64788, 25967, 48950, 11390, 41469, 22524, 55334, + 3096, 39213, 24884, 63437, 6573, 45346, 19974, 32134, 54976, 8760, 42414, +24205, 61709, 12106, 39024, 22756, 51791, 5438, 30028, 55829, 20588, 41343, + 279, 60666, 21639, 32026, 47658, 7738, 55557, 18085, 30006, 44443, 9922, +61387, 17707, 31460, 44382, 6468, 53567, 17360, 32522, 62633, 1263, 47922, +23701, 40485, 11490, 65127, 20086, 31952, 54074, 7334, 47807, 23766, 40263, +11937, 62291, 21662, 40156, 5799, 48343, 26659, 65499, 9481, 30576, 43948, +13001, 55076, 25529, 39510, 3996, 63431, 20526, 33087, 50195, 10966, 42849, +23344, 61038, 3690, 33741, 54425, 13197, 46029, 24255, 38818, 5021, 65275, +21455, 38560, 14011, 56154, 30866, 7113, 52621, 36873, 15994, 60096, 27464, + 6132, 49496, 37778, 20813, 61733, 4843, 46169, 23465, 39130, 11737, 55723, +26661, 42642, 3856, 58528, 18058, 35375, 50425, 9684, 29608, 61472, 17753, +43529, 7229, 55633, 34028, 21008, 46124, 2066, 65307, 17270, 35175, 50771, + 5090, 28773, 45696, 19591, 61069, 2664, 39971, 25305, 51456, 10521, 32457, +58586, 16322, 44374, 28278, 6116, 53269, 36697, 15607, 64865, 28634, 8775, +50522, 36714, 16272, 62311, 28541, 921, 50310, 36494, 17578, 57810, 9455, +34311, 52946, 21259, 43468, 6974, 60044, 26466, 40151, 10545, 52063, 19641, +32431, 56151, 6199, 44988, 23619, 40184, 2396, 57232, 21682, 38514, 10959, +49162, 23378, 62642, 995, 34332, 44892, 17598, 53283, 7152, 34501, 61411, +13831, 45809, 25107, 39856, 5269, 57752, 20783, 34686, 49773, 1581, 30334, +56786, 20539, 44265, 10105, 32925, 47514, 17487, 55656, 8834, 31328, 45389, +14224, 65233, 27572, 5212, 49983, 36767, 19816, 58866, 2949, 41859, 26267, +55541, 8627, 38871, 25894, 60565, 12685, 41878, 21996, 53282, 4561, 34354, +55312, 16707, 47827, 28441, 1924, 64090, 35555, 15875, 50405, 28073, 4187, +55825, 38047, 14939, 29203, 63521, 1170, 46958, 27972, 14567, 61456, 35617, + 5292, 49854, 27750, 16398, 62756, 38172, 7782, 29832, 56885, 19622, 49168, + 809, 41560, 26308, 61574, 12098, 39902, 23735, 48661, 2800, 65118, 21820, +39033, 12230, 53941, 27165, 38650, 1612, 61807, 23939, 41803, 9889, 55666, +17741, 32472, 51430, 7969, 41745, 23366, 62086, 13958, 37446, 50671, 4116, +28604, 56681, 12254, 46442, 35894, 20289, 60250, 7120, 42114, 26285, 55766, +12796, 32377, 46066, 6804, 61539, 25402, 39446, 11002, 50698, 18405, 31133, +57211, 5557, 48122, 24214, 39269, 11316, 61961, 21341, 48949, 7506, 40901, +25192, 64459, 12684, 38797, 21282, 50977, 1196, 34249, 62402, 17770, 45410, + 4758, 33898, 56833, 17459, 47523, 8789, 34631, 61669, 15477, 45196, 28126, + 9484, 63993, 35658, 15210, 54063, 27901, 3873, 49364, 37600, 16369, 63274, +27941, 2581, 52125, 36674, 19418, 57612, 9868, 42709, 26408, 48956, 2108, +59476, 23660, 41407, 9820, 63440, 19900, 34110, 50906, 345, 43352, 23595, +65213, 13157, 38263, 21351, 53683, 2685, 43435, 18115, 57745, 29893, 9178, +52567, 35887, 21010, 48127, 7439, 63250, 18687, 33112, 44482, 9753, 54293, +25003, 38378, 5558, 64687, 21209, 48592, 11853, 40687, 25727, 52431, 2007, +32171, 59236, 16819, 48884, 27318, 5647, 58050, 35583, 17872, 53524, 8549, +45885, 20556, 36605, 62375, 6347, 29127, 51978, 20328, 42387, 8865, 63215, +25762, 40295, 11577, 55701, 22942, 46741, 7107, 33662, 65140, 15830, 45474, +27293, 9003, 56343, 37779, 19527, 53496, 1548, 42927, 22935, 61570, 13836, +31933, 53078, 3242, 42264, 23355, 59329, 14289, 34125, 53846, 1988, 42638, +25276, 58659, 12932, 41119, 24714, 56046, 881, 38573, 21329, 50675, 14463, +29624, 61977, 8614, 43993, 27866, 16436, 53876, 36704, 5897, 59935, 29317, +15703, 50058, 35727, 8234, 58746, 28788, 13277, 52815, 35763, 17257, 49524, + 4549, 29323, 58446, 18666, 45612, 2163, 33389, 60114, 15861, 47316, 27416, + 9191, 62435, 37936, 15330, 29641, 48675, 5011, 64540, 19923, 36645, 52121, + 1845, 34187, 48511, 20712, 58093, 3995, 41168, 25875, 51532, 8166, 30459, +56558, 19301, 44848, 9316, 38415, 27177, 58919, 4186, 46306, 18393, 36043, +51704, 120, 30608, 56756, 15742, 46150, 28420, 3293, 58805, 36764, 14623, +53748, 24271, 45763, 1099, 32611, 61765, 17743, 43510, 8853, 56592, 28346, +15718, 53501, 38226, 6027, 29262, 58441, 16784, 47788, 27702, 189, 52736, +35764, 18884, 58845, 9588, 48704, 27033, 40981, 2268, 61301, 20183, 34089, +51201, 9682, 42886, 17920, 65054, 29105, 533, 53967, 35694, 14025, 48328, +23888, 59849, 7625, 38361, 21509, 48426, 12849, 63262, 25972, 40645, 3097, +54281, 24934, 39078, 12093, 60144, 23587, 39049, 5714, 52300, 19165, 32008, +56359, 9244, 43365, 23384, 59524, 13983, 33260, 53781, 8017, 47464, 28387, +15495, 62126, 35603, 343, 47197, 23209, 55788, 12859, 39787, 25690, 60365, + 2220, 47489, 19837, 33049, 55106, 5459, 45610, 19374, 32753, 60994, 10825, +44922, 30413, 20725, 48642, 2875, 64028, 27191, 38267, 12885, 54891, 21699, +43924, 441, 63127, 28558, 16554, 53395, 35380, 8156, 48299, 25572, 63725, +12635, 41091, 26739, 47385, 5531, 58467, 20396, 37087, 51029, 10530, 29033, +56317, 20348, 47153, 1917, 32436, 64474, 14745, 48387, 28027, 8083, 59032, +37065, 17304, 51782, 12851, 36644, 60721, 3402, 30010, 25443, 62397, 11900, +40763, 22769, 52987, 2311, 34348, 56367, 16044, 45227, 28901, 11048, 62729, +35099, 17546, 52608, 6338, 45717, 31114, 15760, 56880, 35545, 1638, 46696, +24818, 62881, 10003, 31388, 44947, 13948, 59669, 24562, 41520, 5606, 56608, +21971, 47672, 13133, 37235, 60617, 8460, 31296, 53005, 17014, 45028, 27322, + 7662, 54172, 37264, 18326, 58884, 1745, 36916, 50848, 15136, 31793, 45338, + 4406, 63934, 24993, 38628, 10662, 48831, 21655, 57406, 7246, 31751, 44436, +13941, 55029, 25794, 41162, 6621, 59755, 21223, 47680, 11074, 32879, 58095, +19466, 46040, 3669, 34394, 63156, 15758, 44343, 28216, 594, 55205, 35220, +10223, 48030, 22425, 64681, 14699, 32013, 44556, 1098, 54121, 24699, 39159, +11358, 63018, 23184, 48882, 2771, 40028, 21478, 53987, 13912, 33089, 59707, + 1666, 45047, 27324, 16475, 64169, 38125, 3893, 31126, 55367, 16271, 46147, +29068, 2381, 58474, 35795, 17291, 53983, 5747, 43707, 26418, 56534, 9548, +31745, 53208, 13058, 42887, 22973, 65235, 7215, 30409, 53434, 19746, 44239, + 2686, 32043, 57893, 21108, 48929, 6211, 41762, 23147, 60168, 13538, 30593, +50632, 8583, 41419, 24617, 55574, 12631, 40943, 25878, 64407, 5785, 39741, +21405, 53959, 12431, 38534, 26322, 56428, 6321, 46675, 17513, 29603, 60506, +11081, 41606, 24740, 54749, 7648, 39207, 22810, 61530, 11797, 49154, 26649, +39718, 5111, 64487, 18921, 31941, 45795, 571, 54657, 25891, 39090, 11893, +60081, 22681, 48481, 2923, 41026, 26935, 57818, 14356, 36072, 51101, 6767, +30521, 62951, 20232, 46559, 8881, 34378, 55697, 14924, 44347, 28365, 948, +65188, 38037, 16276, 29510, 55421, 3539, 43646, 25394, 57852, 13702, 35833, +50149, 5321, 30177, 60333, 17738, 45515, 1272, 36929, 59320, 14248, 28778, +52562, 4450, 43899, 28031, 16386, 63517, 35018, 11024, 50203, 23985, 41589, + 6484, 56823, 19599, 29896, 46763, 10453, 65019, 25540, 38371, 5405, 48980, +21242, 62430, 10236, 38492, 22056, 51493, 5774, 31185, 63862, 15359, 47169, +30625, 7165, 53955, 35783, 19869, 57105, 2551, 33017, 45909, 13448, 63291, +22118, 39152, 191, 47451, 26368, 55695, 12220, 40012, 23609, 63809, 1811, +46738, 19325, 33312, 55584, 8129, 43083, 24580, 65346, 13591, 30939, 52243, + 6712, 44222, 34961, 18545, 57831, 2638, 43234, 25815, 54870, 10162, 40032, +22735, 57203, 13315, 29347, 45147, 6986, 63477, 28725, 16318, 52790, 37059, +11008, 48185, 22651, 60901, 2842, 33829, 48951, 17501, 63920, 12501, 42105, +25116, 55159, 7847, 41281, 22567, 62947, 13100, 34044, 52639, 6354, 42444, +22443, 63729, 11542, 33244, 50824, 19186, 42507, 5342, 57951, 23179, 38836, +13449, 50926, 30226, 1914, 64653, 35921, 17950, 49307, 9229, 34277, 61431, +13632, 42682, 25358, 54936, 5548, 32997, 46942, 17478, 63123, 11249, 31851, +45819, 14965, 57898, 28034, 3770, 49244, 37535, 19964, 56859, 10953, 32228, +51656, 17855, 43126, 5848, 62905, 27240, 39747, 1518, 52505, 34221, 19062, +56172, 10323, 44579, 35076, 20782, 64780, 449, 34911, 47635, 13292, 55387, +25164, 41708, 7800, 62883, 24790, 40643, 1310, 51990, 18636, 30406, 63333, + 5696, 44752, 34776, 19093, 56530, 9707, 42965, 26827, 64297, 4424, 33219, +52387, 18904, 46115, 9293, 31302, 56383, 13695, 42940, 25788, 63455, 7330, +38688, 22185, 53590, 3651, 34870, 56227, 17231, 41186, 11562, 58135, 23148, +39151, 5971, 50821, 31025, 14931, 58553, 36310, 5109, 50105, 22134, 42870, +14001, 59326, 29840, 3303, 54450, 36720, 17307, 49706, 7846, 33056, 64980, +14382, 44212, 27467, 3837, 59973, 38146, 16705, 29875, 54814, 6419, 44616, +27367, 15906, 61812, 38228, 4471, 29656, 48795, 20002, 55043, 7788, 41716, +51413, 19575, 36054, 58387, 6473, 28992, 48076, 19396, 60890, 7942, 40038, +25134, 51064, 642, 31890, 57751, 13617, 48391, 22739, 40258, 5415, 64987, +28856, 14794, 50381, 37537, 8173, 57988, 23438, 40695, 151, 54248, 26442, +38815, 9345, 65192, 18223, 31427, 51647, 2503, 44439, 27429, 16372, 62297, +38218, 4017, 30174, 48935, 19722, 64909, 10536, 30282, 45687, 20743, 55250, + 5798, 39805, 22618, 58377, 11886, 48027, 29241, 15780, 52599, 37024, 3763, +62042, 28463, 16431, 49947, 36495, 36, 63527, 28390, 15895, 50737, 36770, + 4503, 54594, 24282, 42185, 13209, 60860, 29807, 6543, 52910, 36961, 20608, +47179, 12295, 60269, 25303, 40315, 4742, 56229, 19805, 35279, 51373, 8230, +29181, 59642, 18535, 45207, 6032, 34153, 56891, 13211, 42999, 24240, 65109, + 8449, 30417, 52612, 14590, 43936, 28700, 6259, 53883, 35576, 14305, 60732, +27908, 8500, 50585, 37018, 19484, 63666, 9750, 34296, 51671, 13954, 41329, +23175, 62709, 3807, 36309, 50081, 15181, 30591, 58148, 763, 41879, 24065, +50639, 9872, 34069, 62821, 17366, 48221, 11281, 40397, 25362, 54655, 1760, +32630, 64986, 18567, 42590, 5210, 53529, 34616, 17109, 57878, 523, 47097, +31106, 16202, 59136, 35462, 3597, 50649, 23144, 42952, 13569, 63998, 34940, + 1837, 49890, 20732, 33149, 56011, 4735, 45620, 19139, 33663, 57109, 1334, +46610, 28400, 15416, 58942, 37379, 8385, 52090, 24074, 42293, 12738, 62564, +21890, 41105, 6589, 56228, 30880, 15720, 51663, 36099, 10186, 63861, 21940, +45813, 239, 34465, 56594, 15079, 43847, 27674, 4725, 61565, 36124, 19990, +52628, 12820, 34578, 47260, 6834, 59389, 24307, 39403, 11839, 54484, 21477, +39290, 1938, 64551, 23190, 47599, 9852, 33661, 57398, 15097, 43017, 22414, +51102, 6216, 32446, 61950, 16971, 46004, 27342, 390, 57575, 37957, 20458, +52794, 4085, 43098, 27114, 62901, 14108, 33636, 51626, 1061, 42082, 23011, +55144, 13712, 39895, 26999, 57011, 2889, 48212, 17421, 33399, 59976, 11924, +41710, 25564, 55190, 4625, 38785, 22452, 65431, 10928, 47881, 30765, 16857, +52959, 35652, 6398, 59123, 25112, 42778, 9274, 51664, 17476, 34136, 60486, + 4275, 43337, 25629, 54052, 9646, 39576, 22031, 60844, 14425, 35029, 50645, + 543, 40052, 22917, 55441, 10167, 29698, 63244, 13692, 41723, 23423, 52170, + 7549, 32676, 62122, 17107, 46992, 3427, 33801, 59087, 14725, 40534, 22898, +54400, 668, 31694, 62473, 13254, 45947, 24024, 40162, 8644, 57430, 21891, +39341, 1599, 52479, 30463, 16779, 60306, 35253, 5113, 49336, 27925, 16335, +61219, 35357, 10093, 45784, 24822, 55297, 2483, 40016, 17103, 60869, 34425, + 6828, 53994, 24831, 42471, 10642, 59574, 20259, 37788, 50073, 4808, 28158, +55998, 21366, 40828, 2641, 63930, 19741, 31466, 45220, 8816, 59940, 24815, +39764, 1508, 54386, 19263, 37173, 51463, 8314, 29873, 64101, 15669, 44667, +27743, 1991, 61075, 36367, 19792, 49910, 9310, 33083, 55034, 13319, 42433, +23022, 61870, 4892, 31119, 46869, 17300, 59254, 7760, 29814, 52089, 15639, +44281, 28147, 3566, 58031, 37114, 18388, 50561, 9520, 34737, 60346, 21135, +46781, 11191, 41250, 25796, 59079, 3102, 39261, 21920, 54380, 11442, 36585, +50529, 15835, 29835, 61434, 7043, 43925, 27855, 15440, 58055, 35371, 662, +51285, 23526, 42144, 12390, 60085, 26061, 41618, 8787, 51140, 19872, 32666, +65429, 1213, 42335, 24795, 48317, 8586, 62574, 22795, 40427, 12406, 53950, +26661, 39260, 1682, 64683, 18978, 32296, 51658, 9725, 42923, 18675, 61022, +28361, 215, 51616, 38240, 16176, 30473, 57862, 8631, 49077, 24489, 40869, +11788, 63713, 21970, 48915, 699, 33866, 54085, 18456, 43039, 12115, 63365, +26629, 39099, 1433, 45010, 10351, 33821, 64859, 17092, 44459, 2660, 36863, +53966, 14883, 30035, 63570, 10595, 47064, 23593, 40531, 3926, 61847, 19603, +36907, 51005, 10279, 30743, 56160, 19982, 45297, 3640, 32254, 61367, 17288, +43756, 11274, 51039, 20929, 34932, 58679, 6777, 46547, 28371, 15517, 54469, +36377, 9241, 57959, 23956, 47072, 13489, 34344, 55874, 348, 42136, 24544, +59915, 13455, 32140, 52463, 8474, 42731, 24555, 64514, 1918, 32920, 45038, +18962, 55339, 6153, 40976, 25380, 59286, 9946, 33284, 47059, 18348, 56303, + 7518, 34303, 45534, 14854, 65341, 27746, 2012, 49542, 37130, 17762, 56852, +10674, 42107, 25858, 64389, 2741, 33349, 53579, 14411, 45722, 27831, 9188, +62760, 36933, 17484, 49470, 3860, 33103, 61885, 15904, 47713, 28754, 155, +51258, 37562, 16566, 58021, 27511, 3241, 49281, 36721, 20644, 62352, 11852, +48425, 26175, 41538, 650, 57786, 22687, 46603, 6895, 30995, 49207, 17582, +60385, 1782, 32485, 45288, 16024, 53691, 27534, 6955, 61420, 37740, 19228, +47065, 11775, 60543, 27067, 39295, 5075, 55374, 19901, 45736, 29763, 7725, +59098, 36290, 13908, 52663, 22832, 46181, 9130, 31942, 61917, 20994, 48822, +11516, 39882, 26601, 61004, 7645, 43589, 21710, 54438, 11692, 40086, 25754, +60022, 7185, 47828, 18212, 30385, 62377, 10650, 42577, 23524, 52344, 6661, +31556, 64902, 12153, 44194, 34273, 16760, 53837, 27680, 2448, 60987, 36077, +14763, 49469, 28410, 4639, 58334, 37217, 20517, 49847, 1771, 42748, 26361, +58972, 8047, 31896, 53866, 16252, 44284, 28218, 9628, 60060, 37423, 17887, +46925, 2747, 54894, 26558, 39366, 10159, 61880, 18807, 32096, 52290, 4107, +42843, 26137, 60695, 14500, 33072, 50735, 8280, 41757, 25458, 56100, 3731, +38732, 27112, 64161, 12808, 48136, 28282, 8145, 55737, 37580, 15247, 50831, +29138, 10033, 61074, 36238, 18189, 47296, 7771, 55186, 23578, 38394, 11420, +60519, 27037, 43797, 6031, 58577, 19242, 35881, 51737, 9716, 30276, 45863, +19227, 61339, 434, 34527, 50857, 18719, 43675, 9892, 59573, 26043, 41630, + 1747, 51860, 28196, 14410, 61497, 37811, 3920, 49769, 21073, 31953, 54921, +10788, 42330, 20050, 64753, 30017, 6886, 50591, 36400, 20159, 56219, 3604, +43668, 26332, 62762, 8999, 32314, 53743, 17489, 47716, 4150, 40093, 21129, +59930, 29160, 1024, 50034, 36985, 20879, 55631, 11496, 42670, 25960, 65296, + 5970, 31887, 50269, 11364, 44549, 27705, 16567, 58560, 35980, 4968, 53894, +26032, 47209, 10836, 32739, 64167, 15427, 47058, 28502, 3567, 56623, 37509, +14858, 51116, 29689, 941, 59304, 37738, 19371, 49438, 7972, 32120, 64882, +20896, 42899, 11222, 51745, 26840, 39120, 426, 62672, 22870, 47931, 13276, +35138, 53278, 7646, 31645, 59009, 18385, 43644, 10778, 51482, 28649, 16142, +56221, 36715, 4490, 49413, 21058, 30129, 60783, 10379, 43219, 24012, 55689, + 5505, 34409, 47339, 13753, 58204, 24397, 41035, 4031, 52578, 29640, 15502, +64901, 36659, 8013, 49848, 27856, 15056, 57239, 37641, 2636, 49404, 21130, +31644, 60680, 10865, 46198, 20345, 31567, 63715, 6592, 45906, 27935, 15395, +54821, 38075, 2182, 29882, 65099, 17749, 48741, 8248, 33030, 57125, 14210, +41938, 26201, 48450, 1157, 59864, 19701, 33908, 45064, 3919, 65011, 18310, +37127, 53901, 10112, 30213, 46981, 18865, 62933, 2642, 36423, 54512, 16811, +30266, 47318, 6812, 57394, 26120, 39669, 10937, 52669, 18782, 33128, 56804, + 2590, 45507, 20705, 34054, 61426, 7369, 42591, 23301, 55763, 13576, 35444, +49509, 4584, 31446, 56518, 21143, 42871, 9585, 63029, 19896, 33541, 52655, + 2254, 45545, 18080, 33107, 57137, 5840, 43698, 25666, 60422, 10227, 41130, +22920, 52161, 4891, 34663, 57606, 17230, 59768, 36851, 20580, 50834, 9269, +31003, 56679, 20167, 43907, 4644, 32192, 58575, 16822, 44424, 27578, 8847, +54217, 34898, 16663, 59403, 28227, 2095, 49514, 36703, 17823, 64293, 12033, +41390, 26648, 53028, 6181, 33564, 55853, 19362, 41778, 3366, 63132, 29740, +14045, 50642, 37798, 1454, 60552, 20582, 32230, 52727, 6317, 44276, 17626, +29537, 63604, 9134, 40325, 23501, 50107, 3126, 36353, 60995, 15015, 29458, +51397, 8915, 41283, 25486, 62930, 13051, 39234, 22572, 53444, 3272, 39225, +26470, 62409, 12303, 42897, 22287, 52808, 5196, 31136, 59518, 16309, 44595, +28347, 8494, 51971, 34733, 19675, 58644, 5618, 44836, 29951, 16816, 50920, +36991, 1335, 57252, 23745, 43346, 10822, 51092, 19716, 30083, 58448, 7679, +44292, 27341, 14914, 54205, 35951, 5761, 63529, 31134, 18151, 52126, 9237, +43257, 27026, 55986, 4764, 39717, 21476, 65533, 14615, 34360, 53085, 8926, +40744, 25633, 56883, 11710, 39999, 21492, 63237, 5273, 47768, 29506, 16646, +52240, 35718, 8945, 57164, 25676, 42606, 3005, 52114, 30979, 15569, 64630, +36539, 1125, 49718, 27451, 15228, 62384, 37227, 4141, 49433, 19989, 29447, +58423, 2661, 44502, 35382, 18150, 52641, 4579, 33713, 65470, 15679, 45243, +28829, 978, 56027, 36241, 14494, 52772, 24771, 45700, 2985, 35867, 57326, +16330, 28506, 46938, 9601, 59477, 24910, 40002, 4165, 48507, 21529, 56129, +10860, 31349, 44890, 20097, 63397, 7940, 32927, 44849, 18462, 53423, 10477, +30231, 60799, 13688, 46862, 23988, 39865, 3479, 65508, 19323, 33034, 48437, + 6176, 56944, 23969, 40214, 11510, 63389, 20509, 32745, 50514, 1667, 46122, +28165, 15413, 63949, 36118, 10667, 46672, 22187, 53093, 516, 31537, 62738, +18430, 45999, 10353, 32339, 54610, 20467, 44486, 2122, 32949, 60636, 19478, +46977, 4867, 33210, 58470, 20999, 44608, 1776, 34818, 63734, 15939, 31005, +50650, 3575, 41486, 22511, 64643, 12957, 32732, 45521, 2045, 54315, 24248, +41279, 7863, 63587, 22725, 42911, 13102, 54553, 26931, 39146, 4131, 57620, +17680, 35489, 50144, 11575, 29504, 62838, 20641, 45558, 7070, 34876, 58338, +19082, 45311, 950, 34748, 56661, 13402, 41743, 24655, 59780, 2299, 31443, +49411, 17440, 41034, 10915, 58393, 20632, 34229, 52502, 6295, 45468, 19786, +32003, 64861, 10803, 49187, 17957, 34019, 44175, 5859, 58179, 17411, 31333, +51567, 2394, 41488, 24683, 53650, 14421, 36150, 61552, 7712, 32149, 51236, +19006, 41339, 3041, 60590, 20746, 34803, 44583, 7139, 58062, 23422, 39172, +12155, 48287, 25058, 62528, 9388, 41160, 22207, 52642, 5497, 34557, 56633, +13590, 41769, 25653, 58192, 4238, 31222, 53400, 15039, 46732, 28812, 8681, +57163, 36395, 18319, 45502, 3234, 65154, 29135, 15216, 49670, 37516, 752, +62316, 23475, 42066, 6765, 57523, 26243, 40594, 11629, 52371, 17117, 36343, +63343, 946, 30361, 50364, 19205, 42074, 6666, 62514, 26736, 38703, 10071, +56380, 18745, 31792, 46483, 3, 60474, 20657, 31927, 44332, 6219, 53868, +18627, 33170, 62719, 9220, 43229, 23471, 51538, 898, 33931, 55948, 17686, +43967, 4391, 33189, 61597, 13511, 42502, 24887, 52622, 6424, 37673, 58222, +15187, 30641, 45734, 4632, 63512, 22340, 38761, 8036, 54811, 25023, 48856, +11147, 41913, 21489, 57514, 5549, 41612, 26402, 50343, 8330, 32006, 59243, +14675, 44112, 27788, 5101, 53707, 36467, 13765, 61942, 23446, 44090, 4398, +37497, 60254, 14239, 29493, 47362, 10224, 54569, 18410, 31655, 46874, 3585, +58072, 25351, 39890, 11464, 64291, 29361, 15277, 53551, 38109, 5909, 29414, +48804, 12553, 61275, 23120, 40001, 7656, 54003, 27194, 39506, 13075, 65325, +21647, 38997, 3027, 56602, 31433, 15446, 50061, 28655, 5849, 46941, 9, +41482, 26721, 60764, 14316, 34744, 47350, 8284, 63953, 18660, 37188, 50872, + 1283, 29226, 47773, 15361, 61198, 36136, 7231, 45421, 22402, 56570, 9580, +34561, 44358, 20634, 60007, 1005, 36311, 49485, 14804, 30355, 61608, 9651, +45157, 21133, 33096, 56958, 5481, 44053, 19495, 30620, 49098, 11242, 62404, +21222, 34000, 46480, 4244, 57013, 20286, 34724, 45894, 9976, 54348, 19213, +33976, 58614, 6665, 46933, 20899, 33985, 56302, 961, 45726, 19757, 34036, +60570, 8608, 43393, 17217, 51905, 30144, 1472, 58236, 36108, 18887, 49818, + 9331, 34416, 61293, 20694, 46346, 385, 36681, 63677, 15360, 28826, 54059, + 7922, 41974, 24691, 60805, 12992, 39377, 26509, 64203, 3357, 41404, 22051, +52551, 13939, 35491, 62203, 2171, 46568, 28362, 16623, 56499, 37774, 9940, +50216, 25345, 41742, 1527, 61790, 17365, 32351, 51717, 10682, 42768, 24311, +59816, 2629, 31488, 47971, 19939, 54871, 4045, 38256, 27286, 48868, 14366, +59410, 34762, 5, 44587, 23454, 64085, 13213, 38313, 21937, 48603, 6587, +56073, 26012, 41174, 11701, 59882, 18985, 31038, 44691, 6075, 57158, 17611, +34371, 51994, 10499, 41634, 24559, 62678, 8381, 31621, 46958, 20140, 57444, + 6847, 39110, 23258, 51053, 10302, 32127, 63549, 19318, 43316, 6042, 58489, +22755, 40398, 14792, 51305, 29831, 51, 63849, 36641, 13916, 52973, 23937, +42774, 7078, 62360, 17319, 33623, 47282, 884, 59459, 27514, 15496, 50842, +37574, 3152, 64075, 23455, 42465, 6191, 55287, 29655, 15878, 50694, 35784, +11038, 61019, 25329, 44833, 800, 35196, 53984, 15842, 30554, 57592, 7232, +42340, 23228, 52877, 9168, 33672, 58404, 19967, 48112, 4541, 40059, 25610, +56420, 13458, 43762, 22040, 59826, 5637, 35451, 50493, 14902, 29373, 56932, + 7607, 41916, 25285, 64949, 10785, 30435, 48827, 13900, 54232, 24244, 40884, + 5554, 57518, 21930, 43804, 14744, 52223, 30398, 7354, 59387, 36133, 18501, +47636, 11344, 55721, 27080, 38978, 3144, 58906, 17213, 33221, 51288, 6272, +43330, 24502, 64367, 9205, 32741, 45812, 19533, 55588, 2627, 31258, 44034, +17314, 60320, 9849, 31079, 52724, 14240, 40997, 23318, 63242, 7649, 33113, +45828, 18966, 53572, 5858, 34830, 64140, 15659, 29817, 51106, 1287, 41906, +24196, 59472, 12376, 38291, 23167, 53204, 3080, 30709, 61746, 15026, 45680, +27789, 8366, 60481, 37504, 19815, 46612, 10518, 63839, 22233, 38987, 1339, +55972, 26870, 42547, 9727, 48774, 24909, 64925, 13055, 30917, 46608, 360, +52883, 18686, 32342, 59721, 4694, 45179, 17507, 36797, 54320, 8197, 29083, +64301, 16043, 46447, 28511, 1471, 50984, 36298, 17995, 63327, 9883, 43917, +21094, 34243, 60368, 6118, 48933, 20006, 32481, 55125, 11586, 41932, 24615, +60117, 8436, 36270, 53517, 12771, 31972, 47925, 20227, 64489, 2871, 33718, +44735, 18965, 54928, 7828, 41260, 25455, 59343, 12335, 43577, 22822, 54089, + 3119, 34115, 48220, 20729, 59056, 11939, 38935, 26414, 51325, 8726, 36302, +64248, 16111, 28915, 47558, 4715, 56526, 25392, 38845, 11497, 53355, 19311, +29822, 64676, 7011, 47843, 20775, 30876, 56771, 10798, 47679, 19830, 34878, +60436, 173, 28527, 48537, 20080, 54167, 9594, 41046, 26725, 60964, 14697, +32918, 51405, 2349, 39722, 26360, 62444, 14127, 38518, 22228, 51867, 1487, +34320, 64390, 18480, 45926, 9790, 33771, 49309, 18293, 58634, 61, 33882, +45566, 16739, 64783, 28411, 7650, 50453, 35754, 20262, 63045, 850, 44224, +29155, 15654, 59781, 37185, 8657, 52311, 22451, 45043, 1532, 33905, 61873, +16357, 44806, 27715, 3180, 56202, 37596, 14881, 46086, 23806, 59606, 1229, +38296, 21128, 51219, 10826, 33172, 55225, 17874, 45895, 8920, 34031, 62245, +18959, 30540, 64277, 13421, 48563, 23723, 39091, 2797, 53363, 20540, 29638, +55741, 6690, 42329, 23340, 62588, 12804, 32579, 51645, 5103, 41770, 25332, +53621, 13915, 32491, 62132, 4291, 45821, 27679, 16026, 58209, 38170, 7213, +28935, 54859, 16689, 47360, 27630, 2316, 64822, 37029, 17285, 46271, 8977, +58075, 26320, 40207, 889, 51998, 17172, 30801, 64287, 11995, 41379, 25304, +51003, 2362, 31704, 61747, 14407, 44133, 27776, 4546, 52947, 37443, 17834, +64945, 10571, 47229, 21227, 31872, 55745, 6231, 46290, 20581, 33088, 64129, +11276, 42338, 24488, 55797, 3727, 39131, 22597, 57568, 13946, 32687, 51282, + 6982, 47420, 19091, 31794, 59022, 4362, 43582, 21933, 52689, 9257, 34224, +55593, 16985, 44543, 31109, 6698, 59892, 24325, 44036, 10693, 32029, 64821, +20735, 42680, 4262, 54787, 23984, 38998, 12999, 58382, 21985, 38408, 5252, +47845, 26561, 62976, 13814, 34945, 44795, 7532, 57289, 22410, 42192, 12296, +64839, 24437, 46193, 6033, 32125, 55046, 12242, 43121, 24052, 57907, 3632, +41334, 21164, 51503, 14272, 32515, 63383, 2307, 43237, 22916, 54234, 9785, +33550, 47396, 20447, 63845, 291, 30382, 45166, 18929, 54990, 11384, 39132, +25833, 60349, 2003, 49134, 22006, 42371, 12211, 55196, 26706, 39085, 3676, +59688, 29134, 13358, 50026, 36756, 7702, 61304, 23801, 42442, 11548, 55671, +21839, 40576, 3476, 47436, 26829, 58023, 10678, 29813, 44186, 20888, 55148, + 7495, 31097, 43973, 19458, 57218, 10828, 31797, 49926, 20923, 41415, 1513, +62852, 26257, 39241, 7653, 58238, 21630, 48893, 12573, 40929, 23044, 51593, + 4591, 33950, 64557, 14439, 44740, 28749, 2361, 59879, 37112, 17385, 54146, +11202, 42284, 26920, 65294, 7742, 38862, 19474, 52677, 30054, 2827, 62399, +37181, 13280, 49352, 20805, 34664, 53808, 885, 44782, 18631, 36590, 62623, + 6764, 30121, 46199, 12137, 60267, 23987, 39171, 161, 55066, 21390, 43560, +13703, 62370, 29629, 4217, 49566, 35107, 17831, 61513, 8917, 43433, 26149, +54046, 12627, 38399, 22023, 60332, 685, 48210, 29908, 15636, 52753, 37595, + 8184, 65021, 20876, 33983, 50681, 5205, 46672, 20215, 29755, 61132, 3267, +48430, 28465, 16250, 57566, 37648, 10113, 50305, 25124, 42224, 4439, 61308, +21198, 38327, 11663, 54037, 27244, 42435, 6931, 63050, 19324, 46681, 35299, + 9835, 57041, 22362, 40842, 91, 51883, 30719, 15716, 59209, 35752, 4848, +50395, 24220, 43417, 13306, 59854, 21784, 38259, 5128, 53168, 18278, 34272, +56138, 8428, 42351, 25157, 63336, 10378, 41093, 20755, 51389, 29250, 2350, +61527, 35199, 20132, 50040, 11410, 43340, 23424, 59788, 7008, 33802, 53575, +20045, 45496, 2990, 32773, 61834, 14705, 44279, 28217, 1285, 53094, 37344, +17571, 58483, 4747, 30673, 50628, 16841, 46407, 28090, 5317, 60496, 36147, +17262, 49917, 9986, 30434, 61762, 20911, 48449, 3635, 39284, 26782, 65530, +11033, 32794, 45777, 17542, 56000, 7281, 39982, 25224, 62153, 2309, 43556, +22480, 52809, 13474, 33658, 57308, 1481, 45191, 22508, 40237, 13979, 62087, +32209, 3178, 50010, 35627, 13635, 58735, 24917, 45112, 1970, 40693, 23268, +63115, 7557, 32281, 52379, 18272, 44063, 12844, 34993, 64215, 3445, 31642, +46059, 18654, 56836, 7254, 41527, 23122, 53149, 12364, 34178, 58324, 4604, +43224, 25463, 55253, 12560, 39788, 21838, 60720, 3203, 39163, 25858, 55838, +12558, 42690, 22751, 51577, 3983, 31772, 55461, 14980, 44364, 27775, 8839, +57556, 37096, 17704, 51556, 5388, 41851, 26877, 63873, 13909, 32577, 46996, + 6694, 54916, 25320, 41066, 11070, 58975, 18760, 35271, 50041, 5368, 29200, +64549, 13556, 48422, 26067, 41928, 7158, 61976, 24996, 38689, 2157, 58002, +20307, 36244, 50399, 7105, 3790, 40240, 21496, 55781, 11503, 42924, 26923, +58968, 9378, 48944, 17194, 36252, 60352, 3285, 28543, 46297, 14946, 57443, +21911, 38775, 392, 65359, 27202, 43885, 10795, 50825, 19576, 31653, 54209, + 2818, 43093, 23218, 63730, 10721, 33666, 51882, 12936, 42565, 24278, 56036, + 5860, 33007, 48500, 18950, 60997, 10542, 34525, 44989, 20742, 53404, 5260, +32836, 59390, 15604, 44525, 28069, 7072, 53629, 36951, 18222, 63289, 9037, +35387, 49501, 15290, 30592, 57785, 2727, 44079, 27757, 14766, 61522, 38141, + 4752, 29158, 48886, 19617, 54246, 6995, 32958, 45786, 17988, 63255, 9880, +40627, 26671, 55015, 1869, 38933, 22276, 62552, 12026, 35622, 49711, 15527, +29577, 65219, 954, 46590, 27576, 13717, 57419, 36516, 5053, 53546, 18775, +34970, 48799, 464, 57136, 17302, 31864, 46238, 7163, 61279, 26286, 41073, +11021, 55696, 18885, 36128, 50229, 1020, 29274, 59332, 19259, 41032, 10215, +53946, 27134, 38478, 1900, 60734, 18591, 36247, 50283, 9338, 30181, 62022, +14935, 47629, 25601, 38885, 5399, 58993, 25291, 38497, 11157, 55217, 19489, +37440, 51027, 7298, 29708, 56135, 12923, 42167, 25211, 59485, 5488, 34705, +53430, 15439, 46261, 29486, 6385, 64553, 36599, 17613, 51801, 7975, 34485, +62582, 14254, 42062, 23213, 53241, 1649, 31551, 57027, 16840, 45255, 27520, + 4469, 65168, 35811, 15301, 49815, 28214, 8647, 52729, 35816, 18413, 61843, + 2194, 35181, 48392, 17131, 64733, 5005, 34448, 46143, 14624, 60180, 28019, + 6909, 51291, 36718, 18001, 56441, 10749, 42504, 27139, 53641, 2968, 36776, +62250, 16838, 29798, 46816, 7990, 55844, 22515, 40533, 12207, 48983, 24837, +62887, 6644, 32482, 44742, 18004, 51829, 1159, 33969, 58694, 17072, 48288, +10731, 41915, 25645, 54679, 4249, 31318, 61217, 17406, 41221, 9290, 59057, +26860, 39185, 14776, 55043, 28315, 3880, 50532, 37367, 14406, 65492, 25154, +42012, 6177, 53759, 26765, 38953, 11966, 57754, 20610, 37435, 50695, 1237, +29141, 64102, 19577, 46589, 4777, 32271, 56132, 14757, 44650, 27928, 6691, +62192, 36004, 13596, 44926, 24614, 56426, 1409, 40033, 23079, 58908, 12991, +33400, 53924, 8980, 43976, 27394, 14916, 65211, 35119, 349, 53082, 22856, +45719, 14620, 32789, 57099, 9137, 43816, 23764, 60358, 1650, 38610, 22520, +51486, 13527, 31139, 54651, 5471, 41959, 24295, 64626, 13040, 48033, 26384, +40412, 7249, 54797, 17787, 30134, 62294, 3258, 48046, 25293, 39310, 11689, +61433, 25264, 49158, 2015, 39497, 22129, 58933, 13495, 34786, 49338, 6084, +31069, 55821, 18296, 42326, 9690, 58353, 26533, 39464, 3226, 54769, 24851, +42118, 12189, 65386, 17152, 30288, 48544, 5638, 57464, 25869, 39197, 12759, +49123, 23045, 62749, 7336, 34150, 43951, 18838, 63866, 2303, 40596, 25014, +55380, 12175, 40421, 22069, 58536, 281, 32225, 52275, 14460, 44298, 28704, + 8232, 57219, 35319, 20315, 51112, 1178, 30396, 60625, 15028, 46964, 28857, + 9102, 53618, 35216, 18963, 63204, 5276, 37881, 50448, 17025, 31019, 59782, + 7362, 48368, 25817, 41599, 11837, 60932, 24025, 39987, 6288, 55314, 18960, +32876, 51654, 10027, 46470, 28094, 16710, 59740, 37427, 5301, 47663, 22705, +56010, 10123, 40099, 26071, 61622, 13662, 36130, 49744, 529, 30497, 65334, +18108, 45406, 9043, 32092, 48728, 17229, 62735, 6463, 32727, 44590, 15916, +52771, 29230, 5711, 63879, 35932, 19106, 46626, 10130, 59955, 20898, 34186, +52848, 1954, 42348, 24517, 61767, 11138, 32849, 48106, 19890, 54123, 2634, +40310, 24264, 60343, 12161, 48910, 22164, 39353, 371, 62641, 26624, 43388, + 9747, 53321, 30710, 16320, 55490, 36079, 4243, 47036, 22531, 60564, 9592, +40852, 27020, 54107, 12918, 43185, 24565, 59458, 28173, 16203, 52995, 37932, + 1105, 31635, 65107, 18177, 47071, 5769, 40526, 26052, 52460, 14144, 33566, +63418, 7066, 48213, 24571, 40724, 11574, 54822, 23903, 38321, 5968, 60662, +17587, 29909, 46877, 9116, 57118, 24918, 39318, 4698, 59260, 18684, 35275, +50317, 511, 28988, 62141, 14953, 41688, 24927, 54602, 3334, 38705, 22382, +65276, 13864, 48604, 29225, 1783, 57695, 37552, 20868, 46532, 11694, 60058, +23157, 40680, 206, 54196, 26838, 39790, 11065, 60862, 19699, 47666, 30018, + 7888, 55087, 36529, 18014, 46798, 710, 65477, 26676, 38809, 12997, 58346, +25288, 42057, 2866, 50964, 20168, 34434, 61320, 11069, 42735, 25084, 53715, + 4002, 41296, 23117, 58283, 9944, 37445, 50451, 16913, 31496, 61642, 7538, +48055, 24053, 40125, 11087, 63411, 20407, 30161, 54472, 8924, 41642, 23196, +51516, 2449, 33127, 64591, 14235, 43324, 23900, 53374, 6659, 32336, 63827, +17280, 46127, 4447, 32788, 58066, 15025, 49117, 22697, 40154, 7274, 57051, +27065, 39053, 873, 52513, 18569, 32833, 63096, 8641, 45931, 17674, 33171, +60804, 1399, 45035, 28345, 15847, 65069, 35459, 3598, 45963, 22692, 61225, +14138, 32612, 50521, 2458, 42572, 22703, 56304, 12474, 39851, 26745, 58633, + 639, 32448, 50300, 19439, 46062, 9679, 35121, 60350, 20872, 44391, 7272, +37764, 51848, 12347, 30439, 58217, 20850, 44105, 1046, 37585, 59896, 16180, +29164, 54188, 6482, 42022, 25505, 51159, 11618, 29726, 58017, 20079, 42232, + 427, 52397, 29395, 16610, 61677, 35062, 3954, 47146, 24876, 65061, 14104, +31233, 45446, 8892, 53036, 27800, 15284, 58788, 37948, 136, 29550, 61496, +16867, 45596, 27917, 3498, 57309, 35810, 20303, 49743, 9807, 31701, 62038, +20258, 46800, 5967, 38349, 27218, 63990, 11975, 43741, 21695, 51040, 6937, +33955, 57206, 19700, 42508, 2431, 48998, 23437, 61465, 12914, 32479, 44229, + 9015, 57816, 27946, 16417, 49774, 35987, 2684, 62964, 22627, 45968, 9632, +32420, 56044, 17017, 44058, 7502, 37632, 59802, 15859, 28571, 52376, 10343, +42067, 23614, 58698, 2987, 33531, 53045, 18857, 47633, 9164, 35278, 63760, +16397, 28813, 45385, 2403, 52035, 35607, 19168, 61729, 5507, 37885, 49645, +16580, 30233, 59836, 8293, 41795, 24222, 55477, 3986, 40018, 26823, 63837, +12141, 48419, 17881, 32729, 56295, 2753, 43502, 26251, 58361, 11404, 38565, +21290, 51238, 2185, 34289, 63238, 20549, 44899, 9262, 40297, 26547, 54240, +13703, 33322, 57201, 6509, 45712, 28638, 16503, 65204, 37732, 4280, 54194, +27876, 15972, 50635, 36188, 829, 61963, 23241, 47280, 13714, 36064, 63644, + 7567, 31389, 52381, 20533, 46180, 50, 34933, 56112, 21206, 41584, 10434, +61243, 22256, 40734, 3429, 47177, 26296, 55835, 9899, 30318, 45439, 13645, +57875, 22172, 38801, 6569, 52702, 27066, 43555, 10448, 64765, 19605, 34532, +47281, 5668, 61250, 27611, 15387, 37889, 48381, 10444, 63596, 18258, 34620, +44277, 4105, 57486, 17821, 36640, 49772, 11330, 29442, 58368, 15483, 45565, +27820, 3574, 54049, 36684, 13526, 64341, 22142, 45933, 718, 33476, 56648, +15697, 46848, 29335, 3800, 65401, 37961, 14893, 30468, 54972, 1355, 43407, +24081, 62474, 14121, 35823, 50069, 2663, 29717, 55162, 20106, 42926, 6008, +59651, 26065, 39993, 10381, 55919, 20435, 35523, 50981, 2037, 29647, 58731, +19078, 47623, 9632, 40756, 24590, 56737, 1311, 49240, 17083, 32591, 43985, + 8440, 62726, 27704, 15575, 49662, 36560, 5835, 56163, 22367, 45443, 9668, +30819, 65453, 14719, 45206, 28703, 4233, 57542, 35938, 16647, 52110, 28443, + 8910, 56776, 35156, 20436, 45343, 2580, 63588, 25474, 41010, 11969, 52146, +18787, 31839, 56625, 844, 46840, 17279, 31319, 62703, 7743, 44861, 5249, +43661, 21987, 54876, 13237, 40574, 25663, 61488, 9729, 38657, 21734, 56636, + 1805, 45240, 29976, 12754, 59720, 37526, 20318, 52374, 2539, 42628, 26913, +59224, 13391, 40605, 21811, 64541, 1556, 34404, 51195, 17445, 45044, 9816, +30888, 63194, 13316, 43586, 25132, 52116, 6558, 31522, 58390, 12442, 47741, +23881, 41385, 7486, 59762, 26462, 40391, 9721, 51417, 17916, 35322, 55117, + 5892, 30209, 47979, 14000, 64030, 24826, 42385, 5520, 56610, 17253, 32220, +51562, 2227, 41909, 23433, 62653, 10149, 35211, 50597, 16078, 31117, 56454, + 5899, 42996, 23093, 52664, 11868, 30810, 60322, 17232, 46700, 5017, 30847, +57130, 14846, 44677, 29030, 8259, 63966, 34528, 19773, 54703, 3189, 45562, +28898, 15505, 38095, 58480, 1795, 30200, 51176, 16379, 45107, 27500, 4736, +60965, 36142, 17708, 47645, 10382, 58838, 27048, 38724, 3601, 50546, 18100, +34305, 56545, 9207, 41904, 24926, 51730, 12934, 34937, 62331, 3289, 41980, +24166, 48344, 9074, 65390, 21375, 41562, 12110, 54756, 26090, 40230, 4383, +57261, 23549, 49206, 11934, 40715, 21873, 56408, 9253, 49171, 25783, 40804, + 6278, 58020, 18327, 37284, 52574, 8906, 28846, 64106, 17774, 47148, 4200, +31576, 61648, 13412, 42223, 23681, 52719, 4929, 30394, 64836, 16525, 47918, +28085, 2290, 53912, 35859, 18794, 63126, 5096, 33324, 48020, 17817, 50599, + 9347, 33046, 64339, 13095, 43062, 23695, 55759, 2725, 38817, 21679, 63076, + 9211, 35177, 49458, 15128, 31973, 55704, 5940, 42151, 23657, 58713, 12039, +39696, 21350, 52011, 1842, 37068, 60524, 17031, 30454, 50380, 6331, 43138, +21905, 54857, 9935, 35948, 50967, 15800, 31438, 63793, 7356, 42121, 24789, +55035, 12826, 39830, 24746, 57945, 2589, 41426, 22774, 53223, 14336, 32889, +60274, 326, 46827, 24732, 39843, 13171, 63339, 29488, 8321, 54374, 35645, +20840, 48048, 1354, 64236, 19403, 30967, 45347, 7191, 55486, 24281, 40005, +11098, 58771, 19628, 35570, 49735, 4981, 28745, 65173, 20181, 45394, 2229, +33487, 58239, 20131, 48902, 7314, 38823, 26538, 63075, 12290, 42966, 23949, +54756, 5853, 41099, 22047, 60782, 13911, 32231, 53721, 7408, 47244, 24467, +39535, 11744, 56116, 22270, 43618, 2945, 64451, 32019, 14155, 49843, 35961, +10184, 54291, 21990, 44816, 5998, 34388, 61916, 20036, 49197, 10326, 39680, +22953, 60692, 7445, 43802, 25308, 53012, 13678, 32484, 57943, 4287, 47575, +18612, 36137, 51402, 573, 30194, 62540, 15687, 44168, 27378, 9470, 52019, +36273, 19789, 59928, 7709, 45992, 25471, 40536, 10848, 57220, 19283, 30662, +51550, 4039, 43258, 18669, 59018, 28637, 10544, 50142, 37530, 18224, 60048, + 6402, 34143, 47998, 16541, 52685, 29681, 8987, 64303, 36977, 19410, 50423, + 673, 34817, 61047, 16126, 47290, 28515, 3816, 62471, 36318, 14073, 54343, +23496, 45873, 1848, 37008, 57820, 16367, 30744, 55223, 3338, 42961, 24832, +51722, 7052, 31627, 59138, 20281, 47888, 8140, 40985, 26817, 65199, 405, +40199, 22194, 52978, 10175, 32395, 58926, 19476, 44169, 8499, 31174, 49436, +20500, 59466, 5615, 41292, 23565, 54419, 12677, 43600, 25859, 61238, 5945, +41657, 19044, 50668, 29157, 8335, 58543, 37285, 18264, 49325, 6975, 32875, +64558, 12688, 45483, 28438, 15468, 52942, 37462, 3962, 63109, 27971, 14925, +49538, 37031, 6894, 60416, 26468, 43178, 11648, 51382, 18164, 36857, 64934, + 6729, 29849, 47649, 20114, 57634, 2879, 41525, 25603, 53297, 14035, 33656, +60946, 678, 44040, 27617, 16890, 55075, 38191, 8002, 30714, 63438, 19997, +43642, 5042, 50656, 31026, 15115, 61694, 37397, 7721, 49584, 28098, 15955, +58190, 37486, 5546, 44715, 24333, 64750, 10538, 39700, 23129, 51527, 14088, +34204, 58265, 64048, 11672, 35685, 50979, 4016, 30808, 58496, 15933, 45398, +28980, 6598, 52023, 37208, 15836, 62634, 27548, 4489, 49690, 35890, 17120, +58065, 10377, 43935, 27289, 56208, 5251, 33289, 47491, 15728, 52963, 29388, + 7060, 58732, 37514, 20647, 50097, 3155, 41289, 22999, 61283, 14261, 33424, +46229, 1402, 54078, 27976, 16611, 38057, 62882, 4188, 31201, 47250, 20237, +56693, 10815, 40922, 26722, 59309, 2976, 39203, 22512, 53449, 11471, 33680, +48186, 20855, 61273, 7383, 38807, 26786, 53463, 12112, 43568, 21399, 59396, + 3177, 41011, 26447, 61804, 8731, 34442, 47457, 18721, 64695, 1219, 34988, +44708, 20998, 55219, 10658, 39923, 22649, 59700, 83, 48885, 25898, 40547, +10513, 52419, 18098, 32776, 62393, 6880, 43142, 25266, 53022, 9824, 34633, +64975, 13009, 42180, 23516, 51948, 1180, 32451, 56854, 20015, 46050, 13508, +36987, 62872, 7224, 29533, 47484, 20275, 58397, 248, 29930, 44185, 16671, +52868, 28350, 6696, 59694, 36695, 13844, 50562, 23063, 45517, 2855, 33576, +60667, 16241, 45500, 28669, 7857, 64258, 35853, 19966, 46170, 3199, 59174, +27120, 38634, 12518, 47122, 23274, 63000, 966, 33963, 44473, 20134, 50218, + 9604, 34162, 58005, 18954, 44889, 6513, 34630, 55735, 15779, 43932, 27430, + 8894, 58354, 38199, 14148, 30826, 48918, 7902, 55534, 24142, 41158, 12864, +61758, 26801, 39240, 3175, 52054, 18853, 31560, 57440, 7210, 46201, 34507, +14546, 60894, 24237, 43309, 4516, 54360, 24230, 40595, 10082, 63556, 19032, +31762, 50881, 3572, 43743, 26386, 62687, 13309, 33490, 46158, 5369, 56072, +23576, 38766, 13015, 64866, 25851, 47832, 3351, 37739, 60357, 13952, 29092, +46731, 1561, 50588, 18218, 30964, 61294, 5327, 45917, 34606, 18847, 64482, + 7446, 44945, 34869, 18128, 51586, 9633, 32044, 58602, 20761, 47958, 3343, +41263, 25908, 52179, 9924, 32098, 57255, 13486, 41812, 23276, 53145, 5410, +33715, 60098, 15132, 44458, 28230, 553, 52914, 37715, 17985, 60610, 8442, +37233, 50373, 13012, 29080, 55139, 18270, 44049, 4491, 32011, 60149, 16107, +48622, 29270, 57, 57642, 35713, 18389, 50485, 3900, 42872, 26611, 58125, +12472, 41465, 23677, 62656, 1122, 48113, 18182, 35532, 51367, 7817, 28817, +58955, 16881, 45513, 28047, 631, 63406, 37992, 15929, 29338, 57295, 3775, +47100, 28863, 15384, 54253, 34796, 1163, 65327, 28181, 15373, 49363, 36296, + 8012, 60227, 23707, 42390, 12197, 55562, 23278, 40145, 5498, 58464, 20342, +32800, 46234, 1652, 63743, 29310, 14866, 38100, 52485, 3516, 30746, 62791, +14674, 44273, 27488, 7157, 55977, 38085, 14540, 31857, 64721, 2535, 41727, +23753, 53146, 13384, 30383, 61657, 1906, 44337, 28370, 15378, 57197, 38107, + 4958, 31210, 54279, 12363, 42081, 24086, 56929, 8622, 33466, 50939, 19960, +42403, 7219, 59991, 26103, 39667, 12786, 51222, 29086, 6370, 64190, 35832, +19481, 47205, 9794, 54615, 23062, 39889, 2588, 62563, 25836, 38506, 10626, +49251, 21365, 55376, 14622, 35010, 44804, 5807, 63629, 26394, 41300, 2559, +55795, 18006, 34868, 47689, 10507, 63072, 25907, 38904, 2047, 49016, 21744, +57949, 9439, 38451, 25063, 53182, 13179, 32662, 63999, 3309, 43067, 24556, +54775, 11550, 40691, 23551, 57062, 1075, 47981, 21009, 31463, 60856, 8553, +46743, 24400, 40731, 12219, 56329, 23858, 39655, 273, 61828, 20319, 31373, +54106, 4648, 42365, 23835, 59848, 10680, 38921, 21611, 51691, 13265, 31893, +62392, 4875, 47543, 28919, 16482, 58985, 36477, 10847, 52455, 22925, 47264, + 2107, 33250, 55926, 13230, 41843, 24154, 59424, 1199, 38952, 22453, 52990, +14231, 35568, 55298, 3547, 30472, 47297, 19841, 59733, 9031, 33870, 45979, +17604, 55988, 2509, 38576, 27223, 8126, 41556, 25257, 61030, 12888, 39354, +23255, 48828, 232, 59921, 26483, 40818, 10938, 55271, 18546, 33123, 44460, + 9279, 64792, 24964, 39773, 861, 53953, 22723, 38439, 12855, 61002, 21305, +43523, 2665, 54845, 26787, 39899, 11907, 63385, 18017, 32607, 47771, 7852, +55472, 25807, 39179, 11777, 64406, 22403, 43775, 6149, 57549, 29593, 14784, +52001, 35606, 784, 45682, 24045, 61972, 14334, 34269, 44619, 8444, 65142, +20082, 34915, 46125, 1377, 56921, 17702, 34799, 45181, 5010, 63077, 24257, +38509, 13474, 55718, 22726, 48125, 5608, 36810, 52022, 15011, 29783, 54620, +10210, 42349, 23361, 59025, 5357, 32530, 51895, 15345, 45964, 28055, 7497, +62948, 35354, 14398, 47631, 23713, 55929, 4951, 40846, 22658, 59433, 14081, +48316, 29236, 3972, 54250, 37212, 20236, 60468, 8310, 44884, 25849, 40196, +11731, 59572, 24435, 42737, 2700, 54493, 22132, 39973, 12481, 64377, 26639, +48671, 9515, 34317, 61203, 14958, 45264, 27375, 2050, 56101, 35093, 18814, +51775, 10549, 30256, 58247, 14626, 43950, 27328, 429, 53173, 38195, 14255, +30204, 61516, 10182, 49256, 24272, 40286, 7006, 54265, 17135, 31360, 60151, +11153, 42407, 24093, 54073, 2916, 38979, 22070, 59810, 13827, 47938, 29288, + 1460, 63526, 36690, 20625, 52148, 4023, 34912, 61131, 17009, 45640, 29415, + 372, 58934, 35051, 20478, 46762, 8774, 55327, 25206, 41963, 11411, 63741, +22544, 39968, 1426, 53234, 27247, 38467, 10957, 57659, 18411, 35655, 49902, + 743, 30142, 59932, 13613, 42900, 23982, 56289, 8503, 39093, 22078, 49149, +11410, 61186, 26411, 41259, 1070, 54384, 21345, 45858, 11126, 32592, 59008, +20113, 42558, 6160, 53074, 21402, 34183, 56170, 9614, 41789, 23151, 59197, +11538, 39265, 25180, 54090, 2966, 30858, 62274, 12694, 42727, 23400, 53121, + 5802, 34160, 64848, 17744, 45393, 7401, 36830, 61151, 16242, 29721, 46433, + 3957, 62677, 25936, 40742, 9291, 49022, 22055, 63480, 12575, 41075, 26206, +55475, 6050, 30601, 44716, 15331, 63852, 34563, 1328, 47472, 25048, 56404, +11177, 33980, 45128, 19446, 64879, 8628, 39976, 26551, 54393, 11238, 39102, +24730, 64038, 6307, 46707, 20041, 35991, 53554, 9454, 29501, 61031, 13113, +42371, 25240, 56713, 5158, 36501, 52618, 15148, 31390, 47860, 9560, 59916, +22883, 41475, 6641, 52718, 25395, 41060, 9575, 58781, 18804, 36746, 50600, + 4745, 30067, 62038, 16245, 45361, 27731, 1922, 52255, 35824, 14955, 64495, +29278, 8897, 51008, 37182, 17943, 48652, 6281, 56726, 26240, 41278, 9904, +58874, 18041, 36983, 50372, 1331, 29243, 60809, 20652, 47532, 8275, 29854, +50809, 16479, 35208, 58509, 5175, 45156, 27699, 16876, 50923, 36822, 8618, +63063, 21676, 42596, 13855, 49202, 23145, 65046, 2810, 30098, 46257, 14573, +59256, 25217, 39327, 1468, 53778, 18577, 33835, 63150, 9781, 46724, 18010, +33383, 53944, 600, 42056, 26475, 60664, 12075, 35707, 50483, 15458, 32581, +56045, 6451, 43299, 24596, 61797, 1579, 32408, 47102, 17603, 57586, 10663, +38640, 23191, 52360, 7850, 32720, 60507, 15543, 44774, 27968, 6553, 53136, +36894, 18679, 61852, 11599, 47566, 26881, 40646, 230, 57114, 22361, 40064, +15170, 50491, 30632, 5056, 62147, 35262, 17531, 49954, 9644, 33593, 58191, +17254, 43375, 2828, 54223, 20714, 31734, 63931, 5234, 46473, 17618, 36435, +50339, 8968, 28673, 57169, 15074, 46463, 33993, 1751, 49136, 26571, 63669, + 6989, 34887, 44822, 18779, 56541, 8942, 39551, 23077, 50356, 3527, 32288, +64525, 15303, 43916, 28247, 6404, 61366, 37265, 18063, 51374, 11616, 42054, +26580, 65181, 6078, 48236, 28903, 12459, 62195, 36818, 17560, 52520, 494, +41990, 26213, 63044, 6871, 32476, 53805, 19536, 47242, 30306, 57795, 18657, +45614, 5593, 32644, 62076, 18653, 42708, 8431, 54376, 21257, 31827, 48943, + 2866, 61155, 20100, 30376, 46444, 5539, 57191, 19413, 33419, 52015, 7732, +42750, 25673, 64245, 10280, 38880, 23065, 48531, 5674, 56765, 25336, 42077, + 92, 52981, 30055, 15463, 59598, 35339, 3910, 49482, 20329, 32278, 54490, + 8715, 42289, 24284, 61136, 12543, 39791, 22035, 55498, 7290, 32649, 52346, +17627, 48444, 3792, 29857, 60500, 13229, 42076, 23899, 51171, 8357, 31006, +58684, 19175, 48329, 469, 39939, 27087, 64331, 11148, 32940, 45762, 19761, +57363, 2057, 40433, 26151, 63558, 12869, 48026, 25614, 38816, 2980, 61506, +20093, 37418, 53848, 12552, 30742, 45935, 2389, 64404, 25346, 38318, 12192, +46993, 21483, 56590, 612, 33445, 44780, 15428, 63545, 28659, 6260, 49494, +37892, 18695, 56265, 4880, 47950, 30784, 16644, 62165, 36554, 8018, 51557, +24360, 44673, 4088, 30351, 56969, 20074, 42344, 5483, 53552, 29494, 16441, +63213, 37460, 8475, 46685, 25113, 61821, 6328, 37610, 50013, 16885, 31508, +63485, 5246, 47236, 27696, 15993, 55762, 37991, 2158, 31866, 47735, 20826, +65259, 4423, 40019, 26855, 51604, 13017, 33805, 55984, 7241, 41996, 24857, +61846, 11383, 33198, 51306, 19174, 45457, 5976, 32106, 56981, 14639, 44065, +27415, 10480, 65293, 37143, 18404, 51572, 5215, 44033, 30285, 14933, 60137, +36468, 4236, 53835, 24692, 42546, 12799, 49099, 21542, 59377, 5060, 31501, +44713, 12463, 65451, 25181, 39536, 6523, 54677, 19737, 36598, 51475, 2469, +30905, 64320, 16235, 44377, 29027, 7073, 56631, 34508, 15661, 49862, 28263, + 4128, 63258, 37524, 15518, 53789, 28053, 8780, 49320, 37122, 17362, 65405, + 604, 47423, 30374, 15704, 51709, 37816, 8127, 57717, 27999, 16448, 50047, +38208, 1720, 30004, 59671, 19953, 43595, 11455, 56377, 26626, 39704, 808, +51528, 18518, 33926, 58961, 11943, 48235, 21389, 38308, 1876, 52274, 31300, +14990, 57855, 37352, 3600, 48324, 23911, 60928, 10728, 38848, 21442, 52105, +14167, 35525, 62304, 5622, 40552, 22053, 51470, 3440, 30615, 59565, 15329, +47093, 29582, 1608, 56018, 35160, 16517, 51369, 28341, 4143, 58580, 38236, +16927, 32238, 48959, 2111, 65467, 21806, 40537, 11728, 54461, 26552, 43436, + 4567, 62829, 25325, 39076, 12891, 55268, 21229, 38574, 2553, 63746, 26969, +48374, 12469, 41038, 22115, 56262, 6771, 37638, 49988, 16873, 31515, 59283, +10045, 46926, 25097, 41069, 2765, 61330, 20623, 31453, 54949, 11212, 44980, +20389, 33114, 48201, 4930, 65033, 20014, 33121, 44594, 10362, 54093, 17424, +34117, 63481, 4347, 42278, 24477, 53561, 9649, 32848, 62592, 12603, 42473, +23277, 54804, 1134, 39166, 26979, 59450, 6752, 38553, 26597, 56176, 10255, +44604, 18854, 36925, 51764, 5465, 30477, 61479, 13261, 42963, 23304, 50436, + 4407, 29968, 58686, 13184, 43253, 23727, 55335, 8492, 38434, 21800, 65010, + 3879, 30100, 47163, 19579, 59540, 8806, 39125, 26948, 52588, 13853, 41625, +21535, 60134, 3828, 49070, 27030, 42219, 13180, 54552, 29563, 920, 64958, +35924, 17352, 49971, 4651, 31596, 55714, 21214, 44141, 8163, 33792, 63654, +19254, 47439, 6144, 37340, 59937, 12488, 28674, 53862, 20793, 46363, 3825, +39389, 26767, 63222, 11290, 34840, 49882, 18448, 41078, 7197, 59211, 34703, +21090, 51968, 10622, 42084, 23208, 65114, 3506, 35023, 52037, 19081, 41410, + 9796, 58745, 22379, 39827, 14291, 52580, 33845, 1055, 61927, 25426, 42853, +11830, 53025, 20243, 34975, 58408, 8316, 46007, 19534, 35589, 53594, 3188, +30378, 59091, 19358, 46876, 8710, 33695, 57860, 18500, 44659, 4078, 31447, +56258, 20710, 48092, 8481, 34398, 58872, 14876, 42816, 24409, 50362, 1977, +63509, 8702, 36540, 54138, 14684, 29313, 49512, 3636, 35147, 65368, 17602, +44582, 10332, 34118, 55713, 17274, 42231, 7161, 63497, 26029, 38701, 11250, +50118, 17159, 30974, 59697, 1926, 46361, 34618, 19065, 52193, 11733, 32678, +61723, 17641, 46931, 6877, 38533, 23854, 65531, 9969, 41888, 17678, 52524, +29842, 1822, 62546, 36642, 18633, 49289, 5132, 32605, 58047, 18297, 44991, + 2358, 30062, 63369, 20749, 43866, 9713, 33059, 56041, 16931, 48883, 27708, + 5370, 61475, 38027, 15380, 33111, 54470, 9773, 43238, 24824, 58164, 4495, +39558, 17132, 51531, 29130, 8251, 60629, 36177, 17145, 50169, 5733, 34302, +56102, 15982, 45195, 29498, 6908, 58699, 35897, 18642, 52564, 11534, 42907, +27122, 60532, 5589, 35342, 50682, 16729, 29897, 61735, 9171, 43823, 27308, +16943, 57611, 35857, 1971, 50497, 28866, 15350, 60084, 34969, 9906, 46701, +22514, 52967, 770, 33093, 60906, 17796, 46902, 10546, 32733, 65039, 13625, +41519, 24172, 50778, 1245, 33849, 59027, 15217, 44687, 28588, 3683, 53711, +36437, 20276, 57682, 9500, 44463, 21212, 33063, 60683, 6638, 43813, 17677, +57092, 30155, 8289, 49930, 35644, 14634, 62163, 24744, 45582, 157, 31780, +58510, 15744, 44496, 27865, 3738, 54053, 37672, 17078, 63749, 8818, 29821, +48493, 21379, 60495, 2592, 40676, 25636, 53706, 8242, 32189, 57868, 16153, +47711, 27806, 1874, 64397, 38065, 15757, 29919, 47311, 6210, 62683, 25490, +38247, 13817, 54730, 21211, 48476, 3316, 36953, 58569, 15950, 28721, 49595, + 8179, 34402, 57867, 14669, 46549, 27608, 4946, 59785, 37773, 20204, 51820, + 8301, 35305, 58317, 14169, 44274, 27301, 2235, 60999, 35403, 18762, 51204, + 4666, 32218, 56915, 14646, 44547, 27827, 6135, 61889, 36384, 16651, 49114, +27316, 4531, 62870, 35581, 15229, 53733, 27689, 6469, 49791, 35331, 18583, +60938, 10275, 42829, 25146, 54133, 4657, 39786, 26975, 61809, 9123, 32994, +53970, 16685, 45336, 28481, 6614, 64712, 35257, 19781, 46843, 9162, 54532, +27235, 41658, 2666, 57832, 23217, 47884, 9853, 30913, 61194, 13999, 42239, +23794, 53535, 6906, 38774, 21485, 63448, 13988, 36872, 49749, 8352, 30617, +62269, 15707, 44979, 27409, 6760, 55274, 37251, 13364, 47475, 24618, 58380, + 7515, 39268, 21337, 51121, 977, 33193, 61183, 14655, 43624, 22577, 51911, + 7672, 33132, 56801, 18027, 45532, 177, 33245, 64803, 14043, 43144, 24649, +54953, 3857, 39428, 21670, 62810, 13674, 34295, 53270, 6971, 44113, 28070, +15781, 60281, 37507, 297, 53945, 24406, 41841, 12440, 58074, 25950, 39585, + 2710, 48995, 24417, 59359, 12496, 39167, 22025, 50417, 493, 37818, 57489, +15658, 29738, 47722, 7473, 60209, 24695, 41152, 13289, 53299, 21224, 48104, + 4231, 35834, 62064, 15826, 30944, 48683, 8969, 57095, 27358, 16491, 38118, +53179, 2377, 31833, 63896, 14644, 46018, 22392, 39917, 6145, 61866, 26974, +39562, 11419, 51496, 17648, 33353, 57303, 2021, 42939, 23283, 53762, 12413, +31371, 64516, 6164, 47867, 25630, 38245, 9977, 62348, 18434, 34457, 51371, + 7428, 42980, 24893, 58457, 10905, 34464, 45501, 20240, 62654, 2263, 36209, +49532, 14640, 29959, 59223, 10440, 43537, 23000, 50851, 1840, 35781, 65260, +15676, 31791, 51864, 8949, 42518, 24024, 53825, 777, 32129, 60373, 12962, +42947, 25032, 53677, 2135, 32256, 57512, 16937, 45132, 27830, 8191, 60295, +38101, 16020, 29776, 55452, 4306, 43722, 25086, 60761, 9288, 30798, 50751, +16144, 45883, 28428, 5139, 63863, 37944, 14325, 30987, 55992, 114, 48100, +27663, 14282, 63223, 37519, 10646, 44745, 23966, 54862, 1750, 39227, 21598, +61312, 10037, 33430, 51048, 13359, 43485, 25321, 64922, 4927, 30166, 51999, +12990, 41336, 22791, 16533, 56547, 37670, 737, 50308, 27861, 16068, 57354, +38056, 7819, 29635, 59405, 20423, 48115, 1191, 35994, 53665, 15454, 30904, +58502, 3658, 43350, 23868, 54872, 12244, 40570, 25342, 62398, 8617, 43090, +22469, 55583, 3448, 40644, 26136, 58794, 12616, 39879, 27079, 57336, 4590, +44144, 21479, 50761, 13842, 33181, 55668, 7801, 44968, 27752, 15914, 64715, +37432, 11225, 53722, 25382, 46778, 4701, 35004, 59071, 15224, 45225, 28994, + 1104, 57723, 35997, 14057, 44751, 23721, 64617, 3077, 29881, 46947, 18795, +53833, 11524, 31401, 62374, 20890, 44401, 1688, 32399, 54757, 20483, 46137, + 9660, 31321, 62032, 19114, 48568, 827, 39420, 26619, 65036, 9462, 39170, +25780, 49011, 1544, 55727, 21907, 40303, 10611, 59043, 23468, 47899, 2973, +35979, 53029, 13969, 29946, 65261, 7688, 44402, 27398, 11560, 53246, 37687, +19827, 64218, 5770, 44092, 29187, 16115, 53989, 37630, 8315, 58154, 25533, +43446, 2937, 52093, 18172, 31650, 60431, 8836, 42438, 23729, 56357, 10083, +40126, 22684, 64664, 13740, 35071, 50443, 796, 30586, 54502, 18832, 41374, +10708, 64173, 26834, 38440, 1814, 52780, 18864, 32380, 57838, 9041, 42090, +22471, 52372, 5753, 34990, 64529, 19512, 46210, 10941, 32001, 48932, 21116, +57454, 1256, 33703, 44244, 15145, 55855, 27865, 10960, 49722, 35844, 19394, +62437, 5463, 45080, 20852, 31989, 56549, 10636, 49292, 22347, 39143, 8119, +58417, 27078, 49657, 96, 40889, 23138, 61806, 9218, 33355, 45256, 13275, +64001, 22869, 41551, 1336, 53972, 24254, 40287, 10668, 62256, 18685, 35351, +49247, 300, 29928, 64719, 17942, 46372, 9954, 32176, 57046, 16306, 46260, +28522, 7874, 63675, 37832, 20048, 49683, 10038, 34979, 59850, 19207, 42333, + 2064, 53341, 31334, 14491, 56992, 37482, 10005, 49000, 20522, 37421, 63432, + 3138, 30403, 54737, 14860, 46808, 29185, 7175, 65282, 35799, 13892, 46865, +22500, 58352, 2772, 41190, 25915, 48595, 11467, 56256, 21768, 40606, 244, +60414, 25378, 42982, 12803, 53109, 24532, 39291, 7487, 64321, 20333, 33676, +46173, 836, 56185, 25975, 40656, 11831, 59804, 25172, 48109, 2997, 41330, +22099, 57371, 12246, 37637, 50299, 302, 29104, 60362, 17027, 44078, 28471, + 3656, 64143, 37938, 16221, 31674, 55672, 8771, 46525, 27892, 16682, 58672, +38137, 4937, 29041, 48193, 10262, 62557, 25176, 38718, 13227, 51767, 29119, + 5963, 60898, 35495, 18976, 51085, 10880, 43607, 26960, 57548, 1081, 31781, +47405, 19111, 64019, 9174, 40785, 25910, 50936, 13918, 31476, 62366, 5594, +45850, 21099, 34736, 56616, 8642, 45714, 18245, 36833, 61048, 6133, 28576, +53861, 17033, 45941, 27340, 3841, 64444, 38050, 16815, 31157, 48879, 2273, +63296, 25353, 39656, 11715, 55564, 22729, 45922, 208, 37771, 65411, 14131, +29406, 45746, 6246, 59654, 23665, 39906, 10758, 52013, 17869, 31803, 57153, + 930, 47611, 35327, 18869, 59801, 4865, 46384, 37939, 15225, 28486, 63070, + 8033, 35389, 45729, 18247, 51639, 108, 34133, 58675, 14868, 43168, 24054, +53927, 2678, 39106, 22600, 60953, 14233, 30871, 48225, 3719, 52980, 27581, +15528, 57314, 37730, 8856, 51031, 27707, 16968, 55079, 38201, 4838, 30227, +58465, 20209, 42914, 11015, 55819, 25662, 38359, 5547, 62412, 21373, 43997, +14720, 50664, 35077, 8075, 64455, 27761, 14039, 49467, 37390, 6081, 62073, +27298, 13917, 53995, 38242, 502, 32815, 48755, 20208, 62965, 11488, 40457, +23181, 53675, 2731, 34222, 57939, 19676, 48270, 7754, 39769, 25781, 60457, +11350, 49230, 21698, 41561, 4750, 57635, 29410, 15926, 50353, 35227, 7414, +64233, 25516, 48521, 12095, 41388, 23886, 60402, 1148, 38717, 21459, 53741, +14568, 32807, 61649, 3291, 44986, 28048, 6056, 33433, 46401, 19730, 62525, +11427, 40808, 25144, 53756, 4128, 40413, 22899, 64331, 12584, 49253, 26728, +39352, 9731, 51904, 20648, 32533, 62988, 6836, 45244, 19728, 36216, 58244, + 584, 30474, 52827, 14772, 45180, 28177, 9996, 63776, 35870, 19785, 48765, + 1202, 54643, 23550, 38251, 10675, 60432, 27041, 41662, 6336, 57070, 19929, +31424, 51269, 323, 42741, 22562, 60842, 7385, 30920, 48709, 19563, 64104, + 8670, 39654, 24396, 54748, 12569, 47554, 28810, 6061, 59906, 37559, 17182, +51634, 8074, 34327, 58853, 21154, 45390, 4015, 34826, 48989, 18166, 65332, +12620, 40200, 26957, 58282, 4730, 43011, 24592, 54013, 11812, 41240, 22766, +56798, 3610, 47837, 17162, 34463, 62558, 13788, 30537, 45846, 6620, 55094, +25538, 39502, 11354, 62517, 19945, 37850, 51087, 4067, 33050, 55927, 14951, +46037, 28412, 1330, 58500, 35245, 14376, 50687, 27980, 3709, 62483, 35638, +19257, 49961, 10051, 39881, 21348, 63639, 29214, 6126, 53964, 37269, 20087, +49369, 2331, 32489, 52690, 19568, 41490, 5007, 59880, 25852, 46775, 13098, +33783, 56257, 4257, 43690, 23610, 58888, 12681, 40956, 21899, 50709, 5140, +36515, 63083, 16058, 30258, 47568, 10437, 55042, 25790, 40366, 2699, 61044, +18288, 36859, 51931, 8196, 29149, 62958, 20417, 45880, 6159, 37472, 59258, +14304, 29605, 52635, 824, 42149, 24668, 61563, 12403, 40253, 24338, 55157, + 3040, 31775, 45888, 18186, 61007, 10902, 34318, 45689, 14637, 56599, 24382, +40647, 4771, 52060, 18468, 31778, 60062, 8624, 45327, 34975, 15792, 57048, +27483, 4399, 50481, 37011, 16457, 55732, 27532, 6457, 49918, 37862, 20078, +61672, 5277, 43892, 33204, 17133, 53897, 986, 30827, 56378, 15449, 45556, +28905, 6657, 64078, 36911, 20228, 51242, 8890, 42831, 25812, 59455, 8, +31708, 52405, 15786, 45129, 28274, 8756, 60119, 36297, 19376, 50773, 1160, +32447, 54585, 19285, 43064, 8360, 62732, 23502, 39118, 15258, 52113, 30202, + 5353, 63331, 35013, 17839, 49543, 8861, 32360, 56641, 17551, 43749, 3878, +59327, 29679, 14940, 49942, 36404, 10502, 54672, 22798, 44509, 6389, 35370, +62590, 15823, 29735, 53480, 5013, 42909, 24279, 64977, 13726, 31908, 53864, + 8958, 48175, 23678, 40984, 12502, 57474, 21626, 49119, 2675, 41604, 23341, +63318, 11572, 36182, 49940, 15203, 31168, 55840, 1575, 43169, 21558, 59657, +15008, 35654, 49605, 3068, 30997, 56775, 17141, 45803, 6497, 32980, 63181, +13388, 42332, 23736, 52572, 5209, 33480, 56016, 17973, 46475, 3073, 33927, +59378, 20518, 42857, 9482, 51890, 17046, 30945, 64354, 1554, 43296, 26275, +52078, 13718, 33224, 62216, 7755, 43944, 28120, 14968, 58156, 35268, 8452, +52517, 22205, 44519, 14152, 32894, 59106, 4606, 44188, 29367, 16753, 53957, +35134, 8086, 57517, 27643, 16565, 49916, 36652, 3454, 62834, 25775, 43759, + 9181, 50680, 20411, 29851, 64262, 7460, 45232, 28143, 12675, 55742, 35575, +20886, 50817, 3511, 32053, 60443, 20401, 42400, 11314, 54993, 26210, 39313, + 4569, 64005, 21525, 46186, 12597, 31799, 56040, 8639, 44680, 28060, 16504, +64768, 38071, 5349, 30752, 47444, 19531, 61462, 551, 31143, 45681, 15592, +64168, 27456, 7807, 49711, 36493, 18234, 61205, 1357, 43519, 27116, 52902, +12037, 40438, 22814, 59818, 2954, 30594, 52153, 16719, 45188, 29152, 4647, +58410, 38239, 16653, 34009, 51351, 9149, 29392, 63762, 15767, 44383, 27874, + 5948, 56029, 38010, 15472, 30077, 59478, 7132, 41677, 24491, 52104, 15142, +32874, 65308, 2164, 44575, 28595, 16387, 55251, 38164, 8989, 31404, 62312, +19686, 45812, 2970, 37525, 57116, 16480, 29956, 46928, 5176, 55507, 25984, +40261, 7936, 59776, 25365, 39954, 11910, 48975, 21696, 57913, 63970, 9214, +42814, 25501, 52002, 2706, 32005, 60699, 15300, 45371, 28353, 9053, 56109, +35406, 19718, 46709, 5059, 60843, 24871, 41891, 2198, 54369, 34646, 15863, +49358, 28326, 10684, 64602, 37091, 18823, 49958, 5356, 37870, 56401, 15806, +29767, 46154, 7475, 61936, 24992, 41210, 13194, 48069, 22017, 63525, 2835, +34376, 45675, 17786, 58943, 10169, 39100, 26641, 53228, 12911, 34592, 57386, + 3224, 43996, 28162, 16521, 52722, 32652, 2126, 62577, 36804, 20456, 50070, +10644, 42684, 23554, 63647, 165, 35969, 49560, 14468, 30120, 61085, 9551, +42087, 23919, 55499, 2497, 38507, 21266, 52302, 8991, 32725, 60681, 15811, +46629, 28973, 6282, 63903, 37353, 20628, 52873, 11397, 42775, 24954, 59537, + 4426, 34875, 50517, 16215, 31370, 56433, 296, 45046, 27764, 15930, 61546, +30968, 6685, 49907, 36217, 20477, 60522, 10927, 42490, 26766, 55749, 7349, +46355, 24300, 40024, 11453, 59758, 17104, 33559, 52529, 94, 47151, 17008, +35661, 61335, 10963, 28325, 54686, 17564, 42969, 7402, 62036, 29290, 16066, +53985, 37165, 8613, 50189, 28065, 15795, 62900, 35699, 2862, 53839, 26319, +42594, 11990, 59923, 25681, 40417, 1146, 56250, 21787, 45907, 14400, 33154, +58988, 6530, 43013, 25595, 50282, 11317, 30783, 56584, 17556, 42366, 3897, +50690, 21070, 33726, 64870, 9294, 46274, 18713, 36677, 58110, 6011, 29540, +51340, 18357, 43206, 9155, 65101, 21100, 33160, 54385, 6713, 43842, 19976, +31257, 49101, 2133, 62997, 26051, 38896, 10783, 54342, 20326, 47692, 29343, + 2605, 61115, 37841, 13628, 45193, 22634, 63496, 8051, 32523, 53910, 14943, +45150, 28833, 2881, 58127, 35842, 18320, 50762, 11473, 35090, 62638, 20595, +48508, 4059, 39984, 25068, 58738, 11637, 32615, 53850, 17441, 45539, 4858, +34078, 65019, 21052, 41098, 11810, 57380, 25493, 40796, 4174, 48041, 21750, +63684, 12102, 40964, 26154, 58003, 6108, 36915, 49935, 14145, 30517, 55816, + 2060, 43494, 24573, 58779, 13067, 39612, 22318, 54794, 3101, 38825, 26731, +65400, 11804, 42505, 21743, 51468, 5918, 34344, 62922, 19126, 42798, 2487, +58082, 20795, 31415, 51713, 10080, 43617, 18334, 58935, 32654, 7660, 51757, +36611, 18498, 45914, 2001, 61910, 26297, 38791, 6205, 59397, 26148, 38353, + 9702, 52036, 17637, 31125, 60106, 3528, 43252, 23655, 54412, 8375, 39622, +22777, 64343, 11909, 42467, 26262, 53888, 7655, 39165, 24143, 59162, 11244, +38484, 21440, 55277, 2136, 48767, 30140, 15508, 58629, 35899, 7488, 44627, +24787, 65528, 12653, 39580, 23453, 55492, 4175, 33629, 47358, 18843, 58786, +12270, 38615, 22472, 50551, 4674, 31066, 55767, 16383, 46576, 34697, 891, +61502, 24147, 46417, 12477, 37209, 54633, 6273, 28503, 60970, 15160, 46581, +27388, 9825, 52781, 37449, 18432, 61817, 2010, 44868, 38030, 15346, 29350, +55651, 11408, 41417, 23583, 60245, 5616, 34232, 53239, 13683, 41729, 23833, +57982, 1381, 32282, 46807, 17364, 61494, 9855, 38725, 26798, 52096, 5707, +33861, 57848, 14554, 42317, 24847, 50731, 7086, 33775, 62096, 19360, 47804, + 1095, 40152, 25921, 58356, 12301, 43311, 24163, 54827, 9217, 40733, 23192, +59670, 12998, 34490, 53609, 3984, 44756, 32707, 21042, 57324, 9744, 47683, +17204, 35372, 64569, 5969, 31007, 47471, 14154, 57676, 24725, 41665, 8785, +53422, 34766, 18378, 61484, 1569, 44854, 28397, 14682, 53050, 37536, 3365, +59996, 23322, 46058, 13169, 33285, 53323, 1284, 43919, 21994, 62156, 12698, +34942, 47653, 3870, 56898, 24059, 40452, 10790, 52600, 19331, 33833, 59862, + 919, 43473, 23198, 51919, 10871, 30346, 61037, 15054, 44181, 27627, 6352, +52417, 36466, 18044, 64648, 10349, 47340, 27283, 38270, 2090, 52856, 17628, +31528, 39842, 24345, 58819, 12709, 39543, 22028, 54796, 6390, 35096, 47300, +18262, 61863, 140, 32461, 44180, 15816, 57790, 29375, 7790, 50335, 36363, +18384, 61717, 8959, 43453, 25309, 56722, 4623, 32200, 51861, 13202, 42237, +23202, 60770, 2077, 34353, 52698, 19262, 42613, 4272, 59313, 26805, 39026, +11266, 53996, 21232, 49303, 8211, 41101, 23364, 64858, 5607, 36914, 49741, +15121, 29311, 62238, 9202, 47690, 23009, 41021, 12002, 59687, 26049, 43692, + 5421, 55359, 17462, 34926, 51959, 8990, 29271, 57139, 18607, 42599, 5156, +52975, 28653, 16169, 57746, 36406, 7405, 47460, 25383, 63145, 12328, 41576, +22803, 51165, 411, 33897, 58162, 18061, 42269, 9798, 50855, 29745, 2165, +60671, 36527, 15524, 49232, 27557, 7758, 63572, 37324, 13168, 47268, 23097, +59251, 9652, 34226, 44120, 18428, 63979, 2144, 40819, 25457, 53700, 12670, +38697, 21537, 63299, 2508, 33865, 48520, 19870, 57176, 5237, 30399, 45375, +21585, 65440, 7844, 32680, 44386, 20996, 58669, 3793, 33614, 51108, 14511, +45489, 27494, 1560, 64908, 35315, 19909, 49357, 5467, 34651, 58454, 19500, +45751, 10943, 39075, 23592, 49226, 5895, 65377, 21099, 38604, 12125, 48696, +25315, 62367, 4583, 39802, 22400, 53236, 13642, 35765, 64044, 530, 32770, +46474, 19426, 61414, 11927, 40235, 26271, 55417, 2104, 31856, 50024, 13514, +41445, 25500, 63242, 3358, 33902, 53571, 13923, 47042, 25359, 39998, 1195, +60434, 17596, 47812, 28835, 10135, 58189, 36522, 17417, 50032, 5984, 31028, +64917, 12805, 41121, 23408, 55884, 7462, 34287, 50164, 15545, 30312, 59165, + 1762, 42580, 22455, 52004, 10534, 33377, 65237, 20867, 47130, 5690, 39928, +26618, 53097, 9471, 33261, 57226, 16359, 45068, 28336, 1486, 60858, 37668, +20698, 49435, 9746, 30243, 55345, 19040, 43612, 2258, 61666, 26921, 38407, + 8136, 53159, 33077, 14140, 55739, 24184, 44611, 3684, 32079, 61313, 16938, +47152, 27927, 10150, 62326, 37161, 18911, 50437, 5947, 41600, 27182, 60703, +10426, 48480, 19026, 35673, 53986, 591, 30484, 61463, 15694, 45447, 28479, +12767, 55306, 37133, 8208, 50429, 27562, 15320, 63842, 38156, 1146, 28343, +48609, 20649, 60855, 4246, 40321, 23233, 55325, 9771, 32384, 52832, 14909, +43694, 23892, 55214, 509, 40470, 21860, 65364, 12525, 39449, 26502, 51348, + 6742, 32284, 57942, 18892, 46884, 4014, 33781, 61850, 17644, 48814, 787, +41536, 27234, 64942, 13127, 40459, 23474, 46856, 8318, 61734, 25906, 39198, +11243, 54581, 21669, 47988, 622, 34689, 60748, 18848, 43329, 10413, 53135, +26586, 40215, 2380, 63492, 26035, 43501, 11123, 53484, 21210, 39010, 6855, +65186, 25710, 41220, 11625, 56857, 21564, 40573, 3170, 50893, 31034, 16296, +64579, 38076, 1299, 31059, 49083, 20570, 56841, 5866, 30925, 47655, 20491, +64828, 7716, 33846, 47315, 20205, 56928, 394, 30542, 44418, 16206, 62626, +27909, 4173, 50163, 35068, 19979, 65249, 11600, 43292, 25472, 55178, 2673, +41402, 22630, 63459, 13317, 46263, 30430, 1720, 60663, 36876, 17724, 53408, +10370, 43047, 21098, 59690, 29356, 6074, 53465, 35878, 18554, 49707, 2849, +33298, 63825, 20744, 46868, 6921, 39554, 25634, 52256, 14077, 29916, 62919, + 2569, 41887, 24708, 56017, 12549, 39499, 26454, 54354, 35, 39012, 21759, +63267, 6624, 33442, 46437, 20116, 56247, 11052, 39821, 23046, 65478, 4976, +48095, 31532, 17023, 57957, 36196, 8547, 49919, 27395, 16808, 64623, 38134, + 5472, 28966, 54705, 19269, 46123, 9036, 31986, 58808, 17327, 45250, 5905, +37249, 64371, 15354, 29044, 50406, 7764, 41387, 25814, 54363, 3451, 34514, +63303, 12667, 42986, 23337, 51078, 357, 33418, 58730, 20130, 42014, 12596, +55960, 26622, 48734, 4992, 32970, 60619, 1403, 45622, 18235, 31090, 49412, +11066, 65218, 24949, 40188, 8264, 49010, 22504, 55622, 11563, 40129, 25723, +63875, 3062, 32992, 51418, 14357, 40793, 22676, 59328, 1464, 33978, 53566, +18082, 45668, 7744, 31602, 65094, 15336, 47853, 28139, 9126, 55726, 37897, +15104, 31524, 48469, 728, 63153, 25148, 38293, 13038, 56524, 26987, 43686, + 1696, 52569, 19748, 34075, 60341, 4633, 44763, 18878, 33474, 56074, 994, +49073, 23990, 39407, 11180, 65421, 20842, 32036, 45755, 2787, 61687, 25044, +38479, 12005, 50730, 20468, 32911, 64769, 1420, 44039, 27654, 14771, 54145, +37030, 3862, 59273, 29450, 14750, 49957, 36115, 5979, 54548, 21464, 34856, +64891, 11887, 45121, 19241, 37859, 54075, 6070, 29234, 58345, 17002, 44396, +27406, 2819, 53642, 37095, 17431, 57662, 4804, 47108, 21277, 36580, 55138, + 9195, 31239, 47353, 19482, 58230, 6010, 40664, 25916, 53069, 12027, 32391, +60400, 17574, 42941, 3185, 50540, 19705, 30527, 57527, 10187, 45832, 18367, +29877, 61126, 6264, 44027, 34650, 17945, 56788, 10342, 42770, 26512, 52633, +14220, 32371, 61718, 312, 48560, 29380, 16537, 52638, 35475, 9399, 57463, +26406, 41646, 2217, 51977, 18566, 36675, 60521, 6903, 28727, 47189, 19883, +54204, 9925, 40899, 26575, 58418, 4501, 35433, 51467, 15470, 29995, 57574, + 6372, 43262, 21690, 59400, 9983, 31849, 51736, 17864, 42873, 5562, 61500, +30368, 15668, 55539, 36021, 8439, 52094, 23714, 44614, 3643, 33879, 61929, +14499, 43477, 24597, 50945, 495, 34739, 58479, 16854, 46870, 27521, 3802, +52971, 37360, 19388, 62376, 9057, 36607, 49714, 15608, 29667, 55975, 669, +42802, 23548, 59888, 14061, 31376, 47995, 3033, 64309, 23048, 41721, 13355, +52679, 30384, 7647, 63039, 35762, 17893, 49998, 5206, 35390, 59053, 16164, +31202, 51070, 10439, 43786, 22749, 64300, 451, 37145, 50205, 15180, 28991, +59597, 8778, 42189, 24882, 52788, 1007, 33071, 55085, 13586, 43074, 23822, +63945, 4799, 36250, 52634, 15371, 33008, 45970, 7756, 59034, 22316, 40621, + 9968, 47956, 25296, 57436, 2067, 32428, 44858, 19491, 60035, 5333, 36295, +49636, 16456, 30207, 56792, 8146, 46570, 27792, 13079, 64669, 35709, 19743, +50431, 4967, 42693, 22417, 62345, 13773, 36582, 49866, 7824, 29412, 56005, +20611, 46432, 1896, 34230, 61417, 11234, 44480, 28380, 15962, 54761, 38171, + 9190, 30814, 57516, 20656, 43709, 5639, 52289, 17883, 35293, 60393, 2526, +29384, 51057, 18605, 42068, 4562, 63683, 32165, 16283, 50246, 28110, 5757, +56703, 38060, 15086, 31561, 60107, 8347, 48237, 21939, 39523, 3560, 57287, +26842, 44335, 12827, 59927, 23342, 38290, 5324, 51839, 18307, 33417, 55783, +10722, 42183, 23176, 58151, 6681, 47443, 25182, 40517, 11221, 59867, 17143, +35801, 51984, 2732, 29082, 44310, 17333, 60658, 10471, 35233, 52242, 19071, +46337, 6554, 35614, 59228, 18386, 42409, 9343, 52498, 26674, 39693, 4949, +58420, 19469, 47864, 31352, 8851, 51449, 37167, 16912, 57428, 27427, 6224, +49571, 35356, 20322, 65503, 3571, 37810, 49461, 14521, 30977, 62498, 8317, +42163, 24841, 55361, 11528, 40042, 17315, 59101, 29519, 1593, 54550, 35947, +19088, 50029, 9397, 33425, 60857, 20187, 45783, 4427, 33966, 60023, 17382, +48047, 10022, 36930, 51708, 15841, 28740, 60811, 3195, 42790, 23771, 54451, +13155, 33198, 45312, 7253, 55968, 27373, 15146, 38234, 60544, 2365, 29123, +52082, 10955, 43525, 22828, 59715, 13789, 33967, 51460, 294, 41667, 26493, +62783, 12897, 38584, 22081, 53153, 2623, 32631, 57317, 18373, 46102, 9511, +29686, 59037, 14135, 48394, 23882, 39620, 4678, 57393, 17255, 30936, 46303, + 6928, 61795, 23815, 38445, 9566, 53349, 18379, 12205, 40659, 26498, 48354, + 5700, 56276, 20327, 34138, 44069, 2438, 59249, 28918, 16928, 50938, 35566, + 5218, 60021, 21437, 45491, 13611, 30154, 55489, 6316, 47797, 28145, 16586, +63575, 37263, 9860, 50222, 21043, 34718, 57694, 5617, 44327, 18365, 33070, +61556, 3619, 49194, 22222, 39674, 11997, 60099, 26457, 47092, 5216, 39956, +21724, 59248, 13959, 32694, 47051, 6932, 54452, 23416, 39144, 14351, 62675, +28572, 8222, 50988, 37172, 16001, 58662, 28911, 5923, 49651, 37180, 18125, +56635, 10072, 48323, 27199, 41713, 4626, 59333, 17763, 37456, 52575, 10292, +29571, 48380, 18819, 62631, 6516, 40604, 25986, 47135, 10761, 61824, 17305, +30724, 44154, 3283, 57738, 27636, 14470, 49940, 35115, 1139, 62727, 23491, +42984, 12487, 52414, 29116, 8772, 64559, 35594, 19795, 49486, 7135, 29911, +61357, 15327, 44663, 27744, 536, 64737, 35642, 17878, 51033, 9861, 42812, +27099, 61970, 1490, 41136, 22765, 51644, 9263, 34122, 56037, 13360, 42202, +23951, 63102, 684, 32083, 47823, 20572, 54833, 8486, 39619, 25213, 63460, + 2597, 48749, 22343, 41199, 8065, 57510, 26818, 38707, 10486, 46601, 21543, +63764, 3844, 32531, 54213, 13216, 42542, 23623, 47789, 10204, 58132, 17037, +31062, 44148, 3225, 64784, 23760, 38814, 12479, 48626, 21751, 63114, 7394, +41275, 24685, 48198, 12850, 54455, 22817, 38886, 231, 64581, 27213, 38258, +12900, 48138, 21412, 57576, 2847, 39226, 26578, 48410, 12069, 63909, 20597, +31955, 54930, 5444, 39778, 22181, 53200, 9799, 32535, 61046, 15188, 44107, +29497, 6785, 64554, 35767, 13059, 47598, 24594, 55369, 4109, 40241, 24347, +60722, 11367, 38883, 19468, 51712, 28894, 8027, 61793, 36839, 19888, 45851, + 5880, 55234, 26516, 39490, 12179, 58584, 23021, 48232, 3266, 41194, 26170, +56909, 12196, 40505, 24136, 62385, 6258, 39108, 21284, 53612, 11322, 34085, +56459, 19551, 45369, 4227, 33406, 64918, 18930, 48417, 11829, 38530, 21982, +57753, 8564, 31498, 46980, 17981, 59601, 1708, 29329, 44232, 16834, 55030, +28395, 3491, 62020, 35805, 17938, 50176, 12953, 35128, 65111, 7652, 42540, +24258, 53186, 12601, 40962, 22854, 63175, 3478, 37357, 52296, 15168, 31186, +44503, 1443, 59549, 25448, 39137, 11583, 56392, 24800, 41350, 2919, 52776, +17338, 31882, 63091, 9203, 43986, 27461, 16587, 57174, 36695, 5854, 50838, +27385, 17059, 63810, 37280, 3398, 46635, 24492, 59760, 10171, 39447, 22202, +54924, 13505, 48031, 31582, 6850, 58291, 36855, 13492, 54006, 24158, 46426, + 8373, 34369, 62649, 16520, 45713, 27556, 1241, 53798, 35117, 16041, 61040, +28849, 10100, 49397, 36456, 17373, 55211, 127, 41950, 27200, 62579, 13694, +48785, 25197, 39228, 2297, 63632, 17799, 35608, 50488, 8338, 29702, 62131, +19239, 43002, 5012, 54002, 21287, 33610, 63898, 8390, 46068, 20751, 32470, +56466, 4478, 41138, 25042, 54287, 14687, 31141, 64431, 1210, 45772, 29048, +15871, 53886, 35866, 10697, 60240, 17851, 29500, 45160, 655, 63159, 28363, +15220, 52838, 37918, 8458, 46679, 25027, 55326, 12401, 41575, 23303, 58311, + 307, 33293, 52594, 20250, 47325, 5058, 31957, 61683, 20246, 48742, 7908, +41434, 26582, 65193, 11279, 39360, 23216, 48282, 6146, 57928, 26131, 40755, +11187, 52328, 19829, 31547, 64829, 1960, 41403, 23214, 55280, 9382, 32659, +47428, 14709, 62530, 25339, 38568, 690, 50554, 20010, 32437, 64003, 11780, +42903, 23014, 49588, 7997, 32263, 57279, 17868, 39848, 4660, 61310, 25057, +39188, 10077, 55690, 21358, 42624, 4245, 48960, 25702, 60219, 13434, 39575, +22527, 51515, 1558, 31755, 62489, 16205, 44490, 28305, 6253, 53604, 35483, +19630, 65426, 11760, 47935, 27054, 40887, 2570, 49349, 22728, 63748, 59180, +36490, 17819, 50479, 9285, 31816, 63218, 14779, 46139, 27522, 6803, 55174, +37654, 13687, 48091, 23413, 64897, 851, 38616, 27232, 52900, 10561, 34996, +58897, 19636, 44355, 3301, 35534, 55370, 14900, 29463, 47050, 366, 63058, +24747, 39679, 9955, 54207, 23968, 42884, 13652, 57758, 29962, 2549, 50303, +35302, 18287, 65157, 7521, 48844, 27203, 38591, 11847, 61742, 25953, 41570, + 2253, 56345, 21579, 47933, 12630, 32048, 64053, 3644, 44897, 27294, 16412, +53156, 35470, 607, 62929, 24114, 45115, 13627, 35978, 54308, 8543, 30738, +63758, 20913, 44778, 2276, 40681, 26183, 56943, 13769, 38482, 22281, 48682, + 897, 55659, 26695, 39381, 9234, 61153, 20279, 47542, 30883, 7503, 53365, +37777, 20394, 56873, 3890, 34365, 50935, 14539, 42209, 24120, 58804, 1596, +39837, 26644, 52004, 10293, 34180, 57186, 13568, 47761, 25228, 39501, 5044, +59290, 22159, 43788, 12395, 54662, 24817, 38974, 7278, 64334, 18791, 48173, +29630, 5576, 52601, 37909, 16128, 58796, 27965, 4708, 49581, 36509, 17029, +59520, 29610, 9859, 53782, 38061, 16900, 31132, 47990, 3444, 62497, 22167, +40740, 14759, 51599, 28949, 6999, 58714, 37298, 16963, 50168, 27636, 859, +62094, 35942, 20302, 51024, 8531, 33591, 54838, 15453, 46838, 29110, 1580, +59551, 36823, 16489, 51018, 27949, 3579, 61000, 36686, 18231, 47312, 10584, +56709, 26632, 40161, 7436, 49146, 22846, 62611, 10461, 32465, 43902, 17811, +51535, 970, 34751, 58971, 17419, 41989, 11461, 48315, 26249, 57791, 2694, +39617, 22895, 49131, 12071, 54427, 25934, 40673, 1364, 60238, 21968, 45788, +14390, 35350, 53114, 6937, 31124, 63807, 17074, 42441, 2312, 54719, 25660, +40834, 10907, 58046, 33999, 17675, 50182, 254, 32312, 65145, 15165, 45184, +28054, 8940, 55009, 36285, 19698, 50616, 1361, 34270, 60278, 15625, 46309, +24754, 41913, 5316, 58828, 29429, 15839, 49824, 37083, 7991, 60211, 23372, +42026, 2591, 48930, 26407, 62911, 6935, 39305, 21592, 51368, 12452, 31485, +64667, 6308, 48865, 24385, 39531, 10855, 53013, 20173, 31625, 56077, 4211, +46885, 28140, 16014, 59111, 38003, 103, 32748, 55242, 14349, 45506, 27537, + 8580, 61815, 35194, 20492, 53534, 12744, 34511, 48686, 6703, 64114, 20924, +34172, 46078, 10300, 59000, 19529, 34058, 44937, 4159, 53260, 29425, 14306, +61599, 37899, 1211, 49313, 29565, 14229, 55924, 35792, 8510, 50790, 28642, +16543, 61173, 36431, 19, 45518, 24156, 64247, 11657, 40025, 21474, 52862, + 1873, 30562, 61145, 14465, 44132, 28827, 4318, 57607, 36712, 19985, 51086, + 9339, 42486, 22872, 64102, 6423, 33085, 51944, 19436, 42833, 10754, 59238, +25954, 39633, 4493, 54410, 22391, 46875, 10205, 30688, 60389, 13806, 43418, +24605, 55569, 579, 36236, 49673, 15680, 29766, 58978, 10034, 40735, 25714, +51073, 1637, 30168, 61674, 13206, 43367, 22113, 51030, 7058, 34598, 57441, +12928, 48059, 23746, 40947, 3026, 62105, 20973, 33650, 47140, 7342, 56364, +20235, 35104, 44102, 11759, 59267, 29413, 2176, 50184, 34825, 18037, 61196, + 5625, 45341, 34877, 17391, 64305, 10158, 44405, 28763, 14891, 57075, 37822, + 3230, 44455, 23690, 59615, 13198, 34182, 53208, 828, 42666, 21824, 53997, +14314, 35755, 62778, 3375, 29257, 50249, 13335, 43233, 24733, 58210, 8143, +30070, 45081, 19442, 59664, 6018, 41239, 26777, 55036, 10525, 43855, 17692, +57593, 30336, 5440, 51111, 37001, 18628, 63188, 1201, 42550, 26337, 53991, +14479, 35289, 49931, 6832, 30950, 65058, 18544, 47378, 11603, 39688, 26949, +63347, 5148, 46986, 17609, 33699, 56593, 8857, 42656, 22463, 59741, 13023, +31830, 50528, 1036, 42711, 22890, 58289, 8792, 32873, 54362, 15939, 45098, +28434, 4048, 13521, 42199, 25000, 61298, 616, 40221, 22441, 51833, 10866, +36096, 62276, 16104, 31312, 45889, 4554, 57304, 24383, 41568, 12281, 49104, +22217, 62803, 5815, 31335, 46237, 12634, 60492, 25572, 39989, 8035, 54264, +22026, 38355, 13345, 59005, 26841, 43978, 6128, 50890, 18723, 34067, 63976, + 8491, 42267, 24178, 54202, 11089, 38844, 23782, 57491, 45, 43276, 21324, +50911, 6378, 33178, 60236, 15381, 43843, 27531, 8714, 53969, 36333, 14617, +57307, 27501, 6838, 49062, 37838, 19996, 60026, 10909, 42918, 22701, 50376, + 3013, 32395, 58082, 18822, 46961, 7010, 32693, 61589, 12467, 49374, 24552, +41840, 5130, 64232, 19365, 35876, 53809, 12060, 31513, 50603, 17575, 43110, + 4692, 65502, 28549, 15038, 49346, 35494, 9384, 62187, 19023, 31603, 46545, + 5458, 60677, 35089, 13776, 45302, 22044, 55542, 3115, 41118, 23905, 62902, + 8747, 33800, 53438, 15538, 46770, 29385, 3435, 60568, 35574, 14187, 46911, +25726, 56419, 2030, 32913, 44247, 14827, 61736, 27423, 8178, 37438, 55576, +14213, 46553, 27857, 1304, 64486, 35750, 15773, 49678, 28338, 7198, 60909, +35338, 12515, 55165, 24538, 44578, 1706, 33820, 48389, 15471, 65037, 28646, + 8159, 38193, 55934, 14542, 29720, 44522, 4297, 60653, 24778, 40671, 10835, +56321, 20464, 31600, 44706, 6688, 62018, 20126, 30873, 44555, 11418, 55264, +24531, 40480, 4644, 64189, 17645, 44727, 30007, 1958, 53949, 36504, 20501, +60133, 6619, 30247, 46577, 13630, 65318, 25225, 39043, 5813, 51501, 19895, +36424, 62046, 9180, 30183, 46079, 19673, 64111, 4358, 32721, 44634, 19003, +57285, 9931, 38452, 27255, 48770, 5296, 58534, 20309, 33532, 44824, 9415, +50492, 19130, 32137, 59618, 3982, 42288, 24146, 48909, 12608, 61233, 22579, +39759, 4607, 52382, 29514, 16057, 59268, 38175, 7391, 29050, 64678, 14273, +47581, 28004, 3497, 52017, 35522, 13272, 63268, 23261, 45103, 1540, 35056, +54161, 14723, 29706, 57171, 10018, 41324, 24139, 53268, 14852, 34591, 61056, + 4588, 46275, 24833, 40498, 13684, 57937, 23128, 46809, 922, 36532, 63593, +14788, 28999, 44297, 7190, 60167, 24558, 41747, 11194, 52709, 20144, 30689, +60750, 5777, 47262, 17585, 37826, 56581, 2059, 28254, 45548, 18715, 59714, + 4737, 31434, 44242, 16151, 54970, 27505, 365, 50345, 36969, 15827, 65166, +28184, 6917, 49551, 35301, 20115, 58709, 11813, 46220, 25189, 40886, 2742, +64694, 19687, 32618, 47490, 6535, 56591, 27639, 15498, 38087, 50571, 5470, +30675, 57756, 15271, 42383, 25809, 51619, 7827, 34958, 65119, 17570, 48519, +11608, 39592, 26666, 54282, 3377, 34265, 58370, 15103, 45793, 28032, 1950, +53622, 35282, 16404, 64762, 29522, 9147, 49728, 36862, 19957, 58711, 4063, +41982, 26239, 54100, 7361, 39433, 21746, 65283, 12349, 41839, 23270, 52325, + 4024, 34350, 63139, 17820, 47781, 11113, 40579, 26959, 53852, 3332, 31719, +60539, 15408, 44931, 27919, 8109, 58864, 37089, 18495, 50816, 5848, 40082, +27168, 64159, 14208, 32010, 53454, 4396, 46001, 27353, 16502, 62731, 37712, + 9230, 53148, 24418, 42050, 13755, 58084, 30032, 2751, 51235, 37104, 19390, +55049, 7448, 35864, 50153, 15968, 28769, 63710, 5783, 45969, 28388, 15311, +51334, 37510, 4794, 57124, 24574, 45587, 10811, 34382, 61796, 19309, 47326, + 5004, 36549, 56742, 15787, 33333, 47894, 1444, 64360, 22375, 39427, 13756, +51485, 28867, 2695, 61008, 35914, 20365, 47626, 7734, 54721, 27226, 38837, +12311, 61755, 22291, 43772, 3111, 55451, 26186, 40545, 13469, 58899, 29660, + 626, 51146, 35915, 20650, 55342, 8128, 37880, 49851, 15494, 29171, 64594, + 3608, 36200, 47394, 19016, 54908, 9804, 40561, 26274, 62859, 4511, 38665, +21885, 50913, 9695, 34319, 56855, 52506, 5314, 46860, 17390, 35736, 54028, + 7687, 29552, 59874, 19211, 43116, 1901, 53724, 26088, 39054, 10147, 60776, +17907, 44711, 31619, 2683, 51819, 36912, 15196, 56887, 23704, 43970, 1158, +32670, 64368, 19230, 49091, 4122, 41235, 23381, 53531, 12485, 37092, 61167, + 1545, 28777, 47661, 20600, 56050, 4618, 41149, 22319, 62496, 12877, 43828, +26145, 52047, 8934, 36672, 63812, 16793, 30395, 46805, 4292, 52276, 29049, +16795, 59315, 37928, 1495, 50192, 28477, 15328, 64318, 31727, 4395, 53549, +37930, 14875, 29168, 55962, 7825, 41880, 24704, 60482, 11501, 39156, 21660, +52993, 1605, 36313, 59766, 15412, 29865, 46745, 8336, 56467, 24424, 40539, + 2073, 60220, 21188, 34787, 53552, 11220, 42146, 24702, 58113, 18, 39735, +22359, 54541, 10747, 30089, 48414, 17631, 64103, 6920, 38403, 26997, 51466, +11651, 32274, 58563, 19714, 45625, 918, 40379, 26143, 65306, 11174, 39663, +23651, 55077, 6781, 41846, 21517, 63179, 10771, 37305, 50108, 16936, 30011, +59840, 3587, 42498, 24361, 53216, 11422, 40885, 21753, 58008, 4932, 40703, +25565, 50660, 14427, 36810, 59255, 5988, 29677, 48936, 18426, 60424, 11424, +39164, 23028, 54357, 4935, 33697, 47332, 18504, 62827, 9554, 32233, 45645, +18089, 52785, 2948, 33194, 63370, 13338, 47849, 24043, 40839, 1084, 57914, +17119, 35259, 52801, 9616, 31256, 48477, 20593, 59483, 5955, 33134, 47224, +17003, 57248, 9629, 33344, 44389, 18894, 53007, 3955, 32179, 56411, 14923, +44427, 28191, 1636, 55243, 35157, 17277, 50323, 6566, 34881, 53180, 17211, +39937, 11180, 61297, 26459, 49219, 3182, 40679, 22979, 65504, 13839, 48008, +29567, 906, 53892, 36388, 17309, 63108, 10166, 47685, 27245, 38305, 5912, +55848, 21555, 43402, 9995, 63488, 35022, 18936, 50985, 2525, 43170, 25927, +57679, 9659, 33388, 53845, 15312, 43302, 24028, 56866, 6961, 40048, 21182, +61015, 12084, 41868, 25772, 51192, 5588, 33598, 65222, 19483, 46413, 199, +32784, 56400, 13019, 42611, 23343, 52761, 3281, 34349, 60203, 18770, 42769, +10319, 52436, 20894, 34236, 56399, 4970, 48167, 30232, 15667, 62748, 37187, + 2595, 50719, 24155, 42240, 10065, 64555, 19456, 36740, 50060, 7811, 30269, +62117, 14211, 47932, 28038, 8845, 57330, 37968, 14810, 29127, 60758, 5926, +34546, 45661, 20203, 54934, 10950, 40767, 25654, 62068, 3639, 36723, 51818, +13890, 31654, 55423, 8187, 44123, 27947, 11888, 62310, 37573, 19367, 53155, + 3214, 43567, 26605, 63392, 10762, 38397, 22431, 48367, 5072, 59665, 19317, +32640, 46055, 446, 56058, 23391, 41692, 9766, 62975, 29602, 16771, 49923, +37274, 5907, 60484, 22416, 44865, 8167, 32493, 57093, 18521, 42696, 1177, +53101, 29711, 16325, 61562, 36207, 10769, 47758, 23582, 56535, 2557, 32956, +46213, 18646, 61003, 9418, 30835, 45292, 20400, 57577, 6103, 38471, 23375, +62394, 12397, 48898, 25948, 39607, 65, 65131, 20432, 35081, 51930, 11188, +30629, 55640, 17178, 43041, 1571, 60834, 23575, 39666, 12760, 51226, 28976, + 6617, 57112, 36572, 19781, 49353, 756, 32775, 64979, 19449, 47541, 8262, +40242, 26563, 62241, 11772, 39390, 24327, 60079, 1318, 48312, 19068, 37828, +54301, 10514, 30043, 63067, 18021, 44379, 8623, 31629, 60475, 17634, 42221, + 438, 54900, 26473, 40179, 13877, 51308, 28733, 7741, 61306, 37935, 16544, +29137, 53882, 4518, 43448, 24051, 58101, 9895, 33420, 45583, 13895, 65245, +24103, 40931, 3976, 52038, 19093, 32556, 58349, 9908, 45730, 17848, 35971, +53476, 6222, 31948, 62184, 18056, 45304, 10221, 38895, 26380, 59501, 2225, +34542, 53215, 16886, 45697, 28033, 5734, 60991, 32023, 16344, 50965, 36095, +11394, 55955, 24638, 43369, 2063, 64092, 20392, 30919, 58557, 11359, 43084, +23351, 65201, 2812, 33670, 50854, 13024, 40100, 23316, 58185, 8886, 33308, +47776, 19505, 64550, 4874, 38841, 26303, 54847, 13164, 48464, 29309, 7344, +61904, 36000, 17535, 47329, 10970, 54828, 27150, 38820, 5781, 62648, 24997, +43697, 10893, 51512, 17987, 31705, 59577, 7785, 44368, 27749, 15970, 53442, +37906, 3851, 31790, 58648, 15714, 46906, 27703, 2730, 54654, 34997, 13741, +60673, 24229, 45235, 9058, 34015, 48436, 20017, 61271, 6442, 35153, 45362, +21044, 57565, 11987, 40009, 23039, 51262, 237, 32985, 65029, 15785, 45641, +28909, 4959, 50781, 35334, 13650, 57986, 24153, 44421, 6793, 33316, 49085, +19855, 62939, 10035, 33156, 45242, 18901, 51746, 3722, 31926, 63757, 18244, +45268, 7878, 32455, 55982, 14209, 42290, 24720, 59219, 1891, 32613, 53358, +19590, 42991, 4924, 62248, 29078, 15940, 49643, 36420, 7833, 56115, 22066, +47231, 14793, 33311, 59482, 4597, 45535, 27706, 16435, 53477, 35044, 183, +57340, 24715, 44956, 9034, 33495, 65067, 16360, 47368, 28437, 6910, 54584, +35176, 13453, 63670, 23741, 43726, 570, 53541, 19338, 32900, 56968, 9283, +45804, 25412, 41203, 2624, 64131, 24543, 48895, 12509, 39463, 21812, 58260, + 38, 38341, 27210, 49126, 11976, 59128, 21851, 41875, 5433, 52069, 34899, +15631, 65519, 28267, 7658, 50160, 37058, 18578, 60826, 2506, 42562, 25484, +54818, 11876, 39978, 20989, 62202, 28717, 416, 50000, 35633, 20750, 63337, +11610, 34914, 47913, 18338, 60719, 8000, 40849, 25623, 57587, 12578, 43848, +22731, 62600, 72, 31846, 48052, 19672, 56150, 8823, 33776, 44414, 18488, +55188, 7304, 39521, 25115, 60376, 11782, 43113, 21733, 56413, 2790, 33328, +52994, 18735, 41834, 13818, 60171, 33704, 1247, 45229, 25271, 54864, 11470, +38672, 21136, 61586, 5151, 34871, 50284, 18587, 39836, 664, 63846, 26966, +38781, 10892, 55064, 22219, 47522, 3171, 36117, 58325, 15469, 29923, 52892, + 8850, 44182, 27658, 16494, 62069, 38113, 7339, 30437, 48351, 17084, 64244, + 8734, 39138, 27060, 50655, 1643, 32572, 62341, 14098, 43889, 27332, 7837, +54260, 34811, 19141, 58440, 11881, 43737, 27039, 51684, 3801, 33589, 57807, +15587, 44165, 27431, 1034, 54195, 38144, 16877, 29669, 64375, 3117, 43596, +23751, 52458, 12931, 38918, 22204, 63233, 1531, 37297, 50113, 14973, 28764, +57399, 7275, 44125, 27365, 16945, 60850, 36536, 688, 51344, 23263, 46088, +14381, 32074, 60136, 9642, 41111, 21645, 56858, 1406, 32119, 52692, 13709, +43319, 25241, 61902, 6686, 39092, 22018, 51495, 13901, 31925, 59442, 2644, +43422, 23114, 55469, 10414, 32243, 47976, 14037, 63487, 25064, 38696, 5000, +49115, 21794, 62369, 12939, 31930, 45395, 3495, 51274, 18939, 31116, 64257, + 8487, 42517, 24932, 51733, 14585, 34746, 59153, 1017, 42793, 25518, 50683, +14811, 33516, 55021, 3703, 44527, 30717, 17583, 56606, 9621, 49221, 27164, +41711, 2905, 59820, 19150, 36376, 50121, 9915, 29790, 56556, 18923, 43653, + 3680, 63513, 31381, 15825, 52315, 35171, 9858, 59902, 24939, 44353, 6002, +31489, 56744, 14556, 43469, 21652, 50723, 4352, 31144, 58535, 14729, 43757, +27875, 6811, 56918, 35316, 20521, 49792, 2041, 34504, 59017, 21047, 48369, + 7160, 38648, 22764, 63880, 10406, 32354, 48396, 18668, 56425, 2831, 42353, +26608, 58956, 10797, 48880, 19121, 36103, 62871, 6593, 29862, 50857, 19122, +42357, 185, 56507, 29129, 16081, 50091, 36175, 8168, 60042, 24736, 48056, + 1735, 38985, 21674, 63577, 11903, 48896, 25562, 40507, 3810, 56762, 21941, +48842, 12762, 41698, 27008, 61645, 7079, 33174, 51630, 13400, 42101, 23615, +58660, 24, 46643, 28927, 14992, 61609, 37330, 7430, 49777, 18759, 33268, +14835, 56501, 38185, 8829, 30575, 54402, 19607, 43669, 6124, 62075, 30297, +15473, 49625, 36944, 238, 56174, 22502, 45308, 14301, 33561, 59756, 6447, +46867, 27836, 16419, 57887, 37801, 3562, 50959, 21038, 31242, 60112, 9605, +45951, 19981, 30687, 57108, 2902, 41037, 23547, 65481, 13290, 35149, 46970, + 952, 55519, 25804, 40426, 13803, 64445, 28906, 7806, 50224, 37532, 18797, +61974, 10657, 42917, 22976, 50633, 762, 32356, 65255, 12976, 42234, 24048, +54841, 3513, 31160, 47878, 17240, 63252, 9122, 42058, 25316, 47432, 6445, +56498, 24090, 40309, 10701, 61935, 17937, 30558, 51991, 3743, 34754, 64344, +18433, 42227, 705, 53128, 28453, 15638, 60980, 37372, 5567, 49785, 27607, +16559, 59271, 37348, 10061, 52330, 22156, 47369, 3388, 34334, 65159, 15920, +46207, 28461, 8225, 51091, 36368, 13585, 56463, 24652, 42287, 3605, 61361, +28579, 13783, 51317, 38158, 2338, 30295, 63929, 16163, 48333, 28873, 7569, +51081, 36795, 19050, 62575, 12304, 47763, 23090, 40250, 2180, 56651, 30299, +15161, 49991, 37192, 3324, 61423, 25294, 40113, 12130, 51610, 21566, 39408, + 4082, 62627, 35012, 17442, 50507, 10628, 34207, 55841, 20777, 44743, 7145, +32911, 61990, 13685, 48601, 22930, 41429, 6452, 55828, 25470, 38959, 10559, +60299, 19506, 30411, 46386, 3718, 56293, 22950, 39883, 12357, 54148, 26848, +39020, 8821, 64703, 17206, 46282, 31111, 4095, 52501, 37054, 17402, 56489, + 9136, 42500, 26204, 59305, 2944, 30853, 52068, 20425, 43232, 5329, 64817, +27137, 38334, 9489, 54094, 17917, 34032, 46148, 4627, 59367, 24297, 39195, +14286, 62885, 29586, 1890, 51986, 35270, 14249, 47367, 26469, 64274, 6438, +39214, 23108, 50435, 12958, 30860, 62532, 7948, 47410, 28951, 17086, 53318, +36301, 6640, 64517, 24197, 47840, 12825, 41681, 26433, 60433, 5993, 32175, +52522, 16124, 44692, 28514, 8676, 62225, 37279, 17134, 49934, 28262, 6549, +63070, 37734, 13136, 45802, 22886, 59230, 2170, 34091, 52350, 20098, 43129, + 5408, 54165, 21406, 31696, 56995, 11605, 45009, 17772, 30301, 58722, 4277, +36013, 51637, 16315, 45462, 28265, 474, 65333, 37952, 14829, 31436, 55605, + 7204, 43467, 23224, 63540, 10904, 31739, 48514, 19801, 60518, 6538, 33995, +46431, 20988, 55151, 9438, 40135, 27229, 58894, 4619, 31024, 54211, 17905, +46486, 9391, 31630, 64080, 15917, 45538, 28651, 4961, 54071, 38093, 15417, +30603, 65447, 7953, 43667, 22168, 56086, 4670, 33724, 51173, 14962, 42554, +25376, 64461, 4121, 39935, 22995, 53536, 12783, 31961, 58139, 8690, 46350, +27825, 16403, 38071, 64923, 4781, 30273, 51357, 19999, 41946, 724, 58490, +26642, 46144, 9364, 32921, 55546, 14614, 41456, 24039, 60200, 6757, 40419, +22711, 53593, 13427, 35455, 59783, 5521, 30251, 47796, 12614, 55337, 23621, +40245, 7150, 63315, 22655, 39413, 11691, 60005, 20738, 32888, 47407, 5551, +62908, 23049, 38787, 12588, 46780, 25221, 64622, 4661, 40775, 24786, 53853, + 8158, 38575, 22221, 58607, 13006, 48039, 26729, 40896, 1827, 55113, 22119, +40324, 12348, 61759, 25976, 48386, 2473, 39768, 22896, 63376, 12444, 34261, +53392, 8732, 44580, 27326, 16349, 64652, 37628, 4011, 50908, 27600, 15369, +55491, 36329, 5587, 46515, 26265, 59866, 13172, 41436, 24557, 54288, 4385, +39813, 23679, 64957, 12275, 38995, 22611, 53176, 1877, 32302, 46957, 17208, +55322, 9479, 40344, 26421, 63719, 14901, 34300, 47156, 4401, 61528, 22474, +41666, 9494, 56407, 26943, 41430, 14059, 52400, 29227, 5601, 60719, 36608, +13963, 47978, 24765, 64172, 1320, 39401, 21283, 54064, 11027, 38531, 26884, +64981, 3352, 38457, 19532, 55128, 30084, 8669, 50359, 35258, 20808, 59990, + 3858, 44500, 28299, 914, 33756, 62953, 16481, 47270, 27860, 4073, 60195, +36447, 17715, 52334, 10710, 42901, 26795, 63701, 7541, 30339, 53257, 12188, +40283, 23941, 63086, 1831, 39873, 21596, 53195, 11700, 34362, 64807, 18033, +44008, 485, 35031, 56439, 17039, 48732, 7396, 36726, 54810, 15127, 28633, +48772, 6407, 61338, 32671, 19225, 45475, 9677, 56982, 20703, 32105, 44532, + 1847, 55315, 24712, 40069, 5693, 57172, 21203, 38743, 14423, 52839, 29940, + 7207, 58071, 37534, 18325, 44622, 9738, 59829, 26872, 38931, 1870, 52774, +30690, 13411, 61094, 35831, 19606, 49592, 2371, 34088, 55028, 20987, 42771, + 8090, 57280, 26097, 39229, 11171, 51568, 17175, 30848, 57763, 8597, 44171, +28311, 14342, 55357, 36408, 1292, 44736, 25478, 62816, 13631, 31825, 44099, + 7325, 57352, 24456, 39870, 11092, 54346, 22819, 39380, 479, 63334, 19159, +47493, 32550, 9760, 53710, 36897, 20164, 58453, 6268, 43353, 25375, 55436, +11269, 41090, 22629, 60288, 4241, 38960, 21258, 54743, 9689, 38382, 27002, +60649, 6293, 32866, 51669, 20075, 42429, 10821, 58997, 27135, 46839, 5360, +32262, 55804, 13320, 42405, 24200, 60125, 5752, 30600, 46503, 19415, 65229, + 1108, 31060, 52281, 17922, 42495, 4009, 59475, 26244, 39134, 14800, 51302, +30003, 1529, 63732, 35615, 17371, 49990, 8683, 33182, 62240, 15123, 44665, +29365, 709, 60246, 34981, 19222, 50900, 6842, 34700, 57866, 19119, 42691, +10273, 63692, 23352, 38716, 4770, 50386, 34720, 17303, 55837, 10336, 37864, +49892, 15546, 30079, 56554, 2434, 43605, 23489, 61573, 12902, 39749, 26343, +48580, 7016, 56803, 18012, 34239, 46680, 10469, 58323, 23922, 38706, 3530, +54899, 20982, 38299, 11011, 59363, 26465, 45771, 525, 37337, 56509, 15980, +27533, 50169, 3740, 37988, 58772, 14678, 29121, 44694, 2161, 55896, 21514, +38645, 11084, 57515, 22421, 48325, 2917, 33794, 59048, 14334, 46265, 27327, + 1130, 56561, 35054, 15918, 53508, 27967, 4404, 49424, 35886, 15886, 64498, +28620, 10802, 49821, 36478, 18016, 61231, 2826, 33857, 47869, 20591, 63991, + 9787, 40182, 26126, 54612, 6841, 32714, 48429, 20386, 61016, 11377, 41455, +25987, 53138, 3256, 39445, 21732, 59085, 13414, 34574, 53800, 5159, 43819, +27682, 16389, 57023, 38096, 2302, 31950, 62757, 17862, 48801, 11917, 42372, +25230, 51162, 6588, 34306, 59400, 20838, 42788, 1989, 55991, 34691, 20352, +46634, 11091, 58823, 26077, 40472, 2658, 54786, 25557, 39534, 11984, 62837, +23323, 49008, 7527, 38621, 21238, 59047, 11894, 43884, 26566, 55282, 1733, +34596, 48999, 19136, 62115, 6005, 33924, 47344, 18110, 54731, 11457, 38430, +22635, 61329, 5779, 47730, 28878, 15705, 51765, 37476, 2121, 65474, 25655, +47577, 12142, 38469, 21216, 57987, 255, 37604, 49946, 16286, 28619, 63944, + 4305, 44029, 27518, 16684, 51627, 36457, 2236, 57920, 25876, 45981, 10239, +41135, 17160, 53157, 29824, 1325, 59112, 35414, 17836, 49659, 8948, 32571, +57192, 15141, 45399, 34531, 425, 62350, 24946, 49079, 7477, 38373, 21413, +64229, 14692, 47696, 31092, 4202, 53328, 35151, 18369, 60221, 7826, 32394, +51643, 16959, 45664, 29194, 138, 60986, 35716, 21025, 53682, 9307, 44300, +19825, 30797, 58147, 11938, 43313, 22148, 64418, 1150, 33675, 52596, 11771, +45001, 19612, 36222, 57132, 7024, 31311, 45995, 19756, 62071, 9179, 34637, +44876, 20847, 57008, 3232, 38746, 22648, 58689, 6244, 32187, 53068, 12134, +44938, 28782, 16802, 55351, 37915, 2924, 30736, 64813, 18995, 46872, 7612, +32543, 57543, 16857, 45666, 29131, 4948, 55852, 34962, 19002, 46639, 7348, +60080, 22661, 42011, 12400, 56423, 25456, 48434, 5441, 41569, 17265, 62213, +31610, 10427, 53730, 37566, 18139, 49236, 14007, 50689, 36593, 8070, 57167, +23611, 45101, 12448, 40878, 21881, 59232, 1353, 32932, 50513, 14518, 41967, +22951, 60380, 3927, 34030, 51209, 15882, 44951, 28451, 7851, 58497, 36458, +19583, 49713, 5401, 29870, 60508, 21267, 45201, 8973, 31305, 63329, 20754, +44738, 2240, 33195, 58940, 16464, 44016, 27392, 4930, 53211, 35392, 15315, +62307, 28082, 7151, 49763, 36476, 17650, 63313, 12023, 43796, 27279, 60019, + 3922, 34415, 46621, 16275, 51457, 27402, 2900, 61853, 34874, 19952, 48482, +11456, 57207, 22332, 41595, 5626, 51738, 29011, 16168, 63546, 37794, 9119, +49199, 27613, 16116, 59578, 36801, 5182, 49583, 20925, 33900, 64965, 2698, +45573, 35665, 20282, 61993, 4617, 32756, 47793, 19613, 58736, 10823, 39300, +23271, 53001, 2308, 30148, 61697, 17967, 46750, 5069, 33668, 60075, 14530, +43534, 25348, 55845, 4475, 30223, 45367, 16342, 64782, 27779, 8525, 50148, +35150, 17919, 61092, 1154, 33305, 52620, 13930, 42078, 25187, 57652, 2992, +48808, 22214, 41389, 12736, 64661, 26209, 39028, 968, 53080, 17810, 32936, +64060, 9681, 43335, 23234, 52192, 1833, 34678, 57827, 16904, 44012, 27545, + 7861, 55292, 37447, 16232, 50011, 28605, 9641, 61006, 35704, 19831, 54058, + 6080, 34785, 46832, 18730, 57571, 11552, 40515, 23563, 47814, 2792, 54801, +26344, 40692, 11668, 58469, 21922, 48253, 4691, 41539, 26031, 62915, 13312, +30525, 48215, 1772, 54763, 25744, 40904, 11849, 60037, 20861, 46918, 29193, + 1037, 64067, 36466, 20956, 46786, 6240, 60574, 26094, 39833, 10222, 52411, +18724, 36132, 63482, 786, 29975, 51002, 20354, 40918, 5682, 65016, 22372, +40779, 12169, 48993, 26990, 61949, 5392, 40795, 21991, 51760, 13898, 32057, +63948, 6980, 44636, 28458, 16993, 60961, 37326, 8482, 53626, 23376, 41973, +12380, 48155, 26197, 65329, 7194, 40431, 25892, 54371, 13327, 30342, 44202, + 5050, 64137, 29142, 16839, 50565, 36655, 7654, 61694, 23946, 42744, 9890, +57079, 21519, 40260, 767, 58905, 25267, 43674, 8456, 53167, 24569, 39924, +12749, 59863, 22873, 45923, 1370, 34436, 56233, 15788, 44523, 29169, 5437, +58077, 35601, 18506, 49891, 9665, 32299, 63056, 17798, 47119, 726, 38645, +25343, 51796, 14378, 32304, 65093, 7091, 48284, 25337, 41480, 9850, 53906, +19460, 33090, 61235, 213, 41837, 18399, 53544, 29513, 9818, 61964, 37780, +16642, 49995, 27980, 5953, 60386, 37071, 17852, 52386, 10145, 34410, 47360, +17660, 57187, 960, 34496, 45834, 16977, 61568, 29153, 3472, 50050, 36713, +18165, 60425, 9206, 41246, 26105, 45523, 12412, 56292, 22305, 40611, 2951, +63127, 26980, 44976, 8783, 35430, 57459, 16726, 31261, 54197, 7071, 42448, +21874, 56939, 14118, 33404, 53255, 5185, 43215, 25109, 62637, 11357, 33947, +45720, 19938, 53765, 7579, 34474, 56813, 14234, 46167, 29481, 9029, 64973, +35465, 19736, 51164, 6239, 34080, 56057, 19680, 42717, 10883, 61519, 26986, +39591, 3157, 54768, 22715, 47149, 11257, 30262, 60456, 19692, 41937, 9600, +55448, 26645, 39249, 5863, 59214, 18981, 46022, 28675, 9596, 55949, 37820, +15339, 49613, 28256, 3517, 65395, 36166, 13731, 48441, 22576, 57603, 6375, +33751, 46371, 17116, 62501, 2255, 39570, 27074, 54671, 7924, 35739, 49720, +16416, 29443, 61878, 3682, 46801, 27842, 15308, 60597, 35265, 734, 50536, +28392, 15270, 54421, 37985, 5117, 30842, 60115, 14563, 49081, 25342, 41776, +10380, 64272, 21900, 39795, 940, 49053, 25718, 58436, 10053, 40512, 23106, +51723, 13110, 34215, 60351, 408, 44178, 28133, 15282, 52327, 37802, 11530, +63088, 25877, 42763, 2522, 52647, 24508, 38244, 10482, 63750, 18229, 34832, +49394, 1788, 28303, 57996, 20044, 43050, 7109, 64786, 29074, 2530, 53300, +37795, 16965, 60821, 27369, 3405, 50085, 36901, 18662, 55538, 9917, 43264, +26340, 65335, 5123, 31179, 53796, 19738, 46611, 10839, 35368, 56697, 20920, +42479, 3038, 62512, 27098, 38869, 11034, 54077, 17203, 37245, 50389, 4682, +28644, 58078, 17876, 42024, 12782, 53900, 30449, 8328, 64136, 36848, 20607, +50961, 186, 42743, 23279, 59331, 11414, 40597, 26756, 54878, 2442, 38301, +21285, 53488, 9401, 43460, 22796, 63658, 13399, 32528, 54091, 5943, 44019, +28080, 15194, 64564, 37960, 503, 31468, 55149, 13965, 43635, 24601, 58504, + 3932, 36751, 50363, 14743, 29727, 62510, 1051, 43665, 23552, 54527, 10672, +30024, 48062, 17502, 58295, 7840, 40633, 25005, 54212, 12433, 49234, 24321, +41751, 5994, 64057, 18474, 33642, 50563, 8566, 43641, 23264, 56959, 13296, +30317, 52239, 7031, 41608, 22350, 62624, 12131, 34669, 52899, 1757, 41159, +23648, 56871, 11985, 40087, 21741, 47822, 5737, 63801, 26604, 39594, 10179, +51390, 31184, 15766, 59625, 35959, 7466, 47456, 24364, 54339, 11814, 41516, +24032, 58375, 6626, 39705, 22109, 50476, 13920, 31597, 63041, 8918, 47075, +28418, 15253, 61254, 36084, 3564, 48249, 23069, 56912, 12926, 33330, 45003, + 2004, 64642, 23203, 40395, 14184, 51813, 29299, 5122, 62524, 36365, 19778, +50281, 8311, 31166, 64464, 18153, 45131, 6063, 35360, 52391, 15688, 31159, +57476, 7881, 45435, 23874, 41345, 14842, 61134, 29461, 6314, 53937, 36485, +18092, 49510, 8421, 31559, 58565, 17110, 41287, 11255, 51069, 21340, 31813, +57439, 3369, 42958, 24707, 50225, 13961, 34414, 60011, 8076, 44250, 28017, +16311, 53705, 36635, 1449, 60733, 23429, 45117, 14525, 33287, 56336, 3001, +48337, 25708, 38582, 11901, 57626, 21606, 49235, 1816, 31920, 46454, 15176, +62980, 29541, 4717, 50750, 36486, 19282, 59713, 122, 33199, 46668, 20537, +61334, 8327, 35190, 48613, 19921, 55597, 10609, 40768, 25637, 59873, 3039, +39393, 22106, 51438, 11996, 33058, 55462, 14996, 44704, 29648, 6977, 65449, +35481, 17256, 48512, 3744, 55331, 21646, 38449, 8106, 63305, 25738, 49124, +12732, 40312, 22008, 62459, 2296, 43055, 25776, 55038, 7526, 40078, 22189, +57347, 11278, 43580, 26718, 61474, 3895, 39942, 21321, 54969, 12595, 38740, +22962, 59871, 4222, 47989, 28580, 15355, 50772, 37879, 7600, 64454, 27477, +13998, 49373, 36542, 4364, 56882, 22771, 45153, 13656, 32471, 63592, 3782, +42235, 23841, 53625, 8961, 30429, 64690, 19113, 43974, 11475, 32828, 56552, + 5746, 42484, 24482, 51844, 13519, 32047, 64034, 164, 48483, 24089, 38776, + 7692, 58948, 25786, 49617, 13061, 39467, 21865, 49036, 1264, 64207, 25977, +39878, 11478, 48466, 23016, 62010, 2783, 38910, 26811, 48522, 10423, 55931, +21914, 41161, 1717, 60691, 28381, 15197, 49366, 37206, 3288, 62179, 27812, +16532, 50111, 37062, 687, 60427, 28491, 15810, 49454, 36421, 4861, 64393, +23765, 43748, 14188, 50467, 31076, 7217, 57865, 35757, 17158, 49425, 5100, +37847, 65305, 15761, 33255, 53056, 2398, 41237, 25322, 51477, 14020, 34476, +62909, 1004, 42394, 22699, 57625, 10914, 33146, 51878, 19208, 42773, 5425, +54536, 26994, 41031, 10085, 59481, 18588, 31969, 51892, 4696, 42561, 23980, +63359, 10220, 40553, 21621, 50827, 13820, 34367, 58342, 5826, 42108, 25436, +55182, 12107, 40908, 22975, 65290, 7667, 48575, 26028, 40946, 11754, 62469, +21364, 47637, 2493, 30722, 55715, 14270, 45469, 28251, 7862, 61808, 35236, +17687, 54439, 3410, 37391, 49445, 16378, 29846, 62550, 9675, 41815, 23448, +58300, 4307, 32223, 47219, 17633, 59386, 9413, 39911, 27268, 54418, 5972, +44076, 21515, 60558, 14062, 37787, 50083, 4995, 29344, 55889, 16978, 45490, +27585, 14693, 63439, 35105, 9056, 54041, 28314, 16039, 49287, 35106, 5661, +61836, 28058, 15690, 49273, 36564, 8434, 57741, 24785, 41491, 791, 52408, +17900, 30910, 61139, 8257, 48078, 24599, 41179, 13057, 56218, 24015, 43693, + 1388, 64698, 20077, 32938, 52694, 10652, 47196, 24906, 39262, 3093, 60010, +17976, 47574, 29218, 10446, 57415, 36449, 18437, 49489, 6057, 33906, 64892, +13651, 47479, 24527, 41055, 8202, 59145, 27013, 38625, 1082, 56427, 19609, +37466, 49844, 7798, 30308, 59014, 18699, 48200, 10173, 40863, 23415, 53327, + 6616, 33158, 65402, 18964, 45789, 10017, 33621, 55527, 20312, 41189, 7192, +60824, 34626, 19808, 51271, 5759, 32162, 63414, 14865, 43957, 28116, 274, +56272, 38032, 16581, 30999, 60135, 3501, 42946, 25233, 55398, 11523, 38699, +21202, 64649, 992, 35213, 49877, 16677, 32118, 57638, 3811, 42879, 24880, +50930, 14864, 33273, 62124, 4711, 45212, 29207, 16222, 58712, 37908, 8322, +30056, 54554, 19910, 43500, 412, 62804, 21079, 33934, 44444, 4656, 61954, +18618, 35428, 51161, 2607, 30470, 60266, 16010, 47356, 28614, 4154, 54473, +35479, 20067, 57281, 264, 42291, 25287, 51377, 11009, 34047, 63441, 19922, +42307, 7100, 51923, 29895, 15819, 55630, 35250, 9150, 45702, 24526, 58907, + 395, 34094, 43923, 17233, 52521, 10799, 34340, 60038, 20875, 42337, 2106, +56128, 24980, 48727, 10893, 39115, 21183, 65171, 179, 34001, 51437, 19810, +45944, 3705, 34002, 62714, 13220, 42581, 24413, 52674, 1980, 34095, 65351, +19682, 42323, 7539, 54010, 34906, 17549, 62031, 11798, 32186, 47585, 4171, +56588, 19368, 31290, 45674, 11049, 58139, 25059, 40117, 7644, 52787, 19906, +31332, 64545, 10386, 42537, 23227, 52258, 6109, 34544, 62290, 17056, 43858, +27338, 8072, 54280, 37644, 16347, 58348, 27583, 9913, 49332, 37824, 17180, +56774, 4326, 29825, 52048, 15822, 43822, 28020, 1779, 62813, 34947, 17508, +47446, 7195, 54943, 37710, 16332, 29031, 63427, 5646, 48143, 34967, 19361, +57814, 2322, 47310, 26506, 41579, 13294, 61495, 25926, 41368, 10732, 47188, +23404, 52649, 4796, 32152, 59408, 17226, 46864, 9101, 36963, 52511, 16513, +29609, 64823, 4709, 44941, 28694, 15891, 53170, 35678, 9907, 56458, 24809, +46209, 1340, 32914, 62521, 14369, 45356, 29989, 9013, 52992, 35440, 20367, +58223, 1746, 32717, 45656, 19551, 55212, 10433, 39069, 27063, 60668, 531, +35901, 50318, 16007, 30909, 58347, 6068, 44748, 27811, 15475, 51642, 37325, + 1885, 60672, 22613, 47904, 14671, 35950, 53435, 6765, 28832, 56863, 19963, +44127, 10436, 33073, 61722, 18785, 47719, 4321, 35989, 53975, 15976, 30704, +56551, 9689, 45279, 19695, 36083, 59650, 5323, 30711, 52640, 20141, 42032, + 8015, 64645, 30697, 13011, 50430, 35952, 19056, 53116, 6262, 33946, 58749, +21102, 42296, 10812, 54788, 22952, 40915, 7447, 58266, 24287, 43504, 12465, +53869, 22080, 41703, 1976, 56438, 27217, 38285, 12145, 62458, 20639, 37220, +51037, 858, 28814, 59653, 20971, 45710, 8759, 29802, 56212, 12547, 42695, +22640, 61106, 4950, 32114, 53601, 16224, 45553, 28751, 7009, 63983, 36775, +14216, 47261, 24208, 61798, 1397, 38386, 22786, 56002, 12341, 35158, 46720, +20463, 60529, 6740, 38511, 23574, 57559, 381, 32090, 52076, 18528, 43179, + 9624, 61604, 21774, 38474, 4191, 51234, 30706, 16191, 59070, 35154, 1602, +45825, 24388, 57288, 9374, 39333, 22334, 52329, 16577, 36636, 59550, 5064, +31301, 50262, 19437, 43068, 10579, 65520, 27035, 38914, 5884, 52759, 19581, +34443, 56672, 8480, 45045, 19382, 35400, 55090, 1140, 30281, 48239, 18919, +65112, 12674, 38669, 26794, 56238, 564, 41148, 23297, 52764, 12410, 32677, +61752, 6650, 43933, 27297, 30039, 16650, 58293, 37956, 313, 47974, 24357, +61076, 11796, 42073, 21462, 53532, 2387, 33249, 64014, 18700, 45258, 10247, +33354, 59817, 15640, 43945, 34936, 6134, 49556, 22394, 63799, 2720, 33012, +45868, 17751, 58825, 10019, 38792, 26471, 55248, 6501, 43748, 22059, 62429, +11915, 34214, 52484, 20930, 44370, 4237, 37724, 62833, 14361, 30962, 53175, + 1647, 42395, 22563, 56084, 14896, 35252, 50800, 4259, 30985, 61409, 17681, +42509, 10694, 52214, 28925, 14711, 62818, 36032, 3349, 46400, 26215, 61011, +14296, 36902, 49978, 1566, 29332, 56985, 12925, 42541, 23081, 51609, 3249, +31684, 59189, 14326, 42176, 25522, 47638, 2031, 56844, 18075, 34702, 46075, + 8880, 61569, 29422, 15466, 52586, 36153, 6880, 46624, 22848, 53538, 14172, +32796, 61013, 5306, 42497, 25080, 51450, 14367, 36937, 59705, 8901, 29331, +48089, 18390, 60688, 7720, 40432, 22680, 55137, 12848, 48705, 25453, 41167, + 2576, 65456, 22889, 48850, 13303, 36867, 56393, 6944, 30050, 52101, 14898, +46529, 27877, 9615, 55937, 37377, 13821, 44867, 23485, 65151, 7736, 40422, +25252, 45987, 10782, 52717, 18203, 36664, 60737, 6524, 29999, 45365, 15998, +53962, 28012, 2515, 59747, 36649, 18455, 47891, 4654, 58245, 25835, 41222, +12241, 48888, 21993, 63814, 7770, 32147, 45579, 20162, 55403, 3522, 38742, +26948, 61867, 13524, 38429, 26685, 53113, 4351, 34104, 59300, 13982, 42658, +24630, 53343, 6787, 31808, 57168, 16307, 44598, 28169, 7843, 61412, 37481, +17053, 49627, 4866, 29816, 59886, 15478, 47401, 28617, 473, 52233, 37789, +20937, 64691, 9468, 42041, 23573, 52930, 2159, 33097, 63120, 15198, 47069, +28799, 4535, 50390, 36884, 18025, 58609, 289, 32988, 46820, 15389, 53627, +29202, 3849, 60616, 35228, 14375, 50095, 28532, 1281, 64025, 35409, 20566, +52210, 7433, 34147, 47277, 21289, 64933, 12952, 34547, 45792, 6114, 58682, +21112, 32366, 44373, 11270, 52405, 20335, 34048, 60241, 421, 42375, 24386, +54414, 11352, 39399, 23113, 62502, 8912, 39206, 19053, 56310, 31188, 5891, +51213, 35110, 20387, 60409, 47, 34049, 44949, 20201, 57166, 10990, 38694, +22909, 50383, 1236, 32778, 60314, 13190, 48081, 24838, 41672, 2840, 51260, +18442, 31218, 64196, 7984, 44204, 28045, 16605, 57397, 36892, 5322, 54503, +24372, 42455, 10554, 62130, 30356, 15081, 51224, 35464, 3379, 65258, 25900, +43107, 13160, 54177, 21380, 40097, 4828, 62974, 25418, 46212, 14251, 35675, +54272, 7053, 31140, 62236, 19465, 45925, 10398, 40609, 25715, 58517, 4112, +46436, 30486, 16071, 65330, 36479, 2374, 52212, 24942, 44024, 13993, 33819, +61127, 7364, 48694, 23235, 41397, 3282, 63354, 29017, 13080, 49752, 35030, +17430, 58871, 472, 45017, 28725, 15850, 56875, 37190, 3725, 46134, 23420, +63779, 8824, 31881, 44790, 17413, 52307, 1565, 33732, 63401, 14142, 47504, +26112, 39513, 3737, 59981, 21244, 38853, 10553, 63758, 26379, 41543, 5724, +52309, 18722, 32792, 55577, 10164, 43810, 17923, 35267, 61938, 3356, 49573, +17404, 31977, 46528, 7296, 58608, 25096, 39694, 11407, 48747, 21972, 55753, + 2199, 39319, 26669, 58916, 8123, 38861, 21137, 52747, 11356, 43711, 26694, +64874, 3229, 31087, 48204, 17739, 54795, 8971, 41558, 25741, 48861, 11919, +64278, 22971, 40279, 2383, 54045, 26938, 43883, 14018, 62720, 28844, 9066, +53505, 36634, 18915, 49730, 6532, 33500, 64110, 13606, 44035, 27910, 4089, +53860, 37839, 13106, 61149, 23915, 46418, 1424, 40072, 21651, 58846, 12586, +48573, 25354, 40265, 2249, 63472, 29399, 15021, 49997, 36808, 10859, 60968, +24431, 41640, 7038, 52057, 23708, 42618, 11537, 62401, 22176, 47391, 8093, +30450, 59803, 16599, 35782, 47047, 3758, 50329, 7205, 51873, 36098, 20254, +56113, 10558, 45876, 26693, 39365, 6504, 58639, 28891, 16371, 52595, 36332, + 7834, 48258, 24141, 56539, 3796, 29650, 46897, 18961, 61918, 8781, 40229, +25207, 49004, 12530, 54147, 22166, 41758, 3865, 60751, 31566, 15297, 51095, +38016, 567, 28507, 57003, 18777, 48049, 8088, 31153, 60774, 16686, 45926, +27769, 6730, 51318, 35162, 19694, 59897, 8621, 43163, 26045, 64054, 12177, +39216, 24209, 54520, 2679, 47834, 20117, 33314, 55320, 7291, 42698, 23616, +58170, 11623, 39733, 21641, 52804, 8694, 34053, 63079, 20354, 47534, 5293, +40496, 26010, 62368, 11447, 40357, 22244, 54694, 7651, 38398, 27166, 64379, +12806, 49189, 24014, 39731, 3088, 55550, 23519, 39684, 12030, 65126, 21465, +38865, 1851, 55733, 26640, 46182, 12066, 39858, 22801, 62300, 2870, 43914, +21789, 55512, 13752, 33626, 46332, 144, 64285, 25857, 38971, 5374, 52450, +18445, 32624, 58166, 9360, 44762, 17800, 31968, 61206, 3963, 45721, 28175, +16848, 58080, 38007, 1935, 31452, 63355, 17974, 49275, 5400, 31283, 47657, +20020, 57700, 1419, 35849, 50048, 14679, 30157, 63930, 4483, 41724, 23427, +50883, 9224, 34837, 62109, 13116, 46943, 24465, 40905, 8023, 65435, 29122, +16391, 50292, 36073, 1411, 53471, 29008, 15600, 59752, 36049, 6699, 50354, +25175, 43147, 10356, 57178, 22573, 41695, 5812, 64018, 21443, 40882, 12617, +50895, 28825, 8742, 63122, 37252, 15424, 49259, 27471, 1186, 59280, 36169, +20733, 49209, 10573, 35046, 56042, 20484, 44287, 6234, 33881, 57796, 12491, +44214, 27443, 16709, 59402, 35240, 5211, 51452, 26590, 43101, 12680, 55954, +24481, 39682, 7277, 61363, 19316, 33808, 53824, 9210, 41787, 25120, 63419, +12212, 39484, 22112, 55470, 7556, 45790, 24963, 41701, 10359, 57170, 18081, +32959, 46063, 5146, 61579, 29933, 18465, 44301, 2672, 59277, 26520, 40616, + 9598, 53450, 19051, 37090, 57423, 4145, 28555, 46622, 18557, 64746, 8364, +31540, 45536, 16602, 51154, 28865, 3474, 59369, 35232, 15314, 49257, 28324, + 1768, 54011, 36654, 17430, 65027, 9476, 47748, 18689, 36762, 53256, 6162, +29424, 63568, 14740, 42019, 23880, 54597, 7411, 38913, 21410, 56903, 10638, +38317, 22592, 61059, 6441, 34526, 53774, 20234, 48506, 11078, 39129, 22489, +63456, 2478, 32459, 51259, 16179, 46347, 28250, 7400, 58666, 37380, 18758, +49685, 5359, 40015, 22449, 57520, 9146, 34397, 48494, 12486, 59851, 22272, +38322, 2583, 48990, 25008, 57692, 9497, 40625, 17543, 51215, 29737, 1124, +63523, 36525, 15299, 53849, 27481, 7047, 50022, 37786, 18191, 60313, 11902, +30235, 54239, 771, 45879, 28413, 16897, 57854, 37184, 11086, 53608, 24269, +43275, 6568, 61753, 19389, 36448, 53375, 8699, 31337, 48074, 13862, 60631, +24421, 39699, 5699, 55641, 18211, 36042, 50322, 11381, 29628, 61228, 18744, +44218, 4587, 32151, 57349, 17282, 49178, 9490, 32759, 54906, 14975, 43549, +25246, 58552, 2735, 35436, 49884, 14932, 30418, 64740, 6539, 47850, 21111, +32318, 57844, 10748, 43836, 19510, 34292, 48792, 288, 63784, 17857, 34100, +44052, 8757, 60377, 24144, 41002, 12862, 47876, 22224, 54913, 4215, 41651, +25457, 59746, 9635, 39906, 21799, 51588, 13473, 33479, 62835, 2674, 44149, +29196, 16402, 55731, 37925, 5199, 31583, 60087, 18032, 49204, 8172, 34613, +46087, 17671, 56698, 3298, 40186, 26606, 59895, 14385, 31341, 51590, 84, +46138, 27300, 16798, 62848, 35281, 8663, 50701, 27717, 16132, 57477, 35435, + 6449, 53634, 26452, 42800, 11145, 60159, 18957, 37135, 51228, 4990, 28255, +57369, 19943, 45748, 2769, 31519, 63955, 17415, 39196, 4210, 54950, 32602, +15019, 50039, 37591, 1607, 56646, 24495, 42362, 13223, 63597, 28279, 54724, + 2146, 42106, 17623, 65155, 29613, 4055, 49812, 36462, 13451, 62229, 22958, +46769, 1300, 41077, 26783, 64429, 11387, 38798, 21859, 52778, 14036, 32344, +58340, 69, 44734, 28103, 16411, 55945, 38049, 5652, 30272, 64968, 19764, +43358, 9740, 53425, 34597, 21191, 63413, 4862, 37854, 49733, 14797, 28487, +54718, 2795, 41550, 24561, 65279, 13398, 36908, 49309, 745, 28767, 55579, +18425, 46511, 6467, 33241, 58188, 14267, 44070, 27349, 5448, 62210, 37039, +16053, 50641, 27862, 102, 64225, 35118, 17533, 49440, 4284, 30692, 57656, +16382, 43832, 27616, 9523, 51497, 35538, 18821, 57578, 672, 32475, 50272, +18788, 42782, 4576, 59894, 20978, 33472, 46544, 10327, 50905, 17432, 32864, +58829, 5020, 47470, 25683, 41564, 9879, 63055, 18933, 33768, 48722, 6319, +54605, 26780, 38748, 11676, 59142, 26440, 43515, 7251, 50628, 19519, 36190, +57290, 10746, 29719, 46988, 20480, 63505, 1316, 39970, 25004, 48558, 11380, +54249, 21983, 40952, 7999, 60576, 25413, 48131, 13003, 38931, 22248, 54005, + 6808, 34225, 61826, 15423, 44203, 28307, 8846, 59677, 37720, 20481, 53635, +11793, 42637, 26259, 55923, 821, 39325, 21897, 58000, 14618, 32139, 52829, + 3220, 43196, 23603, 57073, 9390, 39985, 21745, 63028, 12770, 33528, 46806, + 3011, 54935, 23406, 39644, 15001, 61468, 30255, 782, 49952, 35269, 14870, +55154, 25586, 43689, 2578, 60582, 19195, 35559, 49841, 5264, 30511, 55199, +18852, 42970, 8536, 64204, 32072, 17308, 51300, 2221, 30252, 62878, 21497, +46907, 9926, 37617, 55194, 2740, 30869, 47045, 19842, 63771, 10243, 38620, +22484, 49869, 1114, 33568, 58878, 13385, 42789, 22643, 50867, 2577, 31544, +56905, 17354, 43148, 4732, 50921, 30856, 16351, 65150, 36496, 2019, 47792, +22067, 60287, 13267, 38644, 26311, 52682, 6874, 37010, 55296, 15278, 31064, +48826, 11913, 63626, 22652, 38770, 972, 50718, 30760, 12461, 59115, 35751, +15627, 49593, 27813, 4787, 61943, 37557, 13048, 53447, 24860, 42343, 7775, +63767, 20197, 37808, 50158, 12557, 29950, 57533, 3898, 44339, 23989, 39852, +12019, 61682, 21892, 45619, 1858, 33504, 58774, 13559, 43511, 26623, 52953, + 3459, 33925, 64604, 14961, 46882, 24453, 40696, 399, 58187, 17617, 33599, +51783, 4748, 43028, 25604, 59809, 13268, 39652, 22337, 56169, 849, 43542, +25943, 61324, 9636, 31661, 53419, 14141, 43562, 24776, 63823, 1442, 30682, +47128, 18928, 55521, 6510, 41359, 27157, 65001, 12367, 38659, 23807, 48196, + 4487, 59814, 22218, 40150, 9445, 55730, 33705, 13816, 44647, 24988, 57890, + 2915, 31711, 43859, 20558, 62769, 10033, 40434, 25038, 51408, 5687, 35082, +64488, 15105, 30135, 49437, 1841, 41036, 24085, 56288, 11920, 40140, 22208, +65183, 3000, 43348, 26142, 52807, 12883, 29839, 62957, 984, 47343, 23808, +39402, 6949, 56143, 20791, 34523, 46326, 8371, 65038, 25495, 41522, 169, +47900, 23831, 61827, 7319, 39951, 21404, 54190, 11540, 43127, 26242, 59229, + 1418, 34202, 45529, 14333, 54240, 27648, 4361, 62099, 36419, 20706, 50662, +13165, 30526, 57012, 3894, 47933, 29009, 15503, 65009, 36378, 6489, 50918, +28356, 16583, 61628, 37966, 611, 31664, 56957, 16579, 45744, 28195, 7327, +52979, 37361, 19035, 61014, 8575, 47462, 26667, 41738, 12416, 57088, 22553, +39767, 1022, 64787, 26349, 38772, 12035, 53252, 21807, 43409, 5194, 63309, +23544, 41510, 12574, 54278, 29090, 6930, 56851, 37528, 20393, 49471, 3350, +32651, 62322, 14099, 47139, 22336, 38803, 660, 64572, 24060, 43528, 8996, +55543, 30898, 15699, 49729, 37846, 6663, 59727, 25186, 43420, 10331, 53071, +19425, 30530, 62012, 5776, 45830, 27826, 16817, 59107, 34713, 8535, 49464, +20769, 33535, 29238, 9741, 59984, 36725, 14442, 51521, 23430, 43474, 5811, +56470, 31053, 15326, 50956, 35125, 9060, 60146, 21166, 42283, 3247, 48690, +26489, 63197, 7289, 35142, 43795, 20009, 60193, 9590, 33712, 52175, 14462, +46540, 27362, 1764, 57958, 36361, 17318, 50080, 7042, 30897, 59798, 16187, +46266, 34900, 10744, 62183, 22561, 43334, 5851, 56167, 29562, 16997, 52235, +37851, 9047, 59679, 22415, 44699, 15309, 30626, 63207, 1933, 48796, 27989, +16685, 38232, 53049, 7589, 31262, 59672, 20284, 47301, 9340, 41796, 25619, +54647, 13565, 34605, 64880, 2206, 46677, 29209, 15137, 60908, 37210, 6353, +53714, 24914, 46175, 10917, 35916, 63888, 15598, 29749, 54072, 1341, 42179, +24738, 57128, 9371, 39362, 23141, 60868, 14031, 36463, 51126, 555, 29979, +58108, 17435, 47019, 10485, 41353, 24797, 64846, 2209, 40497, 21461, 53298, +14236, 31075, 62691, 3336, 44624, 27410, 15559, 55678, 37313, 8454, 51530, +28635, 15252, 61638, 38127, 4988, 31220, 55301, 20285, 49179, 589, 40753, +27047, 64825, 12051, 43565, 21511, 50958, 2384, 32398, 56692, 16528, 45307, +27528, 3286, 62660, 34849, 18768, 49462, 7620, 34313, 64376, 18593, 47928, +10266, 40420, 26564, 61356, 5888, 32121, 51494, 14393, 43733, 26612, 55856, + 5266, 39552, 21275, 60960, 14101, 31660, 51541, 7350, 43682, 24228, 64995, +10974, 40143, 21354, 51705, 6970, 33161, 58310, 16073, 45653, 28108, 9985, +61510, 36962, 17469, 52476, 4033, 40794, 25800, 58026, 11214, 34283, 49853, +19233, 41896, 5436, 60515, 29382, 15702, 50847, 36347, 11921, 61668, 24514, +42813, 3977, 54897, 17463, 36785, 50940, 8810, 29907, 64453, 16099, 46429, +28287, 6413, 62070, 36737, 19898, 47426, 11077, 59382, 25974, 41187, 7287, +55131, 24356, 40363, 11480, 48677, 24306, 63211, 598, 40773, 21557, 57628, +10409, 47594, 25563, 40039, 3438, 60309, 18493, 31906, 46785, 8767, 55869, +24393, 40484, 2471, 61029, 21524, 46129, 10121, 32878, 56781, 19904, 44633, + 1193, 35888, 58555, 15630, 31682, 52412, 4975, 45409, 27420, 16392, 61253, +37513, 7209, 48268, 26100, 56156, 10441, 30304, 47256, 19161, 62801, 5709, +39404, 22385, 51007, 12302, 30419, 55158, 6878, 42885, 23387, 62054, 13416, +31122, 45530, 8790, 60670, 23084, 40555, 12160, 55092, 30980, 6284, 49738, +36056, 19916, 63982, 11425, 41304, 23018, 50327, 3056, 35294, 59503, 16832, +32838, 49953, 7867, 42188, 25046, 61290, 11693, 38928, 21349, 52383, 333, +32981, 56935, 15975, 45624, 28150, 8638, 62488, 37560, 18355, 49852, 4943, +35183, 64745, 17568, 48224, 8135, 34113, 55232, 15343, 46771, 29539, 3673, +60538, 36975, 19203, 52917, 9054, 42557, 25998, 59522, 13888, 32273, 52227, + 4738, 47055, 29069, 16433, 57690, 35363, 7136, 49553, 20553, 33329, 59692, +10032, 42210, 25060, 53548, 13578, 36931, 58873, 2854, 30503, 50702, 18123, +39303, 11360, 60560, 23020, 38243, 9081, 56680, 27291, 49195, 4643, 33343, +46420, 19364, 63189, 12372, 39250, 23584, 51379, 7944, 37695, 56118, 15048, +30761, 46919, 6446, 60513, 25431, 38738, 10540, 55130, 20150, 31985, 45335, + 1645, 58339, 18406, 30916, 44572, 8546, 53356, 28119, 14665, 64239, 36596, + 4860, 49775, 20594, 31626, 57675, 1258, 42865, 24196, 63720, 13746, 35702, +50535, 4018, 30425, 55407, 20057, 45413, 7033, 32418, 61520, 15935, 47720, +29046, 9565, 58043, 34806, 18563, 50402, 2632, 32348, 65015, 15235, 45118, +28462, 10256, 53219, 37412, 17956, 56396, 5630, 41856, 27004, 51886, 10392, +30899, 59140, 14498, 44773, 27414, 1968, 62990, 35308, 20675, 51726, 11817, +41898, 23259, 58351, 150, 34820, 50413, 20530, 42755, 9829, 64711, 25916, +40302, 3105, 56980, 18757, 46573, 5381, 63253, 25428, 45379, 628, 31548, +57881, 18542, 41104, 10856, 61602, 22665, 38877, 4592, 54275, 27276, 38281, +10696, 57453, 25341, 45092, 13691, 31879, 55476, 2333, 47166, 27359, 16830, +61636, 37474, 5267, 50428, 28028, 16167, 64235, 38183, 10155, 28668, 45383, +19859, 56386, 1233, 41047, 25292, 51928, 8891, 35717, 58826, 15306, 31411, +49798, 2282, 41316, 24642, 64395, 12728, 33631, 51175, 4336, 39638, 23487, +54157, 9240, 34205, 61230, 12961, 46104, 24138, 40522, 3120, 56204, 18409, +32585, 61772, 5032, 45300, 28142, 15588, 51850, 37485, 8034, 57059, 24274, +48086, 13416, 40030, 21498, 62100, 2540, 39872, 26222, 58116, 8625, 48598, +18142, 36294, 52171, 6480, 30443, 64483, 18374, 43231, 3292, 50141, 20763, +32583, 56320, 9127, 43117, 20182, 61545, 29551, 5629, 52108, 38048, 15866, +31572, 56131, 8269, 48252, 24654, 40131, 12073, 60419, 28939, 6461, 50018, +34928, 16558, 59347, 27485, 2027, 49377, 36841, 18626, 63933, 7582, 44610, +17082, 31213, 56504, 10608, 42425, 24448, 59338, 5137, 39730, 22821, 52467, + 8258, 34387, 60489, 12833, 42995, 23242, 52071, 4876, 29803, 58693, 14985, +45519, 28417, 2257, 56652, 36287, 17661, 54262, 11761, 41905, 25432, 64841, + 524, 38447, 22215, 48803, 11311, 58649, 26030, 41845, 1886, 54014, 22024, +38592, 12238, 59228, 26321, 47761, 3359, 30990, 55687, 13595, 43023, 24122, +64506, 1497, 40500, 23314, 50758, 12184, 32844, 56711, 19998, 43629, 362, +65122, 28693, 14668, 51799, 37416, 8800, 58369, 23565, 45144, 1436, 34194, +48790, 19210, 57150, 7593, 39052, 27154, 60827, 11196, 34253, 45571, 18776, +57408, 3399, 41131, 24953, 55446, 13708, 32872, 45499, 924, 52512, 29175, +15213, 61708, 35659, 3159, 49732, 18232, 34983, 58807, 8541, 30239, 53311, +16158, 44129, 28124, 5986, 65532, 35715, 14134, 54040, 23921, 44855, 5414, +36397, 51979, 15169, 29240, 64282, 11863, 42603, 23002, 54706, 6859, 35896, +50276, 14850, 29788, 62747, 5961, 47117, 23959, 40443, 11631, 64347, 18733, +30557, 54982, 657, 42506, 23310, 52440, 13392, 34401, 60534, 2964, 42195, +24684, 55595, 14174, 31611, 45317, 964, 63911, 24675, 41476, 14260, 52388, +29826, 3989, 56043, 36024, 18840, 50179, 1912, 29672, 65425, 14632, 41712, +25201, 52845, 3550, 32690, 58524, 17349, 45049, 8233, 36898, 53064, 15684, +29467, 56326, 5650, 41833, 22901, 63163, 13885, 31706, 51265, 3806, 43728, +24608, 55001, 14179, 36546, 61781, 7392, 30500, 51004, 19835, 42230, 2062, +53547, 21023, 29841, 59495, 11524, 46586, 23709, 39708, 1421, 61446, 22265, +39180, 12266, 48629, 25888, 57674, 6969, 33885, 45699, 18375, 63574, 41, +34184, 45504, 20834, 61784, 11228, 41447, 23513, 53693, 2184, 37861, 64046, +14467, 28135, 51794, 5084, 46523, 19995, 34833, 62088, 9111, 28899, 46873, +20433, 63688, 5922, 42000, 26710, 54531, 12638, 48475, 20944, 38555, 2305, +62048, 25502, 41676, 9507, 53380, 17069, 31695, 57640, 3112, 45053, 29239, +16862, 65450, 35467, 1049, 52497, 22175, 45405, 13949, 33098, 63345, 2978, +48618, 25554, 38937, 11942, 62190, 22802, 49654, 3733, 35042, 46648, 20119, +56371, 11292, 41660, 26711, 60661, 6864, 34742, 48009, 18126, 54314, 10589, +38587, 22085, 59294, 6226, 33118, 46896, 17247, 60778, 10890, 39390, 26704, +51323, 2069, 34991, 56089, 15070, 43849, 27659, 6576, 60247, 37784, 20660, +49614, 8217, 34853, 60887, 21237, 43963, 1699, 34124, 58588, 20815, 48267, +12937, 36745, 61931, 3053, 33177, 47299, 16751, 53816, 28648, 7979, 56936, +37642, 17258, 47556, 4845, 64292, 26752, 40603, 13784, 52321, 29043, 6456, +60503, 36724, 12067, 49759, 29446, 15351, 53581, 37232, 10153, 32022, 59414, +17324, 43171, 7682, 50367, 20455, 34336, 55285, 2625, 42474, 24947, 64570, +14076, 48965, 21263, 39846, 854, 59026, 22105, 49035, 8831, 37484, 65389, +15273, 29077, 51151, 3395, 35052, 57161, 20088, 44788, 7875, 34836, 49167, +18093, 59536, 4384, 32061, 47954, 20985, 61856, 11767, 39181, 26441, 54236, + 3756, 42196, 21974, 61482, 13580, 46795, 30323, 7426, 56739, 36242, 19944, +53371, 11729, 42036, 26280, 57359, 1171, 48361, 29761, 16199, 65385, 35808, + 7057, 50374, 26537, 39307, 11926, 53918, 20218, 31260, 63608, 969, 44235, +19912, 32452, 60498, 4169, 43298, 25904, 55183, 9376, 32102, 51795, 14129, +42306, 23506, 62967, 3942, 32142, 45094, 20341, 55909, 11308, 38720, 27034, +61802, 7765, 46440, 28493, 15117, 52884, 36842, 1630, 57342, 27669, 16742, +49644, 36231, 3721, 63300, 22188, 43336, 15047, 56996, 32088, 776, 51573, +36320, 13867, 65347, 23624, 45605, 5533, 40626, 20221, 57469, 29646, 10926, +50439, 35809, 20893, 61285, 3707, 33992, 48802, 19405, 54644, 9336, 38510, +27212, 61665, 14383, 46569, 28871, 78, 55764, 38124, 16783, 31680, 63135, + 7263, 42936, 24620, 51098, 10900, 31263, 62180, 20532, 44621, 3948, 31776, +49082, 18547, 58126, 9763, 31681, 45218, 15557, 63529, 29762, 6248, 50631, +35241, 18949, 55951, 4586, 42931, 27250, 62898, 15155, 34623, 51353, 6325, +39504, 22285, 57619, 9510, 32679, 51989, 20033, 42756, 5883, 62053, 26354, +39561, 9488, 50277, 30834, 16328, 55340, 35423, 3274, 47943, 25379, 63299, +10388, 39477, 22087, 52127, 13815, 31289, 64932, 5876, 41998, 23971, 53054, + 25, 48525, 29304, 15566, 62788, 37943, 6747, 30590, 48746, 20559, 64093, +11636, 40133, 24659, 56455, 6739, 33041, 51407, 19920, 42453, 10592, 62215, +27145, 46960, 3761, 34167, 56924, 12499, 42644, 24286, 51343, 1665, 33869, +61888, 17931, 42354, 10144, 56305, 23486, 47897, 184, 36648, 59800, 16518, +29334, 47386, 3827, 55702, 25010, 40149, 10580, 59044, 18749, 30896, 52029, + 3173, 41554, 22568, 58306, 9701, 36606, 49702, 16998, 30481, 65231, 6579, +44564, 28246, 16079, 51830, 36111, 9398, 58111, 20764, 33364, 48029, 5336, +60124, 22232, 39801, 11458, 48948, 26378, 62679, 7921, 32780, 44394, 16676, +57569, 35045, 5868, 50819, 21944, 41970, 11955, 62191, 26631, 47887, 97, +40636, 23622, 64946, 11776, 43614, 21195, 52209, 2068, 38369, 27230, 57069, + 9359, 40933, 21507, 60864, 12779, 32082, 50038, 5138, 44953, 27475, 16818, +64310, 37154, 10298, 54973, 25691, 44791, 6418, 34231, 57377, 13109, 42836, +25745, 53151, 8674, 33619, 65493, 17512, 41992, 2567, 54522, 31546, 14589, +50375, 27464, 9972, 56716, 37240, 17423, 49546, 5474, 36705, 58922, 15595, +31101, 50992, 8451, 44690, 29294, 16451, 61012, 38117, 595, 30675, 54869, +18249, 42739, 4350, 57760, 31854, 16313, 51042, 35124, 1200, 60067, 24459, +42783, 11855, 56031, 22240, 47811, 6794, 34587, 64374, 20718, 41380, 11213, +47589, 25682, 60832, 5634, 40612, 23073, 54639, 12264, 39488, 27076, 59052, + 5389, 43323, 21308, 53360, 14934, 33886, 56751, 7101, 43860, 30324, 19033, +48852, 9990, 63068, 25773, 39321, 1994, 55467, 22923, 45461, 13838, 30647, +65153, 2957, 40766, 25872, 56287, 12227, 48366, 24529, 40614, 334, 53851, +21233, 33574, 64362, 9246, 44895, 20001, 31096, 62172, 4289, 48274, 17490, +35988, 53474, 825, 29457, 56580, 17657, 46689, 9392, 31191, 64148, 17095, +45464, 4827, 30143, 55293, 15554, 44174, 28257, 8629, 65339, 37141, 18924, +51183, 3469, 33616, 45432, 20947, 60925, 9762, 34130, 54092, 18707, 46485, + 3847, 34468, 57969, 16688, 45073, 28236, 1183, 56114, 35448, 19475, 50301, +65468, 3330, 39771, 23173, 54519, 11897, 38580, 27197, 62916, 6759, 30404, +51459, 17858, 41354, 9768, 56248, 27025, 47447, 5495, 33787, 60036, 13177, +41581, 24164, 54336, 6646, 33125, 46403, 18560, 60410, 11827, 39061, 26617, +62809, 431, 32452, 52602, 13182, 42621, 24494, 57257, 5676, 33446, 45199, +14566, 65043, 29096, 8662, 51017, 35136, 16786, 60025, 27957, 253, 50569, +37684, 17727, 63667, 5153, 31767, 46084, 17497, 60648, 9833, 40926, 25237, +52616, 14017, 32158, 59510, 2116, 42492, 24403, 57350, 10352, 46286, 34902, +17357, 49059, 6762, 58842, 27103, 41172, 12312, 50742, 19154, 36556, 65234, + 317, 29299, 47830, 19140, 58641, 7880, 34635, 47709, 13295, 53367, 24395, +40598, 1144, 59375, 29961, 16091, 51465, 37750, 6066, 65202, 24595, 44908, +13572, 31732, 60354, 8045, 46354, 28155, 13302, 54203, 38008, 6119, 28962, +61886, 12245, 47779, 24193, 40833, 3059, 58937, 17584, 31562, 53576, 9085, +42933, 24161, 59953, 1179, 30549, 46279, 17990, 55654, 11658, 39781, 26327, +64280, 2560, 47508, 17597, 35847, 51628, 6275, 31456, 65322, 19275, 47671, +11192, 40620, 22462, 53364, 1673, 35210, 59307, 17269, 46688, 6094, 37576, +52617, 15486, 28474, 61236, 7453, 42379, 24673, 52152, 2883, 36277, 57200, +16861, 28367, 44929, 8635, 61757, 24931, 39520, 12016, 48707, 21828, 54800, + 116, 41493, 27061, 60318, 11732, 47617, 17812, 30631, 63501, 2264, 47067, +27678, 16496, 58477, 36228, 3833, 53251, 22996, 43061, 11399, 61839, 26530, +39518, 6825, 56591, 18861, 32056, 46091, 4110, 55707, 24672, 40429, 12702, +60148, 21487, 38538, 8185, 55776, 22959, 43710, 10079, 59051, 26117, 40275, + 2187, 51792, 17164, 35905, 57562, 4315, 28589, 45021, 13764, 60004, 23085, +39715, 1475, 54406, 25747, 38520, 13599, 64509, 21583, 48395, 7174, 31823, +60808, 19507, 41500, 11595, 56864, 26941, 38524, 4594, 51255, 18741, 31230, +62503, 7550, 44238, 28043, 13436, 52915, 36653, 20152, 64824, 1592, 34471, +49937, 13207, 43608, 24985, 61135, 7626, 31521, 54491, 14659, 45000, 27319, + 1961, 53048, 36267, 14610, 59555, 27400, 4223, 49600, 37424, 18621, 61922, + 7848, 44501, 28631, 16908, 57379, 36735, 2701, 45988, 24359, 54856, 12739, +39094, 21701, 60286, 1135, 30245, 48015, 13655, 56003, 25701, 38420, 7167, +59744, 17679, 31347, 48985, 4550, 55808, 26306, 38713, 13304, 59086, 23317, +48289, 6307, 33122, 64145, 15928, 45867, 28095, 1294, 54549, 37539, 15065, +59583, 33437, 3344, 51832, 22327, 43939, 13532, 31348, 63256, 602, 48994, +29089, 15867, 59983, 36433, 4751, 49945, 21189, 31266, 56820, 10373, 44434, +20099, 33394, 63168, 6312, 43120, 20004, 60070, 29252, 3875, 52979, 34901, +19103, 46331, 10216, 64881, 25366, 41670, 3243, 54407, 22108, 43564, 13677, +58678, 28252, 9276, 52348, 37564, 12944, 48177, 24211, 65226, 7832, 40836, +22271, 53737, 12871, 40560, 26932, 62567, 5432, 39258, 17447, 52881, 30208, + 401, 58996, 36255, 18129, 49351, 9323, 32276, 56773, 19977, 42199, 1993, +48276, 25952, 62630, 9453, 39254, 22892, 51766, 12522, 31584, 64535, 12, +45733, 27391, 16262, 61082, 37146, 4962, 53885, 29515, 15774, 49603, 37197, + 7797, 59970, 20332, 34156, 51199, 5801, 43291, 17844, 62589, 31512, 9172, +50678, 36214, 18891, 58757, 4913, 31358, 47896, 17908, 55201, 11582, 40219, +26119, 59100, 7352, 33374, 51313, 19812, 43114, 11372, 62920, 26295, 40446, + 6215, 54289, 19547, 35088, 48849, 11116, 60514, 22968, 40347, 456, 48631, +26549, 58551, 10026, 41849, 24362, 53280, 13099, 29990, 59374, 1363, 44521, +25171, 39789, 10703, 63479, 19947, 32702, 48794, 7415, 61491, 22557, 40913, +11880, 48154, 25873, 8239, 33640, 58832, 13334, 43590, 23789, 53033, 1505, +40218, 21540, 60301, 13672, 33062, 46000, 3321, 62318, 24210, 39215, 11045, +51326, 17646, 31018, 63856, 1640, 44256, 28712, 15745, 56791, 36662, 4086, +51596, 23852, 42584, 10756, 55093, 21893, 39587, 8367, 63543, 29964, 16052, +50450, 37105, 1936, 55823, 27791, 15833, 49426, 37597, 3387, 57144, 23508, +45002, 11176, 32252, 48440, 20882, 58449, 8094, 40118, 26833, 54525, 2750, +38458, 21359, 62505, 5824, 34018, 50732, 17958, 40164, 8551, 64463, 21040, +33065, 52347, 3611, 40860, 24449, 63015, 11489, 38881, 22583, 53008, 5351, +33431, 55700, 17636, 45059, 10151, 34889, 62363, 20822, 43929, 2659, 30779, +55362, 17503, 42556, 9921, 63707, 34792, 21088, 49564, 4161, 34081, 55738, +12678, 41828, 22250, 58965, 4800, 36517, 50208, 16980, 30405, 63996, 2151, +43863, 23569, 51249, 15432, 34661, 57641, 7181, 43363, 22249, 52185, 11653, +33536, 64457, 19351, 47291, 5031, 33006, 62217, 13336, 42142, 23037, 53486, + 4196, 38395, 27158, 58753, 13696, 38324, 21863, 55966, 8555, 43613, 25421, +57616, 3868, 36716, 50087, 15652, 29657, 60846, 8453, 42532, 25414, 56152, +12539, 39121, 22541, 64598, 872, 34228, 46971, 19025, 55244, 9275, 38253, +22590, 62614, 13460, 47911, 31606, 1346, 53126, 37409, 17737, 59427, 5006, +32527, 46043, 14627, 63829, 23907, 38276, 8198, 53811, 22781, 44669, 5445, +37699, 55650, 14748, 28936, 45066, 8014, 61212, 24749, 39859, 12929, 54310, +21836, 45856, 733, 33643, 59794, 15783, 44282, 28394, 8981, 53398, 37453, +17427, 63583, 1611, 46899, 26684, 41690, 14544, 51536, 31449, 3625, 61394, +36015, 18328, 50213, 10757, 43744, 27120, 65244, 7879, 33746, 53394, 16280, +47408, 30397, 6097, 63097, 36511, 20308, 52041, 9823, 42250, 26680, 58220, + 4917, 37216, 50114, 15218, 28917, 55109, 2754, 43133, 24525, 64089, 9422, +33714, 47376, 14354, 58491, 24363, 40416, 4226, 48954, 22641, 56430, 9261, +29675, 45253, 16643, 61894, 27851, 6148, 53002, 37949, 16334, 28783, 64022, + 4649, 47605, 28000, 16853, 57588, 38005, 8365, 31102, 63298, 16761, 46166, +28174, 228, 55294, 38059, 15513, 31291, 64708, 9065, 47417, 27942, 15094, +51912, 36373, 6575, 64107, 23155, 47044, 11102, 32681, 53613, 18467, 42860, + 3215, 61601, 20985, 32853, 45204, 7982, 54311, 24370, 41951, 10911, 46982, +21396, 62610, 2950, 40281, 26375, 54023, 10148, 43060, 22406, 58117, 13541, +30874, 50593, 5585, 44311, 27352, 16972, 61141, 37776, 9705, 54537, 24496, +47022, 6029, 40243, 22637, 62079, 9950, 31487, 45901, 17969, 52395, 3475, +34662, 59401, 16295, 46910, 27780, 915, 54963, 38186, 16097, 33302, 48927, + 9315, 62522, 24438, 40747, 1317, 55365, 21502, 39311, 11807, 60620, 26785, +38868, 5819, 50693, 19539, 33200, 62790, 1758, 45170, 27651, 15965, 57152, +37967, 4010, 30215, 48914, 17696, 61058, 2546, 33345, 46291, 21050, 56948, + 8517, 33144, 50822, 20105, 42804, 13248, 64040, 28818, 4199, 51650, 37363, +15232, 61340, 28066, 8131, 50744, 35778, 18083, 58143, 2681, 46358, 26205, +40879, 14630, 56052, 30027, 6611, 50412, 35690, 20678, 58883, 12514, 43281, +26236, 52768, 856, 32364, 56676, 10888, 42257, 25069, 61065, 14058, 37213, +49799, 2275, 28910, 55450, 17044, 42809, 7943, 63085, 20810, 37113, 52938, + 1338, 29328, 46651, 14185, 65427, 22585, 39400, 3467, 55473, 30555, 15012, +50177, 36678, 1923, 61486, 23812, 44158, 14078, 32547, 56355, 3925, 43111, +24498, 62898, 13904, 39036, 21754, 54560, 5485, 32597, 46477, 19400, 63961, + 8263, 36366, 50576, 16150, 30914, 56222, 2687, 44296, 27626, 16493, 54772, +38130, 5680, 31175, 57107, 18380, 46216, 30197, 52261, 5149, 41399, 25739, +62000, 14597, 34435, 48731, 6151, 57351, 26364, 38368, 11865, 53276, 18896, +36800, 58545, 6026, 28995, 46380, 19348, 52645, 7680, 34498, 59218, 18989, +45552, 9352, 32598, 61939, 13868, 41450, 25269, 58442, 2977, 47314, 19379, +35768, 53165, 6778, 28416, 60739, 19448, 44718, 9871, 32340, 62986, 18664, +48097, 8177, 34057, 61969, 17108, 41700, 4571, 52285, 19386, 36113, 64665, +13082, 29848, 47681, 8803, 55663, 23952, 41798, 12415, 58990, 22698, 46847, + 454, 37670, 54166, 12802, 30250, 56658, 18531, 46901, 9625, 33505, 61104, + 1796, 42030, 25454, 57778, 13065, 39547, 26789, 52208, 3726, 32855, 59523, +12692, 46217, 21319, 34146, 58014, 6249, 49022, 19404, 31730, 44866, 8913, +53729, 18910, 30683, 62536, 55, 46777, 28439, 15978, 52272, 37867, 8656, +58336, 24995, 41195, 11580, 55941, 21456, 38866, 4570, 63035, 29811, 16983, +49802, 35450, 337, 56195, 26432, 43794, 9739, 37756, 52773, 16526, 28597, +58254, 7315, 48208, 24903, 40858, 10059, 63269, 23541, 49265, 912, 40202, +26784, 53384, 10240, 32000, 62832, 14070, 42186, 24643, 51370, 2036, 33554, +63664, 18067, 45727, 5160, 33159, 54098, 14558, 44172, 30099, 8400, 60336, +25409, 48646, 3577, 41885, 25117, 56269, 10103, 40233, 20013, 65418, 29742, + 7365, 50156, 35669, 19971, 57998, 10707, 34196, 48098, 2908, 56445, 25864, +41128, 10686, 65072, 18808, 35619, 50556, 1052, 31702, 56856, 15726, 46979, +28538, 6250, 63059, 37953, 14908, 30019, 49089, 10844, 65383, 24890, 40056, + 2766, 50611, 20969, 32953, 59253, 9866, 43870, 19524, 36472, 54404, 5800, +29474, 57081, 13537, 42707, 24798, 62356, 565, 38436, 21423, 54831, 12863, +41768, 25045, 60679, 2545, 40810, 22356, 48637, 11083, 56197, 17690, 31112, +46735, 324, 62702, 20563, 34417, 45948, 9528, 51854, 19167, 35492, 59974, + 6391, 30357, 45946, 19084, 54076, 1010, 41830, 26503, 63520, 12040, 38784, +21336, 60339, 2752, 32851, 51601, 12836, 42445, 23725, 58870, 507, 39316, +21809, 50903, 9324, 34727, 59956, 13555, 43217, 25307, 55254, 2504, 41064, +22961, 50575, 10015, 31009, 60347, 13663, 47819, 24425, 41409, 4978, 53763, +18451, 33116, 60875, 2072, 44758, 29115, 16067, 57031, 36002, 5310, 45709, +24679, 63247, 10023, 39980, 23188, 55381, 13119, 34783, 48220, 1509, 64561, +22381, 38288, 14414, 56280, 31104, 8374, 50388, 36759, 17541, 61270, 750, +34096, 47249, 20907, 59838, 8100, 33707, 46082, 16290, 53773, 29178, 2320, +64430, 35383, 19513, 49547, 11203, 33325, 58010, 20534, 42452, 1693, 55618, +23518, 40370, 12954, 64006, 28970, 7952, 50487, 36035, 12867, 61688, 24586, +44703, 6609, 29993, 57869, 12148, 47052, 28590, 16919, 51605, 35578, 4669, +57417, 23288, 45387, 14276, 36206, 61714, 7357, 29773, 53790, 17936, 44151, +12337, 31744, 64441, 6679, 49550, 25445, 38945, 10922, 52860, 18948, 30260, +59167, 4900, 44047, 28711, 15959, 60478, 36941, 1588, 53490, 22806, 45623, +10468, 34023, 57661, 19406, 44388, 5941, 34201, 49220, 20849, 63412, 8946, +38377, 27273, 53019, 4722, 35016, 60259, 18792, 46126, 11535, 31994, 65324, + 3431, 41626, 22574, 51020, 9591, 34429, 62780, 16625, 44871, 29235, 3809, +52936, 35498, 18574, 64697, 9840, 45516, 21122, 32944, 59878, 4455, 42038, +25576, 50653, 10738, 34400, 57490, 19109, 44352, 5703, 32235, 60294, 12077, +47336, 28296, 16914, 58107, 35239, 9640, 47573, 25724, 59695, 5187, 38712, +21387, 54992, 12714, 30421, 50511, 6748, 35116, 61280, 17468, 48362, 2450, +40544, 27043, 57328, 14579, 32370, 45929, 6583, 62328, 28310, 15397, 51145, +35708, 9306, 61089, 24113, 47563, 389, 35486, 64134, 15988, 49233, 21748, +59703, 2415, 32689, 45996, 18020, 54815, 10363, 41947, 22413, 64906, 187, +43715, 23950, 50466, 14014, 32124, 63137, 2580, 42364, 22955, 54415, 11726, +39045, 26677, 64363, 1029, 49254, 22074, 43079, 5729, 53596, 34293, 15319, +65197, 27998, 8993, 49459, 37636, 17065, 56235, 719, 36191, 46690, 21495, +58229, 5238, 30515, 43793, 20785, 54809, 1752, 38711, 27140, 59346, 12010, +43654, 22868, 51519, 888, 34470, 60270, 17005, 45078, 28460, 3824, 52435, +36140, 15710, 61897, 28234, 7697, 49290, 35484, 20788, 64041, 3361, 42116, +26116, 51134, 11928, 31254, 60111, 17952, 43575, 7456, 50508, 21177, 30091, +56522, 9532, 42757, 18048, 64532, 29389, 1490, 50889, 36870, 15586, 62917, +28375, 3160, 54959, 36610, 17181, 49870, 10125, 34707, 60483, 14277, 43946, +27482, 6590, 64283, 35103, 20145, 50776, 1349, 42874, 26998, 53520, 13540, +34260, 60201, 7590, 46901, 23837, 40675, 13126, 59531, 22505, 47877, 3221, +34297, 63687, 13984, 45183, 31918, 2080, 55434, 21362, 44513, 12386, 32554, +59773, 17729, 43226, 6143, 50613, 21005, 29545, 58621, 3167, 45286, 20434, +31228, 54792, 7701, 43451, 24412, 59807, 11482, 30904, 48753, 20977, 57552, + 2475, 39898, 26444, 63977, 11175, 38508, 22130, 50852, 13722, 32178, 58812, + 4281, 44842, 27386, 16113, 53738, 37912, 1610, 62337, 25078, 42297, 13745, +51672, 19060, 35800, 57407, 4290, 29866, 46851, 13156, 60502, 24398, 40011, + 7431, 52259, 19467, 32856, 59131, 3156, 43304, 24503, 52750, 5592, 33126, +56764, 18341, 47603, 8028, 36752, 62414, 14770, 29674, 53151, 4357, 47910, +27629, 16683, 64767, 35457, 7388, 48063, 22174, 52955, 11896, 39844, 27028, +59339, 5174, 48111, 32310, 15334, 52199, 36074, 8383, 63857, 26435, 44678, + 3551, 34412, 59842, 15721, 44064, 27515, 7623, 54508, 38203, 16316, 29812, +65090, 2147, 43648, 24091, 55395, 10556, 38759, 21481, 58035, 14850, 35839, +50227, 4693, 30291, 54817, 13825, 46628, 25427, 40665, 7226, 65442, 35201, +17454, 53606, 11781, 42003, 26184, 56049, 3715, 40085, 23629, 62737, 12262, +38593, 21372, 52040, 6604, 33916, 65073, 18751, 43182, 3750, 54889, 26933, +38521, 11854, 57225, 24075, 48763, 7434, 41437, 21121, 62863, 12385, 40823, +26426, 55019, 562, 48244, 17614, 36524, 58121, 5927, 29637, 46325, 18070, +60545, 9428, 40487, 27049, 51566, 4728, 32928, 62286, 16377, 45598, 27559, + 6687, 52928, 35509, 19424, 65291, 11154, 40771, 26434, 56094, 4232, 35026, +52365, 13818, 43931, 27566, 7467, 59170, 37675, 15194, 51320, 28607, 4485, +62966, 35102, 14285, 47321, 26129, 54413, 5516, 32540, 44213, 15211, 58717, +23747, 40550, 4250, 52194, 18972, 32174, 64533, 2070, 43995, 27315, 14653, +53780, 37693, 9865, 63936, 24755, 48128, 275, 40761, 21798, 56487, 11125, +33841, 47335, 3419, 59847, 24870, 40206, 14150, 55643, 22022, 47070, 772, +35882, 63500, 14803, 32512, 47083, 7103, 52257, 27593, 12152, 63024, 38237, +15261, 29333, 55424, 3464, 41196, 25334, 65079, 14113, 31205, 47338, 934, +55387, 24941, 42156, 10501, 47596, 22633, 62138, 13423, 32742, 44071, 1573, +52280, 28014, 16490, 56475, 38028, 8026, 29112, 48373, 20030, 59175, 5499, +39109, 26390, 48850, 11916, 56120, 22507, 40330, 646, 57981, 26905, 39087, +12500, 51969, 18530, 31641, 61689, 2878, 47195, 27963, 16501, 63494, 37735, + 8587, 51428, 25695, 43371, 225, 54793, 21819, 39346, 7683, 64609, 23199, +49263, 11626, 40862, 26799, 48762, 1093, 63804, 18803, 33755, 44741, 7962, +56708, 24854, 39016, 12009, 48908, 23013, 65059, 806, 34919, 43835, 13605, +55238, 24967, 40778, 4042, 59216, 21486, 43570, 10377, 54467, 26528, 41308, +12715, 7245, 47157, 26369, 40238, 11635, 63678, 25179, 39350, 4671, 56247, +27192, 38729, 13093, 51785, 30401, 7855, 55888, 35413, 19968, 49523, 5268, +30754, 61471, 14195, 48013, 24346, 40489, 8577, 57884, 21234, 38289, 12214, +47738, 24245, 55578, 2510, 40220, 19858, 61190, 29690, 11110, 50932, 34726, +17797, 63941, 6515, 32975, 52752, 17289, 45252, 10633, 34774, 64914, 21219, +48976, 5732, 39671, 26541, 54116, 13910, 31552, 63478, 7177, 48307, 22871, +39867, 12629, 56838, 26127, 43550, 5088, 59458, 17493, 36733, 51332, 9068, +29327, 58270, 16248, 45591, 27590, 5920, 53407, 36827, 20104, 65076, 781, +32219, 46318, 17101, 61480, 4684, 38808, 26887, 47487, 11004, 54971, 22004, +39933, 7332, 59676, 24041, 48166, 12209, 41218, 22647, 53456, 5085, 31876, +57643, 20449, 45066, 2482, 37081, 54086, 15323, 30785, 61676, 10259, 45866, +19151, 31931, 56876, 3653, 44270, 27751, 15590, 64990, 36869, 6738, 50942, +30613, 20385, 57465, 5656, 43909, 28249, 15945, 60708, 36798, 9025, 48992, +26099, 65103, 4069, 39068, 19631, 52841, 30759, 8137, 62492, 35931, 18237, +49511, 10723, 34235, 57809, 17537, 41656, 256, 52226, 20375, 34715, 62289, + 9793, 44972, 17486, 36594, 53130, 6959, 31170, 56789, 17846, 42890, 467, +52561, 34804, 15251, 62067, 28180, 8031, 49490, 36711, 18893, 59861, 12387, +31357, 46890, 5571, 55161, 24735, 41687, 8966, 64175, 28359, 16258, 49913, +36766, 2453, 62506, 22298, 41838, 11933, 55439, 26792, 39242, 9255, 61643, +22253, 46142, 13995, 35092, 58427, 1793, 43100, 23010, 51200, 11326, 33710, +59607, 18349, 45486, 879, 33548, 56066, 14355, 42213, 25991, 60401, 2801, +32372, 46119, 17721, 56147, 9992, 38811, 22399, 60881, 1374, 30975, 46652, +19014, 55129, 9231, 39126, 22787, 57856, 12899, 48452, 29032, 5259, 61140, +36441, 20222, 48085, 11899, 57488, 26670, 40823, 7795, 47802, 22461, 63111, + 5427, 32223, 45634, 19751, 61512, 10228, 40940, 20909, 57597, 34619, 1358, +49660, 19308, 31843, 59723, 5344, 46304, 19108, 32586, 49019, 9160, 60801, +32490, 18665, 46231, 1091, 55711, 27082, 39991, 8212, 58305, 25611, 38602, +12434, 48294, 22377, 61883, 818, 40094, 26367, 59942, 10297, 38641, 21616, +52112, 3697, 33438, 58708, 19202, 44747, 9389, 34061, 64346, 13457, 48968, +24769, 40813, 2719, 56900, 20709, 33709, 53265, 11000, 42485, 18553, 58604, +29401, 3483, 50204, 37836, 12904, 56933, 24872, 43636, 1983, 51474, 18650, +31699, 62684, 9141, 46466, 28587, 16923, 60767, 36009, 154, 49340, 27435, +16780, 56718, 37872, 8607, 45670, 24366, 58297, 11028, 38833, 21360, 65134, + 497, 47785, 29869, 12224, 53655, 37318, 21083, 61098, 7895, 37019, 49776, +16495, 29572, 58329, 5384, 44407, 34480, 19715, 60001, 8174, 43007, 27249, +52446, 15147, 36788, 59001, 6392, 28938, 51364, 19179, 42501, 9911, 61521, +27110, 39539, 6019, 49074, 24709, 58168, 9978, 39017, 19291, 50419, 30345, + 3798, 57249, 35963, 20883, 49361, 8976, 32131, 58696, 18806, 48866, 6394, +39285, 26925, 61550, 12722, 38562, 21344, 59353, 3197, 36407, 53619, 15452, +28807, 47279, 7123, 63860, 23834, 40827, 10531, 58032, 18670, 32818, 53671, + 1773, 43009, 23024, 63671, 13343, 33549, 52410, 8235, 45698, 29568, 16446, +64184, 37046, 5228, 54012, 23737, 45007, 8960, 37291, 56421, 14907, 30837, +52755, 4855, 42093, 23895, 59413, 10687, 39887, 23383, 56839, 13801, 33498, +52611, 3176, 46476, 28934, 16672, 61855, 35903, 9026, 53540, 24027, 42164, +13488, 59247, 29936, 4083, 50995, 36288, 17970, 60384, 8911, 29645, 53871, +20508, 47026, 6112, 31336, 58105, 17745, 48660, 11351, 38632, 27162, 62844, + 3043, 38360, 21107, 56724, 60948, 22328, 48970, 1324, 31011, 53890, 18443, +43800, 9653, 60451, 20251, 32502, 47010, 3939, 62541, 27529, 15292, 37887, +58759, 8938, 45551, 27496, 16477, 55382, 37945, 2000, 30102, 60207, 18057, +49500, 4667, 39627, 27215, 62346, 13372, 33366, 51870, 7696, 42765, 23763, +57455, 3850, 40868, 22374, 47604, 12699, 60251, 26501, 40269, 3127, 55213, +18774, 47028, 28920, 8751, 61265, 35325, 17720, 49924, 4207, 33757, 58284, +15864, 44712, 29117, 2399, 52007, 35074, 11079, 63220, 20198, 30875, 50287, + 1226, 42672, 23350, 54777, 13971, 37234, 61980, 2822, 30465, 49939, 13437, +42214, 24849, 56014, 6627, 34255, 48611, 20561, 59110, 12025, 40851, 25760, +51725, 3434, 32298, 63613, 14165, 46584, 25475, 39190, 624, 61381, 17669, +29754, 47442, 7918, 65489, 24390, 40146, 12081, 48292, 23826, 58069, 4313, +40190, 22934, 51523, 7823, 29403, 60807, 12785, 47646, 34801, 20700, 55401, + 1684, 45391, 18617, 33789, 61525, 10165, 49388, 17610, 33577, 45892, 499, +56034, 23844, 40340, 9982, 47120, 22043, 57487, 14629, 34593, 46230, 1380, +53696, 27977, 15474, 60161, 37757, 4466, 47676, 25043, 64940, 12955, 38596, +26678, 55209, 3428, 43150, 19665, 59068, 29521, 5309, 50234, 35057, 21076, +64777, 10276, 45246, 19882, 31271, 57461, 6448, 46406, 20940, 31167, 55366, + 2587, 42734, 23913, 63391, 11429, 38819, 21552, 50240, 648, 34181, 58723, +20722, 41412, 11137, 54489, 26048, 45488, 7945, 33547, 58322, 18204, 48453, + 203, 36314, 51248, 16140, 29114, 64428, 4662, 44081, 27771, 16497, 56180, +38041, 6479, 28840, 63841, 20127, 42867, 10487, 53931, 27005, 38552, 4955, +62962, 21918, 47459, 11406, 40428, 26316, 52590, 7037, 33257, 64426, 13955, +43025, 24473, 56945, 5937, 33690, 50856, 14481, 42063, 24097, 64840, 1132, +31396, 53132, 14836, 46215, 28409, 3961, 62166, 37289, 14677, 53662, 28349, + 706, 49956, 37255, 14009, 59411, 25131, 43210, 3054, 51954, 17946, 31821, +55307, 8219, 42988, 24662, 62050, 11185, 39742, 22311, 57146, 2341, 30036, +53822, 15365, 44495, 28144, 6237, 63619, 35238, 17295, 51177, 10700, 43604, +24283, 62995, 2972, 40144, 21368, 52349, 14897, 33359, 56457, 6157, 43015, +23795, 50811, 14584, 35656, 63566, 8465, 29977, 49944, 20807, 42820, 1676, +54103, 28676, 16699, 61359, 36189, 8807, 49681, 28233, 15683, 65064, 36243, + 319, 49272, 20803, 34112, 63011, 9067, 44266, 27821, 15814, 60854, 38040, + 6911, 29012, 48971, 12441, 58206, 23960, 40776, 5447, 55267, 21830, 43493, +12927, 64654, 30841, 6161, 50349, 36165, 19147, 61026, 2416, 33449, 53150, +14907, 42242, 24530, 51250, 6981, 34237, 59975, 18332, 45458, 3390, 31469, +55560, 10742, 42906, 22882, 63121, 13365, 31677, 48506, 2716, 54728, 25481, +38828, 12164, 65004, 23762, 48904, 1430, 40492, 21984, 62454, 13239, 33031, +45986, 2891, 54524, 25688, 38312, 13238, 65485, 21391, 43729, 2093, 54751, +26859, 40930, 11368, 62666, 17651, 32253, 52563, 205, 44303, 27512, 13813, +64319, 37459, 10146, 46390, 23967, 56519, 5181, 41432, 17767, 51181, 29861, + 9704, 57435, 37812, 20357, 49790, 453, 34111, 58582, 14503, 44195, 27455, + 4542, 50674, 37276, 14109, 60446, 24604, 47077, 6704, 39756, 24441, 62104, + 2511, 39280, 21854, 56743, 11468, 35097, 49379, 16268, 29184, 60609, 1167, +44177, 27468, 12506, 64920, 35588, 20139, 49359, 2522, 31037, 62739, 18813, +45270, 7019, 31454, 60685, 15987, 44018, 27437, 5870, 56388, 37727, 20716, +50209, 2561, 37629, 63278, 15353, 28520, 47115, 10244, 55237, 19937, 31274, +43960, 3339, 61653, 35640, 13286, 51424, 25742, 42650, 1642, 64692, 34600, +19582, 53658, 8448, 48256, 26140, 39952, 13072, 55616, 38132, 14657, 33299, +65280, 8558, 42967, 23500, 52528, 2779, 34325, 57083, 12063, 44882, 28475, +16667, 54235, 38081, 773, 32382, 63368, 12800, 43632, 23023, 52644, 7276, +33529, 64600, 19860, 42374, 10664, 48383, 26047, 56572, 308, 31486, 46430, +16674, 63690, 27666, 10142, 50350, 36742, 18078, 58625, 1378, 35347, 49874, +14516, 29700, 62504, 11310, 42091, 24410, 56704, 2, 40975, 25684, 54650, +11803, 40445, 21801, 65529, 7748, 43455, 24941, 55379, 13112, 41414, 22397, +58018, 5718, 39608, 26781, 48938, 10656, 63826, 19852, 33115, 44372, 7379, +54247, 20821, 34555, 59636, 9993, 44483, 18515, 35893, 64200, 2300, 30416, +53090, 18269, 44316, 8950, 34453, 57629, 17363, 43033, 5930, 55827, 20636, +34027, 48955, 10435, 59099, 19712, 33859, 43808, 1813, 53003, 29103, 16768, +63302, 36557, 9645, 49726, 20316, 34671, 62431, 744, 42347, 24349, 54142, + 8485, 38793, 27084, 63421, 12163, 48599, 25066, 39849, 4508, 55099, 23229, +39122, 8659, 62698, 31135, 15154, 50716, 35159, 2907, 61378, 24816, 44017, +12659, 33011, 63935, 6434, 43466, 22057, 51828, 11391, 32232, 56301, 18116, +44569, 5949, 33129, 61428, 15305, 47510, 27843, 8907, 51613, 37555, 16225, +60128, 28159, 1919, 49589, 37021, 15882, 53428, 28658, 3864, 62704, 36282, +17174, 49885, 9386, 33683, 60765, 14079, 43538, 25299, 52660, 4547, 30609, +56117, 18712, 43153, 6606, 61960, 30305, 14611, 49497, 35100, 4994, 64850, +23863, 46328, 12430, 40829, 21795, 60728, 6521, 32588, 53724, 20244, 46881, +12460, 40335, 25861, 60325, 3374, 35452, 49786, 15488, 32332, 57916, 7700, +47536, 24239, 40663, 13352, 58887, 21024, 49015, 1855, 36571, 58039, 15649, +29710, 50652, 4566, 41351, 23238, 61803, 12716, 30280, 54395, 3492, 35058, +46526, 19544, 58216, 9964, 33943, 44220, 20748, 59558, 6905, 39810, 26017, +51922, 10906, 32126, 64254, 20542, 42249, 8319, 56621, 28902, 15838, 49768, +36893, 6782, 63780, 22768, 46963, 14408, 29714, 52149, 4341, 34758, 64546, +13728, 42716, 23637, 51526, 8483, 34294, 60156, 19265, 47370, 4740, 41824, +26583, 53884, 14164, 31322, 57971, 5572, 43019, 23431, 50409, 9770, 31192, +65331, 13641, 45172, 28875, 2496, 54136, 37294, 16356, 59245, 27510, 5217, +52425, 38173, 14706, 31788, 59614, 7235, 43387, 23656, 51692, 4034, 32066, +55426, 13887, 41827, 25135, 59668, 7234, 30611, 52396, 19856, 46069, 3706, +32620, 54939, 13781, 42079, 23510, 64785, 1190, 34941, 47875, 16348, 53164, +29837, 3741, 38128, 58742, 16101, 29091, 47105, 8296, 54863, 24031, 40613, +12636, 62511, 21526, 48492, 3794, 30510, 56178, 13479, 41071, 24011, 63806, + 8438, 37819, 50332, 15571, 29163, 57133, 974, 34682, 46646, 18925, 60942, + 9733, 33607, 45099, 17498, 56370, 5610, 32442, 44823, 16131, 57872, 28146, + 7510, 50201, 36755, 19758, 60523, 10737, 47795, 23083, 40805, 4765, 57618, +31310, 16087, 50089, 35957, 6382, 58860, 24582, 45468, 8661, 34747, 60717, +19731, 42292, 4162, 54883, 30617, 16317, 51540, 34541, 1871, 62578, 23640, +45165, 13562, 33380, 60833, 5649, 44977, 27603, 16658, 64827, 36918, 8386, +51826, 20643, 31044, 62891, 12185, 45890, 33929, 3553, 54836, 19611, 32433, +58218, 9368, 43218, 22865, 51335, 13774, 31722, 61185, 4248, 43300, 25053, +53533, 8462, 34247, 57766, 15609, 46342, 28882, 6167, 55100, 36717, 17245, +51695, 9358, 34219, 57564, 14217, 41704, 24131, 51360, 1504, 32582, 65224, +12949, 45315, 30767, 17961, 52487, 7233, 34259, 58462, 21080, 45015, 40, +33949, 64294, 13757, 49063, 24566, 40178, 7752, 59623, 22084, 39371, 12113, +53207, 23329, 45794, 4926, 32574, 62201, 15276, 44733, 28708, 6183, 16974, +47007, 28006, 4265, 58131, 36121, 15824, 50228, 28364, 10510, 64149, 37498, +20974, 48653, 5089, 61086, 25697, 40331, 10750, 51589, 20343, 30487, 58977, + 3771, 47204, 25270, 39334, 11911, 57779, 21602, 38651, 5165, 53640, 34954, +13715, 61036, 23140, 43856, 6034, 30729, 55031, 14487, 48075, 28961, 8696, +64536, 37480, 19891, 52598, 4013, 34016, 46455, 19445, 60951, 7604, 35700, +49672, 16251, 29769, 59610, 5442, 46939, 28205, 16982, 53431, 38014, 1536, +31507, 61572, 18398, 48263, 8835, 33190, 60364, 17214, 44973, 3158, 36078, +57775, 15418, 29852, 51074, 178, 46395, 28088, 16590, 61299, 37703, 5093, +48254, 22517, 54631, 12710, 40314, 26309, 60598, 1065, 49319, 22636, 40371, +12841, 64855, 26227, 39783, 2909, 53247, 17011, 30882, 57237, 8570, 45263, +27476, 14871, 60160, 38039, 3147, 30426, 56348, 11842, 46422, 18543, 30428, +58936, 5804, 41936, 22373, 51205, 14344, 32709, 57946, 2465, 44197, 20039, +32767, 64629, 11346, 43255, 19726, 51894, 29201, 7148, 58954, 37278, 18397, +48764, 5040, 54997, 37898, 16278, 29246, 58691, 9475, 48423, 23174, 39672, + 2313, 63089, 26252, 49243, 12346, 39032, 22495, 53271, 1032, 31865, 64423, +13618, 42749, 24371, 54825, 5828, 41320, 22279, 63221, 8964, 39537, 26278, +48615, 12283, 58677, 22401, 39103, 1205, 54081, 27221, 38269, 7286, 65289, +17527, 47127, 35083, 9819, 51277, 27723, 15626, 57944, 37385, 3045, 51827, +27867, 16508, 54844, 37902, 1483, 30658, 57155, 17642, 48782, 9524, 40641, +25641, 63312, 2169, 30903, 54392, 9506, 48377, 22259, 39965, 13593, 60957, +28136, 437, 53440, 36269, 19031, 45301, 4001, 65486, 23439, 39147, 10947, +54568, 24549, 43396, 8633, 63544, 18225, 34246, 53754, 130, 45754, 27665, +16298, 52461, 37487, 7983, 63395, 27961, 16560, 50135, 37311, 1660, 55744, +23058, 43478, 13159, 60530, 29654, 5710, 49615, 36396, 17726, 54423, 2454, +32924, 62382, 13410, 41764, 24796, 52865, 80, 33796, 60612, 17827, 43245, +10760, 50471, 20609, 31490, 59234, 1680, 41931, 25821, 54638, 12168, 38850, +22604, 64316, 373, 33403, 48605, 19796, 59391, 8729, 32957, 46524, 16466, +53072, 29354, 1386, 60575, 37455, 16889, 49326, 27417, 7559, 62354, 38219, +12556, 30959, 48420, 20462, 56297, 3290, 30163, 46071, 21125, 63925, 10295, +39473, 26273, 57535, 12473, 43927, 22210, 51295, 2585, 33605, 63759, 17418, +42575, 10779, 56710, 21215, 34939, 48159, 5902, 59631, 18254, 32962, 45811, + 8599, 56253, 22860, 39492, 12058, 61756, 25504, 44860, 1559, 37040, 63636, +14703, 30040, 51579, 5257, 43486, 22877, 57925, 9647, 34745, 45089, 15953, +58938, 28529, 1925, 52545, 35530, 19637, 46998, 11441, 62443, 26070, 41082, + 7472, 53617, 25837, 39753, 3565, 48931, 22033, 63591, 12572, 39252, 26287, +52279, 4198, 31181, 63162, 14816, 44608, 29198, 458, 53511, 35858, 17199, +64234, 8589, 48552, 26218, 40109, 12070, 61719, 21826, 43414, 1533, 56008, +30433, 16863, 49883, 37152, 10714, 63927, 22913, 47170, 6102, 41553, 26247, +58205, 10647, 40308, 19601, 50812, 28780, 2657, 55873, 37093, 20055, 49455, + 6618, 33736, 60102, 15134, 44639, 28074, 1391, 52766, 37571, 17911, 61915, + 8923, 37942, 49830, 15689, 28860, 46687, 100, 65052, 28166, 17010, 54755, +35922, 10982, 50016, 22014, 42060, 1984, 61788, 25756, 39979, 11931, 48448, +22914, 63813, 554, 29383, 46694, 19933, 61240, 4641, 38618, 26995, 55169, +10627, 40103, 21576, 57396, 3767, 34331, 48044, 19750, 62157, 8559, 40040, +26176, 56284, 11499, 39369, 21934, 52508, 4502, 31929, 60917, 15066, 46197, +29394, 2052, 54516, 37028, 17532, 58458, 10029, 41453, 26474, 51951, 483, +31873, 60549, 7345, 40983, 23359, 62479, 11800, 40848, 21653, 55270, 1100, +31870, 47535, 17635, 58411, 7432, 30271, 44136, 14475, 56232, 29161, 2437, +50055, 37000, 18175, 65484, 9473, 42563, 27179, 51581, 1516, 33080, 60555, +16257, 45248, 28685, 7898, 52120, 36970, 18183, 63148, 2088, 34173, 45234, +21109, 57992, 4768, 39387, 27027, 54201, 10180, 42443, 22686, 57857, 12971, +31224, 51293, 2554, 42745, 22984, 62921, 13725, 37399, 50595, 3609, 30482, +64194, 12085, 45324, 28117, 16172, 57016, 36910, 4825, 46030, 26038, 53344, +11745, 40712, 21721, 65301, 6869, 43522, 23302, 52962, 12497, 33630, 57361, + 8584, 43969, 27331, 14802, 62560, 38145, 6220, 31171, 46595, 18815, 58085, +10020, 38605, 27287, 48322, 4885, 61771, 20917, 34493, 45444, 10930, 51547, +20839, 37661, 62652, 4524, 31491, 47272, 13499, 54690, 24461, 40958, 7069, +48825, 22488, 65129, 13241, 32740, 47565, 3436, 55800, 24690, 39871, 10508, +60366, 18107, 48891, 29003, 5797, 53417, 36322, 17414, 57183, 1619, 46267, +20955, 34076, 60589, 9812, 44981, 19847, 33601, 65466, 630, 43002, 25712, +53188, 13972, 33227, 57720, 5651, 45182, 18771, 32155, 60595, 9457, 43172, +26250, 56405, 4393, 38630, 21713, 50676, 10600, 31604, 60806, 13404, 43778, +23546, 56907, 3255, 33470, 46322, 18555, 54998, 8469, 41621, 26150, 59502, +12750, 40559, 23007, 52246, 2153, 32113, 60152, 20264, 44898, 6110, 31832, +63766, 19727, 47868, 8350, 41813, 25169, 59528, 13120, 38948, 22761, 62353, + 5740, 38778, 26917, 52028, 13050, 35263, 56139, 19654, 42305, 5253, 64128, +29452, 16964, 51307, 38001, 8563, 30846, 62247, 15233, 48134, 28737, 6883, +53294, 35986, 16929, 61088, 27959, 5422, 49401, 35650, 20256, 59421, 10992, +42428, 25280, 50495, 6652, 32410, 60282, 13367, 42987, 24701, 54572, 4883, +34516, 46985, 14259, 65356, 25396, 39493, 3259, 52891, 19924, 33196, 58670, + 9411, 45139, 19207, 30152, 48630, 6313, 60109, 18497, 29833, 45816, 9896, +56328, 24483, 39568, 3329, 61773, 27183, 38298, 9077, 55906, 17281, 35877, +49927, 5861, 29374, 57056, 15629, 44814, 35011, 10872, 62013, 24077, 41949, + 3432, 55142, 26607, 38733, 10519, 56586, 18609, 35277, 51570, 5805, 29364, +57623, 15356, 46425, 28297, 0, 64795, 37009, 17783, 50320, 8615, 34775, +59933, 17157, 42655, 1266, 54353, 27185, 38384, 6586, 61930, 18849, 35164, +50025, 9686, 40830, 23494, 59049, 871, 31761, 52906, 20295, 42470, 11544, +63372, 26705, 39958, 2691, 51023, 34639, 19157, 57680, 5688, 47697, 20832, +31962, 54608, 9135, 45928, 27555, 16600, 60435, 37954, 698, 29558, 54538, +19173, 47240, 5900, 33106, 65406, 17296, 42919, 9320, 54942, 27152, 38834, + 5155, 58532, 21146, 38333, 10233, 55482, 23397, 43488, 14458, 60421, 29411, + 1903, 49855, 37467, 18702, 58875, 8530, 41166, 26446, 55522, 12193, 40135, +24276, 56967, 5822, 32626, 45831, 19915, 60237, 3141, 38412, 27208, 52770, +13720, 34316, 62884, 7236, 46098, 27571, 15126, 54169, 32683, 1042, 59285, +36840, 20431, 49929, 12975, 35696, 62282, 7489, 31760, 52154, 18090, 43308, + 9952, 63117, 21265, 31412, 47009, 4260, 55063, 24541, 40158, 10989, 58330, +20836, 47253, 29248, 5115, 53980, 35610, 20069, 59422, 7592, 37765, 51847, +14821, 32180, 45903, 3294, 63203, 26497, 38622, 13118, 55548, 21273, 43652, + 5535, 58671, 31672, 16694, 50801, 37758, 7830, 44648, 24703, 56984, 13273, +41058, 22690, 50685, 6036, 30972, 63414, 12243, 44780, 28079, 16055, 53909, +37978, 2869, 31568, 59093, 18509, 46705, 6339, 34469, 63002, 16192, 44485, +27823, 9099, 51836, 35552, 16427, 64480, 28211, 3748, 49242, 35188, 20402, +63292, 11409, 42627, 25239, 54056, 49846, 15036, 29363, 56941, 3712, 35560, +51571, 13950, 42222, 24408, 63025, 9412, 33310, 45920, 19819, 61611, 4822, +33770, 52267, 15860, 44094, 27487, 7096, 56902, 35244, 17369, 47419, 11449, +62143, 23418, 40332, 4142, 55166, 25256, 39533, 11334, 56991, 19893, 48780, +29747, 7417, 60203, 37157, 18522, 51160, 12402, 43443, 25897, 63387, 955, +34694, 47352, 18088, 61553, 8041, 39034, 26822, 55383, 10921, 32684, 46259, +18466, 58914, 8640, 41818, 26603, 54681, 597, 43684, 21668, 60578, 9683, +32516, 47755, 18778, 62212, 2033, 38374, 27124, 56090, 13675, 37791, 49231, + 3589, 29799, 63446, 16922, 45585, 35264, 1719, 56244, 27805, 16721, 51400, +35337, 3843, 61080, 24071, 45568, 14523, 35852, 54135, 7173, 29279, 59270, +17408, 43867, 226, 30179, 55985, 16375, 43790, 27345, 8304, 63899, 36402, +16932, 50748, 27987, 1240, 56950, 37926, 16868, 28872, 61292, 8870, 45140, +28565, 15685, 54628, 37956, 132, 31669, 62140, 20626, 47551, 8876, 40317, +26769, 64228, 12671, 40175, 23445, 50870, 3481, 30583, 56890, 13255, 47098, +23613, 40987, 7403, 62334, 21428, 38919, 11114, 48899, 26907, 54766, 1605, +40508, 23646, 63625, 11576, 48515, 19292, 32669, 59468, 7917, 41987, 25573, +54355, 13, 38802, 21301, 61535, 14520, 36787, 50915, 6332, 29716, 64252, +20355, 45054, 4824, 33220, 62121, 15736, 46241, 29148, 8791, 55582, 36924, +15078, 50547, 28425, 331, 60714, 37993, 16859, 31543, 48854, 4414, 55839, +26366, 41728, 10421, 49125, 21560, 61176, 3554, 33936, 45278, 17765, 58169, +11571, 33136, 50397, 1244, 43727, 22532, 59855, 12446, 41226, 25400, 56342, + 3055, 40201, 22038, 50630, 13144, 33935, 57508, 1654, 44142, 30388, 16765, +64275, 37290, 3652, 51975, 28210, 16917, 57479, 36284, 2334, 48071, 23331, +62744, 11983, 38958, 21975, 57669, 7273, 31455, 51514, 18592, 43173, 11295, +61365, 25805, 39604, 1227, 49279, 22262, 64659, 13183, 34008, 43934, 5051, +58327, 21019, 36274, 49911, 6635, 30087, 53772, 19221, 42299, 12358, 65248, +25137, 48051, 3904, 40619, 21506, 62619, 13440, 36612, 52183, 2461, 29653, +47682, 19107, 57824, 7625, 34638, 44319, 13282, 64618, 23925, 41691, 3803, +46697, 22700, 60897, 8001, 35192, 44529, 19807, 55455, 11713, 41102, 25036, +61362, 4603, 32333, 52974, 20096, 46753, 9776, 32520, 58901, 14443, 42543, +24587, 52716, 3231, 31689, 65376, 14681, 46310, 27790, 8634, 51058, 37326, +14097, 61405, 30180, 4833, 46642, 23785, 54026, 14294, 31150, 60949, 7980, +44346, 28104, 15500, 62864, 37804, 3103, 52357, 23630, 43273, 11261, 64253, +21436, 39347, 8096, 49090, 26042, 59416, 11774, 40448, 22545, 51052, 3172, +33884, 62065, 13932, 42109, 24173, 48687, 85, 64794, 26897, 40418, 6567, +52923, 18914, 31617, 54892, 10734, 42311, 22969, 61958, 5224, 33270, 51026, +18421, 46409, 2281, 34159, 61138, 18130, 49141, 7520, 41079, 24943, 55529, +12435, 42369, 21292, 49054, 4538, 57204, 29670, 16591, 38229, 51728, 9623, +28771, 65082, 17656, 46113, 4906, 30778, 54082, 18817, 43006, 2357, 58939, +26814, 38465, 13471, 56721, 28699, 714, 50542, 36027, 19504, 65445, 12915, +43904, 32279, 7162, 60851, 37053, 15219, 50280, 27738, 2652, 64123, 37955, +16702, 30578, 56414, 10091, 48699, 23722, 39840, 6168, 60028, 21707, 48006, + 8758, 35312, 52132, 15263, 29863, 62572, 3657, 42700, 21787, 53197, 11670, +30653, 64568, 2291, 47392, 18233, 32825, 59971, 9460, 43266, 24217, 54805, + 860, 40381, 21992, 61537, 9556, 49218, 25087, 42308, 14497, 52954, 28705, + 1255, 57101, 37499, 20196, 47288, 5426, 58959, 23586, 40729, 14139, 55240, +29685, 8091, 50140, 37163, 18330, 59592, 2191, 36698, 61258, 9777, 33615, +45269, 17038, 65014, 27584, 5677, 53081, 36537, 18257, 48570, 1883, 59732, +26762, 41645, 10688, 55442, 20865, 35038, 46026, 76, 63887, 20514, 32130, +44994, 5624, 52758, 19508, 32202, 58435, 9427, 44562, 17266, 31276, 62585, + 569, 44291, 28468, 14928, 52493, 35741, 3526, 65252, 22924, 45694, 9537, +32834, 54962, 14203, 40262, 24908, 59186, 4996, 32153, 52969, 19877, 42976, + 1928, 64847, 26377, 39135, 6563, 53716, 22554, 38278, 11286, 62441, 18113, +36185, 50173, 3944, 30225, 53828, 13875, 43410, 24019, 58813, 5867, 35261, +49872, 16604, 28568, 60012, 9227, 41535, 24521, 55283, 13073, 33484, 47348, + 7571, 64317, 25357, 39231, 11247, 48969, 21438, 57302, 2115, 32942, 44588, +20103, 64621, 9831, 34872, 52710, 21419, 47824, 6550, 34503, 60559, 14587, +45542, 28061, 2572, 55158, 38155, 15366, 31743, 59869, 6147, 46834, 27645, +14670, 51502, 37374, 4124, 63180, 22116, 47914, 12946, 39232, 26837, 58004, + 4790, 36089, 51128, 15101, 29987, 59365, 6788, 44398, 27890, 16572, 54256, +37611, 6087, 60822, 27656, 16664, 50199, 35490, 3020, 55914, 24078, 42975, +14489, 61215, 29683, 6960, 52021, 38011, 15171, 29094, 56837, 2492, 43078, +23738, 51913, 13846, 33772, 65006, 7184, 47374, 23936, 41622, 11207, 56315, +17356, 32890, 47942, 923, 57687, 24902, 38916, 13021, 54675, 21852, 49094, + 3397, 41124, 24873, 65105, 11944, 40239, 22844, 57401, 7029, 40155, 21482, +52782, 11639, 33923, 64503, 18656, 44826, 916, 32478, 58626, 15578, 48133, +29084, 6179, 53350, 37545, 21021, 64679, 9780, 41761, 26046, 54126, 4716, +38906, 23957, 61830, 9997, 48789, 18207, 36924, 63183, 7496, 28854, 52059, +15110, 46657, 27389, 8944, 56565, 38174, 14721, 29948, 47461, 5951, 61751, +25867, 38994, 9603, 51492, 18066, 31910, 56527, 535, 45837, 27601, 15706, +63973, 38126, 3679, 30712, 55249, 14315, 43701, 23891, 57107, 8079, 35193, +47193, 17520, 63013, 1894, 31733, 45334, 17173, 55585, 11353, 41020, 26144, +58949, 875, 39008, 22614, 51488, 14616, 32663, 60367, 6662, 43421, 24118, +54882, 9914, 39745, 21938, 63586, 14507, 32002, 53401, 746, 47975, 28386, +16835, 58605, 35794, 10882, 49871, 30796, 18346, 63144, 1781, 42942, 26269, +51088, 9971, 34345, 57322, 15729, 44925, 28081, 2355, 62725, 36630, 17784, +48286, 5620, 55152, 22919, 38736, 12128, 60131, 26514, 41433, 5274, 53956, +18176, 32989, 57726, 1812, 44243, 27497, 15677, 64337, 37383, 9976, 50627, +21816, 40875, 258, 56989, 35078, 18136, 49873, 9400, 33765, 59291, 13293, +40835, 25326, 55412, 4622, 32696, 46592, 18570, 56678, 1448, 38710, 27261, +60702, 13242, 43765, 21765, 52797, 4514, 32675, 57402, 15872, 45822, 30107, + 8606, 59769, 37315, 20851, 49429, 12930, 34487, 64422, 1118, 45915, 27751, +16612, 58177, 37623, 11120, 52864, 23252, 41375, 9148, 65269, 29885, 15900, +51328, 35346, 742, 62120, 25798, 46561, 11570, 39162, 22387, 63321, 2573, +45316, 34959, 20065, 57800, 6287, 34943, 44651, 21334, 55613, 8646, 39312, +23407, 63490, 11652, 49029, 24696, 41895, 6351, 53881, 17350, 37620, 59637, + 8089, 29004, 47608, 17515, 57005, 1761, 30325, 51648, 21162, 41052, 11811, +55127, 23405, 39480, 8534, 62178, 26167, 43677, 936, 58503, 18767, 33656, +50734, 10796, 43461, 25491, 65277, 1461, 40864, 24657, 56543, 14120, 34328, +45898, 7285, 55634, 23748, 40320, 13626, 58598, 22073, 38391, 3981, 51859, +29561, 13462, 64388, 35411, 18301, 47017, 4697, 55743, 27242, 38425, 12721, +62507, 30708, 6923, 50434, 35586, 18558, 65174, 11124, 42883, 26593, 52706, + 738, 34245, 61437, 13063, 43022, 24407, 56569, 4792, 29927, 47388, 19892, +41381, 25599, 58952, 322, 31272, 49481, 13558, 34466, 57845, 8343, 42491, +24979, 54198, 13186, 38888, 23130, 63294, 3903, 30833, 48132, 14662, 53037, +28452, 8429, 60110, 37191, 15713, 49914, 27846, 2921, 64456, 37440, 20885, +48311, 8066, 54396, 25658, 41254, 12146, 59529, 24100, 40358, 6498, 56536, +17639, 34982, 50098, 2776, 30727, 61222, 18601, 43844, 6667, 50991, 29426, +15673, 56484, 36992, 9332, 47499, 23529, 58422, 14963, 33847, 51539, 4458, +42844, 25466, 56304, 12555, 40259, 24330, 63697, 7686, 39482, 21909, 55191, +11978, 42573, 25774, 64808, 886, 33044, 51729, 18846, 43085, 4779, 61967, +29398, 15740, 50688, 36887, 432, 54397, 23194, 42244, 14049, 62851, 29884, + 8194, 50720, 37078, 17113, 56626, 4755, 31924, 46460, 13314, 62273, 24773, +39793, 4113, 57115, 19897, 30294, 52032, 7745, 43377, 23682, 64466, 12222, +41627, 21512, 53323, 2809, 33519, 58802, 16773, 44005, 30458, 7727, 56515, +25122, 49505, 11053, 41574, 21635, 63789, 2040, 34515, 52579, 18611, 47327, +11162, 33588, 63390, 997, 44360, 29671, 14713, 52929, 37175, 8412, 64680, +25449, 40738, 11768, 48574, 22170, 58384, 4047, 33074, 46360, 18308, 64164, + 9169, 33671, 46176, 18219, 60449, 5450, 30553, 44472, 15951, 53259, 27981, + 3063, 59621, 35737, 19450, 51735, 9808, 41864, 22019, 63538, 6207, 32511, +46627, 17438, 60634, 9478, 39079, 26658, 56394, 2016, 34286, 51575, 14238, +42553, 26417, 62784, 2953, 46698, 28900, 15966, 56534, 37387, 7368, 53518, +25136, 42564, 10808, 63124, 24318, 40408, 2075, 50887, 17166, 30186, 57672, +12916, 45087, 28947, 8215, 55973, 35670, 17263, 52356, 621, 31990, 44955, +21207, 54482, 5603, 35892, 60547, 17139, 31193, 48636, 1057, 65207, 23639, +41750, 11231, 55032, 20231, 33851, 46504, 4551, 60394, 23955, 40128, 13597, +50941, 29684, 6023, 59718, 36051, 18899, 50501, 9938, 42147, 27209, 53509, + 4615, 31945, 59995, 20175, 42384, 10516, 50619, 21306, 33507, 60930, 4166, +47206, 18256, 32594, 63910, 7404, 44200, 25674, 55000, 10119, 38687, 21225, +56629, 1754, 35722, 49999, 16217, 30535, 59796, 4836, 45791, 25007, 39271, + 8811, 62262, 30273, 15221, 50763, 37651, 2858, 56047, 23528, 45563, 9346, +33943, 58033, 13873, 42095, 22704, 63648, 6004, 31123, 52205, 20612, 41977, + 8189, 56105, 26312, 39379, 11736, 64153, 25530, 43361, 488, 51147, 19614, +33478, 55872, 10229, 44821, 30390, 20833, 60494, 7087, 48736, 34658, 19012, +52614, 3975, 32799, 58157, 13989, 43200, 24989, 65116, 7167, 31131, 51956, +20176, 42510, 2081, 61908, 30538, 15157, 50129, 35676, 7322, 63457, 24026, +41702, 11323, 53478, 21064, 38303, 6251, 62516, 26646, 48355, 10630, 39515, +18837, 63907, 28385, 2626, 50046, 34824, 17473, 56601, 5730, 44488, 30366, +14650, 60652, 35829, 7778, 53647, 24689, 45126, 2651, 30616, 57457, 14429, +44400, 27945, 4329, 59103, 37700, 17977, 50444, 6721, 33878, 59641, 20935, +41472, 8384, 54349, 25605, 48716, 11041, 31601, 60187, 18243, 46661, 142, +32343, 61661, 15307, 45609, 29217, 3953, 57714, 35394, 14441, 45937, 24010, +64276, 4636, 32909, 44766, 19763, 52656, 10318, 34011, 61235, 19652, 45424, + 6607, 33840, 63503, 18077, 48465, 4578, 41580, 22354, 52140, 12456, 34565, +54727, 17094, 41344, 5286, 60417, 27022, 38314, 13279, 54125, 21120, 43862, + 4760, 59681, 29456, 16766, 50193, 37578, 280, 62244, 25918, 43573, 10207, +50180, 19302, 36392, 57755, 7122, 31753, 45492, 20645, 59350, 10324, 41680, +25951, 54079, 2241, 40816, 21503, 57795, 13406, 37205, 49370, 3140, 29266, +59731, 20954, 41313, 9809, 50837, 18576, 31685, 63781, 6578, 46292, 17260, +31978, 54835, 8802, 62841, 10286, 32860, 46814, 15364, 55453, 23870, 40192, + 3083, 64199, 20180, 33809, 47413, 6440, 57258, 18117, 33100, 44313, 11294, +61150, 25123, 40337, 2205, 57438, 20753, 34209, 45989, 10039, 56266, 18371, +33055, 43937, 6283, 61385, 27923, 15296, 51432, 38072, 2186, 32593, 63792, +19783, 43592, 10948, 53771, 25743, 41019, 8933, 57404, 24480, 39212, 11374, +62476, 23294, 39182, 387, 48926, 21249, 60442, 12176, 31922, 44944, 2895, +63938, 24416, 38796, 10676, 48991, 21256, 59588, 1618, 33855, 46280, 16916, +51987, 29538, 3348, 61180, 36547, 18265, 47215, 7551, 55820, 26540, 39046, +11606, 59192, 21612, 46451, 7002, 32728, 57120, 19666, 43213, 10218, 60158, +27207, 38583, 2841, 55523, 25234, 47123, 11628, 29715, 61503, 19494, 42612, + 1453, 54335, 29894, 14983, 49865, 37259, 9006, 62841, 18148, 34627, 47357, + 547, 57531, 25062, 39803, 8737, 61760, 26476, 39791, 11166, 49057, 22432, +65270, 1512, 34510, 46465, 17853, 60914, 5406, 32971, 45855, 14352, 54806, +25170, 41583, 7792, 60086, 22030, 39796, 12186, 58088, 25055, 47476, 5045, +32157, 56728, 15525, 46074, 28581, 293, 61555, 37074, 19542, 52651, 8162, +41722, 26830, 54219, 13104, 40591, 23300, 57532, 1117, 48214, 34976, 19759, +63007, 9200, 37551, 50008, 15191, 31083, 61877, 5063, 43650, 25990, 54370, +11949, 40246, 24394, 59237, 4127, 34298, 52941, 19991, 44393, 10478, 32236, +61207, 19094, 48819, 6582, 38800, 23410, 59828, 10552, 34984, 49909, 14212, +30665, 61610, 4093, 40966, 22599, 51636, 12519, 31041, 59394, 20482, 46099, + 7360, 33346, 62185, 20266, 48487, 2655, 39223, 26853, 64974, 11366, 29806, +47003, 19236, 61197, 3826, 39611, 26229, 51246, 12839, 37355, 59399, 6978, +28457, 45273, 13866, 57017, 25129, 40106, 2885, 51957, 17073, 29910, 62940, +10916, 42719, 25514, 56267, 7797, 33790, 47564, 20986, 64955, 2390, 39716, +25238, 48157, 12126, 56268, 21658, 39855, 347, 62730, 29527, 14862, 51914, +37199, 7954, 57267, 23817, 42122, 12090, 54237, 23705, 39868, 3037, 61489, +19670, 31798, 45801, 11428, 65012, 24877, 40411, 7420, 52492, 18969, 32616, +56444, 12011, 43362, 22286, 51945, 4051, 32414, 60071, 16991, 43956, 27982, + 6714, 65514, 37707, 15570, 53815, 28319, 4261, 49680, 35778, 18059, 54877, + 1066, 33839, 61533, 14253, 42616, 22490, 51806, 3633, 33139, 57060, 14878, +44757, 27973, 8062, 61928, 37662, 15563, 50197, 27637, 2465, 62876, 38190, +15411, 30725, 47043, 8573, 55378, 25229, 38680, 12120, 60179, 23193, 46563, + 3246, 29330, 55189, 15798, 48596, 27484, 6001, 57984, 37681, 20679, 53977, +10013, 43151, 26336, 59533, 3148, 34157, 47488, 14783, 54664, 23272, 40820, + 959, 58817, 29566, 16156, 50865, 36440, 7602, 54698, 25258, 42647, 10509, +59006, 19951, 37383, 50044, 4418, 28831, 62305, 20066, 42112, 10031, 52065, +34363, 18830, 64095, 6028, 46548, 20910, 36444, 53688, 9564, 29144, 61481, +20135, 44385, 1350, 32575, 56294, 14813, 43972, 27745, 3599, 63768, 37709, +13271, 52597, 24588, 41366, 7841, 53938, 22408, 40378, 12194, 60998, 26172, +38947, 1206, 48372, 21623, 56432, 12482, 40004, 23482, 62934, 3318, 36391, +49504, 14685, 28720, 58129, 358, 41962, 24743, 55430, 11200, 38432, 27237, +64869, 2809, 46684, 19214, 30257, 61623, 9304, 42760, 24238, 57621, 2117, +39595, 22682, 51433, 12414, 32538, 64083, 8107, 46496, 28086, 16051, 54347, +34803, 5712, 60189, 24476, 42251, 13025, 53580, 28167, 1583, 63010, 36543, +17392, 49837, 5504, 32505, 60252, 14206, 43645, 22845, 53432, 7601, 33954, +63246, 17640, 45838, 8707, 32774, 56748, 15024, 45434, 28402, 4115, 57871, +37538, 20667, 53359, 2354, 43351, 23050, 58197, 24951, 39378, 5865, 51251, +19030, 35517, 59438, 9143, 29097, 53115, 14952, 44902, 27829, 974, 62405, +35973, 19509, 50486, 7831, 37790, 54754, 16462, 29277, 44440, 4920, 65149, +28408, 15324, 51925, 36006, 1181, 46546, 23180, 57374, 9618, 31581, 45149, +16714, 58572, 27760, 5120, 50506, 35353, 18003, 62108, 1414, 33274, 47073, +19961, 55428, 4266, 33560, 45707, 13886, 65028, 25757, 41609, 7453, 53893, +24507, 40766, 13005, 57387, 22212, 46323, 4921, 35215, 62860, 14619, 29664, +54302, 7046, 44609, 27733, 14537, 58381, 34890, 9994, 44567, 20731, 52654, +31203, 2378, 63314, 35343, 16027, 49629, 28291, 4043, 53030, 36321, 13233, +65423, 23618, 47745, 5540, 40938, 21927, 52681, 13643, 34741, 58419, 6344, +41231, 23449, 52128, 10431, 33774, 64943, 20780, 45954, 3627, 33124, 59737, +21235, 41532, 10136, 51296, 30236, 16177, 55904, 36047, 5511, 49770, 19742, +31841, 57529, 7126, 44272, 19256, 31577, 55057, 8432, 41844, 24150, 58514, +12052, 39080, 22501, 62037, 3789, 31484, 50385, 15400, 45823, 28051, 2190, +54586, 36790, 18036, 62629, 7490, 44055, 20695, 31983, 47766, 12114, 56245, +17401, 33465, 44770, 2653, 62515, 24334, 38607, 6152, 59325, 17241, 31164, +51632, 11929, 42436, 25512, 55207, 2215, 39375, 26696, 58212, 11055, 38637, +22902, 51254, 1510, 34206, 64408, 18550, 48352, 12571, 39834, 23517, 57582, + 592, 33877, 46391, 14767, 64070, 29052, 3913, 54060, 36464, 16358, 50787, +28091, 1405, 57345, 36754, 19370, 49465, 8852, 35000, 65228, 18514, 44813, + 64, 37398, 54304, 15045, 28578, 56564, 4539, 42314, 23358, 53201, 14504, +33309, 58196, 6795, 42274, 22790, 53000, 10303, 33255, 63915, 18800, 43376, + 2129, 55088, 32183, 16973, 50538, 35090, 8382, 63352, 20665, 32950, 45808, + 5705, 58640, 18596, 32839, 44971, 1445, 54708, 17127, 31138, 44062, 10438, +60718, 28842, 14792, 51434, 37277, 5379, 59065, 23273, 45833, 13441, 34279, +54861, 6269, 44227, 27834, 16562, 64826, 34721, 2087, 49427, 28945, 16352, +58624, 37292, 8370, 49779, 27568, 16461, 57323, 37420, 4140, 49423, 28688, +14722, 60918, 36732, 1222, 46956, 24087, 64269, 9784, 41294, 21429, 55384, +13535, 46368, 29387, 423, 51699, 36245, 19345, 61764, 8565, 46324, 26774, +39077, 12404, 60606, 23591, 49196, 6902, 30283, 46365, 18122, 64993, 10463, +29891, 46245, 18053, 60055, 4701, 32358, 48226, 20966, 58834, 6381, 31553, +45639, 20178, 56760, 11818, 39496, 26863, 63689, 1110, 48907, 21065, 41586, + 6436, 52427, 34807, 18552, 62308, 8520, 44631, 37894, 12384, 30049, 64062, +19277, 46183, 424, 34938, 51324, 12274, 29878, 64939, 16809, 45108, 28606, + 6891, 55943, 35218, 12682, 46225, 23724, 63019, 4815, 41376, 21916, 60298, +13589, 36010, 51354, 1710, 29858, 64757, 12087, 45494, 27382, 15383, 55720, +37362, 318, 47754, 25497, 60141, 12086, 39200, 22353, 51611, 2113, 33913, +56878, 17337, 47806, 10457, 34660, 64849, 16288, 47287, 29325, 5510, 53391, +36248, 15921, 58760, 28806, 6873, 50137, 36036, 19380, 65354, 2988, 31383, +48736, 20274, 54592, 9761, 40772, 26942, 59988, 5478, 36127, 50807, 16194, +29125, 54931, 9158, 43175, 22843, 60550, 5903, 34573, 52786, 20192, 43263, + 7884, 59508, 25810, 40586, 12837, 49080, 21822, 56127, 6305, 32345, 45547, +18343, 53031, 9893, 33468, 62084, 17047, 44426, 27547, 3529, 57327, 37121, +20474, 51022, 11047, 43347, 22419, 65505, 3009, 37842, 49268, 16136, 30949, +53342, 8424, 42476, 22510, 56255, 11834, 39278, 26451, 64885, 129, 32409, +50360, 14809, 44879, 27870, 4650, 60744, 36692, 19691, 53880, 1655, 36171, +49663, 15938, 30546, 64818, 7666, 47620, 25801, 40114, 12507, 14303, 35970, +61699, 1408, 29611, 49716, 13793, 43333, 24267, 65417, 5243, 37160, 49804, +16824, 31211, 59980, 9477, 42263, 23411, 56452, 4189, 33886, 48656, 13767, +58980, 25387, 40965, 7331, 55055, 24405, 39900, 13396, 62484, 21494, 48586, + 3596, 34052, 54614, 13029, 42887, 23813, 64778, 7227, 37899, 49337, 12548, +29887, 59073, 20967, 42321, 8399, 52359, 29815, 16569, 58250, 35851, 5110, +50227, 28293, 15805, 55994, 38043, 1074, 30025, 61028, 16516, 48248, 27781, + 8854, 51144, 37120, 16141, 61751, 30845, 119, 49975, 37103, 19635, 64519, + 5168, 46793, 29306, 14969, 56763, 36707, 8441, 51185, 22478, 43518, 12001, +61248, 25973, 39919, 1651, 56618, 18030, 35140, 50284, 8746, 30444, 63172, +18052, 45402, 774, 31400, 61006, 16155, 44331, 27405, 7480, 57738, 37594, +18516, 50606, 12373, 31605, 54715, 3137, 43162, 22762, 63579, 13368, 32603, +44952, 1152, 60428, 27922, 16095, 53607, 36595, 4463, 47505, 26109, 62442, +14126, 33447, 44510, 400, 52052, 19987, 33759, 56482, 9919, 43356, 19125, +65338, 29860, 6406, 52180, 35020, 20194, 48168, 10832, 59907, 26665, 39658, + 3710, 49801, 22136, 65065, 6881, 38773, 27148, 48768, 10614, 55790, 19011, +33248, 45742, 3854, 61116, 22688, 40003, 8351, 48839, 24536, 65535, 12994, +41673, 21376, 56059, 5475, 31871, 45260, 15091, 58830, 30094, 6964, 44207, +26490, 53895, 11062, 30766, 60411, 18313, 48202, 7901, 39828, 25072, 58383, + 9270, 48408, 21510, 41312, 12756, 62695, 26004, 43124, 4734, 52535, 17062, +31612, 58487, 10287, 41794, 19349, 50721, 31747, 6115, 63409, 36362, 19719, +49476, 10090, 43521, 25664, 60622, 1387, 37415, 49761, 15937, 31030, 57080, + 5142, 46517, 23447, 38873, 11392, 60210, 29432, 15431, 53036, 37643, 219, +48378, 26158, 61257, 12882, 41405, 24840, 52559, 9325, 29530, 63708, 20663, +47901, 4100, 35009, 55646, 16955, 44688, 27350, 8739, 64372, 35407, 18881, +49980, 2969, 30490, 61547, 15568, 46489, 27323, 9069, 56210, 36475, 19027, +50760, 4890, 33102, 63357, 14959, 44939, 29991, 168, 54016, 35059, 12967, +62151, 23206, 43010, 6737, 50849, 29282, 16656, 57482, 35065, 8134, 49889, +26518, 39470, 5720, 62481, 18420, 32292, 48021, 7534, 59127, 25368, 39625, +11430, 56390, 21518, 48616, 3393, 32161, 59088, 14899, 44245, 27509, 2197, +53898, 36427, 20546, 58275, 8605, 35122, 49951, 20157, 39811, 783, 54663, +25791, 41876, 9559, 64636, 17399, 35007, 52830, 4505, 42055, 23697, 55173, + 9667, 38426, 22307, 60834, 14484, 32536, 47519, 1626, 55999, 20799, 33269, +47379, 4758, 58868, 17436, 31398, 52626, 9208, 42527, 24603, 57409, 5358, +39050, 22097, 49001, 10504, 61738, 25841, 41779, 3018, 51411, 19557, 33084, +56230, 11754, 42104, 26345, 47616, 7028, 57310, 18755, 34310, 43920, 3621, +61105, 18347, 33638, 51582, 9663, 45998, 17899, 32945, 58243, 7095, 43066, +25843, 62955, 13928, 31502, 45692, 3907, 53253, 25679, 39243, 7676, 57724, +23315, 49005, 10313, 40661, 26254, 61859, 1792, 44589, 20957, 33952, 55305, +10387, 44080, 17895, 33910, 59527, 6680, 43427, 22595, 52867, 11003, 32589, +61909, 19137, 47176, 1929, 40648, 25848, 64707, 10012, 30441, 51120, 15898, +45281, 28243, 1379, 56281, 37905, 15144, 31221, 63855, 3936, 47474, 28194, +16468, 61252, 36545, 578, 50006, 28897, 15476, 55500, 37997, 5375, 30329, +63420, 14905, 48365, 28695, 1867, 53455, 35572, 16443, 56810, 29124, 6800, +50096, 35292, 14075, 62721, 24758, 46187, 3615, 33961, 57405, 18049, 42962, + 9444, 51706, 29614, 16319, 59105, 37523, 6715, 51189, 24367, 43325, 11491, +62420, 26359, 39628, 9033, 52336, 19724, 34761, 59439, 4543, 41821, 22036, +52109, 38790, 26487, 56548, 11789, 41943, 21912, 52176, 4032, 32240, 57570, +12673, 42059, 22361, 54691, 1981, 37012, 51355, 14341, 29730, 62830, 11060, +46912, 24423, 38558, 656, 63553, 21356, 47963, 11832, 34191, 53181, 5760, +43307, 26000, 57874, 10246, 40594, 19146, 60866, 29574, 212, 50875, 35848, +15846, 56889, 27596, 3881, 49974, 36669, 14535, 61879, 27623, 1998, 49304, +37282, 12832, 59728, 22876, 46171, 9176, 34821, 64223, 20122, 45543, 6743, +33974, 55016, 21007, 42341, 2645, 56976, 25302, 41028, 11671, 59425, 22037, +40700, 7977, 54150, 25608, 40474, 11725, 60757, 24861, 39962, 1128, 58715, +19247, 35681, 52268, 6625, 31421, 46722, 19334, 63782, 9758, 41668, 25492, +55304, 3595, 40050, 21196, 59494, 14295, 33539, 51620, 4687, 47717, 28794, +15302, 55121, 35616, 1715, 64108, 27773, 16627, 49390, 37179, 6397, 59066, +27915, 15746, 52263, 37154, 9108, 47703, 23979, 64798, 11746, 41919, 21845, +56203, 3010, 37408, 50510, 16308, 29914, 64263, 6673, 46522, 28213, 14405, +53473, 36508, 4719, 59080, 27334, 16390, 49572, 37875, 1235, 63493, 27713, +15973, 53854, 37853, 9212, 31237, 49097, 14246, 59169, 24782, 42412, 804, +53316, 22910, 41213, 12280, 63850, 26864, 38723, 7081, 53779, 18304, 35243, +60280, 417, 30316, 46637, 16613, 52430, 28334, 8888, 63173, 36734, 19826, +49561, 2420, 34520, 62460, 20979, 45647, 5833, 40476, 26080, 52530, 1905, +32567, 64904, 16634, 44558, 28728, 5763, 59269, 36220, 20260, 54055, 8521, +33514, 45990, 21118, 63828, 2755, 38765, 26325, 48304, 12365, 55765, 25404, +41284, 2211, 59683, 17451, 34617, 51578, 13520, 30141, 64478, 7306, 44910, +28072, 13420, 52495, 35584, 17859, 62189, 4040, 48230, 26742, 40369, 7509, +64583, 21268, 39105, 10213, 54210, 22333, 38860, 4286, 57394, 33632, 17313, +50072, 7187, 32560, 59246, 14021, 45774, 28015, 736, 61170, 38074, 15749, +31549, 54466, 4805, 43359, 24127, 57742, 12828, 33722, 52662, 1112, 42742, +24534, 62436, 10128, 40313, 23146, 48148, 13545, 56521, 28508, 5809, 50131, +37760, 18629, 59602, 9362, 46641, 20525, 33804, 63906, 3325, 41328, 22251, +52196, 13968, 32697, 60839, 2447, 42785, 25462, 56273, 12276, 40399, 23367, +52031, 1697, 31516, 64547, 16162, 44596, 27610, 6433, 52730, 36794, 19725, +62688, 9236, 33655, 50250, 13680, 42033, 25364, 63535, 5702, 32704, 52964, +17209, 43616, 10879, 61529, 21213, 32895, 51237, 2922, 46012, 19791, 30635, +62581, 11206, 43696, 25333, 58979, 5305, 36203, 49594, 16105, 29713, 65494, + 8867, 44098, 27530, 12813, 54065, 36761, 20602, 62937, 2518, 35476, 49457, +13071, 30372, 61020, 19373, 42211, 1369, 53189, 31209, 16633, 57131, 38070, + 7996, 30363, 65363, 18055, 48619, 585, 39219, 23417, 53636, 10806, 32647, +63380, 20768, 48250, 8843, 40523, 26429, 54820, 4251, 31367, 63819, 13008, +42031, 24775, 51060, 5326, 34571, 55708, 19266, 42130, 10969, 60735, 21097, +33291, 45382, 663, 63602, 18011, 33371, 46932, 12017, 56398, 17481, 31996, +46204, 4676, 62445, 28560, 15641, 51487, 35929, 557, 64518, 29139, 15414, +50172, 36446, 3795, 57332, 24912, 44924, 14522, 35773, 55940, 4854, 32804, +47387, 17728, 61208, 11494, 40871, 26480, 58867, 5508, 43588, 22243, 50934, +13480, 34764, 55570, 7519, 40610, 24974, 58646, 11467, 48501, 21738, 41816, + 7200, 59868, 24584, 45691, 12775, 33994, 55047, 8753, 42021, 23935, 58797, +12068, 40021, 25670, 60792, 715, 39088, 21323, 54922, 12639, 43801, 27003, +61380, 7124, 31408, 46692, 20359, 63571, 1389, 39752, 22639, 55907, 13785, +34850, 49431, 3070, 30073, 59845, 13622, 42602, 23962, 56021, 581, 31899, +46717, 17311, 63350, 7149, 19416, 42863, 2547, 53731, 30253, 16444, 63751, +37814, 7633, 46336, 25142, 62072, 10555, 30254, 45887, 16593, 60580, 27952, + 3663, 49996, 35770, 20306, 55554, 7516, 42646, 26796, 58193, 15183, 31055, +45368, 2594, 61284, 22241, 38547, 14598, 54865, 30793, 6768, 49540, 37174, +13682, 63363, 23059, 44593, 8795, 34759, 59911, 16944, 31154, 46388, 7580, +53250, 28489, 16770, 63227, 38152, 6218, 29312, 55411, 18562, 41428, 3364, +51759, 29022, 15481, 61951, 37147, 9546, 49762, 28076, 16762, 65104, 36345, + 5765, 53348, 23564, 47524, 15179, 35543, 63082, 3523, 30364, 47912, 17377, +54539, 9354, 30462, 46813, 13624, 62062, 24308, 41017, 2608, 53095, 29302, +15512, 58843, 35437, 11941, 47265, 26701, 54591, 6633, 38887, 24450, 65132, +12259, 43294, 22476, 58150, 5659, 31107, 53406, 20616, 45592, 8306, 33512, +62395, 12835, 42600, 23250, 55332, 2463, 33493, 45904, 18050, 58550, 5197, +38684, 27108, 52308, 12641, 31378, 61178, 7565, 48101, 22125, 40516, 11841, +59949, 24830, 40501, 1908, 56009, 19572, 47580, 30978, 7238, 57849, 36371, +19560, 46831, 10134, 61009, 26233, 40866, 3086, 47983, 23189, 56500, 5886, +38262, 17126, 62116, 31471, 9089, 50615, 35287, 18505, 58029, 3142, 47235, +25931, 40751, 10625, 49708, 22050, 57769, 13759, 34643, 44091, 3470, 60935, +24646, 41003, 13163, 52364, 28686, 8005, 56826, 37214, 17210, 50612, 9975, +33982, 61633, 14038, 42381, 23187, 55810, 3500, 32224, 51453, 15206, 46764, +28641, 833, 61800, 35747, 18073, 51263, 9847, 32430, 56706, 19935, 42481, + 6773, 61067, 22758, 39193, 9662, 54068, 27105, 41015, 4829, 58687, 21910, +40181, 11030, 48459, 24203, 57581, 820, 39417, 21628, 58537, 9902, 42764, +25510, 52537, 14116, 34071, 55706, 2353, 43326, 25444, 60526, 12136, 34790, +47511, 18753, 65444, 1748, 35511, 44189, 21127, 53418, 9049, 32069, 57475, +19261, 43647, 6429, 50980, 29921, 16781, 63562, 37671, 8348, 49391, 27684, +16988, 59206, 37354, 7098, 51363, 20674, 32032, 60794, 2565, 44184, 20376, +34684, 65378, 11532, 42486, 25119, 51244, 1621, 31058, 56834, 13301, 42157, +25713, 53936, 5489, 29827, 58876, 16047, 45652, 34632, 9450, 49153, 21577, +62888, 4420, 33989, 45014, 19615, 55067, 9266, 34007, 43805, 12965, 60892, +23285, 41184, 214, 57545, 28547, 16065, 52701, 35485, 3057, 47331, 23221, +60395, 12308, 40458, 26790, 55020, 1763, 47371, 29823, 15291, 58570, 37406, + 7871, 54299, 28220, 16483, 49963, 38020, 62, 30371, 56220, 13512, 42973, +24462, 58149, 3319, 35554, 51346, 18315, 42391, 6766, 59910, 29547, 15295, +50438, 37582, 5733, 56153, 23012, 44881, 9873, 36192, 63733, 14593, 27997, +50432, 4125, 43491, 23075, 58803, 11265, 37737, 50548, 14895, 31045, 62161, + 5121, 44104, 28258, 16083, 58495, 36784, 2024, 52951, 24192, 42598, 14394, +57947, 21848, 38292, 1254, 54102, 23457, 43895, 14419, 62673, 29292, 2836, +49700, 36614, 17122, 58559, 8292, 30424, 53858, 20637, 39643, 3711, 49430, +23267, 61157, 9525, 41438, 26869, 49148, 7220, 57418, 22049, 41042, 12815, +54189, 25489, 46493, 6217, 41652, 22048, 62659, 13146, 31510, 51964, 7845, +42450, 20874, 63325, 29308, 3004, 53734, 36364, 19765, 49481, 8514, 36211, +65139, 16103, 29734, 52818, 2393, 42810, 23061, 62853, 14545, 33232, 52178, + 3312, 45913, 28224, 16640, 64637, 36586, 1101, 51686, 27446, 16016, 62027, +37821, 4517, 46045, 21929, 53914, 7994, 41999, 27264, 64268, 10845, 49169, +25549, 38799, 2612, 52889, 17545, 34892, 54819, 10605, 42137, 24415, 58040, + 5762, 31032, 52816, 18680, 42977, 9637, 65303, 20571, 33517, 53971, 5136, +45143, 19231, 36087, 58809, 10612, 29579, 51484, 33259, 45952, 21016, 59545, + 8658, 34974, 50220, 15367, 28557, 58337, 156, 42677, 21957, 52864, 5843, +34418, 57022, 19200, 43897, 9139, 37502, 64055, 16429, 29440, 53865, 3337, +34913, 48588, 11493, 64962, 24859, 41103, 8801, 56456, 26937, 39270, 1692, +52823, 18279, 32695, 58533, 4506, 46278, 28783, 15093, 54080, 37159, 2630, +64668, 24619, 44508, 13428, 34288, 57238, 560, 43280, 22143, 50975, 9562, +34066, 57955, 13151, 43184, 23249, 59950, 1434, 32660, 52991, 18300, 45618, + 4611, 32521, 58056, 14257, 44128, 28003, 1844, 52384, 37407, 13078, 57030, +24008, 44960, 6439, 33948, 64718, 20346, 43250, 4953, 55532, 29969, 16529, +49887, 36352, 8084, 60879, 24302, 45296, 328, 41061, 21569, 62542, 11190, +49064, 26532, 40607, 2444, 51289, 19144, 33410, 61940, 11302, 42601, 17130, +50393, 29627, 34, 57507, 36031, 14268, 48335, 24961, 61454, 7261, 40112, +22201, 50743, 13997, 33654, 62618, 892, 45916, 23846, 40565, 15122, 57331, +29069, 3583, 52454, 37959, 16038, 30218, 63099, 8837, 45274, 27711, 14736, +54200, 38110, 2722, 29145, 59418, 14726, 42376, 23752, 53559, 7974, 38409, +21298, 64468, 13452, 49183, 27188, 39485, 2386, 54944, 21951, 39442, 12966, +60777, 27173, 42085, 8666, 49100, 23170, 64758, 4849, 38909, 26679, 48668, +10282, 55425, 18736, 35318, 49985, 4434, 30799, 64526, 16310, 46513, 27549, + 170, 60581, 36279, 20272, 47086, 4936, 54268, 25903, 39149, 11822, 63404, +22335, 42424, 7685, 56977, 25711, 40689, 11823, 48523, 25158, 59922, 3465, +34039, 45198, 15884, 52407, 28809, 433, 65419, 36183, 20027, 50392, 11819, +43768, 26289, 63060, 2899, 32952, 52769, 13893, 43000, 25989, 53718, 8506, +33321, 64056, 19054, 45865, 3240, 31477, 49155, 17529, 62664, 8247, 30951, +45392, 20932, 58248, 6093, 39337, 23389, 51304, 11675, 31420, 62014, 17891, +48162, 2873, 41361, 26123, 62814, 12866, 39244, 22616, 53218, 1828, 35843, +56637, 15062, 30764, 45636, 3700, 64584, 28664, 16186, 49895, 36088, 9377, +53785, 18368, 31748, 58054, 5108, 47517, 29133, 16032, 53073, 36401, 7244, +62690, 23643, 43716, 10290, 50553, 18101, 31313, 64797, 635, 42197, 23914, +53397, 14464, 37546, 57019, 6552, 28656, 50082, 15747, 35731, 63754, 3561, +46073, 27880, 16954, 55516, 38046, 7808, 31637, 48518, 18833, 65156, 10157, +39155, 27186, 56033, 5230, 38273, 21468, 48897, 14149, 61189, 34960, 4355, +44686, 25639, 64871, 12229, 40668, 22775, 52340, 6221, 34433, 63187, 14577, +45190, 27372, 7671, 52245, 34275, 19648, 63379, 9491, 32542, 48320, 21124, +55514, 843, 39073, 23530, 64624, 14162, 47736, 28690, 3341, 58406, 37543, +16511, 49715, 29322, 7358, 53968, 36673, 15762, 60798, 27737, 2417, 49288, +35384, 20067, 55879, 8358, 46434, 25226, 40832, 11750, 61629, 21791, 48911, + 6835, 38889, 27220, 65187, 10939, 49252, 21184, 40759, 6212, 56306, 26687, +40590, 11486, 59832, 20794, 30547, 52014, 4689, 43164, 25054, 65230, 10946, +33731, 46301, 13843, 55105, 23816, 38450, 2141, 59126, 21144, 38400, 11076, +47266, 27189, 63989, 2813, 38358, 21241, 59215, 11296, 48654, 26264, 40043, + 1054, 60378, 34822, 19634, 47008, 9219, 56596, 23055, 41272, 13973, 52799, +33739, 60, 57668, 23522, 45471, 11434, 33734, 60439, 19043, 47953, 6856, +41470, 25919, 54600, 13252, 37351, 57684, 8007, 30926, 49667, 19709, 43192, + 9505, 58196, 29810, 16794, 50237, 35237, 2709, 59952, 23688, 45241, 13192, +38350, 22730, 58331, 6491, 47909, 20428, 33217, 60334, 4686, 45936, 27489, +16510, 64084, 35474, 11994, 49928, 26106, 40228, 2085, 60913, 22384, 48067, +11861, 40483, 25272, 57426, 7904, 33236, 48141, 18170, 64578, 4718, 28870, +60976, 10965, 43857, 25560, 55660, 5371, 36979, 49339, 16898, 33231, 64760, + 8228, 48035, 25559, 39363, 11756, 59143, 23156, 49434, 1356, 32817, 46097, +13711, 60014, 24783, 39111, 6348, 52789, 18726, 31784, 47173, 12267, 59554, +23943, 41933, 5338, 48137, 22458, 64327, 10670, 40249, 25024, 52251, 12123, +39452, 21614, 56471, 5574, 41356, 22745, 52008, 10317, 31194, 60727, 15003, +47664, 25536, 40711, 4655, 65464, 28454, 15936, 49590, 36679, 7786, 54403, +25744, 42796, 12182, 63691, 19769, 36927, 50421, 6733, 30350, 62587, 16749, +46385, 29113, 8809, 59617, 35466, 18029, 50541, 689, 40721, 27040, 58482, +11477, 38972, 23035, 63962, 3154, 48018, 31021, 12294, 57412, 36315, 16376, +50185, 28663, 5915, 59833, 36023, 17336, 46262, 9061, 55675, 26018, 40635, + 4413, 58896, 24901, 38900, 9330, 51941, 19502, 32389, 63818, 4910, 44832, +18780, 36293, 53999, 8495, 29040, 57995, 20138, 42434, 12022, 51677, 30105, + 6235, 63470, 35720, 20095, 49727, 11347, 41889, 26565, 60796, 665, 34337, +50711, 20771, 41442, 10818, 64952, 25447, 48000, 4435, 32148, 61504, 12307, +43601, 25422, 54590, 109, 40706, 23878, 58531, 11199, 45827, 19867, 33000, +62875, 6556, 43429, 24134, 53293, 1474, 38421, 21250, 56935, 11873, 34129, +46966, 17742, 61534, 1068, 38495, 27253, 58234, 9252, 43593, 22257, 53286, +13639, 35209, 55667, 6255, 44150, 28160, 14954, 57275, 37995, 9449, 30518, +58739, 20450, 48349, 1633, 36995, 53336, 15777, 30106, 64382, 5570, 42896, +21559, 51900, 14312, 30128, 62463, 8307, 46450, 23963, 40400, 13665, 56260, +29678, 6015, 38092, 60212, 16366, 29007, 47930, 9901, 56746, 23152, 40777, + 4382, 59547, 30565, 14869, 50391, 37489, 6734, 61051, 24455, 42124, 11993, +56634, 19321, 35035, 50274, 1002, 29535, 55323, 13737, 43018, 23803, 59843, + 5274, 39276, 22098, 55612, 10770, 38535, 27262, 58428, 6922, 49121, 21247, +40998, 11553, 61658, 25002, 48662, 5636, 41503, 22011, 54428, 12319, 33327, +59943, 546, 46507, 24340, 41144, 11111, 58844, 24224, 39522, 3130, 46353, +21377, 60300, 13749, 40509, 26985, 55414, 4258, 38619, 21908, 57782, 13153, +36964, 49967, 7740, 30703, 61891, 11795, 44553, 20640, 31958, 58811, 1498, +42174, 23769, 52465, 13681, 31725, 61614, 5563, 47492, 29281, 15735, 58501, +37211, 1312, 51909, 22788, 43400, 11476, 63057, 26351, 39548, 6807, 52174, +17991, 32268, 57595, 9951, 43141, 21762, 54642, 2294, 32368, 46975, 15794, +60397, 29315, 3877, 50134, 37411, 16744, 61695, 28283, 1823, 38238, 54850, +16229, 30199, 46162, 10649, 60249, 25537, 40811, 6454, 52734, 19000, 32513, +62139, 10935, 43140, 24442, 54666, 188, 40101, 22060, 63231, 10091, 46752, +29326, 16476, 52298, 37271, 4613, 64566, 28731, 16340, 49596, 35395, 814, +56307, 24631, 44783, 13942, 33834, 58912, 2986, 43008, 25283, 54557, 12550, +38829, 22555, 63464, 28, 34189, 51247, 18538, 46458, 9864, 32642, 58011, +17815, 40511, 1482, 50873, 19711, 31662, 63006, 7300, 42320, 26193, 48536, +12181, 61630, 23164, 39775, 5222, 48720, 25166, 55619, 14106, 33481, 45237, + 7131, 57940, 27863, 15763, 52421, 38135, 5030, 29778, 61989, 12938, 49048, +25147, 39101, 6256, 64302, 19190, 30994, 47987, 9493, 55108, 24451, 38767, + 4519, 61971, 34784, 17776, 49822, 1547, 32350, 59488, 15173, 45061, 27573, + 5223, 63611, 36173, 14089, 53582, 27690, 6380, 49188, 37096, 19642, 64727, + 9557, 47809, 27009, 40912, 1672, 54127, 18934, 30445, 62015, 8862, 44454, +28985, 15129, 51960, 37856, 351, 56464, 22341, 43221, 8422, 58847, 32004, +16160, 52198, 37963, 3573, 30699, 62924, 15961, 46314, 27472, 935, 54429, +37979, 15550, 24368, 56720, 2947, 40054, 21451, 52922, 13534, 29912, 61895, + 1838, 41362, 23296, 55156, 13461, 31769, 45130, 3099, 61391, 21664, 38346, +12649, 49088, 26330, 56290, 4335, 41114, 22086, 62745, 14276, 44768, 28433, + 460, 61458, 37014, 15832, 50714, 28368, 8231, 57208, 35376, 20661, 47066, + 1028, 61946, 26697, 41855, 9125, 59379, 25477, 47520, 14192, 34728, 62742, + 3630, 41752, 22540, 51286, 8545, 35422, 56674, 16561, 30471, 46479, 3030, +62134, 23742, 39774, 10234, 55997, 21915, 39529, 295, 58995, 26091, 48816, +11271, 39042, 21295, 55555, 3014, 43405, 26555, 61624, 12599, 38612, 21567, +52813, 4515, 34248, 56657, 14638, 46328, 21663, 39853, 8804, 54391, 25882, +42127, 4457, 62979, 18316, 30935, 53519, 10148, 42331, 24897, 64520, 1033, +35758, 50739, 13359, 32033, 60969, 17722, 43450, 2971, 54331, 22936, 40449, +12007, 60041, 26334, 42951, 1585, 51992, 17592, 32386, 64399, 4273, 46714, +27524, 17007, 54020, 37616, 2289, 56872, 25393, 43056, 9648, 53279, 18209, +31308, 58616, 7595, 43145, 17505, 53212, 30303, 5653, 57468, 36904, 15308, +50833, 22990, 41311, 6819, 57071, 18400, 33258, 47449, 9710, 64026, 25717, +38569, 3535, 54636, 17684, 47946, 29757, 9547, 59659, 36122, 14586, 48559, +24803, 63378, 4136, 32239, 44958, 14339, 54224, 23716, 40521, 7640, 63958, +21355, 39949, 2820, 50879, 33003, 18842, 59977, 8568, 30792, 49160, 18180, +65343, 3776, 40840, 26409, 45760, 10265, 61841, 17713, 32899, 44750, 3006, +55754, 24500, 38663, 10944, 58784, 22884, 47494, 1347, 35861, 60696, 16981, +31921, 48847, 4366, 54653, 19342, 33678, 45374, 1815, 62358, 19172, 33922, +44208, 7865, 51649, 27978, 16540, 63590, 35945, 306, 49609, 28601, 15899, +52920, 36075, 4908, 65086, 23161, 46072, 9334, 36831, 52604, 16233, 31571, +63785, 3558, 42044, 25652, 54556, 13170, 34375, 52291, 32, 43032, 23703, +64948, 13991, 33348, 45124, 3394, 57086, 28429, 16509, 52012, 38163, 7988, +29109, 63681, 19550, 41820, 13340, 52134, 28781, 6929, 63034, 36488, 17593, +48347, 9876, 54967, 22853, 38577, 975, 64355, 24469, 43581, 9726, 51440, +18859, 33024, 61234, 2269, 44779, 27355, 15931, 55620, 36817, 5070, 50697, +27795, 15344, 65257, 36883, 7424, 48017, 21680, 57068, 10810, 39572, 25979, +54625, 4733, 41566, 21231, 62211, 14359, 31306, 48342, 3276, 55712, 34384, +13659, 46053, 23912, 60078, 559, 39583, 26494, 63816, 12672, 38525, 25083, +53339, 7416, 43197, 21715, 58776, 11912, 40566, 25620, 52846, 6030, 31765, +56481, 12663, 43161, 22807, 64365, 2897, 36609, 50858, 15080, 30614, 45642, + 4907, 59050, 27507, 14820, 38231, 50894, 7703, 31786, 56727, 19369, 42426, +12585, 59155, 34454, 5749, 44451, 22513, 55408, 9416, 41515, 24215, 59948, +12562, 37253, 51014, 6192, 29378, 64206, 19713, 46557, 8507, 31431, 60353, +19525, 46179, 5078, 35204, 52550, 15379, 31235, 60577, 8695, 42208, 23324, +53362, 6711, 34533, 64124, 13377, 42817, 24046, 54222, 5559, 39419, 22075, +58548, 14130, 35541, 51299, 269, 30667, 56753, 17778, 42578, 10763, 64994, +26716, 39221, 2439, 50686, 18329, 31795, 63469, 9815, 46311, 18094, 32498, +57096, 1882, 43512, 23706, 51902, 14752, 33035, 59235, 3612, 44585, 32724, +17495, 58146, 12676, 43284, 26185, 51633, 8680, 30864, 65223, 19132, 41181, + 4058, 56097, 30206, 16987, 50994, 37719, 209, 61403, 23757, 42243, 14872, +56778, 29433, 3787, 50845, 35631, 17625, 62570, 10597, 35426, 50288, 15581, +32747, 56916, 4123, 42902, 25145, 63225, 11640, 33043, 54067, 16874, 37835, +49301, 6474, 28859, 61515, 12989, 43403, 22937, 56533, 5619, 36806, 49920, +14625, 30529, 62388, 8944, 42270, 18362, 48072, 10230, 38337, 27259, 58599, + 7337, 32503, 51524, 16173, 45289, 28904, 6117, 63192, 36923, 18344, 54137, + 9862, 48382, 27032, 41219, 5560, 65106, 17630, 47474, 32265, 8175, 54760, +37288, 11254, 51278, 20293, 32393, 55736, 3994, 46768, 19537, 33022, 63165, +10068, 41793, 17379, 51082, 30634, 7021, 55709, 36344, 19100, 49766, 2079, +32805, 57828, 18193, 46588, 11452, 39555, 27062, 63836, 925, 43881, 21961, +52657, 11345, 32862, 58600, 14855, 44540, 28292, 6090, 52293, 36149, 13964, +60974, 24198, 45352, 7715, 40881, 22773, 64049, 14005, 32831, 48353, 5525, +54941, 24865, 41965, 9658, 65352, 24711, 48584, 13054, 32841, 59702, 1437, +42898, 23231, 61274, 12056, 33596, 46242, 20233, 51744, 2278, 33365, 58366, +17837, 45423, 10896, 30415, 57244, 21151, 48455, 5604, 39359, 26880, 65526, + 9967, 47951, 29765, 15448, 56893, 35321, 6622, 46632, 23923, 55862, 10691, +34370, 44139, 15460, 59682, 29176, 7134, 49955, 35148, 14032, 65198, 22435, +45438, 3950, 34862, 61600, 13386, 48878, 24612, 39027, 2575, 63679, 23232, +45896, 12544, 34211, 55389, 1306, 43434, 25997, 61932, 13693, 31325, 52438, + 5281, 42216, 23499, 57718, 13506, 36520, 50321, 7657, 31738, 62017, 19005, +46109, 2505, 40111, 26967, 55864, 9414, 39714, 18427, 60052, 30988, 5429, +51229, 36157, 10660, 56974, 23243, 45261, 13957, 34966, 62043, 1253, 43882, +21508, 33973, 47707, 11437, 55409, 19644, 36017, 52253, 6345, 28969, 59791, +12706, 47955, 35075, 19039, 62855, 4798, 42539, 26793, 50558, 13014, 37207, +57087, 7147, 28171, 44550, 12830, 64832, 24402, 41013, 8877, 48555, 22114, +58852, 12332, 40010, 25085, 55719, 3520, 32761, 46923, 19313, 58355, 9095, +40906, 26141, 55863, 11514, 44923, 18655, 32021, 57072, 1921, 43044, 24546, +59486, 10887, 39857, 21631, 50878, 7044, 33010, 61523, 14799, 48650, 24577, +38376, 5821, 58833, 18615, 48375, 30289, 9440, 52805, 36567, 18940, 62332, + 1499, 35636, 50119, 15264, 30668, 56910, 4298, 45378, 21067, 30828, 54377, + 2243, 42530, 25001, 61557, 14258, 33307, 51781, 5764, 41683, 26189, 58631, +12919, 31913, 46065, 6492, 54170, 28052, 16814, 63226, 38151, 9988, 30009, +48743, 19521, 60215, 2791, 41371, 24999, 53712, 12686, 40147, 26738, 63381, + 688, 43383, 23142, 51574, 13236, 34004, 60228, 7335, 46462, 23523, 40974, +11791, 64477, 25956, 38986, 5530, 51454, 18697, 31541, 55123, 8768, 45549, +17643, 33634, 57181, 4791, 47515, 28957, 16146, 65265, 35855, 987, 50999, +21586, 45829, 14773, 36752, 61154, 7247, 28963, 52519, 13373, 41881, 24132, +54648, 8323, 33458, 61567, 19850, 47473, 2025, 35663, 65030, 16576, 28612, +47099, 3946, 53226, 27364, 16750, 64000, 35706, 1574, 49621, 28016, 16724, +62061, 38103, 3546, 30111, 48099, 15256, 57159, 24042, 41467, 2202, 54904, +17422, 35926, 51184, 9561, 29917, 62359, 17861, 42685, 4194, 56436, 27036, +38344, 13698, 50056, 29699, 1864, 61165, 37048, 20085, 47274, 10320, 55928, +26832, 41400, 2931, 60285, 24990, 43657, 10154, 54696, 20108, 33373, 46287, + 6427, 60790, 19604, 32648, 53154, 8830, 43186, 24040, 55338, 4235, 40955, +23101, 60068, 11735, 39738, 26850, 54621, 6884, 38714, 21199, 63777, 10809, +29604, 47437, 20683, 54635, 867, 39123, 27045, 60785, 5944, 41848, 22911, +54024, 12453, 34090, 46118, 20604, 63046, 5725, 40748, 23003, 49893, 12399, +30884, 58725, 7533, 46352, 22304, 40142, 11596, 60583, 26900, 43734, 971, +55831, 25391, 39875, 7449, 47289, 22609, 59568, 9894, 39023, 21441, 50836, + 3423, 29445, 64926, 14838, 46093, 27325, 1268, 54387, 38157, 17021, 29925, +64295, 10861, 43717, 24058, 52807, 4492, 32854, 59775, 26187, 41192, 391, +53932, 22705, 39041, 12097, 65409, 21311, 48583, 3381, 39750, 22940, 56780, +14278, 32929, 46031, 803, 60642, 24310, 39161, 13445, 53273, 21499, 38472, + 2413, 59310, 29665, 16121, 49699, 35480, 6770, 63928, 23158, 44156, 13974, +37572, 58879, 3031, 28726, 53781, 20970, 45693, 4812, 33687, 65256, 16731, +44000, 28684, 9599, 61464, 37394, 21056, 52811, 4353, 42779, 25885, 55761, +12618, 38544, 21163, 61311, 7504, 40409, 26630, 50708, 2232, 30480, 63146, +16953, 46424, 29013, 4311, 54298, 35349, 18799, 57584, 1322, 47004, 26449, +39283, 10889, 59985, 19337, 32255, 52189, 2286, 45020, 17849, 37070, 58790, + 7389, 29029, 46818, 16747, 55478, 27739, 5131, 50800, 37586, 14435, 63474, +28097, 7102, 49402, 37533, 20824, 62239, 3306, 43106, 17190, 52373, 30068, + 8476, 56465, 35558, 20526, 46305, 516, 62866, 25930, 39710, 12628, 49342, +23116, 61786, 2756, 39918, 21861, 49066, 9586, 62740, 26890, 38934, 236, +55509, 18872, 37395, 51180, 10311, 29066, 56181, 20631, 44006, 7012, 34673, +59939, 13859, 49076, 21962, 40623, 8697, 62792, 29303, 16843, 49565, 36706, + 3200, 55987, 21484, 45984, 15275, 30679, 64837, 860, 47411, 27881, 16442, +53874, 35531, 5041, 59166, 24354, 42859, 11297, 52264, 19954, 35585, 65050, + 521, 28830, 49630, 15088, 42521, 25733, 62795, 3345, 30241, 52643, 16028, +47715, 28101, 7763, 56575, 36471, 17106, 63601, 2596, 31643, 50384, 13644, +42574, 23894, 57471, 271, 40890, 22236, 52444, 9597, 31012, 54925, 15035, +41459, 22123, 64031, 3698, 33360, 53380, 16717, 46539, 29789, 727, 56474, +36070, 14922, 50394, 28289, 6584, 63116, 38112, 14363, 30923, 54637, 10834, +43149, 23996, 64685, 2782, 38517, 21766, 51321, 7281, 34179, 60952, 14806, +46630, 28040, 5980, 53783, 35274, 18988, 63107, 12201, 45581, 26989, 40078, + 2631, 52911, 20154, 32882, 64066, 11633, 41968, 24159, 54957, 4534, 39664, +22308, 57885, 11851, 47821, 26323, 40506, 7216, 60694, 18882, 35374, 48405, +10624, 65125, 17223, 35453, 50190, 4923, 29462, 57686, 19149, 45737, 10520, +34338, 63960, 20364, 48211, 3661, 36257, 51142, 15095, 29636, 58141, 115, +42653, 22615, 52401, 8761, 33664, 56816, 16082, 45414, 29341, 6277, 61169, +35513, 20038, 46900, 9918, 55947, 18217, 31407, 44115, 3749, 57362, 28200, +16950, 51472, 38068, 2118, 30386, 58840, 17429, 43738, 7256, 61350, 34895, +14012, 48043, 25467, 62323, 1550, 38879, 21394, 52452, 13310, 34309, 57899, + 7985, 41572, 25056, 54496, 10522, 40061, 23172, 56736, 4132, 47625, 19096, +32685, 62650, 361, 44196, 28322, 16238, 51961, 37503, 9839, 58001, 23511, +41578, 6294, 51838, 30612, 14473, 61163, 37753, 8496, 44809, 23779, 56904, +13379, 31118, 53143, 7218, 43423, 23401, 58405, 13791, 32821, 44993, 5332, +62825, 22430, 38427, 12838, 48259, 25548, 57119, 1026, 39804, 23293, 48551, +12270, 64951, 21589, 41321, 3493, 54914, 24956, 43472, 14389, 57713, 29147, + 6462, 50064, 36143, 12289, 62159, 28654, 16755, 49618, 36838, 3974, 63693, +22674, 41766, 13074, 51921, 29643, 1295, 58568, 36292, 16531, 49637, 28786, +10396, 62281, 36888, 18798, 50574, 482, 43119, 25617, 61282, 13640, 33279, +51544, 2859, 42135, 24634, 58750, 7930, 33733, 48701, 19284, 62657, 11277, +33212, 46647, 17332, 56829, 1775, 39498, 26234, 59061, 9223, 31700, 53709, +14409, 43397, 25896, 55177, 2145, 34377, 65436, 13882, 42738, 23683, 53469, + 6197, 38556, 21278, 64192, 12133, 48913, 31054, 16234, 53345, 35889, 1853, +61166, 25479, 45429, 13906, 31525, 55778, 5398, 44155, 27953, 16346, 60076, +35933, 9544, 48881, 25707, 56194, 2406, 40367, 21919, 46711, 12896, 63659, +17826, 44893, 11211, 33276, 61583, 4887, 42669, 26353, 54571, 13284, 33815, +46674, 6557, 59777, 24853, 38763, 10328, 52555, 18921, 33941, 62491, 4677, +43014, 24280, 55464, 9407, 40945, 22922, 60956, 12819, 31648, 46308, 1133, +57434, 25067, 39904, 10993, 51606, 18886, 30973, 61100, 8716, 44025, 27620, +15490, 59193, 37652, 46, 50232, 27618, 14527, 54951, 38122, 6726, 28797, +64170, 13761, 49087, 24140, 41341, 3915, 58903, 23237, 48655, 9518, 36647, +56908, 15941, 33996, 51688, 6966, 43244, 26260, 64916, 9804, 41540, 22147, +51303, 14781, 34722, 62114, 4852, 47762, 23185, 41497, 14785, 63266, 30327, + 5852, 54130, 35405, 18888, 50355, 9113, 34368, 64361, 15391, 45079, 28801, + 590, 57043, 34880, 19392, 47041, 8612, 58754, 25607, 41726, 12014, 54994, +25352, 40070, 5073, 59462, 18512, 31963, 44249, 10569, 53386, 18236, 33545, +60374, 4022, 45615, 28035, 16090, 58516, 38044, 6178, 30461, 54474, 20253, +42023, 11908, 48298, 25740, 60975, 5087, 32604, 44829, 17510, 64076, 1422, +32052, 52323, 16208, 44815, 27742, 4494, 56807, 35471, 16125, 51270, 27486, + 6270, 58893, 35222, 11959, 48920, 25932, 59784, 7164, 34458, 43959, 12535, +55024, 23728, 40900, 8497, 63191, 22082, 45161, 13425, 36702, 50933, 6830, +30467, 57806, 13052, 41753, 22369, 51891, 5963, 34852, 58461, 18850, 46729, +11365, 40227, 25969, 61121, 4658, 32208, 54115, 20585, 46670, 10945, 40252, +23382, 60316, 5419, 46825, 29599, 16551, 65085, 35925, 8819, 46552, 25535, +61221, 2452, 33384, 45754, 13397, 58201, 24895, 39266, 8102, 48986, 22325, +59266, 11906, 39743, 25483, 61991, 4252, 32028, 53004, 16887, 45635, 28959, + 1520, 59823, 37073, 20299, 48310, 8443, 54255, 26835, 41842, 12292, 62251, +22997, 40130, 3901, 58333, 29438, 16364, 51471, 36949, 1297, 48262, 23884, +60073, 7611, 38501, 26033, 56723, 9709, 47786, 17185, 31270, 59519, 853, +43651, 25753, 50624, 14320, 34177, 64505, 5476, 42619, 22993, 52420, 13750, +32519, 56339, 383, 44689, 23796, 40273, 9242, 59221, 21844, 40138, 13653, +51431, 30637, 1410, 56098, 38026, 15724, 29221, 60886, 7138, 43024, 22929, +53598, 11622, 33803, 64684, 18382, 46090, 4621, 39440, 26347, 59208, 11405, +43355, 23572, 53393, 1804, 38857, 22184, 62602, 5731, 36959, 50036, 15288, +29553, 64938, 8282, 47147, 27542, 12717, 53732, 35814, 20960, 56733, 9553, +42469, 23086, 50740, 3941, 32859, 58030, 18408, 41971, 10659, 49133, 27106, +63008, 5308, 32191, 46156, 16894, 60874, 28391, 2367, 49516, 37492, 13826, +63978, 24814, 44722, 7970, 34908, 57234, 17766, 48247, 11342, 34611, 60788, + 3471, 43506, 21749, 55902, 13658, 33016, 46542, 1031, 58707, 28046, 16842, +49406, 37064, 3426, 62465, 22072, 41976, 12165, 51505, 29516, 496, 65515, +36763, 18414, 48571, 10740, 55308, 27227, 40582, 6772, 59998, 18597, 33203, +45723, 10395, 58612, 26352, 39006, 5767, 53144, 30442, 15109, 60169, 36225, + 8884, 46619, 22525, 64250, 785, 32701, 44934, 19457, 53352, 6038, 32108, +58053, 14358, 47498, 24422, 39436, 5491, 60528, 23737, 48751, 12210, 40769, +21864, 65524, 3305, 31980, 47095, 20567, 54108, 8361, 32012, 57973, 16447, +47302, 28755, 5784, 64796, 34860, 17982, 53337, 9754, 44240, 35070, 17076, +55457, 3735, 42117, 25970, 60284, 7564, 34998, 51232, 19818, 46631, 11828, +37569, 63515, 3163, 28892, 50609, 20845, 41268, 10140, 52306, 18104, 31875, +61093, 3568, 47641, 25429, 41006, 10462, 57787, 24935, 40349, 4593, 46821, +21318, 62812, 11197, 40079, 26577, 48442, 6988, 58163, 19387, 34927, 53292, + 8869, 42309, 24182, 61782, 4203, 40682, 21291, 51846, 14147, 35759, 59118, + 7129, 29417, 51220, 5648, 47415, 25508, 55571, 13938, 39301, 24095, 59133, + 1174, 49193, 22020, 40351, 12475, 64152, 26405, 49479, 2248, 31147, 44108, +15064, 57974, 27844, 7455, 49833, 36338, 15700, 64439, 28987, 4255, 50524, +36637, 14606, 55295, 23545, 43878, 6274, 34843, 64799, 17189, 48659, 2325, +37766, 55891, 14247, 29855, 53514, 5673, 45016, 20599, 30867, 62533, 9948, +46984, 19914, 32614, 57647, 1572, 44772, 34828, 18716, 54578, 10897, 32504, +64567, 20619, 44869, 599, 29584, 61776, 13633, 48443, 23901, 38721, 2803, +53653, 17725, 33443, 59473, 7914, 44450, 28378, 13594, 53372, 36159, 88, +57847, 27508, 12199, 49529, 37744, 20734, 61575, 2845, 42566, 26376, 52488, +10357, 35019, 60404, 18181, 43202, 4340, 53745, 27144, 40757, 14082, 65002, +31426, 1861, 50075, 35556, 14056, 61245, 23178, 47213, 2543, 37698, 64284, +15136, 28932, 51753, 7932, 41659, 24718, 55558, 11362, 33744, 48065, 17458, +64611, 2009, 33342, 44721, 13786, 57198, 23265, 39616, 8098, 54729, 25709, +49037, 11617, 40361, 21825, 59609, 6359, 47948, 30169, 14724, 65243, 37310, + 380, 46845, 23733, 54444, 12913, 40801, 22339, 63830, 2125, 29779, 45280, +15670, 61350, 28743, 4077, 51749, 37883, 15402, 30930, 58518, 1553, 48648, +28235, 16552, 62407, 37754, 3669, 53819, 25531, 47053, 13891, 33397, 64562, + 1721, 41935, 22757, 55674, 8799, 37257, 50030, 15560, 28908, 64193, 755, +43940, 27906, 16513, 53024, 36624, 7525, 56476, 27397, 14228, 49653, 37874, + 4212, 59334, 23830, 43082, 11361, 55920, 18034, 30290, 51473, 6136, 34656, +63514, 18970, 44361, 2140, 36627, 54732, 15750, 29402, 46880, 5793, 60915, +25797, 41814, 10583, 51564, 18323, 35477, 63264, 6012, 30212, 46157, 15248, +56510, 29237, 477, 49984, 35306, 19347, 54926, 8410, 42336, 25971, 65220, + 9877, 40525, 22052, 55114, 14004, 45034, 30981, 3202, 63424, 36592, 20693, +51779, 7288, 41411, 22891, 60584, 10329, 31951, 54584, 19447, 45779, 3146, +34781, 62620, 11352, 48823, 28602, 16297, 61027, 35005, 8029, 48079, 25689, +63261, 3521, 34499, 44406, 16976, 53214, 27450, 8963, 58991, 38224, 17235, +31675, 48614, 2688, 61983, 26416, 39556, 9447, 49075, 23441, 57733, 13834, +34529, 47025, 3275, 63844, 18095, 32783, 51016, 8692, 43042, 25955, 57631, +11925, 39011, 21808, 52428, 1116, 34767, 60459, 18464, 44471, 4973, 32955, +63442, 17124, 46607, 245, 36271, 52908, 15901, 29697, 64163, 8928, 46512, +23928, 38475, 2829, 55535, 22274, 43606, 14311, 58255, 30937, 8939, 50424, +35365, 19565, 59535, 4552, 31591, 47158, 21031, 54173, 1675, 40554, 26681, +65158, 14509, 31923, 48840, 6941, 54178, 25218, 40870, 11108, 63578, 18889, +34653, 52751, 5924, 42187, 24826, 54736, 14227, 30184, 59770, 6585, 46098, +27883, 16440, 53611, 35101, 8879, 60741, 24978, 45690, 2566, 35469, 52683, +14738, 29588, 63656, 4629, 47544, 23811, 40780, 11764, 62625, 19643, 33649, +51127, 2376, 44819, 27664, 16089, 58704, 35691, 10987, 54952, 25541, 41143, + 8205, 51066, 17699, 36342, 64723, 1985, 28790, 45939, 18967, 56308, 8227, +39065, 26929, 54518, 11389, 43385, 22987, 59417, 6122, 35129, 51893, 14023, +44030, 27381, 1707, 60479, 37237, 19880, 45924, 11161, 56013, 26040, 40270, + 2233, 62977, 20993, 32294, 51701, 10894, 45739, 18620, 30642, 64936, 682, +44511, 27772, 16117, 52477, 35141, 5452, 59857, 19076, 31693, 47782, 7866, +57834, 25398, 39136, 11843, 54752, 21480, 43785, 537, 63297, 30391, 14755, +51385, 35288, 9341, 56574, 23557, 44808, 2485, 32954, 60627, 14492, 43036, +23099, 50478, 17, 30870, 65216, 18194, 47767, 11569, 39057, 27057, 57499, + 1591, 47737, 30893, 16030, 61024, 36769, 22150, 64701, 2703, 31756, 51015, +18295, 44862, 9851, 32165, 62243, 15055, 44086, 28057, 5201, 55779, 36286, +19881, 47699, 11253, 60324, 20936, 30349, 45216, 262, 54984, 24982, 39703, +10923, 57906, 20040, 32107, 47528, 1937, 62144, 19782, 31757, 45322, 10284, +56695, 21300, 32244, 44435, 7262, 63033, 18311, 32259, 47483, 11801, 56368, +25485, 39505, 2857, 60317, 17935, 30400, 53556, 8828, 47704, 28414, 15479, +59393, 37567, 5378, 51866, 25902, 42410, 11674, 53817, 19918, 32337, 57286, + 5790, 42781, 23319, 61091, 11517, 30353, 48156, 20726, 56103, 3855, 40530, +25281, 65177, 15840, 33486, 51947, 6487, 44700, 28921, 15226, 59139, 34883, + 8287, 49525, 19973, 32341, 56366, 5569, 40176, 25403, 62044, 11643, 38662, +21849, 51662, 6360, 36700, 56949, 16754, 28837, 45192, 7780, 54131, 25149, +39647, 11634, 56225, 20983, 31905, 48557, 1262, 63232, 20028, 31465, 45005, + 5420, 57654, 24680, 40718, 9351, 51814, 19020, 30191, 61396, 3773, 46200, +28186, 15438, 63328, 35280, 2363, 46494, 23887, 57693, 12325, 39431, 22903, +53500, 7854, 32456, 60893, 15902, 44474, 28421, 3896, 57922, 37755, 19470, +52905, 10412, 35152, 48620, 20485, 56899, 6623, 42010, 26634, 65458, 10274, +46557, 19980, 33868, 56299, 6203, 44432, 19473, 33763, 59380, 10705, 42134, +23356, 54433, 7910, 38851, 27081, 61730, 11898, 43702, 21625, 52888, 4279, +32768, 57057, 18259, 45659, 9800, 31817, 62994, 14927, 44683, 28298, 1887, +61427, 36758, 16952, 53736, 29496, 9284, 49174, 37858, 20515, 61997, 1059, +46618, 25938, 40341, 11101, 57524, 20469, 31338, 48241, 7598, 65407, 23726, +40791, 13105, 55185, 22534, 38498, 2422, 57300, 27201, 47624, 13936, 33426, +59117, 4436, 44430, 27657, 16930, 64261, 37540, 10603, 47330, 22315, 57852, + 5513, 32525, 45332, 15696, 61477, 29058, 4373, 50534, 35993, 17558, 56207, +10081, 47124, 28967, 15457, 61703, 36044, 2340, 53504, 17904, 37575, 49472, + 8199, 28730, 59330, 16666, 44221, 27676, 6542, 57425, 37150, 19431, 46673, + 2131, 55245, 27050, 39009, 13145, 57319, 21643, 48314, 4780, 32227, 65487, +14013, 45667, 27292, 5925, 53184, 35514, 13723, 56523, 21739, 45065, 1278, +33105, 49648, 19834, 60326, 7566, 40709, 25829, 54577, 12724, 39826, 21886, +59632, 3892, 33511, 47960, 13894, 62472, 23947, 41775, 7093, 54420, 20128, +31001, 48851, 10996, 59179, 26124, 41395, 6753, 48670, 24288, 55939, 11738, +41018, 21416, 59317, 5609, 40770, 26744, 52613, 11492, 38453, 21190, 64539, + 716, 43941, 26708, 54711, 11263, 41593, 17090, 60628, 29612, 8735, 50255, +36351, 17244, 57623, 5250, 46273, 25534, 40982, 12622, 61926, 23790, 38944, + 3087, 48553, 22445, 57780, 9941, 30034, 45109, 18818, 64492, 1785, 32417, +50892, 12978, 43059, 24067, 59200, 3866, 40707, 21649, 50951, 12256, 31686, +61522, 20569, 42217, 8064, 56615, 31234, 15666, 50793, 36484, 374, 55265, +25704, 42830, 9587, 60759, 18440, 36928, 52389, 5290, 30660, 48608, 18789, +62287, 3047, 33254, 45309, 20828, 59515, 9298, 41008, 26060, 53163, 13189, +36480, 61083, 4390, 30332, 47757, 17710, 63235, 939, 31163, 44408, 15407, +55449, 27948, 9010, 38217, 64063, 16622, 30794, 52725, 4776, 44267, 28141, +15294, 59163, 37882, 8504, 30065, 49014, 17792, 61032, 4374, 40592, 26828, +53416, 14041, 33981, 58360, 8776, 42184, 24576, 55680, 12809, 40577, 22706, +62427, 1404, 33818, 45758, 15185, 60231, 28623, 5997, 50051, 35180, 16850, +53643, 27586, 5119, 59198, 37493, 16940, 49460, 28888, 7693, 64420, 36164, +17683, 49407, 3852, 34285, 59491, 13370, 40935, 25589, 55360, 4993, 31911, +46555, 17443, 63141, 8313, 38744, 25879, 54910, 11945, 43640, 53388, 20441, +34765, 56201, 8274, 42080, 24813, 58562, 3979, 37358, 53262, 16519, 29242, +48781, 8515, 62715, 24648, 38951, 2983, 50907, 18145, 35918, 63239, 8927, +33491, 47275, 18559, 60674, 5413, 34281, 44294, 15250, 52252, 27621, 8030, +59633, 37349, 14557, 49787, 27479, 4706, 57938, 36507, 20438, 52338, 1319, +42178, 22747, 65048, 10443, 33552, 51141, 15672, 44438, 27882, 7034, 62260, +36786, 21104, 49676, 3462, 33940, 63603, 13350, 47292, 23555, 39819, 2096, +60261, 34789, 17930, 52556, 9945, 45472, 34986, 19868, 63847, 1188, 32353, +51614, 14332, 46057, 29556, 9093, 57097, 35780, 19657, 47031, 2149, 62432, +23067, 41067, 11554, 55276, 25868, 40316, 1120, 64804, 21853, 46699, 13175, +32275, 54746, 2696, 43619, 24734, 60335, 12591, 39192, 21604, 63882, 196, +32207, 48463, 19048, 58302, 5791, 34307, 44613, 17121, 59663, 7104, 34665, +43991, 12099, 53034, 28223, 16514, 62419, 35548, 707, 46587, 23001, 55993, +13097, 34581, 43798, 5756, 52960, 29298, 16696, 60184, 36409, 9318, 50358, +27014, 43527, 3019, 62035, 19958, 36736, 50504, 10010, 29926, 55405, 20579, +46338, 7584, 33051, 63129, 18241, 44640, 693, 40046, 25769, 55693, 13729, +38842, 21926, 54054, 2811, 36453, 51660, 12753, 30201, 61404, 17361, 46729, + 48, 31712, 63502, 19219, 46110, 5144, 32307, 49528, 18582, 59092, 2328, +40067, 26329, 48688, 12884, 60910, 25644, 40919, 5719, 51868, 19487, 37084, +58281, 8416, 30836, 51458, 15358, 45187, 28132, 4869, 64732, 35098, 14508, +54324, 28536, 7704, 50035, 36753, 17136, 60408, 3805, 43896, 28821, 16183, +52030, 37331, 89, 59406, 25360, 43001, 10972, 52796, 21167, 40208, 6783, +63705, 26092, 38579, 9933, 54667, 18619, 35966, 51157, 3251, 30292, 60089, +14110, 42715, 24512, 54432, 2005, 39621, 26419, 48908, 11018, 58232, 20677, +32443, 44325, 259, 64353, 19215, 32746, 51148, 6824, 43378, 26147, 55549, +10849, 32869, 65315, 20058, 45266, 1023, 35202, 54798, 13810, 42729, 25284, +64212, 5823, 41610, 23345, 52449, 12059, 32205, 60031, 6472, 44038, 27634, +16698, 52593, 37193, 583, 61331, 28501, 16806, 49578, 37037, 7484, 64115, +24719, 43767, 12890, 30956, 62255, 5036, 43739, 27891, 16326, 52027, 36773, + 403, 65210, 25626, 45985, 9577, 30410, 55606, 16273, 44737, 27848, 2359, +60015, 37196, 13311, 45632, 24380, 57010, 3085, 39189, 21000, 65437, 13660, +38280, 27115, 53498, 1451, 36491, 62782, 14834, 31086, 47400, 7542, 61287, +24322, 40599, 13354, 56849, 24285, 38494, 5855, 51641, 21063, 34278, 63635, + 2762, 45582, 20195, 33876, 55402, 11615, 39761, 21692, 59261, 637, 33893, +53584, 15778, 45766, 28978, 9040, 59919, 36589, 17326, 52119, 4997, 35388, +47361, 14841, 60587, 25917, 38946, 7614, 54241, 21214, 38786, 10385, 64187, +27094, 43782, 1470, 54814, 17340, 36789, 49347, 6343, 28221, 65097, 20461, +44927, 13039, 31392, 57546, 4239, 48541, 24687, 39367, 12564, 64508, 22326, +41632, 7438, 54640, 25051, 40185, 12050, 57188, 22789, 48370, 118, 34904, +62607, 16907, 31649, 51221, 5842, 45599, 20965, 33338, 58233, 9357, 49208, +20320, 33951, 46789, 3713, 61388, 19485, 33288, 45940, 7458, 57608, 27303, +12455, 50909, 35512, 18905, 64494, 290, 46402, 25570, 41861, 12117, 55591, +23839, 38856, 6488, 62016, 19375, 36569, 50333, 2474, 31888, 64179, 17455, +45364, 6987, 36628, 52135, 16281, 29585, 56334, 3965, 42841, 23926, 63946, +13561, 37458, 49293, 8704, 31956, 56012, 19432, 42985, 1187, 60116, 25089, +41790, 9514, 54707, 21842, 41137, 15341, 57759, 29465, 6252, 51319, 36996, +18895, 62101, 10995, 43021, 23106, 52087, 3161, 32378, 58695, 17437, 42466, + 5933, 23459, 47801, 573, 32435, 61319, 17250, 46393, 11519, 31657, 65236, +20606, 46044, 1551, 41383, 25959, 57344, 9356, 40764, 21735, 52907, 13243, +29284, 56434, 6300, 42668, 24268, 53446, 13760, 30031, 64625, 3385, 46190, +35297, 17024, 53405, 28756, 629, 63495, 38207, 16161, 30654, 47944, 7768, +61845, 25592, 39160, 12377, 48547, 23976, 56653, 5827, 41182, 22002, 60870, + 831, 33586, 53112, 18475, 42648, 10107, 58350, 20344, 31679, 54143, 6383, +45685, 17249, 31384, 62478, 8391, 41451, 24713, 50270, 4057, 32462, 58452, +15113, 44097, 27778, 7663, 54589, 36825, 18047, 62968, 5081, 42585, 26591, +53586, 14279, 31915, 58257, 6831, 48040, 29505, 16596, 51758, 35609, 7627, +59454, 27474, 16748, 49283, 37319, 9898, 57961, 23182, 45824, 6779, 33312, +55290, 16059, 44445, 35965, 9775, 61450, 24602, 42083, 3245, 54995, 18541, +30438, 47000, 10195, 65342, 23053, 39946, 4368, 56325, 25618, 43269, 10492, +52249, 18539, 29386, 59028, 7324, 47547, 36020, 19070, 64910, 1041, 42912, +25441, 55313, 12964, 38393, 21339, 56730, 5836, 34256, 47533, 18324, 64671, + 1724, 34788, 43824, 14200, 59556, 31299, 4367, 47902, 22733, 61057, 12741, +32416, 46583, 5655, 63980, 24317, 41614, 11556, 58752, 26041, 40702, 7127, +50610, 20280, 36144, 57712, 9718, 29529, 53370, 14666, 44397, 28023, 6900, +56335, 36272, 14391, 44573, 24169, 65348, 9084, 39089, 22200, 55363, 2998, +31091, 47363, 13809, 63892, 24842, 39410, 466, 48725, 22094, 55710, 12043, +40752, 24177, 58076, 3162, 43724, 19955, 52837, 30821, 10028, 64213, 34584, +18623, 50498, 6829, 32781, 55878, 14571, 43750, 23538, 61045, 3417, 38286, +26594, 49061, 12807, 57888, 22324, 41224, 1224, 61801, 25985, 46968, 13226, +34459, 53812, 6682, 39681, 21361, 62686, 11992, 34058, 46889, 17386, 59674, + 5698, 39277, 26413, 54285, 12845, 41942, 25200, 60122, 4168, 39494, 24320, +53035, 12423, 39322, 22007, 58119, 5091, 42440, 25973, 51443, 12567, 32214, +61613, 3780, 39755, 21946, 56209, 14565, 33791, 50866, 1639, 40518, 22596, +63486, 15063, 31879, 47183, 7781, 58278, 24116, 40774, 10702, 56312, 19306, +32081, 46654, 2537, 54955, 18062, 34675, 48218, 10429, 58795, 20938, 30830, +45703, 7905, 56766, 23788, 40268, 12396, 58556, 21599, 39574, 6512, 51939, +32024, 17112, 63217, 35688, 8601, 47668, 22799, 55102, 11724, 38265, 27271, +48083, 6082, 59748, 21843, 43343, 10024, 50533, 29272, 16860, 57706, 35598, + 3898, 49611, 20193, 32034, 54168, 2200, 43444, 17790, 62090, 31877, 7630, +49399, 37066, 17439, 58542, 10355, 42819, 25420, 52623, 6437, 31146, 63241, +13424, 42649, 22713, 51500, 7554, 32159, 64856, 20090, 42359, 2606, 53766, +32501, 21012, 62640, 10190, 41597, 23362, 57180, 153, 33562, 47871, 14162, +58635, 24808, 41297, 5887, 51591, 19618, 32359, 62056, 10283, 41605, 18851, +54317, 33225, 2930, 50377, 36955, 17842, 61318, 8616, 44299, 34604, 17236, +59210, 1204, 45456, 29404, 14754, 53083, 36779, 3998, 63550, 26809, 44233, +14436, 36750, 52732, 7629, 29583, 55785, 13546, 41910, 23972, 65063, 2527, +39929, 17221, 52469, 28952, 10610, 56988, 37782, 14877, 50115, 27454, 1476, +62593, 38123, 14368, 32184, 48110, 4282, 55768, 24050, 39662, 10250, 60003, +18796, 33110, 51831, 3409, 43380, 23295, 59062, 9998, 29620, 46990, 13467, +55228, 24207, 39905, 4553, 58839, 26362, 48775, 10044, 40194, 22064, 61211, +12693, 35626, 50544, 2724, 29047, 58596, 16539, 45764, 27895, 7026, 65041, +35822, 18439, 51019, 11513, 39619, 27263, 63434, 2815, 35109, 53588, 12703, +45524, 24275, 41479, 876, 60183, 28716, 15156, 50210, 35863, 7373, 64016, +25165, 40529, 11385, 51618, 21642, 38571, 9383, 54417, 27225, 43499, 5019, +58202, 23153, 40651, 10163, 55136, 29939, 15829, 51490, 35446, 3396, 64227, +23332, 45869, 14448, 37229, 59428, 1012, 30716, 50138, 17740, 41477, 10766, +58595, 25613, 39841, 7451, 56188, 21475, 48281, 13433, 33469, 58526, 3960, +41607, 22696, 52898, 13466, 33396, 59173, 2410, 44417, 28113, 16406, 54611, +37123, 7890, 47167, 25439, 57729, 12489, 39348, 22612, 51388, 3051, 34717, +65340, 13670, 42037, 23930, 50661, 350, 34972, 56323, 18251, 43955, 11264, +64673, 29984, 16637, 53445, 36858, 2926, 48016, 24309, 60157, 10768, 32383, +44201, 19047, 51700, 725, 39960, 25323, 63694, 12793, 45185, 27996, 3125, +61810, 37478, 15521, 53558, 28636, 4149, 50257, 35404, 19131, 64496, 1755, +42360, 27275, 51982, 13990, 30315, 62685, 3848, 46653, 29136, 12652, 53284, +36584, 20762, 60033, 1462, 48797, 26760, 41588, 13482, 52577, 30878, 8333, +61571, 35964, 20719, 49354, 2521, 32132, 62188, 16074, 44369, 27374, 10257, +57497, 37258, 20766, 51359, 4195, 42155, 26477, 62946, 11707, 40959, 23071, +53077, 8425, 31479, 58483, 16659, 45861, 27354, 7299, 55731, 35974, 16986, +51569, 27939, 8825, 57903, 36254, 16933, 49838, 28245, 1385, 62026, 37917, +15562, 29482, 54483, 3988, 45849, 27762, 16243, 64298, 38079, 2119, 32983, +48982, 20003, 62268, 12330, 34139, 46917, 1006, 51312, 19814, 33138, 59648, + 6821, 45482, 28937, 16227, 57624, 35597, 9379, 53361, 21226, 42586, 6505, +62670, 29692, 16373, 51603, 36523, 8693, 62136, 27376, 16231, 49432, 37690, + 1265, 57117, 23850, 44906, 12598, 39938, 25765, 62671, 5332, 38875, 21322, +53379, 9121, 33037, 64530, 16152, 45993, 28407, 5114, 55510, 37200, 20149, +50268, 7946, 32829, 65179, 14890, 43532, 24911, 55861, 630, 41512, 22949, +51889, 9231, 31579, 64013, 20185, 45470, 2604, 33477, 57245, 18187, 46852, + 8733, 34549, 62164, 18076, 45679, 1835, 35634, 63436, 16135, 31004, 53974, + 8769, 46135, 23311, 41509, 15162, 58606, 29421, 7027, 49647, 36197, 10632, +60972, 26288, 42888, 13041, 55061, 28707, 3110, 50298, 37518, 15887, 64614, +28914, 4428, 49782, 37464, 13638, 60024, 25210, 44477, 6890, 39926, 24328, +61678, 2082, 49317, 17774, 32539, 44072, 4229, 53899, 29247, 15789, 63704, +36212, 1604, 49355, 27436, 14461, 56391, 38179, 4568, 30847, 61272, 17697, +49306, 794, 40236, 23409, 63972, 14774, 33053, 52061, 4575, 41649, 24881, +54598, 13542, 32313, 64741, 8008, 45162, 27685, 16467, 60118, 37973, 10347, +28912, 54981, 19693, 42822, 74, 65311, 29427, 15238, 50658, 36434, 3817, +56643, 28399, 16394, 50068, 36523, 2097, 60516, 25668, 46492, 10585, 34042, +57358, 13992, 40437, 23536, 50470, 5683, 34060, 56300, 17885, 46649, 11309, +40216, 22642, 63200, 4314, 35309, 49742, 15731, 30422, 56079, 2150, 43432, +25425, 59456, 8925, 29536, 46021, 14299, 63052, 25494, 38758, 4904, 52320, +20453, 31895, 56911, 10607, 47079, 19975, 33518, 61595, 7814, 49269, 32622, +19097, 46208, 10281, 57781, 22390, 40390, 1892, 62089, 26857, 43621, 10424, +50722, 19494, 32117, 59634, 7242, 47239, 21062, 32460, 63864, 4933, 44253, +20814, 35461, 53479, 10014, 28624, 58820, 20064, 43155, 6209, 51937, 29459, +14979, 61712, 35047, 7906, 47917, 24717, 55247, 13739, 34668, 44643, 1225, +63136, 20081, 32413, 51488, 7812, 44657, 28804, 15686, 65353, 35385, 149, +49784, 18263, 30644, 54842, 7412, 41756, 23505, 62663, 14526, 34641, 52825, + 4525, 42132, 23403, 54230, 14086, 32301, 61410, 5207, 43496, 22522, 50330, +14022, 33806, 60889, 7170, 48206, 20760, 34068, 56620, 10360, 45326, 20047, +37520, 55496, 2216, 29784, 45711, 14689, 62451, 41197, 26128, 59513, 12873, +39838, 21520, 51483, 2579, 32883, 63254, 14884, 44995, 28024, 7084, 60448, +38017, 16939, 32326, 48658, 4934, 61288, 21156, 32960, 44446, 9670, 52738, +20429, 34734, 62448, 2391, 45175, 28332, 15874, 51551, 36891, 5061, 65443, +25488, 42460, 10814, 55246, 19297, 46518, 29471, 5473, 63868, 36208, 19569, +50670, 10000, 32688, 62736, 19381, 45114, 3728, 33001, 61371, 15907, 45082, +30886, 9706, 56714, 25546, 43261, 5975, 52932, 19102, 33175, 61923, 8808, +40637, 23470, 51747, 5263, 39948, 26173, 56925, 9259, 39920, 22263, 61467, +13225, 46726, 28729, 4795, 55134, 37615, 20445, 59526, 8929, 36871, 50447, +16924, 31013, 55083, 6175, 42555, 22331, 60630, 13795, 33706, 46516, 7969, +56075, 26401, 41123, 12795, 59813, 24533, 48280, 5928, 41264, 22306, 57699, +14950, 33036, 51542, 7536, 41494, 24468, 63586, 11450, 38831, 22412, 58109, + 3631, 48566, 29075, 15242, 59831, 37922, 6901, 50555, 27469, 14245, 55286, +38154, 4879, 30775, 63483, 17694, 48510, 8241, 34845, 54312, 14964, 30117, +60321, 147, 46706, 28128, 15622, 51731, 37176, 3668, 64222, 28564, 14635, +49717, 37495, 1959, 60632, 27320, 15436, 49297, 37568, 4873, 55883, 23974, +43268, 10581, 57196, 18944, 32406, 48130, 7777, 60312, 23602, 40727, 11193, +54978, 21656, 39825, 6444, 56503, 25822, 41871, 9563, 60413, 17325, 29904, +53545, 4134, 42432, 23755, 63410, 13088, 33215, 50901, 1524, 43442, 25498, +60835, 13219, 40075, 21779, 50264, 2237, 31998, 58298, 14746, 45063, 28083, + 5929, 53928, 35402, 17889, 61364, 10816, 47856, 26891, 41819, 2639, 58225, +22297, 48905, 12339, 41322, 27130, 57145, 822, 39734, 21725, 52270, 11844, +33188, 60412, 17526, 44255, 2571, 30033, 57212, 21091, 41760, 10752, 58728, +27111, 38446, 6302, 61152, 17984, 34894, 48024, 11216, 56165, 24235, 40250, + 5112, 49333, 22974, 59395, 11133, 31574, 44157, 15298, 55435, 27858, 5978, +50261, 37266, 18806, 59899, 2852, 33681, 48077, 12109, 64893, 24804, 40385, + 159, 52957, 20160, 31835, 58060, 5311, 45141, 19359, 33895, 62526, 8689, +43998, 27441, 12442, 54083, 35168, 19972, 61171, 913, 33336, 48621, 17118, +55621, 11135, 32708, 46946, 15266, 64373, 29557, 6299, 50055, 36613, 20161, +57645, 11043, 42681, 24848, 50963, 5845, 31470, 62060, 19363, 47234, 11215, +39772, 26472, 53041, 7517, 30648, 58343, 18943, 43174, 3237, 54954, 26307, +39450, 11198, 62258, 21139, 47142, 991, 36954, 51763, 15441, 30284, 57243, + 3277, 43708, 23325, 52186, 6728, 33142, 58195, 21087, 47560, 8048, 40617, +23169, 61640, 12737, 40600, 25092, 46024, 5916, 62824, 18280, 30843, 43966, + 8649, 53387, 29905, 18275, 64119, 899, 45918, 26358, 41993, 13224, 62177, +29165, 2936, 49977, 35625, 18900, 54499, 8117, 43479, 26934, 65250, 11859, +40447, 22741, 52843, 7156, 37170, 57633, 16971, 32563, 47855, 659, 55769, +22355, 41773, 11509, 64820, 26156, 40081, 3584, 51316, 17091, 30686, 58303, + 2500, 43830, 27413, 15186, 64421, 36102, 5889, 53926, 24671, 48957, 11872, +38702, 21469, 60466, 3675, 34858, 53672, 15138, 43894, 28393, 520, 54678, +36757, 17457, 57449, 8011, 30901, 50461, 17267, 41616, 3036, 65184, 31430, +16915, 53624, 36814, 845, 49687, 28377, 16266, 63854, 38031, 5057, 31074, +57403, 15912, 48275, 28137, 9116, 53803, 37119, 18429, 59471, 5676, 41468, +26107, 55644, 9498, 39002, 21411, 61498, 12478, 32968, 51755, 2002, 43295, +24606, 57737, 11046, 39893, 21708, 47825, 458, 59505, 26984, 40392, 10689, +52025, 18973, 31298, 57376, 1852, 45067, 27740, 16092, 62726, 38021, 4452, +29126, 48974, 17273, 64500, 8752, 33729, 47991, 20575, 56874, 6180, 1080, +53659, 36076, 20242, 61590, 8142, 48129, 26425, 39255, 12080, 56983, 22180, +49080, 117, 41792, 25344, 58259, 12695, 45373, 28530, 8794, 54295, 37051, +18302, 63992, 4099, 31457, 50673, 14550, 36505, 57991, 8560, 42258, 24454, +53943, 12439, 39372, 23667, 60647, 1623, 38516, 17353, 51773, 31369, 8110, +57378, 38034, 15084, 28598, 48170, 190, 59562, 24129, 40226, 12903, 54134, +29828, 5247, 50401, 36355, 18810, 63450, 1455, 36265, 49329, 15660, 30246, +59790, 10537, 43691, 26122, 55316, 2440, 38252, 21513, 59148, 14395, 46893, +29454, 990, 51885, 37601, 20698, 65476, 8313, 33295, 49649, 15675, 45743, +28554, 2327, 64132, 35701, 19594, 47366, 10903, 58098, 26365, 39015, 369, +48877, 23836, 63375, 10567, 38955, 20878, 53960, 2996, 38364, 21444, 65096, +12046, 37633, 50456, 865, 28383, 61837, 19706, 44759, 4814, 36029, 56491, +15813, 31750, 45541, 9589, 54645, 20397, 33441, 44126, 459, 64476, 20016, +31253, 51719, 9966, 45152, 19646, 34813, 59383, 1648, 28851, 51682, 20543, +42519, 10078, 56931, 34688, 21316, 44846, 6039, 62423, 19650, 33266, 44043, +11417, 57282, 24627, 39405, 5502, 53993, 18738, 29988, 63047, 7956, 41860, +22473, 52292, 14197, 33473, 65163, 3376, 44638, 27527, 16635, 53098, 37619, + 802, 62724, 24751, 44932, 13504, 31966, 48474, 3015, 64889, 20846, 33748, +45445, 10910, 50874, 18982, 32160, 58425, 5956, 41619, 26164, 55604, 10664, +38491, 19158, 58950, 32086, 4783, 49419, 37469, 11632, 65251, 23289, 41788, + 4114, 52671, 33909, 19201, 59779, 9326, 46472, 23136, 38647, 4832, 64911, +30911, 15831, 50188, 36604, 6645, 63340, 25151, 45259, 10289, 34059, 61538, +18444, 49200, 5632, 30190, 45455, 20904, 62993, 8276, 34548, 53319, 17359, +47191, 3488, 34379, 49344, 14093, 54125, 24898, 41914, 1552, 62597, 28551, +14823, 51790, 37972, 7872, 29782, 64635, 20153, 48061, 768, 36974, 57525, +14159, 29972, 47403, 8472, 61307, 24762, 40096, 13091, 49050, 22444, 56435, + 7766, 32101, 45633, 17294, 62106, 9216, 38643, 27184, 51777, 14688, 31177, +56015, 1859, 47959, 20784, 31666, 58851, 4952, 45840, 17449, 36665, 51741, + 9117, 29146, 63064, 20812, 42069, 2989, 57066, 25665, 39479, 9703, 53678, +18377, 33501, 60861, 21, 45412, 28672, 15163, 59778, 37056, 9927, 54267, +22677, 44367, 2064, 33163, 64851, 13496, 48561, 23628, 41413, 9145, 61675, +30229, 15837, 50043, 35307, 5460, 58902, 23107, 43080, 13037, 55990, 26300, +39641, 6098, 62897, 24855, 41654, 11805, 50746, 17220, 30038, 64237, 4181, +44164, 27718, 15772, 52471, 35602, 1286, 57977, 23685, 47947, 10994, 38839, +21347, 56901, 3104, 34951, 47365, 14329, 59736, 25384, 38675, 6950, 51415, +19790, 34579, 58946, 8764, 42417, 24443, 55826, 12268, 39661, 23636, 60876, + 1246, 39060, 21240, 50543, 14105, 32203, 59837, 3367, 44641, 27426, 12091, +62152, 37224, 15437, 53521, 29143, 7711, 49737, 35313, 18290, 60155, 6669, +45040, 20864, 37645, 55504, 9196, 28696, 47634, 13245, 59361, 22096, 39908, + 1035, 47513, 26219, 56749, 13878, 30354, 44963, 7976, 61561, 25205, 40394, +12829, 48964, 22519, 63524, 5403, 34608, 46370, 20378, 61159, 10410, 34131, +44946, 19220, 56173, 6776, 40210, 24511, 59357, 9046, 43174, 21879, 54332, +11685, 41431, 23034, 60305, 3208, 39564, 25598, 64409, 12150, 42904, 22275, +51049, 1586, 33522, 62527, 14071, 47687, 24757, 41817, 3515, 54351, 22396, +39397, 14112, 63984, 32322, 6813, 50100, 29253, 16076, 62984, 36334, 9055, +53813, 24635, 44349, 4004, 34553, 65161, 15193, 47643, 29829, 6099, 52352, +36566, 18997, 59627, 11709, 43305, 25968, 52083, 3510, 31439, 60656, 14338, +44014, 28007, 18643, 32051, 46533, 5772, 52802, 28645, 15877, 63651, 37845, + 4392, 31418, 48105, 16478, 53224, 29156, 7937, 65068, 36638, 18494, 49820, + 2042, 33611, 56772, 17041, 45606, 10591, 29319, 49152, 21383, 60092, 430, +29659, 46718, 20007, 61864, 6337, 41183, 26614, 48676, 13158, 58138, 22296, +40278, 4377, 64774, 25587, 44163, 11564, 55662, 17915, 35664, 50302, 6285, +32290, 64290, 14602, 43087, 24770, 55502, 8271, 41277, 24434, 58508, 12541, +39550, 26653, 54720, 3576, 38603, 21778, 64485, 13210, 42489, 25259, 48966, + 7067, 63001, 18396, 34506, 44103, 10639, 54088, 17125, 30943, 57272, 3412, +43231, 24233, 60640, 13602, 33069, 52584, 9311, 43167, 23450, 56166, 5416, +33208, 45870, 14739, 61182, 25911, 38243, 6580, 55698, 22776, 47601, 14263, +32397, 58900, 7271, 43780, 23307, 55394, 14420, 36174, 49409, 8435, 29590, +60571, 16654, 47324, 27849, 2011, 63765, 37964, 14987, 28691, 57294, 7524, +47985, 27994, 14731, 58363, 36492, 4097, 53390, 24353, 46987, 13790, 36982, +65428, 7547, 31000, 45319, 17201, 61469, 3217, 39448, 26753, 54702, 12860, +49267, 25033, 40667, 1168, 59645, 23386, 48815, 9767, 41027, 21539, 50955, +13351, 34216, 58308, 341, 46527, 24624, 39640, 11273, 59680, 21802, 41759, + 6791, 50607, 31077, 14942, 56993, 35662, 5464, 49604, 27801, 16553, 58642, +36428, 8485, 53667, 26396, 41961, 197, 62447, 24678, 48577, 13481, 39382, +21978, 51807, 3190, 30139, 64231, 13587, 42399, 23857, 52851, 7558, 30889, +56080, 12730, 46141, 28627, 15396, 62927, 37027, 344, 51187, 25370, 43625, +11784, 56632, 18347, 35689, 51513, 1846, 29439, 59029, 14180, 47660, 22005, +40841, 3723, 52982, 31564, 14972, 58611, 36294, 1690, 49638, 27754, 16401, +56283, 38090, 10160, 30672, 63821, 18992, 45528, 5118, 32822, 59552, 18784, +44753, 9555, 33688, 54920, 20829, 44363, 2886, 32993, 58726, 17148, 41537, + 9886, 51762, 20902, 33018, 62718, 4054, 45495, 19408, 32891, 53708, 1477, +42818, 17688, 63811, 29408, 4703, 50342, 36771, 18880, 54328, 2477, 42569, +24810, 60264, 12568, 34359, 44557, 7699, 65287, 23954, 40495, 11922, 53599, +20223, 31314, 59856, 3985, 45298, 18450, 31008, 53103, 8290, 34753, 59324, +14845, 46258, 27588, 4889, 51529, 37450, 20804, 65078, 8493, 34233, 50241, +18651, 41014, 3840, 59003, 30113, 15593, 51817, 36947, 6000, 56149, 27912, +15245, 50885, 36811, 418, 57312, 23775, 46531, 11889, 40638, 21546, 63753, + 2552, 33290, 51342, 17731, 42955, 8590, 54276, 20811, 35123, 61161, 1849, +46704, 20662, 34420, 55974, 8875, 42645, 22558, 59567, 12370, 39891, 25999, +53288, 6674, 32388, 64962, 12843, 42099, 23166, 52699, 5287, 32473, 54991, +12458, 41966, 24081, 61627, 1863, 47572, 28639, 16021, 50982, 35189, 4763, +57985, 29231, 16568, 49334, 35817, 6751, 62895, 26115, 43105, 10367, 56690, +20112, 34244, 51396, 5116, 47532, 19965, 32247, 63185, 2218, 42601, 24002, +54781, 12200, 38961, 22894, 64047, 235, 36114, 52247, 16031, 31868, 45662, + 4773, 62839, 28516, 15844, 38058, 51875, 6725, 32892, 65292, 16756, 47805, +28099, 2259, 58800, 36390, 10206, 52098, 25367, 41251, 13823, 58070, 29570, + 1568, 53902, 36971, 14698, 49499, 27960, 3505, 62992, 36235, 13929, 46796, +26152, 61397, 2110, 30369, 46744, 17293, 52024, 8277, 33957, 55970, 17137, +46774, 5348, 34867, 58203, 15286, 45595, 28188, 7570, 60065, 36436, 18748, +48456, 10201, 56234, 26491, 41496, 5411, 58374, 19720, 34481, 52018, 2529, +44965, 19651, 32915, 60766, 12247, 48876, 23076, 39218, 7310, 57025, 24578, +43623, 12240, 62223, 22169, 40510, 222, 54352, 27236, 38835, 9626, 58022, +19419, 34569, 46804, 7757, 65512, 17020, 59969, 11539, 44803, 26692, 40618, + 2814, 58957, 24807, 43049, 11787, 54947, 21374, 39770, 5692, 59366, 24686, +43447, 11146, 60812, 20220, 30293, 47882, 7214, 62771, 19833, 32404, 44066, + 5717, 52952, 17466, 33239, 56472, 10217, 44252, 33039, 17649, 63286, 3799, +32632, 50971, 19564, 42273, 10623, 54008, 27161, 38606, 2617, 62128, 20255, +30066, 45460, 9329, 58081, 23759, 38548, 1951, 49808, 19668, 32979, 63017, + 4462, 42978, 22061, 50399, 10933, 32138, 60108, 19593, 47723, 8181, 41425, +26968, 53742, 1731, 31594, 57870, 20189, 45672, 4559, 32699, 61854, 19917, +48817, 7804, 39142, 26587, 55508, 10977, 42248, 21522, 62783, 1539, 40088, +25716, 48581, 12468, 58591, 22077, 40519, 2775, 53058, 21165, 39439, 11884, +64182, 25528, 42934, 1365, 51771, 19820, 33960, 62329, 3980, 42589, 24737, +59274, 13033, 31947, 50970, 5755, 42419, 23758, 56056, 12082, 40541, 21607, +51297, 3403, 34770, 62889, 19264, 45569, 8588, 39975, 26536, 60488, 11518, +39329, 21704, 53603, 2692, 32998, 56123, 19471, 47468, 10720, 30577, 58144, +17781, 44413, 6946, 32750, 64890, 18987, 46194, 9072, 35221, 61542, 16145, +30639, 53061, 3923, 42301, 24829, 64462, 8797, 32080, 54734, 16655, 47907, +27766, 2407, 63634, 37422, 19639, 52474, 9247, 42905, 25297, 61947, 13994, +37577, 51075, 4573, 29476, 63772, 18710, 47769, 11376, 38901, 22772, 60772, + 5350, 32698, 54341, 17886, 46178, 9719, 33555, 57190, 16888, 45013, 28011, + 945, 61345, 35697, 19516, 50710, 5285, 34772, 58276, 20918, 42396, 9161, +54958, 26771, 39593, 3935, 62222, 21615, 46710, 13502, 33464, 55358, 7599, +43209, 24125, 60797, 11164, 38490, 21029, 55388, 7117, 43366, 24959, 64805, +13575, 33771, 47924, 6202, 59821, 22850, 41282, 141, 49071, 26585, 55008, +12704, 40232, 24329, 65482, 6727, 30114, 48649, 17695, 56884, 11932, 39384, +26660, 63581, 4488, 43660, 24528, 54329, 12528, 39963, 22770, 56686, 6956, +38387, 27219, 60784, 11578, 47500, 19948, 33297, 58768, 6822, 43315, 22837, +57271, 10305, 36093, 49503, 16209, 29357, 61982, 5841, 46580, 28093, 14532, +51976, 37805, 439, 57210, 24788, 44263, 9783, 34863, 64493, 12880, 48313, +23865, 41208, 1734, 62400, 19499, 31527, 44887, 10863, 54183, 17472, 30014, +56987, 2614, 46730, 20752, 33028, 62342, 7371, 49145, 23698, 41639, 11878, +47384, 21530, 64178, 4126, 33206, 44371, 16946, 61096, 28504, 6651, 52741, +37006, 18261, 48449, 9688, 60433, 26831, 39095, 4409, 49012, 22475, 59436, +11130, 32195, 44306, 15195, 53525, 28640, 6290, 62415, 37359, 18525, 49350, + 4612, 34038, 61430, 16858, 44800, 28208, 287, 56252, 35611, 15843, 48502, +26485, 61122, 3593, 38315, 21797, 52043, 14177, 34973, 64051, 7465, 42661, +24022, 55044, 11584, 40629, 21833, 64662, 3747, 32421, 54112, 14505, 41427, +23327, 52345, 870, 31108, 61156, 14761, 44259, 28115, 9042, 58587, 36579, +17933, 51802, 5780, 43419, 27277, 60949, 14067, 31764, 48019, 7297, 55799, +24124, 41012, 10794, 58763, 19828, 33040, 53830, 8849, 43181, 23932, 57367, + 3871, 40934, 21714, 55356, 12233, 34455, 46574, 18333, 60225, 4556, 33326, +45331, 19310, 64586, 6979, 41005, 26284, 52924, 10843, 32269, 57842, 19887, +42315, 5275, 52652, 21178, 33571, 56193, 10419, 44001, 20146, 37211, 63475, + 436, 29981, 44422, 20951, 56824, 10793, 31763, 43760, 19949, 65000, 4041, +32514, 52075, 16455, 44982, 28123, 880, 61893, 38014, 15647, 28701, 48988, + 8344, 64748, 25575, 38892, 11275, 56480, 21850, 47237, 1447, 31535, 55176, +16821, 45441, 28556, 3295, 59264, 38102, 16302, 30872, 48813, 6992, 63831, +23168, 41511, 13661, 54907, 29348, 2098, 50473, 37612, 18230, 53602, 5125, +33701, 48309, 20022, 57375, 9961, 38932, 22685, 61913, 1239, 47650, 30782, +15905, 52138, 35126, 3487, 54803, 26130, 44320, 14221, 35323, 57904, 1467, +48889, 24225, 40021, 11835, 64475, 22446, 47613, 2834, 31284, 60941, 20704, +41893, 9322, 54579, 26258, 39342, 1090, 57020, 23645, 43906, 9133, 60047, +17068, 33921, 48318, 4784, 54866, 24875, 41454, 11940, 61578, 17397, 35567, +51050, 7674, 30700, 56649, 16122, 45372, 27810, 515, 62011, 36651, 15124, +54399, 28869, 6393, 49619, 35431, 17063, 60971, 8957, 34148, 51272, 14702, +41153, 24705, 53441, 143, 31779, 64675, 15111, 45019, 28157, 6346, 53052, +36386, 16355, 59371, 29259, 4744, 49938, 35205, 17215, 63087, 9827, 42634, +26875, 55218, 4529, 46903, 29377, 15067, 58386, 35873, 5982, 49567, 18135, +29750, 56538, 10956, 41169, 23143, 53249, 20, 36156, 64834, 15576, 30838, +46742, 9080, 61214, 25799, 39029, 13329, 54975, 25077, 47453, 1217, 31853, +62024, 18630, 49203, 6254, 41498, 26138, 63917, 12490, 40444, 22980, 51137, + 596, 33653, 60817, 20382, 46359, 4614, 35827, 55900, 15318, 30020, 51673, + 2441, 43248, 24983, 54042, 7616, 32198, 59292, 17947, 45323, 12986, 36057, +51414, 4761, 30638, 57492, 15879, 44409, 28626, 7459, 60789, 34628, 17691, +49475, 1166, 32846, 58161, 12735, 44425, 24066, 40205, 2705, 56161, 29318, +15442, 50407, 35895, 8860, 59301, 26539, 42797, 2166, 51294, 29340, 14921, +62023, 36633, 8101, 48120, 23040, 54587, 9981, 30452, 45451, 16070, 64587, +28261, 2760, 49559, 35806, 18773, 60372, 11241, 48257, 26609, 39343, 5479, +64098, 30579, 16879, 52557, 35571, 540, 48330, 25962, 62796, 12449, 39732, +21956, 51810, 2618, 31766, 54693, 18977, 42529, 8508, 61925, 27153, 38590, +11388, 47905, 21736, 58877, 3987, 32211, 45353, 17051, 52606, 1203, 31558, +60777, 21270, 46121, 8027, 35379, 51214, 15650, 30915, 58973, 363, 43012, +23904, 64964, 10729, 39578, 21832, 52305, 3201, 30552, 54977, 14008, 41439, +25567, 64324, 976, 30745, 52278, 13962, 42212, 24104, 58215, 2865, 37479, +50896, 16958, 29958, 63399, 8889, 45977, 28998, 16261, 60810, 37153, 5198, +51118, 27434, 16207, 55494, 38086, 7065, 29195, 57660, 20892, 48786, 4301, +40352, 26283, 63605, 12726, 34851, 51881, 8986, 43981, 28618, 16738, 60638, +36223, 1153, 52631, 27784, 16458, 57892, 37793, 8937, 46951, 24474, 55153, +12559, 34424, 45349, 1519, 65357, 29055, 15748, 53698, 35298, 10575, 47263, +25520, 56485, 541, 34142, 45776, 18069, 64631, 9394, 39191, 22926, 51422, + 2501, 30795, 58268, 14919, 46317, 27396, 8561, 52237, 36768, 11979, 63171, +24433, 45728, 7511, 40115, 21208, 57776, 11051, 47027, 26996, 41460, 5901, +56955, 30126, 15164, 49534, 37189, 443, 59354, 23875, 44707, 13299, 30731, +47787, 7659, 61851, 34780, 18613, 44835, 11071, 54462, 25965, 40916, 4144, +65465, 20339, 33169, 47993, 10405, 55740, 25278, 39444, 1616, 58321, 21435, +42928, 15542, 51917, 29351, 3404, 64639, 35769, 17685, 50454, 1714, 46746, +30564, 15139, 62480, 35472, 10101, 53169, 25657, 42567, 739, 63209, 20102, +30455, 51698, 8556, 42298, 24660, 56550, 12648, 39157, 21449, 50974, 53, +29942, 62170, 15790, 45559, 27692, 8636, 65414, 36881, 18002, 49641, 4147, +31245, 58787, 14317, 46295, 27370, 7683, 52903, 37491, 17813, 60802, 2201, +44566, 29662, 14988, 54214, 37461, 6603, 56757, 23647, 47087, 11256, 34276, +59593, 19155, 44635, 3003, 34925, 54319, 17712, 42380, 6006, 62389, 28792, +14945, 50876, 36253, 7751, 64205, 27317, 14570, 49839, 35200, 10205, 55963, +24753, 45550, 4256, 30657, 58761, 15743, 47110, 27816, 9928, 62495, 35723, +42150, 20992, 64749, 29023, 12606, 50278, 37365, 6916, 55849, 25719, 46345, +13735, 33275, 64342, 8974, 42786, 24057, 57370, 12225, 40116, 21834, 63384, + 5389, 31115, 51907, 13401, 41706, 26034, 54129, 4431, 37702, 57122, 14892, +28327, 49879, 6840, 35535, 58910, 13332, 47390, 28228, 16673, 63712, 37833, + 5235, 31081, 53190, 21045, 43461, 11006, 65319, 19732, 31410, 46428, 901, +59846, 22893, 40937, 14092, 53761, 28671, 5642, 63969, 37386, 12842, 51926, +23245, 42746, 9602, 58372, 25102, 40657, 4102, 65128, 21898, 40593, 12917, +56319, 26819, 47800, 5423, 33780, 59686, 13288, 42697, 22881, 56847, 3524, +30693, 47416, 18918, 64015, 8154, 39235, 24792, 47677, 11679, 56318, 21446, +39657, 653, 61483, 29932, 15995, 52576, 36781, 8019, 45030, 23719, 65299, +12419, 39302, 22352, 50410, 3100, 33379, 62952, 14701, 45704, 27782, 7341, +57042, 37658, 18890, 52895, 2436, 43228, 22762, 59120, 6571, 33738, 52754, +17647, 43761, 9184, 34461, 56196, 13947, 43108, 22364, 59024, 5256, 35067, +49764, 16244, 29555, 62758, 7719, 42694, 25913, 53306, 13215, 38930, 23060, +63584, 6570, 48388, 26268, 38677, 10881, 62080, 19377, 37049, 49684, 910, +28464, 62893, 19936, 42070, 10375, 52874, 21180, 34778, 59504, 3473, 47230, +20506, 36289, 54218, 10869, 28785, 61711, 20214, 46192, 6291, 32645, 64700, +20060, 49039, 9942, 41577, 25863, 62598, 4061, 40384, 21303, 54747, 12187, +38923, 24072, 57505, 5575, 46937, 18401, 32557, 63275, 1913, 42674, 25350, +59078, 12288, 40750, 22722, 52509, 8040, 34026, 57276, 17036, 42892, 1425, +55833, 29101, 15246, 49982, 36900, 8105, 59449, 22426, 45415, 14501, 30571, +56476, 4000, 43165, 25377, 59426, 9552, 34917, 47103, 13322, 57539, 23938, +40737, 4527, 52760, 29978, 15803, 62973, 35975, 8200, 50226, 21037, 34782, +62206, 10724, 44149, 19908, 36921, 54529, 3768, 29208, 63288, 20688, 44797, + 9328, 33737, 55903, 13960, 42061, 25696, 50738, 6324, 34545, 62292, 19298, +45171, 12556, 34654, 59500, 8673, 46604, 20681, 34127, 56189, 4979, 45357, +19095, 32390, 60441, 7508, 43814, 27447, 14903, 56815, 37338, 3674, 52806, +23201, 41855, 14151, 58590, 28742, 1238, 49796, 36154, 17506, 62761, 9299, +33485, 52582, 13937, 43484, 23292, 58769, 623, 31252, 54782, 15662, 45575, +27348, 4810, 56486, 34944, 14818, 50519, 29060, 7981, 63344, 35317, 18868, +49758, 3183, 31536, 61844, 16711, 43777, 27814, 8157, 58178, 36439, 20915, +44469, 5665, 63037, 19252, 30713, 43811, 12310, 60793, 24852, 41051, 5104, +55262, 27233, 40736, 11998, 63859, 20310, 37663, 50196, 3905, 31445, 59889, +14170, 42119, 22946, 54495, 1582, 34072, 48190, 13513, 65438, 24305, 39702, + 2430, 53307, 18926, 33692, 62628, 9678, 45930, 28276, 16921, 53856, 35618, + 5192, 63685, 27701, 16123, 49845, 37303, 1749, 57963, 25006, 47150, 8611, +35968, 59699, 16716, 28766, 45934, 2774, 54179, 22418, 41085, 13439, 63853, +30816, 6096, 50054, 35647, 13010, 61261, 23897, 45437, 8324, 40121, 21868, +56035, 11809, 43401, 25514, 60375, 4288, 39610, 21261, 50518, 13387, 33553, +57761, 6400, 45844, 27986, 16530, 61704, 37728, 2868, 46788, 23684, 59795, +11661, 41506, 22238, 55415, 7255, 36639, 49904, 14601, 30741, 57481, 2670, +44775, 27653, 15974, 60504, 37426, 5832, 53952, 28847, 16459, 49569, 35550, +11230, 64117, 25277, 46498, 4823, 33402, 49027, 18491, 62561, 9109, 30822, +44118, 17339, 53681, 4342, 31316, 63643, 20945, 47602, 9333, 31937, 56004, +13447, 41707, 24478, 59620, 625, 39916, 20702, 52958, 28958, 4813, 58554, +37731, 19077, 50445, 1678, 33331, 61874, 18190, 40850, 7407, 52540, 21490, +31944, 55953, 696, 17329, 51845, 4185, 33068, 57697, 15678, 44271, 27698, + 2336, 61081, 35500, 19260, 53460, 6140, 41458, 23313, 51009, 346, 31807, +55859, 18133, 44891, 9264, 33853, 61200, 20772, 46130, 7343, 34712, 59744, +16813, 30370, 52136, 712, 42689, 22191, 64992, 11262, 33457, 44732, 2486, +55615, 22530, 40802, 12300, 61118, 26686, 39299, 2974, 51732, 17331, 34698, +56184, 8602, 47857, 26357, 38435, 11555, 57921, 21673, 49212, 3440, 33797, +45997, 16925, 60604, 28692, 2292, 51043, 35613, 17903, 47440, 11096, 54928, +27278, 38362, 1234, 61395, 21117, 43077, 11526, 52904, 29189, 7269, 63417, +36693, 18084, 50267, 10503, 42629, 23402, 53703, 2039, 32785, 60762, 16574, +45233, 28526, 5226, 51395, 36148, 18549, 59585, 9540, 33405, 47759, 20642, +56797, 2103, 41546, 26839, 59446, 10172, 30859, 52988, 20757, 42259, 8770, +60611, 29183, 16584, 49834, 35145, 6054, 63988, 24265, 41365, 11815, 50927, +18834, 30960, 61035, 4379, 44878, 27672, 15386, 65170, 36328, 1878, 51253, +28748, 14737, 55328, 36561, 3353, 46733, 23866, 56585, 11504, 39820, 21452, +59959, 1427, 42609, 27119, 54469, 12375, 40169, 21858, 56663, 4919, 47591, +29760, 14549, 60382, 35892, 8405, 53704, 25435, 46083, 1943, 31936, 65480, +14430, 44992, 27553, 8437, 52184, 37873, 18635, 56566, 5145, 37108, 49653, +16759, 30300, 57649, 1824, 45210, 28178, 16035, 52378, 35345, 11037, 60165, +25020, 47134, 634, 34576, 65191, 14010, 43404, 26096, 53821, 7222, 40714, +21597, 56409, 14119, 36120, 50152, 4872, 31499, 61594, 19674, 45911, 6366, +31243, 64998, 21160, 40655, 10629, 54035, 26179, 43102, 4400, 63443, 24537, +39931, 10049, 54160, 17941, 36550, 50279, 6879, 28759, 61073, 16979, 45401, +27335, 1315, 64230, 35285, 20125, 50864, 10596, 42726, 25831, 55716, 2143, +30483, 47255, 17838, 56707, 6127, 39894, 26374, 60032, 11505, 48188, 17608, +36204, 51933, 2425, 29071, 61777, 18600, 47826, 5124, 30572, 60271, 15537, +47002, 28109, 1767, 56835, 36541, 17889, 49610, 4274, 29886, 62799, 13426, +41245, 25090, 54422, 11064, 38806, 23163, 64020, 749, 49051, 19022, 35521, +55614, 13044, 29601, 47539, 7186, 65020, 20689, 30753, 46343, 10551, 59544, +24504, 39884, 3078, 56099, 21950, 39063, 8112, 50455, 34168, 14453, 65522, +27988, 6265, 49382, 37350, 20061, 62214, 11512, 46716, 26194, 39309, 1910, +57028, 22608, 42233, 13775, 53308, 28800, 6232, 60056, 36760, 13121, 48733, +24135, 54528, 3430, 32573, 46064, 14651, 58994, 27597, 2251, 52182, 37635, +18417, 48669, 10063, 58426, 26504, 38464, 1058, 53123, 18303, 35577, 55871, + 9714, 28744, 45765, 19685, 62773, 7048, 31070, 44769, 16693, 59096, 28750, + 5184, 51812, 37893, 16029, 29661, 61438, 8626, 43799, 22675, 51001, 3135, +33832, 58240, 13016, 42807, 22664, 52504, 6565, 32686, 60551, 19540, 42930, +12202, 55980, 23462, 40280, 5439, 61662, 30219, 14472, 50792, 37541, 7761, +57506, 24021, 46222, 11592, 41683, 21823, 59021, 1103, 33463, 54097, 16255, +47433, 28129, 5177, 63430, 37950, 16133, 31196, 56667, 9289, 44134, 25168, +52230, 2401, 31014, 64884, 16063, 43962, 27321, 8962, 54613, 36487, 15655, +51816, 28469, 4451, 64356, 37865, 16432, 28584, 48277, 1791, 61551, 24729, +39839, 11609, 54588, 19245, 30187, 50472, 7450, 34857, 63301, 19346, 43199, + 1273, 55589, 26914, 38855, 7903, 57429, 21584, 43390, 12922, 58880, 26202, +39936, 246, 53051, 20535, 34607, 61188, 11601, 46443, 25035, 41084, 1799, +53174, 29346, 15903, 61635, 36383, 5262, 49661, 18009, 32619, 55670, 9431, +46006, 18005, 36239, 64900, 11232, 28876, 48060, 20901, 56582, 5382, 34595, +44857, 19357, 61147, 11016, 34304, 44725, 63981, 21159, 47227, 28427, 7266, +59887, 36999, 13298, 51131, 24017, 43134, 8272, 62205, 23805, 39566, 11144, +58263, 21501, 46940, 4878, 37321, 64895, 15445, 29794, 48022, 2531, 56282, +28163, 16388, 49705, 37871, 8300, 62362, 24213, 47021, 13557, 39368, 23588, +58473, 5939, 30824, 52762, 18922, 48048, 8160, 33240, 59319, 13560, 44010, +23797, 63105, 6907, 39922, 21979, 53124, 1711, 31326, 62325, 20049, 47271, + 6559, 40123, 26134, 64728, 9874, 40017, 22628, 53877, 13550, 31652, 57456, + 3786, 42723, 24427, 63699, 8339, 39988, 23150, 50788, 15140, 34519, 59039, + 2708, 47001, 24246, 41810, 13863, 54725, 34220, 6591, 61372, 27777, 15020, +49591, 37222, 8754, 55447, 23594, 42388, 12356, 64720, 21928, 40932, 3416, +54303, 31324, 12894, 50820, 35231, 18585, 61673, 5129, 44921, 35147, 17252, +55608, 1085, 46824, 20000, 37025, 58332, 3908, 31098, 51665, 14266, 42398, +26852, 60166, 759, 46484, 35025, 20624, 57663, 9485, 30493, 48496, 19660, +54227, 7390, 40124, 25446, 62340, 9934, 43603, 18271, 52810, 30574, 6189, +64470, 35324, 17979, 49817, 8921, 34610, 56259, 19501, 46341, 3089, 33646, +63881, 13582, 42791, 22780, 51186, 6514, 31161, 57053, 19086, 48002, 11696, +39468, 26456, 58364, 4387, 37079, 49899, 16300, 29732, 63184, 484, 46849, +27480, 15637, 60613, 37866, 8379, 50344, 27462, 14319, 64077, 38180, 4873, +29953, 55908, 20314, 44653, 7481, 33076, 53119, 19775, 42193, 11059, 60984, +23426, 38652, 2876, 48744, 26584, 62468, 10986, 39983, 21516, 55269, 6, +39256, 26861, 49112, 11877, 58792, 18484, 34234, 47694, 2668, 60837, 22095, +38561, 12316, 48647, 26874, 56768, 908, 41693, 23008, 65298, 13143, 34355, +52607, 3620, 44073, 27872, 15285, 56157, 38069, 5434, 31354, 60138, 17700, +46145, 9282, 35219, 65035, 13858, 42035, 24641, 53818, 695, 36146, 50285, +15321, 29639, 64573, 4756, 42200, 24291, 53470, 11382, 35050, 58211, 21061, +43901, 7340, 34029, 54573, 20413, 42220, 11312, 65350, 26508, 39415, 8192, +52721, 19127, 32325, 61055, 2562, 46112, 18663, 31859, 58953, 7899, 47893, +23732, 39862, 10718, 49508, 22216, 61120, 2055, 34968, 43868, 18855, 54905, + 5898, 37063, 50475, 12787, 29700, 63755, 15922, 46887, 28075, 4091, 61050, +36799, 19522, 54448, 11008, 42615, 23478, 51910, 2864, 32407, 59696, 17760, +42496, 7018, 48972, 27011, 64677, 10097, 33837, 45978, 20021, 56028, 204, +33393, 45841, 19170, 64197, 10967, 40466, 26139, 57305, 7799, 48179, 29224, +16484, 59884, 36112, 6954, 46490, 23687, 65194, 14137, 32035, 44321, 5766, +51006, 27638, 15385, 61987, 38098, 2738, 32744, 56642, 13851, 49271, 26023, +41039, 617, 55676, 22209, 43574, 11991, 60438, 25866, 40957, 6430, 54764, +25022, 39443, 11703, 60100, 18043, 30108, 49495, 1008, 41238, 25268, 64467, +10473, 39273, 21678, 51135, 3532, 32509, 54887, 16200, 45095, 27305, 4, +64954, 35590, 16414, 49693, 28050, 3496, 62700, 36414, 17672, 52314, 10263, +42861, 25125, 61900, 7762, 30776, 51597, 19721, 41444, 410, 59724, 27077, +38700, 13623, 54545, 21192, 47404, 7108, 36896, 59303, 14912, 29924, 47848, + 1143, 56205, 23497, 40883, 11245, 58930, 26125, 39530, 5847, 51718, 18453, +32206, 58401, 9363, 45708, 17268, 32246, 62324, 4580, 41367, 24138, 53353, +10110, 38541, 21776, 59815, 13094, 48301, 24677, 40374, 3061, 54463, 27019, +38468, 9666, 64641, 22273, 43725, 14166, 50862, 29872, 5028, 58253, 37075, +16449, 49768, 28106, 7986, 65452, 38143, 12438, 31085, 48194, 20273, 57580, + 6648, 41863, 26014, 60415, 2409, 31758, 52176, 17097, 44275, 7169, 37498, +62797, 14787, 28840, 47614, 3034, 55352, 24115, 39645, 8956, 19809, 49816, + 1383, 32507, 55627, 19181, 42047, 4881, 65117, 30149, 16408, 53829, 36661, + 1990, 48503, 26089, 60485, 12924, 38554, 25355, 54405, 7730, 49213, 21716, +40652, 11568, 62057, 25143, 44340, 4148, 36816, 53147, 15190, 29162, 60045, + 2017, 34779, 51208, 12122, 45168, 28340, 16305, 62706, 37983, 7, 29618, +54559, 18161, 41282, 5396, 56820, 27089, 38530, 10399, 50309, 17100, 33506, +59146, 7947, 44452, 28242, 15547, 56065, 37888, 310, 31716, 59590, 16289, +45921, 27735, 6092, 52568, 37131, 20499, 58307, 12008, 43683, 26553, 55427, + 4317, 39874, 21338, 62438, 12038, 38546, 25729, 51021, 549, 31717, 56249, +19488, 41917, 4425, 63622, 30681, 16263, 50779, 34827, 1465, 57859, 25825, +44552, 7882, 37685, 62487, 14971, 27896, 45370, 6865, 56145, 25138, 39697, +11044, 64307, 21014, 31801, 51036, 8081, 43430, 23495, 62422, 11481, 40404, +25423, 56376, 7574, 38878, 21804, 53217, 10774, 32025, 63335, 17949, 44528, + 3804, 33186, 56240, 13442, 43289, 23030, 59517, 286, 38540, 26803, 48057, +12129, 58475, 25265, 40403, 2392, 47675, 22395, 60919, 14830, 32595, 44241, + 7410, 58389, 28197, 16621, 50067, 36506, 99, 61328, 25830, 44830, 15231, +33013, 64359, 5519, 41363, 22139, 53935, 10713, 32868, 61369, 18298, 44492, + 6924, 34217, 55561, 14284, 43912, 32331, 3116, 59445, 20856, 32030, 53793, + 9297, 44802, 17934, 33542, 57861, 1548, 48433, 27579, 16034, 63555, 38064, + 3951, 30543, 55830, 17565, 47610, 8403, 35251, 58540, 15403, 30768, 52055, + 4484, 43569, 25319, 63747, 14193, 32450, 45540, 6938, 56664, 24761, 39808, +10089, 54372, 17717, 46357, 30676, 6003, 61944, 34823, 18610, 49731, 8529, +31216, 58285, 16174, 47923, 29192, 6368, 53842, 36213, 18816, 61686, 12257, +43740, 26844, 51347, 3371, 33782, 58365, 19983, 47589, 7708, 32362, 61634, +18829, 45251, 6529, 33045, 57143, 18645, 45219, 8887, 32858, 61143, 17378, +49227, 1071, 31894, 45953, 17183, 63149, 3968, 35680, 50256, 15943, 31057, +59275, 57, 43406, 23777, 50850, 10539, 34701, 56951, 15971, 43910, 27786, + 5914, 52627, 36658, 12619, 64724, 26314, 44990, 5364, 30278, 57637, 16050, +44905, 33822, 11167, 61763, 25846, 44801, 276, 32824, 56542, 18742, 42773, + 9258, 50159, 21001, 32713, 58394, 1629, 45797, 18452, 34051, 63032, 8700, +40822, 24247, 54225, 12972, 38272, 21168, 57709, 4334, 34989, 52835, 14997, +43979, 27563, 8786, 61421, 37583, 17343, 51603, 3842, 43994, 30957, 15793, +53125, 36219, 1250, 63361, 23373, 43905, 12968, 33938, 55078, 3751, 48973, +27671, 16570, 60356, 37625, 7859, 53801, 25188, 47615, 11727, 40267, 23918, +63374, 5443, 38840, 21245, 50537, 10115, 35449, 64706, 16996, 32757, 47654, + 2008, 57504, 20267, 32197, 51715, 4864, 43306, 25935, 62333, 9463, 37242, +51256, 15102, 30983, 57583, 7125, 44970, 28369, 15032, 62868, 37327, 5754, +50127, 28318, 17028, 58379, 38222, 9448, 31127, 55155, 18690, 43094, 6612, +60172, 29038, 15767, 38116, 50295, 4160, 32569, 55526, 17278, 42141, 10365, +65384, 26057, 48147, 4821, 40277, 22964, 58015, 11335, 39210, 26415, 63701, + 5183, 41804, 22203, 50915, 13459, 35962, 62499, 3646, 31248, 50239, 13257, +42846, 22981, 63968, 7637, 34440, 53357, 20697, 41954, 605, 56018, 25912, +47619, 13552, 32795, 64744, 3362, 43637, 25635, 51084, 8941, 34037, 62914, +19515, 45686, 6327, 32039, 60945, 19320, 48685, 2089, 41247, 26373, 56927, +12580, 39757, 22434, 60311, 3121, 32116, 52166, 14583, 42759, 25464, 59041, + 1126, 40584, 23286, 54029, 8668, 34956, 48142, 20421, 63465, 10411, 34266, +47116, 21131, 58221, 71, 32103, 44161, 16594, 53429, 30082, 10269, 59089, +36152, 28787, 14451, 53110, 37689, 8473, 47770, 25236, 58636, 12462, 39861, +22378, 49863, 9302, 29874, 56640, 18507, 44481, 3739, 32655, 63908, 16763, +44011, 28657, 932, 59147, 35672, 19255, 54673, 9903, 32801, 46034, 20512, +63547, 6953, 39706, 27016, 55122, 10301, 38587, 21460, 49128, 4472, 57915, +24970, 42089, 9953, 47143, 22708, 63615, 14402, 34192, 52422, 3612, 43820, +23336, 64427, 12499, 41571, 25183, 54813, 4312, 40705, 22017, 49055, 12094, +62806, 26133, 41276, 9372, 50614, 17216, 33005, 64383, 1000, 46579, 28652, +15802, 52131, 36544, 10040, 59999, 22570, 43531, 6165, 52615, 30375, 15893, +65242, 37026, 9140, 47644, 24998, 58789, 12898, 39208, 24250, 47892, 5775, +55089, 21654, 40401, 11085, 60020, 30755, 16789, 50009, 36105, 221, 59102, +29095, 16056, 49383, 37666, 3662, 54144, 27377, 16425, 58619, 38227, 1686, +29691, 53660, 18820, 44187, 4925, 65060, 30164, 16282, 49949, 37076, 2109, +58680, 24266, 42253, 11716, 51156, 20373, 35967, 64709, 5037, 30963, 50005, +14915, 41340, 21369, 54649, 5578, 33091, 63022, 9814, 43345, 26438, 52591, +13090, 29982, 65379, 4271, 40993, 24750, 52603, 10338, 31976, 55353, 12536, +41934, 22269, 59114, 3223, 35373, 50839, 13510, 42806, 24168, 57701, 1305, +40173, 23068, 52934, 13256, 30912, 64997, 7915, 46264, 27852, 16474, 52463, +37017, 5553, 61436, 24160, 47783, 12920, 39676, 22858, 59157, 6600, 36330, +49881, 14488, 28975, 60624, 10776, 42922, 22815, 54284, 1064, 39519, 25651, +65506, 11348, 46556, 18998, 33830, 57853, 8571, 41912, 22943, 52332, 3503, +33918, 62751, 16453, 44827, 28268, 1656, 58889, 37494, 20023, 52217, 9572, +42393, 26392, 63212, 2423, 34126, 45032, 20513, 59793, 10878, 40291, 26238, +52996, 233, 39635, 22482, 63890, 9929, 42173, 24745, 55465, 12905, 30302, +52581, 1725, 43346, 25049, 54656, 13362, 41141, 23535, 63686, 2938, 47859, +25583, 39940, 10852, 57730, 20405, 36229, 51431, 7631, 29215, 58665, 20687, +43031, 10574, 53413, 25988, 38424, 7225, 61592, 19592, 48174, 30381, 3425, +63489, 37901, 13570, 46929, 24326, 60164, 1083, 40386, 21342, 54622, 13667, +32049, 49110, 3297, 63196, 23916, 39286, 8651, 48947, 22345, 60423, 12451, +40486, 26282, 52177, 5482, 30548, 64366, 13204, 41533, 24916, 55495, 4557, +35904, 49563, 15112, 29830, 60130, 729, 47734, 26374, 41741, 10709, 63280, +23508, 48390, 2785, 31267, 58309, 15910, 44570, 29177, 7208, 54895, 35629, +20059, 62257, 10156, 46861, 26633, 40365, 6329, 56745, 19649, 31494, 48005, + 9708, 61476, 19183, 30550, 43742, 112, 57926, 34264, 19176, 51276, 4415, +42625, 22300, 59628, 14450, 34193, 53482, 8097, 42842, 25162, 58618, 3614, +30770, 52944, 14882, 45665, 28330, 7578, 63803, 37055, 19018, 49709, 14060, +31288, 56092, 3328, 46582, 28450, 16607, 61408, 36094, 1875, 47940, 25507, +56502, 10792, 34893, 44192, 13905, 60512, 27516, 2598, 53523, 36926, 13832, +47273, 25397, 56870, 1301, 31634, 46461, 19085, 63975, 11186, 39495, 26628, +57500, 2615, 38366, 21617, 52833, 12369, 34040, 61259, 17547, 46239, 1911, +31698, 55419, 20411, 45146, 7636, 32150, 60383, 19270, 43408, 9073, 56656, +28993, 16285, 53919, 36782, 2455, 46803, 24176, 57960, 9788, 38635, 21980, +50785, 14309, 34195, 60704, 6639, 41785, 22863, 53633, 11444, 32073, 58455, +18072, 41127, 957, 56346, 28647, 15269, 51061, 37109, 8687, 55665, 28611, +15960, 49819, 35563, 5596, 63557, 25361, 46348, 10618, 39332, 21152, 55479, + 6428, 43918, 22283, 64357, 11721, 33334, 45874, 17425, 59726, 4630, 30891, +43787, 15200, 56085, 28025, 6007, 50677, 37183, 17992, 60388, 8221, 48297, +26389, 41309, 3452, 63251, 33937, 56914, 18114, 44975, 4349, 31992, 62347, +18039, 43160, 517, 52219, 34864, 20381, 62912, 6818, 37900, 50440, 14476, +29818, 57667, 11857, 47267, 27299, 6228, 51761, 37369, 15251, 60715, 28430, + 3164, 49823, 35599, 14175, 57090, 22880, 43545, 1242, 65432, 26212, 41829, +14068, 53560, 30322, 7568, 61654, 35170, 19774, 50206, 2287, 32216, 58701, +19191, 42367, 9287, 54021, 26754, 39119, 1413, 61382, 17317, 32042, 45806, + 8878, 58096, 24358, 38416, 2770, 54373, 19753, 36513, 60445, 7864, 29652, +44520, 19204, 56961, 6695, 39082, 26963, 50411, 1817, 30566, 61588, 14762, +46227, 28405, 3887, 55160, 35396, 18986, 44911, 2222, 60464, 20776, 31959, +44121, 8363, 52130, 29276, 15098, 63284, 37521, 4172, 46133, 24253, 54890, + 9887, 41072, 22199, 65448, 6362, 31344, 52812, 14380, 46140, 28406, 8600, +63219, 35772, 17224, 49767, 6615, 32923, 60815, 13700, 39885, 24105, 55192, + 8630, 46623, 28802, 14054, 61857, 37592, 5917, 53615, 25263, 41920, 10104, +57664, 18916, 32884, 52453, 2935, 43227, 24768, 60660, 13676, 38730, 21148, +50408, 944, 33719, 57558, 19993, 44584, 8427, 34065, 59750, 21011, 48498, + 1780, 39081, 27069, 63306, 8103, 30636, 53631, 16264, 46248, 28203, 6190, +61966, 34946, 19777, 50422, 9910, 43092, 27171, 59023, 2385, 35358, 51587, +19343, 41582, 10401, 62970, 22900, 40475, 241, 56830, 26950, 38564, 9802, +51858, 19189, 30965, 64401, 2366, 45296, 18233, 36110, 57058, 9096, 29694, +50247, 19171, 43318, 5133, 60430, 32468, 17322, 53953, 1987, 36638, 49286, +15150, 29260, 59649, 9271, 43254, 24299, 54785, 13330, 34482, 47538, 5152, +64605, 21095, 31482, 46276, 11645, 53978, 17453, 36998, 57173, 4151, 29607, +47187, 19209, 62259, 8245, 31715, 46606, 16226, 57018, 28335, 2959, 50265, +36201, 17854, 59373, 9050, 40749, 26882, 60690, 5466, 38624, 22083, 56246, + 9504, 36882, 50583, 14673, 31587, 62428, 4328, 44670, 27404, 14111, 55817, +38150, 1932, 31678, 64380, 18477, 47286, 5233, 32797, 57177, 15584, 45321, +28357, 9166, 53786, 35949, 19034, 56424, 7023, 30932, 49968, 14986, 34575, +59487, 4609, 46497, 24029, 39437, 10371, 56628, 18127, 35262, 51534, 6425, +30112, 57933, 19462, 45167, 2488, 34735, 54141, 17860, 42551, 6697, 60725, +28954, 15984, 50803, 37669, 7913, 56770, 23804, 42753, 12625, 62009, 22809, +39304, 6417, 54566, 19430, 32926, 45465, 11904, 64806, 24682, 40058, 1488, +48848, 23017, 59244, 12277, 38894, 25012, 51953, 4856, 31999, 65017, 13896, +46281, 25110, 40013, 2646, 49375, 22820, 64061, 13363, 32777, 46067, 8430, +54987, 25993, 39044, 12322, 63589, 24667, 43753, 1343, 56966, 29509, 15648, +49602, 35908, 9124, 61814, 23847, 42751, 11412, 54355, 21742, 39941, 277, +58566, 34714, 12493, 45290, 23933, 65239, 8144, 40422, 23442, 54567, 12979, +43424, 21467, 52377, 4816, 31178, 63351, 19218, 45683, 8882, 32376, 49198, +20797, 64336, 7000, 32682, 44776, 12791, 61061, 23909, 40558, 4831, 54501, +22744, 48176, 13634, 33587, 62539, 8267, 43598, 25025, 50928, 4049, 32558, +56869, 19276, 44468, 8773, 34364, 63042, 14753, 48606, 28134, 311, 52635, +36805, 16852, 62028, 27652, 6647, 49608, 37852, 19666, 65317, 11545, 42358, +26657, 59852, 5330, 30992, 52757, 19440, 45860, 1826, 36090, 61819, 16190, +29722, 50174, 7146, 42869, 24099, 60224, 11811, 33471, 46969, 18708, 64037, + 2816, 39025, 24551, 47495, 11150, 59222, 19802, 32245, 51629, 501, 43212, +23784, 62500, 13262, 33141, 48712, 3924, 56715, 26450, 39398, 10725, 52742, +19629, 34383, 62001, 2806, 45478, 19265, 33665, 65297, 12368, 41975, 23388, +52850, 5166, 32638, 61451, 18747, 45194, 10949, 31365, 64663, 20831, 42225, + 7563, 55141, 26562, 39168, 12963, 60743, 22992, 47525, 4634, 31247, 55493, +15491, 46218, 27913, 1830, 61566, 38083, 16866, 29785, 48641, 8084, 64542, +22565, 41211, 12565, 55969, 26078, 47238, 5361, 31523, 59539, 17316, 40333, + 9461, 50869, 20229, 34005, 60527, 3071, 46387, 23348, 39888, 11272, 57318, +30048, 15548, 49449, 35999, 5862, 60531, 20745, 33271, 46944, 11163, 56373, +19861, 35595, 51113, 4762, 30568, 65272, 17536, 42171, 12865, 47181, 26650, +52225, 5126, 33606, 63164, 17080, 46161, 11720, 33395, 58992, 21174, 42236, + 8401, 54340, 26707, 39001, 13147, 62547, 21425, 49185, 7111, 32628, 48032, +17944, 64479, 11465, 40710, 26062, 56970, 900, 48721, 19312, 35549, 61063, +13087, 29787, 52099, 2918, 47024, 19546, 33979, 56349, 11324, 43191, 22991, +61392, 2332, 32999, 44817, 20586, 55018, 11280, 41193, 23137, 57792, 414, +48135, 30928, 15852, 59934, 35488, 3313, 51934, 22759, 45238, 15977, 32449, +63797, 1089, 47576, 27853, 15585, 59749, 37434, 9156, 46376, 23601, 55798, + 6706, 41228, 21999, 64045, 11050, 31428, 48331, 17759, 55540, 3701, 30735, +45769, 17155, 61700, 9609, 31670, 51094, 14205, 42052, 23458, 58200, 4381, +34992, 52310, 18749, 42397, 11127, 64146, 26427, 39376, 4087, 55789, 21923, +48007, 14541, 33558, 59875, 6486, 43379, 25648, 54937, 12167, 31265, 46228, +17367, 61693, 3563, 41901, 26333, 53412, 11462, 34459, 59812, 20921, 41852, + 5936, 52403, 31435, 14346, 61816, 35491, 7707, 51122, 25019, 42166, 12049, +57007, 24653, 40634, 5477, 64120, 18661, 36011, 50846, 506, 30807, 61716, +15815, 44323, 27951, 7876, 56682, 36349, 19299, 50997, 1151, 41638, 25621, +60922, 9751, 32038, 51412, 13975, 42766, 24654, 54004, 5869, 34212, 64876, +13456, 45287, 20747, 32576, 48579, 4940, 62786, 19336, 34154, 46254, 11533, +51442, 17433, 31368, 65457, 339, 45076, 27440, 16380, 55258, 38192, 6741, +28853, 48643, 19853, 60243, 8947, 41110, 26602, 54583, 11773, 39194, 21500, +62518, 1321, 41156, 23484, 51545, 12987, 32877, 65123, 2637, 44612, 27579, +16641, 61679, 37097, 8392, 52688, 26768, 42256, 12314, 64548, 21988, 48673, + 1501, 41884, 25108, 61968, 12960, 32347, 47233, 8213, 63952, 25216, 38667, +11226, 56352, 22289, 46620, 1138, 33551, 65144, 16631, 45024, 27859, 3714, +51958, 35182, 16023, 59298, 29744, 2443, 49760, 35797, 17620, 56589, 5679, +46841, 19385, 35167, 60199, 8965, 30476, 54164, 18683, 42447, 677, 50418, +34287, 21002, 57772, 9442, 44437, 18336, 35144, 59185, 7454, 28548, 53421, +15223, 44268, 34816, 3194, 60491, 21782, 47341, 6676, 32221, 52429, 18975, +39849, 10389, 65042, 26121, 38812, 2306, 51259, 18159, 35620, 57320, 6188, +30319, 48116, 15153, 63049, 24971, 39349, 4608, 51851, 18688, 33357, 56964, + 1412, 42588, 24242, 60760, 9474, 39626, 22750, 55652, 14275, 37080, 50665, + 532, 29390, 57839, 16293, 43943, 27428, 3819, 55410, 36877, 20583, 50477, + 9281, 32861, 59612, 14652, 43190, 25686, 52067, 780, 31723, 55952, 19341, +44724, 9932, 36965, 64770, 16437, 28768, 52885, 5346, 41391, 23282, 58199, + 9836, 33455, 50727, 13018, 42204, 23353, 58598, 3384, 33817, 46399, 14808, +52156, 27759, 1015, 56825, 36738, 18008, 48161, 8952, 62800, 26595, 39677, +10599, 56214, 22000, 47885, 3742, 36106, 65164, 15082, 28997, 52632, 5080, +42458, 23280, 54087, 8368, 33452, 57528, 14515, 44475, 27641, 4645, 60621, +37563, 18381, 54511, 7842, 46913, 27274, 38454, 14455, 61432, 21400, 38311, + 1440, 47354, 25415, 58037, 7868, 39128, 26788, 49021, 10606, 55459, 21896, +39461, 1766, 48645, 25748, 58685, 11875, 39866, 22101, 51710, 982, 28376, +59463, 9248, 46421, 34931, 17521, 52836, 2462, 37137, 57967, 16147, 29307, +44357, 7951, 65232, 24137, 40090, 10830, 52779, 19762, 33456, 58134, 3902, +44794, 27868, 14608, 53797, 38006, 240, 31726, 63167, 18340, 43156, 10620, +52526, 21547, 32973, 62785, 6187, 44448, 27756, 16680, 55596, 37309, 9039, +48664, 26404, 64779, 542, 41529, 18065, 52697, 29651, 13036, 63783, 37166, + 2555, 49682, 27575, 15624, 62098, 37444, 8043, 47201, 25349, 55722, 730, +39084, 21705, 61063, 11237, 48862, 24998, 41041, 2348, 57710, 20125, 30781, +47579, 4499, 65062, 18168, 33351, 50685, 79, 42143, 25105, 56076, 10739, +39563, 27090, 59492, 5190, 46120, 28784, 16608, 54441, 36452, 9272, 46658, +22559, 58702, 6170, 31588, 44837, 14528, 63886, 23056, 41441, 4998, 57681, +29918, 15553, 50902, 36061, 9020, 59738, 24886, 46952, 4240, 35204, 64481, +12900, 29261, 45773, 20511, 54149, 5844, 41202, 26104, 61455, 12700, 36809, +50099, 8155, 28819, 56025, 14310, 44056, 27307, 6137, 62667, 35779, 16926, +51038, 28373, 2032, 58915, 37927, 15701, 28611, 51693, 4681, 36470, 62343, +13389, 42086, 23851, 53458, 6386, 34602, 56382, 19007, 43073, 2715, 65051, +20638, 31646, 47130, 11821, 60463, 28776, 740, 51426, 36853, 17966, 46240, + 9045, 61078, 26005, 38783, 12840, 52375, 30267, 1722, 64607, 36283, 20370, +49579, 5289, 33432, 55607, 21003, 40380, 8240, 63451, 32104, 17237, 50764, + 4269, 47073, 28372, 16239, 64816, 37392, 720, 54689, 28062, 16660, 49323, +36299, 3299, 63003, 23432, 46299, 13690, 37304, 53046, 7964, 28677, 57736, +20211, 46047, 11123, 38939, 22103, 60472, 3076, 33337, 53462, 17099, 43585, +12018, 64299, 27160, 38709, 5067, 57605, 17624, 35553, 49864, 2114, 29906, +60641, 11165, 43639, 23394, 53322, 852, 40971, 26988, 56846, 13072, 30758, +53942, 3411, 42761, 24856, 58007, 10050, 40282, 20671, 53111, 30427, 8325, +59754, 37219, 18691, 51223, 3441, 33167, 62113, 14790, 39500, 24510, 51068, + 4642, 33413, 56001, 14496, 42570, 26775, 60678, 6709, 46676, 29564, 16851, +55443, 37531, 10715, 47820, 22879, 57965, 491, 30101, 44962, 18589, 55145, + 6642, 38295, 27177, 60053, 14384, 34199, 52499, 4408, 41342, 21357, 55263, +14917, 34097, 48359, 4956, 59525, 21264, 38629, 14331, 52542, 29532, 7575, +56168, 37246, 19553, 47607, 11295, 61618, 26022, 40994, 7849, 55110, 22027, +40065, 11073, 63995, 26523, 39046, 4008, 48146, 22186, 62647, 14250, 34622, +45410, 7889, 61111, 28021, 16108, 53686, 37718, 3618, 49880, 27407, 16588, +62171, 38140, 1662, 30961, 48639, 19619, 55377, 9319, 40670, 26568, 62961, +13802, 35028, 53857, 5595, 43517, 23110, 59954, 12654, 41065, 27178, 55336, + 4184, 40589, 24616, 60602, 12691, 34164, 46092, 7382, 55104, 22255, 41045, +11747, 59356, 26076, 39005, 6464, 50724, 17398, 33029, 64738, 2844, 48139, +25374, 41552, 11106, 62470, 19766, 37705, 52707, 8116, 29345, 61470, 14418, +46364, 28219, 1986, 64619, 35804, 18454, 53605, 6483, 34263, 46936, 17730, +62133, 10934, 41295, 26443, 57748, 3205, 31997, 50539, 13053, 42794, 25515, +61607, 1578, 37007, 53751, 15485, 29490, 47621, 6088, 64240, 20621, 31232, +54153, 9795, 44668, 18040, 32017, 63358, 4688, 44100, 28552, 15552, 51622, +35726, 6247, 57615, 24432, 41214, 12657, 51182, 19823, 32739, 58262, 167, +46177, 19735, 36570, 62303, 10862, 29107, 51533, 19895, 41853, 1620, 63154, +29524, 16075, 53550, 36007, 9999, 48805, 24047, 65070, 2548, 41474, 22128, +57269, 9194, 49296, 27174, 40856, 12139, 60818, 21773, 47952, 4438, 33020, +59342, 15620, 45050, 28154, 9593, 63674, 34854, 17528, 53925, 3991, 46414, +37849, 15820, 33509, 54871, 5667, 48478, 24190, 40368, 11403, 63858, 25766, +43576, 5319, 51010, 17831, 31860, 56381, 1302, 45533, 28204, 16046, 60177, +36172, 5864, 50104, 20629, 32154, 61789, 9048, 43554, 20622, 56506, 28682, + 4746, 49558, 37262, 20383, 58558, 1658, 37911, 53317, 15076, 30971, 47549, + 4129, 61861, 24623, 38874, 10831, 59054, 19934, 33095, 47057, 6597, 55623, +24290, 40336, 10004, 58970, 19134, 30335, 52847, 5453, 41530, 22965, 60029, +10076, 31804, 52795, 15207, 45848, 29098, 5942, 63539, 35335, 17552, 50950, + 9071, 34999, 55070, 14064, 43888, 27589, 6965, 60088, 37565, 19733, 53267, +12213, 43053, 22120, 64009, 3228, 35815, 50629, 15212, 30737, 56347, 2397, +42401, 24389, 63062, 10786, 32982, 51045, 18839, 42201, 1857, 55329, 27117, +38379, 12191, 47972, 24109, 62615, 815, 41435, 19101, 52448, 30492, 10139, +56821, 37347, 18603, 49650, 2662, 34171, 62728, 17434, 44392, 9038, 33197, +54723, 19339, 43265, 1635, 64970, 31278, 17081, 51884, 37614, 4062, 46950, +24070, 57771, 11179, 40615, 23983, 47999, 7259, 64647, 18750, 30850, 45537, + 9249, 56971, 18405, 29876, 50767, 556, 41157, 25593, 61162, 10109, 38636, +22591, 50526, 13297, 33958, 55346, 5726, 44539, 27390, 16061, 56309, 38220, + 6744, 30698, 63614, 21028, 49308, 3044, 34473, 45600, 15892, 57948, 27560, + 8701, 50400, 37834, 17026, 60923, 11711, 47029, 18863, 34812, 58748, 1298, +45740, 20330, 36708, 57936, 8887, 31774, 51853, 13111, 43260, 25496, 58963, + 6350, 41358, 22313, 53369, 10345, 32863, 60921, 20143, 42913, 1485, 55870, +31199, 16127, 51435, 35724, 5846, 65034, 25114, 48807, 12797, 40382, 23248, +57804, 4445, 34888, 52050, 20213, 42009, 8724, 48406, 24955, 62998, 12407, +41679, 22107, 54646, 7320, 39355, 26851, 58038, 13798, 38655, 21228, 63504, + 6055, 35086, 50841, 14548, 40034, 22967, 60992, 7429, 32095, 50154, 18415, +42740, 2293, 63205, 29286, 15484, 49811, 35544, 11023, 57357, 25591, 42304, + 644, 47627, 21870, 64672, 12253, 39642, 25577, 54110, 5522, 38414, 21236, +59114, 13669, 35729, 50794, 3958, 29020, 62752, 19596, 43789, 9265, 31811, +48777, 13344, 63471, 23675, 40678, 2975, 46973, 21553, 56200, 11474, 39113, +25893, 61129, 98, 42929, 22954, 52553, 13125, 31578, 63449, 9834, 42280, +23100, 50520, 2035, 32903, 62591, 17718, 45735, 4596, 33427, 58294, 15143, +44530, 28583, 370, 52984, 36988, 20507, 57975, 12158, 43349, 27270, 51174, + 1963, 33052, 56081, 12969, 41685, 23066, 58546, 5973, 31836, 45400, 14471, +64400, 29210, 6870, 51615, 35473, 17606, 56794, 11598, 43247, 23483, 61079, + 4135, 33827, 50691, 16563, 46320, 28563, 487, 58690, 34847, 18740, 50777, + 8337, 44015, 21917, 62604, 14649, 32306, 50594, 1207, 41326, 26290, 64220, +14437, 30522, 50223, 3512, 34403, 62055, 15644, 45807, 27837, 8488, 53330, +35998, 20686, 58432, 12774, 34500, 46538, 6303, 59564, 21179, 33262, 43783, + 4464, 51476, 19739, 36305, 58246, 9608, 29729, 49623, 13305, 41925, 24420, +59691, 2943, 38599, 22189, 54007, 7955, 34808, 48219, 15107, 63769, 23346, +39154, 6572, 55319, 21447, 46560, 10528, 33984, 60537, 19704, 44652, 2288, +34169, 57241, 12853, 41623, 24925, 51117, 6851, 30287, 59076, 20547, 47740, +11977, 40572, 25527, 61478, 2100, 32427, 53451, 17735, 42752, 4264, 63763, +26816, 39298, 9335, 55996, 17163, 35155, 49740, 5727, 31207, 59712, 17866, +43720, 9100, 50552, 34884, 19511, 58476, 5188, 45724, 22763, 39605, 12203, +55206, 26927, 45022, 6020, 34119, 63817, 14265, 42664, 24482, 54488, 284, +40542, 18331, 62643, 29436, 8600, 51338, 36867, 18831, 56805, 6047, 44679, +26570, 38884, 10621, 62456, 19464, 49143, 13845, 31155, 44665, 3331, 59987, +29251, 13629, 53610, 35254, 19124, 46904, 6948, 62549, 20931, 36263, 54186, + 9460, 30093, 46965, 13244, 64308, 23991, 41227, 2934, 54776, 17197, 36064, +50704, 11484, 30147, 61160, 17921, 45231, 7068, 30948, 65138, 16098, 45102, +27448, 8479, 56511, 36597, 13706, 51906, 22897, 42610, 2020, 54409, 28666, +15075, 38108, 63193, 3624, 31481, 50637, 14016, 43239, 23754, 55252, 1271, +34631, 46514, 18871, 64183, 11892, 35137, 44166, 18119, 56133, 2848, 41234, +25870, 59646, 11874, 45208, 20790, 31805, 57063, 1438, 48054, 29034, 15178, +63031, 36413, 4739, 48223, 25905, 57802, 10200, 38751, 24130, 47486, 6548, +62158, 21697, 39385, 12476, 54032, 26226, 43230, 5565, 60375, 23739, 39615, +11546, 64852, 21538, 49166, 8256, 40520, 26153, 58767, 5663, 36743, 49631, +15033, 28922, 61920, 6784, 43721, 24076, 51558, 10988, 31731, 58520, 20043, +48376, 4853, 39549, 27169, 60190, 11140, 41822, 24697, 56505, 6790, 40602, +22042, 54366, 13266, 31916, 61580, 171, 43112, 22743, 53396, 13507, 34405, +55007, 2979, 42139, 24567, 61953, 11611, 33026, 47081, 20528, 58758, 6833, +32506, 52670, 18673, 43425, 1523, 63080, 26075, 40027, 14047, 59978, 29512, + 3729, 52552, 35671, 17545, 46830, 9674, 58827, 20166, 32320, 44111, 7397, +53684, 17805, 30815, 63201, 440, 44032, 30523, 21271, 56461, 4713, 42276, +25862, 51703, 10465, 30551, 62493, 13981, 42767, 24303, 55440, 2967, 39373, +22719, 49170, 11204, 63951, 19454, 33911, 44754, 4659, 51257, 17381, 30074, +59613, 7608, 41349, 23692, 48533, 11704, 58651, 21304, 40812, 2086, 47389, +26507, 60218, 9743, 31172, 45644, 15597, 61876, 28986, 397, 54114, 37921, +15390, 31212, 56700, 3869, 47545, 28044, 15317, 61584, 36045, 2523, 52720, +24404, 42658, 11885, 48977, 21835, 59774, 1535, 32606, 45731, 15868, 64438, +28484, 4480, 51657, 36067, 13522, 55813, 24313, 47595, 5877, 41534, 21817, +61351, 9492, 36906, 53452, 16148, 29741, 48735, 3081, 56254, 23958, 41847, + 9570, 63867, 23054, 41541, 1703, 48602, 26700, 57151, 15240, 33543, 45272, + 5095, 59584, 27602, 16524, 50972, 37451, 6079, 58431, 28823, 16018, 49876, +35478, 8447, 64903, 28192, 16413, 50420, 35547, 7427, 58932, 24650, 44701, + 3325, 35454, 54257, 16129, 30448, 57917, 10726, 43118, 22907, 53192, 6885, +39777, 26732, 65413, 9878, 49229, 17375, 32474, 47188, 6562, 62182, 25167, +38737, 9446, 53086, 19520, 29892, 63696, 4624, 46564, 28424, 16837, 54738, +36003, 2346, 47927, 22267, 59719, 12284, 41956, 25009, 48264, 967, 58663, +26919, 39876, 10651, 51993, 20469, 30769, 64538, 7316, 42370, 22235, 55010, +11833, 40499, 26668, 61264, 2911, 38983, 26013, 54658, 11318, 43792, 21294, +58785, 7022, 33148, 52215, 19821, 43051, 10241, 55846, 26610, 38704, 846, +60182, 18836, 37682, 49634, 4991, 28815, 56124, 14735, 44518, 27449, 1503, +65124, 35838, 18200, 46725, 11415, 55026, 25705, 41372, 218, 63518, 18860, +36176, 51076, 5965, 31372, 61799, 18358, 42153, 11838, 56296, 25889, 46152, + 1156, 33019, 58917, 14327, 44122, 29358, 4444, 64927, 37626, 16970, 49849, +27693, 7961, 54505, 36380, 21085, 63157, 4060, 44198, 18537, 34848, 55626, + 694, 43241, 22666, 65024, 8291, 37678, 49541, 16535, 28845, 58578, 6732, +46151, 34535, 19135, 54316, 12083, 42131, 25509, 61262, 2375, 40790, 23515, +54683, 12064, 38570, 26439, 64507, 3132, 30892, 47217, 13978, 61128, 26317, +38354, 862, 49477, 21200, 62306, 15241, 31656, 47184, 3260, 59059, 21299, +38367, 13326, 52168, 30509, 5561, 55981, 37612, 20451, 49502, 2538, 33627, +64238, 13543, 47106, 24162, 40854, 754, 57749, 22905, 6602, 58856, 35591, +18523, 49901, 9367, 42043, 22151, 63311, 104, 48435, 27151, 41492, 10971, +58312, 24850, 41056, 2175, 51740, 17902, 35412, 57199, 6373, 31226, 46448, +19794, 63394, 8226, 41732, 26763, 53032, 2459, 35197, 57953, 12889, 42437, +24221, 51821, 842, 30423, 58885, 18729, 43222, 5071, 63965, 29320, 16722, +49480, 36580, 7805, 57665, 22237, 43658, 11662, 60684, 25961, 40782, 7039, +51840, 17228, 32196, 59561, 8216, 42957, 25088, 57478, 3831, 30941, 47844, +20163, 54050, 8711, 38926, 26981, 64810, 5307, 48756, 18856, 35348, 60882, + 7931, 43285, 23195, 51365, 11284, 32544, 55399, 18824, 45027, 1115, 32293, +61370, 16195, 48698, 29245, 8484, 57735, 35499, 18091, 52478, 378, 33624, +48192, 14168, 57110, 25202, 41890, 3832, 52912, 18786, 35458, 61598, 11097, +30993, 51218, 20304, 42720, 2230, 56136, 25152, 41167, 13130, 63618, 21803, +39117, 670, 53832, 25582, 38402, 13214, 64154, 21448, 49224, 3091, 32432, +45433, 15538, 62078, 28308, 8388, 49886, 36155, 16434, 59063, 29219, 5341, +49360, 37050, 15944, 63402, 28275, 7877, 49745, 36946, 17993, 55786, 4026, +43875, 28984, 15316, 64789, 37627, 9186, 49842, 27937, 16486, 56673, 36905, + 7284, 46423, 23596, 54945, 12610, 40765, 22196, 65326, 1995, 29707, 48576, +13022, 56440, 25632, 41590, 5708, 59586, 19391, 34366, 46572, 11183, 53020, +18248, 34056, 65110, 7112, 41145, 22742, 50348, 2099, 34372, 61227, 15628, +46609, 30088, 7318, 60235, 38029, 15595, 28916, 48612, 121, 56119, 23873, +40387, 12157, 63293, 19188, 33597, 44888, 4068, 55397, 25410, 38753, 9087, +63542, 32885, 16575, 50621, 36066, 5373, 56516, 21977, 47970, 11369, 40628, +26200, 65382, 6156, 48946, 22654, 40453, 13130, 59844, 29368, 7718, 50949, +38147, 16512, 30061, 64181, 5613, 40318, 25958, 56019, 10451, 39248, 25647, +49150, 6403, 54849, 19433, 33176, 44693, 9991, 59095, 22292, 38813, 1113, +65023, 26845, 46070, 13811, 32291, 58412, 3934, 44828, 20552, 33888, 63048, +11067, 44415, 18112, 32946, 49385, 6120, 58167, 21862, 38260, 12604, 52073, +30133, 7591, 65205, 37706, 20659, 49367, 996, 33243, 60895, 13002, 41327, +23977, 54885, 2252, 43771, 19580, 57140, 29980, 4640, 49249, 37230, 18765, +61741, 11218, 47872, 26890, 40174, 8748, 64490, 24298, 48340, 903, 40285, +21051, 60959, 13857, 38307, 25128, 56372, 3133, 30946, 45570, 13547, 55918, +23670, 41545, 1376, 59362, 17946, 31840, 50102, 11005, 42523, 24399, 61543, + 7552, 34615, 44581, 20129, 56061, 10314, 39639, 26643, 65313, 5706, 38899, +18306, 53740, 30485, 8842, 61393, 36588, 17909, 49282, 2179, 34704, 56920, +15989, 46858, 29042, 5981, 59511, 36071, 17879, 50306, 9845, 41897, 23305, +65424, 4394, 37110, 49483, 15958, 28680, 61042, 2091, 46471, 35242, 17654, +63408, 11961, 42456, 25160, 51000, 7638, 33282, 63997, 17736, 42954, 10057, +52462, 29934, 16791, 57154, 37549, 3437, 50254, 27644, 14991, 59158, 38062, + 8721, 28544, 54216, 12769, 43685, 23658, 57466, 2382, 38405, 21702, 50795, + 8972, 36308, 62434, 15915, 28500, 52353, 6083, 47372, 27465, 15727, 57432, +35355, 86, 52852, 23908, 42522, 11205, 58710, 17165, 30861, 47220, 8863, +52304, 27595, 15130, 60593, 37980, 4896, 28482, 52605, 14879, 34866, 60202, + 9567, 41801, 22760, 55107, 1155, 38549, 27136, 64332, 8021, 43807, 21770, +52273, 14564, 32966, 58705, 6060, 43270, 21888, 52348, 14913, 33145, 57655, + 7212, 43203, 24929, 55842, 13228, 34145, 44545, 8266, 54062, 25223, 39754, +11338, 56517, 22460, 48853, 7377, 33685, 64935, 15159, 44950, 27312, 9103, +57817, 35225, 16149, 51635, 28559, 7713, 60947, 34693, 15274, 50017, 29705, +28148, 12664, 52354, 37767, 3032, 60556, 26160, 39524, 13980, 53368, 25314, +38443, 4793, 61881, 21667, 38357, 12665, 48517, 26253, 60736, 10181, 40077, +24506, 54443, 641, 38917, 22104, 59958, 10137, 48160, 25011, 40463, 14340, +54564, 28403, 5492, 62594, 37107, 20358, 49616, 10258, 33363, 54948, 13013, +41109, 24348, 59675, 3280, 34411, 52341, 13353, 39869, 24821, 56162, 148, +38854, 19602, 65421, 28202, 4690, 49405, 37688, 20390, 61842, 9517, 41273, +22793, 52046, 14042, 34024, 62208, 463, 44959, 21059, 32984, 56796, 10587, +41746, 17276, 53424, 29867, 2137, 58456, 35336, 17788, 47082, 7540, 64931, +26422, 40076, 12615, 56622, 25327, 39780, 3504, 51361, 20212, 37770, 60094, + 9541, 30388, 46188, 20437, 63653, 7090, 38726, 27068, 50572, 13607, 36993, +57805, 1314, 28931, 45485, 17480, 65404, 9131, 38915, 26945, 54358, 4757, +33409, 47772, 17346, 59364, 9654, 42281, 27053, 57037, 5397, 47561, 29786, +14795, 59038, 36008, 9730, 52819, 20696, 31613, 47257, 2323, 65264, 25185, +40044, 11868, 52319, 20440, 33608, 57353, 1279, 43188, 23082, 51876, 10727, +34495, 61424, 16253, 44928, 27444, 2105, 53075, 36461, 19843, 58974, 4510, +45084, 31231, 15493, 62665, 35273, 42, 48412, 26712, 57138, 8378, 33831, +44378, 14576, 61293, 23734, 38779, 2761, 54565, 21769, 38287, 9905, 48350, +27055, 62233, 3455, 31593, 44560, 15335, 58513, 27934, 8712, 53044, 38211, +16778, 28351, 56754, 9837, 41929, 23164, 53638, 5404, 36502, 65288, 16902, +30387, 45561, 9409, 58171, 26625, 38363, 2564, 54321, 22442, 49041, 10330, +30777, 61418, 18706, 45137, 801, 29943, 54266, 13132, 42005, 24312, 60955, + 2667, 32327, 44916, 18314, 58272, 10117, 32059, 53340, 20720, 44366, 1348, +33054, 62406, 19838, 43251, 10526, 54492, 21260, 34560, 47973, 81, 60407, +19072, 33749, 45074, 12286, 58594, 23290, 40716, 2860, 62330, 25842, 43328, +11840, 54290, 17693, 35985, 50623, 8059, 30172, 54901, 17705, 41802, 6432, +60146, 30597, 15333, 50626, 37529, 195, 61344, 25369, 47622, 13431, 40211, +24957, 62285, 2925, 47746, 18054, 35579, 56431, 10470, 29267, 53657, 19118, +43533, 6763, 64126, 30118, 14825, 50578, 36553, 9173, 62464, 23532, 42392, +13581, 52155, 29100, 1522, 55648, 36939, 19684, 46255, 4079, 58579, 27167, +38504, 11536, 54974, 22054, 49182, 4753, 41611, 27175, 63009, 11529, 38749, +21243, 51059, 5964, 33226, 64313, 14517, 43679, 23480, 51822, 3876, 35796, +58376, 15092, 30563, 51372, 44, 47223, 27940, 14849, 59563, 36510, 3519, +52190, 22631, 47764, 12773, 41719, 25865, 56083, 4974, 41001, 22546, 63147, +13064, 31912, 52737, 3884, 41360, 24760, 63794, 13444, 33920, 52869, 765, +43195, 25231, 56790, 12454, 40172, 21884, 53448, 6540, 32567, 57721, 18974, +42597, 9251, 53127, 21027, 31898, 56363, 4309, 41850, 19645, 58756, 31149, + 2231, 49312, 35734, 20217, 62254, 7329, 44903, 31027, 12420, 60465, 34860, +20664, 47323, 4707, 62805, 37842, 16534, 30052, 48845, 7003, 64472, 25883, +40292, 11307, 53059, 20248, 37674, 59474, 3629, 30279, 50062, 19480, 41955, +11182, 62733, 23521, 43999, 7476, 50749, 28877, 15617, 61822, 37238, 2616, +49262, 21367, 34479, 64523, 6046, 45759, 21015, 33570, 56604, 11594, 42968, +24401, 50505, 2993, 31822, 63528, 18536, 45070, 10961, 32402, 57431, 17475, +49335, 3592, 34262, 45211, 13333, 62746, 25330, 39544, 568, 48293, 24355, +60499, 10354, 38920, 21593, 51044, 3937, 31659, 65203, 17997, 46435, 1555, +32847, 61754, 17142, 44114, 4300, 34841, 60103, 16856, 44042, 28709, 1047, +53791, 36312, 16592, 61670, 27724, 3872, 49781, 37515, 21197, 54980, 2134, +42241, 20536, 65509, 30570, 46392, 19329, 56183, 10420, 41286, 24082, 48953, + 6017, 64682, 17321, 31187, 46644, 8805, 56960, 24107, 40334, 3494, 52480, +17589, 34062, 65007, 6875, 47775, 29342, 13719, 56706, 35643, 18763, 50442, + 3964, 33014, 64433, 18227, 45799, 9531, 33439, 49093, 17192, 60927, 2757, +29549, 45584, 21150, 64830, 8982, 30674, 50860, 19067, 45655, 6340, 33362, +62636, 16013, 45508, 29015, 8793, 53568, 35529, 15954, 56675, 28861, 1946, +49997, 35984, 12711, 59302, 24466, 42261, 6756, 55261, 28650, 15023, 50340, +36956, 3212, 62743, 24444, 46662, 12524, 40732, 24277, 61713, 4158, 39927, +22816, 51940, 14416, 33945, 59201, 5536, 42832, 22161, 53142, 10442, 31632, +64443, 15812, 44318, 27357, 1726, 54886, 37974, 16333, 31364, 60863, 4638, +43664, 22859, 54509, 10454, 34271, 48402, 19640, 59470, 5906, 34432, 46638, +18913, 56419, 11169, 38459, 27231, 62227, 2920, 41097, 22436, 51107, 11396, +33959, 55565, 18392, 44037, 1142, 33880, 63038, 16661, 44698, 27871, 5045, +57526, 35224, 17779, 54753, 6820, 46721, 26613, 39324, 10188, 63714, 17348, +31869, 53227, 4811, 41151, 24379, 58064, 13509, 32169, 47691, 8519, 64050, +24933, 39532, 12108, 54338, 22753, 43643, 6455, 59722, 24583, 39914, 11688, +51966, 17856, 30347, 63519, 4842, 46412, 34677, 18548, 49137, 12255, 57388, +26066, 40704, 6376, 60547, 22712, 48978, 13860, 36280, 55080, 839, 29631, +47889, 20452, 64440, 4365, 31671, 45163, 14690, 59608, 27768, 1606, 51423, +37809, 13313, 48150, 24035, 61875, 6707, 41664, 21550, 55664, 11325, 32193, +47107, 17668, 59116, 5681, 39339, 26604, 53193, 14887, 31831, 64733, 6701, +45023, 35049, 15986, 55679, 27439, 8309, 50183, 37667, 19876, 63731, 3477, +34886, 46602, 13944, 55944, 25212, 40041, 5195, 59046, 17444, 31330, 51981, + 8329, 42355, 17144, 65176, 29002, 3834, 51225, 37300, 15257, 56442, 28183, + 9183, 49400, 36980, 20420, 63680, 4960, 32412, 46719, 20037, 60985, 1576, +39222, 26068, 56843, 13579, 47018, 28525, 8457, 54381, 35628, 19633, 59484, + 4327, 32374, 45877, 11895, 55275, 23469, 40141, 8817, 60132, 26398, 43005, + 1941, 51391, 30619, 15854, 58052, 35721, 4224, 49294, 27839, 17012, 54561, +38052, 5303, 31707, 59753, 18140, 46521, 9464, 31746, 62925, 14214, 41734, +23625, 52459, 6089, 33579, 61192, 15764, 45111, 29580, 8505, 59240, 35698, +18731, 53502, 2219, 42801, 26039, 60693, 8855, 40234, 23896, 55517, 11619, +39220, 21615, 47980, 5376, 63125, 25823, 40722, 11561, 52897, 19117, 32812, +63884, 8533, 44904, 28779, 15952, 54758, 36081, 1542, 60592, 19010, 35653, +49574, 9503, 30311, 57536, 15116, 43301, 21945, 50983, 5890, 32045, 56362, +16182, 45339, 28582, 9436, 62266, 35256, 19075, 50110, 2649, 43690, 27170, +64130, 10764, 38567, 26317, 50304, 131, 34093, 62639, 15029, 45741, 27457, + 8905, 53844, 37401, 16362, 61010, 27536, 5795, 49626, 37226, 16002, 55921, +28593, 704, 49521, 36981, 18835, 56822, 10242, 43341, 23298, 52228, 1603, +32667, 56429, 15006, 45588, 29759, 5107, 55609, 35187, 17344, 45818, 10064, +65516, 25895, 40758, 1888, 56741, 21627, 38957, 14283, 53492, 31047, 5239, +59997, 35364, 17780, 50215, 9536, 30261, 54238, 17123, 42420, 1458, 62200, +19057, 30671, 48222, 8252, 59581, 22162, 38903, 13124, 55386, 25629, 48399, + 4600, 40254, 20562, 62019, 28741, 8537, 51446, 37035, 11620, 56146, 19561, +36326, 50117, 6912, 30046, 63454, 19616, 42528, 12065, 54430, 26894, 39098, + 5750, 59372, 20010, 35981, 51316, 9661, 29872, 57193, 18529, 47359, 6257, +32793, 63444, 12447, 46659, 23772, 41517, 7064, 53178, 18038, 32133, 62942, +11100, 45718, 17261, 35813, 57392, 5178, 51889, 13278, 33391, 61360, 1562, +44380, 28295, 12362, 55050, 36163, 19988, 51287, 1073, 37800, 59546, 14432, +31663, 46558, 11210, 55875, 20919, 31514, 44512, 1810, 62228, 23393, 40894, + 7492, 47480, 26952, 59094, 11426, 39107, 21887, 53220, 376, 31320, 57451, +20792, 43812, 8039, 35821, 53453, 14777, 32226, 56689, 1382, 42133, 22985, +52896, 13835, 30763, 61246, 3717, 48757, 23663, 41958, 11964, 58451, 21694, +46293, 6037, 33370, 63423, 16948, 44852, 28841, 3959, 53383, 36300, 18239, +64208, 8303, 44515, 29777, 15888, 52961, 34923, 5660, 59509, 20713, 30851, +50433, 9813, 43611, 19562, 54309, 31120, 242, 63245, 35725, 13374, 50258, +23997, 45878, 3065, 36573, 58271, 14422, 29063, 47198, 6125, 62692, 24061, +39824, 11690, 51661, 17994, 30678, 56175, 3108, 41302, 25261, 63084, 12790, +40746, 22963, 52744, 66, 32270, 60458, 14269, 43384, 24777, 53592, 8278, +34731, 64266, 19443, 46879, 6129, 31609, 60675, 14133, 46534, 27333, 7949, +53723, 37781, 19477, 61256, 11400, 42265, 22672, 51772, 2717, 32905, 60186, +20025, 43394, 8255, 50126, 21013, 30051, 62091, 608, 45956, 19314, 29949, +56417, 5367, 42088, 17929, 51849, 30733, 2490, 62382, 36059, 18608, 49620, + 9314, 33066, 58051, 20786, 47920, 1657, 39599, 25820, 59647, 10254, 41248, +22163, 51561, 1127, 32321, 64243, 15366, 45732, 29061, 8095, 56818, 37792, +18598, 46495, 5611, 59957, 26113, 41978, 12078, 54837, 19080, 37283, 49689, + 8122, 30451, 62960, 16112, 45267, 28732, 3236, 53528, 35760, 14449, 58415, +24900, 45239, 1147, 41800, 22190, 64333, 13500, 34839, 47921, 3414, 57381, +22309, 40350, 12140, 51336, 28791, 1884, 62317, 36865, 16730, 49305, 28496, + 6564, 59295, 36160, 16758, 53744, 27523, 8970, 49976, 36041, 20524, 62963, + 2745, 45826, 21421, 34258, 57316, 10152, 44702, 20372, 32907, 48719, 7083, +61896, 18632, 30958, 44880, 790, 53468, 27962, 14994, 57632, 35501, 6854, +49962, 24232, 43287, 10568, 62886, 19194, 33252, 51172, 2821, 41393, 23275, +64491, 9848, 30205, 51284, 14863, 41253, 24056, 54061, 4977, 38702, 21457, +63364, 14156, 32743, 46385, 7531, 55524, 24501, 40925, 11026, 60654, 21534, +46883, 327, 34428, 65403, 15682, 45388, 28381, 7061, 56806, 36583, 20091, +51035, 2350, 43495, 25929, 63745, 12076, 38988, 21420, 48713, 513, 57014, +26717, 38973, 12852, 49137, 22179, 64735, 7074, 32172, 46439, 15857, 57793, +29434, 797, 49960, 35378, 17212, 60318, 7950, 32634, 54140, 15392, 45202, +28355, 2071, 57646, 37745, 20787, 50765, 6198, 42422, 24384, 62234, 13748, +31275, 51384, 7729, 42732, 24661, 64921, 298, 38876, 26815, 48543, 11604, +61680, 24055, 40726, 3022, 48233, 22277, 58737, 7366, 39465, 25768, 55197, +13646, 41736, 22994, 59257, 5402, 39822, 21296, 55520, 12742, 39486, 23537, +59587, 7013, 30677, 50130, 14230, 37986, 56999, 3845, 29569, 46185, 19427, +65328, 9001, 39818, 24350, 52777, 13369, 31534, 63682, 3839, 45593, 28850, +16270, 61114, 36518, 7821, 48114, 23095, 63295, 12581, 40944, 26856, 60150, + 545, 48916, 20448, 35846, 53847, 8738, 31462, 47016, 17896, 61485, 3315, +41448, 25789, 47425, 12338, 56639, 24171, 41416, 6723, 62950, 20614, 33894, +52115, 10918, 40911, 25779, 57277, 4372, 32939, 45631, 17658, 61346, 332, +40537, 26797, 51967, 9909, 36082, 59161, 15963, 30475, 46100, 1786, 64835, +20927, 29594, 44217, 4980, 59134, 17188, 33686, 52516, 2265, 41957, 23633, +57228, 10174, 49172, 22499, 41217, 13347, 63104, 25957, 48729, 2677, 40787, +21757, 55725, 13738, 38752, 23396, 59444, 4816, 29996, 48837, 14050, 58314, +26403, 39598, 475, 48934, 22338, 60268, 9501, 40257, 25075, 20206, 63467, +28358, 8498, 49994, 37088, 14600, 57540, 23089, 46203, 4448, 31771, 64099, +16454, 44348, 28087, 5817, 61379, 37556, 19038, 51381, 9167, 42015, 26146, +58445, 12763, 38473, 21288, 53499, 3128, 34137, 60601, 13614, 42229, 24080, +50917, 8813, 34140, 63640, 15572, 48338, 27722, 4376, 62160, 37701, 12727, +47049, 25098, 60095, 5803, 32906, 44350, 18391, 55505, 9782, 38832, 27163, +64537, 1136, 36666, 53096, 15249, 29903, 48711, 9664, 60091, 23360, 40473, +14232, 51217, 31072, 869, 58747, 35520, 20230, 47673, 10804, 55756, 26636, +38963, 1570, 65361, 17058, 36268, 49537, 8420, 28820, 57335, 16312, 44333, +27879, 6194, 60689, 38204, 16966, 30196, 55616, 8056, 48925, 22617, 40346, +13250, 59710, 26255, 48550, 938, 41256, 22058, 52983, 9949, 33119, 58941, +19074, 47609, 7367, 38550, 27038, 64616, 11687, 48937, 22322, 38674, 4322, +51811, 17769, 32194, 58258, 1537, 44563, 28344, 16119, 52661, 37057, 3993, +59159, 28796, 15808, 51032, 36086, 359, 46335, 24922, 64515, 9759, 31345, +44964, 14856, 55599, 23853, 39695, 5820, 60816, 18644, 32835, 53564, 9882, +42512, 23845, 65488, 12768, 35526, 50648, 7062, 29079, 57077, 20403, 41406, +10952, 60926, 25763, 41094, 3696, 54030, 23104, 44646, 13808, 31867, 65032, + 5255, 47686, 29305, 16499, 53060, 37430, 11435, 55748, 25506, 44084, 3966, +31353, 63051, 15949, 43893, 28164, 10056, 52520, 35660, 17410, 62693, 2499, +34422, 46369, 20948, 58849, 5555, 40442, 25850, 52203, 11439, 32266, 64118, +20590, 47424, 4969, 39158, 27138, 60292, 12765, 33101, 52577, 7267, 45555, +28494, 16828, 62828, 35869, 8730, 45738, 23436, 53106, 13970, 33042, 58654, + 4080, 43615, 24049, 51266, 12516, 30825, 64864, 645, 44632, 29053, 16210, +57829, 38091, 7178, 29324, 54043, 14621, 47090, 27907, 1952, 63425, 36587, +13501, 53767, 24904, 42138, 4205, 60126, 20730, 34716, 51190, 8308, 42908, +23029, 64814, 13531, 41518, 26621, 56384, 4526, 34516, 53770, 13085, 42161, +24457, 60662, 6792, 34640, 46935, 18284, 57825, 2174, 42363, 27092, 61033, +13247, 48303, 30203, 799, 57055, 36832, 19905, 50175, 12012, 31855, 63834, + 3253, 42514, 23335, 52489, 11860, 39614, 25208, 56088, 3774, 43458, 21532, +62365, 10268, 39692, 23043, 53904, 14433, 30684, 57757, 4895, 42255, 22831, +52783, 11036, 32181, 61923, 17901, 43125, 3940, 54379, 26727, 39466, 12223, +60000, 24191, 38739, 6185, 55111, 20219, 32737, 46792, 10850, 62599, 22812, +39586, 4330, 51797, 34389, 17389, 65214, 9724, 31294, 46751, 15009, 53248, +29283, 3002, 58279, 35260, 17487, 46959, 9201, 54456, 19839, 34582, 59064, + 5430, 44626, 19061, 36016, 54174, 8725, 30176, 64592, 18766, 42974, 12436, +53018, 30732, 1362, 63069, 35173, 18087, 50830, 9308, 43930, 27133, 52587, + 3192, 32996, 64985, 15489, 44998, 27918, 1689, 52653, 35910, 18470, 61663, +10827, 43391, 26423, 51602, 2558, 33489, 58130, 15410, 43965, 27526, 6363, +59974, 36778, 21004, 51543, 10868, 42318, 25388, 57956, 2884, 38908, 21401, +54139, 6670, 32802, 47011, 18026, 58120, 10604, 40104, 26909, 64021, 4801, +38275, 22529, 55572, 10430, 49310, 27252, 38385, 857, 59272, 18210, 31703, +49888, 3835, 43713, 22663, 64141, 13874, 35518, 54674, 7885, 42623, 22931, +50960, 11233, 31429, 65363, 18743, 42850, 4972, 56520, 24952, 41594, 13850, +52831, 32553, 7470, 55333, 35756, 18120, 47455, 10613, 60950, 37914, 15281, +28738, 48516, 8044, 64135, 24756, 38392, 23, 47141, 21454, 58573, 7784, +39238, 26862, 54704, 11117, 43398, 25784, 64670, 1332, 31818, 45715, 15751, +55062, 35666, 9691, 45088, 23377, 64348, 8285, 38682, 27070, 54652, 4180, +43483, 36346, 53084, 2408, 31649, 58603, 17906, 43983, 6243, 34666, 60473, +15237, 48589, 27459, 8113, 52998, 35519, 21326, 56412, 2274, 46206, 17089, +30489, 63142, 5229, 43671, 24194, 50898, 8466, 30661, 65387, 16825, 44812, +27628, 6041, 54274, 36382, 19453, 58697, 3606, 46235, 26196, 41252, 13777, +52143, 29070, 7609, 58632, 36385, 15596, 49861, 27660, 2324, 63095, 37281, +20841, 51366, 12327, 41464, 26069, 54968, 8268, 40204, 22310, 61696, 2494, +47507, 26166, 38852, 7347, 57164, 21418, 43851, 12405, 61322, 26820, 40414, + 4371, 50745, 17594, 33184, 58106, 7040, 43439, 22388, 52236, 13871, 33120, +61998, 3912, 46149, 27306, 14999, 51898, 35191, 1944, 63916, 23579, 42604, +12217, 52791, 31806, 4028, 65215, 36422, 18372, 50147, 8814, 37933, 58186, +15526, 28352, 45342, 5147, 61064, 23871, 41293, 1889, 53240, 19290, 31492, +57683, 8713, 46191, 24079, 41421, 12521, 62669, 21777, 40464, 7363, 48872, +26499, 65146, 12074, 40440, 23225, 56068, 6315, 33416, 48545, 17998, 58371, + 8679, 40306, 26276, 52826, 4120, 34268, 59430, 13780, 44630, 27554, 1705, +51243, 37236, 15828, 57691, 27936, 3514, 49418, 37428, 14885, 60222, 23852, +45350, 1030, 33641, 55468, 16060, 46787, 29220, 6106, 62847, 37829, 18134, +51392, 8943, 37286, 56497, 14716, 28041, 45275, 2347, 57905, 23855, 38722, + 9296, 60698, 21837, 48037, 14204, 37429, 55429, 283, 30348, 48050, 20758, +61348, 6942, 40587, 26865, 52404, 10773, 31304, 56270, 18681, 44684, 613, +34437, 60830, 17509, 42828, 9350, 55792, 19198, 37696, 50700, 3784, 28621, +62210, 14074, 43027, 24202, 55794, 202, 32422, 48593, 19305, 59489, 4871, +40187, 26281, 54898, 9723, 39994, 21591, 61774, 13705, 34710, 48332, 5782, +54543, 23876, 40467, 11935, 61386, 22851, 48657, 4837, 37653, 58471, 16260, +29723, 50725, 10458, 40803, 22302, 61413, 6477, 32108, 46915, 17465, 58344, +11305, 39338, 26690, 54933, 1820, 38473, 21582, 61656, 11416, 31182, 51980, +17629, 46016, 550, 31520, 57098, 20635, 49069, 8643, 39267, 26169, 65266, +11602, 38627, 22450, 52265, 6888, 34502, 62904, 14840, 45285, 28495, 5270, +53998, 36168, 17138, 59075, 13673, 31740, 45971, 5831, 53911, 29472, 16400, +61034, 35429, 8490, 47412, 26749, 50202, 1289, 33192, 59658, 16951, 45358, +32896, 9063, 64862, 24868, 47919, 2739, 40036, 21805, 58488, 8655, 33758, +51109, 18958, 43566, 1777, 63957, 26991, 41514, 13470, 53436, 24626, 40290, + 2767, 57103, 18449, 30326, 49739, 8237, 35401, 58765, 20347, 42721, 911, +55515, 25737, 39963, 12340, 62794, 25113, 39202, 4170, 50021, 21049, 29544, +63638, 10288, 46060, 28321, 14758, 51331, 37711, 1978, 57707, 27675, 14562, +49704, 36976, 4803, 60257, 28323, 16548, 49416, 36774, 6896, 57360, 25034, +40968, 11386, 61352, 19677, 30705, 47798, 4902, 55911, 22852, 40683, 11654, +58444, 26616, 39423, 5504, 54685, 21563, 38708, 11590, 62379, 22767, 49165, + 8578, 32329, 47096, 19326, 55559, 1056, 40284, 26904, 64878, 13933, 34757, +52464, 8377, 43117, 23509, 62150, 13077, 40212, 26331, 55310, 2427, 38455, +21307, 49024, 12334, 60279, 25340, 40195, 6973, 48082, 21570, 65191, 13062, +41865, 26488, 57293, 8501, 37102, 50891, 16096, 28864, 59900, 1898, 46930, +28470, 16712, 53694, 36829, 6024, 58416, 25091, 44507, 13357, 30659, 49095, + 2694, 63249, 22260, 38734, 12166, 49032, 24658, 61691, 819, 30651, 45716, +19089, 57770, 3647, 32323, 44106, 18568, 55119, 9321, 40255, 26544, 61068, +14717, 31974, 53515, 3106, 45557, 19992, 32303, 60403, 9192, 48461, 19911, +34570, 61244, 5671, 43898, 19379, 33150, 56448, 1940, 46760, 18622, 34475, +59656, 11952, 45463, 17328, 19409, 47328, 7893, 39567, 26733, 65268, 10661, +47698, 20136, 30582, 54896, 309, 42893, 18841, 63617, 29197, 9458, 50049, +37118, 20505, 59385, 11973, 41699, 26698, 54699, 905, 40630, 21876, 57496, +10506, 37603, 50092, 14424, 31884, 61984, 1594, 44541, 24835, 39294, 11303, +64296, 21039, 34426, 54641, 620, 44152, 20620, 33453, 56986, 9173, 47302, +17801, 35217, 60912, 6693, 31251, 47815, 17396, 59040, 4560, 43246, 26714, +51398, 10333, 33135, 65026, 15059, 42706, 24965, 54852, 3269, 38545, 24378, +48242, 9826, 64352, 19180, 31735, 52282, 12272, 42571, 24609, 62595, 2603, +38827, 26102, 54985, 11820, 42702, 21966, 59419, 7077, 37378, 50052, 16775, +31285, 58028, 5202, 45577, 27753, 16523, 55938, 38104, 7491, 29622, 60283, +20366, 47085, 2481, 34568, 56324, 16829, 48788, 29489, 9423, 62006, 36895, +15739, 50415, 27366, 6416, 60031, 38216, 15370, 30628, 49144, 3380, 55770, +24314, 38964, 10619, 60008, 21335, 46955, 1966, 31183, 53990, 14502, 40396, +25995, 62802, 3420, 38342, 21727, 46842, 11914, 63939, 30352, 16578, 50004, +37717, 6322, 61544, 21201, 34577, 46329, 9022, 63229, 20350, 33651, 44312, + 5161, 53338, 27569, 14053, 64608, 35786, 8082, 50178, 27640, 12720, 58301, +36528, 20120, 49552, 505, 30598, 59542, 21086, 44205, 6533, 33427, 63959, +19538, 48923, 8283, 40914, 27072, 52394, 3257, 34218, 64790, 17412, 46096, + 8873, 41542, 25184, 57544, 13046, 38922, 21901, 50966, 3812, 33762, 65412, +14262, 43862, 27582, 8331, 52560, 37047, 20914, 59464, 1939, 35032, 49442, +15711, 31724, 57783, 5573, 41171, 21931, 52122, 11378, 34240, 63902, 15573, +44216, 28095, 6827, 61175, 35885, 17659, 50294, 1275, 32636, 56763, 15643, +45340, 27990, 7873, 64058, 36632, 17882, 46502, 1716, 55815, 20311, 31017, +44491, 8527, 65518, 34865, 18503, 52318, 285, 43558, 27104, 57157, 14337, +37124, 50351, 3235, 29093, 63870, 18174, 43591, 9617, 50910, 27265, 39541, + 4035, 58610, 18844, 36936, 49624, 10060, 28706, 63963, 15770, 44359, 28130, + 4971, 56075, 35247, 18827, 50530, 2613, 31826, 58837, 16648, 44093, 27558, + 9260, 60363, 37742, 20895, 51520, 1428, 29771, 48505, 20699, 64716, 10054, +38864, 24479, 52985, 2556, 43791, 22183, 56942, 9309, 38822, 21187, 61667, +12970, 29795, 53687, 6506, 40888, 21880, 51261, 15106, 33296, 60562, 5186, +46219, 28189, 16700, 56110, 36131, 10364, 47883, 22293, 57993, 4721, 32249, +45932, 17698, 61384, 9769, 32015, 52418, 13221, 43587, 23673, 64125, 4646, +38600, 22424, 52439, 14377, 33378, 60902, 6849, 42880, 23092, 51786, 11413, +33533, 55957, 17071, 41874, 1086, 60018, 21346, 33777, 53076, 7923, 45752, +20072, 33542, 61400, 9193, 47333, 27551, 15254, 52424, 37884, 3914, 64412, +23135, 46765, 14055, 33788, 55120, 979, 43815, 27720, 16469, 62858, 36129, + 7856, 51386, 25399, 42048, 12947, 64563, 23240, 47319, 379, 33061, 56095, +16823, 45051, 27888, 4204, 63894, 37203, 17557, 53483, 10368, 45843, 20583, +31385, 57175, 5331, 47174, 28839, 17006, 59281, 35902, 4254, 51823, 24936, +42747, 9538, 63506, 27044, 40568, 13869, 57325, 29617, 1329, 51455, 35641, +17358, 54765, 4897, 35330, 49487, 15083, 31052, 62603, 5684, 45980, 23244, +40177, 12683, 56861, 27445, 7180, 50337, 35080, 20032, 61914, 1257, 33798, +54228, 21020, 46298, 10836, 41155, 26335, 58741, 5786, 33292, 53495, 14663, +44075, 27902, 9786, 62559, 37038, 20905, 53291, 6736, 47752, 30432, 16008, +65473, 36415, 5046, 50503, 28569, 12527, 59132, 36181, 17814, 49679, 4209, +30310, 57021, 13244, 41755, 25746, 51887, 6968, 29596, 63985, 20708, 48283, +10653, 40006, 26208, 62237, 5001, 30259, 53982, 837, 42100, 23612, 57149, +13824, 33525, 52792, 3433, 41682, 24387, 62127, 13376, 37136, 51150, 6976, +31329, 57231, 17659, 45637, 2758, 33234, 62390, 19307, 49201, 7257, 38486, +27095, 64029, 15394, 35791, 52123, 4386, 28758, 46614, 20410, 57104, 9959, +30512, 52525, 18935, 46999, 6527, 31215, 60546, 17863, 48277, 10570, 39296, +26691, 65302, 3179, 43236, 22368, 54243, 11355, 40739, 25194, 56298, 267, +38673, 21613, 60345, 13779, 37664, 53644, 6493, 30341, 47168, 13281, 56650, +22526, 41641, 8815, 59693, 26495, 39711, 582, 55048, 21386, 38255, 7796, +58924, 27206, 43718, 10161, 50598, 19335, 36850, 64729, 1096, 29709, 45071, +19549, 54735, 9576, 41397, 25994, 61174, 13830, 33702, 50829, 402, 43415, +23102, 63393, 10523, 33137, 53426, 14574, 43776, 27403, 6581, 64976, 38148, +14519, 31530, 54868, 4084, 46819, 27964, 16728, 63871, 37023, 526, 54132, +26135, 47294, 13953, 36558, 58783, 4806, 31580, 51852, 13235, 43166, 22887, +61267, 7020, 34752, 47818, 18606, 57841, 9499, 40973, 26030, 48468, 841, +57279, 24069, 40844, 10655, 52162, 19708, 31073, 56469, 2405, 42125, 18007, +52216, 28848, 10384, 59151, 37692, 16989, 49675, 28575, 2786, 60511, 38097, +15376, 30656, 55058, 4403, 45505, 27721, 16409, 61732, 37723, 9734, 53988, +27725, 15796, 50696, 36085, 4417, 61355, 22486, 45418, 12154, 32094, 59097, +20368, 49129, 5999, 39199, 26812, 60872, 2204, 31458, 53875, 15737, 46810, +28059, 9005, 58498, 36945, 19129, 49544, 5315, 31049, 63510, 14226, 45949, +23476, 41717, 7014, 54682, 29633, 16545, 64991, 36417, 8511, 50325, 26382, +40855, 3207, 57135, 20031, 31217, 47506, 9059, 54375, 22841, 41110, 12079, +59799, 25574, 40786, 3641, 52554, 19437, 33968, 60548, 10189, 42944, 26313, +51268, 13976, 32917, 59348, 4106, 43207, 24766, 54599, 11588, 39114, 24411, +62767, 6048, 46244, 19069, 33303, 54714, 10673, 41725, 24458, 59580, 5514, +33975, 52765, 13380, 42712, 24006, 62508, 7507, 40136, 22065, 53589, 1432, +32621, 59579, 12583, 47590, 23098, 41113, 7938, 62112, 26101, 40880, 12062, +48126, 22145, 56540, 3841, 32309, 47104, 17758, 62701, 10775, 34314, 44462, +17416, 58402, 6601, 40831, 26522, 55005, 12874, 40057, 25331, 64165, 4029, +43154, 23577, 51916, 14930, 34017, 56177, 166, 42894, 23262, 62175, 9303, +30513, 53301, 12511, 42526, 23800, 65511, 1097, 33032, 50943, 14664, 41969, +25079, 62943, 8286, 34955, 50550, 20819, 42325, 409, 59322, 26084, 40479, + 7032, 56494, 25685, 40423, 10548, 50315, 18361, 29997, 57803, 2671, 45782, +18173, 35600, 61811, 4893, 30090, 53427, 18252, 45029, 6984, 30991, 65135, +14271, 44110, 27470, 4320, 55396, 38120, 16872, 30496, 62708, 500, 43678, +22152, 58124, 12921, 30248, 44666, 5741, 53199, 28542, 16102, 60724, 37225, +10541, 48209, 24145, 54726, 2270, 38417, 21392, 58815, 6872, 36230, 49712, +15455, 28907, 60586, 7993, 42579, 23177, 50736, 13573, 31940, 56039, 2123, +42758, 25922, 60859, 9419, 34322, 51210, 15057, 44470, 27741, 158, 64534, +37364, 13577, 47612, 22320, 53472, 5621, 32814, 46506, 19627, 61084, 7789, +34282, 45628, 19429, 56477, 11298, 40376, 25785, 61548, 388, 42943, 21764, +53107, 13736, 32509, 64306, 3300, 44969, 29503, 16423, 60650, 37704, 8552, +49582, 27519, 15338, 64657, 37920, 4183, 29190, 56020, 16734, 48014, 27970, + 8782, 64068, 37463, 19798, 50823, 2863, 42226, 25318, 59767, 13381, 33988, +44919, 1137, 57024, 22363, 40874, 13598, 46779, 24920, 62776, 2056, 39096, +21981, 51832, 10837, 33932, 64887, 18811, 47632, 393, 38756, 22695, 53464, +11806, 33987, 58850, 3268, 43454, 22808, 51028, 15133, 33133, 60880, 12719, +55959, 24811, 39112, 5748, 50484, 18208, 31444, 59233, 9581, 44497, 34395, +18418, 47863, 4027, 61062, 26806, 41033, 12437, 53437, 22376, 38631, 9869, +55946, 25177, 45725, 3759, 31616, 57901, 12602, 42830, 22785, 54709, 7886, +35021, 59936, 17471, 44041, 2224, 34929, 61791, 17042, 41559, 4789, 53620, +21343, 30086, 59412, 12847, 46221, 29064, 6196, 52457, 35733, 18573, 62275, +13251, 43705, 27129, 50608, 5170, 31936, 63919, 17000, 44484, 27694, 1521, +52731, 35391, 18754, 60944, 5394, 35120, 49586, 15889, 30998, 63263, 11826, +48183, 23998, 41314, 3480, 54031, 18031, 32803, 61142, 6555, 46509, 27774, +15817, 56758, 36729, 8554, 47334, 24062, 62918, 3534, 39784, 21426, 53764, + 7934, 39602, 26437, 58409, 13536, 47531, 29037, 4942, 51427, 36167, 20576, +57264, 1063, 48269, 26489, 39746, 10643, 59570, 19925, 30338, 52137, 7441, +44798, 35039, 12361, 56603, 22089, 42451, 6634, 63319, 29206, 16690, 49703, +35438, 1218, 55724, 25214, 41995, 13771, 64742, 28843, 2981, 50798, 36100, +12285, 54546, 29273, 16864, 62455, 35720, 5524, 49587, 28955, 14391, 64340, +36198, 8419, 47567, 23488, 61315, 252, 32961, 45616, 12594, 56953, 22947, +41501, 7717, 47501, 25588, 63308, 11582, 41216, 21841, 53171, 7387, 32843, +47477, 18980, 62770, 1770, 31190, 45905, 18677, 57047, 10942, 40062, 25767, +54476, 882, 39959, 18283, 56597, 29687, 10199, 49788, 36381, 19873, 63778, + 6610, 35341, 44746, 21185, 55628, 1366, 40684, 23525, 61625, 13483, 33104, +53513, 3058, 48119, 26011, 39344, 12089, 61442, 24414, 47964, 902, 41635, +21297, 53663, 10851, 32076, 63016, 14560, 44943, 27544, 2293, 61460, 36688, +17264, 51509, 5566, 31982, 64656, 14604, 46211, 29815, 8415, 57038, 24636, +45217, 2962, 40084, 21712, 62452, 7474, 42102, 26773, 56888, 12701, 38406, +21281, 48779, 2620, 60447, 26556, 40092, 12190, 48906, 22239, 64381, 1027, +32201, 45603, 14531, 57315, 21254, 38325, 2726, 55400, 29864, 15230, 49878, +37341, 8985, 63491, 23867, 42548, 14066, 52399, 30159, 4294, 57472, 36935, +15443, 50884, 28285, 14, 64896, 36772, 19105, 53332, 8516, 43838, 21329, +31450, 56264, 4807, 47866, 19838, 36281, 61407, 721, 30414, 52312, 20486, +47145, 8046, 31423, 58821, 16340, 45640, 28983, 5977, 63541, 35911, 13935, +50580, 25451, 44395, 3265, 36934, 57950, 15535, 28761, 52026, 6677, 41057, +21581, 59212, 12908, 30379, 54034, 3648, 45649, 28596, 12510, 62298, 35460, +17201, 52921, 9381, 30955, 46019, 19444, 64634, 1679, 32726, 52066, 12745, +41531, 24273, 62906, 7628, 40720, 20261, 50703, 32400, 9657, 58561, 37544, +20943, 49527, 2369, 38042, 60905, 15722, 31286, 48692, 10692, 59368, 25127, +40909, 6649, 54095, 32716, 16130, 50733, 35749, 8994, 62033, 21780, 46081, + 3007, 34251, 57812, 19224, 44116, 6069, 34589, 63199, 20881, 42322, 12101, +53855, 26355, 41116, 1446, 62148, 31714, 14592, 52129, 36341, 4532, 59435, +24463, 47254, 12172, 41080, 22178, 63155, 3623, 39204, 25254, 53739, 7572, +31883, 58630, 16184, 45650, 28518, 8979, 54739, 36374, 17632, 62894, 2094, +42713, 25731, 51936, 14189, 31736, 59603, 3665, 43633, 22358, 51178, 10042, +31550, 58836, 17534, 47040, 7523, 38925, 25163, 55876, 11431, 49163, 23371, +40345, 2861, 57696, 19514, 31229, 52262, 10535, 43463, 22467, 59135, 193, +37077, 52735, 14274, 30885, 45467, 5347, 60607, 28944, 16796, 54468, 37307, + 7381, 49813, 29970, 17771, 61868, 10704, 48582, 31607, 5913, 52749, 34777, +17246, 55300, 9016, 42034, 26220, 60178, 5265, 39947, 24231, 54436, 13924, +34012, 61399, 7639, 45869, 31010, 18199, 54478, 13176, 37817, 62764, 6401, +29229, 46027, 63786, 2622, 48164, 19638, 34128, 57561, 11315, 43256, 23223, +64471, 1685, 29804, 48945, 14160, 55164, 23520, 39414, 8750, 64961, 26083, +49020, 1407, 41507, 21424, 60039, 11080, 33928, 48572, 18720, 63428, 49, +32758, 45477, 16585, 51163, 27905, 5469, 64843, 37876, 20823, 49260, 9406, +32771, 57651, 18149, 44617, 988, 33964, 49009, 19621, 63652, 9673, 39995, +26326, 54535, 2178, 38375, 21315, 59605, 10111, 46815, 29688, 15691, 57821, +37132, 6995, 47936, 23435, 62107, 11655, 40127, 27059, 54562, 2173, 38996, +21575, 57483, 6876, 46005, 25542, 39233, 12566, 60260, 22479, 43109, 4767, +52402, 30265, 14100, 63791, 35006, 1907, 48901, 21634, 55179, 13403, 38444, +27257, 59701, 9881, 47729, 18580, 31279, 64424, 2924, 45091, 27802, 16137, +54500, 37733, 8132, 60769, 23680, 46379, 12424, 41805, 22847, 62439, 2283, +32731, 53838, 14580, 42851, 24262, 65500, 3667, 31315, 52547, 15342, 45330, +27677, 8592, 61576, 37248, 18431, 53222, 5694, 36535, 49606, 16708, 31317, +59908, 10334, 46046, 24774, 41655, 4319, 58987, 22091, 46953, 12218, 41748, +24575, 53609, 3746, 32963, 58137, 19340, 41911, 9402, 51399, 29362, 16395, +64905, 36375, 5640, 50404, 20324, 36019, 53905, 1189, 31683, 57622, 15759, +44966, 28977, 3822, 59415, 36909, 13068, 52335, 23832, 43840, 5704, 34838, +64351, 16428, 48625, 29293, 7818, 61937, 37784, 13114, 52646, 22921, 43314, + 3581, 58228, 33694, 17918, 50638, 10168, 30023, 62750, 16077, 46334, 28002, + 5894, 51756, 37384, 18121, 58886, 10226, 43602, 22370, 54159, 5097, 32738, +59916, 14536, 39074, 25372, 56054, 4137, 35912, 50027, 16871, 30344, 58486, + 8099, 41454, 25289, 48439, 10566, 58063, 19817, 34086, 43980, 486, 53026, +18013, 36224, 61907, 9508, 30132, 48706, 15199, 53553, 23650, 39066, 883, +63560, 22537, 49228, 8935, 32865, 45145, 15601, 53668, 28201, 6774, 58721, +38198, 16741, 30569, 49371, 7690, 62021, 25640, 41265, 11119, 48189, 22619, +60940, 6323, 34380, 45613, 16343, 56867, 27955, 2356, 49380, 36068, 20406, +61374, 8763, 34200, 47182, 19344, 55433, 6596, 33691, 45942, 15118, 60729, +28979, 2084, 49993, 37177, 14493, 62174, 24907, 45214, 7199, 33914, 55611, +17088, 44781, 9669, 34963, 63090, 18879, 49047, 2188, 40266, 25669, 55458, +12360, 40037, 21618, 60406, 7422, 47702, 30789, 17086, 64273, 37869, 10208, +54713, 23215, 45497, 2238, 33381, 63234, 18457, 43115, 10043, 53104, 25602, +41422, 6511, 57348, 19517, 33482, 48169, 3279, 59931, 23715, 38843, 11525, +56070, 21533, 48171, 5794, 36460, 58960, 14708, 29360, 47485, 182, 55553, +24721, 40578, 11808, 63567, 19659, 34730, 53863, 7723, 28889, 45042, 20598, +56896, 3218, 38389, 22878, 48564, 12228, 63790, 26346, 40927, 1614, 56215, +23512, 40107, 12278, 49033, 26019, 65388, 9700, 30621, 45966, 17483, 51962, + 3861, 31718, 59824, 18727, 46146, 9549, 34074, 55518, 16911, 45226, 28499, + 7265, 65273, 38121, 15423, 31029, 54909, 5919, 48489, 19878, 33027, 56638, +11579, 46327, 18490, 35352, 62004, 1597, 30453, 51419, 19045, 42252, 5026, +57630, 30790, 16249, 49415, 37550, 8115, 65100, 23553, 42140, 12282, 54534, +26324, 39528, 5517, 63631, 19894, 35830, 50464, 2006, 31241, 62694, 15205, +45770, 27995, 8896, 60170, 37306, 14929, 49948, 27911, 5034, 61087, 38200, +16159, 28591, 48921, 7965, 63624, 24016, 40213, 12029, 48874, 22032, 55898, + 1661, 40708, 24117, 64394, 13747, 33230, 45908, 4354, 56038, 25787, 41741, +13996, 63672, 24260, 43853, 2912, 58743, 19352, 32625, 46613, 10253, 51315, +18175, 30922, 63362, 3971, 44428, 27383, 15983, 50713, 36186, 1398, 57292, +24991, 47984, 11082, 39921, 22550, 53264, 14857, 30663, 61549, 9002, 45473, +25065, 40066, 4727, 53011, 19610, 32217, 61882, 7295, 44088, 27714, 16157, +58791, 37916, 4954, 30296, 54327, 15430, 47593, 28941, 5742, 61612, 36327, +13797, 53335, 24110, 41857, 7094, 59176, 29470, 12124, 53921, 35630, 15775, +49806, 28281, 2896, 62941, 37677, 19875, 53055, 11593, 41225, 26928, 58909, + 5591, 30929, 51727, 14019, 42990, 24261, 56865, 7978, 39361, 22566, 64702, + 3569, 33527, 52313, 12251, 45004, 29296, 16799, 56251, 35972, 4835, 46761, +22721, 63663, 9582, 41147, 26951, 51499, 14040, 32972, 65469, 29, 47582, +30800, 16139, 50944, 37316, 8893, 57566, 23306, 45345, 12239, 39701, 26761, +60553, 6364, 42945, 22650, 52434, 1494, 34050, 55846, 13076, 42303, 22740, +61768, 6963, 31903, 50717, 16990, 44283, 28404, 3838, 64142, 35397, 18407, +49826, 8908, 34562, 57877, 17663, 41331, 7221, 50755, 34385, 13107, 60676, +23354, 44082, 2026, 32764, 57886, 20283, 48633, 10954, 30877, 54979, 19461, +43524, 133, 63703, 26916, 38523, 7302, 48708, 21317, 55857, 11557, 38613, +27126, 60396, 1484, 34472, 48961, 17196, 62971, 6700, 30131, 46367, 13324, +55791, 24001, 39779, 2266, 58674, 18979, 31359, 45384, 8997, 60626, 24332, +40348, 12031, 49132, 21408, 65434, 6858, 39281, 25700, 54834, 10194, 48266, +20177, 33387, 55669, 2940, 45018, 27502, 14886, 59901, 35135, 1945, 50617, +28320, 16727, 65136, 38206, 9243, 30749, 56198, 20545, 42855, 401, 52909, +31741, 14397, 60208, 35561, 9380, 50398, 23966, 41869, 2083, 64560, 21048, +38306, 10929, 51743, 27024, 42659, 7560, 60962, 21657, 48473, 11953, 41133, +25596, 65246, 1634, 33411, 52775, 15375, 45426, 28600, 4111, 63700, 37125, +13956, 47200, 24033, 55625, 4870, 38942, 21320, 59109, 13468, 33747, 46155, + 6184, 56148, 25982, 41088, 10873, 59108, 18206, 35930, 50886, 4577, 31133, +64928, 19862, 44119, 2043, 33850, 55330, 15834, 46153, 28933, 3889, 59792, +36565, 16895, 50452, 30695, 452, 65380, 24779, 42040, 10505, 53302, 18482, +37470, 58692, 5518, 29668, 45366, 17845, 64288, 9779, 30298, 44262, 20560, +59296, 3649, 40847, 26294, 52061, 12579, 35548, 57223, 9138, 29880, 48296, +18602, 65336, 2906, 38685, 27031, 51329, 14559, 32722, 58194, 5590, 43293, +22598, 52713, 11319, 32969, 59543, 1435, 46106, 28078, 16204, 54221, 36092, + 4520, 50252, 27344, 14456, 61587, 37195, 7384, 48103, 24836, 56211, 13876, +39426, 21637, 60697, 1390, 37431, 50076, 15120, 28599, 63582, 8650, 44130, +34676, 14415, 54485, 25156, 44978, 3967, 32251, 65472, 16880, 44728, 27798, + 8246, 52490, 36425, 16120, 59440, 29263, 4586, 49753, 36233, 17824, 52451, + 1228, 33173, 64543, 17791, 47346, 9980, 41653, 25642, 60331, 4699, 38929, +21239, 54740, 13943, 47750, 30504, 6311, 59905, 37631, 20554, 53757, 30, +33828, 47744, 13187, 56490, 25844, 39966, 8393, 64086, 25338, 39456, 2734, +48306, 22227, 57725, 12429, 41364, 25550, 52659, 722, 35789, 59745, 16757, +29808, 44592, 3166, 64279, 24037, 41022, 10397, 47751, 22497, 59626, 8120, +32566, 53563, 20866, 40799, 12733, 62302, 28524, 3252, 53713, 36450, 14920, +49698, 28955, 1048, 60644, 38002, 16196, 29495, 55525, 10985, 48010, 23823, +40461, 6085, 57501, 20270, 34381, 52857, 745, 42652, 22671, 65263, 11339, +33461, 53839, 20446, 45006, 2433, 32719, 57452, 16772, 44206, 28968, 4530, +62168, 38053, 16365, 30321, 53976, 7892, 43240, 25419, 58224, 11446, 39209, +21772, 53067, 640, 38476, 23031, 57941, 8609, 36227, 50012, 15990, 29952, +62085, 1598, 43193, 25981, 53206, 14524, 34995, 58544, 7155, 42018, 22348, +52763, 9875, 32608, 60061, 19421, 44760, 5435, 35569, 49539, 37606, 128, +56685, 27693, 15896, 50806, 36324, 10219, 59967, 22784, 45678, 13498, 36747, +56752, 702, 30633, 51721, 20603, 43043, 8054, 62913, 27123, 41126, 13031, +57254, 25532, 40649, 3363, 50769, 29518, 16327, 61201, 37223, 1740, 48172, +24331, 56525, 10735, 40454, 23247, 60747, 7941, 35788, 50527, 14844, 29528, +55868, 3791, 43373, 21846, 62538, 15606, 35132, 50494, 1232, 31517, 55642, +12870, 41944, 23879, 48549, 8755, 57579, 21430, 40468, 751, 62935, 26341, +42858, 11031, 52362, 19258, 33382, 59242, 2932, 45138, 18242, 36514, 53102, + 8334, 28858, 58567, 17022, 44362, 27605, 2680, 62555, 35909, 18019, 53907, + 5334, 47203, 30666, 15969, 64877, 36748, 11013, 46270, 25430, 51153, 4410, +29739, 57680, 14396, 41323, 24666, 53089, 200, 36498, 59177, 14404, 31350, +52486, 10066, 42468, 25082, 55655, 1433, 38642, 20728, 60217, 29241, 4964, +49517, 37013, 19771, 53233, 9163, 34439, 63103, 17524, 47406, 3538, 41461, +26223, 61820, 8919, 39581, 23622, 56583, 12554, 43864, 22580, 52687, 2794, +32749, 64988, 19288, 47402, 9165, 41249, 25041, 55801, 10999, 32261, 44591, +20844, 60936, 4558, 41262, 26248, 54480, 13881, 34552, 47731, 6746, 63695, +27619, 16896, 51132, 35276, 3210, 55958, 22678, 45360, 14308, 33117, 60841, + 87, 44309, 28138, 16085, 63580, 38188, 8540, 30138, 59004, 20493, 47509, +10654, 41870, 23504, 55289, 4797, 34230, 47126, 14807, 61184, 28009, 7731, +49695, 36576, 17372, 63956, 4300, 44257, 28953, 16878, 54497, 36591, 7586, +58102, 26087, 46695, 12532, 40548, 21719, 62807, 33, 34035, 53347, 16287, +45520, 28238, 6459, 57251, 34930, 19530, 54122, 5343, 41983, 23257, 60756, +13096, 34347, 51130, 7311, 42494, 23605, 62681, 10864, 41382, 22653, 51481, + 1525, 31506, 65141, 14824, 42334, 24195, 54128, 3317, 38283, 22155, 61305, +13574, 46759, 28808, 8055, 56940, 37334, 13030, 48644, 24381, 63112, 8603, +40546, 21536, 52361, 12445, 33862, 55221, 7202, 43198, 22264, 57519, 12712, +32718, 50251, 3392, 41188, 22581, 62355, 13493, 32779, 53908, 928, 48509, +25547, 41739, 12943, 55751, 23676, 38438, 7987, 63739, 18162, 32786, 53510, + 1107, 42710, 24522, 59265, 12032, 40653, 21818, 55311, 4476, 43921, 25286, +61965, 13331, 39351, 21081, 50947, 6374, 29955, 65081, 14087, 41613, 23666, +56624, 8502, 32609, 44682, 19322, 58734, 566, 32357, 44536, 16777, 53719, +28301, 4152, 64924, 37895, 11260, 30585, 48526, 20503, 56186, 5645, 32337, +46600, 21246, 60540, 731, 39509, 26779, 58006, 9697, 48776, 22192, 40014, +13647, 59661, 34692, 1807, 50162, 23740, 41991, 9459, 63053, 22734, 48107, +12846, 41940, 26737, 55649, 5568, 39511, 25853, 61066, 14302, 35198, 51592, + 8224, 29451, 57765, 16353, 44140, 28419, 2610, 64270, 36331, 17865, 50155, + 8180, 29733, 58041, 14826, 41440, 23598, 60891, 5102, 38594, 21204, 49210, +14448, 53752, 30927, 6750, 62545, 35421, 18118, 50187, 9748, 42046, 22842, +61848, 6138, 47630, 28333, 12643, 52527, 37356, 15558, 57788, 28948, 4602, +49719, 36038, 17719, 64966, 563, 43663, 26926, 50998, 9857, 33824, 59195, +16645, 44577, 27458, 7237, 58103, 36012, 18395, 51545, 9221, 42667, 26195, +64350, 2647, 35416, 51197, 15717, 30494, 61702, 9916, 44784, 28681, 16515, +56067, 36813, 5484, 50557, 29623, 15623, 63066, 37346, 6945, 48403, 23533, +56395, 10310, 33510, 45303, 13977, 59124, 27565, 3456, 50167, 37694, 13139, +61327, 22938, 46995, 6367, 34274, 64710, 18202, 43426, 11825, 54574, 26543, +41271, 4818, 57246, 23711, 38981, 11970, 49109, 21558, 65238, 3153, 32387, +46914, 11845, 60795, 27944, 16845, 50212, 37527, 3613, 64410, 28396, 16774, +13549, 61025, 38205, 6882, 29578, 47445, 18907, 65349, 2799, 40490, 26567, +55318, 6104, 47074, 28757, 14817, 64176, 37314, 10047, 48094, 23869, 58320, + 2228, 38351, 22477, 52322, 11259, 44251, 21363, 64330, 8576, 34460, 46536, +20137, 58481, 13375, 31800, 45123, 5701, 55488, 20239, 29937, 46835, 435, +65134, 24694, 38969, 10717, 47962, 23162, 60232, 6426, 40694, 25196, 47422, +10981, 64265, 19586, 30059, 44843, 3151, 60256, 25306, 38907, 10030, 54389, +22321, 48621, 13883, 36459, 60823, 6361, 30545, 48305, 13083, 55567, 24759, +39245, 4378, 61849, 22079, 48124, 13203, 34105, 54632, 7137, 42215, 23699, +56895, 10789, 33025, 50581, 19745, 42472, 805, 58079, 21069, 30307, 48460, + 9424, 62836, 20147, 32986, 44095, 7393, 59965, 34793, 18897, 50244, 10857, +42679, 24834, 63134, 4296, 39406, 21353, 48479, 12761, 62102, 26699, 41675, + 9245, 51856, 17048, 32283, 64651, 761, 42560, 24470, 55528, 12705, 38284, +21943, 59289, 6860, 32464, 46416, 15656, 52855, 29108, 4714, 60791, 36578, +17347, 49255, 8398, 30193, 58655, 14828, 44645, 27832, 5054, 52211, 36354, +20172, 64043, 683, 47218, 18152, 36473, 53209, 9277, 28895, 59685, 15924, +44028, 28290, 1622, 55073, 38089, 14734, 30715, 62293, 6142, 47662, 24611, +40171, 10415, 58277, 19624, 48564, 27360, 7176, 52875, 37045, 18793, 56831, + 3929, 36497, 49498, 15981, 31783, 63285, 7080, 44436, 27622, 16949, 57826, +37215, 1595, 53750, 20950, 32916, 46663, 11621, 56938, 19497, 32809, 45580, + 2892, 62380, 28284, 15752, 49506, 36438, 6409, 55610, 24884, 43503, 13724, +58571, 30952, 3757, 50090, 37602, 13701, 63458, 23617, 43475, 8788, 51714, +17579, 31142, 57553, 1072, 46003, 27898, 16269, 59652, 31099, 3545, 53784, +35248, 17538, 47997, 11677, 57750, 27109, 38654, 7386, 59883, 21262, 49043, +11558, 39606, 26873, 52748, 152, 31964, 61957, 16668, 44729, 28539, 4276, +55881, 37929, 16618, 29712, 47701, 1713, 58854, 24218, 40026, 15027, 63840, +30313, 4664, 52260, 35424, 14478, 60303, 25405, 43272, 7553, 52686, 24227, +40304, 11109, 58235, 21571, 39201, 2984, 62601, 26849, 49007, 5644, 41392, +21385, 58049, 11395, 38759, 22411, 50786, 6214, 31500, 64435, 17785, 42531, + 9960, 52870, 27193, 38352, 314, 57830, 23026, 46772, 11718, 33711, 54717, + 3622, 45648, 27466, 16407, 62095, 35705, 6111, 51660, 27932, 15030, 61210, +36445, 8049, 50170, 24092, 42881, 13217, 59341, 23126, 39048, 2468, 52784, +17746, 34819, 64398, 10108, 42631, 17087, 55172, 30030, 5957, 50457, 36379, +18267, 61511, 2910, 33265, 54027, 18061, 43662, 11639, 60561, 26947, 39964, + 3681, 56614, 21205, 38940, 7399, 49084, 25016, 57999, 11527, 42916, 22090, +50042, 633, 37590, 63208, 17227, 31764, 48336, 6675, 55224, 20395, 31749, +44974, 10824, 61582, 19372, 33361, 51129, 3645, 43544, 24598, 54903, 12778, +33179, 63021, 1252, 44877, 22840, 38695, 11506, 59335, 27029, 43817, 2339, +54783, 26008, 39062, 11104, 57291, 18990, 33667, 46002, 1774, 63716, 23702, +40271, 9426, 54607, 21883, 39579, 12495, 56546, 26059, 38678, 5825, 47584, +19253, 61281, 29366, 2284, 50020, 37855, 20321, 54120, 4343, 33347, 62063, +20903, 45800, 11698, 32706, 59168, 18383, 42266, 6349, 54487, 26524, 38656, + 3463, 60460, 21220, 47014, 13664, 33875, 57840, 1526, 44517, 28198, 13475, +59735, 35329, 19013, 53039, 490, 31461, 47154, 20962, 65049, 8671, 33286, +44574, 19658, 56508, 2018, 30587, 52441, 14413, 42158, 24742, 58945, 3165, +38257, 21488, 51580, 9480, 33341, 63043, 15634, 44723, 28574, 6817, 54988, +36880, 14051, 44516, 25219, 56338, 965, 30446, 43854, 14103, 58059, 27587, + 8397, 51350, 33358, 4429, 48793, 23211, 55866, 14603, 33375, 46036, 8526, +58858, 22021, 38365, 11521, 51416, 34021, 18370, 60716, 3666, 33147, 45236, +17983, 54601, 11962, 40307, 26741, 62265, 7483, 39660, 24647, 56274, 1062, +32816, 51724, 18250, 42246, 4467, 62697, 26301, 41122, 11128, 52081, 17590, +33280, 59355, 7301, 42475, 17290, 52834, 30220, 13166, 57336, 37164, 2435, +50071, 28037, 15236, 53120, 37151, 7440, 57156, 18035, 35463, 49757, 13490, +30159, 65095, 4363, 45912, 27661, 16994, 38241, 57952, 1712, 28834, 46300, +20190, 63177, 9064, 32167, 44524, 15415, 51252, 28026, 1333, 59961, 36411, +14778, 45955, 25126, 64087, 3499, 39150, 21831, 52858, 13743, 34586, 62145, + 7196, 44341, 18071, 34740, 49316, 2534, 55581, 17171, 30730, 46837, 5335, +64960, 26600, 38589, 9032, 57333, 30739, 16827, 50663, 37239, 2788, 56130, +23105, 45154, 6121, 34082, 59480, 18705, 48546, 10402, 38609, 26983, 58395, + 5143, 44351, 21269, 54398, 11379, 41941, 26145, 65316, 1730, 34399, 50863, +20269, 42620, 10602, 63463, 33871, 20976, 55272, 1293, 37890, 49674, 16788, +30505, 61453, 7621, 41650, 26177, 56732, 12607, 39391, 23414, 51090, 4201, +33202, 65247, 12729, 47094, 23680, 40978, 7860, 58407, 26521, 39835, 11696, +54011, 21544, 49068, 4668, 32077, 64561, 15050, 45643, 28566, 2421, 50962, +35340, 17351, 62621, 10299, 43279, 26703, 52294, 788, 36116, 54915, 14198, +30249, 47600, 8509, 64929, 24186, 40903, 10565, 49103, 21588, 61761, 5739, +40709, 23450, 52726, 9897, 34351, 55025, 13870, 42959, 21942, 65460, 1806, +31570, 52045, 18335, 40891, 8895, 61728, 28838, 16555, 49403, 36412, 2432, +59121, 26638, 41478, 11531, 50316, 20472, 34768, 64450, 7677, 47670, 22102, +39217, 12287, 61992, 26310, 45638, 5932, 40845, 21600, 55354, 2234, 33415, +47710, 17830, 64158, 5163, 33033, 44837, 14102, 57704, 23590, 41086, 7505, +49321, 25901, 64601, 11749, 39854, 21810, 51901, 6654, 34155, 61108, 14063, +45466, 27926, 8295, 49805, 37501, 20442, 58219, 1318, 44304, 29172, 16624, +65053, 36454, 5911, 50326, 28513, 15564, 61119, 35807, 9159, 44997, 24013, +54722, 13730, 38954, 23464, 60585, 1739, 32170, 46277, 13604, 54642, 23761, +39734, 3671, 56992, 23607, 39707, 12232, 62931, 21683, 48416, 7359, 31225, +59434, 19223, 42272, 12857, 63848, 28868, 1860, 49973, 37425, 20191, 57411, +11240, 47418, 22601, 40672, 2901, 63366, 34092, 17756, 54183, 6067, 47721, +27267, 42071, 11581, 61787, 19803, 47248, 30045, 3327, 51685, 35528, 20170, +57555, 7869, 46991, 27101, 41684, 12910, 64127, 25203, 47929, 5033, 38788, +21568, 53162, 10095, 32492, 65018, 15890, 46562, 29616, 2208, 61955, 35516, +19049, 51012, 9086, 30953, 59516, 15017, 46042, 27688, 3779, 56660, 37268, +13339, 46859, 24236, 59259, 958, 40825, 22476, 52880, 9250, 31387, 65080, +15583, 45329, 29059, 6499, 53232, 35593, 14822, 57994, 24986, 47441, 4133, +41081, 21527, 64791, 15061, 32338, 50835, 5528, 42839, 24676, 61278, 13897, +31563, 51621, 8691, 43338, 25521, 60216, 3442, 33828, 48012, 19661, 58615, + 7822, 41737, 24152, 52637, 10706, 33398, 63106, 15532, 45436, 28039, 7546, +57604, 38233, 15079, 30162, 48666, 63, 56600, 25826, 38905, 8141, 48838, +22448, 64574, 11792, 40949, 25687, 48952, 7355, 54109, 24892, 39141, 10617, +63971, 21528, 48987, 6076, 40950, 26245, 62433, 11095, 39609, 17605, 51997, +29291, 4046, 57990, 36741, 17733, 49468, 9575, 33628, 63346, 19574, 47890, + 6749, 38911, 27285, 61518, 12590, 48486, 25886, 39357, 260, 57689, 18118, +32027, 48590, 5428, 61865, 23641, 40298, 11321, 59084, 22829, 49389, 6101, +34554, 46394, 15579, 63552, 23945, 41204, 58529, 10980, 43030, 21386, 62996, + 1106, 34909, 52301, 13232, 42168, 23849, 62196, 1899, 47559, 20465, 37768, +56285, 9078, 31148, 48538, 20424, 60273, 4705, 33229, 45688, 15897, 52878, +28209, 5874, 65490, 38073, 15712, 30188, 48567, 9765, 56994, 24020, 38543, + 2048, 47667, 22912, 64024, 13770, 31589, 45684, 3439, 50853, 21113, 33368, +63398, 9607, 44909, 19886, 32381, 62051, 5074, 44403, 34687, 20654, 61097, + 181, 42891, 26009, 55364, 9526, 36997, 51337, 15522, 31901, 61620, 7816, +44248, 27329, 16294, 51946, 37676, 5878, 57094, 23791, 42111, 11485, 64633, +21728, 40450, 5094, 55027, 23566, 47756, 12959, 32425, 60888, 9035, 43559, +25465, 55502, 3931, 31665, 47739, 20670, 58884, 9104, 41106, 25649, 61349, +13361, 40364, 23859, 54533, 1698, 40132, 21450, 51793, 14094, 35939, 61621, + 7820, 28713, 48864, 19570, 64403, 11559, 39396, 25777, 54277, 2400, 43687, +21963, 62586, 13240, 39709, 27243, 52828, 3084, 38527, 22158, 57356, 13415, +45862, 28630, 7583, 59751, 36033, 18469, 53870, 4167, 41984, 25854, 53015, + 9817, 33575, 59344, 13762, 43412, 23212, 53289, 2519, 33856, 62823, 17676, +42837, 8709, 55487, 29543, 16337, 49972, 37260, 3457, 61501, 22638, 45854, +13990, 33652, 62808, 981, 44307, 27815, 16597, 59226, 37475, 8209, 53569, +23743, 42257, 12279, 57165, 23134, 40108, 5871, 59771, 21671, 38646, 12366, +62194, 25803, 41481, 5288, 50843, 19402, 33892, 58958, 2418, 45431, 25832, +38487, 13829, 57511, 27141, 48634, 703, 42194, 18866, 60852, 30021, 5278, +49635, 35835, 13034, 59819, 26230, 43086, 4337, 56422, 20071, 33408, 50990, +10733, 42997, 23694, 62576, 6636, 39459, 21609, 52541, 3174, 31785, 56513, +14374, 42825, 25191, 52044, 329, 32568, 57427, 15885, 48513, 35606, 10586, +62845, 25609, 42736, 8069, 54368, 22977, 40640, 12116, 61251, 25946, 48759, + 3689, 39018, 21491, 60145, 14765, 32987, 46617, 949, 57222, 24844, 41922, +15582, 53574, 29680, 2839, 62475, 35774, 18701, 51051, 9631, 32346, 55601, +17871, 46038, 3853, 33165, 56701, 13616, 41549, 24622, 52999, 227, 31850, +57596, 18216, 47194, 4370, 33503, 64191, 17146, 49216, 10669, 38529, 26896, +62111, 7059, 48820, 18351, 32650, 60105, 8765, 43578, 24858, 51447, 2619, +33320, 56055, 15948, 44109, 29369, 4411, 52393, 20475, 34006, 55787, 8898, +44387, 17409, 31198, 60934, 5240, 42945, 25047, 52533, 9619, 30802, 56453, +14182, 41096, 23686, 58911, 58, 38323, 22433, 54826, 8827, 43695, 25612, +59708, 12545, 40699, 24748, 63110, 1280, 38760, 22278, 53331, 8967, 36256, +57484, 15404, 29793, 50456, 344, 43259, 25076, 58818, 12309, 38805, 21573, +51843, 6918, 31615, 55824, 16004, 44124, 28092, 4563, 64731, 36530, 12000, +52887, 22146, 42614, 7270, 63415, 29797, 15279, 54269, 35787, 11094, 49747, +25722, 41696, 3021, 59993, 22137, 40296, 11152, 48308, 26825, 55772, 5721, +39637, 21134, 61973, 12127, 35033, 51679, 8238, 39925, 22405, 54192, 229, +34250, 58983, 19545, 47861, 6577, 39458, 23380, 62789, 11300, 31082, 53389, +15135, 44918, 28190, 942, 63986, 38142, 14387, 30104, 56155, 5106, 43204, +22778, 51974, 12687, 34084, 65370, 3783, 43357, 23419, 52935, 12226, 34456, +62209, 18903, 44449, 1965, 36442, 57004, 15497, 30000, 46453, 4468, 61191, +23731, 40954, 13234, 55747, 22590, 46236, 3092, 35785, 53577, 13926, 30508, +59352, 6810, 47618, 20123, 32782, 61710, 12269, 42780, 25624, 54151, 1018, +39317, 26954, 59709, 11223, 43627, 21370, 56402, 4599, 32295, 52700, 13742, +42559, 23514, 64815, 9070, 34361, 53923, 19866, 45511, 1868, 33689, 48462, +19123, 62490, 10432, 40166, 21995, 54313, 2330, 39019, 26724, 17773, 50074, + 3969, 30840, 54912, 15234, 41782, 25242, 57813, 5291, 34755, 50066, 15005, +30015, 63922, 6936, 44467, 27550, 14747, 57673, 38159, 229, 29182, 49006, +19523, 61792, 9530, 30669, 44378, 13902, 54918, 23127, 39794, 3916, 60579, +27015, 49241, 12318, 39996, 21689, 61347, 6671, 34948, 54382, 19268, 42110, +10976, 56134, 26350, 40074, 1376, 59802, 17098, 29413, 48290, 8779, 53583, +27599, 14742, 58744, 35868, 6993, 50217, 27966, 16614, 63954, 38084, 2600, +29901, 54851, 14538, 47160, 27916, 3726, 62831, 35667, 16800, 53648, 28643, + 471, 49491, 35740, 15883, 58923, 28723, 8183, 49908, 37099, 19160, 57227, + 1759, 42049, 22908, 52316, 11680, 34003, 65274, 14728, 45314, 28237, 636, +55167, 35738, 17588, 50019, 6377, 32964, 63913, 12612, 43541, 23490, 56729, + 4882, 33130, 47125, 18487, 58373, 340, 32264, 44308, 16338, 52470, 29297, + 8703, 60831, 36126, 18144, 49943, 6536, 42072, 24905, 64112, 9512, 48203, +32007, 16947, 61457, 37665, 480, 52191, 23124, 43382, 11268, 62299, 30145, +14970, 50088, 35856, 6431, 64512, 22171, 48042, 3724, 39907, 26743, 58061, +10877, 49223, 19697, 32204, 45186, 320, 60342, 24741, 39934, 10637, 57530, +20056, 35875, 53651, 7308, 29016, 48327, 20798, 56060, 12234, 34566, 43736, + 3704, 63752, 29188, 15388, 51784, 38012, 1400, 31046, 58539, 14084, 43732, +24962, 51087, 3273, 32355, 55483, 18299, 43526, 11479, 60775, 26492, 39950, + 7957, 55256, 21976, 48064, 4610, 32379, 64138, 12982, 39527, 25310, 52331, + 8305, 37593, 62945, 16638, 28562, 47020, 7282, 54322, 22498, 39776, 14769, +63900, 28550, 587, 53382, 38182, 14281, 31690, 55463, 8591, 43755, 24889, +61220, 12147, 39831, 21561, 59058, 5962, 38410, 27187, 64618, 9430, 44190, +18867, 29695, 52798, 4101, 34509, 59498, 15734, 44551, 28152, 1384, 56937, +36864, 17825, 53133, 9574, 43438, 27238, 54547, 6289, 39013, 20939, 63004, +13554, 31121, 51046, 5716, 43631, 23606, 58359, 12100, 40995, 23493, 48499, + 5220, 64452, 27146, 41373, 11607, 49176, 21644, 61701, 7110, 34213, 47016, +20188, 63330, 11763, 40134, 22932, 51888, 8356, 31422, 56091, 18883, 45872, + 3304, 32762, 58683, 15357, 44293, 28613, 811, 53795, 36193, 16303, 63367, +28913, 10316, 49441, 35900, 20360, 60963, 6887, 34556, 47383, 13530, 58998, +23768, 39809, 713, 64593, 19857, 33563, 47982, 12418, 57897, 23652, 39569, + 1695, 50796, 17147, 32087, 65284, 7463, 47138, 26510, 39557, 10962, 62534, +19138, 35983, 50378, 4072, 29517, 56365, 18826, 43553, 10517, 50577, 20721, +31451, 60359, 3485, 45805, 19556, 32559, 62535, 10721, 42282, 23412, 53760, + 5657, 32016, 63967, 13799, 47210, 25433, 40800, 1401, 58541, 22459, 49049, +12422, 40719, 24781, 61204, 2412, 33078, 51089, 16960, 45627, 28277, 5189, +61862, 37923, 20356, 55132, 7097, 37033, 51311, 16237, 30789, 63950, 462, +49056, 22111, 38358, 13529, 58655, 26348, 48285, 2759, 31280, 55728, 17804, +43536, 10270, 63498, 26263, 41062, 13283, 50784, 29316, 2213, 56731, 35742, +18952, 49526, 4912, 37843, 60476, 17035, 30805, 47557, 8620, 52117, 27808, +16670, 60982, 37477, 1681, 49245, 27734, 16168, 55116, 38115, 9373, 28670, +59858, 17355, 40923, 5600, 49086, 25363, 54394, 8744, 33483, 62877, 19296, +43123, 12305, 51970, 29336, 838, 58249, 36304, 19498, 49840, 9672, 32115, +65525, 20596, 44586, 1784, 40824, 25933, 57209, 10369, 39713, 21871, 51139, + 5584, 32570, 64473, 13349, 42386, 23121, 55168, 2640, 37201, 49725, 15243, +29180, 60348, 7767, 45810, 28422, 15034, 58251, 37228, 4053, 50859, 27543, +16331, 59904, 38088, 6957, 30559, 55368, 15071, 47089, 28239, 9115, 65092, +35960, 22428, 61377, 14107, 32600, 46520, 7063, 59560, 30773, 19035, 44465, +10550, 54812, 25834, 40244, 3186, 60006, 22820, 39623, 10549, 52370, 31620, +16715, 59227, 35284, 6249, 50726, 22689, 46351, 2517, 33584, 63271, 17914, +47659, 8253, 33009, 57589, 15167, 45705, 28971, 586, 51694, 37414, 16274, +58831, 27920, 5271, 49392, 36317, 20653, 64188, 11891, 34885, 51863, 21279, +43886, 3603, 36847, 56886, 12656, 30890, 46398, 19116, 60188, 4877, 41720, +26871, 47395, 12174, 57000, 23309, 41408, 7041, 59786, 31965, 15175, 49856, +37796, 8477, 55895, 25095, 42587, 11983, 62041, 22266, 39487, 3025, 52195, +30171, 12119, 63594, 34834, 16472, 49452, 27770, 4507, 58638, 37500, 19492, +51739, 8354, 40658, 26715, 62231, 11779, 29954, 52925, 19041, 46205, 3008, +36854, 60276, 16292, 29469, 52573, 8389, 42025, 24802, 61146, 13987, 34357, +47048, 5387, 55180, 24644, 40995, 14123, 58848, 30863, 1169, 51667, 36246, +15515, 56717, 27719, 4421, 49671, 36187, 15002, 58947, 29479, 8068, 49181, +37640, 20083, 57653, 2044, 45093, 28483, 16752, 55556, 37969, 8672, 31509, +61903, 15804, 46972, 29065, 5431, 52619, 36202, 15467, 64358, 28107, 6242, +49261, 37769, 17968, 51362, 2148, 32248, 63373, 17426, 45116, 5043, 32548, +60768, 16776, 44900, 27424, 7689, 55053, 35862, 19836, 47427, 10919, 64868, +27000, 41569, 6939, 53326, 17193, 34603, 62932, 10006, 39675, 22454, 51754, + 216, 32146, 64650, 16025, 44726, 28879, 9583, 56654, 36958, 17989, 51041, + 2748, 43132, 23111, 58841, 14242, 35112, 49959, 1500, 31861, 57547, 12260, +43551, 24068, 50489, 5882, 32111, 60520, 16764, 45697, 27490, 3949, 64894, +37981, 15873, 30078, 48346, 1669, 54770, 24806, 41689, 13699, 49118, 22783, +55511, 2808, 34033, 46633, 13356, 63554, 24518, 39739, 7001, 50625, 19623, +32445, 62338, 12707, 48272, 25215, 40585, 2956, 65394, 21659, 38329, 12577, +58700, 23561, 41244, 2120, 54946, 27042, 38340, 11020, 63620, 17829, 31995, +46664, 528, 54606, 21731, 38611, 13822, 59684, 26534, 38513, 2245, 51559, +17709, 31269, 57864, 4512, 44286, 28715, 15845, 59972, 35333, 1834, 50818, +26598, 43225, 12878, 65286, 22012, 40928, 5856, 55215, 24874, 49135, 12843, +41115, 22068, 57962, 5304, 32300, 53225, 17703, 42181, 2034, 64097, 29847, +15561, 50103, 36232, 10884, 54575, 26560, 46052, 5654, 39542, 17202, 62676, +29704, 10467, 49622, 37043, 20860, 60557, 4310, 43539, 25555, 52095, 13047, +33155, 57050, 2160, 45768, 27824, 16201, 61316, 38235, 8214, 31821, 49096, +17283, 65077, 5242, 38301, 27290, 52167, 14095, 37639, 56800, 6710, 28456, +49478, 15602, 34879, 60643, 2711, 42172, 22986, 52704, 8784, 37144, 62335, +15619, 29591, 46954, 6044, 53557, 28950, 15399, 57502, 35632, 7548, 49515, +27356, 14796, 58433, 35146, 1624, 49190, 29791, 17850, 62680, 12088, 46272, +25692, 39161, 8762, 54665, 27131, 43552, 5221, 61376, 18734, 33784, 46159, + 9496, 60296, 22830, 38817, 4731, 53137, 30787, 16198, 58254, 36014, 7099, +47006, 25755, 64447, 9610, 41631, 23183, 52844, 12854, 33385, 57768, 2693, +44023, 21055, 33823, 64763, 10118, 42862, 19903, 51537, 30238, 6171, 58521, +36668, 19848, 50334, 1337, 32617, 63800, 19294, 47317, 11246, 38581, 26460, +58688, 3347, 41100, 22420, 50123, 13884, 32633, 63348, 7179, 45318, 27924, +15447, 59853, 36259, 4635, 54259, 22906, 46551, 14447, 31631, 62077, 3670, +43803, 26531, 52939, 15096, 30109, 56171, 7121, 45503, 28209, 16595, 62605, +35326, 10176, 52416, 24023, 41242, 1231, 63742, 19184, 32272, 47284, 6306, +55858, 18571, 30331, 44838, 9789, 64180, 25793, 39560, 422, 57538, 18215, +30210, 52165, 5597, 43370, 2541, 54154, 27180, 38512, 12057, 62425, 22694, +48812, 667, 36394, 51778, 16110, 30377, 64950, 8312, 45105, 19813, 32842, +55485, 1709, 47306, 27517, 14199, 64504, 37613, 8298, 53354, 23953, 41784, +12013, 55391, 21723, 40575, 3543, 59989, 26261, 43135, 10891, 53229, 20124, +31036, 65189, 8885, 46797, 23717, 41557, 3082, 58159, 18000, 30460, 54176, + 6658, 46033, 17452, 30881, 62562, 10577, 49258, 22992, 40754, 1856, 64984, +25133, 49473, 11248, 39345, 21788, 52676, 893, 35874, 63287, 12786, 29233, +50571, 19004, 43037, 2414, 65369, 21089, 31386, 47693, 6717, 56627, 18625, +31981, 44234, 9846, 55257, 22242, 40456, 6267, 61321, 26228, 46892, 10590, +31914, 54504, 17225, 43159, 2329, 59759, 20459, 36053, 49598, 5509, 31824, +63534, 10634, 41637, 22429, 55202, 13503, 33836, 46487, 1528, 65088, 22648, +39031, 11267, 56385, 26519, 49164, 3244, 38769, 21378, 63774, 11769, 48714, +26458, 40701, 7036, 61109, 19889, 31292, 44841, 11306, 55175, 24548, 40436, + 2887, 65143, 18051, 34844, 51952, 10131, 29772, 62717, 13162, 42262, 22589, +52675, 868, 41508, 25939, 58494, 11440, 38897, 25473, 55266, 3149, 42671, +22280, 59407, 11705, 31339, 53922, 20617, 43543, 7815, 58505, 26903, 39292, +11066, 52077, 20070, 37747, 57283, 448, 30879, 48470, 13734, 62003, 26098, +40642, 4263, 55913, 18790, 35943, 50357, 2226, 30146, 60244, 20377, 42013, + 7395, 48875, 25111, 57591, 12531, 39584, 23570, 52636, 3978, 33497, 61441, +20802, 44499, 12679, 35061, 62644, 6802, 30151, 52800, 19243, 42449, 10252, +65162, 26791, 39438, 3181, 53038, 19655, 34629, 58650, 10070, 44326, 19399, +33281, 56311, 6823, 49222, 24252, 41555, 10767, 62270, 17928, 32429, 44859, + 4809, 58133, 25643, 38870, 10998, 60865, 17638, 30071, 51949, 813, 42457, +23398, 58712, 11890, 29935, 53903, 5544, 46128, 22823, 38588, 10753, 56403, +26899, 44051, 6823, 50640, 18171, 32483, 62272, 9495, 48084, 22423, 40806, + 4802, 55811, 25940, 40080, 10391, 60723, 25052, 47949, 6095, 33573, 55886, +12958, 43312, 23773, 64802, 8032, 34647, 46625, 19304, 54401, 10640, 41485, +25193, 61647, 5068, 38343, 21041, 53290, 9079, 38246, 27260, 59827, 11508, +47858, 21105, 38428, 3533, 64713, 26893, 43872, 12382, 51097, 19378, 34034, +56462, 7858, 43180, 25026, 58180, 3947, 40698, 23094, 61681, 9410, 48357, +20454, 34227, 56740, 3323, 43514, 19246, 53377, 28822, 8402, 58668, 35818, +18312, 49324, 7118, 29945, 64186, 15013, 44002, 27302, 6443, 52948, 35434, +20005, 57032, 812, 46020, 26971, 41191, 11195, 55645, 24629, 43666, 1920, +63727, 19280, 36619, 51105, 10344, 30561, 57722, 16906, 46107, 28244, 5219, +56106, 35272, 19913, 44685, 10260, 60176, 26114, 39912, 251, 55392, 21650, +43680, 13101, 65399, 30536, 9112, 51717, 37618, 21157, 59689, 4859, 44258, +19734, 32532, 56571, 2139, 42875, 21312, 64838, 11717, 36260, 50605, 15523, +29673, 57134, 1173, 48761, 24440, 40797, 12633, 65501, 21857, 48123, 2942, +40327, 24597, 61466, 12563, 38754, 21331, 55503, 691, 36503, 50028, 16849, +27893, 62364, 7929, 46080, 27614, 15420, 53823, 34831, 4702, 59698, 28114, +15208, 49322, 35003, 7925, 61809, 25569, 45780, 13648, 41809, 22927, 54033, + 5066, 32810, 61125, 15652, 46015, 28156, 8261, 52433, 37032, 17794, 56374, + 2512, 33997, 51301, 12389, 44162, 28940, 16460, 60707, 37158, 7351, 53134, +24342, 48632, 11320, 38586, 21172, 64032, 110, 34392, 47706, 13686, 60711, +24645, 39097, 3918, 54733, 18422, 46283, 32668, 8720, 57416, 25675, 42120, +11332, 52890, 20818, 33887, 62110, 2877, 41970, 23632, 48739, 12132, 54609, +20605, 34098, 45363, 8207, 60452, 24640, 39961, 63838, 13608, 47571, 21453, +40792, 4504, 57268, 26162, 39386, 11638, 55444, 21675, 46723, 6025, 34636, +61172, 17833, 41636, 9696, 57162, 26445, 39850, 4339, 51478, 30680, 16934, +60746, 36052, 1032, 48178, 25671, 63744, 13188, 38390, 21078, 50592, 6651, +34161, 61720, 18064, 45135, 1872, 35728, 59312, 15014, 30774, 52658, 10325, +43891, 21173, 34312, 61107, 769, 47656, 18863, 34064, 55925, 9028, 45086, +28535, 15719, 59072, 37919, 5298, 31737, 48364, 17488, 61295, 9082, 33838, +45526, 20912, 57997, 4759, 38617, 27075, 52337, 9947, 33572, 59082, 17477, +45420, 1088, 34709, 64139, 16178, 48238, 28125, 4206, 59441, 35207, 19518, +51196, 113, 44215, 35303, 20995, 64597, 11451, 41799, 25914, 57235, 7739, +41285, 22978, 51201, 14104, 33659, 56483, 3945, 43029, 25385, 59376, 9655, +31636, 51983, 15807, 44764, 29397, 5966, 61705, 35546, 14926, 46051, 25734, +57395, 7498, 31505, 44606, 18640, 53699, 2189, 34518, 63143, 15996, 46535, +28795, 9009, 56493, 37329, 20952, 50590, 6519, 42459, 25751, 59599, 3450, +33444, 47247, 14446, 54808, 23948, 39059, 5751, 64845, 21661, 44464, 14191, +51687, 32881, 8455, 61685, 35612, 17320, 49211, 1067, 33283, 56529, 14594, +42051, 24180, 65373, 3122, 34795, 50248, 15741, 29045, 59918, 8057, 41924, +23674, 52473, 11697, 38496, 21677, 61229, 6410, 32163, 46505, 17540, 56725, +11954, 38264, 27282, 47259, 5035, 63711, 18540, 32646, 46269, 9110, 50502, +17566, 30906, 59203, 1197, 46640, 28512, 15732, 55413, 36568, 4285, 46767, +24292, 59945, 13465, 38483, 22062, 55806, 6236, 37261, 49513, 14480, 30214, +60993, 1274, 47570, 23481, 40247, 14572, 63270, 29289, 2568, 53917, 36393, +21309, 51837, 8914, 47304, 19755, 32222, 65262, 5722, 45062, 19584, 32166, +56291, 8864, 48036, 18674, 31852, 60461, 3123, 43038, 24428, 52695, 14628, +31673, 62040, 375, 46974, 28855, 16069, 59630, 37016, 4218, 53676, 24637, +43915, 12212, 33223, 58083, 19235, 49421, 3042, 32411, 45669, 18624, 64007, +11327, 40907, 23365, 52248, 4019, 37116, 57006, 14534, 29477, 48345, 674, +62753, 22605, 39022, 7543, 48504, 27280, 57743, 13847, 43481, 24296, 63118, + 1214, 39394, 22533, 55559, 8004, 49314, 26063, 40743, 10819, 61659, 22543, +38924, 135, 54117, 27086, 38348, 9772, 60605, 21132, 48798, 13069, 38388, +27246, 52164, 1296, 36403, 65003, 15044, 30085, 50366, 11869, 42313, 24201, +62137, 461, 40938, 21872, 52558, 13383, 31939, 55771, 4985, 47478, 28339, +16652, 62689, 37570, 7545, 48397, 23842, 59360, 12041, 39067, 22934, 61177, + 6271, 47753, 17951, 31293, 54364, 7967, 42254, 24270, 61731, 676, 39690, +21973, 49108, 12540, 64857, 25887, 40209, 2963, 51518, 17664, 33450, 62819, +11142, 48371, 24994, 38542, 3453, 52743, 28662, 16033, 61641, 36339, 6387, +49474, 27992, 15529, 53017, 35990, 8067, 60477, 26453, 47652, 9891, 40979, +23219, 53385, 4270, 34680, 62220, 16905, 44264, 28772, 5788, 53859, 37275, +18294, 56785, 10447, 43242, 26683, 52003, 7478, 32463, 59596, 15504, 46708, +28930, 6227, 54558, 38105, 14612, 32541, 56923, 3354, 41927, 23560, 63240, +13181, 35865, 51193, 304, 42640, 23906, 55784, 11867, 38526, 21271, 65196, + 2743, 36123, 50657, 12605, 29900, 57551, 20290, 44160, 419, 33912, 64219, +21293, 42431, 11498, 58318, 23363, 40360, 6342, 48181, 24429, 64915, 1165, +33942, 43922, 19152, 55537, 5258, 40469, 27127, 59056, 12538, 43489, 21439, +52133, 6292, 32947, 58391, 19800, 41960, 11502, 48610, 22836, 65372, 2319, +34406, 45055, 17467, 60800, 5200, 37471, 51623, 15519, 28498, 46898, 7776, +61181, 25301, 38661, 3821, 56488, 17828, 30982, 50336, 9466, 34670, 14867, +53804, 25584, 44917, 6863, 33306, 63290, 15633, 47803, 28883, 2183, 59447, +37042, 16630, 49950, 28063, 3616, 52548, 36526, 20538, 62403, 11816, 42536, +23005, 55760, 7749, 45984, 29000, 15348, 58984, 34934, 9030, 52218, 24572, +42876, 4220, 57229, 22944, 39782, 13378, 55658, 26496, 38990, 7912, 51168, +19059, 33047, 64580, 4683, 45122, 27897, 14715, 58367, 38162, 6174, 29856, +53755, 20527, 48857, 2894, 33064, 63815, 18671, 43672, 11730, 53410, 21036, +30358, 56071, 3762, 44061, 17405, 31397, 62118, 11752, 43271, 23809, 54596, + 5612, 39740, 21827, 61492, 12818, 46616, 29036, 7665, 53129, 36938, 18022, +57480, 11794, 42854, 26750, 62779, 8723, 33998, 53542, 18096, 47211, 5127, +34971, 61113, 15754, 29499, 53826, 895, 45654, 28149, 16745, 61962, 38136, + 7661, 29321, 48724, 18246, 63198, 2456, 39829, 25524, 55575, 12384, 43487, +21997, 53141, 717, 33740, 64775, 14506, 47054, 33256, 9939, 58044, 24542, +42675, 5363, 51067, 18447, 34512, 59187, 11, 45554, 17151, 34957, 63994, +11712, 30373, 46164, 20488, 57784, 7309, 41163, 26713, 60573, 12042, 38302, +21075, 50014, 2326, 30286, 57233, 16627, 44412, 27419, 4769, 63272, 37171, +19710, 52466, 6495, 45604, 29801, 11866, 60989, 37202, 19333, 53325, 5534, +33660, 46766, 13193, 64109, 25594, 41007, 1809, 54350, 22679, 45009, 9404, +34238, 65295, 19162, 49356, 929, 42722, 26073, 59297, 13931, 35214, 53896, + 3129, 42260, 22918, 62372, 11682, 41780, 25686, 53194, 7838, 40564, 22521, +58086, 11858, 39289, 26961, 63445, 368, 47957, 17662, 34810, 52085, 7544, +28896, 64370, 20224, 42714, 12909, 54938, 34625, 5407, 49697, 20550, 33723, +58913, 10086, 44441, 17060, 35053, 61354, 107, 29466, 53591, 13141, 42294, +24083, 59772, 3882, 34746, 53507, 14732, 44365, 27625, 9867, 63078, 37561, +18561, 50387, 7280, 33492, 57413, 13028, 42480, 23917, 52368, 8936, 34107, +64773, 19407, 46554, 1243, 34897, 61631, 16154, 44599, 28459, 7887, 59870, +37581, 17154, 54001, 1534, 36210, 49398, 16713, 31503, 61239, 8288, 44550, +27371, 16826, 59381, 36878, 11042, 52250, 24084, 42238, 2833, 54983, 21840, +40588, 9543, 48240, 26770, 58835, 13584, 34170, 45982, 2669, 60510, 19578, +33168, 51947, 6496, 43806, 25480, 59595, 13253, 41524, 23539, 50596, 3023, +31651, 62569, 18513, 42286, 7606, 58492, 26079, 40631, 10635, 55193, 21775, +39178, 5857, 60034, 31478, 15853, 49748, 37831, 3699, 63805, 23072, 44618, +12235, 34445, 59805, 1492, 41563, 21760, 54411, 13081, 30694, 45453, 3248, +57338, 29051, 15942, 50161, 35687, 2593, 64460, 23251, 46383, 14533, 32335, +59336, 8899, 45480, 19145, 36040, 54273, 4219, 31362, 58719, 20412, 45498, + 9366, 30584, 57035, 20277, 43953, 5669, 32584, 60706, 18772, 47381, 9627, +32467, 56930, 18146, 45891, 840, 33617, 63889, 13856, 42016, 24170, 54911, + 3335, 38331, 21821, 59622, 13889, 45564, 32046, 7529, 57711, 27538, 12258, +50496, 36026, 20871, 62565, 1530, 34977, 49456, 16361, 29118, 63561, 3708, +35037, 44792, 12263, 57919, 24304, 41357, 1934, 64155, 20337, 36145, 51787, +10335, 29542, 48073, 20374, 61435, 6815, 31419, 46184, 18717, 58048, 4440, +40639, 27023, 48628, 10931, 54767, 25174, 39763, 6173, 60429, 17754, 47747, +29471, 9199, 54830, 35710, 18192, 48624, 3038, 62149, 27248, 38456, 10527, +52333, 17890, 32084, 57924, 8745, 47155, 28996, 16213, 63461, 35883, 2837, +50802, 24968, 41499, 10337, 55632, 23543, 39719, 1392, 62320, 28924, 15848, +51034, 36236, 8053, 56555, 25029, 47926, 12378, 39860, 22481, 59340, 753, +34396, 54180, 18156, 44498, 10781, 32711, 64752, 15152, 47351, 28049, 1123, +58601, 36533, 21147, 38804, 3048, 48697, 27017, 55686, 9144, 40362, 24540, +60838, 12393, 39668, 22360, 53727, 7555, 31206, 64267, 15108, 45677, 29151, + 377, 58292, 35420, 18658, 50370, 5150, 34522, 64883, 20548, 42206, 2714, +54623, 27052, 39392, 9956, 62396, 18902, 35079, 49633, 93, 29473, 63178, +12645, 42544, 23597, 56799, 2637, 36660, 50211, 16084, 30160, 61615, 8543, +48207, 24460, 40477, 11714, 62763, 25920, 39720, 7610, 56595, 20121, 34188, +50925, 336, 42207, 24769, 60990, 10498, 34402, 52966, 20494, 46541, 1627, +34559, 64854, 14324, 41318, 26298, 57513, 3383, 32811, 51065, 14186, 41797, +23995, 60749, 1541, 40980, 22792, 50236, 6816, 30058, 56451, 14599, 45223, +27695, 2207, 59152, 37799, 20774, 50186, 9170, 34013, 65507, 12912, 43735, +22140, 51681, 4963, 34882, 58920, 20034, 45106, 10677, 34210, 57567, 21145, +48963, 4453, 38719, 26922, 60567, 11151, 29460, 51025, 20288, 41648, 3537, +62357, 26393, 39236, 12426, 55922, 22533, 47712, 7239, 32110, 60981, 19412, +43452, 9337, 54986, 27121, 39816, 4548, 51231, 17234, 32639, 53670, 1511, +43688, 24375, 63403, 10476, 41266, 22457, 52494, 7669, 37646, 58729, 14775, +29621, 50245, 9238, 41807, 24981, 59571, 15280, 35937, 49555, 1506, 28577, +55867, 14798, 42327, 22506, 58751, 3447, 37098, 50369, 15880, 30195, 62204, + 7522, 48540, 24472, 38794, 13070, 58198, 24106, 38536, 4834, 51233, 19024, +30813, 61332, 8796, 45671, 28545, 15000, 56278, 37989, 5494, 32199, 64484, +19962, 47791, 2643, 32978, 54066, 20789, 42607, 8595, 56418, 25438, 40745, +11258, 58140, 22660, 46934, 3906, 31640, 60315, 9919, 41129, 25282, 56006, +13903, 37134, 50791, 3029, 30244, 64039, 18639, 46614, 7461, 36903, 57065, +15664, 31327, 50620, 6296, 45945, 28018, 16538, 64256, 37322, 1615, 49803, +20557, 30947, 56140, 4712, 44535, 28161, 16415, 63833, 37934, 2368, 29931, +47941, 17400, 56691, 6952, 31331, 44850, 15042, 53066, 27580, 5695, 56096, +36426, 19760, 47162, 9694, 57876, 21032, 30185, 44901, 5355, 65495, 28426, +15349, 51508, 38077, 2168, 32423, 55481, 20658, 43781, 6022, 63878, 26836, +39364, 12381, 56662, 18353, 35502, 51461, 4344, 31281, 64369, 18226, 44101, + 9752, 31264, 54542, 13300, 41985, 23749, 63607, 3863, 39880, 21501, 57473, + 9295, 33153, 53807, 14485, 43557, 25335, 51380, 5009, 33048, 63676, 17559, +46669, 2076, 36868, 53062, 14445, 28603, 58013, 7909, 46500, 27407, 16603, +53172, 35415, 8868, 57927, 25039, 46519, 14555, 32772, 65498, 6014, 43634, +24419, 51401, 14371, 34763, 62381, 8417, 42538, 24373, 55039, 11926, 40163, +21608, 57837, 3691, 38976, 26656, 53122, 11343, 29915, 63054, 17714, 44013, + 7670, 34447, 49393, 17140, 63612, 1737, 34644, 45012, 14046, 54416, 26486, +39184, 2707, 64499, 24499, 43445, 10777, 52442, 20813, 29992, 57777, 7075, +44856, 35304, 17622, 62856, 10951, 42754, 26270, 52169, 124, 33986, 64246, +16118, 46591, 28379, 3886, 55418, 38168, 15049, 29743, 58857, 8369, 46076, +27433, 13196, 55822, 37686, 20300, 51378, 5179, 31608, 60709, 18496, 46389, + 8204, 31554, 55692, 17383, 44476, 3836, 34521, 59011, 14006, 40960, 25728, +51897, 8667, 33313, 59451, 17747, 45512, 1277, 32319, 62768, 13922, 42493, +23608, 53093, 3933, 36821, 61652, 14607, 28472, 46285, 7514, 57509, 22702, +41087, 12171, 47409, 25290, 56187, 2058, 39516, 22299, 60450, 6797, 42834, +26224, 53585, 11695, 31848, 61585, 18003, 46854, 4846, 34695, 59600, 20765, +48832, 11905, 41352, 25945, 54283, 3012, 30931, 63447, 17052, 42699, 6546, +51207, 29005, 15085, 62267, 38187, 8459, 29890, 49107, 19978, 55836, 5380, +40942, 23843, 45646, 11238, 61934, 47799, 12689, 41146, 21867, 65439, 5015, +34241, 52475, 17940, 45052, 1323, 33460, 58525, 13668, 43146, 25437, 50512, + 5791, 34134, 61402, 17577, 47526, 12690, 41661, 26802, 53160, 6904, 32041, +57273, 12822, 47005, 28981, 16093, 59566, 36372, 4741, 51056, 25199, 43563, +11567, 60261, 17388, 34330, 53697, 7346, 47990, 26171, 39472, 10858, 59534, +20156, 33508, 54365, 1260, 44576, 19251, 35711, 51996, 4513, 31189, 58814, +15090, 46863, 27903, 8572, 64378, 36885, 17177, 54111, 6086, 37877, 49378, +15283, 30103, 58574, 6843, 42549, 22945, 52058, 10304, 34659, 55531, 18752, +43034, 5921, 64002, 29416, 16617, 53600, 37941, 10074, 31892, 63260, 18737, +43137, 3754, 52286, 29775, 16246, 62453, 36555, 7154, 49362, 27495, 15464, +55887, 37994, 3413, 30514, 60066, 14633, 41918, 25130, 54823, 268, 31236, +47553, 17334, 64281, 8916, 40996, 19422, 56206, 35027, 5771, 49439, 17330, +37903, 59016, 8355, 29941, 54155, 18124, 44697, 1834, 33602, 63668, 14114, +40563, 26526, 54163, 3028, 38782, 23139, 62787, 12798, 43320, 24698, 55942, + 7535, 39915, 21949, 59909, 13446, 39601, 26910, 56671, 5241, 29752, 47190, +18875, 64596, 180, 34477, 46089, 18761, 53666, 3732, 32424, 62907, 12614, +43045, 23320, 51942, 8538, 35408, 63895, 11329, 29174, 45481, 20460, 57061, + 5958, 34000, 44767, 19496, 59398, 2697, 41473, 26858, 55004, 11683, 40939, +22132, 63131, 6868, 33157, 53108, 16329, 43913, 27561, 1671, 54270, 36055, +16706, 60242, 27309, 9732, 49987, 37608, 17962, 61577, 5838, 44771, 30606, +15824, 62978, 35651, 2272, 51273, 26111, 40556, 12297, 53776, 18517, 36889, +61985, 980, 28567, 47833, 20094, 59532, 8423, 40425, 25659, 54424, 12734, +40343, 24867, 60229, 3626, 39636, 22380, 52592, 12650, 32330, 57954, 8210, +43059, 22724, 60297, 10920, 33669, 52861, 18158, 48356, 6414, 41223, 23312, +60753, 11982, 48984, 26024, 41170, 9345, 62580, 19879, 36602, 50271, 2939, +30507, 63508, 12831, 41378, 24452, 51865, 68, 33440, 62093, 13592, 42356, +23109, 53105, 8550, 34342, 56811, 18502, 43290, 5628, 60867, 29106, 15265, +53537, 35113, 8698, 47397, 23456, 61448, 367, 30072, 44875, 15567, 57341, +27809, 7172, 49900, 36807, 20523, 61422, 1601, 46195, 29902, 16455, 55847, +37958, 7618, 30115, 48058, 19112, 65408, 855, 40119, 24009, 54580, 8362, +39481, 22440, 57666, 12644, 43540, 25964, 51083, 4472, 32658, 63061, 15422, +44873, 29435, 1092, 61053, 37375, 19567, 51775, 5272, 42477, 22578, 55497, +10496, 38370, 27272, 60665, 4020, 41972, 20296, 54009, 32182, 95, 49376, +17376, 34688, 61596, 7115, 43630, 25279, 50589, 13766, 34543, 59787, 1194, +46812, 20926, 37785, 56416, 6201, 29634, 46500, 20756, 59171, 11029, 40029, +24365, 48023, 7374, 55705, 21781, 40986, 12640, 59947, 26688, 39021, 4044, +50500, 19289, 32135, 61223, 1930, 46784, 20541, 31395, 56802, 6135, 49102, +17960, 30275, 44605, 8461, 60542, 22972, 39691, 11972, 52269, 26081, 43763, + 5678, 61117, 19555, 37052, 50468, 522, 30588, 64675, 17448, 44059, 10346, +34488, 49422, 21035, 57364, 1016, 39454, 26930, 48495, 11647, 65040, 18188, +32267, 44305, 2419, 54853, 22625, 39356, 10607, 64414, 29099, 15818, 50968, +36966, 6914, 45271, 24539, 58094, 9822, 40326, 19441, 51553, 31815, 926, +64644, 37186, 17485, 50654, 4850, 34652, 62857, 15725, 45586, 29400, 9154, +51563, 35427, 18079, 64255, 671, 44211, 35087, 14153, 49139, 25585, 57414, + 8341, 31022, 45257, 17394, 64613, 5810, 34614, 46945, 20666, 58981, 9486, +34114, 45590, 21493, 53916, 3518, 33540, 57889, 16657, 45181, 27491, 1942, +63169, 36469, 15603, 51896, 31165, 7372, 58087, 24664 diff --git a/src/printdef/.cvsignore b/src/printdef/.cvsignore new file mode 100644 index 0000000..8e12f00 --- /dev/null +++ b/src/printdef/.cvsignore @@ -0,0 +1,8 @@ +.deps +.libs +Makefile +Makefile.in +printdefl.c +printdef +printdefy.c +printdefy.h diff --git a/src/printdef/Makefile.am b/src/printdef/Makefile.am new file mode 100644 index 0000000..bb9faa3 --- /dev/null +++ b/src/printdef/Makefile.am @@ -0,0 +1,50 @@ +## $Id: Makefile.am,v 1.8 2001/11/10 14:42:43 rlk Exp $ +## Copyright (C) 2000 Roger Leigh +## +## 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, or (at your option) +## any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +## Process this file with automake to produce Makefile.in. + +AUTOMAKE_OPTIONS = 1.4 gnu + +@SET_MAKE@ + +MAINT_CHARSET = latin1 + + +## Variables + +AM_CFLAGS = $(GNUCFLAGS) +INCLUDES = @INCLUDES@ + +LFLAGS = -i +YFLAGS = -d + + +## Programs + +noinst_PROGRAMS = printdef +printdef_SOURCES = printdefl.l printdefy.y printdef.h + +printdefl.o: printdefy.o +printdef.o: printdefy.o + + +## Clean + +DISTCLEANFILES = printdefl.c printdefy.c printdefy.h +MAINTAINERCLEANFILES = Makefile.in + +EXTRA_DIST = printdefy.h diff --git a/src/printdef/printdef.h b/src/printdef/printdef.h new file mode 100644 index 0000000..31bb44a --- /dev/null +++ b/src/printdef/printdef.h @@ -0,0 +1,103 @@ +/* + * "$Id: printdef.h,v 1.5 2001/03/31 20:56:53 rlk Exp $" + * + * I18N header file for the gimp-print plugin. + * + * Copyright 1997-2000 Michael Sweet (mike@easysw.com), + * Robert Krawitz (rlk@alum.mit.edu) and Michael Natterer (mitch@gimp.org) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#define OUTPUT_GRAY 0 /* Grayscale output */ +#define OUTPUT_COLOR 1 /* Color output */ +#define OUTPUT_GRAY_COLOR 2 /* Grayscale output using color */ + +#define ORIENT_AUTO -1 /* Best orientation */ +#define ORIENT_PORTRAIT 0 /* Portrait orientation */ +#define ORIENT_LANDSCAPE 1 /* Landscape orientation */ +#define ORIENT_UPSIDEDOWN 2 /* Reverse portrait orientation */ +#define ORIENT_SEASCAPE 3 /* Reverse landscape orientation */ + +#define IMAGE_LINE_ART 0 +#define IMAGE_SOLID_TONE 1 +#define IMAGE_CONTINUOUS 2 +#define IMAGE_MONOCHROME 3 +#define NIMAGE_TYPES 4 + +#define COLOR_MODEL_RGB 0 +#define COLOR_MODEL_CMY 1 + +typedef struct /* Plug-in variables */ +{ + char output_to[256], /* Name of file or command to print to */ + driver[64], /* Name of printer "driver" */ + ppd_file[256], /* PPD file */ + resolution[64], /* Resolution */ + media_size[64], /* Media size */ + media_type[64], /* Media type */ + media_source[64], /* Media source */ + ink_type[64], /* Ink or cartridge */ + dither_algorithm[64]; /* Dithering algorithm */ + int output_type; /* Color or grayscale output */ + float brightness; /* Output brightness */ + float scaling; /* Scaling, percent of printable area */ + int orientation, /* Orientation - 0 = port., 1 = land., + -1 = auto */ + left, /* Offset from lower-lefthand corner, points */ + top; /* ... */ + float gamma; /* Gamma */ + float contrast, /* Output Contrast */ + cyan, /* Output red level */ + magenta, /* Output green level */ + yellow; /* Output blue level */ + float saturation; /* Output saturation */ + float density; /* Maximum output density */ + int image_type; /* Image type (line art etc.) */ + int unit; /* Units for preview area 0=Inch 1=Metric */ + float app_gamma; /* Application gamma */ + int page_width; /* Width of page in points */ + int page_height; /* Height of page in points */ + int input_color_model; /* Color model for this device */ + int output_color_model; /* Color model for this device */ + void *lut; /* Look-up table */ + void *driver_data; /* Private data of the driver */ + unsigned char *cmap; /* Color map */ + void (*outfunc)(void *data, const char *buffer, size_t bytes); + void *outdata; + void (*errfunc)(void *data, const char *buffer, size_t bytes); + void *errdata; +} stp_vars_t; + +typedef struct stp_printer +{ + const char *long_name, /* Long name for UI */ + *driver; /* Short name for printrc file */ + int model; /* Model number */ + const char *printfuncs; + stp_vars_t printvars; +} stp_printer_t; + +typedef union yylv { + int ival; + double dval; + char *sval; +} YYSTYPE; + +extern YYSTYPE yylval; +extern stp_printer_t thePrinter; + +#include "printdefy.h" + diff --git a/src/printdef/printdefl.l b/src/printdef/printdefl.l new file mode 100644 index 0000000..7c56c88 --- /dev/null +++ b/src/printdef/printdefl.l @@ -0,0 +1,93 @@ +/* + * "$Id: printdefl.l,v 1.2 2001/06/03 20:53:24 rlk Exp $" + * + * Parse printer definition pseudo-XML + * + * Copyright 2000 Robert Krawitz (rlk@alum.mit.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +%{ + +#include +#include +#include +#include "printdef.h" + +#define YY_NO_UNPUT + +int mylineno = 1; + +#if 0 +#define DBG(x) fprintf(stderr, "'%s'%s\n", yytext, #x); +#else +#define DBG(x) +#endif + +static char * +c_strdup(const char *s) +{ + char *ret = malloc(strlen(s) + 1); + if (!ret) + { + fprintf(stderr, "Malloc failed.\n"); + exit(1); + } + strcpy(ret, s); + return ret; +} + +%} + +%option noyywrap + +digit [0-9] +integer [-+]?{digit}+ +float [-+]?{digit}+(\.{digit}+)?([eE][-+]?{digit}+)? +class [a-zA-Z][a-zA-Z0-9_]+ +string [\"][^\"]+[\"] +ws [ \t]+ + +%% + +\< DBG(tBEGIN) return tBEGIN; +\> DBG(tEND) return tEND; += DBG(ASSIGN) return ASSIGN; +printer DBG(PRINTER) return PRINTER; +\/printer DBG(ENDPRINTER) return ENDPRINTER; +name DBG(NAME) return NAME; +driver DBG(DRIVER) return DRIVER; +color DBG(COLOR) return COLOR; +nocolor DBG(NOCOLOR) return NOCOLOR; +model DBG(MODEL) return MODEL; +language DBG(LANGUAGE) return LANGUAGE; +brightness DBG(BRIGHTNESS) return BRIGHTNESS; +gamma DBG(GAMMA) return GAMMA; +contrast DBG(CONTRAST) return CONTRAST; +cyan DBG(CYAN) return CYAN; +magenta DBG(MAGENTA) return MAGENTA; +yellow DBG(YELLOW) return YELLOW; +saturation DBG(SATURATION) return SATURATION; +density DBG(DENSITY) return DENSITY; +value DBG(VALUE) return VALUE; + +{integer} yylval.ival = atoi(yytext); DBG(tINT) return tINT; +{float} yylval.dval = strtod(yytext, NULL); DBG(tDOUBLE) return tDOUBLE; +{string} yylval.sval = c_strdup(yytext); DBG(tSTRING) return tSTRING; +{class} yylval.sval = c_strdup(yytext); DBG(tCLASS) return tCLASS; +{ws} DBG(whitespace1) /* Skip blanks/tabs */ +#[^\n]* DBG(comment1) /* Skip comments */ +\n DBG(newline) mylineno++; diff --git a/src/printdef/printdefy.y b/src/printdef/printdefy.y new file mode 100644 index 0000000..98439c2 --- /dev/null +++ b/src/printdef/printdefy.y @@ -0,0 +1,213 @@ +/* + * "$Id: printdefy.y,v 1.7 2001/08/25 16:25:28 rlk Exp $" + * + * Parse printer definition pseudo-XML + * + * Copyright 2000 Robert Krawitz (rlk@alum.mit.edu) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +%{ + +#include +#include +#include +#include "printdef.h" + +extern int mylineno; +stp_printer_t thePrinter; +char *quotestrip(const char *i); +char *endstrip(const char *i); + +extern int yylex(void); +void initialize_the_printer(const char *name, const char *driver); +void output_the_printer(void); +int yyerror(const char *s); + +const char *printfuncs[] = +{ + "canon", + "escp2", + "pcl", + "ps", + "lexmark" +}; + +const size_t nprintfuncs = sizeof(printfuncs) / sizeof(const char *); + +void +initialize_the_printer(const char *name, const char *driver) +{ + strncpy(thePrinter.printvars.output_to, name, 63); + strncpy(thePrinter.printvars.driver, driver, 63); + thePrinter.printvars.top = -1; + thePrinter.model = -1; + thePrinter.printvars.brightness = 1.0; + thePrinter.printvars.gamma = 1.0; + thePrinter.printvars.contrast = 1.0; + thePrinter.printvars.cyan = 1.0; + thePrinter.printvars.magenta = 1.0; + thePrinter.printvars.yellow = 1.0; + thePrinter.printvars.saturation = 1.0; + thePrinter.printvars.density = 1.0; +} + +void +output_the_printer(void) +{ + printf(" {\n"); + printf(" %s,\n", thePrinter.printvars.output_to); + printf(" %s,\n", thePrinter.printvars.driver); + printf(" %d,\n", thePrinter.model); + printf(" &stp_%s_printfuncs,\n", printfuncs[thePrinter.printvars.top]); + printf(" {\n"); + printf(" \"\",\n"); /* output_to */ + printf(" %s,\n", thePrinter.printvars.driver); /* driver */ + printf(" \"\",\n"); /* ppd_file */ + printf(" \"\",\n"); /* resolution */ + printf(" \"\",\n"); /* media_size */ + printf(" \"\",\n"); /* media_type */ + printf(" \"\",\n"); /* media_source */ + printf(" \"\",\n"); /* ink_type */ + printf(" \"\",\n"); /* dither_algorithm */ + printf(" %d,\n", thePrinter.printvars.output_type); + printf(" %.3f,\n", thePrinter.printvars.brightness); + printf(" 1.0,\n"); /* scaling */ + printf(" -1,\n"); /* orientation */ + printf(" 0,\n"); /* top */ + printf(" 0,\n"); /* left */ + printf(" %.3f,\n", thePrinter.printvars.gamma); + printf(" %.3f,\n", thePrinter.printvars.contrast); + printf(" %.3f,\n", thePrinter.printvars.cyan); + printf(" %.3f,\n", thePrinter.printvars.magenta); + printf(" %.3f,\n", thePrinter.printvars.yellow); + printf(" %.3f,\n", thePrinter.printvars.saturation); + printf(" %.3f,\n", thePrinter.printvars.density); + printf(" }\n"); + printf(" },\n"); +} + +extern int mylineno; +extern char* yytext; + +static int yyerror( const char *s ) +{ + fprintf(stderr,"stdin:%d: %s before '%s'\n",mylineno,s,yytext); + return 0; +} + +%} + +%token tINT +%token tDOUBLE +%token tSTRING tCLASS +%token tBEGIN tEND ASSIGN PRINTER NAME DRIVER COLOR NOCOLOR MODEL +%token LANGUAGE BRIGHTNESS GAMMA CONTRAST +%token CYAN MAGENTA YELLOW SATURATION DENSITY ENDPRINTER VALUE + +%start Printers + +%% + +printerstart: tBEGIN PRINTER NAME ASSIGN tSTRING DRIVER ASSIGN tSTRING tEND + { initialize_the_printer($5, $8); } +; +printerstartalt: tBEGIN PRINTER DRIVER ASSIGN tSTRING NAME ASSIGN tSTRING tEND + { initialize_the_printer($8, $5); } +; +printerend: tBEGIN ENDPRINTER tEND + { output_the_printer(); } +; +color: tBEGIN COLOR tEND + { thePrinter.printvars.output_type = OUTPUT_COLOR; } +; +nocolor: tBEGIN NOCOLOR tEND + { thePrinter.printvars.output_type = OUTPUT_GRAY; } +; +model: tBEGIN MODEL VALUE ASSIGN tINT tEND + { thePrinter.model = $5; } +; +language: tBEGIN LANGUAGE VALUE ASSIGN tCLASS tEND + { + int i; + for (i = 0; i < nprintfuncs; i++) + { + if (!strcmp($5, printfuncs[i])) + { + thePrinter.printvars.top = i; + break; + } + } + } +; +brightness: tBEGIN BRIGHTNESS VALUE ASSIGN tDOUBLE tEND + { thePrinter.printvars.brightness = $5; } +; +gamma: tBEGIN GAMMA VALUE ASSIGN tDOUBLE tEND + { thePrinter.printvars.gamma = $5; } +; +contrast: tBEGIN CONTRAST VALUE ASSIGN tDOUBLE tEND + { thePrinter.printvars.contrast = $5; } +; +cyan: tBEGIN CYAN VALUE ASSIGN tDOUBLE tEND + { thePrinter.printvars.cyan = $5; } +; +magenta: tBEGIN MAGENTA VALUE ASSIGN tDOUBLE tEND + { thePrinter.printvars.magenta = $5; } +; +yellow: tBEGIN YELLOW VALUE ASSIGN tDOUBLE tEND + { thePrinter.printvars.yellow = $5; } +; +saturation: tBEGIN SATURATION VALUE ASSIGN tDOUBLE tEND + { thePrinter.printvars.saturation = $5; } +; +density: tBEGIN DENSITY VALUE ASSIGN tDOUBLE tEND + { thePrinter.printvars.density = $5; } +; + +Empty: + +pstart: printerstart | printerstartalt +; + +parg: color | nocolor | model | language | brightness | gamma | contrast + | cyan | magenta | yellow | saturation | density + +pargs: pargs parg | parg + +Printer: pstart pargs printerend | pstart printerend + +Printers: Printers Printer | Empty + +%% + +int +main(int argc, char **argv) +{ + int retval; + int i; + printf("/* This file is automatically generated. See printers.xml.\n"); + printf(" DO NOT EDIT! */\n\n"); + for (i = 0; i < nprintfuncs; i++) + printf("const extern stp_printfuncs_t stp_%s_printfuncs;\n", + printfuncs[i]); + printf("\nstatic const stp_internal_printer_t printers[] =\n"); + printf("{\n"); + retval = yyparse(); + printf("};\n"); + printf("static const int printer_count = sizeof(printers) / sizeof(stp_internal_printer_t);\n"); + return retval; +} diff --git a/src/testpattern/.cvsignore b/src/testpattern/.cvsignore new file mode 100644 index 0000000..d9b90da --- /dev/null +++ b/src/testpattern/.cvsignore @@ -0,0 +1,8 @@ +testpatterny.c +testpatterny.h +testpatternl.c +testpattern +Makefile.in +Makefile +.deps +.libs diff --git a/src/testpattern/Makefile.am b/src/testpattern/Makefile.am new file mode 100644 index 0000000..7291d7e --- /dev/null +++ b/src/testpattern/Makefile.am @@ -0,0 +1,66 @@ +## $Id: Makefile.am,v 1.5 2001/09/17 20:37:57 rleigh Exp $ +## Copyright (C) 2000 Roger Leigh +## +## 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, or (at your option) +## any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +## Process this file with automake to produce Makefile.in. + +AUTOMAKE_OPTIONS = 1.4 gnu + +@SET_MAKE@ + +MAINT_CHARSET = latin1 + + +## Variables + +AM_CFLAGS = $(GNUCFLAGS) +INCLUDES = @INCLUDES@ $(LIBGIMPPRINT_CFLAGS) +LIBS = @LIBS@ $(INTLLIBS) + +## Programs + +TESTPATTERN_BIN = testpattern + +bin_PROGRAMS = @TESTPATTERN_BIN@ + +EXTRA_PROGRAMS = testpattern + +LFLAGS = -i +YFLAGS = -d + +testpattern_SOURCES = testpattern.c testpatterny.y testpatternl.l testpattern.h +testpattern_LDADD = $(LIBGIMPPRINT_LIBS) +testpattern_DEPENDENCIES = $(LIBGIMPPRINT_LIBS) + +testpatternl.o: testpatterny.o +testpattern.o: testpatterny.o + +$(LIBGIMPPRINT_LIBS): + cd ../main ; \ + $(MAKE) + +SAMPLE_IMAGES = testpattern.sample + +pkgdatadir = $(datadir)/$(PACKAGE)/samples + +pkgdata_DATA = @SAMPLE_IMAGES@ + +## Clean + +MAINTAINERCLEANFILES = Makefile.in + +DISTCLEANFILES = testpatternl.c testpatterny.c testpatterny.h +EXTRA_DIST = testpatterny.h testpattern.sample diff --git a/src/testpattern/testpattern.c b/src/testpattern/testpattern.c new file mode 100644 index 0000000..5802b97 --- /dev/null +++ b/src/testpattern/testpattern.c @@ -0,0 +1,554 @@ +/* + * "$Id: testpattern.c,v 1.6 2001/10/01 23:14:00 rlk Exp $" + * + * Test pattern generator for Gimp-Print + * + * Copyright 2001 Robert Krawitz + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + * This sample program may be used to generate test patterns. It also + * serves as an example of how to use the gimp-print API. + * + * As the purpose of this program is to allow fine grained control over + * the output, it uses the raw CMYK output type. This feeds 16 bits each + * of CMYK to the driver. This mode performs no correction on the data; + * it passes it directly to the dither engine, performing no color, + * density, gamma, etc. correction. Most programs will use one of the + * other modes (RGB, density and gamma corrected 8-bit CMYK, grayscale, or + * black and white). + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include "testpattern.h" + +static const char *Image_get_appname(stp_image_t *image); +static void Image_progress_conclude(stp_image_t *image); +static void Image_note_progress(stp_image_t *image, + double current, double total); +static void Image_progress_init(stp_image_t *image); +static stp_image_status_t Image_get_row(stp_image_t *image, + unsigned char *data, int row); +static int Image_height(stp_image_t *image); +static int Image_width(stp_image_t *image); +static int Image_bpp(stp_image_t *image); +static void Image_init(stp_image_t *image); +static stp_image_t theImage = +{ + Image_init, + NULL, /* reset */ + NULL, /* transpose */ + NULL, /* hflip */ + NULL, /* vflip */ + NULL, /* crop */ + NULL, /* ccw */ + NULL, /* cw */ + NULL, /* 180 */ + Image_bpp, + Image_width, + Image_height, + Image_get_row, + Image_get_appname, + Image_progress_init, + Image_note_progress, + Image_progress_conclude, + NULL +}; + +double global_c_level = 1.0; +double global_c_gamma = 1.0; +double global_m_level = 1.0; +double global_m_gamma = 1.0; +double global_y_level = 1.0; +double global_y_gamma = 1.0; +double global_k_gamma = 1.0; +double global_gamma = 1.0; +int levels = 256; +double ink_limit = 1.0; +char *printer = 0; +char *ink_type = 0; +char *resolution = 0; +char *media_source = 0; +char *media_type = 0; +char *media_size = 0; +char *dither_algorithm = 0; +double density = 1.0; +double xtop = 0; +double xleft = 0; +double hsize = 1.0; +double vsize = 1.0; +int noblackline = 0; +int printer_width, printer_height, bandheight; +int n_testpatterns = 0; + +testpattern_t *the_testpatterns = NULL; + +char * +c_strdup(const char *s) +{ + int l = strlen(s); + char *ret; + if (s[0] == '"' && s[l - 1] == '"') + { + ret = malloc(l - 1); + strncpy(ret, s + 1, l - 2); + ret[l - 2] = '\0'; + } + else + { + ret = malloc(strlen(s) + 1); + strcpy(ret, s); + } + return ret; +} + +testpattern_t * +get_next_testpattern(void) +{ + static int internal_n_testpatterns = 0; + if (n_testpatterns == 0) + { + the_testpatterns = malloc(sizeof(testpattern_t)); + n_testpatterns = internal_n_testpatterns = 1; + return &(the_testpatterns[0]); + } + else if (n_testpatterns >= internal_n_testpatterns) + { + internal_n_testpatterns *= 2; + the_testpatterns = + realloc(the_testpatterns, + internal_n_testpatterns * sizeof(testpattern_t)); + } + return &(the_testpatterns[n_testpatterns++]); +} + +static void +do_help(void) +{ + fprintf(stderr, "%s", "\ +Usage: testpattern -p printer [-n ramp_levels] [-I ink_limit] [-i ink_type]\n\ + [-r resolution] [-s media_source] [-t media_type]\n\ + [-z media_size] [-d dither_algorithm] [-e density]\n\ + [-c cyan_level] [-m magenta_level] [-y yellow_level]\n\ + [-C cyan_gamma] [-M magenta_gamma] [-Y yellow_gamma]\n\ + [-K black_gamma] [-G gamma] [-q]\n\ + [-H width] [-V height] [-T top] [-L left]\n\ + -H, -V, -T, -L expressed as fractions of the printable paper size\n\ + 0.0 < ink_limit <= 1.0\n\ + 1 < ramp_levels <= 4096\n\ + 0.1 <= density <= 2.0\n\ + 0.0 < cyan_level <= 10.0 same for magenta and yellow.\n"); + exit(1); +} + +static void +writefunc(void *file, const char *buf, size_t bytes) +{ + FILE *prn = (FILE *)file; + fwrite(buf, 1, bytes, prn); +} + +int +main(int argc, char **argv) +{ + int c; + stp_vars_t v; + stp_printer_t the_printer; + stp_papersize_t pt; + int left, right, top, bottom; + const stp_printfuncs_t *printfuncs; + int x, y, owidth; + int width, height; + + int retval = yyparse(); + if (retval) + return retval; + + while (1) + { + c = getopt(argc, argv, "qp:n:l:I:r:s:t:z:d:hC:M:Y:K:e:T:L:H:V:c:m:y:G:"); + if (c == -1) + break; + switch (c) + { + case 'C': + global_c_gamma = strtod(optarg, 0); + break; + case 'I': + ink_limit = strtod(optarg, 0); + break; + case 'G': + global_gamma = strtod(optarg, 0); + break; + case 'H': + hsize = strtod(optarg, 0); + break; + case 'K': + global_k_gamma = strtod(optarg, 0); + break; + case 'L': + xleft = strtod(optarg, 0); + break; + case 'M': + global_m_gamma = strtod(optarg, 0); + break; + case 'T': + xtop = strtod(optarg, 0); + break; + case 'V': + vsize = strtod(optarg, 0); + break; + case 'Y': + global_y_gamma = strtod(optarg, 0); + break; + case 'c': + global_c_level = strtod(optarg, 0); + break; + case 'd': + dither_algorithm = c_strdup(optarg); + break; + case 'e': + density = strtod(optarg, 0); + break; + case 'h': + do_help(); + break; + case 'i': + ink_type = c_strdup(optarg); + break; + case 'm': + global_m_level = strtod(optarg, 0); + break; + case 'n': + levels = atoi(optarg); + break; + case 'p': + printer = c_strdup(optarg); + break; + case 'q': + noblackline = 1; + break; + case 'r': + resolution = c_strdup(optarg); + break; + case 's': + media_source = c_strdup(optarg); + break; + case 't': + media_type = c_strdup(optarg); + break; + case 'y': + global_y_level = strtod(optarg, 0); + break; + case 'z': + media_size = c_strdup(optarg); + break; + default: + fprintf(stderr, "Unknown option '-%c'\n", c); + do_help(); + break; + } + } + if (!printer || + ink_limit <= 0 || ink_limit > 1.0 || + levels < 1 || levels > 4096 || + global_c_level <= 0 || global_c_level > 10 || + global_m_level <= 0 || global_m_level > 10 || + global_y_level <= 0 || global_y_level > 10 || + xtop < 0 || xtop > 1 || xleft < 0 || xleft > 1 || + xtop + vsize > 1 || xleft + hsize > 1 || + hsize < 0 || hsize > 1 || vsize < 0 || vsize > 1) + do_help(); + stp_init(); + v = stp_allocate_vars(); + the_printer = stp_get_printer_by_driver(printer); + if (!the_printer) + { + the_printer = stp_get_printer_by_long_name(printer); + if (!the_printer) + { + int i; + fprintf(stderr, "Unknown printer %s\nValid printers are:\n",printer); + for (i = 0; i < stp_known_printers(); i++) + { + the_printer = stp_get_printer_by_index(i); + fprintf(stderr, "%-16s%s\n", stp_printer_get_driver(the_printer), + stp_printer_get_long_name(the_printer)); + } + return 1; + } + } + stp_set_printer_defaults(v, the_printer, NULL); + stp_set_outfunc(v, writefunc); + stp_set_errfunc(v, writefunc); + stp_set_outdata(v, stdout); + stp_set_errdata(v, stderr); + printfuncs = stp_printer_get_printfuncs(the_printer); + stp_set_density(v, density); + if (resolution) + stp_set_resolution(v, resolution); + if (ink_type) + stp_set_ink_type(v, ink_type); + if (media_type) + stp_set_media_type(v, media_type); + if (media_source) + stp_set_media_source(v, media_source); + if (media_size) + stp_set_media_size(v, media_size); + if (dither_algorithm) + stp_set_dither_algorithm(v, dither_algorithm); + + /* + * Most programs will not use OUTPUT_RAW_CMYK; OUTPUT_COLOR or + * OUTPUT_GRAYSCALE are more useful for most purposes. + */ + stp_set_output_type(v, OUTPUT_RAW_CMYK); + + pt = stp_get_papersize_by_name(stp_get_media_size(v)); + if (!pt) + { + fprintf(stderr, "Papersize %s unknown\n", media_size); + return 1; + } + + (printfuncs->imageable_area)(the_printer, v, &left, &right, &bottom, &top); + (printfuncs->describe_resolution)(the_printer, stp_get_resolution(v),&x, &y); + if (x < 0) + x = 300; + if (y < 0) + y = 300; + + width = right - left; + height = top - bottom; + top -= stp_papersize_get_height(pt); + top = top + height * xtop; + left = width * xleft; + owidth = width; + if (levels > width) + levels = width; + + width = (width / levels) * levels; + height = (height / n_testpatterns) * n_testpatterns; + if (hsize > vsize) + { + stp_set_scaling(v, 100 * hsize); + printer_width = width * x / 72; + printer_height = vsize / hsize * height * y / 72; + } + else + { + stp_set_scaling(v, 100 * vsize); + printer_width = hsize / vsize * width * x / 72; + printer_height = height * y / 72; + } + + bandheight = printer_height / n_testpatterns; + stp_set_left(v, left + (hsize * (owidth - width) / 2)); + stp_set_top(v, top); + stp_set_orientation(v, ORIENT_PORTRAIT); + + stp_merge_printvars(v, stp_printer_get_printvars(the_printer)); + if (stp_printer_get_printfuncs(the_printer)->verify(the_printer, v)) + (stp_printer_get_printfuncs(the_printer)->print)(the_printer, &theImage, v); + else + return 1; + return 0; +} + +static void +fill_black(unsigned short *data, size_t len, size_t scount) +{ + int i; + for (i = 0; i < (len / scount) * scount; i++) + { + data[3] = ink_limit * 65535; + data += 4; + } +} + +static void +fill_colors(unsigned short *data, size_t len, size_t scount, testpattern_t *p) +{ + double c_min = p->c_min == -2 ? global_c_level : p->c_min; + double m_min = p->m_min == -2 ? global_m_level : p->m_min; + double y_min = p->y_min == -2 ? global_y_level : p->y_min; + double k_min = p->k_min; + double c = p->c == -2 ? global_c_level : p->c; + double m = p->m == -2 ? global_m_level : p->m; + double y = p->y == -2 ? global_y_level : p->y; + double c_gamma = p->c_gamma * global_gamma * global_c_gamma; + double m_gamma = p->m_gamma * global_gamma * global_m_gamma; + double y_gamma = p->y_gamma * global_gamma * global_y_gamma; + double k_gamma = p->k_gamma * global_gamma * global_k_gamma; + double k = p->k; + double c_level = p->c_level == -2 ? global_c_level : p->c_level; + double m_level = p->m_level == -2 ? global_m_level : p->m_level; + double y_level = p->y_level == -2 ? global_y_level : p->y_level; + double lower = p->lower; + double upper = p->upper; + int i; + int j; + int pixels; + c -= c_min; + m -= m_min; + y -= y_min; + k -= k_min; + if (scount > len) + scount = len; + pixels = len / scount; + for (i = 0; i < scount; i++) + { + double where = (double) i / ((double) scount - 1); + double cmyv; + double kv; + double val = where; + double cc = c_min + val * c; + double mm = m_min + val * m; + double yy = y_min + val * y; + double kk = k_min + k; + cc = pow(cc, c_gamma); + mm = pow(mm, m_gamma); + yy = pow(yy, y_gamma); + kk = pow(kk, k_gamma); + if (where <= lower) + kv = 0; + else if (where > upper) + kv = where; + else + kv = (where - lower) * upper / (upper - lower); + cmyv = k * (where - kv); + kk *= kv; + cc += cmyv * c_level; + mm += cmyv * m_level; + yy += cmyv * y_level; + if (cc > 1.0) + cc = 1.0; + if (mm > 1.0) + mm = 1.0; + if (yy > 1.0) + yy = 1.0; + if (kk > 1.0) + kk = 1.0; + cc *= ink_limit * 65535; + mm *= ink_limit * 65535; + yy *= ink_limit * 65535; + kk *= ink_limit * 65535; + for (j = 0; j < pixels; j++) + { + data[0] = cc; + data[1] = mm; + data[2] = yy; + data[3] = kk; + data += 4; + } + } +} + +static stp_image_status_t +Image_get_row(stp_image_t *image, unsigned char *data, int row) +{ + static int previous_band = -1; + int band = row / bandheight; + if (previous_band == -2) + { + memset(data, 0, printer_width * 4 * sizeof(unsigned short)); + fill_colors((unsigned short *)data, printer_width, levels, + &(the_testpatterns[band])); + previous_band = band; + } + else if (row == printer_height - 1) + { + memset(data, 0, printer_width * 4 * sizeof(unsigned short)); + fill_black((unsigned short *)data, printer_width, levels); + } + else if (band >= n_testpatterns) + memset(data, 0, printer_width * 4 * sizeof(unsigned short)); + else if (band != previous_band && band > 0) + { + memset(data, 0, printer_width * 4 * sizeof(unsigned short)); + if (noblackline) + { + fill_colors((unsigned short *)data, printer_width, levels, + &(the_testpatterns[band])); + previous_band = band; + } + else + { + fill_black((unsigned short *)data, printer_width, levels); + previous_band = -2; + } + } + return STP_IMAGE_OK; +} + +static int +Image_bpp(stp_image_t *image) +{ + return 8; +} + +static int +Image_width(stp_image_t *image) +{ + return printer_width; +} + +static int +Image_height(stp_image_t *image) +{ + return printer_height; +} + +static void +Image_init(stp_image_t *image) +{ + /* dummy function */ +} + +static void +Image_progress_init(stp_image_t *image) +{ + /* dummy function */ +} + +/* progress display */ +static void +Image_note_progress(stp_image_t *image, double current, double total) +{ + fprintf(stderr, "."); +} + +static void +Image_progress_conclude(stp_image_t *image) +{ + fprintf(stderr, "\n"); +} + +static const char * +Image_get_appname(stp_image_t *image) +{ + return "Test Pattern"; +} diff --git a/src/testpattern/testpattern.h b/src/testpattern/testpattern.h new file mode 100644 index 0000000..d2cd2bc --- /dev/null +++ b/src/testpattern/testpattern.h @@ -0,0 +1,80 @@ +/* + * "$Id: testpattern.h,v 1.2 2001/08/14 00:12:58 rlk Exp $" + * + * Test pattern generator for Gimp-Print + * + * Copyright 2001 Robert Krawitz + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +typedef struct +{ + double c_min; + double c; + double c_gamma; + double m_min; + double m; + double m_gamma; + double y_min; + double y; + double y_gamma; + double k_min; + double k; + double k_gamma; + double c_level; + double m_level; + double y_level; + double lower; + double upper; +} testpattern_t; + +extern double global_c_level; +extern double global_c_gamma; +extern double global_m_level; +extern double global_m_gamma; +extern double global_y_level; +extern double global_y_gamma; +extern double global_k_gamma; +extern double global_gamma; +extern int levels; +extern double ink_limit; +extern char *printer; +extern char *ink_type; +extern char *resolution; +extern char *media_source; +extern char *media_type; +extern char *media_size; +extern char *dither_algorithm; +extern double density; +extern double xtop; +extern double xleft; +extern double hsize; +extern double vsize; +extern int noblackline; +extern char *c_strdup(const char *s); +extern testpattern_t *get_next_testpattern(void); + +typedef union yylv { + int ival; + double dval; + char *sval; +} YYSTYPE; + +extern YYSTYPE yylval; + +#include "testpatterny.h" + + diff --git a/src/testpattern/testpattern.sample b/src/testpattern/testpattern.sample new file mode 100644 index 0000000..6897962 --- /dev/null +++ b/src/testpattern/testpattern.sample @@ -0,0 +1,168 @@ +# Sample test pattern file, for use with Gimp-Print test pattern generator + +# Printer/driver settings. Please see src/ghost/README for appropriate +# values for each of these settings +# Printer model +printer escp2-870 +# Resolution, or print quality +resolution 360sw +# Media source (if appropriate for your printer) +media_source Standard +# Media type (what kind of paper) +media_type Photo +# ink_type +ink_type PhotoCMYK +# Paper size +media_size Letter +# Dither algorithm +dither_algorithm Ordered + +# Note that due to limitations in the lexical analyzer and parser, all +# floating point values must be specified with a decimal point. + +# Placement settings +# Horizontal size, as fraction of paper width (defaults to 1.0) +hsize 0.33 +# Vertical size, as fraction of paper width (defaults to 1.0) +vsize 0.33 +# Left margin, as fraction of paper width (defaults to 0) +left 0.66 +# Top margin, as fraction of paper width (defaults to 0) +top 0.66 + +# Output settings +# These settings are used as the base values for all ramps. These settings +# are multiplied by the appropriate values in each pattern definition +# to compute the effective gamma and conversion values. All of these +# default to 1.0. +# Gamma value applied to all inks +gamma 1.0 +# Additional gamma correction applied to cyan, magenta, yellow, and black inks +c_gamma 1.0 +m_gamma 1.0 +y_gamma 1.0 +k_gamma 1.0 +# Amount of each ink that should be used when black is converted to CMY. +# These values must be greater than 0 and must not exceed 10. +c_level 1.0 +m_level 1.0 +y_level 1.0 + +# Maximum amount of ink that will be printed, relative to solid coverage. +# 1.0 means that every dot position that can be printed will be. Normally +# at high resolutions less ink should be printed. This is similar to +# density in normal RGB mode, but does not affect photo ink conversion. +ink_limit 1.0 + +# Density. Unlike normal RGB mode, the CMYK16 input mode used by the +# test pattern generator does not automatically scale the amount of ink +# used by the resolution and paper type (see ink_limit above). The test +# driver separates the functions of ink limiting and photo ink conversion +# to allow maximum control over the output. +density 1.0 + +# Do we want a thin black line between each band? (default yes) +blackline 0 + +# Number of levels in each ramp (default 256) +levels 16 + +# Pattern specifiers +# CYAN MAGENTA YELLOW BLACK BLACK BLACK RAMP ENDPOINTS +# CONVERSION +# Min Min Min Min Cyan Lower +# Max Max Max Max Magenta Upper +# Gamma Gamma Gamma Gamma Yellow + +# 0) White band +pattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 +# 1) C sweep +pattern 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 +# 2) M sweep +pattern 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 +# 3) Y sweep +pattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 +# 4) Pure CMY sweep +pattern 0.0 1.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 +# 5) K sweep +pattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 +# 6) Adjusted CMY sweep +pattern 0.0 -2.0 1.0 0.0 -2.0 1.0 0.0 -2.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 +# 7) Pure CMY sweep +pattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 +# 8) Adjusted CMY sweep +pattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 -2.0 -2.0 -2.0 1.0 1.0 +# 9) CMYK, transition band 10-30% +pattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 0.1 0.3 +# 10) Adjusted CMYK, transition band 30-70% +pattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 -2.0 -2.0 -2.0 0.3 0.7 +# 11) CMYK, transition band 10-99.9% +pattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 0.1 0.999 +# 12) CMYK, transition band 30-99.9% +pattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 0.3 0.999 +# 13) CMYK, transition band 50-99.9% +pattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.999 +# 14) Adjusted CMYK, transition band 10-30% +pattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 -2.0 -2.0 -2.0 0.1 0.3 +# 15) CMYK, transition band 30-70% +pattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 0.3 0.7 +# 16) Adjusted CMYK, transition band 10-99.9% +pattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 -2.0 -2.0 -2.0 0.1 0.999 +# 17) Adjusted CMYK, transition band 30-99.9% +pattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 -2.0 -2.0 -2.0 0.3 0.999 +# 18) Adjusted CMYK, transition band 50-99.9% +pattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 -2.0 -2.0 -2.0 0.5 0.999 +# 19) Y+M (R) sweep +pattern 0.0 0.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 +# 20) Y+M+.25C sweep +pattern 0.0 0.0 1.0 0.0 0.75 1.0 0.0 0.75 1.0 0.0 0.25 1.0 1.0 1.0 1.0 1.0 1.0 +# 21) Y+M+.25C sweep (using K) +pattern 0.0 0.0 1.0 0.0 0.75 1.0 0.0 0.75 1.0 0.0 0.25 1.0 1.0 1.0 1.0 0.0 0.0 +# 22) Y+M+.5C sweep +pattern 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 +# 23) Y+M+.5C sweep (using K) +pattern 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.0 0.0 +# 24) Y+M+.75C sweep +pattern 0.0 0.0 1.0 0.0 0.25 1.0 0.0 0.25 1.0 0.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 +# 25) Y+M+.75C sweep (using K) +pattern 0.0 0.0 1.0 0.0 0.25 1.0 0.0 0.25 1.0 0.0 0.75 1.0 1.0 1.0 1.0 0.0 0.0 +# 26) Y+M+.9C sweep +pattern 0.0 0.0 1.0 0.0 0.1 1.0 0.0 0.1 1.0 0.0 0.9 1.0 1.0 1.0 1.0 1.0 1.0 +# 27) Y+M+.9C sweep (using K) +pattern 0.0 0.0 1.0 0.0 0.1 1.0 0.0 0.1 1.0 0.0 0.9 1.0 1.0 1.0 1.0 0.0 0.0 +# 28) C+Y (G) sweep +pattern 0.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 +# 29) C+Y+.25M sweep +pattern 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.75 1.0 0.0 0.25 1.0 1.0 1.0 1.0 1.0 1.0 +# 30) C+Y+.25M sweep (using K) +pattern 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.75 1.0 0.0 0.25 1.0 1.0 1.0 1.0 0.0 0.0 +# 31) C+Y+.5M sweep +pattern 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 +# 32) C+Y+.5M sweep (using K) +pattern 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.0 0.0 +# 33) C+Y+.75M sweep +pattern 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.25 1.0 0.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 +# 34) C+Y+.75M sweep (using K) +pattern 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.25 1.0 0.0 0.75 1.0 1.0 1.0 1.0 0.0 0.0 +# 35) C+Y+.9M sweep +pattern 0.0 0.1 1.0 0.0 0.0 1.0 0.0 0.1 1.0 0.0 0.9 1.0 1.0 1.0 1.0 1.0 1.0 +# 36) C+Y+.9M sweep (using K) +pattern 0.0 0.1 1.0 0.0 0.0 1.0 0.0 0.1 1.0 0.0 0.9 1.0 1.0 1.0 1.0 0.0 0.0 +# 37) C+M (B) sweep +pattern 0.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 +# 38) C+M+.25Y sweep +pattern 0.0 0.75 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.25 1.0 1.0 1.0 1.0 1.0 1.0 +# 39) C+M+.25Y sweep (using K) +pattern 0.0 0.75 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.25 1.0 1.0 1.0 1.0 0.0 0.0 +# 40) C+M+.5Y sweep +pattern 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 +# 41) C+M+.5Y sweep (using K) +pattern 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.0 0.0 +# 42) C+M+.75Y sweep +pattern 0.0 0.25 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 +# 43) C+M+.75Y sweep (using K) +pattern 0.0 0.25 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.75 1.0 1.0 1.0 1.0 0.0 0.0 +# 44) C+M+.9Y sweep +pattern 0.0 0.1 1.0 0.0 0.1 1.0 0.0 0.0 1.0 0.0 0.9 1.0 1.0 1.0 1.0 1.0 1.0 +# 45) C+M+.9Y sweep (using K) +pattern 0.0 0.1 1.0 0.0 0.1 1.0 0.0 0.0 1.0 0.0 0.9 1.0 1.0 1.0 1.0 0.0 0.0 diff --git a/src/testpattern/testpatternl.l b/src/testpattern/testpatternl.l new file mode 100644 index 0000000..164cf3a --- /dev/null +++ b/src/testpattern/testpatternl.l @@ -0,0 +1,87 @@ +/* + * "$Id: testpatternl.l,v 1.2 2001/08/14 00:12:58 rlk Exp $" + * + * Test pattern generator for Gimp-Print + * + * Copyright 2001 Robert Krawitz + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +%{ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include "testpattern.h" + +#define YY_NO_UNPUT + +int mylineno = 1; + +#if 0 +#define DBG(x) fprintf(stderr, "'%s'%s\n", yytext, #x); +#else +#define DBG(x) +#endif + +%} + +%option noyywrap + +digit [0-9] +integer [-+]?{digit}+ +float [-+]?{digit}+(\.{digit}+)?([eE][-+]?{digit}+)? +string ([\"][^\"\n]+[\"])|([^ \t\n"]+) +ws [ \t]+ + +%% + +c_gamma DBG(C_GAMMA) return C_GAMMA; +m_gamma DBG(M_GAMMA) return M_GAMMA; +y_gamma DBG(Y_GAMMA) return Y_GAMMA; +k_gamma DBG(K_GAMMA) return K_GAMMA; +gamma DBG(GAMMA) return GAMMA; +c_level DBG(C_LEVEL) return C_LEVEL; +m_level DBG(M_LEVEL) return M_LEVEL; +y_level DBG(Y_LEVEL) return Y_LEVEL; +levels DBG(LEVELS) return LEVELS; +ink_limit DBG(INK_LIMIT) return INK_LIMIT; +width DBG(WIDTH) return WIDTH; +printer DBG(PRINTER) return PRINTER; +ink_type DBG(INK_TYPE) return INK_TYPE; +resolution DBG(RESOLUTION) return RESOLUTION; +media_source DBG(MEDIA_SOURCE) return MEDIA_SOURCE; +media_type DBG(MEDIA_TYPE) return MEDIA_TYPE; +media_size DBG(MEDIA_SIZE) return MEDIA_SIZE; +dither_algorithm DBG(DITHER_ALGORITHM) return DITHER_ALGORITHM; +density DBG(DENSITY) return DENSITY; +top DBG(TOP) return TOP; +left DBG(LEFT) return LEFT; +hsize DBG(HSIZE) return HSIZE; +vsize DBG(VSIZE) return VSIZE; +blackline DBG(BLACKLINE) return BLACKLINE; +pattern DBG(PATTERN) return PATTERN; + +{integer} yylval.ival = atoi(yytext); DBG(tINT) return tINT; +{float} yylval.dval = strtod(yytext, NULL); DBG(tDOUBLE) return tDOUBLE; +{string} yylval.sval = c_strdup(yytext); DBG(tSTRING) return tSTRING; +{ws} DBG(whitespace1) /* Skip blanks/tabs */ +#[^\n]* DBG(comment1) /* Skip comments */ +\n DBG(newline) mylineno++; diff --git a/src/testpattern/testpatterny.y b/src/testpattern/testpatterny.y new file mode 100644 index 0000000..f5dc681 --- /dev/null +++ b/src/testpattern/testpatterny.y @@ -0,0 +1,192 @@ +/* + * "$Id: testpatterny.y,v 1.3 2001/10/27 17:16:39 rlk Exp $" + * + * Test pattern generator for Gimp-Print + * + * Copyright 2001 Robert Krawitz + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +%{ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include "testpattern.h" + +extern int mylineno; + +extern int yylex(void); +int yyerror(const char *s); +char *quotestrip(const char *i); +char *endstrip(const char *i); + +extern int mylineno; +extern char* yytext; + +static int yyerror( const char *s ) +{ + fprintf(stderr,"stdin:%d: %s before '%s'\n",mylineno,s,yytext); + return 0; +} + +%} + +%token tINT +%token tDOUBLE +%token tSTRING + +%token C_GAMMA +%token M_GAMMA +%token Y_GAMMA +%token K_GAMMA +%token GAMMA +%token C_LEVEL +%token M_LEVEL +%token Y_LEVEL +%token LEVELS +%token INK_LIMIT +%token INK +%token WIDTH +%token PRINTER +%token INK_TYPE +%token RESOLUTION +%token MEDIA_SOURCE +%token MEDIA_TYPE +%token MEDIA_SIZE +%token DITHER_ALGORITHM +%token DENSITY +%token TOP +%token LEFT +%token HSIZE +%token VSIZE +%token BLACKLINE +%token PATTERN + +%start Rules + +%% + +global_c_level: C_LEVEL tDOUBLE + { global_c_level = $2; } +; +global_m_level: M_LEVEL tDOUBLE + { global_m_level = $2; } +; +global_y_level: Y_LEVEL tDOUBLE + { global_y_level = $2; } +; +global_c_gamma: C_GAMMA tDOUBLE + { global_c_gamma = $2; } +; +global_m_gamma: M_GAMMA tDOUBLE + { global_m_gamma = $2; } +; +global_y_gamma: Y_GAMMA tDOUBLE + { global_y_gamma = $2; } +; +global_k_gamma: K_GAMMA tDOUBLE + { global_k_gamma = $2; } +; +global_gamma: GAMMA tDOUBLE + { global_gamma = $2; } +; +levels: LEVELS tINT + { levels = $2; } +; +ink_limit: INK_LIMIT tDOUBLE + { ink_limit = $2; } +; +printer: PRINTER tSTRING + { printer = c_strdup($2); } +; +ink_type: INK_TYPE tSTRING + { ink_type = c_strdup($2); } +; +resolution: RESOLUTION tSTRING + { resolution = c_strdup($2); } +; +media_source: MEDIA_SOURCE tSTRING + { media_source = c_strdup($2); } +; +media_type: MEDIA_TYPE tSTRING + { media_type = c_strdup($2); } +; +media_size: MEDIA_SIZE tSTRING + { media_size = c_strdup($2); } +; +dither_algorithm: DITHER_ALGORITHM tSTRING + { dither_algorithm = c_strdup($2); } +; +density: DENSITY tDOUBLE + { density = $2; } +; +top: TOP tDOUBLE + { xtop = $2; } +; +left: LEFT tDOUBLE + { xleft = $2; } +; +hsize: HSIZE tDOUBLE + { hsize = $2; } +; +vsize: VSIZE tDOUBLE + { vsize = $2; } +; +blackline: BLACKLINE tINT + { noblackline = !($2); } +; + +pattern: PATTERN tDOUBLE tDOUBLE tDOUBLE tDOUBLE tDOUBLE tDOUBLE tDOUBLE + tDOUBLE tDOUBLE tDOUBLE tDOUBLE tDOUBLE tDOUBLE tDOUBLE tDOUBLE + tDOUBLE tDOUBLE + { + testpattern_t *t = get_next_testpattern(); + t->c_min = $2; + t->c = $3; + t->c_gamma = $4; + t->m_min = $5; + t->m = $6; + t->m_gamma = $7; + t->y_min = $8; + t->y = $9; + t->y_gamma = $10; + t->k_min = $11; + t->k = $12; + t->k_gamma = $13; + t->c_level = $14; + t->m_level = $15; + t->y_level = $16; + t->lower = $17; + t->upper = $18; + } +; + +Empty: + +Rule: global_c_level | global_m_level | global_y_level + | global_c_gamma | global_m_gamma | global_y_gamma | global_k_gamma + | global_gamma | levels | ink_limit | printer | ink_type | resolution + | media_source | media_type | media_size | dither_algorithm | density + | top | left | hsize | vsize | blackline | pattern + +Rules: Rules Rule | Empty + +%% -- cgit v1.2.3