summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoger Leigh <rleigh@debian.org>2008-10-26 16:11:41 +0000
committerRoger Leigh <rleigh@debian.org>2008-10-26 16:11:41 +0000
commitdfae5860833782af557deb35e286d7e186fe3cf5 (patch)
treee3b4282ae08e120f78cd0c097f7cb3b570e94da2 /src
parent3b59bb0a607ec27ea60f07d1cd5d1bbb4483c832 (diff)
Imported Upstream version 4.3.99+cvs20050702
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am23
-rw-r--r--src/Makefile.in685
-rw-r--r--src/cups/Makefile.am141
-rw-r--r--src/cups/Makefile.in1214
-rw-r--r--src/cups/README14
-rw-r--r--src/cups/cups-calibrate.c15
-rw-r--r--src/cups/cups-genppdconfig.in616
-rw-r--r--src/cups/cups-genppdupdate.in539
-rw-r--r--src/cups/epson.c4
-rw-r--r--src/cups/genppd.c1573
-rw-r--r--src/cups/rastertoprinter.c1231
-rw-r--r--src/escputil/Makefile.am19
-rw-r--r--src/escputil/Makefile.in739
-rw-r--r--src/escputil/d4lib.c1310
-rw-r--r--src/escputil/d4lib.h51
-rw-r--r--src/escputil/escputil.c1288
-rw-r--r--src/foomatic/Makefile.am91
-rw-r--r--src/foomatic/Makefile.in870
-rw-r--r--src/foomatic/foomatic-generator.in980
-rw-r--r--src/foomatic/foomatic-printermap63
-rw-r--r--src/foomatic/foomatic-templates-gs/Brightness.xml24
-rw-r--r--src/foomatic/foomatic-templates-gs/Color.xml20
-rw-r--r--src/foomatic/foomatic-templates-gs/Contrast.xml24
-rw-r--r--src/foomatic/foomatic-templates-gs/Cyan.xml24
-rw-r--r--src/foomatic/foomatic-templates-gs/Density.xml24
-rw-r--r--src/foomatic/foomatic-templates-gs/Dither.xml20
-rw-r--r--src/foomatic/foomatic-templates-gs/Gamma.xml24
-rw-r--r--src/foomatic/foomatic-templates-gs/ImageType.xml63
-rw-r--r--src/foomatic/foomatic-templates-gs/InkType.xml20
-rw-r--r--src/foomatic/foomatic-templates-gs/InputSlot.xml20
-rw-r--r--src/foomatic/foomatic-templates-gs/Magenta.xml24
-rw-r--r--src/foomatic/foomatic-templates-gs/MediaType.xml20
-rw-r--r--src/foomatic/foomatic-templates-gs/PageSize.xml20
-rw-r--r--src/foomatic/foomatic-templates-gs/PrintoutMode.xml19
-rw-r--r--src/foomatic/foomatic-templates-gs/Quality.xml20
-rw-r--r--src/foomatic/foomatic-templates-gs/Resolution.xml20
-rw-r--r--src/foomatic/foomatic-templates-gs/Saturation.xml24
-rw-r--r--src/foomatic/foomatic-templates-gs/Yellow.xml24
-rw-r--r--src/foomatic/foomatic-templates-gs/gimp-print.xml43
-rw-r--r--src/foomatic/foomatic-templates-ijs/Brightness.xml24
-rw-r--r--src/foomatic/foomatic-templates-ijs/Contrast.xml24
-rw-r--r--src/foomatic/foomatic-templates-ijs/Cyan.xml24
-rw-r--r--src/foomatic/foomatic-templates-ijs/Density.xml24
-rw-r--r--src/foomatic/foomatic-templates-ijs/Dither.xml20
-rw-r--r--src/foomatic/foomatic-templates-ijs/Gamma.xml24
-rw-r--r--src/foomatic/foomatic-templates-ijs/ImageType.xml63
-rw-r--r--src/foomatic/foomatic-templates-ijs/InkType.xml20
-rw-r--r--src/foomatic/foomatic-templates-ijs/InputSlot.xml20
-rw-r--r--src/foomatic/foomatic-templates-ijs/Magenta.xml24
-rw-r--r--src/foomatic/foomatic-templates-ijs/NumericalOptions.xml21
-rw-r--r--src/foomatic/foomatic-templates-ijs/OtherOptions.xml (renamed from src/foomatic/foomatic-templates-gs/Model.xml)13
-rw-r--r--src/foomatic/foomatic-templates-ijs/Quality.xml20
-rw-r--r--src/foomatic/foomatic-templates-ijs/RenderResolution.xml (renamed from src/foomatic/foomatic-templates-ijs/MediaType.xml)10
-rw-r--r--src/foomatic/foomatic-templates-ijs/Resolution.xml12
-rw-r--r--src/foomatic/foomatic-templates-ijs/Saturation.xml24
-rw-r--r--src/foomatic/foomatic-templates-ijs/Yellow.xml24
-rw-r--r--src/foomatic/foomatic-templates-ijs/gutenprint.xml (renamed from src/foomatic/foomatic-templates-ijs/gimp-print.xml)22
-rw-r--r--src/foomatic/gutenprint-version.c (renamed from src/foomatic/gimp-print-version.c)14
-rw-r--r--src/foomatic/mk_printerlist.in30
-rw-r--r--src/foomatic/oldprinterids640
-rw-r--r--src/foomatic/paper_sizes.c17
-rw-r--r--src/foomatic/printer_margins.c138
-rw-r--r--src/foomatic/printer_options.c288
-rw-r--r--src/foomatic/printers.c17
-rw-r--r--src/foomatic/stp_limits.c98
-rw-r--r--src/ghost/COPYING339
-rw-r--r--src/ghost/Makefile539
-rw-r--r--src/ghost/Makefile.am135
-rw-r--r--src/ghost/Makefile.in779
-rw-r--r--src/ghost/README1633
-rw-r--r--src/ghost/README.bsd57
-rw-r--r--src/ghost/contrib.mak.addon.in17
-rw-r--r--src/ghost/contrib.mak.addon.old55
-rw-r--r--src/ghost/debian-patch40
-rw-r--r--src/ghost/debian-patch-stp34
-rw-r--r--src/ghost/devs.mak.addon-5.1055
-rw-r--r--src/ghost/gdevstp.c737
-rw-r--r--src/ghost/ijsgimpprint.c1028
-rw-r--r--src/ghost/ijsgutenprint.c1374
-rw-r--r--src/gimp/Makefile.am27
-rw-r--r--src/gimp/Makefile.in766
-rw-r--r--src/gimp/gimp_color_window.c581
-rw-r--r--src/gimp/gimp_main_window.c3314
-rw-r--r--src/gimp/print-image-gimp.c396
-rw-r--r--src/gimp/print-intl.h27
-rw-r--r--src/gimp/print.c1241
-rw-r--r--src/gimp/print_gimp.h86
-rw-r--r--src/gimp2/Makefile.am (renamed from src/printdef/Makefile.am)28
-rw-r--r--src/gimp2/Makefile.in644
-rw-r--r--src/gimp2/print-image-gimp.c447
-rw-r--r--src/gimp2/print-intl.h38
-rw-r--r--src/gimp2/print.c462
-rw-r--r--src/gimp2/print_gimp.h46
-rw-r--r--src/gutenprintui/Makefile.am77
-rw-r--r--src/gutenprintui/Makefile.in782
-rw-r--r--src/gutenprintui/gutenprintui-internal.h243
-rw-r--r--src/gutenprintui/gutenprintui.pc.in11
-rw-r--r--src/gutenprintui/panel.c4923
-rw-r--r--src/gutenprintui/plist.c1755
-rw-r--r--src/gutenprintui/print-image-thumbnail.c130
-rw-r--r--src/gutenprintui/printrc.h44
-rw-r--r--src/gutenprintui/printrcl.c2106
-rw-r--r--src/gutenprintui/printrcl.l115
-rw-r--r--src/gutenprintui/printrcy.c1694
-rw-r--r--src/gutenprintui/printrcy.h124
-rw-r--r--src/gutenprintui/printrcy.y398
-rw-r--r--src/gutenprintui/ui-utils.c870
-rw-r--r--src/gutenprintui2/Makefile.am101
-rw-r--r--src/gutenprintui2/Makefile.in830
-rw-r--r--src/gutenprintui2/curve.c1055
-rw-r--r--src/gutenprintui2/gammacurve.c495
-rw-r--r--src/gutenprintui2/gutenprintui-internal.h240
-rw-r--r--src/gutenprintui2/gutenprintui2.pc.in11
-rw-r--r--src/gutenprintui2/panel.c4962
-rw-r--r--src/gutenprintui2/plist.c1751
-rw-r--r--src/gutenprintui2/print-image-thumbnail.c130
-rw-r--r--src/gutenprintui2/printrc.h44
-rw-r--r--src/gutenprintui2/printrcl.c2106
-rw-r--r--src/gutenprintui2/printrcl.l115
-rw-r--r--src/gutenprintui2/printrcy.c1694
-rw-r--r--src/gutenprintui2/printrcy.h124
-rw-r--r--src/gutenprintui2/printrcy.y398
-rw-r--r--src/gutenprintui2/typebuiltins.c58
-rw-r--r--src/gutenprintui2/ui-utils.c874
-rw-r--r--src/main/Makefile.am180
-rw-r--r--src/main/Makefile.in1165
-rw-r--r--src/main/array.c281
-rw-r--r--src/main/bit-ops.c1199
-rw-r--r--src/main/channel.c1017
-rw-r--r--src/main/color-conversion.h189
-rw-r--r--src/main/color-conversions.c2207
-rw-r--r--src/main/color.c286
-rw-r--r--src/main/curve-cache.c141
-rw-r--r--src/main/curve.c1901
-rw-r--r--src/main/dither-ed.c466
-rw-r--r--src/main/dither-eventone.c710
-rw-r--r--src/main/dither-impl.h263
-rw-r--r--src/main/dither-inks.c423
-rw-r--r--src/main/dither-inlined-functions.h85
-rw-r--r--src/main/dither-main.c513
-rw-r--r--src/main/dither-matrix-1x1.xml5553
-rw-r--r--src/main/dither-matrix-2x1.xml5505
-rw-r--r--src/main/dither-matrix-4x1.xml5569
-rw-r--r--src/main/dither-ordered.c166
-rw-r--r--src/main/dither-predithered.c134
-rw-r--r--src/main/dither-very-fast.c135
-rw-r--r--src/main/escp2-channels.c2212
-rw-r--r--src/main/escp2-driver.c652
-rw-r--r--src/main/escp2-inks.c338
-rw-r--r--src/main/escp2-papers.c1181
-rw-r--r--src/main/escp2-resolutions.c469
-rw-r--r--src/main/generic-options.c257
-rw-r--r--src/main/generic-options.h67
-rw-r--r--src/main/gimp-print-internal.h495
-rw-r--r--src/main/gimpprint-config.in93
-rw-r--r--src/main/gimpprint.m4190
-rw-r--r--src/main/gutenprint-internal.h56
-rw-r--r--src/main/gutenprint.pc.in10
-rw-r--r--src/main/image.c77
-rw-r--r--src/main/libgutenprint.sym440
-rw-r--r--src/main/module.c415
-rw-r--r--src/main/mxml-attr.c160
-rw-r--r--src/main/mxml-file.c1436
-rw-r--r--src/main/mxml-node.c494
-rw-r--r--src/main/mxml-search.c199
-rw-r--r--src/main/papers.xml1023
-rw-r--r--src/main/path.c320
-rw-r--r--src/main/print-canon.c2099
-rw-r--r--src/main/print-color.c3344
-rw-r--r--src/main/print-dither-matrices.c501
-rw-r--r--src/main/print-dither.c3779
-rw-r--r--src/main/print-dither.h82
-rw-r--r--src/main/print-escp2-data.c6015
-rw-r--r--src/main/print-escp2.c4129
-rw-r--r--src/main/print-escp2.h815
-rw-r--r--src/main/print-lexmark.c1679
-rw-r--r--src/main/print-list.c711
-rw-r--r--src/main/print-olympus.c2099
-rw-r--r--src/main/print-papers.c422
-rw-r--r--src/main/print-pcl.c3143
-rw-r--r--src/main/print-ps.c608
-rw-r--r--src/main/print-raw.c376
-rw-r--r--src/main/print-util.c1918
-rw-r--r--src/main/print-vars.c1481
-rw-r--r--src/main/print-version.c60
-rw-r--r--src/main/print-weave.c1603
-rw-r--r--src/main/printers.c1073
-rw-r--r--src/main/printers.xml3221
-rw-r--r--src/main/quickmatrix257.h6027
-rw-r--r--src/main/ran.367.179.h5995
-rw-r--r--src/main/ran.509.131.h6084
-rw-r--r--src/main/sequence.c533
-rw-r--r--src/main/string-list.c157
-rw-r--r--src/main/util.h77
-rw-r--r--src/main/xml.c429
-rw-r--r--src/printdef/Makefile.in447
-rw-r--r--src/printdef/printdef.h103
-rw-r--r--src/printdef/printdefl.c1762
-rw-r--r--src/printdef/printdefl.l93
-rw-r--r--src/printdef/printdefy.c1089
-rw-r--r--src/printdef/printdefy.h27
-rw-r--r--src/printdef/printdefy.y218
-rw-r--r--src/testpattern/Makefile.am42
-rw-r--r--src/testpattern/Makefile.in940
-rw-r--r--src/testpattern/extended.sample117
-rw-r--r--src/testpattern/printers.c44
-rwxr-xr-xsrc/testpattern/run-testpattern169
-rwxr-xr-xsrc/testpattern/run-testpattern-1286
-rw-r--r--src/testpattern/testpattern.c1087
-rw-r--r--src/testpattern/testpattern.h78
-rw-r--r--src/testpattern/testpattern.sample153
-rw-r--r--src/testpattern/testpatternl.c1925
-rw-r--r--src/testpattern/testpatternl.l114
-rw-r--r--src/testpattern/testpatterny.c2481
-rw-r--r--src/testpattern/testpatterny.h163
-rw-r--r--src/testpattern/testpatterny.y593
216 files changed, 103760 insertions, 62086 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index f969b88..4a312ad 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,4 +1,4 @@
-## $Id: Makefile.am,v 1.7.4.1 2002/02/15 02:01:28 rlk Exp $
+## $Id: Makefile.am,v 1.18 2004/09/17 18:38:09 rleigh Exp $
## Copyright (C) 2000 Roger Leigh
##
## This program is free software; you can redistribute it and/or modify
@@ -23,10 +23,21 @@ AUTOMAKE_OPTIONS = 1.4 gnu
MAINT_CHARSET = latin1
-NONGIMP_SUBDIRS =
-## @-@-@-@-@ NO-GIMP @-@-@-@-@
-NONGIMP_SUBDIRS = cups foomatic ghost testpattern
-## @-@-@-@-@ YES-GIMP @-@-@-@-@
-SUBDIRS = printdef main escputil gimp $(NONGIMP_SUBDIRS)
+include $(top_srcdir)/scripts/global.mk
+
+SUBDIRS = \
+ main \
+ gutenprintui \
+ gutenprintui2 \
+ escputil \
+ gimp \
+ gimp2 \
+ cups \
+ foomatic \
+ ghost \
+ testpattern
+
+
+## Clean
MAINTAINERCLEANFILES = Makefile.in
diff --git a/src/Makefile.in b/src/Makefile.in
index e61fee0..44b9ba4 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1,6 +1,8 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
-# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -10,210 +12,366 @@
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
+@SET_MAKE@
-SHELL = @SHELL@
-
+# Variables
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-
-DESTDIR =
-
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
-
top_builddir = ..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-transform = @program_transform_name@
-
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
-host_alias = @host_alias@
+build_triplet = @build@
host_triplet = @host@
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(top_srcdir)/scripts/global.mk
+subdir = src
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gimp.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/stp.m4 $(top_srcdir)/m4/stp_cups.m4 \
+ $(top_srcdir)/m4/stp_gimp.m4 $(top_srcdir)/m4/stp_option.m4 \
+ $(top_srcdir)/m4/stp_release.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
-AS = @AS@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
-BISON_PROG = @BISON_PROG@
-BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
-CATALOGS = @CATALOGS@
-CATOBJEXT = @CATOBJEXT@
+BUILD_CUPS_FALSE = @BUILD_CUPS_FALSE@
+BUILD_CUPS_PPDS_FALSE = @BUILD_CUPS_PPDS_FALSE@
+BUILD_CUPS_PPDS_TRUE = @BUILD_CUPS_PPDS_TRUE@
+BUILD_CUPS_TRUE = @BUILD_CUPS_TRUE@
+BUILD_ESCPUTIL_FALSE = @BUILD_ESCPUTIL_FALSE@
+BUILD_ESCPUTIL_TRUE = @BUILD_ESCPUTIL_TRUE@
+BUILD_FOOMATIC_3_FALSE = @BUILD_FOOMATIC_3_FALSE@
+BUILD_FOOMATIC_3_TRUE = @BUILD_FOOMATIC_3_TRUE@
+BUILD_FOOMATIC_FALSE = @BUILD_FOOMATIC_FALSE@
+BUILD_FOOMATIC_TRUE = @BUILD_FOOMATIC_TRUE@
+BUILD_GENPPD_STATIC_FALSE = @BUILD_GENPPD_STATIC_FALSE@
+BUILD_GENPPD_STATIC_TRUE = @BUILD_GENPPD_STATIC_TRUE@
+BUILD_GHOSTSCRIPT_FALSE = @BUILD_GHOSTSCRIPT_FALSE@
+BUILD_GHOSTSCRIPT_TRUE = @BUILD_GHOSTSCRIPT_TRUE@
+BUILD_GIMP2_FALSE = @BUILD_GIMP2_FALSE@
+BUILD_GIMP2_TRUE = @BUILD_GIMP2_TRUE@
+BUILD_GIMP_FALSE = @BUILD_GIMP_FALSE@
+BUILD_GIMP_TRUE = @BUILD_GIMP_TRUE@
+BUILD_LIBGUTENPRINTUI2_FALSE = @BUILD_LIBGUTENPRINTUI2_FALSE@
+BUILD_LIBGUTENPRINTUI2_TRUE = @BUILD_LIBGUTENPRINTUI2_TRUE@
+BUILD_LIBGUTENPRINTUI_FALSE = @BUILD_LIBGUTENPRINTUI_FALSE@
+BUILD_LIBGUTENPRINTUI_TRUE = @BUILD_LIBGUTENPRINTUI_TRUE@
+BUILD_MODULES_FALSE = @BUILD_MODULES_FALSE@
+BUILD_MODULES_TRUE = @BUILD_MODULES_TRUE@
+BUILD_TESTPATTERN_FALSE = @BUILD_TESTPATTERN_FALSE@
+BUILD_TESTPATTERN_TRUE = @BUILD_TESTPATTERN_TRUE@
+BUILD_TEST_FALSE = @BUILD_TEST_FALSE@
+BUILD_TEST_TRUE = @BUILD_TEST_TRUE@
+BUILD_TRANSLATED_CUPS_PPDS_FALSE = @BUILD_TRANSLATED_CUPS_PPDS_FALSE@
+BUILD_TRANSLATED_CUPS_PPDS_TRUE = @BUILD_TRANSLATED_CUPS_PPDS_TRUE@
CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
CONVERT = @CONVERT@
-CUPS_BACKEND_BIN = @CUPS_BACKEND_BIN@
-CUPS_BIN = @CUPS_BIN@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
CUPS_CFLAGS = @CUPS_CFLAGS@
-CUPS_CONF = @CUPS_CONF@
CUPS_CONFIG = @CUPS_CONFIG@
-CUPS_FILTER_BIN = @CUPS_FILTER_BIN@
-CUPS_INSTALL = @CUPS_INSTALL@
CUPS_LIBS = @CUPS_LIBS@
-CUPS_MAN = @CUPS_MAN@
-CUPS_NOINST_BIN = @CUPS_NOINST_BIN@
-CUPS_PKG = @CUPS_PKG@
+CUPS_PPDS_AT_TOP_LEVEL_FALSE = @CUPS_PPDS_AT_TOP_LEVEL_FALSE@
+CUPS_PPDS_AT_TOP_LEVEL_TRUE = @CUPS_PPDS_AT_TOP_LEVEL_TRUE@
CUPS_PPD_PS_LEVEL = @CUPS_PPD_PS_LEVEL@
-DATADIRNAME = @DATADIRNAME@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
DB2HTML = @DB2HTML@
DB2PDF = @DB2PDF@
DB2PS = @DB2PS@
-DLLTOOL = @DLLTOOL@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIALOG = @DIALOG@
+DOXYGEN = @DOXYGEN@
DVIPDF = @DVIPDF@
DVIPS = @DVIPS@
ECHO = @ECHO@
-ESCPUTIL_BIN = @ESCPUTIL_BIN@
-ESCPUTIL_MAN = @ESCPUTIL_MAN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
EXEEXT = @EXEEXT@
-FOOMATIC_3_NOINST_BIN = @FOOMATIC_3_NOINST_BIN@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+FIND = @FIND@
FOOMATIC_CONFIGURE = @FOOMATIC_CONFIGURE@
-FOOMATIC_INSTALL = @FOOMATIC_INSTALL@
FOOMATIC_KITLOAD = @FOOMATIC_KITLOAD@
-FOOMATIC_NOINST_BIN = @FOOMATIC_NOINST_BIN@
-FOOMATIC_OLDIDS_NOINST_BIN = @FOOMATIC_OLDIDS_NOINST_BIN@
FOOMATIC_PPDFILE = @FOOMATIC_PPDFILE@
-GENCAT = @GENCAT@
-GIMPPRINT_BINARY_AGE = @GIMPPRINT_BINARY_AGE@
-GIMPPRINT_CFLAGS = @GIMPPRINT_CFLAGS@
-GIMPPRINT_CURRENT_INTERFACE = @GIMPPRINT_CURRENT_INTERFACE@
-GIMPPRINT_DEPLIBS = @GIMPPRINT_DEPLIBS@
-GIMPPRINT_INTERFACE_AGE = @GIMPPRINT_INTERFACE_AGE@
-GIMPPRINT_LIBS = @GIMPPRINT_LIBS@
-GIMPPRINT_MAJOR_VERSION = @GIMPPRINT_MAJOR_VERSION@
-GIMPPRINT_MICRO_VERSION = @GIMPPRINT_MICRO_VERSION@
-GIMPPRINT_MINOR_VERSION = @GIMPPRINT_MINOR_VERSION@
-GIMPPRINT_VERSION = @GIMPPRINT_VERSION@
+GENPPD_LIBS = @GENPPD_LIBS@
+GIMP2_CFLAGS = @GIMP2_CFLAGS@
+GIMP2_LIBS = @GIMP2_LIBS@
GIMPTOOL = @GIMPTOOL@
+GIMPTOOL2_CHECK = @GIMPTOOL2_CHECK@
GIMPTOOL_CHECK = @GIMPTOOL_CHECK@
-GIMP_BIN = @GIMP_BIN@
GIMP_CFLAGS = @GIMP_CFLAGS@
GIMP_CFLAGS_NOUI = @GIMP_CFLAGS_NOUI@
GIMP_DATA_DIR = @GIMP_DATA_DIR@
GIMP_LIBS = @GIMP_LIBS@
GIMP_LIBS_NOUI = @GIMP_LIBS_NOUI@
GIMP_PLUGIN_DIR = @GIMP_PLUGIN_DIR@
-GLIBC21 = @GLIBC21@
-GMOFILES = @GMOFILES@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_CONFIG = @GLIB_CONFIG@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
GMSGFMT = @GMSGFMT@
GNUCFLAGS = @GNUCFLAGS@
-IJS_BIN = @IJS_BIN@
+GTK2_CFLAGS = @GTK2_CFLAGS@
+GTK2_LIBS = @GTK2_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+GUTENPRINTUI2_BINARY_AGE = @GUTENPRINTUI2_BINARY_AGE@
+GUTENPRINTUI2_CFLAGS = @GUTENPRINTUI2_CFLAGS@
+GUTENPRINTUI2_CURRENT_INTERFACE = @GUTENPRINTUI2_CURRENT_INTERFACE@
+GUTENPRINTUI2_INTERFACE_AGE = @GUTENPRINTUI2_INTERFACE_AGE@
+GUTENPRINTUI2_LIBDEPS = @GUTENPRINTUI2_LIBDEPS@
+GUTENPRINTUI2_LIBS = $(top_builddir)/src/gutenprintui2/libgutenprintui2.la
+GUTENPRINTUI2_VERSION = @GUTENPRINTUI2_VERSION@
+GUTENPRINTUI_BINARY_AGE = @GUTENPRINTUI_BINARY_AGE@
+GUTENPRINTUI_CFLAGS = @GUTENPRINTUI_CFLAGS@
+GUTENPRINTUI_CURRENT_INTERFACE = @GUTENPRINTUI_CURRENT_INTERFACE@
+GUTENPRINTUI_INTERFACE_AGE = @GUTENPRINTUI_INTERFACE_AGE@
+GUTENPRINTUI_LIBDEPS = @GUTENPRINTUI_LIBDEPS@
+GUTENPRINTUI_LIBS = $(top_builddir)/src/gutenprintui/libgutenprintui.la
+GUTENPRINTUI_VERSION = @GUTENPRINTUI_VERSION@
+GUTENPRINT_BINARY_AGE = @GUTENPRINT_BINARY_AGE@
+GUTENPRINT_CFLAGS = @GUTENPRINT_CFLAGS@
+GUTENPRINT_CURRENT_INTERFACE = @GUTENPRINT_CURRENT_INTERFACE@
+GUTENPRINT_INTERFACE_AGE = @GUTENPRINT_INTERFACE_AGE@
+GUTENPRINT_LIBDEPS = @GUTENPRINT_LIBDEPS@
+
+# Libraries
+GUTENPRINT_LIBS = $(top_builddir)/src/main/libgutenprint.la
+GUTENPRINT_MAJOR_VERSION = @GUTENPRINT_MAJOR_VERSION@
+GUTENPRINT_MICRO_VERSION = @GUTENPRINT_MICRO_VERSION@
+GUTENPRINT_MINOR_VERSION = @GUTENPRINT_MINOR_VERSION@
+GUTENPRINT_VERSION = @GUTENPRINT_VERSION@
IJS_CFLAGS = @IJS_CFLAGS@
IJS_CONFIG = @IJS_CONFIG@
-IJS_INSTALL = @IJS_INSTALL@
IJS_LIBS = @IJS_LIBS@
-INCLUDES = @INCLUDES@
-INSTOBJEXT = @INSTOBJEXT@
-INTLBISON = @INTLBISON@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SAMPLES_FALSE = @INSTALL_SAMPLES_FALSE@
+INSTALL_SAMPLES_TRUE = @INSTALL_SAMPLES_TRUE@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_USER_GUIDE_FALSE = @INSTALL_USER_GUIDE_FALSE@
+INSTALL_USER_GUIDE_TRUE = @INSTALL_USER_GUIDE_TRUE@
INTLLIBS = @INTLLIBS@
-INTLOBJS = @INTLOBJS@
-INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDFLAGS = @LDFLAGS@
LEX = @LEX@
-LIBGIMPPRINT_LIBS = @LIBGIMPPRINT_LIBS@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
LIBICONV = @LIBICONV@
-LIBM = @LIBM@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
LIBREADLINE_DEPS = @LIBREADLINE_DEPS@
+LIBS = $(INTLLIBS) @LIBS@
LIBTOOL = @LIBTOOL@
LIBTOOL_DEPS = @LIBTOOL_DEPS@
LN_S = @LN_S@
LTALLOCA = @LTALLOCA@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
-LT_AGE = @LT_AGE@
-LT_CURRENT = @LT_CURRENT@
-LT_RELEASE = @LT_RELEASE@
-LT_REVISION = @LT_REVISION@
MAINT = @MAINT@
MAINTAINER_CFLAGS = @MAINTAINER_CFLAGS@
-MAIN_BIN = @MAIN_BIN@
-MAIN_DAT = @MAIN_DAT@
-MAIN_MAN = @MAIN_MAN@
-MAIN_SCR = @MAIN_SCR@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
MKINSTALLDIRS = @MKINSTALLDIRS@
MSGFMT = @MSGFMT@
-OBJDUMP = @OBJDUMP@
+MSGMERGE = @MSGMERGE@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
PLUG_IN_PATH = @PLUG_IN_PATH@
-POFILES = @POFILES@
POSUB = @POSUB@
-PRINT_VASPRINTF = @PRINT_VASPRINTF@
RANLIB = @RANLIB@
RELEASE_DATE = @RELEASE_DATE@
RM = @RM@
-SAMPLE_IMAGES = @SAMPLE_IMAGES@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
STRIP = @STRIP@
-TESTPATTERN_BIN = @TESTPATTERN_BIN@
-TEST_BIN = @TEST_BIN@
TEXI2HTML = @TEXI2HTML@
-USER_GUIDE = @USER_GUIDE@
-USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_LEVEL3_PS_FALSE = @USE_LEVEL3_PS_FALSE@
+USE_LEVEL3_PS_TRUE = @USE_LEVEL3_PS_TRUE@
USE_NLS = @USE_NLS@
+USE_NLS_FALSE = @USE_NLS_FALSE@
+USE_NLS_TRUE = @USE_NLS_TRUE@
VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
YACC = @YACC@
-YACC_PROG = @YACC_PROG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
cups_bindir = @cups_bindir@
cups_conf_datadir = @cups_conf_datadir@
cups_conf_serverbin = @cups_conf_serverbin@
cups_conf_serverroot = @cups_conf_serverroot@
cups_exec_prefix = @cups_exec_prefix@
cups_prefix = @cups_prefix@
+cups_sbindir = @cups_sbindir@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+gimp2_plug_indir = @gimp2_plug_indir@
gimp_plug_indir = @gimp_plug_indir@
-gimpprint_cflags = @gimpprint_cflags@
-gimpprint_libs = @gimpprint_libs@
-
+gutenprint_cflags = @gutenprint_cflags@
+gutenprint_libs = @gutenprint_libs@
+gutenprintui2_cflags = @gutenprintui2_cflags@
+gutenprintui2_libs = @gutenprintui2_libs@
+gutenprintui_cflags = @gutenprintui_cflags@
+gutenprintui_libs = @gutenprintui_libs@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
AUTOMAKE_OPTIONS = 1.4 gnu
-
MAINT_CHARSET = latin1
-NONGIMP_SUBDIRS = cups foomatic ghost testpattern
-SUBDIRS = printdef main escputil gimp $(NONGIMP_SUBDIRS)
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(LOCAL_CPPFLAGS) $(GNUCFLAGS)
+SUBDIRS = \
+ main \
+ gutenprintui \
+ gutenprintui2 \
+ escputil \
+ gimp \
+ gimp2 \
+ cups \
+ foomatic \
+ ghost \
+ testpattern
MAINTAINERCLEANFILES = Makefile.in
-mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
-CONFIG_HEADER = ../config.h
-CONFIG_CLEAN_FILES =
-DIST_COMMON = Makefile.am Makefile.in
-
+all: all-recursive
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = tar
-GZIP_ENV = --best
-all: all-redirect
.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/Makefile
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/scripts/global.mk $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
# This directory's subdirectories are mostly independent; you can cd
# into them and run `make' without going through this Makefile.
@@ -221,13 +379,14 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
# (1) if the variable is set in `config.status', edit `config.status'
# (which will cause the Makefiles to be regenerated when you run `make');
# (2) otherwise, pass the desired values on the `make' command line.
-
-@SET_MAKE@
-
-all-recursive install-data-recursive install-exec-recursive \
-installdirs-recursive install-recursive uninstall-recursive \
-check-recursive installcheck-recursive info-recursive dvi-recursive:
- @set fnord $(MAKEFLAGS); amf=$$2; \
+$(RECURSIVE_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
dot_seen=no; \
target=`echo $@ | sed s/-recursive//`; \
list='$(SUBDIRS)'; for subdir in $$list; do \
@@ -239,7 +398,7 @@ check-recursive installcheck-recursive info-recursive dvi-recursive:
local_target="$$target"; \
fi; \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ || eval $$failcom; \
done; \
if test "$$dot_seen" = "no"; then \
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
@@ -247,13 +406,24 @@ check-recursive installcheck-recursive info-recursive dvi-recursive:
mostlyclean-recursive clean-recursive distclean-recursive \
maintainer-clean-recursive:
- @set fnord $(MAKEFLAGS); amf=$$2; \
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
dot_seen=no; \
- rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
- rev="$$subdir $$rev"; \
- test "$$subdir" = "." && dot_seen=yes; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
done; \
- test "$$dot_seen" = "no" && rev=". $$rev"; \
+ rev="$$rev ."; \
target=`echo $@ | sed s/-recursive//`; \
for subdir in $$rev; do \
echo "Making $$target in $$subdir"; \
@@ -263,145 +433,232 @@ maintainer-clean-recursive:
local_target="$$target"; \
fi; \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ || eval $$failcom; \
done && test -z "$$fail"
tags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
- here=`pwd` && cd $(srcdir) \
- && mkid -f$$here/ID $$unique $(LISP)
+ mkid -fID $$unique
+tags: TAGS
-TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
list='$(SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
- fi; \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
done; \
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
- || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
-
-mostlyclean-tags:
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
-clean-tags:
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
- -rm -f TAGS ID
-
-maintainer-clean-tags:
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-
-subdir = src
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
- @for file in $(DISTFILES); do \
- d=$(srcdir); \
+ $(mkdir_p) $(distdir)/../scripts
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
- || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $$d/$$file $(distdir)/$$file || :; \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
fi; \
done
- for subdir in $(SUBDIRS); do \
+ list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
- test -d $(distdir)/$$subdir \
- || mkdir $(distdir)/$$subdir \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
|| exit 1; \
- chmod 777 $(distdir)/$$subdir; \
- (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ distdir) \
|| exit 1; \
fi; \
done
-info-am:
-info: info-recursive
-dvi-am:
-dvi: dvi-recursive
check-am: all-am
check: check-recursive
-installcheck-am:
-installcheck: installcheck-recursive
-install-exec-am:
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
install-exec: install-exec-recursive
-
-install-data-am:
install-data: install-data-recursive
+uninstall: uninstall-recursive
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-recursive
-uninstall-am:
-uninstall: uninstall-recursive
-all-am: Makefile
-all-redirect: all-recursive
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs: installdirs-recursive
-installdirs-am:
-
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
- -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-mostlyclean-am: mostlyclean-tags mostlyclean-generic
+clean: clean-recursive
-mostlyclean: mostlyclean-recursive
+clean-am: clean-generic clean-libtool mostlyclean-am
-clean-am: clean-tags clean-generic mostlyclean-am
+distclean: distclean-recursive
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool \
+ distclean-tags
-clean: clean-recursive
+dvi: dvi-recursive
-distclean-am: distclean-tags distclean-generic clean-am
- -rm -f libtool
+dvi-am:
-distclean: distclean-recursive
+html: html-recursive
-maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \
- distclean-am
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
maintainer-clean: maintainer-clean-recursive
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
-.PHONY: install-data-recursive uninstall-data-recursive \
-install-exec-recursive uninstall-exec-recursive installdirs-recursive \
-uninstalldirs-recursive all-recursive check-recursive \
-installcheck-recursive info-recursive dvi-recursive \
-mostlyclean-recursive distclean-recursive clean-recursive \
-maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
-distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
-dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
-install-exec install-data-am install-data install-am install \
-uninstall-am uninstall all-redirect all-am all installdirs-am \
-installdirs mostlyclean-generic distclean-generic clean-generic \
-maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+ clean clean-generic clean-libtool clean-recursive ctags \
+ ctags-recursive distclean distclean-generic distclean-libtool \
+ distclean-recursive distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic maintainer-clean-recursive \
+ mostlyclean mostlyclean-generic mostlyclean-libtool \
+ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
+ uninstall uninstall-am uninstall-info-am
@SET_MAKE@
+export STP_MODULE_PATH = $(top_builddir)/src/main/.libs:$(top_builddir)/src/main
+export STP_DATA_PATH = $(top_srcdir)/src/main
+
+# Rules
+
+$(top_builddir)/src/main/libgutenprint.la:
+ cd $(top_builddir)/src/main; \
+ $(MAKE)
+
+$(top_builddir)/src/gutenprintui/libgutenprintui.la:
+ cd $(top_builddir)/src/gutenprintui; \
+ $(MAKE)
+
+$(top_builddir)/src/gutenprintui2/libgutenprintui2.la:
+ cd $(top_builddir)/src/gutenprintui2; \
+ $(MAKE)
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
diff --git a/src/cups/Makefile.am b/src/cups/Makefile.am
index 6b1d861..1448f15 100644
--- a/src/cups/Makefile.am
+++ b/src/cups/Makefile.am
@@ -1,4 +1,4 @@
-## $Id: Makefile.am,v 1.45.2.12 2003/12/24 12:40:47 rlk Exp $
+## $Id: Makefile.am,v 1.81 2005/02/03 22:00:30 rleigh Exp $
## Copyright (C) 2000 Roger Leigh
##
## This program is free software; you can redistribute it and/or modify
@@ -23,12 +23,16 @@ AUTOMAKE_OPTIONS = 1.4 gnu
MAINT_CHARSET = latin1
+include $(top_srcdir)/scripts/global.mk
+
## Variables
+empty=
PACKAGE = cups
bindir = @cups_bindir@
+sbindir = @cups_sbindir@
pkgdatadir = $(cups_conf_datadir)
pkglibdir = $(cups_conf_serverbin)
@@ -36,70 +40,72 @@ 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)
-LIBPRINTUT = $(top_builddir)/lib/libprintut.la
-LIBS = $(INTLLIBS) @LIBS@
-
-if BUILD_GENPPD_STATIC
-STATIC_LDOPTS=-static
+if CUPS_PPDS_AT_TOP_LEVEL
+cups_modeldir = $(pkgdatadir)/model/
+DONT_UNINSTALL_PPDS=true
+else
+cups_modeldir = $(pkgdatadir)/model/gutenprint/@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@/
endif
-## Programs
+LOCAL_CPPFLAGS = $(GUTENPRINT_CFLAGS) $(CUPS_CFLAGS)
-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@
+## Programs
-EXTRA_PROGRAMS = cups-calibrate commandtoepson epson genppd rastertoprinter commandtocanon canon
+if BUILD_CUPS
+bin_PROGRAMS = cups-calibrate
+sbin_PROGRAMS = cups-genppd.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@
+sbin_SCRIPTS = cups-genppdconfig.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@ cups-genppdupdate.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@
+cupsexec_backend_PROGRAMS = epson canon
+cupsexec_filter_PROGRAMS = rastertogutenprint.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@ commandtoepson commandtocanon
+endif
-CUPS_LIBS = @CUPS_LIBS@
+if BUILD_GENPPD_STATIC
+STATIC_LDOPTS=-static -export-dynamic
+endif
cups_calibrate_SOURCES = cups-calibrate.c
-cups_calibrate_LDADD = $(LIBPRINTUT) $(LIBM)
+cups_calibrate_LDADD = -lm
commandtoepson_SOURCES = commandtoepson.c
-commandtoepson_LDADD = $(LIBPRINTUT) $(CUPS_LIBS)
+commandtoepson_LDADD = $(CUPS_LIBS)
canon_SOURCES = canon.c
-canon_LDADD = $(LIBPRINTUT) $(CUPS_LIBS)
+canon_LDADD = $(CUPS_LIBS)
epson_SOURCES = epson.c
-epson_LDADD = $(LIBPRINTUT) $(CUPS_LIBS)
+epson_LDADD = $(CUPS_LIBS)
-genppd_SOURCES = genppd.c
-genppd_LDADD = $(LIBPRINTUT) $(CUPS_LIBS) $(LIBGIMPPRINT_LIBS)
-genppd_LDFLAGS= $(STATIC_LDOPTS)
-genppd_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
+cups_genppd_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_SOURCES = genppd.c
+cups_genppd_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_LDADD = $(CUPS_LIBS) $(GENPPD_LIBS) $(GUTENPRINT_LIBS)
+cups_genppd_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_LDFLAGS = $(STATIC_LDOPTS)
-rastertoprinter_SOURCES = rastertoprinter.c
-rastertoprinter_LDADD = $(LIBPRINTUT) $(CUPS_LIBS) $(LIBGIMPPRINT_LIBS)
-rastertoprinter_LDFLAGS= $(STATIC_LDOPTS)
-rastertoprinter_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
+rastertogutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_SOURCES = rastertoprinter.c
+rastertogutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_LDADD = $(CUPS_LIBS) $(GUTENPRINT_LIBS)
+rastertogutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_LDFLAGS = $(STATIC_LDOPTS)
+cups-genppdconfig.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@: $(top_builddir)/config.status cups-genppdconfig.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/cups-genppdconfig
+cups-genppdupdate.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@: $(top_builddir)/config.status cups-genppdupdate.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/cups-genppdupdate
## Data
+if BUILD_CUPS
CUPS_PKG = calibrate.ppm
+endif
+if BUILD_CUPS
CUPS_CONF = command.types
+endif
-pkgdata_DATA = @CUPS_PKG@
-pkgsysconf_DATA = @CUPS_CONF@
+pkgdata_DATA = $(CUPS_PKG)
+pkgsysconf_DATA = $(CUPS_CONF)
-if BUILD_CUPS
-INSTALL_DATA_LOCAL_DEPS = ppd
+if BUILD_CUPS_PPDS
+INSTALL_DATA_LOCAL_DEPS = ppd-stamp
endif
-if BUILD_TRANSLATED_PPDS
+if BUILD_TRANSLATED_CUPS_PPDS
PPD_NLS = $(PPD_NLS_1)
LINGUAS = $(ALL_LINGUAS)
endif
@@ -108,6 +114,9 @@ if USE_NLS
PPD_NLS_1 = ppd-nls
endif
+
+## Rules
+
install-data-local: $(INSTALL_DATA_LOCAL_DEPS)
if test -n "$(INSTALL_DATA_LOCAL_DEPS)" ; then \
$(mkinstalldirs) $(DESTDIR)$(cups_modeldir); \
@@ -124,35 +133,13 @@ install-data-local: $(INSTALL_DATA_LOCAL_DEPS)
fi
uninstall-local: $(INSTALL_DATA_LOCAL_DEPS)
- if test -n "$(INSTALL_DATA_LOCAL_DEPS)" ; then \
- for language in C $(LINGUAS) ; do \
- echo "Removing $$language locale PPD files..." ; \
- for ppdfile in ppd/$$language/* ; do \
- if test -f "$(DESTDIR)$(cups_modeldir)/$$language/`basename $$ppdfile`" ; then \
- $(RM) -f $(DESTDIR)$(cups_modeldir)/$$language/`basename $$ppdfile` ; \
- fi ; \
- done; \
- done \
+# Remove PPDs installed in new PPD location
+ if test -z "DONT_UNINSTALL_PPDS" ; then \
+ if test -n "$(INSTALL_DATA_LOCAL_DEPS)" ; then \
+ $(RM) -fr $(DESTDIR)$(cups_modeldir)/* ; \
+ fi \
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
-@echo 'Expect a number of "rmdir: Directory not empty" warnings'
@@ -168,16 +155,13 @@ install-data-hook:
-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
+ppd-stamp: cups-genppd.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@ $(top_srcdir)/src/main/printers.xml $(top_srcdir)/src/main/papers.xml
$(MAKE) ppd-stamp-phony
touch ppd-stamp
@@ -187,29 +171,25 @@ ppd-stamp-pre:
-$(RM) -r ppd
-mkdir ppd
-ppd-nonls: genppd
+ppd-nonls: cups-genppd.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@
for language in C ; do \
mkdir ppd/$$language ; \
echo "$$language:" ; \
- ./genppd --prefix=ppd/$$language ; \
+ LANGUAGE=$$language ./cups-genppd.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@ -p ppd/$$language ; \
done
-ppd-nls: genppd
+ppd-nls: cups-genppd.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@
wdir=`pwd` ; \
cd $(top_builddir)/po ; \
$(MAKE) ; \
$(MAKE) DESTDIR= prefix=$${wdir}/catalog datadir=$${wdir}/catalog/share install
- for language in $(LINGUAS) ; do \
+ for language in `./cups-genppd.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@ -L -c \`pwd\`/catalog/share/locale` ; do \
mkdir ppd/$$language ; \
echo "$$language:" ; \
- LANGUAGE=$$language ./genppd --prefix=ppd/$$language --catalog=`pwd`/catalog/share/locale ; \
+ LANGUAGE=$$language ./cups-genppd.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@ -p ppd/$$language -c `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 \
@@ -228,7 +208,8 @@ clean-local:
## Clean
-CLEANFILES = $(EXTRA_PROGRAMS) ppd-stamp
+CLEANFILES = ppd-stamp
+DISTCLEANFILES = cups-genppdconfig.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@ cups-genppdupdate.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@
MAINTAINERCLEANFILES = Makefile.in
EXTRA_DIST = \
diff --git a/src/cups/Makefile.in b/src/cups/Makefile.in
index edffedf..cba2fe5 100644
--- a/src/cups/Makefile.in
+++ b/src/cups/Makefile.in
@@ -1,6 +1,8 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
-# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -10,424 +12,652 @@
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
+@SET_MAKE@
-SHELL = @SHELL@
+# Variables
+
+
+
+SOURCES = $(canon_SOURCES) commandtocanon.c $(commandtoepson_SOURCES) $(cups_calibrate_SOURCES) $(cups_genppd_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_SOURCES) $(epson_SOURCES) $(rastertogutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_SOURCES)
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-
-DESTDIR =
pkgincludedir = $(includedir)/@PACKAGE@
-
top_builddir = ../..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-transform = @program_transform_name@
-
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
-host_alias = @host_alias@
+build_triplet = @build@
host_triplet = @host@
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(srcdir)/cups-genppdconfig.in $(srcdir)/cups-genppdupdate.in \
+ $(top_srcdir)/scripts/global.mk COPYING
+@BUILD_CUPS_TRUE@bin_PROGRAMS = cups-calibrate$(EXEEXT)
+@BUILD_CUPS_TRUE@sbin_PROGRAMS = cups-genppd.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@$(EXEEXT)
+@BUILD_CUPS_TRUE@cupsexec_backend_PROGRAMS = epson$(EXEEXT) \
+@BUILD_CUPS_TRUE@ canon$(EXEEXT)
+@BUILD_CUPS_TRUE@cupsexec_filter_PROGRAMS = rastertogutenprint.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@$(EXEEXT) \
+@BUILD_CUPS_TRUE@ commandtoepson$(EXEEXT) \
+@BUILD_CUPS_TRUE@ commandtocanon$(EXEEXT)
+subdir = src/cups
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gimp.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/stp.m4 $(top_srcdir)/m4/stp_cups.m4 \
+ $(top_srcdir)/m4/stp_gimp.m4 $(top_srcdir)/m4/stp_option.m4 \
+ $(top_srcdir)/m4/stp_release.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = cups-genppdconfig cups-genppdupdate
+am__installdirs = "$(DESTDIR)$(bindir)" \
+ "$(DESTDIR)$(cupsexec_backenddir)" \
+ "$(DESTDIR)$(cupsexec_filterdir)" "$(DESTDIR)$(sbindir)" \
+ "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(pkgdatadir)" \
+ "$(DESTDIR)$(pkgsysconfdir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+cupsexec_backendPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+cupsexec_filterPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS) $(cupsexec_backend_PROGRAMS) \
+ $(cupsexec_filter_PROGRAMS) $(sbin_PROGRAMS)
+am_canon_OBJECTS = canon.$(OBJEXT)
+canon_OBJECTS = $(am_canon_OBJECTS)
+am__DEPENDENCIES_1 =
+canon_DEPENDENCIES = $(am__DEPENDENCIES_1)
+commandtocanon_SOURCES = commandtocanon.c
+commandtocanon_OBJECTS = commandtocanon.$(OBJEXT)
+commandtocanon_LDADD = $(LDADD)
+am_commandtoepson_OBJECTS = commandtoepson.$(OBJEXT)
+commandtoepson_OBJECTS = $(am_commandtoepson_OBJECTS)
+commandtoepson_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_cups_calibrate_OBJECTS = cups-calibrate.$(OBJEXT)
+cups_calibrate_OBJECTS = $(am_cups_calibrate_OBJECTS)
+cups_calibrate_DEPENDENCIES =
+am_cups_genppd_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_OBJECTS = \
+ genppd.$(OBJEXT)
+cups_genppd_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_OBJECTS = $(am_cups_genppd_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_OBJECTS)
+am__DEPENDENCIES_2 = $(top_builddir)/src/main/libgutenprint.la
+cups_genppd_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_DEPENDENCIES = \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2)
+am_epson_OBJECTS = epson.$(OBJEXT)
+epson_OBJECTS = $(am_epson_OBJECTS)
+epson_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_rastertogutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_OBJECTS = \
+ rastertoprinter.$(OBJEXT)
+rastertogutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_OBJECTS = $(am_rastertogutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_OBJECTS)
+rastertogutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_DEPENDENCIES = \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+sbinSCRIPT_INSTALL = $(INSTALL_SCRIPT)
+SCRIPTS = $(sbin_SCRIPTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(canon_SOURCES) commandtocanon.c $(commandtoepson_SOURCES) \
+ $(cups_calibrate_SOURCES) \
+ $(cups_genppd_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_SOURCES) \
+ $(epson_SOURCES) \
+ $(rastertogutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_SOURCES)
+DIST_SOURCES = $(canon_SOURCES) commandtocanon.c \
+ $(commandtoepson_SOURCES) $(cups_calibrate_SOURCES) \
+ $(cups_genppd_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_SOURCES) \
+ $(epson_SOURCES) \
+ $(rastertogutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+pkgdataDATA_INSTALL = $(INSTALL_DATA)
+pkgsysconfDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkgdata_DATA) $(pkgsysconf_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+pkgdatadir = $(cups_conf_datadir)
+pkglibdir = $(cups_conf_serverbin)
+ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
-AS = @AS@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
-BISON_PROG = @BISON_PROG@
-BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
-CATALOGS = @CATALOGS@
-CATOBJEXT = @CATOBJEXT@
+BUILD_CUPS_FALSE = @BUILD_CUPS_FALSE@
+BUILD_CUPS_PPDS_FALSE = @BUILD_CUPS_PPDS_FALSE@
+BUILD_CUPS_PPDS_TRUE = @BUILD_CUPS_PPDS_TRUE@
+BUILD_CUPS_TRUE = @BUILD_CUPS_TRUE@
+BUILD_ESCPUTIL_FALSE = @BUILD_ESCPUTIL_FALSE@
+BUILD_ESCPUTIL_TRUE = @BUILD_ESCPUTIL_TRUE@
+BUILD_FOOMATIC_3_FALSE = @BUILD_FOOMATIC_3_FALSE@
+BUILD_FOOMATIC_3_TRUE = @BUILD_FOOMATIC_3_TRUE@
+BUILD_FOOMATIC_FALSE = @BUILD_FOOMATIC_FALSE@
+BUILD_FOOMATIC_TRUE = @BUILD_FOOMATIC_TRUE@
+BUILD_GENPPD_STATIC_FALSE = @BUILD_GENPPD_STATIC_FALSE@
+BUILD_GENPPD_STATIC_TRUE = @BUILD_GENPPD_STATIC_TRUE@
+BUILD_GHOSTSCRIPT_FALSE = @BUILD_GHOSTSCRIPT_FALSE@
+BUILD_GHOSTSCRIPT_TRUE = @BUILD_GHOSTSCRIPT_TRUE@
+BUILD_GIMP2_FALSE = @BUILD_GIMP2_FALSE@
+BUILD_GIMP2_TRUE = @BUILD_GIMP2_TRUE@
+BUILD_GIMP_FALSE = @BUILD_GIMP_FALSE@
+BUILD_GIMP_TRUE = @BUILD_GIMP_TRUE@
+BUILD_LIBGUTENPRINTUI2_FALSE = @BUILD_LIBGUTENPRINTUI2_FALSE@
+BUILD_LIBGUTENPRINTUI2_TRUE = @BUILD_LIBGUTENPRINTUI2_TRUE@
+BUILD_LIBGUTENPRINTUI_FALSE = @BUILD_LIBGUTENPRINTUI_FALSE@
+BUILD_LIBGUTENPRINTUI_TRUE = @BUILD_LIBGUTENPRINTUI_TRUE@
+BUILD_MODULES_FALSE = @BUILD_MODULES_FALSE@
+BUILD_MODULES_TRUE = @BUILD_MODULES_TRUE@
+BUILD_TESTPATTERN_FALSE = @BUILD_TESTPATTERN_FALSE@
+BUILD_TESTPATTERN_TRUE = @BUILD_TESTPATTERN_TRUE@
+BUILD_TEST_FALSE = @BUILD_TEST_FALSE@
+BUILD_TEST_TRUE = @BUILD_TEST_TRUE@
+BUILD_TRANSLATED_CUPS_PPDS_FALSE = @BUILD_TRANSLATED_CUPS_PPDS_FALSE@
+BUILD_TRANSLATED_CUPS_PPDS_TRUE = @BUILD_TRANSLATED_CUPS_PPDS_TRUE@
CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
CUPS_CFLAGS = @CUPS_CFLAGS@
CUPS_CONFIG = @CUPS_CONFIG@
-CUPS_INSTALL = @CUPS_INSTALL@
-CUPS_MAN = @CUPS_MAN@
+CUPS_LIBS = @CUPS_LIBS@
+CUPS_PPDS_AT_TOP_LEVEL_FALSE = @CUPS_PPDS_AT_TOP_LEVEL_FALSE@
+CUPS_PPDS_AT_TOP_LEVEL_TRUE = @CUPS_PPDS_AT_TOP_LEVEL_TRUE@
CUPS_PPD_PS_LEVEL = @CUPS_PPD_PS_LEVEL@
-DATADIRNAME = @DATADIRNAME@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
DB2HTML = @DB2HTML@
DB2PDF = @DB2PDF@
DB2PS = @DB2PS@
-DLLTOOL = @DLLTOOL@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIALOG = @DIALOG@
+DOXYGEN = @DOXYGEN@
DVIPDF = @DVIPDF@
DVIPS = @DVIPS@
ECHO = @ECHO@
-ESCPUTIL_BIN = @ESCPUTIL_BIN@
-ESCPUTIL_MAN = @ESCPUTIL_MAN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
EXEEXT = @EXEEXT@
-FOOMATIC_3_NOINST_BIN = @FOOMATIC_3_NOINST_BIN@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+FIND = @FIND@
FOOMATIC_CONFIGURE = @FOOMATIC_CONFIGURE@
-FOOMATIC_INSTALL = @FOOMATIC_INSTALL@
FOOMATIC_KITLOAD = @FOOMATIC_KITLOAD@
-FOOMATIC_NOINST_BIN = @FOOMATIC_NOINST_BIN@
-FOOMATIC_OLDIDS_NOINST_BIN = @FOOMATIC_OLDIDS_NOINST_BIN@
FOOMATIC_PPDFILE = @FOOMATIC_PPDFILE@
-GENCAT = @GENCAT@
-GIMPPRINT_BINARY_AGE = @GIMPPRINT_BINARY_AGE@
-GIMPPRINT_CFLAGS = @GIMPPRINT_CFLAGS@
-GIMPPRINT_CURRENT_INTERFACE = @GIMPPRINT_CURRENT_INTERFACE@
-GIMPPRINT_DEPLIBS = @GIMPPRINT_DEPLIBS@
-GIMPPRINT_INTERFACE_AGE = @GIMPPRINT_INTERFACE_AGE@
-GIMPPRINT_LIBS = @GIMPPRINT_LIBS@
-GIMPPRINT_MAJOR_VERSION = @GIMPPRINT_MAJOR_VERSION@
-GIMPPRINT_MICRO_VERSION = @GIMPPRINT_MICRO_VERSION@
-GIMPPRINT_MINOR_VERSION = @GIMPPRINT_MINOR_VERSION@
-GIMPPRINT_VERSION = @GIMPPRINT_VERSION@
+GENPPD_LIBS = @GENPPD_LIBS@
+GIMP2_CFLAGS = @GIMP2_CFLAGS@
+GIMP2_LIBS = @GIMP2_LIBS@
GIMPTOOL = @GIMPTOOL@
+GIMPTOOL2_CHECK = @GIMPTOOL2_CHECK@
GIMPTOOL_CHECK = @GIMPTOOL_CHECK@
-GIMP_BIN = @GIMP_BIN@
GIMP_CFLAGS = @GIMP_CFLAGS@
GIMP_CFLAGS_NOUI = @GIMP_CFLAGS_NOUI@
GIMP_DATA_DIR = @GIMP_DATA_DIR@
GIMP_LIBS = @GIMP_LIBS@
GIMP_LIBS_NOUI = @GIMP_LIBS_NOUI@
GIMP_PLUGIN_DIR = @GIMP_PLUGIN_DIR@
-GLIBC21 = @GLIBC21@
-GMOFILES = @GMOFILES@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_CONFIG = @GLIB_CONFIG@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
GMSGFMT = @GMSGFMT@
GNUCFLAGS = @GNUCFLAGS@
-IJS_BIN = @IJS_BIN@
+GTK2_CFLAGS = @GTK2_CFLAGS@
+GTK2_LIBS = @GTK2_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+GUTENPRINTUI2_BINARY_AGE = @GUTENPRINTUI2_BINARY_AGE@
+GUTENPRINTUI2_CFLAGS = @GUTENPRINTUI2_CFLAGS@
+GUTENPRINTUI2_CURRENT_INTERFACE = @GUTENPRINTUI2_CURRENT_INTERFACE@
+GUTENPRINTUI2_INTERFACE_AGE = @GUTENPRINTUI2_INTERFACE_AGE@
+GUTENPRINTUI2_LIBDEPS = @GUTENPRINTUI2_LIBDEPS@
+GUTENPRINTUI2_LIBS = $(top_builddir)/src/gutenprintui2/libgutenprintui2.la
+GUTENPRINTUI2_VERSION = @GUTENPRINTUI2_VERSION@
+GUTENPRINTUI_BINARY_AGE = @GUTENPRINTUI_BINARY_AGE@
+GUTENPRINTUI_CFLAGS = @GUTENPRINTUI_CFLAGS@
+GUTENPRINTUI_CURRENT_INTERFACE = @GUTENPRINTUI_CURRENT_INTERFACE@
+GUTENPRINTUI_INTERFACE_AGE = @GUTENPRINTUI_INTERFACE_AGE@
+GUTENPRINTUI_LIBDEPS = @GUTENPRINTUI_LIBDEPS@
+GUTENPRINTUI_LIBS = $(top_builddir)/src/gutenprintui/libgutenprintui.la
+GUTENPRINTUI_VERSION = @GUTENPRINTUI_VERSION@
+GUTENPRINT_BINARY_AGE = @GUTENPRINT_BINARY_AGE@
+GUTENPRINT_CFLAGS = @GUTENPRINT_CFLAGS@
+GUTENPRINT_CURRENT_INTERFACE = @GUTENPRINT_CURRENT_INTERFACE@
+GUTENPRINT_INTERFACE_AGE = @GUTENPRINT_INTERFACE_AGE@
+GUTENPRINT_LIBDEPS = @GUTENPRINT_LIBDEPS@
+
+# Libraries
+GUTENPRINT_LIBS = $(top_builddir)/src/main/libgutenprint.la
+GUTENPRINT_MAJOR_VERSION = @GUTENPRINT_MAJOR_VERSION@
+GUTENPRINT_MICRO_VERSION = @GUTENPRINT_MICRO_VERSION@
+GUTENPRINT_MINOR_VERSION = @GUTENPRINT_MINOR_VERSION@
+GUTENPRINT_VERSION = @GUTENPRINT_VERSION@
IJS_CFLAGS = @IJS_CFLAGS@
IJS_CONFIG = @IJS_CONFIG@
-IJS_INSTALL = @IJS_INSTALL@
IJS_LIBS = @IJS_LIBS@
-INSTOBJEXT = @INSTOBJEXT@
-INTLBISON = @INTLBISON@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SAMPLES_FALSE = @INSTALL_SAMPLES_FALSE@
+INSTALL_SAMPLES_TRUE = @INSTALL_SAMPLES_TRUE@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_USER_GUIDE_FALSE = @INSTALL_USER_GUIDE_FALSE@
+INSTALL_USER_GUIDE_TRUE = @INSTALL_USER_GUIDE_TRUE@
INTLLIBS = @INTLLIBS@
-INTLOBJS = @INTLOBJS@
-INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDFLAGS = @LDFLAGS@
LEX = @LEX@
-LIBGIMPPRINT_LIBS = @LIBGIMPPRINT_LIBS@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
LIBICONV = @LIBICONV@
-LIBM = @LIBM@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
LIBREADLINE_DEPS = @LIBREADLINE_DEPS@
+LIBS = $(INTLLIBS) @LIBS@
LIBTOOL = @LIBTOOL@
LIBTOOL_DEPS = @LIBTOOL_DEPS@
LN_S = @LN_S@
LTALLOCA = @LTALLOCA@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
-LT_AGE = @LT_AGE@
-LT_CURRENT = @LT_CURRENT@
-LT_RELEASE = @LT_RELEASE@
-LT_REVISION = @LT_REVISION@
MAINT = @MAINT@
MAINTAINER_CFLAGS = @MAINTAINER_CFLAGS@
-MAIN_BIN = @MAIN_BIN@
-MAIN_DAT = @MAIN_DAT@
-MAIN_MAN = @MAIN_MAN@
-MAIN_SCR = @MAIN_SCR@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
MKINSTALLDIRS = @MKINSTALLDIRS@
MSGFMT = @MSGFMT@
-OBJDUMP = @OBJDUMP@
+MSGMERGE = @MSGMERGE@
OBJEXT = @OBJEXT@
+PACKAGE = cups
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
PLUG_IN_PATH = @PLUG_IN_PATH@
-POFILES = @POFILES@
POSUB = @POSUB@
-PRINT_VASPRINTF = @PRINT_VASPRINTF@
RANLIB = @RANLIB@
RELEASE_DATE = @RELEASE_DATE@
RM = @RM@
-SAMPLE_IMAGES = @SAMPLE_IMAGES@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
STRIP = @STRIP@
-TESTPATTERN_BIN = @TESTPATTERN_BIN@
-TEST_BIN = @TEST_BIN@
TEXI2HTML = @TEXI2HTML@
-USER_GUIDE = @USER_GUIDE@
-USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_LEVEL3_PS_FALSE = @USE_LEVEL3_PS_FALSE@
+USE_LEVEL3_PS_TRUE = @USE_LEVEL3_PS_TRUE@
USE_NLS = @USE_NLS@
+USE_NLS_FALSE = @USE_NLS_FALSE@
+USE_NLS_TRUE = @USE_NLS_TRUE@
VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
YACC = @YACC@
-YACC_PROG = @YACC_PROG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @cups_bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
cups_bindir = @cups_bindir@
cups_conf_datadir = @cups_conf_datadir@
cups_conf_serverbin = @cups_conf_serverbin@
cups_conf_serverroot = @cups_conf_serverroot@
cups_exec_prefix = @cups_exec_prefix@
cups_prefix = @cups_prefix@
+cups_sbindir = @cups_sbindir@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+gimp2_plug_indir = @gimp2_plug_indir@
gimp_plug_indir = @gimp_plug_indir@
-gimpprint_cflags = @gimpprint_cflags@
-gimpprint_libs = @gimpprint_libs@
-
+gutenprint_cflags = @gutenprint_cflags@
+gutenprint_libs = @gutenprint_libs@
+gutenprintui2_cflags = @gutenprintui2_cflags@
+gutenprintui2_libs = @gutenprintui2_libs@
+gutenprintui_cflags = @gutenprintui_cflags@
+gutenprintui_libs = @gutenprintui_libs@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @cups_sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
AUTOMAKE_OPTIONS = 1.4 gnu
-
MAINT_CHARSET = latin1
-
-PACKAGE = cups
-
-bindir = @cups_bindir@
-
-pkgdatadir = $(cups_conf_datadir)
-pkglibdir = $(cups_conf_serverbin)
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(LOCAL_CPPFLAGS) $(GNUCFLAGS)
+empty =
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)
-LIBPRINTUT = $(top_builddir)/lib/libprintut.la
-LIBS = $(INTLLIBS) @LIBS@
-
-@BUILD_GENPPD_STATIC_TRUE@STATIC_LDOPTS = -static
-
-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_PPDS_AT_TOP_LEVEL_FALSE@cups_modeldir = $(pkgdatadir)/model/gutenprint/@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@/
+@CUPS_PPDS_AT_TOP_LEVEL_TRUE@cups_modeldir = $(pkgdatadir)/model/
+@CUPS_PPDS_AT_TOP_LEVEL_TRUE@DONT_UNINSTALL_PPDS = true
+LOCAL_CPPFLAGS = $(GUTENPRINT_CFLAGS) $(CUPS_CFLAGS)
+@BUILD_CUPS_TRUE@sbin_SCRIPTS = cups-genppdconfig.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@ cups-genppdupdate.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@
+@BUILD_GENPPD_STATIC_TRUE@STATIC_LDOPTS = -static -export-dynamic
cups_calibrate_SOURCES = cups-calibrate.c
-cups_calibrate_LDADD = $(LIBPRINTUT) $(LIBM)
-
+cups_calibrate_LDADD = -lm
commandtoepson_SOURCES = commandtoepson.c
-commandtoepson_LDADD = $(LIBPRINTUT) $(CUPS_LIBS)
-
+commandtoepson_LDADD = $(CUPS_LIBS)
canon_SOURCES = canon.c
-canon_LDADD = $(LIBPRINTUT) $(CUPS_LIBS)
-
+canon_LDADD = $(CUPS_LIBS)
epson_SOURCES = epson.c
-epson_LDADD = $(LIBPRINTUT) $(CUPS_LIBS)
-
-genppd_SOURCES = genppd.c
-genppd_LDADD = $(LIBPRINTUT) $(CUPS_LIBS) $(LIBGIMPPRINT_LIBS)
-genppd_LDFLAGS = $(STATIC_LDOPTS)
-genppd_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
-
-rastertoprinter_SOURCES = rastertoprinter.c
-rastertoprinter_LDADD = $(LIBPRINTUT) $(CUPS_LIBS) $(LIBGIMPPRINT_LIBS)
-rastertoprinter_LDFLAGS = $(STATIC_LDOPTS)
-rastertoprinter_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
-
-CUPS_PKG = calibrate.ppm
-CUPS_CONF = command.types
-
-pkgdata_DATA = @CUPS_PKG@
-pkgsysconf_DATA = @CUPS_CONF@
-
-@BUILD_CUPS_TRUE@INSTALL_DATA_LOCAL_DEPS = ppd
-
-@BUILD_TRANSLATED_PPDS_TRUE@PPD_NLS = $(PPD_NLS_1)
-@BUILD_TRANSLATED_PPDS_TRUE@LINGUAS = $(ALL_LINGUAS)
-
+epson_LDADD = $(CUPS_LIBS)
+cups_genppd_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_SOURCES = genppd.c
+cups_genppd_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_LDADD = $(CUPS_LIBS) $(GENPPD_LIBS) $(GUTENPRINT_LIBS)
+cups_genppd_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_LDFLAGS = $(STATIC_LDOPTS)
+rastertogutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_SOURCES = rastertoprinter.c
+rastertogutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_LDADD = $(CUPS_LIBS) $(GUTENPRINT_LIBS)
+rastertogutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_LDFLAGS = $(STATIC_LDOPTS)
+@BUILD_CUPS_TRUE@CUPS_PKG = calibrate.ppm
+@BUILD_CUPS_TRUE@CUPS_CONF = command.types
+pkgdata_DATA = $(CUPS_PKG)
+pkgsysconf_DATA = $(CUPS_CONF)
+@BUILD_CUPS_PPDS_TRUE@INSTALL_DATA_LOCAL_DEPS = ppd-stamp
+@BUILD_TRANSLATED_CUPS_PPDS_TRUE@PPD_NLS = $(PPD_NLS_1)
+@BUILD_TRANSLATED_CUPS_PPDS_TRUE@LINGUAS = $(ALL_LINGUAS)
@USE_NLS_TRUE@PPD_NLS_1 = ppd-nls
-
-CLEANFILES = $(EXTRA_PROGRAMS) ppd-stamp
+CLEANFILES = ppd-stamp
+DISTCLEANFILES = cups-genppdconfig.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@ cups-genppdupdate.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@
MAINTAINERCLEANFILES = Makefile.in
+EXTRA_DIST = \
+ COPYING \
+ README \
+ calibrate.ppm \
+ command.txt \
+ command.types
-EXTRA_DIST = COPYING README calibrate.ppm command.txt command.types
-
-mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
-CONFIG_HEADER = ../../config.h
-CONFIG_CLEAN_FILES =
-bin_PROGRAMS = @CUPS_BIN@
-cupsexec_backend_PROGRAMS = @CUPS_BACKEND_BIN@
-cupsexec_filter_PROGRAMS = @CUPS_FILTER_BIN@
-noinst_PROGRAMS = @CUPS_NOINST_BIN@
-PROGRAMS = $(bin_PROGRAMS) $(cupsexec_backend_PROGRAMS) \
-$(cupsexec_filter_PROGRAMS) $(noinst_PROGRAMS)
-
-CPPFLAGS = @CPPFLAGS@
-LDFLAGS = @LDFLAGS@
-cups_calibrate_OBJECTS = cups-calibrate.$(OBJEXT)
-cups_calibrate_DEPENDENCIES = $(top_builddir)/lib/libprintut.la
-cups_calibrate_LDFLAGS =
-commandtoepson_OBJECTS = commandtoepson.$(OBJEXT)
-commandtoepson_DEPENDENCIES = $(top_builddir)/lib/libprintut.la
-commandtoepson_LDFLAGS =
-epson_OBJECTS = epson.$(OBJEXT)
-epson_DEPENDENCIES = $(top_builddir)/lib/libprintut.la
-epson_LDFLAGS =
-genppd_OBJECTS = genppd.$(OBJEXT)
-rastertoprinter_OBJECTS = rastertoprinter.$(OBJEXT)
-commandtocanon_SOURCES = commandtocanon.c
-commandtocanon_OBJECTS = commandtocanon.$(OBJEXT)
-commandtocanon_LDADD = $(LDADD)
-commandtocanon_DEPENDENCIES =
-commandtocanon_LDFLAGS =
-canon_OBJECTS = canon.$(OBJEXT)
-canon_DEPENDENCIES = $(top_builddir)/lib/libprintut.la
-canon_LDFLAGS =
-CFLAGS = @CFLAGS@
-COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-DATA = $(pkgdata_DATA) $(pkgsysconf_DATA)
-
-DIST_COMMON = README COPYING Makefile.am Makefile.in
-
+all: all-am
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = tar
-GZIP_ENV = --best
-SOURCES = $(cups_calibrate_SOURCES) $(commandtoepson_SOURCES) $(epson_SOURCES) $(genppd_SOURCES) $(rastertoprinter_SOURCES) commandtocanon.c $(canon_SOURCES)
-OBJECTS = $(cups_calibrate_OBJECTS) $(commandtoepson_OBJECTS) $(epson_OBJECTS) $(genppd_OBJECTS) $(rastertoprinter_OBJECTS) commandtocanon.$(OBJEXT) $(canon_OBJECTS)
-
-all: all-redirect
.SUFFIXES:
-.SUFFIXES: .S .c .lo .o .obj .s
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/cups/Makefile
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-
-mostlyclean-binPROGRAMS:
-
-clean-binPROGRAMS:
- -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
-
-distclean-binPROGRAMS:
-
-maintainer-clean-binPROGRAMS:
-
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/scripts/global.mk $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/cups/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/cups/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+cups-genppdconfig: $(top_builddir)/config.status $(srcdir)/cups-genppdconfig.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+cups-genppdupdate: $(top_builddir)/config.status $(srcdir)/cups-genppdupdate.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
install-binPROGRAMS: $(bin_PROGRAMS)
@$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(bindir)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
@list='$(bin_PROGRAMS)'; for p in $$list; do \
- if test -f $$p; then \
- echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
- $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
else :; fi; \
done
uninstall-binPROGRAMS:
@$(NORMAL_UNINSTALL)
- list='$(bin_PROGRAMS)'; for p in $$list; do \
- rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
done
-mostlyclean-cupsexec_backendPROGRAMS:
-
-clean-cupsexec_backendPROGRAMS:
- -test -z "$(cupsexec_backend_PROGRAMS)" || rm -f $(cupsexec_backend_PROGRAMS)
-
-distclean-cupsexec_backendPROGRAMS:
-
-maintainer-clean-cupsexec_backendPROGRAMS:
-
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
install-cupsexec_backendPROGRAMS: $(cupsexec_backend_PROGRAMS)
@$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(cupsexec_backenddir)
+ test -z "$(cupsexec_backenddir)" || $(mkdir_p) "$(DESTDIR)$(cupsexec_backenddir)"
@list='$(cupsexec_backend_PROGRAMS)'; for p in $$list; do \
- if test -f $$p; then \
- echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(cupsexec_backenddir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
- $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(cupsexec_backenddir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(cupsexec_backendPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(cupsexec_backenddir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(cupsexec_backendPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(cupsexec_backenddir)/$$f" || exit 1; \
else :; fi; \
done
uninstall-cupsexec_backendPROGRAMS:
@$(NORMAL_UNINSTALL)
- list='$(cupsexec_backend_PROGRAMS)'; for p in $$list; do \
- rm -f $(DESTDIR)$(cupsexec_backenddir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ @list='$(cupsexec_backend_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(cupsexec_backenddir)/$$f'"; \
+ rm -f "$(DESTDIR)$(cupsexec_backenddir)/$$f"; \
done
-mostlyclean-cupsexec_filterPROGRAMS:
-
-clean-cupsexec_filterPROGRAMS:
- -test -z "$(cupsexec_filter_PROGRAMS)" || rm -f $(cupsexec_filter_PROGRAMS)
-
-distclean-cupsexec_filterPROGRAMS:
-
-maintainer-clean-cupsexec_filterPROGRAMS:
-
+clean-cupsexec_backendPROGRAMS:
+ @list='$(cupsexec_backend_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
install-cupsexec_filterPROGRAMS: $(cupsexec_filter_PROGRAMS)
@$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(cupsexec_filterdir)
+ test -z "$(cupsexec_filterdir)" || $(mkdir_p) "$(DESTDIR)$(cupsexec_filterdir)"
@list='$(cupsexec_filter_PROGRAMS)'; for p in $$list; do \
- if test -f $$p; then \
- echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(cupsexec_filterdir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
- $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(cupsexec_filterdir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(cupsexec_filterPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(cupsexec_filterdir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(cupsexec_filterPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(cupsexec_filterdir)/$$f" || exit 1; \
else :; fi; \
done
uninstall-cupsexec_filterPROGRAMS:
@$(NORMAL_UNINSTALL)
- list='$(cupsexec_filter_PROGRAMS)'; for p in $$list; do \
- rm -f $(DESTDIR)$(cupsexec_filterdir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ @list='$(cupsexec_filter_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(cupsexec_filterdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(cupsexec_filterdir)/$$f"; \
done
-mostlyclean-noinstPROGRAMS:
-
-clean-noinstPROGRAMS:
- -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
-
-distclean-noinstPROGRAMS:
-
-maintainer-clean-noinstPROGRAMS:
-
-.c.o:
- $(COMPILE) -c $<
+clean-cupsexec_filterPROGRAMS:
+ @list='$(cupsexec_filter_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+install-sbinPROGRAMS: $(sbin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)"
+ @list='$(sbin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(sbinPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(sbindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(sbinPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(sbindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
-# FIXME: We should only use cygpath when building on Windows,
-# and only if it is available.
-.c.obj:
- $(COMPILE) -c `cygpath -w $<`
+uninstall-sbinPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(sbin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(sbindir)/$$f"; \
+ done
-.s.o:
- $(COMPILE) -c $<
+clean-sbinPROGRAMS:
+ @list='$(sbin_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+canon$(EXEEXT): $(canon_OBJECTS) $(canon_DEPENDENCIES)
+ @rm -f canon$(EXEEXT)
+ $(LINK) $(canon_LDFLAGS) $(canon_OBJECTS) $(canon_LDADD) $(LIBS)
+commandtocanon$(EXEEXT): $(commandtocanon_OBJECTS) $(commandtocanon_DEPENDENCIES)
+ @rm -f commandtocanon$(EXEEXT)
+ $(LINK) $(commandtocanon_LDFLAGS) $(commandtocanon_OBJECTS) $(commandtocanon_LDADD) $(LIBS)
+commandtoepson$(EXEEXT): $(commandtoepson_OBJECTS) $(commandtoepson_DEPENDENCIES)
+ @rm -f commandtoepson$(EXEEXT)
+ $(LINK) $(commandtoepson_LDFLAGS) $(commandtoepson_OBJECTS) $(commandtoepson_LDADD) $(LIBS)
+cups-calibrate$(EXEEXT): $(cups_calibrate_OBJECTS) $(cups_calibrate_DEPENDENCIES)
+ @rm -f cups-calibrate$(EXEEXT)
+ $(LINK) $(cups_calibrate_LDFLAGS) $(cups_calibrate_OBJECTS) $(cups_calibrate_LDADD) $(LIBS)
+cups-genppd.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@$(EXEEXT): $(cups_genppd_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_OBJECTS) $(cups_genppd_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_DEPENDENCIES)
+ @rm -f cups-genppd.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@$(EXEEXT)
+ $(LINK) $(cups_genppd_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_LDFLAGS) $(cups_genppd_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_OBJECTS) $(cups_genppd_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_LDADD) $(LIBS)
+epson$(EXEEXT): $(epson_OBJECTS) $(epson_DEPENDENCIES)
+ @rm -f epson$(EXEEXT)
+ $(LINK) $(epson_LDFLAGS) $(epson_OBJECTS) $(epson_LDADD) $(LIBS)
+rastertogutenprint.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@$(EXEEXT): $(rastertogutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_OBJECTS) $(rastertogutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_DEPENDENCIES)
+ @rm -f rastertogutenprint.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@$(EXEEXT)
+ $(LINK) $(rastertogutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_LDFLAGS) $(rastertogutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_OBJECTS) $(rastertogutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_LDADD) $(LIBS)
+install-sbinSCRIPTS: $(sbin_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)"
+ @list='$(sbin_SCRIPTS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f $$d$$p; then \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " $(sbinSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(sbindir)/$$f'"; \
+ $(sbinSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(sbindir)/$$f"; \
+ else :; fi; \
+ done
-.S.o:
- $(COMPILE) -c $<
+uninstall-sbinSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(sbin_SCRIPTS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(sbindir)/$$f"; \
+ done
mostlyclean-compile:
- -rm -f *.o core *.core
-rm -f *.$(OBJEXT)
-clean-compile:
-
distclean-compile:
-rm -f *.tab.c
-maintainer-clean-compile:
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/canon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commandtocanon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commandtoepson.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cups-calibrate.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/epson.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genppd.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rastertoprinter.Po@am__quote@
-.c.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
-.s.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
-.S.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.c.lo:
+@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
mostlyclean-libtool:
-rm -f *.lo
@@ -436,241 +666,263 @@ clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-
-maintainer-clean-libtool:
-
-cups-calibrate$(EXEEXT): $(cups_calibrate_OBJECTS) $(cups_calibrate_DEPENDENCIES)
- @rm -f cups-calibrate$(EXEEXT)
- $(LINK) $(cups_calibrate_LDFLAGS) $(cups_calibrate_OBJECTS) $(cups_calibrate_LDADD) $(LIBS)
-
-commandtoepson$(EXEEXT): $(commandtoepson_OBJECTS) $(commandtoepson_DEPENDENCIES)
- @rm -f commandtoepson$(EXEEXT)
- $(LINK) $(commandtoepson_LDFLAGS) $(commandtoepson_OBJECTS) $(commandtoepson_LDADD) $(LIBS)
-
-epson$(EXEEXT): $(epson_OBJECTS) $(epson_DEPENDENCIES)
- @rm -f epson$(EXEEXT)
- $(LINK) $(epson_LDFLAGS) $(epson_OBJECTS) $(epson_LDADD) $(LIBS)
-
-genppd$(EXEEXT): $(genppd_OBJECTS) $(genppd_DEPENDENCIES)
- @rm -f genppd$(EXEEXT)
- $(LINK) $(genppd_LDFLAGS) $(genppd_OBJECTS) $(genppd_LDADD) $(LIBS)
-
-rastertoprinter$(EXEEXT): $(rastertoprinter_OBJECTS) $(rastertoprinter_DEPENDENCIES)
- @rm -f rastertoprinter$(EXEEXT)
- $(LINK) $(rastertoprinter_LDFLAGS) $(rastertoprinter_OBJECTS) $(rastertoprinter_LDADD) $(LIBS)
-
-commandtocanon$(EXEEXT): $(commandtocanon_OBJECTS) $(commandtocanon_DEPENDENCIES)
- @rm -f commandtocanon$(EXEEXT)
- $(LINK) $(commandtocanon_LDFLAGS) $(commandtocanon_OBJECTS) $(commandtocanon_LDADD) $(LIBS)
-
-canon$(EXEEXT): $(canon_OBJECTS) $(canon_DEPENDENCIES)
- @rm -f canon$(EXEEXT)
- $(LINK) $(canon_LDFLAGS) $(canon_OBJECTS) $(canon_LDADD) $(LIBS)
-
+ -rm -f libtool
+uninstall-info-am:
install-pkgdataDATA: $(pkgdata_DATA)
@$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)
+ test -z "$(pkgdatadir)" || $(mkdir_p) "$(DESTDIR)$(pkgdatadir)"
@list='$(pkgdata_DATA)'; for p in $$list; do \
- if test -f $(srcdir)/$$p; then \
- echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkgdatadir)/$$p"; \
- $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkgdatadir)/$$p; \
- else if test -f $$p; then \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(pkgdatadir)/$$p"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(pkgdatadir)/$$p; \
- fi; fi; \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgdatadir)/$$f'"; \
+ $(pkgdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgdatadir)/$$f"; \
done
uninstall-pkgdataDATA:
@$(NORMAL_UNINSTALL)
- list='$(pkgdata_DATA)'; for p in $$list; do \
- rm -f $(DESTDIR)$(pkgdatadir)/$$p; \
+ @list='$(pkgdata_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgdatadir)/$$f"; \
done
-
install-pkgsysconfDATA: $(pkgsysconf_DATA)
@$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(pkgsysconfdir)
+ test -z "$(pkgsysconfdir)" || $(mkdir_p) "$(DESTDIR)$(pkgsysconfdir)"
@list='$(pkgsysconf_DATA)'; for p in $$list; do \
- if test -f $(srcdir)/$$p; then \
- echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkgsysconfdir)/$$p"; \
- $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkgsysconfdir)/$$p; \
- else if test -f $$p; then \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(pkgsysconfdir)/$$p"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(pkgsysconfdir)/$$p; \
- fi; fi; \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgsysconfDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgsysconfdir)/$$f'"; \
+ $(pkgsysconfDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgsysconfdir)/$$f"; \
done
uninstall-pkgsysconfDATA:
@$(NORMAL_UNINSTALL)
- list='$(pkgsysconf_DATA)'; for p in $$list; do \
- rm -f $(DESTDIR)$(pkgsysconfdir)/$$p; \
+ @list='$(pkgsysconf_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgsysconfdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgsysconfdir)/$$f"; \
done
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
tags: TAGS
-ID: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
- here=`pwd` && cd $(srcdir) \
- && mkid -f$$here/ID $$unique $(LISP)
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
- || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
-mostlyclean-tags:
-
-clean-tags:
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
- -rm -f TAGS ID
-
-maintainer-clean-tags:
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-
-subdir = src/cups
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
- @for file in $(DISTFILES); do \
- d=$(srcdir); \
+ $(mkdir_p) $(distdir)/../../scripts
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
- || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $$d/$$file $(distdir)/$$file || :; \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
fi; \
done
- $(MAKE) $(AM_MAKEFLAGS) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-hook
-canon.o: canon.c
-commandtocanon.o: commandtocanon.c
-commandtoepson.o: commandtoepson.c
-cups-calibrate.o: cups-calibrate.c
-epson.o: epson.c ../../config.h
-genppd.o: genppd.c ../../config.h ../../include/gimp-print/gimp-print.h \
- ../../include/gimp-print/gimp-print-intl.h \
- ../../lib/libprintut.h ../../lib/xmalloc.h
-rastertoprinter.o: rastertoprinter.c \
- ../../include/gimp-print/gimp-print.h ../../lib/libprintut.h \
- ../../config.h ../../lib/xmalloc.h
-
-info-am:
-info: info-am
-dvi-am:
-dvi: dvi-am
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-hook
check-am: all-am
check: check-am
-installcheck-am:
-installcheck: installcheck-am
-install-exec-am: install-binPROGRAMS install-cupsexec_backendPROGRAMS \
- install-cupsexec_filterPROGRAMS
+all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(DATA) all-local
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(cupsexec_backenddir)" "$(DESTDIR)$(cupsexec_filterdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(pkgsysconfdir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
install-exec: install-exec-am
-
-install-data-am: install-pkgdataDATA install-pkgsysconfDATA \
- install-data-local
- @$(NORMAL_INSTALL)
- $(MAKE) $(AM_MAKEFLAGS) install-data-hook
install-data: install-data-am
+uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-am
-uninstall-am: uninstall-binPROGRAMS uninstall-cupsexec_backendPROGRAMS \
- uninstall-cupsexec_filterPROGRAMS uninstall-pkgdataDATA \
- uninstall-pkgsysconfDATA uninstall-local
-uninstall: uninstall-am
-all-am: Makefile $(PROGRAMS) $(DATA) all-local
-all-redirect: all-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs:
- $(mkinstalldirs) $(DESTDIR)$(bindir) $(DESTDIR)$(cupsexec_backenddir) \
- $(DESTDIR)$(cupsexec_filterdir) $(DESTDIR)$(pkgdatadir) \
- $(DESTDIR)$(pkgsysconfdir)
-
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
- -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-mostlyclean-am: mostlyclean-binPROGRAMS \
- mostlyclean-cupsexec_backendPROGRAMS \
- mostlyclean-cupsexec_filterPROGRAMS \
- mostlyclean-noinstPROGRAMS mostlyclean-compile \
- mostlyclean-libtool mostlyclean-tags \
- mostlyclean-generic
+clean: clean-am
-mostlyclean: mostlyclean-am
+clean-am: clean-binPROGRAMS clean-cupsexec_backendPROGRAMS \
+ clean-cupsexec_filterPROGRAMS clean-generic clean-libtool \
+ clean-local clean-sbinPROGRAMS mostlyclean-am
-clean-am: clean-binPROGRAMS clean-cupsexec_backendPROGRAMS \
- clean-cupsexec_filterPROGRAMS clean-noinstPROGRAMS \
- clean-compile clean-libtool clean-tags clean-generic \
- mostlyclean-am clean-local
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
-clean: clean-am
+dvi: dvi-am
-distclean-am: distclean-binPROGRAMS distclean-cupsexec_backendPROGRAMS \
- distclean-cupsexec_filterPROGRAMS \
- distclean-noinstPROGRAMS distclean-compile \
- distclean-libtool distclean-tags distclean-generic \
- clean-am
- -rm -f libtool
+dvi-am:
-distclean: distclean-am
+html: html-am
-maintainer-clean-am: maintainer-clean-binPROGRAMS \
- maintainer-clean-cupsexec_backendPROGRAMS \
- maintainer-clean-cupsexec_filterPROGRAMS \
- maintainer-clean-noinstPROGRAMS \
- maintainer-clean-compile maintainer-clean-libtool \
- maintainer-clean-tags maintainer-clean-generic \
- distclean-am
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-pkgdataDATA \
+ install-pkgsysconfDATA
+ @$(NORMAL_INSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) install-data-hook
+
+install-exec-am: install-binPROGRAMS install-cupsexec_backendPROGRAMS \
+ install-cupsexec_filterPROGRAMS install-sbinPROGRAMS \
+ install-sbinSCRIPTS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
-.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
-maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
-mostlyclean-cupsexec_backendPROGRAMS distclean-cupsexec_backendPROGRAMS \
-clean-cupsexec_backendPROGRAMS \
-maintainer-clean-cupsexec_backendPROGRAMS \
-uninstall-cupsexec_backendPROGRAMS install-cupsexec_backendPROGRAMS \
-mostlyclean-cupsexec_filterPROGRAMS distclean-cupsexec_filterPROGRAMS \
-clean-cupsexec_filterPROGRAMS maintainer-clean-cupsexec_filterPROGRAMS \
-uninstall-cupsexec_filterPROGRAMS install-cupsexec_filterPROGRAMS \
-mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \
-clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \
-mostlyclean-compile distclean-compile clean-compile \
-maintainer-clean-compile mostlyclean-libtool distclean-libtool \
-clean-libtool maintainer-clean-libtool uninstall-pkgdataDATA \
-install-pkgdataDATA uninstall-pkgsysconfDATA install-pkgsysconfDATA \
-tags mostlyclean-tags distclean-tags clean-tags maintainer-clean-tags \
-distdir info-am info dvi-am dvi check check-am installcheck-am \
-installcheck install-exec-am install-exec install-data-local \
-install-data-am install-data install-am install uninstall-local \
-uninstall-am uninstall all-local all-redirect all-am all installdirs \
-mostlyclean-generic distclean-generic clean-generic \
-maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-cupsexec_backendPROGRAMS \
+ uninstall-cupsexec_filterPROGRAMS uninstall-info-am \
+ uninstall-local uninstall-pkgdataDATA uninstall-pkgsysconfDATA \
+ uninstall-sbinPROGRAMS uninstall-sbinSCRIPTS
+
+.PHONY: CTAGS GTAGS all all-am all-local check check-am clean \
+ clean-binPROGRAMS clean-cupsexec_backendPROGRAMS \
+ clean-cupsexec_filterPROGRAMS clean-generic clean-libtool \
+ clean-local clean-sbinPROGRAMS ctags dist-hook distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-binPROGRAMS \
+ install-cupsexec_backendPROGRAMS \
+ install-cupsexec_filterPROGRAMS install-data install-data-am \
+ install-data-hook install-data-local install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-pkgdataDATA install-pkgsysconfDATA \
+ install-sbinPROGRAMS install-sbinSCRIPTS install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-cupsexec_backendPROGRAMS \
+ uninstall-cupsexec_filterPROGRAMS uninstall-info-am \
+ uninstall-local uninstall-pkgdataDATA uninstall-pkgsysconfDATA \
+ uninstall-sbinPROGRAMS uninstall-sbinSCRIPTS
@SET_MAKE@
+export STP_MODULE_PATH = $(top_builddir)/src/main/.libs:$(top_builddir)/src/main
+export STP_DATA_PATH = $(top_srcdir)/src/main
+
+# Rules
+
+$(top_builddir)/src/main/libgutenprint.la:
+ cd $(top_builddir)/src/main; \
+ $(MAKE)
+
+$(top_builddir)/src/gutenprintui/libgutenprintui.la:
+ cd $(top_builddir)/src/gutenprintui; \
+ $(MAKE)
+
+$(top_builddir)/src/gutenprintui2/libgutenprintui2.la:
+ cd $(top_builddir)/src/gutenprintui2; \
+ $(MAKE)
+
+cups-genppdconfig.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@: $(top_builddir)/config.status cups-genppdconfig.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/cups-genppdconfig
+cups-genppdupdate.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@: $(top_builddir)/config.status cups-genppdupdate.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/cups-genppdupdate
+
install-data-local: $(INSTALL_DATA_LOCAL_DEPS)
if test -n "$(INSTALL_DATA_LOCAL_DEPS)" ; then \
$(mkinstalldirs) $(DESTDIR)$(cups_modeldir); \
@@ -687,34 +939,13 @@ install-data-local: $(INSTALL_DATA_LOCAL_DEPS)
fi
uninstall-local: $(INSTALL_DATA_LOCAL_DEPS)
- if test -n "$(INSTALL_DATA_LOCAL_DEPS)" ; then \
- for language in C $(LINGUAS) ; do \
- echo "Removing $$language locale PPD files..." ; \
- for ppdfile in ppd/$$language/* ; do \
- if test -f "$(DESTDIR)$(cups_modeldir)/$$language/`basename $$ppdfile`" ; then \
- $(RM) -f $(DESTDIR)$(cups_modeldir)/$$language/`basename $$ppdfile` ; \
- fi ; \
- done; \
- done \
+# Remove PPDs installed in new PPD location
+ if test -z "DONT_UNINSTALL_PPDS" ; then \
+ if test -n "$(INSTALL_DATA_LOCAL_DEPS)" ; then \
+ $(RM) -fr $(DESTDIR)$(cups_modeldir)/* ; \
+ fi \
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
-@echo 'Expect a number of "rmdir: Directory not empty" warnings'
@@ -736,7 +967,7 @@ all-local: $(INSTALL_DATA_LOCAL_DEPS)
ppd: ppd-stamp
-ppd-stamp: genppd
+ppd-stamp: cups-genppd.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@ $(top_srcdir)/src/main/printers.xml $(top_srcdir)/src/main/papers.xml
$(MAKE) ppd-stamp-phony
touch ppd-stamp
@@ -746,29 +977,25 @@ ppd-stamp-pre:
-$(RM) -r ppd
-mkdir ppd
-ppd-nonls: genppd
+ppd-nonls: cups-genppd.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@
for language in C ; do \
mkdir ppd/$$language ; \
echo "$$language:" ; \
- ./genppd --prefix=ppd/$$language ; \
+ LANGUAGE=$$language ./cups-genppd.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@ -p ppd/$$language ; \
done
-ppd-nls: genppd
+ppd-nls: cups-genppd.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@
wdir=`pwd` ; \
cd $(top_builddir)/po ; \
$(MAKE) ; \
$(MAKE) DESTDIR= prefix=$${wdir}/catalog datadir=$${wdir}/catalog/share install
- for language in $(LINGUAS) ; do \
+ for language in `./cups-genppd.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@ -L -c \`pwd\`/catalog/share/locale` ; do \
mkdir ppd/$$language ; \
echo "$$language:" ; \
- LANGUAGE=$$language ./genppd --prefix=ppd/$$language --catalog=`pwd`/catalog/share/locale ; \
+ LANGUAGE=$$language ./cups-genppd.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@ -p ppd/$$language -c `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 \
@@ -783,7 +1010,6 @@ dist-hook:
clean-local:
-$(RM) -r ppd
-
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
diff --git a/src/cups/README b/src/cups/README
index 812dd6a..5deadb2 100644
--- a/src/cups/README
+++ b/src/cups/README
@@ -1,13 +1,13 @@
-README.txt - 11/21/2001 - CUPS Drivers based on Gimp-Print
+README.txt - 11/21/2001 - CUPS Drivers based on Gutenprint
----------------------------------------------------------
-This file describes the CUPS drivers based on the Gimp-Print project.
+This file describes the CUPS drivers based on the Gutenprint 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
+Gutenprint project and is provided under the terms of the GNU General
Public License. The licensing details are provided in the file
"LICENSE.txt".
@@ -15,7 +15,7 @@ Public License. The licensing details are provided in the file
INTRODUCTION
The CUPS drivers contain all of the files needed to support
-photo-quality printing on any printer supported by the Gimp-Print
+photo-quality printing on any printer supported by the Gutenprint
project. You can find out more about the Common UNIX Printing System
("CUPS"), an IPP-based printing system for UNIX/Linux, at:
@@ -51,14 +51,14 @@ 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
+driver information from the Gutenprint 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
+We support all of the Gutenprint 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.
@@ -91,7 +91,7 @@ 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.
+Gutenprint 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.
diff --git a/src/cups/cups-calibrate.c b/src/cups/cups-calibrate.c
index bf0c089..20e8f49 100644
--- a/src/cups/cups-calibrate.c
+++ b/src/cups/cups-calibrate.c
@@ -1,5 +1,5 @@
/*
- * "$Id: cups-calibrate.c,v 1.2 2001/08/13 23:59:12 rlk Exp $"
+ * "$Id: cups-calibrate.c,v 1.5 2004/09/17 18:38:10 rleigh Exp $"
*
* Super simple color calibration program for the Common UNIX
* Printing System.
@@ -32,6 +32,9 @@
*
*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -98,14 +101,14 @@ main(int argc,
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("using the Gutenprint 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("Please note that this program ONLY works with the Gutenprint CUPS or");
+ puts("ESP Print Pro drivers. If you are using the Gimp-Print stp driver of");
+ puts("GhostScript or the drivers of the Print plug-in for the GIMP, this");
puts("calibration will not work.");
puts("");
- puts("These drivers by the text \"CUPS+GIMP-print\" or \"ESP Print Pro\" in");
+ puts("These drivers by the text \"CUPS+Gutenprint\" 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("");
diff --git a/src/cups/cups-genppdconfig.in b/src/cups/cups-genppdconfig.in
new file mode 100644
index 0000000..869dc96
--- /dev/null
+++ b/src/cups/cups-genppdconfig.in
@@ -0,0 +1,616 @@
+#! @PERL@ -w
+# $Id: cups-genppdconfig.in,v 1.11 2005/05/05 10:36:58 rleigh Exp $
+# A user-friendly dialog-based wrapper for cups-genppd(8).
+# Copyright (C) 2002 Roger Leigh <rleigh@debian.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, 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.
+
+use strict;
+use File::Basename;
+use File::Find;
+use File::Temp qw(tempfile unlink0);
+use IO::Handle;
+use Getopt::Std;
+use POSIX;
+use Locale::gettext;
+
+sub init_data();
+sub init_defaults();
+sub main_menu();
+sub display_help;
+sub choose_printers;
+sub choose_languages;
+sub choose_location;
+sub create_ppds;
+sub create_dir($);
+sub dialog_read($$);
+sub dialog_read_list (\%\@$$);
+sub perl_menu ($$$$@);
+sub perl_menu_read_list (\%\@$$);
+sub perl_menu_mult ($$@);
+
+my $DIALOG = "@DIALOG@"; # version of dialog to call
+my $use_dialog = 0; # whether to use dialog
+my $BACKTITLE = "Gutenprint CUPS PPD creation"; # dialog screen title
+my %printers; # master list of printers
+my %languages; # master list of languages
+my @used_printers; # printer PPDs on system
+my @used_languages; # languages used on system
+my @chosen_printers = (); # chosen printers
+my @chosen_languages = (); # chosen languages
+my $version = "@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@";
+my $chosen_location = "@cups_conf_datadir@/model/gutenprint/$version";
+ # chosen PPD prefix
+my $silent = 0; # no dialog
+
+
+# Set chosen_location from command-line.
+our $opt_d;
+our $opt_u;
+getopts('d:u');
+if ($opt_d) {
+ $chosen_location = create_dir($opt_d);
+}
+
+# Initialise everything
+init_data();
+init_defaults();
+
+# Run non-interactively if `-u' was specified.
+if ( $opt_u ) {
+ $silent = 1;
+ create_ppds;
+ exit 0;
+}
+
+# Can we use dialog?
+if (-x $DIALOG) {
+ $use_dialog = 1;
+} else {
+ BEGIN { $Curses::OldCurses = 1; }
+ use Curses;
+ use perlmenu;
+ perl_menu_defaults();
+}
+
+while (my $option = main_menu()) { # Display main menu and run selection
+ if ($option eq "Help") {
+ display_help();
+ } elsif ($option eq "Printers") {
+ choose_printers();
+ } elsif ($option eq "Languages") {
+ choose_languages();
+ } elsif ($option eq "Directory") {
+ choose_location();
+ } elsif ($option eq "Create") {
+ create_ppds();
+ } elsif ($option eq "Exit") {
+ exit 0;
+ } else {
+ die "Invalid menu option: $option";
+ }
+}
+
+exit 0;
+
+
+#
+# init_data() - Populate master printer and language hashes.
+#
+sub init_data() {
+ my $model;
+ my $desc;
+ my $lang;
+# Get printer drivers and descriptions, then store in a hash.
+ open GENPPD, "cups-genppd.$version -M -v |" or die "can't fork cups-genppd.$version: $!";
+ while (<GENPPD>) {
+ ($model, $desc) = /([\w-]+)\W+(.*)/;
+ chomp ($model);
+ chomp ($desc);
+ $printers{$model} = $desc;
+ }
+ close GENPPD or die "can't close cups-genppd.$version pipe: $!";
+# Get available languages, then store in hash.
+ open GENPPD, "cups-genppd.$version -L |" or die "can't fork cups-genppd.$version: $!";
+ while (<GENPPD>) {
+ $lang = $_;
+ chomp ($lang);
+ $languages{$lang} = "(No description)";
+ }
+ $languages{"en"} = "US English";
+ close GENPPD or die "can't close cups-genppd.$version pipe: $!";
+# Set defaults
+ @chosen_languages = ("en");
+}
+
+
+#
+# init_defaults() - Get defaults from PPD files and directories.
+#
+sub init_defaults() {
+ # Find all PPD files that we could regenerate
+ my %found_ppds;
+ if (-d $chosen_location) {
+ find({wanted => \&find_printers}, $chosen_location);
+ foreach (@used_printers) {
+ my $tmp;
+ $tmp = basename($_);
+ chomp ($tmp);
+ $tmp =~ s/(^.*)\.ppd.*/$1/;
+ $found_ppds{$tmp} = "" if $printers{$tmp};
+ }
+ }
+ @chosen_printers = ();
+ foreach (sort keys %found_ppds) {
+ push @chosen_printers, $_;
+ }
+
+ # Find all language directories that could be used
+ my %found_langs;
+ if (-d $chosen_location) {
+ find({wanted => \&find_languages}, $chosen_location);
+ foreach (@used_languages) {
+ my $tmp;
+ $tmp = basename($_);
+ chomp ($tmp);
+ $found_langs{$tmp} = "" if $languages{$tmp};
+ }
+ }
+ @chosen_languages = ();
+ foreach (sort keys %found_langs) {
+ push @chosen_languages, $_;
+ }
+ if (! @chosen_languages) {
+ push @chosen_languages, "en";
+ }
+}
+
+
+#
+# find-*() - callbacks for File::Find::find().
+#
+sub find_printers {
+ my ($dev,$ino,$mode,$nlink,$uid,$gid);
+
+ (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
+ -f _ &&
+ /^.*\.ppd.*\z/s && push @used_printers, $_;
+}
+
+sub find_languages {
+ my ($dev,$ino,$mode,$nlink,$uid,$gid);
+
+ (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
+ -d _ && push @used_languages, $_;
+}
+
+
+# string
+# main_menu() - Display main menu.
+# Return string containing selection.
+#
+sub main_menu() {
+ my $option;
+ my @menu_options;
+ my $menu_desc = << "END";
+Generate Gutenprint PPD files for use with CUPS. This program is a user-friendly interface for cups-genppd(8).
+
+Current PPD directory: $chosen_location
+
+Hint: if the cursor keys cause problems, you may have more luck with +/- and TAB.
+END
+ @menu_options = (
+ [ "Help", "Display help text" ],
+ [ "Directory", "Choose PPD location" ],
+ [ "Printers", "Choose printers" ],
+ [ "Languages", "Choose languages" ],
+ [ "Create", "Create PPDs" ],
+ [ "Exit", "Exit the program" ]
+ );
+ if ($use_dialog) {
+ my $dialog_options;
+ for my $i ( 0 .. $#menu_options) {
+ for my $j ( 0 .. $#{$menu_options[$i]}) {
+ $dialog_options .= "\"$menu_options[$i][$j]\" ";
+ }
+ }
+ while (defined($option = dialog_read("cups-genppdconfig", "--no-cancel --default-item Printers --menu \"$menu_desc\" 20 70 6 $dialog_options"))) {
+ chomp ($option);
+ return $option;
+ }
+ } else {
+ $option = perl_menu(1, "Main menu", "Choose an option.",
+ "Current PPD directory: $chosen_location",
+ @menu_options);
+ return $option;
+ }
+}
+
+
+#
+# display_help() - Display help text.
+#
+sub display_help {
+ my $help_text = <<"END";
+cups-genppdconfig is a program to generate PPD files which enable the
+Gutenprint printer drivers to be used with CUPS, the Common UNIX
+Printing System. A PPD file is a PostScript Printer Description,
+which describes the capabilities of a printer. For each printer model
+that you wish to use, you will have to generate the corresponding PPD
+file.
+
+There are three steps to generating the PPDs:
+
+
+[0. Directory]
+
+The default base directory to create PPD files in is
+@cups_conf_datadir@/model/gutenprint, and this is displayed on the
+main menu. Choose the "Directory" option to change this, but in
+almost every case the default should be used. Don\'t alter the default
+unless you know what you are doing.
+
+
+1. Printers
+
+Choose the "Printers" menu option. The dialog box shows a complete
+list of all the printers supported by Gutenprint. Use the up and down
+cursor keys to move between the printers and SPACE to select the
+models you want. Next, press ENTER to confirm the selections.
+
+If no printers are chosen, then a PPD file will be created for *every*
+model.
+
+
+2. Languages
+
+PPD files can be produced in several languages. Choose the
+"Languages" menu option and, as for the "Printers" menu, select the
+languages that you wish to use and press ENTER to confirm the
+selections.
+
+Since a PPD file can only be translated into one language, selecting
+multiple languages is posible, but of limited usefulness (for each
+printer, a separate PPD file for each language will be produced).
+
+
+3. Save the selections
+
+Choose the "Save" menu option to generate the PPD files you requested.
+The files will be created in the default CUPS data directory
+\$cups_prefix/share/model/gutenprint. Translations will be saved in
+subdirectories named according to the locale/language.
+
+
+Note that unselecting already selected entries in the Printer and
+Language Selection dialogs will *not* remove these from the
+filesystem; it will simply not cause them to be generated when you
+choose "Save". To remove a printer, delete the PPD file from each
+language directory it appears in. To remove a language, delete the
+directory named with the corresponding language code, and all its
+contents.
+
+Once you have finished, choose the "Exit" menu option, to leave the
+program. Note that your selections will be lost, so make sure you
+saved your selections first, if you wanted to keep them.
+END
+ my($HELPFILE, $helpfilename) = tempfile("cups-genppdconfig-helpXXXXXX",
+ UNLINK => 1)
+ or die "can't open temporary help file";
+ print $HELPFILE "$help_text";
+ $HELPFILE->flush();
+ if ($use_dialog) {
+ dialog_read("Help", "--textbox $helpfilename 18 76");
+ } else {
+ &menu_init(0, "Help", 0);
+ open(TEMP,$helpfilename);
+ while (<TEMP>) {
+ s/^(\t+)/' ' x length($1)/e;
+ &expand($_) if /\t/;
+ &menu_item($_,"", -1);
+ }
+ close(TEMP);
+ &menu_display("Help viewer: (RET/u/t) exit (n/p) next/previous page (b) beginning (e) end");
+ }
+ unlink0($HELPFILE, $helpfilename) or die "Error unlinking help file $helpfilename safely: $!";
+ close($HELPFILE) or die "can't close help file $helpfilename: $!";
+ return;
+}
+
+
+#
+# choose_printers() - Select printers from master list.
+# Default none (so create all printers).
+#
+sub choose_printers {
+ my $title = "Printer selection";
+ my $options = "--checklist \"Choose the printer models you wish to use with CUPS.\" 18 54 11";
+ if ($use_dialog) {
+ dialog_read_list(%printers, @chosen_printers, $title, $options);
+ } else {
+ perl_menu_read_list(%printers, @chosen_printers, $title,
+ "Choose the printer models you wish to use with CUPS.");
+ }
+}
+
+
+#
+# choose_languages() - Select languages from master list.
+# Default is US English (en).
+#
+sub choose_languages {
+ my $title = "Language selection";
+ my $options = "--checklist \"Choose the languages you wish to use with CUPS.\" 18 54 11";
+ if ($use_dialog) {
+ dialog_read_list(%languages, @chosen_languages, $title, $options);
+ } else {
+ perl_menu_read_list(%languages, @chosen_languages, $title,
+ "Choose the languages you wish to use with CUPS.");
+ }
+}
+
+
+#
+# choosen_location() - Select PPD prefix directory and create it if
+# not present.
+#
+sub choose_location {
+ my $location;
+ if ($use_dialog) {
+ $location = dialog_read("Location selection",
+ "--inputbox \"Choose a directory to create the PPD files in.\" 8 61 $chosen_location");
+ } else {
+ $location = &menu_getstr(5,12,"Directory:", 1, $chosen_location);
+ }
+ if (!defined($location)) {
+ $location = "";
+ }
+ $chosen_location = create_dir($location); # make sure directory exists
+ init_defaults; # use new location to get default selections
+}
+
+
+#
+# create_dir($dir) - Create named directory.
+# $dir will have excess `/'s pruned.
+#
+sub create_dir ($) {
+ my $location = $_[0];
+ my $dir;
+ my $count = 0;
+ if ($location =~ m/^\//) {
+ $dir = "/";
+ }
+ foreach (split /\//, $location) {
+ if ($_ eq "") {
+ next;
+ }
+ if ($count == 1) {
+ $dir .= "/";
+ }
+ $count = 1;
+ $dir .= $_;
+ if (!-d $dir) # directory does not exist, so create it
+ {
+ mkdir $dir || die "can't create directory \`$dir\': $!";
+ }
+ }
+ return $dir;
+}
+
+
+#
+# create_ppds() - Create PPD files.
+#
+sub create_ppds {
+ create_dir($chosen_location); # make the destination directory
+ my $total = scalar(@chosen_printers);
+ my $printers;
+ my $count;
+ my $language;
+ my $percent;
+ my $file;
+ if (!@chosen_printers) { # calculate total files for guage
+ $total = scalar(keys(%printers));
+ }
+ $total = $total * scalar(@chosen_languages);
+ if (@chosen_printers) { # construct printer list for dialog
+ foreach (@chosen_printers) {
+ $printers .= "$_ ";
+ }
+ } else {
+ $printers = "";
+ }
+ if (! $silent && $use_dialog) {
+ open DIALOG, "| $DIALOG --sleep 2 --backtitle \"$BACKTITLE\" --title \"Creating PPD files\" --guage \"Language: \nPPD files: \" 10 72 0"
+ or die "can't fork dialog: $!";
+ }
+ $count = 0;
+ foreach $language (@chosen_languages) { # loop through languages
+ open GENPPD,
+ "LANGUAGE=$language cups-genppd.$version -v -p $chosen_location/$language $printers 2>&1 |"
+ or die "can't fork cups-genppd: $!";
+ $file = "";
+ while ( defined($file = <GENPPD>)) { # dump genppd stats into guage
+ chomp($file);
+ $count++;
+ $percent = int (($count/$total)*100);
+ if ($percent > 100) {
+ $percent = 100;
+ }
+ if (! $silent && $use_dialog) {
+ print DIALOG "$percent\n";
+ print DIALOG "XXX\nLanguage: $language\nPPD files: $count/$total\n\n$file\nXXX\n";
+ DIALOG->flush();
+ } else {
+ print "$file\n";
+ STDOUT->flush();
+ }
+ }
+ close GENPPD or die "can't close cups-genppd pipe: $!";
+ }
+ if (! $silent && $use_dialog) {
+ print DIALOG "100\nXXX\nLanguage: \nPPD files: $total/$total\n\nCompleted\nXXX\n";
+ close DIALOG or die "can't close dialog pipe";
+ }
+}
+
+
+# scalar
+# dialog($title, $command) - Create a dialog.
+# Returns dialog results.
+sub dialog_read ($$) {
+ my($title, $command) = @_;
+ my $result = ""; # must not be undefined, just empty
+ my $status;
+ my $line;
+ open DIALOG, "$DIALOG --backtitle \"$BACKTITLE\" --title \"$title\" $command 2>&1 |";
+ while (defined($line = <DIALOG>)) {
+ $result .= $line;
+ }
+ close DIALOG or ($! == 0) or die "can't close dialog pipe: $!";
+ if ($? >> 8)
+ {
+ return undef;
+ }
+ return $result;
+}
+
+
+#
+# dialog_read_list(%masterlist
+# @chosenlist
+# $title
+# $dialog) - Construct list dialog, entries from %masterlist,
+# defaults from @chosenlist.
+#
+sub dialog_read_list (\%\@$$) {
+ my $masterlist = $_[0];
+ my $list = $_[1];
+ my $title = $_[2];
+ my $dialogoptions = $_[3];
+ my $tmplist;
+ my $dialoglist = "";
+ my $item;
+ my $selected;
+# Make a list for use with dialog.
+ foreach $item (sort keys %$masterlist) {
+ $selected = "off";
+ foreach (@$list) {
+ if ($item eq $_) {
+ $selected = "on";
+ last;
+ }
+ }
+ $dialoglist .= "$item \"$masterlist->{$item}\" $selected ";
+ }
+ $tmplist = dialog_read("$title", "$dialogoptions $dialoglist");
+ if (defined($tmplist)) {
+ $tmplist =~ s/\"//g;
+ @$list=split(/ /, $tmplist);
+ }
+}
+
+
+# scalar
+# perl_menu($title)
+#
+sub perl_menu ($$$$@) {
+ my ($top, $title, $question, $subtitle, @items) = @_;
+ my $selection;
+ &menu_init(1, "cups-genppdconfig", $top, $title, "$BACKTITLE\n-<$subtitle");
+
+ for my $i ( 0 .. $#items) {
+ &menu_item($items[$i][1], $items[$i][0]);
+ }
+
+ $selection = &menu_display($question);
+ return $selection;
+}
+
+# scalar
+# perl_menu_mult($title, $question, @items)
+#
+sub perl_menu_mult ($$@) {
+ my ($title, $question, @items) = @_;
+ my $selection;
+ &menu_init(1, "cups-genppdconfig", 0, $title, $BACKTITLE);
+
+ for my $i ( 0 .. $#items) {
+ &menu_item($items[$i][1], $items[$i][0], $items[$i][2]);
+ }
+
+ perl_menu_sel_defaults();
+ $selection = &menu_display_mult($question);
+ perl_menu_defaults();
+ if ($selection eq "%UP%" or $selection eq "%NONE%") {
+ return undef;
+ }
+ return $selection;
+}
+
+
+#
+# perl_menu_read_list(%masterlist
+# @chosenlist
+# $title
+# $question
+# - Construct list dialog, entries from %masterlist,
+# defaults from @chosenlist.
+#
+sub perl_menu_read_list (\%\@$$) {
+ my $masterlist = $_[0];
+ my $list = $_[1];
+ my $title = $_[2];
+ my $question = $_[3];
+ my $tmplist;
+ my @menulist = ();
+ my $item;
+ my $selected;
+# Make a list for use with perlmenu.
+ foreach $item (sort keys %$masterlist) {
+ $selected = 0;
+ foreach (@$list) {
+ if ($item eq $_) {
+ $selected = 1;
+ last;
+ }
+ }
+ my $formatstring = sprintf "%-14s - %s", $item, $masterlist->{$item};
+ push @menulist, [ $item, $formatstring, $selected ] ;
+ }
+ $tmplist = perl_menu_mult("$title", "RET=toggle selection (u/t) exit (n/p) next/previous page (b) beginning (e) end", @menulist);
+ if (defined($tmplist)) {
+ $tmplist =~ s/\"//g;
+ @$list=split(/,/, $tmplist);
+ }
+}
+
+
+#
+# perl_menu_defaults - set menu defaults
+#
+sub perl_menu_defaults {
+ &menu_prefs(1, 0, 1, 0, "y", 0, 0);
+}
+
+
+#
+# perl_menu_sel_defaults - set menu defaults for multiple selections
+#
+sub perl_menu_sel_defaults {
+ &menu_prefs(1, 0, 1, 0, "y", 1, 0);
+}
+
diff --git a/src/cups/cups-genppdupdate.in b/src/cups/cups-genppdupdate.in
new file mode 100644
index 0000000..c48723c
--- /dev/null
+++ b/src/cups/cups-genppdupdate.in
@@ -0,0 +1,539 @@
+#! @PERL@ -w
+# $Id: cups-genppdupdate.in,v 1.19 2005/04/30 11:48:26 rleigh Exp $
+# Update CUPS PPDs for Gutenprint queues.
+# Copyright (C) 2002-2003 Roger Leigh (rleigh@debian.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, 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.
+
+use strict;
+use Getopt::Std;
+use Fcntl qw(:mode);
+use File::Temp qw(:POSIX);
+use File::Copy qw(mv);
+
+sub parse_options ();
+sub update_ppd ($); # Original PPD filename
+sub find_ppd ($$$$); # Gutenprint Filename, driver, language (e.g. en, sv),
+ # region (e.g. GB, DE)
+sub get_default_types (*); # Source PPD FH
+sub get_defaults (*); # Source PPD FH
+sub get_options (*\%); # Source PPD FH, default_types hash ref
+
+our $opt_d; # Debug mode
+our $opt_h; # Help
+our $opt_n; # No action
+our $opt_q; # Quiet mode
+our $opt_s; # Source PPD location
+our $opt_v; # Verbose mode
+
+my $debug = 0;
+my $verbose = 0; # Verbose output
+if ($debug) {
+ $verbose = 1;
+}
+my $quiet = 0; # No output
+my $no_action = 0; # Don't output files
+my $version = "@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@";
+
+my $ppd_dir = "@cups_conf_serverroot@/ppd"; # Location of in-use CUPS PPDs
+my $ppd_root_dir = "@cups_conf_datadir@/model";
+my $ppd_base_dir = "$ppd_root_dir/gutenprint/$version"; # Available PPDs
+my $gzext = ".gz";
+my $updated_ppd_count = 0;
+
+my @ppd_files; # A list of in-use Gutenprint PPD files
+
+# Used to convert a language name to its two letter code
+my %languagemappings = (
+ "chinese" => "cn",
+ "danish" => "da",
+ "dutch" => "nl",
+ "english" => "en",
+ "finnish" => "fi",
+ "french" => "fr",
+ "german" => "de",
+ "greek" => "el",
+ "italian" => "it",
+ "japanese" => "jp",
+ "norwegian" => "no",
+ "polish" => "pl",
+ "portuguese" => "pt",
+ "russian" => "ru",
+ "slovak" => "sk",
+ "spanish" => "es",
+ "swedish" => "sv",
+ "turkish" => "tr"
+);
+
+
+# Check command-line options...
+
+parse_options();
+
+
+# Set a secure umask...
+
+umask 0177;
+
+
+# Find all in-use Gutenprint PPD files...
+
+my @ppdglob = glob("$ppd_dir/*.{ppd,PPD}");
+my $ppdlist = join ' ', @ppdglob;
+if (@ppdglob) {
+ open PPDFILES, "egrep -i -l \"Gutenprint|Gimp-Print\" $ppdlist|" or die "can't grep $ppd_dir/*: $!";
+ while (<PPDFILES>) {
+ chomp;
+ push @ppd_files, $_;
+ }
+ close PPDFILES or ($! == 0) or die "can't close grep pipe: $!";
+}
+
+
+# Exit if there are not files to update...
+
+if (!@ppd_files) {
+ print STDOUT "No Gutenprint PPD files to update.\n";
+ exit (0);
+}
+
+# Update each of the Gutenprint PPDs, where possible...
+
+foreach (@ppd_files) {
+ $updated_ppd_count += update_ppd($_);
+
+}
+
+if (!$quiet || $verbose) {
+ if ($updated_ppd_count > 0) {
+ print STDOUT "Updated $updated_ppd_count PPD files. Restart cupsd for the changes to take effect.\n";
+ exit (0);
+ } else {
+ print STDOUT "Failed to update any PPD files\n";
+ exit (0);
+ }
+}
+
+
+
+sub parse_options () {
+ getopts("dhnqs:v");
+
+ if ($opt_n) {
+ $no_action = 1;
+ }
+ if ($opt_d) {
+ $debug = 1;
+ }
+ if ($opt_s) {
+ if (-d $opt_s) {
+ $ppd_base_dir = "$opt_s";
+ }
+ else {
+ die "$opt_s: invalid directory: $!";
+ }
+ }
+ if ($opt_v) {
+ $verbose = 1;
+ $quiet = 0;
+ }
+ if ($opt_q) {
+ $verbose = 0;
+ $quiet = 1;
+ }
+ if ($opt_h) {
+ print "Usage: $0 [OPTION]...\n";
+ print "Update CUPS+Gutenprint PPD files.\n\n";
+ print " -d Enable debugging\n";
+ print " -h Display this help text\n";
+ print " -n No-action. Don't overwrite any PPD files.\n";
+ print " -q Quiet mode. No messages except errors.\n";
+ print " -s ppd_dir Use ppd_dir as the source PPD directory.\n";
+ print " -v Verbose messages.\n";
+ exit (0);
+ }
+}
+
+
+# Update the named PPD file.
+sub update_ppd ($) {
+ my $ppd_source_filename = $_;
+
+ open ORIG, $_ or die "$_: can't open PPD file: $!";
+ seek (ORIG, 0, 0) or die "can't seek to start of PPD file";
+ if ($debug) {
+ print "Source Filename: $ppd_source_filename\n";
+ }
+ # Get the `PCFileName'; the new source PPD will have the same name.
+ my ($filename) = "";
+ my ($driver) = "";
+ my ($gutenprintdriver) = "";
+ my ($locale) = "";
+ my ($lingo) = "";
+ my ($region) = "";
+ my ($valid) = 0;
+ while (<ORIG>) {
+ if (/\*StpLocale:/) {
+ ($locale) = m/^\*StpLocale:\s\"*(.*)\"$/;
+ $valid = 1;
+ }
+ if (/\*LanguageVersion/) {
+ ($lingo) = m/^\*LanguageVersion:\s*(.*)$/;
+ }
+ if (/^\*StpDriverName:/ ) {
+ ($driver) = m/^\*StpDriverName:\s*\"(.*)\"$/;
+ $valid = 1;
+ }
+ if (/\*%End of / && $driver eq "") {
+ ($driver) = m/^\*%End of\s*(.*).ppd$/;
+ }
+ if (/^\*StpPPDLocation:/ ) {
+ ($filename) = m/^\*StpPPDLocation:\s*\"(.*)\"$/;
+ $valid = 1;
+ }
+ if (/^\*%Gutenprint Filename:/) {
+ $valid = 1;
+ }
+ }
+ if (! $valid) {
+ print STDERR "$ppd_source_filename: this PPD file cannot be upgraded automatically (only files based on Gutenprint 4.3.21 and newer can be)\n";
+ return 0;
+ }
+ if ($debug) {
+ print "Gutenprint Filename: $filename\n";
+ print "Locale: $locale\n";
+ print "Language: $lingo\n";
+ print "Driver: $driver\n";
+ }
+ if ($locale) {
+ # Split into the language and territory.
+ ($locale, $region) = split(/-/, $locale);
+ } else {
+ # Split into the language and territory.
+ ($locale, $region) = split(/-/, $lingo);
+ # Convert language into language code.
+ $locale = $languagemappings{"\L$lingo"};
+ if (!defined($locale)) {
+ $locale = "C"; # Fallback if there isn't one.
+ }
+ }
+ if (! defined($region)) {
+ $region = "";
+ }
+ if ($debug) {
+ print "Locale: $locale\n";
+ print "Region: $region\n";
+ }
+
+ # Search for a PPD matching our criteria...
+
+ my $source = find_ppd($filename, $driver, $locale, $region);
+ if (!defined($source)) {
+ # There wasn't a valid source PPD file, so give up.
+ print STDERR "$ppd_source_filename: no valid candidate for replacement. Skipping\n";
+ print STDERR "$ppd_source_filename: please upgrade this PPD manually\n";
+ return 0;
+ }
+ if ($debug) {
+ print "Candidate PPD: $source\n";
+ }
+
+
+ # Read in the new PPD, decompressing it if needed...
+
+ my $source_data;
+
+ my $suffix = "\\" . $gzext; # Add '\', so m// matches the '.'.
+ if ($source =~ m/.gz$/) { # Decompress input buffer
+ open GZIN, "gunzip -c $source |"
+ or die "$_: can't open for decompression: $!";
+ while (<GZIN>) {
+ $source_data .= $_;
+ }
+ close GZIN;
+ }
+ else {
+ open SOURCE, $source
+ or die "$source: can't open source file: $!";
+ binmode SOURCE;
+ my $source_size = (stat(SOURCE))[7];
+ read (SOURCE, $source_data, $source_size)
+ or die "$source: error reading source: $!";
+ close SOURCE or die "$source: can't close file: $!";
+ }
+
+ # Save new PPD in a temporary file, for processing...
+
+ my($tmpfile, $tmpfilename) = tmpnam();
+ chown(0, 0, $tmpfilename); # root.root
+ chmod(0644, $tmpfilename);
+ unlink $tmpfilename or warn "can't unlink temporary file $tmpfile: $!\n";
+ print $tmpfile $source_data;
+
+
+
+
+ # Extract the default values from the original PPD...
+
+ my %orig_default_types = get_default_types(ORIG);
+ my %new_default_types = get_default_types($tmpfile);
+ my %defaults = get_defaults(ORIG);
+ my %options = get_options($tmpfile, %new_default_types);
+
+
+ # Close original and temporary files...
+
+ close ORIG or die "$_: can't close file: $!";
+ close $tmpfile or die "can't close temporary file $tmpfile: $!";
+
+
+ if ($debug) {
+ print "Original Default Types:\n";
+ foreach (sort keys %orig_default_types) {
+ print " $_: $orig_default_types{$_}\n";
+ }
+ print "New Default Types:\n";
+ foreach (sort keys %new_default_types) {
+ print " $_: $new_default_types{$_}\n";
+ }
+ print "Defaults:\n";
+ foreach (sort keys %defaults) {
+ print " $_: $defaults{$_}\n";
+ }
+ print "Options:\n";
+ foreach (sort keys %options) {
+ print " $_: ";
+ foreach my $opt (@{$options{$_}}) {
+ print "$opt ";
+ }
+ print "\n";
+ }
+
+ }
+
+ # Update source buffer with old defaults...
+
+ # Loop through each default in turn.
+default_loop:
+ foreach (sort keys %defaults) {
+ my $default_option = $_;
+ my $option;
+ ($option = $_) =~ s/Default//; # Strip off `Default'
+ # Check method is valid
+ my $orig_method = $orig_default_types{$option};
+ my $new_method = $new_default_types{$option};
+ if ((!defined($orig_method) || !defined($new_method)) ||
+ $orig_method ne $new_method) {
+ next;
+ }
+ if ($new_method eq "PickOne") {
+ # Check the old setting is valid
+ foreach (@{$options{$option}}) {
+ if ($defaults{$default_option} eq $_) { # Valid option
+ # Set the option in the new PPD
+ $source_data =~ s/\*($default_option).*/*$1:$defaults{$default_option}/m;
+ if ($verbose) {
+ print "$ppd_source_filename: Set *$default_option to $defaults{$default_option}\n";
+ }
+ next default_loop;
+ }
+ }
+ printf STDERR
+ "$ppd_source_filename: Invalid option: *$default_option: $defaults{$default_option}. Skipped.\n";
+ next;
+ }
+ print STDERR
+ "$ppd_source_filename: PPD OpenUI method $new_default_types{$_} not understood. Skipped\n";
+ }
+
+
+ # Write new PPD...
+
+ my $tmpnew = "${ppd_source_filename}.new";
+ if (! open NEWPPD, "> $tmpnew") {
+ warn "Can't open $tmpnew for writing: $!\n";
+ return 0;
+ }
+ chown(0, 0, $tmpnew); # Bad idea to hardcode this...
+ chmod(0644, $tmpnew); # Bad idea to hardcode this...
+ print NEWPPD $source_data;
+ if (! close NEWPPD) {
+ warn "Can't close ${tmpnew}.new for writing: $!\n";
+ unlink $tmpnew;
+ return 0;
+ }
+
+ if (! rename $tmpnew, $ppd_source_filename) {
+ warn "Can't rename $tmpnew to $ppd_source_filename: $!\n";
+ unlink $tmpnew;
+ return 0;
+ }
+
+ if (!$quiet || $verbose) {
+ print STDOUT "Updated $ppd_source_filename using $source\n";
+ }
+ return 1;
+ # All done!
+}
+
+# Find a suitable source PPD file
+sub find_ppd ($$$$) {
+ my($gutenprintfilename, $drivername, $lang, $region) = @_;
+ my $file; # filename to return
+ my ($key) = '^\\*FileVersion:[ ]*"@VERSION@"$';
+ my ($lingo, $suffix, $base, $basedir);
+ my ($current_best_file, $current_best_time);
+ my ($stored_name, $stored_dir);
+ $stored_name = $gutenprintfilename;
+ $stored_name =~ s,.*/([^/]*)(.gz)?$,$1,;
+ $stored_dir = $gutenprintfilename;
+ $stored_dir =~ s,(.*)/([^/]*)$,$1,;
+
+ $current_best_file = "";
+ $current_best_time = 0;
+
+ # All possible candidates, in order of usefulness and gzippedness
+ foreach $lingo ("${lang}_${region}/",
+ "$lang/",
+ "en/",
+ "C/",
+ "") {
+ foreach $suffix (".ppd$gzext",
+ ".ppd") {
+ foreach $base ("${drivername}.$version",
+ "stp-${drivername}.$version",
+ $stored_name,
+ $drivername) {
+ foreach $basedir ($ppd_base_dir,
+ $stored_dir,
+ $ppd_root_dir) {
+ if (! $basedir || ! $base) { next; }
+ my ($fn) = "$basedir/$lingo$base$suffix";
+ if ($debug) {
+ print "Trying $fn for $gutenprintfilename, $lang, $region\n";
+ }
+# Check that it is a regular file, owned by root.root, not writable
+# by other, and is readable by root. i.e. the file is secure.
+ my @sb = stat $fn or next;
+ if (S_ISREG($sb[2]) && ($sb[4] == 0) && ($sb[5] == 0)) {
+# !(S_IWOTH & $sb[2]) && (S_IRUSR & $sb[2])) {
+ # Check that the file is a valid Gutenprint PPD file
+ # of the correct version.
+ my $file_version;
+ if ($fn =~ m/\.gz$/) {
+ $file_version = `gunzip -c $fn | grep '$key'`;
+ } else {
+ $file_version = `cat $fn | grep '$key'`;
+ }
+ if ($file_version ne "") {
+ if ($debug) {
+ print " Format valid: time $sb[9] best $current_best_time prev $current_best_file cur $fn!\n";
+ }
+ if ($sb[9] > $current_best_time) {
+ $current_best_time = $sb[9];
+ $current_best_file = $fn;
+ }
+ } elsif ($debug) {
+ print " Format invalid\n";
+ }
+ }
+ else {
+ $_ = $fn;
+ if (! -d $fn && ! /\/$/) {
+ print STDERR "$fn: not a regular file, or insecure ownership and permissions. Skipped\n";
+ }
+ }
+ }
+ }
+ }
+ }
+ if ($current_best_file) {
+ return $current_best_file;
+ }
+# Yikes! Cannot find a valid PPD file!
+ return undef;
+}
+
+# Return the default options from the given PPD filename
+sub get_default_types(*) {
+ my $fh = $_[0];
+ my %default_types;
+
+ # Read each line of the original PPD file, and store all OpenUI
+ # names and their types in a hash...
+ seek ($fh, 0, 0) or die "can't seek to start of PPD file";
+ while (<$fh>) {
+ if ( m/^\*OpenUI/ ) {
+ chomp;
+ my ($key, $value) = /^\*OpenUI\s\*([[:alnum:]]+).*:\s([[:alnum:]]+)/;
+ if ($key && $value) {
+ $default_types{$key}=$value;
+ }
+ }
+ }
+ return %default_types;
+}
+
+
+# Return the default options from the given PPD filename
+sub get_defaults(*) {
+ my $fh = $_[0];
+ my %defaults;
+
+ # Read each line of the original PPD file, and store all default
+ # names and their values in a hash...
+ seek ($fh, 0, 0) or die "can't seek to start of PPD file";
+ while (<$fh>) {
+ if ( m/^\*Default/ ) {
+ chomp;
+ my($key, $value) = /^\*([[:alnum:]]+):\s*([[:alnum:]]+)/;
+ if ($key && $value) {
+ $defaults{$key}=$value;
+ }
+ }
+ }
+ return %defaults;
+}
+
+
+# Return the available options from the given PPD filename
+sub get_options(*\%) {
+ my $fh = $_[0];
+ my $validopts = $_[1];
+ my %options;
+
+ # For each valid option name, grab each valid option for that name
+ # and store in a hash of arrays...
+
+ foreach (sort keys %$validopts) {
+ my $tmp = $_;
+ my @optionlist;
+
+ seek ($fh, 0, 0) or die "can't seek to start of PPD file";
+ while (<$fh>) {
+ if ( m/^\*$tmp/ ) {
+ chomp;
+ my ($value) = /^\*$tmp\s*([[:alnum:]]+)[\/:]/;
+ if ($value) {
+ push @optionlist, $value;
+ }
+ }
+ }
+ if (@optionlist) {
+ $options{$tmp} = [ @optionlist ];
+ }
+ }
+ return %options;
+}
diff --git a/src/cups/epson.c b/src/cups/epson.c
index d102f3a..434c1ae 100644
--- a/src/cups/epson.c
+++ b/src/cups/epson.c
@@ -1,5 +1,5 @@
/*
- * "$Id: epson.c,v 1.3.2.5 2003/01/25 00:51:41 rlk Exp $"
+ * "$Id: epson.c,v 1.6 2002/12/22 21:03:32 rleigh Exp $"
*
* EPSON backend for the Common UNIX Printing System.
*
@@ -765,5 +765,5 @@ list_devices(void)
/*
- * End of "$Id: epson.c,v 1.3.2.5 2003/01/25 00:51:41 rlk Exp $".
+ * End of "$Id: epson.c,v 1.6 2002/12/22 21:03:32 rleigh Exp $".
*/
diff --git a/src/cups/genppd.c b/src/cups/genppd.c
index 537bb26..f7f6e62 100644
--- a/src/cups/genppd.c
+++ b/src/cups/genppd.c
@@ -1,9 +1,9 @@
/*
- * "$Id: genppd.c,v 1.36.2.15 2004/06/12 20:04:05 rlk Exp $"
+ * "$Id: genppd.c,v 1.107 2005/04/23 00:26:07 rlk Exp $"
*
* PPD file generation program for the CUPS drivers.
*
- * Copyright 1993-2003 by Easy Software Products.
+ * Copyright 1993-2005 by Easy Software Products and Robert Krawitz.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License,
@@ -32,7 +32,12 @@
* main() - Process files on the command-line...
* initialize_stp_options() - Initialize the min/max values for
* each STP numeric option.
- * usage() - Show program usage...
+ * usage() - Show program usage.
+ * help() - Show detailed program usage.
+ * getlangs() - Get available translations.
+ * printlangs() - Show available translations.
+ * printmodels() - Show available printer models.
+ * checkcat() - Check message catalogue exists.
* write_ppd() - Write a PPD file.
*/
@@ -45,6 +50,8 @@
#endif
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
+#include <dirent.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
@@ -59,13 +66,8 @@
#include <cups/cups.h>
#include <cups/raster.h>
-#ifdef INCLUDE_GIMP_PRINT_H
-#include INCLUDE_GIMP_PRINT_H
-#else
-#include <gimp-print/gimp-print.h>
-#endif
-#include <gimp-print/gimp-print-intl.h>
-#include "../../lib/libprintut.h"
+#include <gutenprint/gutenprint.h>
+#include <gutenprint/gutenprint-intl.h>
/*
* Note:
@@ -74,19 +76,19 @@
* so we can report Level 3 support by default...
*/
-#ifndef CUPS_PPD_PS_LEVEL
-# define CUPS_PPD_PS_LEVEL 3
-#endif
+int cups_ppd_ps_level = CUPS_PPD_PS_LEVEL;
+static const char *cups_modeldir = CUPS_MODELDIR;
/*
* File handling stuff...
*/
+static const char *ppdext = ".ppd";
#ifdef HAVE_LIBZ
-# define PPDEXT ".ppd.gz"
+static const char *gzext = ".gz";
#else
-# define PPDEXT ".ppd"
+static const char *gzext = "";
# define gzFile FILE *
# define gzopen fopen
# define gzclose fclose
@@ -102,6 +104,7 @@
#define DEFAULT_SIZE "Letter"
/*#define DEFAULT_SIZE "A4"*/
+#define CATALOG "LC_MESSAGES/gutenprint.mo"
typedef struct /**** Media size values ****/
{
@@ -115,56 +118,33 @@ typedef struct /**** Media size values ****/
top; /* Media top margin */
} paper_t;
-
-/*
- * STP option data...
- */
-
-static struct /**** STP numeric options ****/
+const char *special_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" },
-#ifndef __APPLE__
- { "stpCyan", "Cyan" },
- { "stpMagenta", "Magenta" },
- { "stpYellow", "Yellow" },
- { "stpSaturation", "Saturation" }
-#else
- { "stpSaturation", "Saturation" },
- { "stpCyan", "Cyan" },
- { "stpMagenta", "Magenta" },
- { "stpYellow", "Yellow" }
-#endif /* __APPLE__ */
+ "PageSize",
+ "MediaType",
+ "InputSlot",
+ "Resolution",
+ "OutputOrder",
+ "Quality",
+ "ImageType",
+ "Duplex",
+ NULL
};
-/*
- * Mapping between manufacturer names embedded in the printer name and
- * manufacturer names authorized in the PPD specification.
- * If printers of other manufacturers are added, this table must
- * be extended.
- */
-static struct
+const char *parameter_class_names[] =
{
- const char *manufacturer_embedded_name;
- const char *manufacturer_real_name;
-} stp_manufacturers[] =
+ N_("Printer Features"),
+ N_("Output Control")
+};
+
+const char *parameter_level_names[] =
{
- { "CANON", "Canon" },
- { "EPSON", "Epson" },
- { "HP", "HP" },
- { "LEXMARK", "Lexmark" },
- { "APPLE", "Apple" },
- { NULL, NULL }
+ N_("Common"),
+ N_("Extra 1"),
+ N_("Extra 2"),
+ N_("Extra 3"),
+ N_("Extra 4"),
+ N_("Extra 5")
};
@@ -172,60 +152,96 @@ static struct
* 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);
-const char *find_manufacturer_from_name(const char *name);
+void help(void);
+char ** getlangs(void);
+static int stpi_scandir (const char *dir,
+ struct dirent ***namelist,
+ int (*sel) (const struct dirent *),
+ int (*cmp) (const void *, const void *));
+int checkcat (const struct dirent *localedir);
+void printlangs(char** langs);
+void printmodels(int verbose);
+int write_ppd(const stp_printer_t *p, const char *prefix,
+ const char *language, int verbose);
+
+/*
+ * Global variables...
+ */
+const char *baselocaledir = PACKAGE_LOCALE_DIR;
+
+static int
+is_special_option(const char *name)
+{
+ int i = 0;
+ while (special_options[i])
+ {
+ if (strcmp(name, special_options[i]) == 0)
+ return 1;
+ i++;
+ }
+ return 0;
+}
+
+static void
+print_group_open(FILE *fp, stp_parameter_class_t p_class,
+ stp_parameter_level_t p_level)
+{
+ /* TRANSLATORS: "Gutenprint" is a proper name, not a description */
+ gzprintf(fp, "*OpenGroup: %s %s %s\n\n", _("Gutenprint"),
+ _(parameter_class_names[p_class]),
+ _(parameter_level_names[p_level]));
+}
+
+static void
+print_group_close(FILE *fp, stp_parameter_class_t p_class,
+ stp_parameter_level_t p_level)
+{
+ gzprintf(fp, "*CloseGroup: %s %s %s\n\n", _("Gutenprint"),
+ _(parameter_class_names[p_class]),
+ _(parameter_level_names[p_level]));
+}
/*
* '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 /* 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, (int) 'h'},
- {"verbose", no_argument, 0, (int) 'v'},
- {"quiet", no_argument, 0, (int) 'q'},
- {"catalog", required_argument, 0, (int) 'c'},
- {"prefix", required_argument, 0, (int) 'p'},
- {0, 0, 0, 0}
- };
+ int i; /* Looping var */
+ const char *prefix; /* Directory prefix for output */
+ const char *language = NULL; /* Language */
+ const stp_printer_t *printer; /* Pointer to printer driver */
+ int verbose = 0; /* Verbose messages */
+ char **langs = NULL; /* Available translations */
+ char **models = NULL; /* Models to output, all if NULL */
+ int opt_printlangs = 0; /* Print available translations */
+ int opt_printmodels = 0;/* Print available models */
/*
* Parse command-line args...
*/
- prefix = "ppd";
- language = "C";
-
- initialize_stp_options();
-
- option_index = 0;
+ prefix = CUPS_MODELDIR;
for (;;)
{
- if ((i = getopt_long(argc, argv, "hvqc:p:", long_options,
- &option_index)) == -1)
+ if ((i = getopt(argc, argv, "23hvqc:p:l:LMVd:")) == -1)
break;
switch (i)
{
+ case '2':
+ cups_ppd_ps_level = 2;
+ break;
+ case '3':
+ cups_ppd_ps_level = 3;
+ break;
case 'h':
- usage();
+ help();
break;
case 'v':
verbose = 1;
@@ -234,9 +250,9 @@ main(int argc, /* I - Number of command-line arguments */
verbose = 0;
break;
case 'c':
- catalog = optarg;
+ baselocaledir = optarg;
#ifdef DEBUG
- fprintf (stderr, "DEBUG: catalog: %s\n", catalog);
+ fprintf (stderr, "DEBUG: baselocaledir: %s\n", baselocaledir);
#endif
break;
case 'p':
@@ -245,14 +261,73 @@ main(int argc, /* I - Number of command-line arguments */
fprintf (stderr, "DEBUG: prefix: %s\n", prefix);
#endif
break;
+ case 'l':
+ language = optarg;
+ break;
+ case 'L':
+ opt_printlangs = 1;
+ break;
+ case 'M':
+ opt_printmodels = 1;
+ break;
+ case 'd':
+ cups_modeldir = optarg;
+ break;
+ case 'V':
+ printf("cups-genppd version %s, "
+ "Copyright (c) 1993-2005 by Easy Software Products and Robert Krawitz.\n\n",
+ VERSION);
+ printf("Default CUPS PPD PostScript Level: %d\n", cups_ppd_ps_level);
+ printf("Default PPD location (prefix): %s\n", CUPS_MODELDIR);
+ printf("Default base locale directory: %s\n\n", PACKAGE_LOCALE_DIR);
+ puts("This program is free software; you can redistribute it and/or\n"
+ "modify it under the terms of the GNU General Public License,\n"
+ "version 2, as published by the Free Software Foundation.\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, please contact Easy Software\n"
+ "Products at:\n"
+ "\n"
+ " Attn: CUPS Licensing Information\n"
+ " Easy Software Products\n"
+ " 44141 Airport View Drive, Suite 204\n"
+ " Hollywood, Maryland 20636-3111 USA\n"
+ "\n"
+ " Voice: (301) 373-9603\n"
+ " EMail: cups-info@cups.org\n"
+ " WWW: http://www.cups.org\n");
+ exit (EXIT_SUCCESS);
+ break;
default:
usage();
+ exit (EXIT_FAILURE);
break;
}
}
+ if (optind < argc) {
+ int n, numargs;
+ numargs = argc-optind;
+ models = stp_malloc((numargs+1) * sizeof(char*));
+ for (n=0; n<numargs; n++)
+ {
+ models[n] = argv[optind+n];
+ }
+ models[numargs] = (char*) NULL;
+
+ n=0;
+ }
+
+#ifdef ENABLE_NLS
+ langs = getlangs();
+#endif
/*
- * Initialise libgimpprint
+ * Initialise libgutenprint
*/
stp_init();
@@ -261,7 +336,21 @@ main(int argc, /* I - Number of command-line arguments */
* Set the language...
*/
+ if (language)
+ {
+ unsetenv("LC_CTYPE");
+ unsetenv("LC_COLLATE");
+ unsetenv("LC_TIME");
+ unsetenv("LC_NUMERIC");
+ unsetenv("LC_MONETARY");
+ unsetenv("LC_MESSAGES");
+ unsetenv("LC_ALL");
+ unsetenv("LANG");
+ setenv("LC_ALL", language, 1);
+ setenv("LANG", language, 1);
+ }
setlocale(LC_ALL, "");
+
#ifdef LC_NUMERIC
setlocale(LC_NUMERIC, "C");
#endif /* LC_NUMERIC */
@@ -270,190 +359,423 @@ main(int argc, /* I - Number of command-line arguments */
* Set up the catalog
*/
- if (catalog)
+#ifdef ENABLE_NLS
+ if (baselocaledir)
{
- if ((bindtextdomain(PACKAGE, catalog)) == NULL)
+ if ((bindtextdomain(PACKAGE, baselocaledir)) == NULL)
{
- fprintf(stderr, "genppd: cannot load message catalog %s: %s\n", catalog,
- strerror(errno));
- exit(1);
+ fprintf(stderr, "cups-genppd: cannot load message catalog %s under %s: %s\n",
+ PACKAGE, baselocaledir, strerror(errno));
+ exit(EXIT_FAILURE);
}
#ifdef DEBUG
- fprintf (stderr, "DEBUG: bound textdomain: %s\n", catalog);
+ fprintf (stderr, "DEBUG: bound textdomain: %s under %s\n",
+ PACKAGE, baselocaledir);
#endif
if ((textdomain(PACKAGE)) == NULL)
{
- fprintf(stderr, "genppd: cannot select message catalog %s: %s\n",
- catalog, strerror(errno));
- exit(1);
+ fprintf(stderr, "cups-genppd: cannot select message catalog %s under %s: %s\n",
+ PACKAGE, baselocaledir, strerror(errno));
+ exit(EXIT_FAILURE);
}
#ifdef DEBUG
fprintf (stderr, "DEBUG: textdomain set: %s\n", PACKAGE);
#endif
}
+#endif
+
+ /*
+ * Print lists
+ */
+
+ if (opt_printlangs)
+ {
+ printlangs(langs);
+ exit (EXIT_SUCCESS);
+ }
+
+ if (opt_printmodels)
+ {
+ printmodels(verbose);
+ exit (EXIT_SUCCESS);
+ }
/*
* 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 (models)
+ {
+ int n;
+ for (n=0; models[n]; n++)
+ {
+ printer = stp_get_printer_by_driver(models[n]);
+ if (!printer)
+ printer = stp_get_printer_by_long_name(models[n]);
+
+ if (printer)
+ {
+ if (write_ppd(printer, prefix, language, verbose))
+ return 1;
+ }
+ else
+ {
+ printf("Driver not found: %s\n", models[n]);
+ return (1);
+ }
+ }
+ stp_free(models);
+ }
+ else
+ {
+ for (i = 0; i < stp_printer_model_count(); i++)
+ {
+ printer = stp_get_printer_by_index(i);
+ if (printer && write_ppd(printer, prefix, language, verbose))
+ return (1);
+ }
+ }
if (!verbose)
- fprintf(stderr, "\n");
+ fprintf(stderr, " done.\n");
+ if (langs)
+ {
+ char **langs_tmp = langs;
+ while (*langs_tmp)
+ {
+ stp_free(*langs_tmp);
+ langs_tmp++;
+ }
+ stp_free(langs);
+ }
return (0);
}
-
/*
- * 'initialize_stp_options()' - Initialize the min/max values for
- * each STP numeric option.
+ * 'usage()' - Show program usage...
*/
void
-initialize_stp_options(void)
+usage(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;
-
-#ifndef __APPLE__
- 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;
-#else
- stp_options[4].low = 1000 * stp_get_saturation(lower);
- stp_options[4].high = 1000 * stp_get_saturation(upper);
- stp_options[4].defval = 1000 * stp_get_saturation(defvars);
- stp_options[4].step = 50;
-
- stp_options[5].low = 1000 * stp_get_cyan(lower);
- stp_options[5].high = 1000 * stp_get_cyan(upper);
- stp_options[5].defval = 1000 * stp_get_cyan(defvars);
- stp_options[5].step = 50;
-
- stp_options[6].low = 1000 * stp_get_magenta(lower);
- stp_options[6].high = 1000 * stp_get_magenta(upper);
- stp_options[6].defval = 1000 * stp_get_magenta(defvars);
- stp_options[6].step = 50;
-
- stp_options[7].low = 1000 * stp_get_yellow(lower);
- stp_options[7].high = 1000 * stp_get_yellow(upper);
- stp_options[7].defval = 1000 * stp_get_yellow(defvars);
- stp_options[7].step = 50;
-#endif /* __APPLE__ */
+ puts("Usage: cups-genppd [-c localedir] "
+ "[-l locale] [-p prefix] [-q] [-v] models...\n"
+ " cups-genppd -L [-c localedir]\n"
+ " cups-genppd -M [-v]\n"
+ " cups-genppd -h\n"
+ " cups-genppd -V\n");
}
+void
+help(void)
+{
+ puts("Generate Gutenprint PPD files for use with CUPS\n\n");
+ usage();
+ puts("\nExamples: LANG=de_DE cups-genppd -p ppd -c /usr/share/locale\n"
+ " cups-genppd -L -c /usr/share/locale\n"
+ " cups-genppd -M -v\n\n"
+ "Commands:\n"
+ " -h Show this help message.\n"
+ " -L List available translations (message catalogs).\n"
+ " -M List available printer models.\n"
+ " -V Show version information and defaults.\n"
+ " The default is to output PPDs.\n"
+ "Options:\n"
+ " -c localedir Use localedir as the base directory for locale data.\n"
+ " -l locale Output PPDs translated with messages for locale.\n"
+ " -p prefix Output PPDs in directory prefix.\n"
+ " -d prefix Embed directory prefix in PPD file.\n"
+ " -q Quiet mode.\n"
+ " -v Verbose mode.\n"
+ "models:\n"
+ " A list of printer models, either the driver or quoted full name.\n");
+}
/*
- * 'usage()' - Show program usage...
+ * 'dirent_sort()' - sort directory entries
*/
+static int
+dirent_sort(const void *a,
+ const void *b)
+{
+ return strcoll ((*(const struct dirent *const *) a)->d_name,
+ (*(const struct dirent *const *) b)->d_name);
+}
-void
-usage(void)
+/*
+ * 'getlangs()' - Get a list of available translations
+ */
+
+char **
+getlangs(void)
{
- fputs("Usage: genppd [--help] [--catalog=domain] "
- "[--language=locale] [--prefix=dir]\n", stderr);
+ struct dirent** langdirs;
+ int n;
+ char **langs;
+
+ n = stpi_scandir (baselocaledir, &langdirs, checkcat, dirent_sort);
+ if (n >= 0)
+ {
+ int idx;
+ langs = stp_malloc((n+1) * sizeof(char*));
+ for (idx = 0; idx < n; ++idx)
+ {
+ langs[idx] = (char*) stp_malloc((strlen(langdirs[idx]->d_name)+1) * sizeof(char));
+ strcpy(langs[idx], langdirs[idx]->d_name);
+ free (langdirs[idx]); /* Must use plain free() */
+ }
+ langs[n] = NULL;
+ free (langdirs); /* Must use plain free() */
+ }
+ else
+ return NULL;
- exit(EXIT_FAILURE);
+ return langs;
}
-const char *
-find_manufacturer_from_name(const char *name)
+
+/*
+ * 'printlangs()' - Print list of available translations
+ */
+
+void printlangs(char **langs)
{
- int i = 0;
- while (stp_manufacturers[i].manufacturer_real_name)
+ if (langs)
{
- if (strncasecmp(name, stp_manufacturers[i].manufacturer_embedded_name,
- strlen(stp_manufacturers[i].manufacturer_embedded_name)) == 0)
- return stp_manufacturers[i].manufacturer_real_name;
- i++;
+ int n = 0;
+ while (langs && langs[n])
+ {
+ printf("%s\n", langs[n]);
+ n++;
+ }
+ }
+ exit (EXIT_SUCCESS);
+}
+
+
+/*
+ * 'printmodels' - Print a list of available models
+ */
+
+void printmodels(int verbose)
+{
+ const stp_printer_t *p;
+ int i;
+
+ for (i = 0; i < stp_printer_model_count(); i++)
+ {
+ p = stp_get_printer_by_index(i);
+ if (p &&
+ strcmp(stp_printer_get_family(p), "ps") != 0 &&
+ strcmp(stp_printer_get_family(p), "raw") != 0)
+ {
+ if(verbose)
+ printf("%-20s%s\n", stp_printer_get_driver(p),
+ stp_printer_get_long_name(p));
+ else
+ printf("%s\n", stp_printer_get_driver(p));
+ }
+ }
+ exit (EXIT_SUCCESS);
+}
+
+/* Adapted from GNU libc <dirent.h>
+ These macros extract size information from a `struct dirent *'.
+ They may evaluate their argument multiple times, so it must not
+ have side effects. Each of these may involve a relatively costly
+ call to `strlen' on some systems, so these values should be cached.
+
+ _D_EXACT_NAMLEN (DP) returns the length of DP->d_name, not including
+ its terminating null character.
+
+ _D_ALLOC_NAMLEN (DP) returns a size at least (_D_EXACT_NAMLEN (DP) + 1);
+ that is, the allocation size needed to hold the DP->d_name string.
+ Use this macro when you don't need the exact length, just an upper bound.
+ This macro is less likely to require calling `strlen' than _D_EXACT_NAMLEN.
+ */
+
+#ifdef _DIRENT_HAVE_D_NAMLEN
+# ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(d) ((d)->d_namlen)
+# endif
+# ifndef _D_ALLOC_NAMLEN
+# define _D_ALLOC_NAMLEN(d) (_D_EXACT_NAMLEN (d) + 1)
+# endif
+#else
+# ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(d) (strlen ((d)->d_name))
+# endif
+# ifndef _D_ALLOC_NAMLEN
+# ifdef _DIRENT_HAVE_D_RECLEN
+# define _D_ALLOC_NAMLEN(d) (((char *) (d) + (d)->d_reclen) - &(d)->d_name[0])
+# else
+# define _D_ALLOC_NAMLEN(d) (sizeof (d)->d_name > 1 ? sizeof (d)->d_name : \
+ _D_EXACT_NAMLEN (d) + 1)
+# endif
+# endif
+#endif
+
+/*
+ * 'stpi_scandir()' - BSD scandir() replacement.
+ */
+
+static int
+stpi_scandir (const char *dir,
+ struct dirent ***namelist,
+ int (*sel) (const struct dirent *),
+ int (*cmp) (const void *, const void *))
+{
+ DIR *dp = opendir (dir);
+ struct dirent **v = NULL;
+ size_t vsize = 0, i;
+ struct dirent *d;
+ int save;
+
+ if (dp == NULL)
+ return -1;
+
+ save = errno;
+ errno = 0;
+
+ i = 0;
+ while ((d = readdir (dp)) != NULL)
+ if (sel == NULL || (*sel) (d))
+ {
+ struct dirent *vnew;
+ size_t dsize;
+
+ /* Ignore errors from sel or readdir */
+ errno = 0;
+
+ if (i == vsize)
+ {
+ struct dirent **new;
+ if (vsize == 0)
+ vsize = 10;
+ else
+ vsize *= 2;
+ new = (struct dirent **) realloc (v, vsize * sizeof (*v));
+ if (new == NULL)
+ break;
+ v = new;
+ }
+
+ dsize = &d->d_name[_D_ALLOC_NAMLEN (d)] - (char *) d;
+ vnew = (struct dirent *) malloc (dsize);
+ if (vnew == NULL)
+ break;
+
+ v[i++] = (struct dirent *) memcpy (vnew, d, dsize);
+ }
+
+ if (errno != 0)
+ {
+ save = errno;
+
+ while (i > 0)
+ free (v[--i]);
+ free (v);
+
+ i = -1;
}
- fprintf(stderr, "Cannot determine manufacturer of %s\n!", name);
- abort();
- return NULL;
+ else
+ {
+ /* Sort the list if we have a comparison function to sort with. */
+ if (cmp != NULL)
+ qsort (v, i, sizeof (*v), cmp);
+
+ *namelist = v;
+ }
+
+ (void) closedir (dp);
+ errno = save;
+
+ return i;
}
+/*
+ * 'checkcat()' - A callback for stpi_scandir() to check
+ * if a message catalogue exists
+ */
+
+int
+checkcat (const struct dirent *localedir)
+{
+ char* catpath;
+ int catlen, status = 0, savederr;
+ struct stat catstat;
+
+ savederr = errno; /* since we are a callback, preserve stpi_scandir() state */
+
+ /* LOCALEDIR / LANG / LC_MESSAGES/CATALOG */
+ /* Add 3, for two '/' separators and '\0' */
+ catlen = strlen(baselocaledir) + strlen(localedir->d_name) + strlen(CATALOG) + 3;
+ catpath = (char*) stp_malloc(catlen * sizeof(char));
+
+ strncpy (catpath, baselocaledir, strlen(baselocaledir));
+ catlen = strlen(baselocaledir);
+ *(catpath+catlen) = '/';
+ catlen++;
+ strncpy (catpath+catlen, localedir->d_name, strlen(localedir->d_name));
+ catlen += strlen(localedir->d_name);
+ *(catpath+catlen) = '/';
+ catlen++;
+ strncpy (catpath+catlen, CATALOG, strlen(CATALOG));
+ catlen += strlen(CATALOG);
+ *(catpath+catlen) = '\0';
+
+ if (!stat (catpath, &catstat))
+ {
+ if (S_ISREG(catstat.st_mode))
+ {
+ status = 1;
+ }
+ }
+
+ stp_free (catpath);
+
+ errno = savederr;
+ return status;
+}
/*
* 'write_ppd()' - Write a PPD file.
*/
int /* O - Exit status */
-write_ppd(const stp_printer_t p, /* I - Printer driver */
+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 */
+ const char *language,
int verbose)
{
- int i, j; /* Looping vars */
+ int i, j, k, l; /* Looping vars */
gzFile fp; /* File to write to */
char filename[1024]; /* Filename */
- const char *driverptr; /* Pointer into driver name */
- const char *manufacturer; /* 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 */
+ 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 */
+ const char *manufacturer; /* Manufacturer of printer */
+ const stp_vars_t *printvars; /* Printer option names */
paper_t *the_papers; /* Media sizes */
int cur_opt; /* Current option */
+ struct stat dir; /* prefix dir status */
int variable_sizes; /* Does the driver support variable sizes? */
int min_width, /* Min/max custom size */
min_height,
max_width,
max_height;
-
+ stp_parameter_t desc;
+ stp_parameter_list_t param_list;
+ const stp_param_string_t *opt;
+ int has_quality_parameter = 0;
+ int has_image_type_parameter = 0;
+ int printer_is_color = 0;
/*
* Initialize driver-specific variables...
@@ -461,9 +783,8 @@ write_ppd(const stp_printer_t p, /* I - Printer driver */
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);
+ manufacturer = stp_printer_get_manufacturer(p);
+ printvars = stp_printer_get_defaults(p);
the_papers = NULL;
cur_opt = 0;
@@ -471,16 +792,37 @@ write_ppd(const stp_printer_t p, /* I - Printer driver */
* Skip the PostScript drivers...
*/
- if (strcmp(driver, "ps") == 0 ||
- strcmp(driver, "ps2") == 0)
+ if (strcmp(stp_printer_get_family(p), "ps") == 0 ||
+ strcmp(stp_printer_get_family(p), "raw") == 0)
return (0);
/*
* Make sure the destination directory exists...
*/
- mkdir(prefix, 0777);
- sprintf(filename, "%s/%s" PPDEXT, prefix, driver);
+
+ if (stat(prefix, &dir) && !S_ISDIR(dir.st_mode))
+ {
+ if (mkdir(prefix, 0777))
+ {
+ printf("cups-genppd: Cannot create directory %s: %s\n",
+ prefix, strerror(errno));
+ exit (EXIT_FAILURE);
+ }
+ }
+
+ /*
+ * The files will be named stp-<driver>.<major>.<minor>.ppd, for
+ * example:
+ *
+ * stp-escp2-ex.5.0.ppd
+ *
+ * or
+ *
+ * stp-escp2-ex.5.0.ppd.gz
+ */
+ snprintf(filename, sizeof(filename) - 1, "%s/stp-%s.%s%s%s",
+ prefix, driver, GUTENPRINT_RELEASE_VERSION, ppdext, gzext);
/*
* Open the PPD file...
@@ -488,7 +830,7 @@ write_ppd(const stp_printer_t p, /* I - Printer driver */
if ((fp = gzopen(filename, "wb")) == NULL)
{
- fprintf(stderr, "genppd: Unable to create file \"%s\" - %s.\n",
+ fprintf(stderr, "cups-genppd: Unable to create file \"%s\" - %s.\n",
filename, strerror(errno));
return (2);
}
@@ -497,18 +839,27 @@ write_ppd(const stp_printer_t p, /* I - Printer driver */
* Write a standard header...
*/
- manufacturer = find_manufacturer_from_name(long_name);
-
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, "*%PPD file for CUPS/Gutenprint.\n");
+ gzputs(fp, "*%Copyright 1993-2005 by Easy Software Products and Robert Krawitz.\n");
+ gzputs(fp, "*%This program is free software; you can redistribute it and/or\n");
+ gzputs(fp, "*%modify it under the terms of the GNU General Public License,\n");
+ gzputs(fp, "*%version 2, as published by the Free Software Foundation.\n");
+ gzputs(fp, "*%\n");
+ gzputs(fp, "*%This program is distributed in the hope that it will be useful, but\n");
+ gzputs(fp, "*%WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n");
+ gzputs(fp, "*%or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\n");
+ gzputs(fp, "*%for more details.\n");
+ gzputs(fp, "*%\n");
+ gzputs(fp, "*%You should have received a copy of the GNU General Public License\n");
+ gzputs(fp, "*%along with this program; if not, write to the Free Software\n");
+ gzputs(fp, "*%Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n");
+ gzputs(fp, "*%\n");
gzputs(fp, "*FormatVersion: \"4.3\"\n");
gzputs(fp, "*FileVersion: \"" VERSION "\"\n");
/* Specify language of PPD translation */
@@ -526,10 +877,9 @@ write_ppd(const stp_printer_t p, /* I - Printer driver */
* The following code generates a (hopefully unique) 8.3 filename from
* the driver name, and makes the filename all UPPERCASE as well...
*/
-
+
gzprintf(fp, "*PCFileName: \"STP%05d.PPD\"\n",
stp_get_printer_index_by_driver(driver));
-
gzprintf(fp, "*Manufacturer: \"%s\"\n", manufacturer);
/*
@@ -541,6 +891,7 @@ write_ppd(const stp_printer_t p, /* I - Printer driver */
gzputs(fp, "*Product: \"(AFPL Ghostscript)\"\n");
gzputs(fp, "*Product: \"(GNU Ghostscript)\"\n");
gzputs(fp, "*Product: \"(ESP Ghostscript)\"\n");
+ gzputs(fp, "*Product: \"(GPL Ghostscript)\"\n");
/*
* The ModelName attribute now provides the long name rather than the
@@ -555,84 +906,128 @@ write_ppd(const stp_printer_t p, /* I - Printer driver */
* with commas. Now use a dash instead...
*/
- gzprintf(fp, "*NickName: \"%s - CUPS+Gimp-Print v" VERSION "\"\n",
- long_name);
-#if CUPS_PPD_PS_LEVEL == 2
- gzputs(fp, "*PSVersion: \"(2017.000) 550\"\n");
-#else
- gzputs(fp, "*PSVersion: \"(3010.000) 705\"\n");
-#endif /* CUPS_PPD_PS_LEVEL == 2 */
- gzprintf(fp, "*LanguageLevel: \"%d\"\n", CUPS_PPD_PS_LEVEL);
-
- /* Assume that color printers are inkjets and should have pages reversed */
- if (stp_get_output_type(printvars) == OUTPUT_COLOR)
+ /*
+ * NOTE - code in rastertoprinter looks for this version string.
+ * If this is changed, the corresponding change must be made in
+ * rastertoprinter.c. Look for "ppd->nickname"
+ */
+ gzprintf(fp, "*NickName: \"%s%s%s\"\n",
+ long_name, CUPS_PPD_NICKNAME_STRING, VERSION);
+ if (cups_ppd_ps_level == 2)
+ gzputs(fp, "*PSVersion: \"(2017.000) 550\"\n");
+ else
{
- gzputs(fp, "*ColorDevice: True\n");
- gzputs(fp, "*DefaultColorSpace: RGB\n");
+ gzputs(fp, "*PSVersion: \"(3010.000) 550\"\n");
+ gzputs(fp, "*PSVersion: \"(3010.000) 651\"\n");
+ gzputs(fp, "*PSVersion: \"(3010.000) 652\"\n");
+ gzputs(fp, "*PSVersion: \"(3010.000) 653\"\n");
+ gzputs(fp, "*PSVersion: \"(3010.000) 704\"\n");
+ gzputs(fp, "*PSVersion: \"(3010.000) 705\"\n");
+ gzputs(fp, "*PSVersion: \"(3010.000) 707\"\n");
+ gzputs(fp, "*PSVersion: \"(3010.000) 800\"\n");
+ gzputs(fp, "*PSVersion: \"(3010.000) 815\"\n");
+ gzputs(fp, "*PSVersion: \"(3010.000) 850\"\n");
+ gzputs(fp, "*PSVersion: \"(3010.000) 81501\"\n");
}
- else
+ gzprintf(fp, "*LanguageLevel: \"%d\"\n", cups_ppd_ps_level);
+
+ /* Set Job Mode to "Job" as this enables the Duplex option */
+ v = stp_vars_create_copy(printvars);
+ stp_set_string_parameter(v, "JobMode", "Job");
+
+ /* Assume that color printers are inkjets and should have pages reversed */
+ stp_describe_parameter(v, "PrintingMode", &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_STRING_LIST)
{
- gzputs(fp, "*ColorDevice: False\n");
- gzputs(fp, "*DefaultColorSpace: Gray\n");
+ if (stp_string_list_is_present(desc.bounds.str, "Color"))
+ {
+ printer_is_color = 1;
+ gzputs(fp, "*ColorDevice: True\n");
+ }
+ else
+ {
+ printer_is_color = 0;
+ gzputs(fp, "*ColorDevice: False\n");
+ }
+ if (strcmp(desc.deflt.str, "Color") == 0)
+ gzputs(fp, "*DefaultColorSpace: RGB\n");
+ else
+ gzputs(fp, "*DefaultColorSpace: Gray\n");
}
+ stp_parameter_description_destroy(&desc);
gzputs(fp, "*FileSystem: False\n");
gzputs(fp, "*LandscapeOrientation: Plus90\n");
gzputs(fp, "*TTRasterizer: Type42\n");
- gzputs(fp, "*RequiresPageRegion All: True\n");
gzputs(fp, "*cupsVersion: 1.1\n");
- gzprintf(fp, "*cupsModelNumber: \"%d\"\n", model);
+ gzprintf(fp, "*cupsModelNumber: \"0\"\n");
gzputs(fp, "*cupsManualCopies: True\n");
- gzputs(fp, "*cupsFilter: \"application/vnd.cups-raster 100 rastertoprinter\"\n");
+ gzprintf(fp, "*cupsFilter: \"application/vnd.cups-raster 100 rastertogutenprint.%s\"\n", GUTENPRINT_RELEASE_VERSION);
if (strcasecmp(manufacturer, "EPSON") == 0)
gzputs(fp, "*cupsFilter: \"application/vnd.cups-command 33 commandtoepson\"\n");
gzputs(fp, "\n");
+ gzprintf(fp, "*StpDriverName: \"%s\"\n", driver);
+ gzprintf(fp, "*StpPPDLocation: \"%s%s%s/stp-%s.%s%s%s\"\n",
+ cups_modeldir,
+ cups_modeldir[strlen(cups_modeldir) - 1] == '/' ? "" : "/",
+ language ? language : "C",
+ driver,
+ GUTENPRINT_RELEASE_VERSION,
+ ppdext,
+ gzext);
+ gzprintf(fp, "*StpLocale: \"%s\"\n", language ? language : "C");
/*
* Get the page sizes from the driver...
*/
- v = stp_allocate_copy(printvars);
+ if (printer_is_color)
+ stp_set_string_parameter(v, "PrintingMode", "Color");
+ else
+ stp_set_string_parameter(v, "PrintingMode", "BW");
+ stp_set_string_parameter(v, "ChannelBitDepth", "8");
variable_sizes = 0;
- opts = (*(printfuncs->parameters))(p, NULL, "PageSize", &num_opts);
- defopt = (*(printfuncs->default_parameters))(p, NULL, "PageSize");
- the_papers = malloc(sizeof(paper_t) * num_opts);
+ stp_describe_parameter(v, "PageSize", &desc);
+ num_opts = stp_string_list_count(desc.bounds.str);
+ the_papers = stp_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);
+ const stp_papersize_t *papersize;
+ opt = stp_string_list_param(desc.bounds.str, i);
+ papersize = stp_get_papersize_by_name(opt->name);
if (!papersize)
{
- printf("Unable to lookup size %s!\n", opts[i].name);
+ printf("Unable to lookup size %s!\n", opt->name);
continue;
}
- if (strcmp(opts[i].name, "Custom") == 0)
+ if (strcmp(opt->name, "Custom") == 0)
{
variable_sizes = 1;
continue;
}
- width = stp_papersize_get_width(papersize);
- height = stp_papersize_get_height(papersize);
+ width = papersize->width;
+ height = papersize->height;
if (width <= 0 || height <= 0)
continue;
- stp_set_media_size(v, opts[i].name);
+ stp_set_string_parameter(v, "PageSize", opt->name);
- (*(printfuncs->media_size))(p, v, &width, &height);
- (*(printfuncs->imageable_area))(p, v, &left, &right, &bottom, &top);
+ stp_get_media_size(v, &width, &height);
+ stp_get_imageable_area(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].name = opt->name;
+ the_papers[cur_opt].text = opt->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;
+ the_papers[cur_opt].bottom = height - bottom;
+ the_papers[cur_opt].top = height - top;
cur_opt++;
}
@@ -646,7 +1041,7 @@ write_ppd(const stp_printer_t p, /* I - Printer driver */
gzputs(fp, "*OpenUI *PageSize: PickOne\n");
gzputs(fp, "*OrderDependency: 10 AnySetup *PageSize\n");
- gzprintf(fp, "*DefaultPageSize: %s\n", defopt);
+ gzprintf(fp, "*DefaultPageSize: %s\n", desc.deflt.str);
for (i = 0; i < cur_opt; i ++)
{
gzprintf(fp, "*PageSize %s", the_papers[i].name);
@@ -657,7 +1052,7 @@ write_ppd(const stp_printer_t p, /* I - Printer driver */
gzputs(fp, "*OpenUI *PageRegion: PickOne\n");
gzputs(fp, "*OrderDependency: 10 AnySetup *PageRegion\n");
- gzprintf(fp, "*DefaultPageRegion: %s\n", defopt);
+ gzprintf(fp, "*DefaultPageRegion: %s\n", desc.deflt.str);
for (i = 0; i < cur_opt; i ++)
{
gzprintf(fp, "*PageRegion %s", the_papers[i].name);
@@ -666,7 +1061,7 @@ write_ppd(const stp_printer_t p, /* I - Printer driver */
}
gzputs(fp, "*CloseUI: *PageRegion\n\n");
- gzprintf(fp, "*DefaultImageableArea: %s\n", defopt);
+ gzprintf(fp, "*DefaultImageableArea: %s\n", desc.deflt.str);
for (i = 0; i < cur_opt; i ++)
{
gzprintf(fp, "*ImageableArea %s", the_papers[i].name);
@@ -676,7 +1071,7 @@ write_ppd(const stp_printer_t p, /* I - Printer driver */
}
gzputs(fp, "\n");
- gzprintf(fp, "*DefaultPaperDimension: %s\n", defopt);
+ gzprintf(fp, "*DefaultPaperDimension: %s\n", desc.deflt.str);
for (i = 0; i < cur_opt; i ++)
{
@@ -688,16 +1083,16 @@ write_ppd(const stp_printer_t p, /* I - Printer driver */
if (variable_sizes)
{
- (*(printfuncs->limit))(p, v, &max_width, &max_height,
- &min_width, &min_height);
- stp_set_media_size(v, "Custom");
- (*(printfuncs->media_size))(p, v, &width, &height);
- (*(printfuncs->imageable_area))(p, v, &left, &right, &bottom, &top);
+ stp_get_size_limit(v, &max_width, &max_height,
+ &min_width, &min_height);
+ stp_set_string_parameter(v, "PageSize", "Custom");
+ stp_get_media_size(v, &width, &height);
+ stp_get_imageable_area(v, &left, &right, &bottom, &top);
gzprintf(fp, "*MaxMediaWidth: \"%d\"\n", max_width);
gzprintf(fp, "*MaxMediaHeight: \"%d\"\n", max_height);
gzprintf(fp, "*HWMargins: %d %d %d %d\n",
- left, bottom, width - right, height - top);
+ left, height - bottom, width - right, top);
gzputs(fp, "*CustomPageSize True: \"pop pop pop <</PageSize[5 -2 roll]/ImagingBBox null>>setpagedevice\"\n");
gzprintf(fp, "*ParamCustomPageSize Width: 1 points %d %d\n",
min_width, max_width);
@@ -708,32 +1103,18 @@ write_ppd(const stp_printer_t p, /* I - Printer driver */
gzputs(fp, "*ParamCustomPageSize Orientation: 5 int 0 0\n\n");
}
- if (opts)
- {
- for (i = 0; i < num_opts; i++)
- {
- free((void *)opts[i].name);
- free((void *)opts[i].text);
- }
-
- free(opts);
- }
-
+ stp_parameter_description_destroy(&desc);
if (the_papers)
- free(the_papers);
-
-#ifdef __APPLE__
- gzputs(fp, "*OpenGroup: MAIN/Basic settings\n");
-#endif
+ stp_free(the_papers);
/*
* Do we support color?
*/
- gzputs(fp, "*OpenUI *ColorModel: PickOne\n");
+ gzputs(fp, "*OpenUI *ColorModel/Color Model: PickOne\n");
gzputs(fp, "*OrderDependency: 10 AnySetup *ColorModel\n");
- if (stp_get_output_type(printvars) == OUTPUT_COLOR)
+ if (printer_is_color)
gzputs(fp, "*DefaultColorModel: RGB\n");
else
gzputs(fp, "*DefaultColorModel: Gray\n");
@@ -741,100 +1122,176 @@ write_ppd(const stp_printer_t p, /* I - Printer driver */
gzprintf(fp, "*ColorModel Gray/Grayscale:\t\"<<"
"/cupsColorSpace %d"
"/cupsColorOrder %d"
- "/cupsBitsPerColor 8>>setpagedevice\"\n",
+ ">>setpagedevice\"\n",
CUPS_CSPACE_W, CUPS_ORDER_CHUNKED);
- gzprintf(fp, "*ColorModel Black/Black & White:\t\"<<"
+ gzprintf(fp, "*ColorModel Black/Inverted Grayscale:\t\"<<"
"/cupsColorSpace %d"
"/cupsColorOrder %d"
- "/cupsBitsPerColor 8>>setpagedevice\"\n",
+ ">>setpagedevice\"\n",
CUPS_CSPACE_K, CUPS_ORDER_CHUNKED);
- if (stp_get_output_type(printvars) == OUTPUT_COLOR)
+ if (printer_is_color)
{
- gzprintf(fp, "*ColorModel RGB/Color:\t\"<<"
+ gzprintf(fp, "*ColorModel RGB/RGB Color:\t\"<<"
"/cupsColorSpace %d"
"/cupsColorOrder %d"
- "/cupsBitsPerColor 8>>setpagedevice\"\n",
+ ">>setpagedevice\"\n",
CUPS_CSPACE_RGB, CUPS_ORDER_CHUNKED);
- gzprintf(fp, "*ColorModel CMYK/Raw CMYK:\t\"<<"
+ gzprintf(fp, "*ColorModel CMY/CMY Color:\t\"<<"
+ "/cupsColorSpace %d"
+ "/cupsColorOrder %d"
+ ">>setpagedevice\"\n",
+ CUPS_CSPACE_CMY, CUPS_ORDER_CHUNKED);
+ gzprintf(fp, "*ColorModel CMYK/CMYK:\t\"<<"
"/cupsColorSpace %d"
"/cupsColorOrder %d"
- "/cupsBitsPerColor 8>>setpagedevice\"\n",
+ ">>setpagedevice\"\n",
CUPS_CSPACE_CMYK, CUPS_ORDER_CHUNKED);
+ gzprintf(fp, "*ColorModel KCMY/KCMY:\t\"<<"
+ "/cupsColorSpace %d"
+ "/cupsColorOrder %d"
+ ">>setpagedevice\"\n",
+ CUPS_CSPACE_KCMY, CUPS_ORDER_CHUNKED);
}
gzputs(fp, "*CloseUI: *ColorModel\n\n");
+ /*
+ * 8 or 16 bit color (16 bit is slower)
+ */
+ gzputs(fp, "*OpenUI *StpColorPrecision/Color Precision: PickOne\n");
+ gzputs(fp, "*OrderDependency: 10 AnySetup *StpColorPrecision\n");
+ gzputs(fp, "*DefaultStpColorPrecision: Normal\n");
+ gzputs(fp, "*StpColorPrecision Normal/Normal:\t\"<<"
+ "/cupsBitsPerColor 8>>setpagedevice\"\n");
+ gzputs(fp, "*StpColorPrecision Best/Best:\t\"<<"
+ "/cupsBitsPerColor 8"
+ "/cupsPreferredBitsPerColor 16>>setpagedevice\"\n");
+ gzputs(fp, "*CloseUI: *StpColorPrecision\n\n");
+
/*
* Media types...
*/
- opts = (*(printfuncs->parameters))(p, NULL, "MediaType", &num_opts);
- defopt = (*(printfuncs->default_parameters))(p, NULL, "MediaType");
+ stp_describe_parameter(v, "MediaType", &desc);
+ num_opts = stp_string_list_count(desc.bounds.str);
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);
+ gzprintf(fp, "*DefaultMediaType: %s\n", desc.deflt.str);
for (i = 0; i < num_opts; i ++)
{
+ opt = stp_string_list_param(desc.bounds.str, i);
gzprintf(fp, "*MediaType %s/%s:\t\"<</MediaType(%s)>>setpagedevice\"\n",
- opts[i].name, opts[i].text, opts[i].name);
- free((void *)opts[i].name);
- free((void *)opts[i].text);
+ opt->name, opt->text, opt->name);
}
- free(opts);
-
gzputs(fp, "*CloseUI: *MediaType\n\n");
}
+ stp_parameter_description_destroy(&desc);
/*
* Input slots...
*/
- opts = (*(printfuncs->parameters))(p, NULL, "InputSlot", &num_opts);
- defopt = (*(printfuncs->default_parameters))(p, NULL, "InputSlot");
+ stp_describe_parameter(v, "InputSlot", &desc);
+ num_opts = stp_string_list_count(desc.bounds.str);
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);
+ gzprintf(fp, "*DefaultInputSlot: %s\n", desc.deflt.str);
for (i = 0; i < num_opts; i ++)
{
+ opt = stp_string_list_param(desc.bounds.str, i);
gzprintf(fp, "*InputSlot %s/%s:\t\"<</MediaClass(%s)>>setpagedevice\"\n",
- opts[i].name, opts[i].text, opts[i].name);
- free((void *)opts[i].name);
- free((void *)opts[i].text);
+ opt->name, opt->text, opt->name);
}
- free(opts);
-
gzputs(fp, "*CloseUI: *InputSlot\n\n");
}
+ stp_parameter_description_destroy(&desc);
+
+ /*
+ * Quality settings
+ */
+
+ stp_describe_parameter(v, "Quality", &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_STRING_LIST && desc.is_active)
+ {
+ stp_clear_string_parameter(v, "Resolution");
+ has_quality_parameter = 1;
+ gzprintf(fp, "*OpenUI *StpQuality/%s: PickOne\n", _(desc.text));
+ gzputs(fp, "*OrderDependency: 5 AnySetup *StpQuality\n");
+ gzprintf(fp, "*DefaultStpQuality: %s\n", desc.deflt.str);
+ num_opts = stp_string_list_count(desc.bounds.str);
+ for (i = 0; i < num_opts; i++)
+ {
+ opt = stp_string_list_param(desc.bounds.str, i);
+ stp_set_string_parameter(v, "Quality", opt->name);
+ stp_describe_resolution(v, &xdpi, &ydpi);
+ if (xdpi == -1 || ydpi == -1)
+ gzprintf(fp, "*StpQuality %s/%s: \"\"\n", opt->name, opt->text);
+ else
+ gzprintf(fp, "*StpQuality %s/%s:\t\"<</HWResolution[%d %d]>>setpagedevice\"\n",
+ opt->name, opt->text, xdpi, ydpi);
+ }
+ gzputs(fp, "*CloseUI: *StpQuality\n\n");
+ }
+ stp_parameter_description_destroy(&desc);
+ stp_clear_string_parameter(v, "Quality");
+
+ /*
+ * Image type
+ */
+
+ stp_describe_parameter(v, "ImageType", &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_STRING_LIST && desc.is_active)
+ {
+ has_image_type_parameter = 1;
+ gzprintf(fp, "*OpenUI *StpImageType/%s: PickOne\n", _(desc.text));
+ gzputs(fp, "*OrderDependency: 5 AnySetup *StpImageType\n");
+ gzprintf(fp, "*DefaultStpImageType: %s\n", desc.deflt.str);
+ num_opts = stp_string_list_count(desc.bounds.str);
+ for (i = 0; i < num_opts; i++)
+ {
+ opt = stp_string_list_param(desc.bounds.str, i);
+ gzprintf(fp, "*StpImageType %s/%s: \"\"\n", opt->name, opt->text);
+ }
+ gzputs(fp, "*CloseUI: *StpImageType\n\n");
+ }
+ stp_parameter_description_destroy(&desc);
/*
* Resolutions...
*/
- opts = (*(printfuncs->parameters))(p, NULL, "Resolution", &num_opts);
- defopt = (*(printfuncs->default_parameters))(p, NULL, "Resolution");
+ stp_describe_parameter(v, "Resolution", &desc);
+ num_opts = stp_string_list_count(desc.bounds.str);
gzprintf(fp, "*OpenUI *Resolution/%s: PickOne\n", _("Resolution"));
gzputs(fp, "*OrderDependency: 20 AnySetup *Resolution\n");
- gzprintf(fp, "*DefaultResolution: %s\n", defopt);
+ if (has_quality_parameter)
+ gzprintf(fp, "*DefaultResolution: None\n");
+ else
+ gzprintf(fp, "*DefaultResolution: %s\n", desc.deflt.str);
+ stp_clear_string_parameter(v, "Quality");
+ if (has_quality_parameter)
+ gzprintf(fp, "*Resolution None/%s: \"\"\n", _("Automatic"));
for (i = 0; i < num_opts; i ++)
{
/*
* Strip resolution name to its essentials...
*/
-
- (printfuncs->describe_resolution)(p, opts[i].name, &xdpi, &ydpi);
+ opt = stp_string_list_param(desc.bounds.str, i);
+ stp_set_string_parameter(v, "Resolution", opt->name);
+ stp_describe_resolution(v, &xdpi, &ydpi);
/* This should not happen! */
if (xdpi == -1 || ydpi == -1)
@@ -845,158 +1302,358 @@ write_ppd(const stp_printer_t p, /* I - Printer driver */
*/
gzprintf(fp, "*Resolution %s/%s:\t\"<</HWResolution[%d %d]/cupsCompression %d>>setpagedevice\"\n",
- opts[i].name, opts[i].text, xdpi, ydpi, i);
- free((void *)opts[i].name);
- free((void *)opts[i].text);
+ opt->name, opt->text, xdpi, ydpi, i);
}
- free(opts);
+ stp_parameter_description_destroy(&desc);
gzputs(fp, "*CloseUI: *Resolution\n\n");
- /*
- * STP option group...
- */
-
-#ifndef __APPLE__
- gzprintf(fp, "*OpenGroup: STP/%s\n", _("GIMP-print"));
-#endif
-
- /*
- * 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\"<</cupsRowCount 0>>setpagedevice\"\n",
- _("Line Art"));
- gzprintf(fp, "*stpImageType SolidTone/%s:\t\"<</cupsRowCount 1>>setpagedevice\"\n",
- _("Solid Colors"));
- gzprintf(fp, "*stpImageType Continuous/%s:\t\"<</cupsRowCount 2>>setpagedevice\"\n",
- _("Photograph"));
-
- gzputs(fp, "*CloseUI: *stpImageType\n\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: \"<</cupsRowStep %d>>setpagedevice\"\n",
- stp_dither_algorithm_name(i), stp_dither_algorithm_text(i), i);
-
- gzputs(fp, "*CloseUI: *stpDither\n\n");
-
- /*
- * InkTypes...
- */
+ stp_describe_parameter(v, "OutputOrder", &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_STRING_LIST)
+ {
+ gzputs(fp, "*OpenUI *OutputOrder: PickOne\n");
+ gzputs(fp, "*OrderDependency: 10 AnySetup *OutputOrder\n");
+ gzprintf(fp, "*DefaultOutputOrder: %s\n", desc.deflt.str);
+ gzputs(fp, "*OutputOrder Normal/Normal: \"\"\n");
+ gzputs(fp, "*OutputOrder Reverse/Reverse: \"\"\n");
+ gzputs(fp, "*CloseUI: *OutputOrder\n\n");
+ }
+ stp_parameter_description_destroy(&desc);
- opts = (*(printfuncs->parameters))(p, NULL, "InkType", &num_opts);
- defopt = (*(printfuncs->default_parameters))(p, NULL, "InkType");
+ /*
+ * Duplex
+ * Note that the opt->name strings MUST match those in the printer driver(s)
+ * else the PPD files will not be generated correctly
+ */
- if (num_opts > 0)
+ stp_describe_parameter(v, "Duplex", &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_STRING_LIST)
{
- 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 ++)
+ num_opts = stp_string_list_count(desc.bounds.str);
+ if (num_opts > 0)
{
- /*
- * Write the inktype option...
- */
-
- gzprintf(fp, "*stpInkType %s/%s:\t\"<</OutputType(%s)>>setpagedevice\"\n",
- opts[i].name, opts[i].text, opts[i].name);
- free((void *)opts[i].name);
- free((void *)opts[i].text);
+ gzputs(fp, "*OpenUI *Duplex/Double-Sided Printing: PickOne\n");
+ gzputs(fp, "*OrderDependency: 20 AnySetup *Duplex\n");
+ gzprintf(fp, "*DefaultDuplex: %s\n", desc.deflt.str);
+
+ for (i = 0; i < num_opts; i++)
+ {
+ opt = stp_string_list_param(desc.bounds.str, i);
+ if (strcmp(opt->name, "None") == 0)
+ gzprintf(fp, "*Duplex %s/%s: \"<</Duplex false>>setpagedevice\"\n", opt->name, opt->text);
+ else if (strcmp(opt->name, "DuplexNoTumble") == 0)
+ gzprintf(fp, "*Duplex %s/%s: \"<</Duplex true/Tumble false>>setpagedevice\"\n", opt->name, opt->text);
+ else if (strcmp(opt->name, "DuplexTumble") == 0)
+ gzprintf(fp, "*Duplex %s/%s: \"<</Duplex true/Tumble true>>setpagedevice\"\n", opt->name, opt->text);
+ }
+ gzputs(fp, "*CloseUI: *Duplex\n\n");
}
-
- free(opts);
-
- gzputs(fp, "*CloseUI: *stpInkType\n\n");
}
-
-#ifdef __APPLE__
- gzputs(fp, "*CloseGroup: MAIN\n\n");
- gzputs(fp, "*OpenGroup: STP/Expert adjustments\n");
-#endif /* __APPLE__ */
+ stp_parameter_description_destroy(&desc);
- /*
- * Advanced STP options...
- */
+ param_list = stp_get_parameter_list(v);
- if (stp_get_output_type(printvars) == OUTPUT_COLOR)
-#ifndef __APPLE__
- num_opts = 8;
- else
- num_opts = 4;
-
- for (i = 0; i < num_opts; i ++)
-#else
+ for (j = 0; j <= STP_PARAMETER_CLASS_OUTPUT; j++)
{
- num_opts = 8;
-
- for (i = 0; i < 5; i ++)
-#endif /* __APPLE__ */
+ for (k = 0; k <= STP_PARAMETER_LEVEL_ADVANCED4; k++)
+ {
+ int printed_open_group = 0;
+ size_t param_count = stp_parameter_list_count(param_list);
+ for (l = 0; l < param_count; l++)
+ {
+ int print_close_ui = 1;
+ const stp_parameter_t *lparam =
+ stp_parameter_list_param(param_list, l);
+ if (lparam->p_class != j || lparam->p_level != k ||
+ is_special_option(lparam->name) || lparam->read_only ||
+ (lparam->p_type != STP_PARAMETER_TYPE_STRING_LIST &&
+ lparam->p_type != STP_PARAMETER_TYPE_BOOLEAN &&
+ lparam->p_type != STP_PARAMETER_TYPE_DIMENSION &&
+ lparam->p_type != STP_PARAMETER_TYPE_DOUBLE))
+ continue;
+ stp_describe_parameter(v, lparam->name, &desc);
+ if (desc.is_active)
+ {
+ int printed_default_value = 0;
+ if (!printed_open_group)
+ {
+ print_group_open(fp, j, k);
+ printed_open_group = 1;
+ }
+ gzprintf(fp, "*OpenUI *Stp%s/%s: PickOne\n",
+ desc.name, _(desc.text));
+#if 0
+ gzprintf(fp, "*OrderDependency: %d AnySetup *Stp%s\n",
+ (100 + l + (j * param_count) +
+ (k * STP_PARAMETER_LEVEL_INTERNAL * param_count)),
+ desc.name);
+#endif
+ if (!desc.is_mandatory)
+ gzprintf(fp, "*DefaultStp%s: None\n", desc.name);
+ switch (desc.p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ if (desc.is_mandatory)
+ gzprintf(fp, "*DefaultStp%s: %s\n",
+ desc.name, desc.deflt.str);
+ else
+ gzprintf(fp, "*Stp%s %s/%s: \"\"\n", desc.name,
+ "None", _("None"));
+ num_opts = stp_string_list_count(desc.bounds.str);
+ for (i = 0; i < num_opts; i++)
+ {
+ opt = stp_string_list_param(desc.bounds.str, i);
+ gzprintf(fp, "*Stp%s %s/%s: \"\"\n",
+ desc.name, opt->name, _(opt->text));
+ }
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ if (desc.is_mandatory)
+ gzprintf(fp, "*DefaultStp%s: %s\n", desc.name,
+ desc.deflt.boolean ? "True" : "False");
+ else
+ gzprintf(fp, "*Stp%s %s/%s: \"\"\n", desc.name,
+ "None", _("None"));
+ gzprintf(fp, "*Stp%s %s/%s: \"\"\n",
+ desc.name, "False", _("No"));
+ gzprintf(fp, "*Stp%s %s/%s: \"\"\n",
+ desc.name, "True", _("Yes"));
+ break;
+ case STP_PARAMETER_TYPE_DOUBLE:
+ if (desc.is_mandatory)
+ {
+ gzprintf(fp, "*DefaultStp%s: None\n", desc.name);
+ }
+ for (i = desc.bounds.dbl.lower * 1000;
+ i <= desc.bounds.dbl.upper * 1000 ; i += 100)
+ {
+ if (desc.deflt.dbl * 1000 == i && desc.is_mandatory)
+ {
+ gzprintf(fp, "*Stp%s None/%.3f: \"\"\n",
+ desc.name, ((double) i) * .001);
+ printed_default_value = 1;
+ }
+ else
+ gzprintf(fp, "*Stp%s %d/%.3f: \"\"\n",
+ desc.name, i, ((double) i) * .001);
+ }
+ if (!desc.is_mandatory)
+ gzprintf(fp, "*Stp%s None/None: \"\"\n",
+ desc.name, desc.deflt.dbl);
+ else if (! printed_default_value)
+ gzprintf(fp, "*Stp%s None/%.3f: \"\"\n",
+ desc.name, desc.deflt.dbl);
+ gzprintf(fp, "*CloseUI: *Stp%s\n\n", desc.name);
+ gzprintf(fp, "*OpenUI *StpFine%s/%s %s: PickOne\n",
+ desc.name, _(desc.text), _("Fine Adjustment"));
+ gzprintf(fp, "*DefaultStpFine%s:None\n", desc.name);
+ gzprintf(fp, "*StpFine%s None/0.000: \"\"\n", desc.name);
+ for (i = 0; i < 100; i += 5)
+ gzprintf(fp, "*StpFine%s %d/%.3f: \"\"\n",
+ desc.name, i, ((double) i) * .001);
+ gzprintf(fp, "*CloseUI: *StpFine%s\n\n", desc.name);
+ print_close_ui = 0;
+
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ if (desc.is_mandatory)
+ gzprintf(fp, "*DefaultStp%s: %d\n",
+ desc.name, desc.deflt.dimension);
+ else
+ gzprintf(fp, "*Stp%s %s/%s: \"\"\n", desc.name,
+ "None", _("None"));
+ for (i = desc.bounds.dimension.lower;
+ i <= desc.bounds.dimension.upper; i++)
+ {
+ /* FIXME
+ * For now, just use mm; we'll fix it later
+ * for the locale-appropriate setting.
+ * --rlk 20040818
+ */
+ gzprintf(fp, "*Stp%s %d/%.1f mm: \"\"\n",
+ desc.name, i, ((double) i) * 25.4 / 72);
+ }
+ gzprintf(fp, "*CloseUI: *Stp%s\n\n", desc.name);
+ print_close_ui = 0;
+
+ break;
+ default:
+ break;
+ }
+ if (print_close_ui)
+ gzprintf(fp, "*CloseUI: *Stp%s\n\n", desc.name);
+ }
+ stp_parameter_description_destroy(&desc);
+ }
+ if (printed_open_group)
+ print_group_close(fp, j, k);
+ }
+ }
+ if (has_quality_parameter)
{
- 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\n", stp_options[i].name);
+ stp_parameter_t qdesc;
+ const char *tname = NULL;
+ stp_describe_parameter(v, "Quality", &qdesc);
+ if (qdesc.p_type == STP_PARAMETER_TYPE_STRING_LIST &&
+ stp_string_list_count(qdesc.bounds.str) > 1)
+ {
+ for (l = 0; l < stp_string_list_count(qdesc.bounds.str); l++)
+ {
+ opt = stp_string_list_param(qdesc.bounds.str, l);
+ if (opt && strcmp(opt->name, "None") != 0)
+ {
+ tname = opt->name;
+ break;
+ }
+ }
+ }
+ for (l = 0; l < stp_parameter_list_count(param_list); l++)
+ {
+ const stp_parameter_t *lparam =
+ stp_parameter_list_param(param_list, l);
+ if (lparam->p_class > STP_PARAMETER_CLASS_OUTPUT ||
+ lparam->p_level > STP_PARAMETER_LEVEL_ADVANCED4 ||
+ strcmp(lparam->name, "Quality") == 0 ||
+ (lparam->p_type != STP_PARAMETER_TYPE_STRING_LIST &&
+ lparam->p_type != STP_PARAMETER_TYPE_BOOLEAN &&
+ lparam->p_type != STP_PARAMETER_TYPE_DIMENSION &&
+ lparam->p_type != STP_PARAMETER_TYPE_DOUBLE))
+ continue;
+ stp_clear_string_parameter(v, "Quality");
+ stp_describe_parameter(v, lparam->name, &desc);
+ if (desc.is_active)
+ {
+ stp_parameter_description_destroy(&desc);
+ stp_set_string_parameter(v, "Quality", tname);
+ stp_describe_parameter(v, lparam->name, &desc);
+ if (!desc.is_active)
+ {
+ gzprintf(fp, "*UIConstraints: *StpQuality *Stp%s\n",
+ lparam->name);
+ gzprintf(fp, "*UIConstraints: *Stp%s *StpQuality\n\n",
+ lparam->name);
+ if (desc.p_type == STP_PARAMETER_TYPE_DOUBLE)
+ {
+ gzprintf(fp, "*UIConstraints: *StpQuality *StpFine%s\n",
+ lparam->name);
+ gzprintf(fp, "*UIConstraints: *StpFine%s *StpQuality\n\n",
+ lparam->name);
+ }
+ }
+ }
+ stp_clear_string_parameter(v, "Quality");
+ stp_parameter_description_destroy(&desc);
+ }
+ stp_parameter_description_destroy(&qdesc);
}
-
- /*
- * End of STP option group...
- */
-
- gzputs(fp, "*CloseGroup: STP\n\n");
-#ifdef __APPLE__
- gzputs(fp, "*OpenGroup: STPC/Expert color\n");
-
- for (i = 5; 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);
- }
-
- gzputs(fp, "*CloseGroup: STPC\n\n");
+ if (has_image_type_parameter)
+ {
+ stp_parameter_t qdesc;
+ const char *tname = NULL;
+ stp_describe_parameter(v, "ImageType", &qdesc);
+ if (qdesc.p_type == STP_PARAMETER_TYPE_STRING_LIST &&
+ stp_string_list_count(qdesc.bounds.str) > 1)
+ {
+ for (l = 0; l < stp_string_list_count(qdesc.bounds.str); l++)
+ {
+ opt = stp_string_list_param(qdesc.bounds.str, l);
+ if (opt && strcmp(opt->name, "None") != 0)
+ {
+ tname = opt->name;
+ break;
+ }
+ }
+ }
+ for (l = 0; l < stp_parameter_list_count(param_list); l++)
+ {
+ const stp_parameter_t *lparam =
+ stp_parameter_list_param(param_list, l);
+ if (lparam->p_class > STP_PARAMETER_CLASS_OUTPUT ||
+ lparam->p_level > STP_PARAMETER_LEVEL_ADVANCED4 ||
+ strcmp(lparam->name, "ImageType") == 0 ||
+ (lparam->p_type != STP_PARAMETER_TYPE_STRING_LIST &&
+ lparam->p_type != STP_PARAMETER_TYPE_BOOLEAN &&
+ lparam->p_type != STP_PARAMETER_TYPE_DIMENSION &&
+ lparam->p_type != STP_PARAMETER_TYPE_DOUBLE))
+ continue;
+ stp_clear_string_parameter(v, "ImageType");
+ stp_describe_parameter(v, lparam->name, &desc);
+ if (desc.is_active)
+ {
+ stp_parameter_description_destroy(&desc);
+ stp_set_string_parameter(v, "ImageType", tname);
+ stp_describe_parameter(v, lparam->name, &desc);
+ if (!desc.is_active)
+ {
+ gzprintf(fp, "*UIConstraints: *StpImageType *Stp%s\n",
+ lparam->name);
+ gzprintf(fp, "*UIConstraints: *Stp%s *StpImageType\n\n",
+ lparam->name);
+ if (desc.p_type == STP_PARAMETER_TYPE_DOUBLE)
+ {
+ gzprintf(fp, "*UIConstraints: *StpImageType *StpFine%s\n",
+ lparam->name);
+ gzprintf(fp, "*UIConstraints: *StpFine%s *StpImageType\n\n",
+ lparam->name);
+ }
+ }
+ }
+ stp_clear_string_parameter(v, "ImageType");
+ stp_parameter_description_destroy(&desc);
+ }
+ stp_parameter_description_destroy(&qdesc);
}
- else
+ if (printer_is_color)
{
- 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);
- }
-
- gzputs(fp, "*CloseGroup: STP\n\n");
+ for (l = 0; l < stp_parameter_list_count(param_list); l++)
+ {
+ const stp_parameter_t *lparam =
+ stp_parameter_list_param(param_list, l);
+ if (lparam->p_class > STP_PARAMETER_CLASS_OUTPUT ||
+ lparam->p_level > STP_PARAMETER_LEVEL_ADVANCED4 ||
+ strcmp(lparam->name, "Quality") == 0 ||
+ is_special_option(lparam->name) ||
+ (lparam->p_type != STP_PARAMETER_TYPE_STRING_LIST &&
+ lparam->p_type != STP_PARAMETER_TYPE_BOOLEAN &&
+ lparam->p_type != STP_PARAMETER_TYPE_DIMENSION &&
+ lparam->p_type != STP_PARAMETER_TYPE_DOUBLE))
+ continue;
+ stp_set_string_parameter(v, "PrintingMode", "Color");
+ stp_describe_parameter(v, lparam->name, &desc);
+ if (desc.is_active)
+ {
+ stp_parameter_description_destroy(&desc);
+ stp_set_string_parameter(v, "PrintingMode", "BW");
+ stp_describe_parameter(v, lparam->name, &desc);
+ if (!desc.is_active)
+ {
+ gzprintf(fp, "*UIConstraints: *ColorModel Gray *Stp%s\n",
+ lparam->name);
+ gzprintf(fp, "*UIConstraints: *ColorModel Black *Stp%s\n",
+ lparam->name);
+ gzprintf(fp, "*UIConstraints: *Stp%s *ColorModel Gray\n",
+ lparam->name);
+ gzprintf(fp, "*UIConstraints: *Stp%s *ColorModel Black\n\n",
+ lparam->name);
+ if (desc.p_type == STP_PARAMETER_TYPE_DOUBLE)
+ {
+ gzprintf(fp, "*UIConstraints: *ColorModel Gray *StpFine%s\n",
+ lparam->name);
+ gzprintf(fp, "*UIConstraints: *ColorModel Black *StpFine%s\n",
+ lparam->name);
+ gzprintf(fp, "*UIConstraints: *StpFine%s *ColorModel Gray\n",
+ lparam->name);
+ gzprintf(fp, "*UIConstraints: *StpFine%s *ColorModel Black\n\n",
+ lparam->name);
+ }
+ }
+ }
+ stp_parameter_description_destroy(&desc);
+ }
+ stp_set_string_parameter(v, "PrintingMode", "Color");
}
-#endif /* __APPLE__ */
+ stp_parameter_list_destroy(param_list);
/*
* Fonts...
@@ -1039,14 +1696,18 @@ write_ppd(const stp_printer_t p, /* I - Printer driver */
gzputs(fp, "*Font ZapfChancery-MediumItalic: Standard \"(001.007S)\" Standard ROM\n");
gzputs(fp, "*Font ZapfDingbats: Special \"(001.004S)\" Standard ROM\n");
- gzprintf(fp, "\n*%%End of %s.ppd\n", driver);
+ gzprintf(fp, "\n*%%End of stp-%s.%s%s\n",
+ driver,
+ GUTENPRINT_RELEASE_VERSION,
+ ppdext);
gzclose(fp);
- stp_free_vars(v);
+ stp_vars_destroy(v);
return (0);
}
+
/*
- * End of "$Id: genppd.c,v 1.36.2.15 2004/06/12 20:04:05 rlk Exp $".
+ * End of "$Id: genppd.c,v 1.107 2005/04/23 00:26:07 rlk Exp $".
*/
diff --git a/src/cups/rastertoprinter.c b/src/cups/rastertoprinter.c
index c88a0be..b9da368 100644
--- a/src/cups/rastertoprinter.c
+++ b/src/cups/rastertoprinter.c
@@ -1,7 +1,7 @@
/*
- * "$Id: rastertoprinter.c,v 1.19.4.15 2004/03/26 03:29:39 rlk Exp $"
+ * "$Id: rastertoprinter.c,v 1.96 2005/04/23 00:26:07 rlk Exp $"
*
- * GIMP-print based raster filter for the Common UNIX Printing System.
+ * Gutenprint based raster filter for the Common UNIX Printing System.
*
* Copyright 1993-2003 by Easy Software Products.
*
@@ -32,16 +32,11 @@
* 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_conclude() - Close the progress display.
* Image_width() - Return the width of an image.
*/
@@ -49,6 +44,9 @@
* Include necessary headers...
*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
#include <cups/cups.h>
#include <cups/ppd.h>
#include <cups/raster.h>
@@ -57,15 +55,11 @@
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
+#include <sys/times.h>
#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif
-#ifdef INCLUDE_GIMP_PRINT_H
-#include INCLUDE_GIMP_PRINT_H
-#else
-#include <gimp-print/gimp-print.h>
-#endif
-#include "../../lib/libprintut.h"
+#include <gutenprint/gutenprint.h>
/* Solaris with gcc has problems because gcc's limits.h doesn't #define */
/* this */
@@ -88,49 +82,480 @@ typedef struct
int top;
int width;
int height;
+ int adjusted_width;
+ int adjusted_height;
+ int last_percent;
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 cups_errfunc(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);
+ unsigned char *data,
+ size_t byte_limit, 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_conclude(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,
+ Image_conclude,
NULL
};
-static volatile stp_image_status_t Image_status;
+static volatile stp_image_status_t Image_status = STP_IMAGE_STATUS_OK;
+static double total_bytes_printed = 0;
+static int print_messages_as_errors = 0;
+
+static void
+set_string_parameter(stp_vars_t *v, const char *name, const char *val)
+{
+ fprintf(stderr, "DEBUG: Gutenprint set string %s to %s\n", name, val);
+ stp_set_string_parameter(v, name, val);
+}
+
+
+static void
+set_special_parameter(stp_vars_t *v, const char *name, int choice)
+{
+ stp_parameter_t desc;
+ stp_describe_parameter(v, name, &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_STRING_LIST)
+ {
+ if (choice >= stp_string_list_count(desc.bounds.str))
+ fprintf(stderr, "ERROR: Gutenprint unable to set %s!\n", name);
+ else
+ {
+ stp_set_string_parameter
+ (v, name, stp_string_list_param(desc.bounds.str, choice)->name);
+ fprintf(stderr, "DEBUG: Gutenprint set special parameter %s to choice %d (%s)\n",
+ name, choice,
+ stp_string_list_param(desc.bounds.str, choice)->name);
+ }
+ }
+ else
+ fprintf(stderr, "DEBUG: Gutenprint unable to set special %s: not a string\n",
+ name);
+ stp_parameter_description_destroy(&desc);
+}
+
+static void
+print_debug_block(const stp_vars_t *v, const cups_image_t *cups)
+{
+ stp_parameter_list_t params;
+ int nparams;
+ int i;
+ fprintf(stderr, "DEBUG: Gutenprint StartPage...\n");
+ fprintf(stderr, "DEBUG: Gutenprint MediaClass = \"%s\"\n", cups->header.MediaClass);
+ fprintf(stderr, "DEBUG: Gutenprint MediaColor = \"%s\"\n", cups->header.MediaColor);
+ fprintf(stderr, "DEBUG: Gutenprint MediaType = \"%s\"\n", cups->header.MediaType);
+ fprintf(stderr, "DEBUG: Gutenprint OutputType = \"%s\"\n", cups->header.OutputType);
+
+ fprintf(stderr, "DEBUG: Gutenprint AdvanceDistance = %d\n", cups->header.AdvanceDistance);
+ fprintf(stderr, "DEBUG: Gutenprint AdvanceMedia = %d\n", cups->header.AdvanceMedia);
+ fprintf(stderr, "DEBUG: Gutenprint Collate = %d\n", cups->header.Collate);
+ fprintf(stderr, "DEBUG: Gutenprint CutMedia = %d\n", cups->header.CutMedia);
+ fprintf(stderr, "DEBUG: Gutenprint Duplex = %d\n", cups->header.Duplex);
+ fprintf(stderr, "DEBUG: Gutenprint HWResolution = [ %d %d ]\n", cups->header.HWResolution[0],
+ cups->header.HWResolution[1]);
+ fprintf(stderr, "DEBUG: Gutenprint 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: Gutenprint InsertSheet = %d\n", cups->header.InsertSheet);
+ fprintf(stderr, "DEBUG: Gutenprint Jog = %d\n", cups->header.Jog);
+ fprintf(stderr, "DEBUG: Gutenprint LeadingEdge = %d\n", cups->header.LeadingEdge);
+ fprintf(stderr, "DEBUG: Gutenprint Margins = [ %d %d ]\n", cups->header.Margins[0],
+ cups->header.Margins[1]);
+ fprintf(stderr, "DEBUG: Gutenprint ManualFeed = %d\n", cups->header.ManualFeed);
+ fprintf(stderr, "DEBUG: Gutenprint MediaPosition = %d\n", cups->header.MediaPosition);
+ fprintf(stderr, "DEBUG: Gutenprint MediaWeight = %d\n", cups->header.MediaWeight);
+ fprintf(stderr, "DEBUG: Gutenprint MirrorPrint = %d\n", cups->header.MirrorPrint);
+ fprintf(stderr, "DEBUG: Gutenprint NegativePrint = %d\n", cups->header.NegativePrint);
+ fprintf(stderr, "DEBUG: Gutenprint NumCopies = %d\n", cups->header.NumCopies);
+ fprintf(stderr, "DEBUG: Gutenprint Orientation = %d\n", cups->header.Orientation);
+ fprintf(stderr, "DEBUG: Gutenprint OutputFaceUp = %d\n", cups->header.OutputFaceUp);
+ fprintf(stderr, "DEBUG: Gutenprint PageSize = [ %d %d ]\n", cups->header.PageSize[0],
+ cups->header.PageSize[1]);
+ fprintf(stderr, "DEBUG: Gutenprint Separations = %d\n", cups->header.Separations);
+ fprintf(stderr, "DEBUG: Gutenprint TraySwitch = %d\n", cups->header.TraySwitch);
+ fprintf(stderr, "DEBUG: Gutenprint Tumble = %d\n", cups->header.Tumble);
+ fprintf(stderr, "DEBUG: Gutenprint cupsWidth = %d\n", cups->header.cupsWidth);
+ fprintf(stderr, "DEBUG: Gutenprint cupsHeight = %d\n", cups->header.cupsHeight);
+ fprintf(stderr, "DEBUG: Gutenprint cups->width = %d\n", cups->width);
+ fprintf(stderr, "DEBUG: Gutenprint cups->height = %d\n", cups->height);
+ fprintf(stderr, "DEBUG: Gutenprint cups->adjusted_width = %d\n", cups->adjusted_width);
+ fprintf(stderr, "DEBUG: Gutenprint cups->adjusted_height = %d\n", cups->adjusted_height);
+ fprintf(stderr, "DEBUG: Gutenprint cupsMediaType = %d\n", cups->header.cupsMediaType);
+ fprintf(stderr, "DEBUG: Gutenprint cupsBitsPerColor = %d\n", cups->header.cupsBitsPerColor);
+ fprintf(stderr, "DEBUG: Gutenprint cupsBitsPerPixel = %d\n", cups->header.cupsBitsPerPixel);
+ fprintf(stderr, "DEBUG: Gutenprint cupsBytesPerLine = %d\n", cups->header.cupsBytesPerLine);
+ fprintf(stderr, "DEBUG: Gutenprint cupsColorOrder = %d\n", cups->header.cupsColorOrder);
+ fprintf(stderr, "DEBUG: Gutenprint cupsColorSpace = %d\n", cups->header.cupsColorSpace);
+ fprintf(stderr, "DEBUG: Gutenprint cupsCompression = %d\n", cups->header.cupsCompression);
+ fprintf(stderr, "DEBUG: Gutenprint cupsRowCount = %d\n", cups->header.cupsRowCount);
+ fprintf(stderr, "DEBUG: Gutenprint cupsRowFeed = %d\n", cups->header.cupsRowFeed);
+ fprintf(stderr, "DEBUG: Gutenprint cupsRowStep = %d\n", cups->header.cupsRowStep);
+ fprintf(stderr, "DEBUG: Gutenprint stp_get_driver(v) |%s|\n", stp_get_driver(v));
+ fprintf(stderr, "DEBUG: Gutenprint stp_get_left(v) |%d|\n", stp_get_left(v));
+ fprintf(stderr, "DEBUG: Gutenprint stp_get_top(v) |%d|\n", stp_get_top(v));
+ fprintf(stderr, "DEBUG: Gutenprint stp_get_page_width(v) |%d|\n", stp_get_page_width(v));
+ fprintf(stderr, "DEBUG: Gutenprint stp_get_page_height(v) |%d|\n", stp_get_page_height(v));
+ params = stp_get_parameter_list(v);
+ nparams = stp_parameter_list_count(params);
+ for (i = 0; i < nparams; i++)
+ {
+ const stp_parameter_t *p = stp_parameter_list_param(params, i);
+ switch (p->p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ fprintf(stderr, "DEBUG: Gutenprint stp_get_string %s(v) |%s| %d\n",
+ p->name, stp_get_string_parameter(v, p->name) ?
+ stp_get_string_parameter(v, p->name) : "NULL",
+ stp_get_string_parameter_active(v, p->name));
+ break;
+ case STP_PARAMETER_TYPE_DOUBLE:
+ fprintf(stderr, "DEBUG: Gutenprint stp_get_float %s(v) |%.3f| %d\n",
+ p->name, stp_get_float_parameter(v, p->name),
+ stp_get_float_parameter_active(v, p->name));
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ fprintf(stderr, "DEBUG: Gutenprint stp_get_dimension %s(v) |%d| %d\n",
+ p->name, stp_get_dimension_parameter(v, p->name),
+ stp_get_dimension_parameter_active(v, p->name));
+ break;
+ case STP_PARAMETER_TYPE_INT:
+ fprintf(stderr, "DEBUG: Gutenprint stp_get_int %s(v) |%d| %d\n",
+ p->name, stp_get_int_parameter(v, p->name),
+ stp_get_int_parameter_active(v, p->name));
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ fprintf(stderr, "DEBUG: Gutenprint stp_get_boolean %s(v) |%d| %d\n",
+ p->name, stp_get_boolean_parameter(v, p->name),
+ stp_get_boolean_parameter_active(v, p->name));
+ break;
+ /*
+ * We don't handle raw, curve, or filename arguments.
+ */
+ default:
+ break;
+ }
+ }
+ stp_parameter_list_destroy(params);
+}
+
+static int
+printer_supports_bw(const stp_vars_t *v)
+{
+ stp_parameter_t desc;
+ int status = 0;
+ stp_describe_parameter(v, "PrintingMode", &desc);
+ if (stp_string_list_is_present(desc.bounds.str, "BW"))
+ status = 1;
+ stp_parameter_description_destroy(&desc);
+ return status;
+}
+
+static void
+validate_options(stp_vars_t *v, cups_image_t *cups)
+{
+ stp_parameter_list_t params = stp_get_parameter_list(v);
+ int nparams = stp_parameter_list_count(params);
+ int i;
+ for (i = 0; i < nparams; i++)
+ {
+ const stp_parameter_t *param = stp_parameter_list_param(params, i);
+ stp_parameter_t desc;
+ stp_describe_parameter(v, param->name, &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_STRING_LIST)
+ {
+ if (!stp_string_list_is_present
+ (desc.bounds.str, stp_get_string_parameter(v, desc.name)))
+ {
+ fprintf(stderr, "DEBUG: Gutenprint clearing string %s (%s)\n",
+ desc.name, stp_get_string_parameter(v, desc.name));
+ stp_clear_string_parameter(v, desc.name);
+ if (desc.is_mandatory)
+ {
+ fprintf(stderr, "DEBUG: Gutenprint setting default string %s to %s\n",
+ desc.name, desc.deflt.str);
+ stp_set_string_parameter(v, desc.name, desc.deflt.str);
+ if (strcmp(desc.name, "PageSize") == 0)
+ {
+ const stp_papersize_t *ps =
+ stp_get_papersize_by_name(desc.deflt.str);
+ if (ps->width > 0)
+ {
+ fprintf(stderr, "DEBUG: Gutenprint setting page width to %d\n",
+ ps->width);
+ if (ps->width < stp_get_page_width(v))
+ stp_set_page_width(v, ps->width);
+ }
+ if (ps->height > 0)
+ {
+ fprintf(stderr, "DEBUG: Gutenprint setting page height to %d\n",
+ ps->height);
+ if (ps->height < stp_get_page_height(v))
+ stp_set_page_height(v, ps->height);
+ }
+ }
+ }
+ }
+ }
+ stp_parameter_description_destroy(&desc);
+ }
+ stp_parameter_list_destroy(params);
+}
+
+static stp_vars_t *
+initialize_page(cups_image_t *cups, const stp_vars_t *default_settings)
+{
+ const stp_papersize_t *size; /* Paper size */
+ stp_vars_t *v = stp_vars_create_copy(default_settings);
+
+ stp_set_page_width(v, cups->header.PageSize[0]);
+ stp_set_page_height(v, cups->header.PageSize[1]);
+ stp_set_outfunc(v, cups_writefunc);
+ stp_set_errfunc(v, cups_errfunc);
+ stp_set_outdata(v, stdout);
+ stp_set_errdata(v, stderr);
+
+ if (cups->header.cupsBitsPerColor == 16)
+ set_string_parameter(v, "ChannelBitDepth", "16");
+ else
+ set_string_parameter(v, "ChannelBitDepth", "8");
+ switch (cups->header.cupsColorSpace)
+ {
+ case CUPS_CSPACE_W :
+ /* Olympus photo printers don't support black & white ink! */
+ if (printer_supports_bw(v))
+ set_string_parameter(v, "PrintingMode", "BW");
+ set_string_parameter(v, "InputImageType", "Whitescale");
+ break;
+ case CUPS_CSPACE_K :
+ /* Olympus photo printers don't support black & white ink! */
+ if (printer_supports_bw(v))
+ set_string_parameter(v, "PrintingMode", "BW");
+ set_string_parameter(v, "InputImageType", "Grayscale");
+ break;
+ case CUPS_CSPACE_RGB :
+ set_string_parameter(v, "PrintingMode", "Color");
+ set_string_parameter(v, "InputImageType", "RGB");
+ break;
+ case CUPS_CSPACE_CMY :
+ set_string_parameter(v, "PrintingMode", "Color");
+ set_string_parameter(v, "InputImageType", "CMY");
+ break;
+ case CUPS_CSPACE_CMYK :
+ set_string_parameter(v, "PrintingMode", "Color");
+ set_string_parameter(v, "InputImageType", "CMYK");
+ break;
+ case CUPS_CSPACE_KCMY :
+ set_string_parameter(v, "PrintingMode", "Color");
+ set_string_parameter(v, "InputImageType", "KCMY");
+ break;
+ default :
+ fprintf(stderr, "ERROR: Gutenprint Bad colorspace %d!\n",
+ cups->header.cupsColorSpace);
+ break;
+ }
+
+ if (cups->header.cupsCompression >= 0)
+ set_special_parameter(v, "Resolution", cups->header.cupsCompression);
+
+ if (cups->header.MediaClass && strlen(cups->header.MediaClass) > 0)
+ set_string_parameter(v, "InputSlot", cups->header.MediaClass);
+
+ if (cups->header.MediaType && strlen(cups->header.MediaType) > 0)
+ set_string_parameter(v, "MediaType", cups->header.MediaType);
+
+ fprintf(stderr, "DEBUG: Gutenprint 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)
+ set_string_parameter(v, "PageSize", size->name);
+ else
+ fprintf(stderr, "DEBUG: Gutenprint Unable to get media size for (%d, %d)\n",
+ cups->header.PageSize[1], cups->header.PageSize[0]);
+
+ /*
+ * Duplex
+ * Note that the names MUST match those in the printer driver(s)
+ */
+
+ if (cups->header.Duplex != 0)
+ {
+ if (cups->header.Tumble != 0)
+ set_string_parameter(v, "Duplex", "DuplexTumble");
+ else
+ set_string_parameter(v, "Duplex", "DuplexNoTumble");
+ }
+
+ set_string_parameter(v, "JobMode", "Job");
+ validate_options(v, cups);
+ stp_get_media_size(v, &(cups->width), &(cups->height));
+ stp_get_imageable_area(v, &(cups->left), &(cups->right),
+ &(cups->bottom), &(cups->top));
+ fprintf(stderr, "DEBUG: Gutenprint limits w %d l %d r %d h %d t %d b %d\n",
+ cups->width, cups->left, cups->right, cups->height, cups->top, cups->bottom);
+ stp_set_width(v, cups->right - cups->left);
+ stp_set_height(v, cups->bottom - cups->top);
+ stp_set_left(v, cups->left);
+ stp_set_top(v, cups->top);
+ cups->right = cups->width - cups->right;
+ cups->width = cups->width - cups->left - cups->right;
+ cups->width = cups->header.HWResolution[0] * cups->width / 72;
+ cups->left = cups->header.HWResolution[0] * cups->left / 72;
+ cups->right = cups->header.HWResolution[0] * cups->right / 72;
+ cups->adjusted_width = cups->width;
+ if (cups->adjusted_width > cups->header.cupsWidth)
+ cups->adjusted_width = cups->header.cupsWidth;
+
+ cups->bottom = cups->height - cups->bottom;
+ cups->height = cups->height - cups->top - cups->bottom;
+ cups->height = cups->header.HWResolution[1] * cups->height / 72;
+ cups->top = cups->header.HWResolution[1] * cups->top / 72;
+ cups->bottom = cups->header.HWResolution[1] * cups->bottom / 72;
+ cups->adjusted_height = cups->height;
+ if (cups->adjusted_height > cups->header.cupsHeight)
+ cups->adjusted_height = cups->header.cupsHeight;
+ fprintf(stderr, "DEBUG: Gutenprint CUPS settings w %d %d l %d r %d h %d %d t %d b %d\n",
+ cups->width, cups->adjusted_width, cups->left, cups->right,
+ cups->height, cups->adjusted_height, cups->top, cups->bottom);
+
+ return v;
+}
+
+static void
+purge_excess_data(cups_image_t *cups)
+{
+ char *buffer = stp_malloc(cups->header.cupsBytesPerLine);
+ if (buffer)
+ {
+ fprintf(stderr, "DEBUG: Gutenprint purging %d rows\n",
+ cups->header.cupsHeight - cups->row);
+ while (cups->row < cups->header.cupsHeight)
+ {
+ cupsRasterReadPixels(cups->ras, (unsigned char *)buffer,
+ cups->header.cupsBytesPerLine);
+ cups->row ++;
+ }
+ }
+ stp_free(buffer);
+}
+
+static void
+set_all_options(stp_vars_t *v, cups_option_t *options, int num_options,
+ ppd_file_t *ppd)
+{
+ stp_parameter_list_t params = stp_get_parameter_list(v);
+ int nparams = stp_parameter_list_count(params);
+ int i;
+ for (i = 0; i < nparams; i++)
+ {
+ const stp_parameter_t *param = stp_parameter_list_param(params, i);
+ stp_parameter_t desc;
+ char *ppd_option_name = stp_malloc(strlen(param->name) + 8); /* StpFineFOO\0 */
+
+ const char *val; /* CUPS option value */
+ ppd_option_t *ppd_option;
+ stp_describe_parameter(v, param->name, &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_DOUBLE)
+ {
+ sprintf(ppd_option_name, "Stp%s", desc.name);
+ val = cupsGetOption(ppd_option_name, num_options, options);
+ if (!val)
+ {
+ ppd_option = ppdFindOption(ppd, ppd_option_name);
+ if (ppd_option)
+ val = ppd_option->defchoice;
+ }
+ if (val && strlen(val) > 0 && strcmp(val, "None") != 0)
+ {
+ double coarse_val = atof(val) * 0.001;
+ double fine_val = 0;
+ sprintf(ppd_option_name, "StpFine%s", desc.name);
+ val = cupsGetOption(ppd_option_name, num_options, options);
+ if (!val)
+ {
+ ppd_option = ppdFindOption(ppd, ppd_option_name);
+ if (ppd_option)
+ val = ppd_option->defchoice;
+ }
+ if (val && strlen(val) > 0 && strcmp(val, "None") != 0)
+ fine_val = atof(val) * 0.001;
+ fprintf(stderr, "DEBUG: Gutenprint set float %s to %f + %f\n",
+ desc.name, coarse_val, fine_val);
+ fine_val += coarse_val;
+ if (fine_val > desc.bounds.dbl.upper)
+ fine_val = desc.bounds.dbl.upper;
+ stp_set_float_parameter(v, desc.name, fine_val);
+ }
+ }
+ else
+ {
+ sprintf(ppd_option_name, "Stp%s", desc.name);
+ val = cupsGetOption(ppd_option_name, num_options, options);
+ if (!val)
+ {
+ ppd_option = ppdFindOption(ppd, ppd_option_name);
+ if (ppd_option)
+ val = ppd_option->defchoice;
+ }
+ if (val && ((strlen(val) > 0 && strcmp(val, "None") != 0) ||
+ (desc.p_type == STP_PARAMETER_TYPE_STRING_LIST)))
+ {
+ switch (desc.p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ fprintf(stderr, "DEBUG: Gutenprint set string %s to %s\n",
+ desc.name, val);
+ set_string_parameter(v, desc.name, val);
+ break;
+ case STP_PARAMETER_TYPE_INT:
+ fprintf(stderr, "DEBUG: Gutenprint set int %s to %s\n",
+ desc.name, val);
+ stp_set_int_parameter(v, desc.name, atoi(val));
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ fprintf(stderr, "DEBUG: Gutenprint set dimension %s to %s\n",
+ desc.name, val);
+ stp_set_dimension_parameter(v, desc.name, atoi(val));
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ fprintf(stderr, "DEBUG: Gutenprint set bool %s to %s\n",
+ desc.name, val);
+ stp_set_boolean_parameter
+ (v, desc.name, strcmp(val, "True") == 0 ? 1 : 0);
+ break;
+ case STP_PARAMETER_TYPE_CURVE: /* figure this out later... */
+ case STP_PARAMETER_TYPE_FILE: /* Probably not, security hole */
+ case STP_PARAMETER_TYPE_RAW: /* figure this out later, too */
+ fprintf(stderr, "DEBUG: Gutenprint ignoring option %s %s type %d\n",
+ desc.name, val, desc.p_type);
+ break;
+ default:
+ break;
+ }
+ }
+ else
+ fprintf(stderr, "DEBUG: Gutenprint NOT setting %s to %s\n",
+ desc.name, val);
+ }
+ stp_parameter_description_destroy(&desc);
+ stp_free(ppd_option_name);
+ }
+ stp_parameter_list_destroy(params);
+}
/*
* 'main()' - Main entry and processing of driver.
@@ -144,37 +569,35 @@ main(int argc, /* I - Number of command-line arguments */
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 */
+ const stp_printer_t *printer; /* Printer driver */
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;
-
+ stp_vars_t *v = NULL;
+ stp_vars_t *default_settings;
+ int initialized_job = 0;
+ const char *version_id;
+ const char *release_version_id;
+ struct tms tms;
+ clock_t clk;
+ long clocks_per_sec;
+ struct timeval t1, t2;
+ struct timezone tz;
/*
- * Initialise libgimpprint
+ * Initialise libgutenprint
*/
theImage.rep = &cups;
+ (void) gettimeofday(&t1, &tz);
stp_init();
-
+ version_id = stp_get_version();
+ release_version_id = stp_get_release_version();
+ default_settings = stp_vars_create();
/*
* Check for valid arguments...
*/
+ fprintf(stderr, "DEBUG: Gutenprint %s Starting\n", version_id);
if (argc < 6 || argc > 7)
{
@@ -183,36 +606,73 @@ main(int argc, /* I - Number of command-line arguments */
* and return.
*/
- fputs("ERROR: rastertoprinter job-id user title copies options [file]\n", stderr);
+ fputs("ERROR: Gutenprint 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);
+ fputs("ERROR: Gutenprint Fatal error: PPD environment variable not set!\n", stderr);
return (1);
}
+ fprintf(stderr, "DEBUG: Gutenprint using PPD file %s\n", ppdfile);
if ((ppd = ppdOpenFile(ppdfile)) == NULL)
{
- fprintf(stderr, "ERROR: Fatal error: Unable to load PPD file \"%s\"!\n",
+ fprintf(stderr, "ERROR: Gutenprint 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",
+ fprintf(stderr, "ERROR: Gutenprint Fatal error: No ModelName attribute in PPD file \"%s\"!\n",
+ ppdfile);
+ ppdClose(ppd);
+ return (1);
+ }
+
+ if (ppd->nickname == NULL)
+ {
+ fprintf(stderr, "ERROR: Gutenprint Fatal error: No NickName attribute in PPD file \"%s\"!\n",
+ ppdfile);
+ ppdClose(ppd);
+ return (1);
+ }
+ else if (strlen(ppd->nickname) <
+ strlen(ppd->modelname) + strlen(CUPS_PPD_NICKNAME_STRING) + 3)
+ {
+ fprintf(stderr, "ERROR: Gutenprint Fatal error: Corrupted NickName attribute in PPD file \"%s\"!\n",
ppdfile);
ppdClose(ppd);
return (1);
}
+ else if (strcmp(ppd->nickname + strlen(ppd->modelname) +
+ strlen(CUPS_PPD_NICKNAME_STRING), version_id) != 0)
+ {
+ fprintf(stderr, "ERROR: Gutenprint: The version of Gutenprint software installed (%s) does not match the PPD file (%s).\n",
+ version_id,
+ ppd->nickname+strlen(ppd->modelname)+strlen(CUPS_PPD_NICKNAME_STRING));
+ fprintf(stderr, "ERROR: Gutenprint: If you have upgraded your version of Gutenprint\n");
+ fprintf(stderr, "ERROR: Gutenprint: recently, you must reinstall all printer queues.\n");
+ fprintf(stderr, "ERROR: Gutenprint: If the previous installed version of Gutenprint\n");
+ fprintf(stderr, "ERROR: Gutenprint: was 4.3.19 or higher, you can use the `cups-genppdupdate.%s'\n", release_version_id);
+ fprintf(stderr, "ERROR: Gutenprint: program to do this; if the previous installed version\n");
+ fprintf(stderr, "ERROR: Gutenprint: was older, you can use the Modify Printer command via\n");
+ fprintf(stderr, "ERROR: Gutenprint: the CUPS web interface: http://localhost:631/printers.\n");
+ /*
+ * Repeat the first line of the message so that CUPS will display it
+ */
+ fprintf(stderr, "ERROR: Gutenprint: The version of Gutenprint software installed (%s) does not match the PPD file (%s).\n",
+ version_id,
+ ppd->nickname+strlen(ppd->modelname)+strlen(CUPS_PPD_NICKNAME_STRING));
+ ppdClose(ppd);
+ return 1;
+ }
/*
* Get the STP options, if any...
@@ -220,83 +680,33 @@ main(int argc, /* I - Number of command-line arguments */
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;
+ fprintf(stderr, "DEBUG: Gutenprint CUPS option count is %d (%d bytes)\n",
+ num_options, strlen(argv[5]));
- 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;
+ if (num_options > 0)
+ {
+ int i;
+ for (i = 0; i < num_options; i++)
+ fprintf(stderr, "DEBUG: Gutenprint CUPS option %d %s = %s\n",
+ i, options[i].name, options[i].value);
+ }
/*
* Figure out which driver to use...
*/
- if ((printer = stp_get_printer_by_long_name(ppd->modelname)) == NULL)
- if ((printer = stp_get_printer_by_driver(ppd->modelname)) == NULL)
+ printer = stp_get_printer_by_driver(ppd->modelname);
+ if (!printer)
+ printer = stp_get_printer_by_long_name(ppd->modelname);
+
+ if (printer == NULL)
{
- fprintf(stderr, "ERROR: Fatal error: Unable to find driver named \"%s\"!\n",
+ fprintf(stderr, "ERROR: Gutenprint 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);
+ fprintf(stderr, "DEBUG: Gutenprint driver %s\n", ppd->modelname);
/*
* Open the page stream...
@@ -306,32 +716,22 @@ main(int argc, /* I - Number of command-line arguments */
{
if ((fd = open(argv[6], O_RDONLY)) == -1)
{
- perror("ERROR: Unable to open raster file - ");
+ perror("ERROR: Gutenprint Unable to open raster file - ");
sleep(1);
return (1);
}
}
else
fd = 0;
+ fprintf(stderr, "DEBUG: Gutenprint using fd %d\n", fd);
- cups.ras = cupsRasterOpen(fd, CUPS_RASTER_READ);
-
- /*
- * Setup default print variables...
- */
-
- v = stp_allocate_copy(stp_printer_get_printvars(printer));
+ stp_set_printer_defaults(default_settings, printer);
+ stp_set_float_parameter(default_settings, "AppGamma", 1.0);
+ set_all_options(default_settings, options, num_options, ppd);
+ stp_merge_printvars(default_settings, stp_printer_get_defaults(printer));
+ ppdClose(ppd);
- stp_set_scaling(v, 0); /* No scaling */
- stp_set_cmap(v, NULL);
- stp_set_left(v, 0);
- stp_set_top(v, 0);
- stp_set_orientation(v, ORIENT_PORTRAIT);
- stp_set_outfunc(v, cups_writefunc);
- stp_set_errfunc(v, cups_writefunc);
- stp_set_outdata(v, stdout);
- stp_set_errdata(v, stderr);
- stp_set_job_mode(v, STP_JOB_MODE_JOB);
+ cups.ras = cupsRasterOpen(fd, CUPS_RASTER_READ);
/*
* Process pages as needed...
@@ -339,244 +739,108 @@ main(int argc, /* I - Number of command-line arguments */
cups.page = 0;
+ fprintf(stderr, "DEBUG: Gutenprint about to start printing loop.\n");
+ /*
+ * Read the first page header, which we need in order to set up
+ * the page.
+ */
+ signal(SIGTERM, cancel_job);
while (cupsRasterReadHeader(cups.ras, &cups.header))
- {
- /*
- * Update the current page...
- */
-
- cups.row = 0;
-
- fprintf(stderr, "PAGE: %d 1\n", cups.page + 1);
- /* use 1-based page logging */
-
- /*
- * 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...
- */
-
- stp_set_page_width(v, cups.header.PageSize[0]);
- stp_set_page_height(v, cups.header.PageSize[1]);
- stp_set_image_type(v, cups.header.cupsRowCount);
-
- 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;
- }
+ /*
+ * We don't know how many pages we're going to print, and
+ * we need to call stp_end_job at the completion of the job.
+ * Therefore, we need to keep v in scope after the termination
+ * of the loop to permit calling stp_end_job then. Therefore,
+ * we have to free the previous page's stp_vars_t at the start
+ * of the loop.
+ */
+ if (v)
+ stp_vars_destroy(v);
+
+ /*
+ * Setup printer driver variables...
+ */
+ v = initialize_page(&cups, default_settings);
+ stp_set_int_parameter(v, "PageNumber", cups.page);
+ cups.row = 0;
+ fprintf(stderr, "DEBUG: Gutenprint printing page %d\n", cups.page + 1);
+ fprintf(stderr, "PAGE: %d 1\n", cups.page + 1);
+ print_debug_block(v, &cups);
+ print_messages_as_errors = 1;
+ if (!stp_verify(v))
+ {
+ fprintf(stderr, "ERROR: Gutenprint: options failed to verify.\n");
+ fprintf(stderr, "ERROR: Gutenprint: Make sure that you are using ESP Ghostscript rather\n");
+ fprintf(stderr, "ERROR: Gutenprint: than GNU or AFPL Ghostscript with CUPS.\n");
+ fprintf(stderr, "ERROR: Gutenprint: If this is not the cause, set LogLevel to debug2 to identify the problem.\n");
+ goto cups_abort;
+ }
- 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));
-
- if (cups.header.MediaClass && strlen(cups.header.MediaClass) > 0)
- stp_set_media_source(v, cups.header.MediaClass);
- if (cups.header.MediaType && strlen(cups.header.MediaType) > 0)
- stp_set_media_type(v, cups.header.MediaType);
- if (cups.header.OutputType && strlen(cups.header.OutputType) > 0)
- 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);
-
- 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_gamma(v, stp_gamma);
- 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));
-
- stp_set_page_number(v, cups.page);
-
- (*stp_printer_get_printfuncs(printer)->media_size)
- (printer, v, &(cups.width), &(cups.height));
- (*stp_printer_get_printfuncs(printer)->imageable_area)
- (printer, v, &(cups.left), &(cups.right), &(cups.bottom), &(cups.top));
- fprintf(stderr, "DEBUG: GIMP-PRINT %d %d %d %d %d %d\n",
- cups.width, cups.left, cups.right, cups.height, cups.top, cups.bottom);
- cups.right = cups.width - cups.right;
- cups.width = cups.width - cups.left - cups.right;
- cups.width = cups.header.HWResolution[0] * cups.width / 72;
- cups.left = cups.header.HWResolution[0] * cups.left / 72;
- cups.right = cups.header.HWResolution[0] * cups.right / 72;
-
- cups.top = cups.height - cups.top;
- cups.height = cups.height - cups.top - cups.bottom;
- cups.height = cups.header.HWResolution[1] * cups.height / 72;
- cups.top = cups.header.HWResolution[1] * cups.top / 72;
- cups.bottom = cups.header.HWResolution[1] * cups.bottom / 72;
- fprintf(stderr, "DEBUG: GIMP-PRINT %d %d %d %d %d %d\n",
- cups.width, cups.left, cups.right, cups.height, cups.top, cups.bottom);
+ if (!initialized_job)
+ {
+ stp_start_job(v, &theImage);
+ initialized_job = 1;
+ }
- /*
- * Print the page...
- */
+ if (!stp_print(v, &theImage))
+ {
+ fprintf(stderr, "ERROR: Gutenprint failed to print, set LogLevel to debug2 to identify why\n");
+ goto cups_abort;
+ }
+ print_messages_as_errors = 0;
- if (stp_printer_get_printfuncs(printer)->verify(printer, v))
- {
- signal(SIGTERM, cancel_job);
- if (cups.page == 0)
- stp_printer_get_printfuncs(printer)->start_job(printer, &theImage, v);
- stp_printer_get_printfuncs(printer)->print(printer, &theImage, v);
fflush(stdout);
- }
- else
- fputs("ERROR: Invalid printer settings!\n", stderr);
- /*
- * Purge any remaining bitmap data...
- */
-
- if (cups.row < cups.header.cupsHeight)
+ /*
+ * Purge any remaining bitmap data...
+ */
+ if (cups.row < cups.header.cupsHeight)
+ purge_excess_data(&cups);
+ cups.page ++;
+ }
+ if (v)
{
- 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 ++;
- }
+ fprintf(stderr, "DEBUG: Gutenprint ending job\n");
+ stp_end_job(v, &theImage);
+ stp_vars_destroy(v);
}
- cups.page ++;
- }
-
- if (cups.page > 0)
- stp_printer_get_printfuncs(printer)->end_job(printer, &theImage, v);
-
- stp_free_vars(v);
-
- /*
- * Close the raster stream...
- */
-
cupsRasterClose(cups.ras);
+ clk = times(&tms);
+ (void) gettimeofday(&t2, &tz);
+ clocks_per_sec = sysconf(_SC_CLK_TCK);
+ fprintf(stderr, "DEBUG: Gutenprint printed total %.0f bytes\n",
+ total_bytes_printed);
+ fprintf(stderr, "DEBUG: Gutenprint used %.3f seconds user, %.3f seconds system, %.3f seconds elapsed\n",
+ (double) tms.tms_utime / clocks_per_sec,
+ (double) tms.tms_stime / clocks_per_sec,
+ (double) (t2.tv_sec - t1.tv_sec) +
+ ((double) (t2.tv_usec - t1.tv_usec)) / 1000000.0);
+ fputs("INFO: Gutenprint Ready to print.\n", stderr);
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);
+ return 0;
+
+cups_abort:
+ clk = times(&tms);
+ (void) gettimeofday(&t2, &tz);
+ clocks_per_sec = sysconf(_SC_CLK_TCK);
+ fprintf(stderr, "DEBUG: Gutenprint printed total %.0f bytes\n",
+ total_bytes_printed);
+ fprintf(stderr, "DEBUG: Gutenprint used %.3f seconds user, %.3f seconds system, %.3f seconds elapsed\n",
+ (double) tms.tms_utime / clocks_per_sec,
+ (double) tms.tms_stime / clocks_per_sec,
+ (double) (t2.tv_sec - t1.tv_sec) +
+ ((double) (t2.tv_usec - t1.tv_usec)) / 1000000.0);
+ fputs("ERROR: Gutenprint No pages found!\n", stderr);
+ fputs("ERROR: Gutenprint Invalid printer settings!\n", stderr);
+ stp_end_job(v, &theImage);
+ stp_vars_destroy(v);
+ cupsRasterClose(cups.ras);
+ if (fd != 0)
+ close(fd);
+ return 1;
}
@@ -588,9 +852,32 @@ static void
cups_writefunc(void *file, const char *buf, size_t bytes)
{
FILE *prn = (FILE *)file;
+ total_bytes_printed += bytes;
fwrite(buf, 1, bytes, prn);
}
+static void
+cups_errfunc(void *file, const char *buf, size_t bytes)
+{
+ size_t next_nl = 0;
+ size_t where = 0;
+ FILE *prn = (FILE *)file;
+ while (where < bytes)
+ {
+ if (print_messages_as_errors)
+ fputs("ERROR: Gutenprint: ", prn);
+ else
+ fputs("DEBUG: Gutenprint internal: ", prn);
+ while (next_nl < bytes)
+ {
+ if (buf[next_nl++] == '\n')
+ break;
+ }
+ fwrite(buf + where, 1, next_nl - where, prn);
+ where = next_nl;
+ }
+}
+
/*
* 'cancel_job()' - Cancel the current job...
@@ -600,41 +887,9 @@ 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_status = STP_IMAGE_STATUS_ABORT;
}
-
/*
* 'Image_get_appname()' - Get the application we are running.
*/
@@ -644,7 +899,7 @@ Image_get_appname(stp_image_t *image) /* I - Image */
{
(void)image;
- return ("CUPS 1.1.x driver based on GIMP-print");
+ return ("CUPS 1.1.x driver based on Gutenprint");
}
@@ -670,50 +925,68 @@ throwaway_data(int amount, cups_image_t *cups)
stp_image_status_t
Image_get_row(stp_image_t *image, /* I - Image */
unsigned char *data, /* O - Row */
+ size_t byte_limit, /* I - how many bytes in data */
int row) /* I - Row number (unused) */
{
cups_image_t *cups; /* CUPS image */
int i; /* Looping var */
int bytes_per_line;
int margin;
- unsigned char *orig = data;
- static int warned = 0;
-
+ stp_image_status_t tmp_image_status = Image_status;
+ unsigned char *orig = data; /* Temporary pointer */
+ static int warned = 0; /* Error warning printed? */
+ int new_percent;
if ((cups = (cups_image_t *)(image->rep)) == NULL)
- return STP_IMAGE_ABORT;
- bytes_per_line = cups->width * cups->header.cupsBitsPerPixel / CHAR_BIT;
+ {
+ fprintf(stderr, "ERROR: Gutenprint image is null! Please report this bug to gimp-print-devel@lists.sourceforge.net\n");
+ return STP_IMAGE_STATUS_ABORT;
+ }
+ bytes_per_line =
+ ((cups->adjusted_width * cups->header.cupsBitsPerPixel) + CHAR_BIT - 1) /
+ CHAR_BIT;
margin = cups->header.cupsBytesPerLine - bytes_per_line;
if (cups->row < cups->header.cupsHeight)
{
- fprintf(stderr, "DEBUG: GIMP-PRINT reading %d %d\n",
+ fprintf(stderr, "DEBUG2: Gutenprint reading %d %d\n",
bytes_per_line, cups->row);
- cupsRasterReadPixels(cups->ras, data, bytes_per_line);
- cups->row ++;
- fprintf(stderr, "DEBUG: GIMP-PRINT tossing right %d\n", margin);
- if (margin)
- throwaway_data(margin, cups);
-
- /*
- * Invert black data for monochrome output...
- */
-
- if (cups->header.cupsColorSpace == CUPS_CSPACE_K)
- for (i = bytes_per_line; i > 0; i --, data ++)
- *data = ((1 << CHAR_BIT) - 1) - *data;
+ while (cups->row <= row && cups->row < cups->header.cupsHeight)
+ {
+ cupsRasterReadPixels(cups->ras, data, bytes_per_line);
+ cups->row ++;
+ if (margin > 0)
+ {
+ fprintf(stderr, "DEBUG2: Gutenprint tossing right %d\n", margin);
+ throwaway_data(margin, cups);
+ }
+ }
}
else
{
- if (cups->header.cupsColorSpace == CUPS_CSPACE_CMYK)
- memset(data, 0, bytes_per_line);
- else
- memset(data, ((1 << CHAR_BIT) - 1), bytes_per_line);
+ switch (cups->header.cupsColorSpace)
+ {
+ case CUPS_CSPACE_K:
+ case CUPS_CSPACE_CMYK:
+ case CUPS_CSPACE_KCMY:
+ case CUPS_CSPACE_CMY:
+ memset(data, 0, bytes_per_line);
+ break;
+ case CUPS_CSPACE_RGB:
+ case CUPS_CSPACE_W:
+ memset(data, ((1 << CHAR_BIT) - 1), bytes_per_line);
+ break;
+ default:
+ fprintf(stderr, "ERROR: Gutenprint Unknown colorspace %d!\n",
+ cups->header.cupsColorSpace);
+ return STP_IMAGE_STATUS_ABORT;
+ }
}
/*
* This exists to print non-ADSC input which has messed up the job
- * input, such as that generated by psnup.
+ * input, such as that generated by psnup. The output is barely
+ * legible, but it's better than the garbage output otherwise.
*/
data = orig;
if (cups->header.cupsBitsPerPixel == 1)
@@ -721,11 +994,11 @@ Image_get_row(stp_image_t *image, /* I - Image */
if (warned == 0)
{
fprintf(stderr,
- "WARNING: GIMP-PRINT detected broken job options. "
+ "WARNING: Gutenprint detected broken job options. "
"Output quality is degraded. Are you using psnup or non-ADSC PostScript?\n");
warned = 1;
}
- for (i = cups->width - 1; i >= 0; i--)
+ for (i = cups->adjusted_width - 1; i >= 0; i--)
{
if ( (data[i/8] >> (7 - i%8)) &0x1)
data[i]=255;
@@ -734,7 +1007,17 @@ Image_get_row(stp_image_t *image, /* I - Image */
}
}
- return Image_status;
+ new_percent = (int) (100.0 * cups->row / cups->header.cupsHeight);
+ if (new_percent > cups->last_percent)
+ {
+ fprintf(stderr, "INFO: Gutenprint Printing page %d, %d%%\n",
+ cups->page + 1, new_percent);
+ cups->last_percent = new_percent;
+ }
+
+ if (tmp_image_status != STP_IMAGE_STATUS_OK)
+ fprintf(stderr, "DEBUG: Gutenprint image status %d\n", tmp_image_status);
+ return tmp_image_status;
}
@@ -751,8 +1034,8 @@ Image_height(stp_image_t *image) /* I - Image */
if ((cups = (cups_image_t *)(image->rep)) == NULL)
return (0);
- fprintf(stderr, "DEBUG: GIMP-PRINT: Image_height %d\n", cups->height);
- return (cups->height);
+ fprintf(stderr, "DEBUG: Gutenprint: Image_height %d\n", cups->adjusted_height);
+ return (cups->adjusted_height);
}
@@ -763,55 +1046,22 @@ Image_height(stp_image_t *image) /* I - 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;
+ cups->last_percent = 0;
- fprintf(stderr, "INFO: Printing page %d, %.0f%%\n",
- cups->page +1, 100.0 * current / total);
- /* cups->page + 1 because users expect 1-based counting */
-}
-
-
-/*
- * '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 + 1);
+ fprintf(stderr, "INFO: Starting page %d...\n", cups->page + 1);
/* cups->page + 1 because users expect 1-based counting */
}
-
/*
- * 'Image_progress_init()' - Initialize progress display.
+ * 'Image_progress_conclude()' - Close the progress display.
*/
static void
-Image_progress_init(stp_image_t *image)/* I - Image */
+Image_conclude(stp_image_t *image) /* I - Image */
{
cups_image_t *cups; /* CUPS image */
@@ -819,44 +1069,9 @@ Image_progress_init(stp_image_t *image)/* I - Image */
if ((cups = (cups_image_t *)(image->rep)) == NULL)
return;
- fprintf(stderr, "INFO: Starting page %d...\n", cups->page + 1);
- /* cups->page + 1 because users expect 1-based counting */
+ fprintf(stderr, "INFO: Gutenprint Finished page %d...\n", cups->page + 1);
}
-
-/*
- * '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.
*/
@@ -870,11 +1085,11 @@ Image_width(stp_image_t *image) /* I - Image */
if ((cups = (cups_image_t *)(image->rep)) == NULL)
return (0);
- fprintf(stderr, "DEBUG: GIMP-PRINT: Image_width %d\n", cups->width);
- return (cups->width);
+ fprintf(stderr, "DEBUG: Gutenprint: Image_width %d\n", cups->adjusted_width);
+ return (cups->adjusted_width);
}
/*
- * End of "$Id: rastertoprinter.c,v 1.19.4.15 2004/03/26 03:29:39 rlk Exp $".
+ * End of "$Id: rastertoprinter.c,v 1.96 2005/04/23 00:26:07 rlk Exp $".
*/
diff --git a/src/escputil/Makefile.am b/src/escputil/Makefile.am
index b9be86c..e46d38b 100644
--- a/src/escputil/Makefile.am
+++ b/src/escputil/Makefile.am
@@ -23,27 +23,20 @@ AUTOMAKE_OPTIONS = 1.4 gnu
MAINT_CHARSET = latin1
-
-## Variables
-
-AM_CFLAGS = $(GNUCFLAGS)
-INCLUDES = @INCLUDES@
-LIBPRINTUT = $(top_builddir)/lib/libprintut.la
-LIBS = $(INTLLIBS) @LIBS@
+include $(top_srcdir)/scripts/global.mk
## Programs
-ESCPUTIL_BIN = escputil
-
-bin_PROGRAMS = @ESCPUTIL_BIN@
+if BUILD_ESCPUTIL
+bin_PROGRAMS = escputil
+endif
-EXTRA_PROGRAMS = escputil
+escputil_SOURCES = d4lib.c escputil.c d4lib.h
-escputil_LDADD = $(LIBPRINTUT) $(LIBREADLINE_DEPS)
+escputil_LDADD = $(GUTENPRINT_LIBS) $(LIBREADLINE_DEPS)
## Clean
-CLEANFILES = $(EXTRA_PROGRAMS)
MAINTAINERCLEANFILES = Makefile.in
diff --git a/src/escputil/Makefile.in b/src/escputil/Makefile.in
index 41221a5..7b1b77a 100644
--- a/src/escputil/Makefile.in
+++ b/src/escputil/Makefile.in
@@ -1,6 +1,8 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
-# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -10,299 +12,424 @@
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
+@SET_MAKE@
-SHELL = @SHELL@
+# Variables
+
+SOURCES = $(escputil_SOURCES)
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-
-DESTDIR =
-
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
-
top_builddir = ../..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-transform = @program_transform_name@
-
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
-host_alias = @host_alias@
+build_triplet = @build@
host_triplet = @host@
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(top_srcdir)/scripts/global.mk
+@BUILD_ESCPUTIL_TRUE@bin_PROGRAMS = escputil$(EXEEXT)
+subdir = src/escputil
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gimp.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/stp.m4 $(top_srcdir)/m4/stp_cups.m4 \
+ $(top_srcdir)/m4/stp_gimp.m4 $(top_srcdir)/m4/stp_option.m4 \
+ $(top_srcdir)/m4/stp_release.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_escputil_OBJECTS = d4lib.$(OBJEXT) escputil.$(OBJEXT)
+escputil_OBJECTS = $(am_escputil_OBJECTS)
+am__DEPENDENCIES_1 = $(top_builddir)/src/main/libgutenprint.la
+am__DEPENDENCIES_2 =
+escputil_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(escputil_SOURCES)
+DIST_SOURCES = $(escputil_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
-AS = @AS@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
-BISON_PROG = @BISON_PROG@
-BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
-CATALOGS = @CATALOGS@
-CATOBJEXT = @CATOBJEXT@
+BUILD_CUPS_FALSE = @BUILD_CUPS_FALSE@
+BUILD_CUPS_PPDS_FALSE = @BUILD_CUPS_PPDS_FALSE@
+BUILD_CUPS_PPDS_TRUE = @BUILD_CUPS_PPDS_TRUE@
+BUILD_CUPS_TRUE = @BUILD_CUPS_TRUE@
+BUILD_ESCPUTIL_FALSE = @BUILD_ESCPUTIL_FALSE@
+BUILD_ESCPUTIL_TRUE = @BUILD_ESCPUTIL_TRUE@
+BUILD_FOOMATIC_3_FALSE = @BUILD_FOOMATIC_3_FALSE@
+BUILD_FOOMATIC_3_TRUE = @BUILD_FOOMATIC_3_TRUE@
+BUILD_FOOMATIC_FALSE = @BUILD_FOOMATIC_FALSE@
+BUILD_FOOMATIC_TRUE = @BUILD_FOOMATIC_TRUE@
+BUILD_GENPPD_STATIC_FALSE = @BUILD_GENPPD_STATIC_FALSE@
+BUILD_GENPPD_STATIC_TRUE = @BUILD_GENPPD_STATIC_TRUE@
+BUILD_GHOSTSCRIPT_FALSE = @BUILD_GHOSTSCRIPT_FALSE@
+BUILD_GHOSTSCRIPT_TRUE = @BUILD_GHOSTSCRIPT_TRUE@
+BUILD_GIMP2_FALSE = @BUILD_GIMP2_FALSE@
+BUILD_GIMP2_TRUE = @BUILD_GIMP2_TRUE@
+BUILD_GIMP_FALSE = @BUILD_GIMP_FALSE@
+BUILD_GIMP_TRUE = @BUILD_GIMP_TRUE@
+BUILD_LIBGUTENPRINTUI2_FALSE = @BUILD_LIBGUTENPRINTUI2_FALSE@
+BUILD_LIBGUTENPRINTUI2_TRUE = @BUILD_LIBGUTENPRINTUI2_TRUE@
+BUILD_LIBGUTENPRINTUI_FALSE = @BUILD_LIBGUTENPRINTUI_FALSE@
+BUILD_LIBGUTENPRINTUI_TRUE = @BUILD_LIBGUTENPRINTUI_TRUE@
+BUILD_MODULES_FALSE = @BUILD_MODULES_FALSE@
+BUILD_MODULES_TRUE = @BUILD_MODULES_TRUE@
+BUILD_TESTPATTERN_FALSE = @BUILD_TESTPATTERN_FALSE@
+BUILD_TESTPATTERN_TRUE = @BUILD_TESTPATTERN_TRUE@
+BUILD_TEST_FALSE = @BUILD_TEST_FALSE@
+BUILD_TEST_TRUE = @BUILD_TEST_TRUE@
+BUILD_TRANSLATED_CUPS_PPDS_FALSE = @BUILD_TRANSLATED_CUPS_PPDS_FALSE@
+BUILD_TRANSLATED_CUPS_PPDS_TRUE = @BUILD_TRANSLATED_CUPS_PPDS_TRUE@
CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
CONVERT = @CONVERT@
-CUPS_BACKEND_BIN = @CUPS_BACKEND_BIN@
-CUPS_BIN = @CUPS_BIN@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
CUPS_CFLAGS = @CUPS_CFLAGS@
-CUPS_CONF = @CUPS_CONF@
CUPS_CONFIG = @CUPS_CONFIG@
-CUPS_FILTER_BIN = @CUPS_FILTER_BIN@
-CUPS_INSTALL = @CUPS_INSTALL@
CUPS_LIBS = @CUPS_LIBS@
-CUPS_MAN = @CUPS_MAN@
-CUPS_NOINST_BIN = @CUPS_NOINST_BIN@
-CUPS_PKG = @CUPS_PKG@
+CUPS_PPDS_AT_TOP_LEVEL_FALSE = @CUPS_PPDS_AT_TOP_LEVEL_FALSE@
+CUPS_PPDS_AT_TOP_LEVEL_TRUE = @CUPS_PPDS_AT_TOP_LEVEL_TRUE@
CUPS_PPD_PS_LEVEL = @CUPS_PPD_PS_LEVEL@
-DATADIRNAME = @DATADIRNAME@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
DB2HTML = @DB2HTML@
DB2PDF = @DB2PDF@
DB2PS = @DB2PS@
-DLLTOOL = @DLLTOOL@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIALOG = @DIALOG@
+DOXYGEN = @DOXYGEN@
DVIPDF = @DVIPDF@
DVIPS = @DVIPS@
ECHO = @ECHO@
-ESCPUTIL_MAN = @ESCPUTIL_MAN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
EXEEXT = @EXEEXT@
-FOOMATIC_3_NOINST_BIN = @FOOMATIC_3_NOINST_BIN@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+FIND = @FIND@
FOOMATIC_CONFIGURE = @FOOMATIC_CONFIGURE@
-FOOMATIC_INSTALL = @FOOMATIC_INSTALL@
FOOMATIC_KITLOAD = @FOOMATIC_KITLOAD@
-FOOMATIC_NOINST_BIN = @FOOMATIC_NOINST_BIN@
-FOOMATIC_OLDIDS_NOINST_BIN = @FOOMATIC_OLDIDS_NOINST_BIN@
FOOMATIC_PPDFILE = @FOOMATIC_PPDFILE@
-GENCAT = @GENCAT@
-GIMPPRINT_BINARY_AGE = @GIMPPRINT_BINARY_AGE@
-GIMPPRINT_CFLAGS = @GIMPPRINT_CFLAGS@
-GIMPPRINT_CURRENT_INTERFACE = @GIMPPRINT_CURRENT_INTERFACE@
-GIMPPRINT_DEPLIBS = @GIMPPRINT_DEPLIBS@
-GIMPPRINT_INTERFACE_AGE = @GIMPPRINT_INTERFACE_AGE@
-GIMPPRINT_LIBS = @GIMPPRINT_LIBS@
-GIMPPRINT_MAJOR_VERSION = @GIMPPRINT_MAJOR_VERSION@
-GIMPPRINT_MICRO_VERSION = @GIMPPRINT_MICRO_VERSION@
-GIMPPRINT_MINOR_VERSION = @GIMPPRINT_MINOR_VERSION@
-GIMPPRINT_VERSION = @GIMPPRINT_VERSION@
+GENPPD_LIBS = @GENPPD_LIBS@
+GIMP2_CFLAGS = @GIMP2_CFLAGS@
+GIMP2_LIBS = @GIMP2_LIBS@
GIMPTOOL = @GIMPTOOL@
+GIMPTOOL2_CHECK = @GIMPTOOL2_CHECK@
GIMPTOOL_CHECK = @GIMPTOOL_CHECK@
-GIMP_BIN = @GIMP_BIN@
GIMP_CFLAGS = @GIMP_CFLAGS@
GIMP_CFLAGS_NOUI = @GIMP_CFLAGS_NOUI@
GIMP_DATA_DIR = @GIMP_DATA_DIR@
GIMP_LIBS = @GIMP_LIBS@
GIMP_LIBS_NOUI = @GIMP_LIBS_NOUI@
GIMP_PLUGIN_DIR = @GIMP_PLUGIN_DIR@
-GLIBC21 = @GLIBC21@
-GMOFILES = @GMOFILES@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_CONFIG = @GLIB_CONFIG@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
GMSGFMT = @GMSGFMT@
GNUCFLAGS = @GNUCFLAGS@
-IJS_BIN = @IJS_BIN@
+GTK2_CFLAGS = @GTK2_CFLAGS@
+GTK2_LIBS = @GTK2_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+GUTENPRINTUI2_BINARY_AGE = @GUTENPRINTUI2_BINARY_AGE@
+GUTENPRINTUI2_CFLAGS = @GUTENPRINTUI2_CFLAGS@
+GUTENPRINTUI2_CURRENT_INTERFACE = @GUTENPRINTUI2_CURRENT_INTERFACE@
+GUTENPRINTUI2_INTERFACE_AGE = @GUTENPRINTUI2_INTERFACE_AGE@
+GUTENPRINTUI2_LIBDEPS = @GUTENPRINTUI2_LIBDEPS@
+GUTENPRINTUI2_LIBS = $(top_builddir)/src/gutenprintui2/libgutenprintui2.la
+GUTENPRINTUI2_VERSION = @GUTENPRINTUI2_VERSION@
+GUTENPRINTUI_BINARY_AGE = @GUTENPRINTUI_BINARY_AGE@
+GUTENPRINTUI_CFLAGS = @GUTENPRINTUI_CFLAGS@
+GUTENPRINTUI_CURRENT_INTERFACE = @GUTENPRINTUI_CURRENT_INTERFACE@
+GUTENPRINTUI_INTERFACE_AGE = @GUTENPRINTUI_INTERFACE_AGE@
+GUTENPRINTUI_LIBDEPS = @GUTENPRINTUI_LIBDEPS@
+GUTENPRINTUI_LIBS = $(top_builddir)/src/gutenprintui/libgutenprintui.la
+GUTENPRINTUI_VERSION = @GUTENPRINTUI_VERSION@
+GUTENPRINT_BINARY_AGE = @GUTENPRINT_BINARY_AGE@
+GUTENPRINT_CFLAGS = @GUTENPRINT_CFLAGS@
+GUTENPRINT_CURRENT_INTERFACE = @GUTENPRINT_CURRENT_INTERFACE@
+GUTENPRINT_INTERFACE_AGE = @GUTENPRINT_INTERFACE_AGE@
+GUTENPRINT_LIBDEPS = @GUTENPRINT_LIBDEPS@
+
+# Libraries
+GUTENPRINT_LIBS = $(top_builddir)/src/main/libgutenprint.la
+GUTENPRINT_MAJOR_VERSION = @GUTENPRINT_MAJOR_VERSION@
+GUTENPRINT_MICRO_VERSION = @GUTENPRINT_MICRO_VERSION@
+GUTENPRINT_MINOR_VERSION = @GUTENPRINT_MINOR_VERSION@
+GUTENPRINT_VERSION = @GUTENPRINT_VERSION@
IJS_CFLAGS = @IJS_CFLAGS@
IJS_CONFIG = @IJS_CONFIG@
-IJS_INSTALL = @IJS_INSTALL@
IJS_LIBS = @IJS_LIBS@
-INSTOBJEXT = @INSTOBJEXT@
-INTLBISON = @INTLBISON@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SAMPLES_FALSE = @INSTALL_SAMPLES_FALSE@
+INSTALL_SAMPLES_TRUE = @INSTALL_SAMPLES_TRUE@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_USER_GUIDE_FALSE = @INSTALL_USER_GUIDE_FALSE@
+INSTALL_USER_GUIDE_TRUE = @INSTALL_USER_GUIDE_TRUE@
INTLLIBS = @INTLLIBS@
-INTLOBJS = @INTLOBJS@
-INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDFLAGS = @LDFLAGS@
LEX = @LEX@
-LIBGIMPPRINT_LIBS = @LIBGIMPPRINT_LIBS@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
LIBICONV = @LIBICONV@
-LIBM = @LIBM@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
LIBREADLINE_DEPS = @LIBREADLINE_DEPS@
+LIBS = $(INTLLIBS) @LIBS@
LIBTOOL = @LIBTOOL@
LIBTOOL_DEPS = @LIBTOOL_DEPS@
LN_S = @LN_S@
LTALLOCA = @LTALLOCA@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
-LT_AGE = @LT_AGE@
-LT_CURRENT = @LT_CURRENT@
-LT_RELEASE = @LT_RELEASE@
-LT_REVISION = @LT_REVISION@
MAINT = @MAINT@
MAINTAINER_CFLAGS = @MAINTAINER_CFLAGS@
-MAIN_BIN = @MAIN_BIN@
-MAIN_DAT = @MAIN_DAT@
-MAIN_MAN = @MAIN_MAN@
-MAIN_SCR = @MAIN_SCR@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
MKINSTALLDIRS = @MKINSTALLDIRS@
MSGFMT = @MSGFMT@
-OBJDUMP = @OBJDUMP@
+MSGMERGE = @MSGMERGE@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
PLUG_IN_PATH = @PLUG_IN_PATH@
-POFILES = @POFILES@
POSUB = @POSUB@
-PRINT_VASPRINTF = @PRINT_VASPRINTF@
RANLIB = @RANLIB@
RELEASE_DATE = @RELEASE_DATE@
RM = @RM@
-SAMPLE_IMAGES = @SAMPLE_IMAGES@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
STRIP = @STRIP@
-TESTPATTERN_BIN = @TESTPATTERN_BIN@
-TEST_BIN = @TEST_BIN@
TEXI2HTML = @TEXI2HTML@
-USER_GUIDE = @USER_GUIDE@
-USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_LEVEL3_PS_FALSE = @USE_LEVEL3_PS_FALSE@
+USE_LEVEL3_PS_TRUE = @USE_LEVEL3_PS_TRUE@
USE_NLS = @USE_NLS@
+USE_NLS_FALSE = @USE_NLS_FALSE@
+USE_NLS_TRUE = @USE_NLS_TRUE@
VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
YACC = @YACC@
-YACC_PROG = @YACC_PROG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
cups_bindir = @cups_bindir@
cups_conf_datadir = @cups_conf_datadir@
cups_conf_serverbin = @cups_conf_serverbin@
cups_conf_serverroot = @cups_conf_serverroot@
cups_exec_prefix = @cups_exec_prefix@
cups_prefix = @cups_prefix@
+cups_sbindir = @cups_sbindir@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+gimp2_plug_indir = @gimp2_plug_indir@
gimp_plug_indir = @gimp_plug_indir@
-gimpprint_cflags = @gimpprint_cflags@
-gimpprint_libs = @gimpprint_libs@
-
+gutenprint_cflags = @gutenprint_cflags@
+gutenprint_libs = @gutenprint_libs@
+gutenprintui2_cflags = @gutenprintui2_cflags@
+gutenprintui2_libs = @gutenprintui2_libs@
+gutenprintui_cflags = @gutenprintui_cflags@
+gutenprintui_libs = @gutenprintui_libs@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
AUTOMAKE_OPTIONS = 1.4 gnu
-
MAINT_CHARSET = latin1
-
-AM_CFLAGS = $(GNUCFLAGS)
-INCLUDES = @INCLUDES@
-LIBPRINTUT = $(top_builddir)/lib/libprintut.la
-LIBS = $(INTLLIBS) @LIBS@
-
-ESCPUTIL_BIN = escputil
-
-bin_PROGRAMS = @ESCPUTIL_BIN@
-
-EXTRA_PROGRAMS = escputil
-
-escputil_LDADD = $(LIBPRINTUT) $(LIBREADLINE_DEPS)
-
-CLEANFILES = $(EXTRA_PROGRAMS)
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(LOCAL_CPPFLAGS) $(GNUCFLAGS)
+escputil_SOURCES = d4lib.c escputil.c d4lib.h
+escputil_LDADD = $(GUTENPRINT_LIBS) $(LIBREADLINE_DEPS)
MAINTAINERCLEANFILES = Makefile.in
-mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
-CONFIG_HEADER = ../../config.h
-CONFIG_CLEAN_FILES =
-bin_PROGRAMS = @ESCPUTIL_BIN@
-PROGRAMS = $(bin_PROGRAMS)
-
-
-DEFS = @DEFS@ -I. -I$(srcdir) -I../..
-CPPFLAGS = @CPPFLAGS@
-LDFLAGS = @LDFLAGS@
-escputil_SOURCES = escputil.c
-escputil_OBJECTS = escputil.$(OBJEXT)
-escputil_DEPENDENCIES = $(top_builddir)/lib/libprintut.la
-escputil_LDFLAGS =
-CFLAGS = @CFLAGS@
-COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-DIST_COMMON = Makefile.am Makefile.in
-
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = tar
-GZIP_ENV = --best
-SOURCES = escputil.c
-OBJECTS = escputil.$(OBJEXT)
+all: all-am
-all: all-redirect
.SUFFIXES:
-.SUFFIXES: .S .c .lo .o .obj .s
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/escputil/Makefile
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-
-mostlyclean-binPROGRAMS:
-
-clean-binPROGRAMS:
- -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
-
-distclean-binPROGRAMS:
-
-maintainer-clean-binPROGRAMS:
-
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/scripts/global.mk $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/escputil/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/escputil/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
install-binPROGRAMS: $(bin_PROGRAMS)
@$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(bindir)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
@list='$(bin_PROGRAMS)'; for p in $$list; do \
- if test -f $$p; then \
- echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
- $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
else :; fi; \
done
uninstall-binPROGRAMS:
@$(NORMAL_UNINSTALL)
- list='$(bin_PROGRAMS)'; for p in $$list; do \
- rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
done
-.c.o:
- $(COMPILE) -c $<
-
-# FIXME: We should only use cygpath when building on Windows,
-# and only if it is available.
-.c.obj:
- $(COMPILE) -c `cygpath -w $<`
-
-.s.o:
- $(COMPILE) -c $<
-
-.S.o:
- $(COMPILE) -c $<
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+escputil$(EXEEXT): $(escputil_OBJECTS) $(escputil_DEPENDENCIES)
+ @rm -f escputil$(EXEEXT)
+ $(LINK) $(escputil_LDFLAGS) $(escputil_OBJECTS) $(escputil_LDADD) $(LIBS)
mostlyclean-compile:
- -rm -f *.o core *.core
-rm -f *.$(OBJEXT)
-clean-compile:
-
distclean-compile:
-rm -f *.tab.c
-maintainer-clean-compile:
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/d4lib.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/escputil.Po@am__quote@
-.c.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
-.s.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
-.S.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.c.lo:
+@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
mostlyclean-libtool:
-rm -f *.lo
@@ -311,140 +438,198 @@ clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-
-maintainer-clean-libtool:
-
-escputil$(EXEEXT): $(escputil_OBJECTS) $(escputil_DEPENDENCIES)
- @rm -f escputil$(EXEEXT)
- $(LINK) $(escputil_LDFLAGS) $(escputil_OBJECTS) $(escputil_LDADD) $(LIBS)
-
+ -rm -f libtool
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
tags: TAGS
-ID: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
- here=`pwd` && cd $(srcdir) \
- && mkid -f$$here/ID $$unique $(LISP)
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
- || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
-
-mostlyclean-tags:
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
-clean-tags:
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
- -rm -f TAGS ID
-
-maintainer-clean-tags:
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-
-subdir = src/escputil
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
- @for file in $(DISTFILES); do \
- d=$(srcdir); \
+ $(mkdir_p) $(distdir)/../../scripts
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
- || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $$d/$$file $(distdir)/$$file || :; \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
fi; \
done
-escputil.o: escputil.c ../../config.h ../../lib/libprintut.h \
- ../../lib/xmalloc.h \
- ../../include/gimp-print/gimp-print-intl-internal.h
-
-info-am:
-info: info-am
-dvi-am:
-dvi: dvi-am
check-am: all-am
check: check-am
-installcheck-am:
-installcheck: installcheck-am
-install-exec-am: install-binPROGRAMS
+all-am: Makefile $(PROGRAMS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
install-exec: install-exec-am
-
-install-data-am:
install-data: install-data-am
+uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-am
-uninstall-am: uninstall-binPROGRAMS
-uninstall: uninstall-am
-all-am: Makefile $(PROGRAMS)
-all-redirect: all-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs:
- $(mkinstalldirs) $(DESTDIR)$(bindir)
-
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
- -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
- -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \
- mostlyclean-libtool mostlyclean-tags \
- mostlyclean-generic
+clean: clean-am
-mostlyclean: mostlyclean-am
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
-clean-am: clean-binPROGRAMS clean-compile clean-libtool clean-tags \
- clean-generic mostlyclean-am
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
-clean: clean-am
+dvi: dvi-am
-distclean-am: distclean-binPROGRAMS distclean-compile distclean-libtool \
- distclean-tags distclean-generic clean-am
- -rm -f libtool
+dvi-am:
-distclean: distclean-am
+html: html-am
-maintainer-clean-am: maintainer-clean-binPROGRAMS \
- maintainer-clean-compile maintainer-clean-libtool \
- maintainer-clean-tags maintainer-clean-generic \
- distclean-am
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
-.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
-maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
-mostlyclean-compile distclean-compile clean-compile \
-maintainer-clean-compile mostlyclean-libtool distclean-libtool \
-clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
-distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
-dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
-install-exec install-data-am install-data install-am install \
-uninstall-am uninstall all-redirect all-am all installdirs \
-mostlyclean-generic distclean-generic clean-generic \
-maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic clean-libtool ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-binPROGRAMS install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-info-am
@SET_MAKE@
+export STP_MODULE_PATH = $(top_builddir)/src/main/.libs:$(top_builddir)/src/main
+export STP_DATA_PATH = $(top_srcdir)/src/main
+
+# Rules
+
+$(top_builddir)/src/main/libgutenprint.la:
+ cd $(top_builddir)/src/main; \
+ $(MAKE)
+
+$(top_builddir)/src/gutenprintui/libgutenprintui.la:
+ cd $(top_builddir)/src/gutenprintui; \
+ $(MAKE)
+
+$(top_builddir)/src/gutenprintui2/libgutenprintui2.la:
+ cd $(top_builddir)/src/gutenprintui2; \
+ $(MAKE)
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
diff --git a/src/escputil/d4lib.c b/src/escputil/d4lib.c
new file mode 100644
index 0000000..8e3b092
--- /dev/null
+++ b/src/escputil/d4lib.c
@@ -0,0 +1,1310 @@
+/* d4lib.c
+ * Copyright (C) 2001 Jean-Jacques Sarton jj.sarton@t-online.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 will be a library, which will allow to use the EPSON
+ * Stylus Scanner and also allow to send commands to the
+ * Stylus Color 480/580.
+ *
+ * At this stage a lot of things are not implemented and the
+ * first goal is to get the Stylus Scanner printing.
+ * This may be reached if this file is compiled with the TEST
+ * option set.
+ *
+ * I don´t own a Stylus Scanner and I am not able to test this
+ * code, as desired. Printing on a Stylus Photo 1290 work fine
+ * with this.
+ *
+ * The best way to get the Stylus Scanner working is to test
+ * this and also correct my possibly errors.
+ * Programming knowledge will be helpfull for this.
+ *
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "d4lib.h"
+
+
+#ifndef RDTIMEOUT
+#define RDTIMEOUT 2000
+#define WRTIMEOUT 2000
+#endif
+
+int d4WrTimeout = WRTIMEOUT;
+int d4RdTimeout = RDTIMEOUT;
+int ppid = 0;
+
+int debugD4 = 1;
+
+typedef void (*signalHandler_t)(int);
+static signalHandler_t sig;
+static int timeoutGot = 0;
+static int _readData(int fd, unsigned char *buf, int len);
+
+/* commands for the D4 protocol
+
+Transaction Cmd Reply
+-------------- ---- -----
+Init 0x00 0x80
+OpenChannel 0x01 0x81
+CloseChannel 0x02 0x82
+Credit 0x03 0x83
+CreditRequest 0x04 0x84
+Exit 0x08 0x88
+GetSocketID 0x09 0x89
+GetServiceName 0x0a 0x8a
+Error 0x7f -
+
+*/
+
+typedef struct cmdHeader_s
+{
+ unsigned char psid;
+ unsigned char ssid;
+ unsigned char lengthH;
+ unsigned char lengthL;
+ unsigned char credit;
+ unsigned char control;
+ unsigned char command;
+} cmdHeader_t;
+
+typedef struct replyHeader_s
+{
+ unsigned char psid;
+ unsigned char ssid;
+ unsigned char lengthH;
+ unsigned char lengthL;
+ unsigned char credit;
+ unsigned char control;
+ unsigned char command;
+ unsigned char result;
+} replyHeader_t;
+
+typedef struct init_s
+{
+ cmdHeader_t head;
+ unsigned char revision;
+} init_t;
+
+typedef struct initReply_s
+{
+ replyHeader_t head;
+ unsigned char revision;
+} initReply_t;
+
+typedef struct error_s
+{
+ replyHeader_t head;
+ unsigned char epsid;
+ unsigned char essid;
+ unsigned char ecode;
+} error_t;
+
+/* results */
+typedef struct errorMessage_s
+{
+ unsigned char result;
+ const char *message;
+ int errorClass;
+} errorMessage_t;
+
+#define RECOVERABLE 0
+#define FATAL 1
+
+static errorMessage_t errorMessage[] =
+{
+ { 0x01, "Unable to begin conversation, try later." ,0 },
+ { 0x02, "Protocol revision not supported." ,1 },
+ { 0x03, "Transaction channel can´t be closed." ,0 },
+ { 0x04, "No sufficient resources available now." ,0 },
+ { 0x05, "Connection denied." ,1 },
+ { 0x06, "Channel allready open." ,0 },
+ { 0x07, "Credit overflow, previous credit remain valid." ,0 },
+ { 0x08, "Channel is not open." ,1 },
+ { 0x09, "Service not available on specified socket." ,1 },
+ { 0x0a, "Service name to socket ID failed." ,1 },
+ { 0x0b, "Init transaction failed." ,1 },
+ { 0x0c, "Invalid packet size." ,1 },
+ { 0x0d, "Requested packed size is 0, no data can be transfered.",0 },
+ { 0x80, "Malformed packet, ignored." ,1 },
+ { 0x81, "No credit for received packet, ignored" ,0 },
+ { 0x82, "Reply don´t match with outstanding command, ignored." ,1 },
+ { 0x83, "Packet size greater as negotiated size." ,1 },
+ { 0x84, "Data received for a non opened channel." ,1 },
+ { 0x85, "Reply with unknown result value received." ,1 },
+ { 0x86, "Piggybacked credit in data packet cause overflow." ,1 },
+ { 0x87, "Unknown 1284.4 Reply." ,0 },
+ { 0x00, NULL ,0 }
+};
+
+#define RESET_TIMER(ti,oti) { signal(SIGALRM, sig); \
+ memset((void*)&ti,0,sizeof(ti)); \
+ memset((void*)&oti,0,sizeof(oti)); \
+ setitimer( ITIMER_REAL ,&ti, &oti); \
+ }
+
+#define SET_TIMER(ti,oti,val) { memset((void*)&ti,0,sizeof(ti)); \
+ memset((void*)&oti,0,sizeof(oti)); \
+ ti.it_value.tv_sec = val/1000; \
+ ti.it_value.tv_usec = (val%1000)*1000; \
+ setitimer( ITIMER_REAL ,&ti, &oti); \
+ sig = signal(SIGALRM, sigAlarm); \
+ }
+
+int SafeWrite(int fd, const void *data, int len)
+{
+ int status;
+ int retries=3;
+ do
+ {
+ status = write(fd, data, len);
+ if(status < len)
+ usleep(100000);
+ retries--;
+ }
+ while ((status < len) && (retries > 0));
+ return(status);
+}
+
+/*******************************************************************/
+/* Function printHexValues */
+/* */
+/* Print hex code contained in the passed buffer */
+/* */
+/*******************************************************************/
+
+static void printHexValues(const char *dir, unsigned char *buf, int len)
+{
+ int i;
+#if 0
+ len = len > 30 ? 30 : len;
+#endif
+ fprintf(stderr,"%s",dir);
+ for ( i = 0; i < len;i++)
+ fprintf(stderr,"%02x ",buf[i]);
+ fprintf(stderr,"\n");
+ fprintf(stderr," ");
+ for ( i = 0; i < len;i++)
+ fprintf(stderr,"%c ",isprint(buf[i])&&!isspace(buf[i])?buf[i]:' ');
+ fprintf(stderr,"\n");
+}
+
+/*******************************************************************/
+/* Function sigAlarm(int code) */
+/* */
+/* do nothing, avoid printing of undesired messages and/or */
+/* other not desirable actions */
+/* */
+/*******************************************************************/
+
+static void sigAlarm(int code)
+{
+ timeoutGot = -1;
+}
+
+
+/*******************************************************************/
+/* Function printError() */
+/* print an error message on stderr */
+/* */
+/* Input: unsigned char errorNb the error number */
+/* */
+/* Return: fatal = 1 or recoverable = 0 */
+/* */
+/*******************************************************************/
+
+static int printError(unsigned char errorNb)
+{
+ errorMessage_t *msg = errorMessage;
+ if ( errorNb == 0 )
+ {
+ return 0;
+ }
+ while ( msg->result )
+ {
+ if ( msg->result == errorNb )
+ {
+ fprintf(stderr,"%s\n", msg->message);
+ return msg->errorClass;
+ }
+ msg++;
+ }
+ fprintf(stderr,"Unknown IEEE 1284.4 error number %d\n",errorNb);
+ return 1; /* non recoverable error */
+}
+
+
+/*******************************************************************/
+/* Function printCmdType() */
+/* print on stderr the command name */
+/* Input: unsigned char *cmd the data are to be put here */
+/* */
+/* Return: - */
+/* */
+/*******************************************************************/
+
+static void printCmdType(unsigned char *cmd)
+{
+ if ( cmd[0] == 0 && cmd[1] == 0 )
+ {
+ switch(cmd[6])
+ {
+ case 0: fprintf(stderr,"--- Init ---\n");break;
+ case 1: fprintf(stderr,"--- OpenChannel ---\n");break;
+ case 2: fprintf(stderr,"--- CloseChannel ---\n");break;
+ case 3: fprintf(stderr,"--- Credit ---\n");break;
+ case 4: fprintf(stderr,"--- CreditRequest ---\n");break;
+ case 8: fprintf(stderr,"--- Exit ---\n");break;
+ case 9: fprintf(stderr,"--- GetSocketID ---\n");break;
+ case 10: fprintf(stderr,"--- GetServiceName ---\n");break;
+ case 0x45: fprintf(stderr,"--- EnterD4Mode ---\n");break;
+ case 0x7f: fprintf(stderr,"--- Error ---\n");break;
+ default: fprintf(stderr,"--- ?????????????? ---\n");break;
+ }
+ }
+ else
+ {
+ fprintf(stderr,"--- Send Data ---\n");
+ }
+}
+
+
+/*******************************************************************/
+/* Function writeCmd() */
+/* write a commmand */
+/* Input: int fd file handle */
+/* char *cmd the data are to be put here */
+/* int len the number of bytes to read */
+/* */
+/* Return: number of bytes write or -1 */
+/* */
+/*******************************************************************/
+
+static int writeCmd(int fd, unsigned char *cmd, int len)
+{
+ int w;
+ int i = 0;
+ struct itimerval ti, oti;
+
+# if PTIME
+ struct timeval beg, end;
+ long dt;
+# endif
+ if ( debugD4 )
+ {
+ printCmdType(cmd);
+# if PTIME
+ gettimeofday(&beg, NULL);
+# endif
+ if ( cmd[0] == 0 && cmd[1] == 0 )
+ {
+ printHexValues("Send: ", (unsigned char*)cmd, len);
+ }
+ else
+ {
+ printHexValues("Send: ", (unsigned char*)cmd, 6);
+ }
+ }
+
+ usleep(1); /* according to Glen Steward, this will solve problems */
+ /* for the cartridge exchange with the Stylus Color 580 */
+
+ timeoutGot = 0;
+ errno = 0;
+ while ( i < len )
+ {
+ SET_TIMER(ti,oti,d4WrTimeout);
+ w = SafeWrite(fd, cmd+i,len-i);
+ RESET_TIMER(ti,oti);
+ if ( w < 0 )
+ {
+ if ( debugD4 )
+ {
+ perror("Write error");
+ }
+ i= -1;
+ break;
+ }
+ else
+ i += w;
+ }
+
+ if ( debugD4 )
+ {
+# if PTIME
+ gettimeofday(&end, NULL);
+ dt = (end.tv_sec - beg.tv_sec) * 1000000;
+ dt += end.tv_usec - beg.tv_usec;
+ fprintf(stderr,"Write time %5.3f s\n",(double)dt/1000000);
+# endif
+ }
+
+ if ( timeoutGot )
+ return -1;
+ return i;
+}
+
+/*******************************************************************/
+/* Function readAnswer() */
+/* Read the datas returned by the printer */
+/* Input: int fd file handle */
+/* char *buf the data are to be put here */
+/* int len the number of bytes to read */
+/* */
+/* Return: number of bytes read. -1 on error */
+/* */
+/*******************************************************************/
+
+int readAnswer(int fd, unsigned char *buf, int len)
+{
+ int rd = 0;
+ int total = 0;
+ struct timeval beg, end;
+ struct itimerval ti, oti;
+ long dt;
+ int count = 0;
+ /* wait a little bit before reading an answer */
+ usleep(20000);
+
+ /* for error handling in case of timeout */
+ timeoutGot = 0;
+
+ /* set errno to 0 in order to get correct informations */
+ /* in case of error */
+ errno = 0;
+
+ gettimeofday(&beg, NULL);
+
+ if (debugD4)
+ fprintf(stderr, "length: %i\n", len);
+ while ( total < len )
+ {
+ SET_TIMER(ti,oti, d4RdTimeout);
+ rd = read(fd, buf+total, len-total);
+ if (debugD4)
+ fprintf(stderr, "read: %i %s\n", rd,
+ rd < 0 && errno != 0 ?strerror(errno) : "");
+ RESET_TIMER(ti,oti);
+ if ( rd <= 0 )
+ {
+ gettimeofday(&end, NULL);
+ dt = (end.tv_sec - beg.tv_sec) * 1000;
+ dt += (end.tv_usec - beg.tv_usec) / 1000;
+ if ( dt > d4RdTimeout * 2 )
+ {
+ if ( debugD4 )
+ fprintf(stderr,"Timeout 1 at readAnswer() rcv %d bytes\n",total);
+ timeoutGot = 1;
+ break;
+ }
+ count++;
+ if ( count >= 100 )
+ {
+ timeoutGot = 1;
+ if ( rd == 0 )
+ errno = -1; /* tell that there is an abnormal condition */
+ break;
+ }
+ errno = 0;
+ } else {
+ total += rd;
+ if ( total > 3 )
+ {
+ /* the bytes idx 2 and 3 contain the length */
+ /* in case of errors this may differ from */
+ /* the expected lenght. Setting len to this */
+ /* value will avoid waiting for timeout */
+ len = (buf[2] << 8) + buf[3];
+ len = (len > sizeof(buf))?sizeof(buf) - 1:len;
+ }
+ }
+ usleep(20000);
+ }
+
+ if ( debugD4 )
+ {
+# if PTIME
+ gettimeofday(&end, NULL);
+# endif
+ fprintf(stderr, "total: %i\n", total);
+ printHexValues("Recv: ",buf,total);
+# if PTIME
+ dt = (end.tv_sec - beg.tv_sec) * 1000000;
+ dt += end.tv_usec - beg.tv_usec;
+ fprintf(stderr,"Read time %5.3f s\n",(double)dt/1000000);
+# endif
+ }
+ if ( timeoutGot )
+ {
+ if ( debugD4 )
+ fprintf(stderr,"Timeout 2 at readAnswer()\n");
+ return -1;
+ }
+ return total;
+}
+
+static void _flushData(int fd)
+{
+ int rd = 0;
+ struct itimerval ti, oti;
+ char buf[1024];
+ int len = 1023;
+ int count = 20;
+ usleep(20000);
+
+ /* for error handling in case of timeout */
+ timeoutGot = 0;
+
+ /* set errno to 0 in order to get correct informations */
+ /* in case of error */
+ errno = 0;
+
+ if (debugD4)
+ fprintf(stderr, "flush data: length: %i\n", len);
+ do
+ {
+ usleep(50000);
+ SET_TIMER(ti,oti, d4RdTimeout);
+ rd = read(fd, buf, len);
+ if (debugD4)
+ fprintf(stderr, "flush: read: %i %s\n", rd,
+ rd < 0 && errno != 0 ?strerror(errno) : "");
+ RESET_TIMER(ti,oti);
+ count--;
+ } while ( count > 0 && (rd > 0 || (rd < 0 && errno == EAGAIN)));
+}
+
+/*******************************************************************/
+/* Function _readData() */
+/* Read the datas returned by the printer */
+/* Input: int fd file handle */
+/* char *buf the data are to be put here */
+/* int len the number of bytes to read */
+/* */
+/* Return: number of bytes read. -1 on error */
+/* */
+/*******************************************************************/
+
+static int _readData(int fd, unsigned char *buf, int len)
+{
+ int rd = 0;
+ int total = 0;
+ int toGet = 0;
+ unsigned char header[6];
+ struct timeval beg, end;
+ long dt;
+ struct itimerval ti, oti;
+
+ /* set errno to 0 in order to get correct informations */
+ /* in case of error */
+ errno = 0;
+
+ /* read the first 6 bytes */
+ gettimeofday(&beg, NULL);
+ while ( total < 6 )
+ {
+ SET_TIMER(ti,oti, d4RdTimeout);
+ rd = read(fd, header+total, 6-total);
+ RESET_TIMER(ti,oti);
+ if ( rd <= 0 )
+ {
+ gettimeofday(&end, NULL);
+ dt = (end.tv_sec - beg.tv_sec) * 1000;
+ dt += (end.tv_usec - beg.tv_usec) / 1000;
+ if ( dt > d4RdTimeout*3 )
+ {
+ if ( debugD4 )
+ fprintf(stderr,"Timeout at _readData(), dt = %ld ms\n", dt);
+ return -1;
+ break;
+ }
+ continue;
+ }
+ else
+ {
+ total += rd;
+ }
+ }
+
+ if ( debugD4 )
+ printHexValues("Recv: ",header,total);
+
+ if ( total == 6 )
+ {
+ toGet = (header[2] >> 8) + header[3] - 6;
+ if (debugD4)
+ fprintf(stderr, "toGet: %i\n", toGet);
+ total = 0;
+ gettimeofday(&beg, NULL);
+ while ( total < toGet )
+ {
+ SET_TIMER(ti,oti, d4RdTimeout);
+ rd = read(fd, buf+total, toGet-total);
+ RESET_TIMER(ti,oti);
+ if ( rd <= 0 )
+ {
+ gettimeofday(&end, NULL);
+ dt = (end.tv_sec - beg.tv_sec) * 1000;
+ dt += (end.tv_usec - beg.tv_usec) / 1000;
+ if ( dt > d4RdTimeout*3 )
+ {
+ if ( debugD4 )
+ fprintf(stderr,"Timeout at _readData(), dt = %ld ms\n",dt);
+ return -1;
+ break;
+ }
+ continue;
+ }
+ else
+ {
+ total += rd;
+ }
+ }
+ if ( debugD4 )
+ printHexValues("Recv: ",buf,total);
+ return total;
+ }
+
+ return -1;
+}
+
+/*******************************************************************/
+/* Function sendReceiveCmd() */
+/* send a command and get the answer. */
+/* Input: int fd file handle */
+/* char *buf the data are to be put here */
+/* int len the number of bytes to read */
+/* */
+/* Return: number of bytes read */
+/* */
+/*******************************************************************/
+
+static int sendReceiveCmd(int fd, unsigned char *cmd, int len, unsigned char *answer, int expectedlen)
+{
+ int rd;
+ if ( (rd = writeCmd(fd, cmd, len ) ) != len )
+ {
+ if ( rd < 0 ) return -1;
+ return 0;
+ }
+ rd = readAnswer(fd, answer, expectedlen );
+ if ( rd == 0 )
+ {
+ /* no answer from device */
+ return 0;
+ }
+ else if ( rd < 0 )
+ {
+ /* interrupted write call */
+ if ( debugD4 )
+ fprintf(stderr,"interrupt received\n");
+ return -1;
+ }
+ else
+ {
+ /* check result */
+ if ( answer[6] == 0x7f )
+ {
+ printError(answer[9]);
+ return -1;
+ }
+ else if ( answer[7] != 0 )
+ {
+ if ( printError(answer[7]) )
+ {
+ return -1;
+ }
+ return 0;
+ }
+ else
+ {
+ return rd;
+ }
+ }
+}
+
+/*******************************************************************/
+/* Function EnterIEEE() */
+/* send a command and get the answer. */
+/* Input: int fd file handle */
+/* */
+/* Return: 0 on error 1 if all is OK */
+/* */
+/*******************************************************************/
+
+int EnterIEEE(int fd)
+{
+ unsigned char buf[200];
+ unsigned char cmd[] =
+ {
+ 0x00, 0x00, 0x00, 0x1b, 0x01, '@', 'E', 'J', 'L', ' ',
+ '1', '2', '8', '4', '.', '4', 0x0a, '@', 'E', 'J',
+ 'L', 0x0a, '@', 'E', 'J', 'L', 0x0a
+ };
+ int rd;
+ memset(buf, 0, sizeof(buf));
+Loop:
+ if ( writeCmd(fd, cmd, sizeof(cmd) ) != sizeof(cmd) )
+ {
+ return 0;
+ }
+ rd = readAnswer(fd, buf, 8);
+ if ( rd == 0 )
+ {
+ /* no answer from device */
+ return 0;
+ }
+ else if ( rd < 0 )
+ {
+ /* interrupted write call */
+ return 0;
+ }
+ else
+ {
+ int i;
+ /* check result */
+ for (i=0; i < rd; i++ )
+ if ( buf[i] != 0 )
+ break;
+ if ( i == rd ) goto Loop;
+ return 1;
+ }
+}
+
+/*******************************************************************/
+/* Function Init() */
+/* handle the init command */
+/* Input: int fd file handle */
+/* */
+/* Return: 0 on error 1 if all is OK */
+/* */
+/*******************************************************************/
+
+int Init(int fd)
+{
+ unsigned char buf[20];
+ init_t cmd;
+ int rd;
+
+ cmd.head.psid = 0;
+ cmd.head.ssid = 0;
+ cmd.head.lengthH = 0;
+ cmd.head.lengthL = 8;
+ cmd.head.credit = 1;
+ cmd.head.control = 0;
+ cmd.head.command = 0;
+ cmd.revision = 0x10;
+
+ rd = sendReceiveCmd(fd, (unsigned char*)&cmd, sizeof(cmd), buf, 9 );
+ return rd == 9 ? 1 : 0;
+}
+
+/*******************************************************************/
+/* Function Exit() */
+/* handle the Exit command */
+/* Input: int fd file handle */
+/* */
+/* Return: 0 on error 1 if all is OK */
+/* */
+/*******************************************************************/
+
+int Exit(int fd)
+{
+ int rd;
+ unsigned char buf[20];
+ cmdHeader_t cmd;
+ cmd.psid = 0;
+ cmd.ssid = 0;
+ cmd.lengthH = 0;
+ cmd.lengthL = 7;
+ cmd.credit = 1;
+ cmd.control = 0;
+ cmd.command = 8;
+
+ rd = sendReceiveCmd(fd, (unsigned char*)&cmd, sizeof(cmd), buf, 8 );
+ return rd > 0 ? 1 : rd;
+}
+
+/*******************************************************************/
+/* Function GetSocketID() */
+/* handle the GetSocketID command */
+/* Input: int fd file handle */
+/* char *serviceName name of wanted service */
+/* */
+/* Return: 0 on error else the socket ID */
+/* */
+/*******************************************************************/
+
+int GetSocketID(int fd, const char *serviceName)
+{
+ /* the service name may not be longer as 40 bytes */
+ int len = sizeof(cmdHeader_t) + strlen(serviceName);
+ char buf[100];
+ unsigned char rBuf[100];
+ int rd;
+ cmdHeader_t *cmd = (cmdHeader_t*)buf;
+ cmd->psid = 0;
+ cmd->ssid = 0;
+ cmd->lengthH = 0;
+ cmd->lengthL = len & 0xff;
+ cmd->credit = 1;
+ cmd->control = 0;
+ cmd->command = 0x09;
+ strcpy(buf + sizeof(cmdHeader_t), serviceName);
+
+ rd = sendReceiveCmd(fd, (unsigned char*)buf, len, rBuf, len + 2);
+ if ( rd > 0 )
+ {
+ return rBuf[8];
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+/*******************************************************************/
+/* Function OpenChannel() */
+/* handle the OpenChannel command */
+/* Input: int fd file handle */
+/* I/O: int *sndSz The size for sendig of datas */
+/* int *recSz The size for receiving of datas */
+/* */
+/* Return: -1 on error or 1 if all is OK */
+/* */
+/*******************************************************************/
+
+int OpenChannel(int fd, unsigned char sockId, int *sndSz, int *rcvSz)
+{
+ unsigned char cmd[17];
+ unsigned char buf[20];
+ int rd;
+
+ for(;;)
+ {
+ cmd[0] = 0; /* transaction sockets */
+ cmd[1] = 0;
+ cmd[2] = 0; /* len */
+ cmd[3] = 17; /* len */
+ cmd[4] = 1; /* credit */
+ cmd[5] = 0; /* control */
+ cmd[6] = 1; /* command */
+ cmd[7] = sockId; /* sockets # */
+ cmd[8] = sockId; /* sockets # */
+ cmd[9] = *sndSz >> 8; /* packet size in send dir */
+ cmd[10] = *sndSz & 0xff;
+ cmd[11] = *rcvSz >> 8; /* packet size in recv dir */
+ cmd[12] = *rcvSz & 0xff;
+ cmd[13] = 0; /* max outstanding Credit, must be 0 */
+ cmd[14] = 0;
+ cmd[15] = 0; /* initial credit for us ? */
+ cmd[16] = 0;
+
+ rd = sendReceiveCmd(fd, cmd, 17, buf, 16);
+ if ( rd == -1 )
+ {
+ return -1;
+ }
+ else if ( rd == 16 )
+ {
+ if ( buf[7] == 4 )
+ {
+ /* device can´t allocate resources now */
+ continue;
+ }
+ else if ( buf[7] != 0 )
+ {
+ /* hard error */
+ return -1;
+ }
+ *sndSz = (buf[10]<<8) + buf[11];
+ *rcvSz = (buf[12]<<8) + buf[13];
+ break;
+ }
+ else
+ {
+ /* at this stage we can only have an error */
+ return -1;
+ }
+ }
+ return 1;
+}
+
+/*******************************************************************/
+/* Function CloseChannel() */
+/* handle the CloseChannel command */
+/* Input: int fd file handle */
+/* unsigned char socketID he socket to close */
+/* */
+/* Return: -1 on error or 1 if all is OK */
+/* */
+/*******************************************************************/
+
+int CloseChannel(int fd, unsigned char socketID)
+{
+ unsigned char buf[100];
+ int rd;
+ cmdHeader_t *cmd = (cmdHeader_t *)buf;
+ cmd->psid = 0;
+ cmd->ssid = 0;
+ cmd->lengthH = 0;
+ cmd->lengthL = 10;
+ cmd->credit = 1;
+ cmd->control = 0;
+ cmd->command = 2;
+ buf[sizeof(cmdHeader_t)+0] = socketID;
+ buf[sizeof(cmdHeader_t)+1] = socketID;
+ buf[sizeof(cmdHeader_t)+2] = 0;
+ rd = sendReceiveCmd(fd, buf,10, buf, 10);
+ return rd == 10 ? 1 : rd;
+}
+
+/*******************************************************************/
+/* Function CreditRequest() */
+/* handle the CreditRequest command */
+/* Input: int fd file handle */
+/* unsigned char socketID he socket to close */
+/* */
+/* Return: -1 on error else the credit got */
+/* */
+/*******************************************************************/
+
+int CreditRequest(int fd, unsigned char socketID)
+{
+ int rd;
+ unsigned char buf[100];
+ unsigned char rBuf[100];
+ cmdHeader_t *cmd = (cmdHeader_t *)buf;
+ cmd->psid = 0;
+ cmd->ssid = 0;
+ cmd->lengthH = 0;
+ cmd->lengthL = 13;
+ cmd->credit = 1;
+ cmd->control = 0;
+ cmd->command = 4;
+ buf[sizeof(cmdHeader_t)+0] = socketID;
+ buf[sizeof(cmdHeader_t)+1] = socketID;
+ buf[sizeof(cmdHeader_t)+2] = 0x00;
+ buf[sizeof(cmdHeader_t)+3] = 0x80;
+ buf[sizeof(cmdHeader_t)+4] = 0xff;
+ buf[sizeof(cmdHeader_t)+5] = 0xff;
+ rd = sendReceiveCmd(fd, buf, 13, rBuf, 12);
+ if ( rd == 12 )
+ {
+ /* this is the credit */
+ return (rBuf[10]*256)+rBuf[11];
+ }
+ else
+ {
+ return rd > 0 ? 0 : rd; /* there was an error */
+ }
+}
+
+/*******************************************************************/
+/* Function Credit() */
+/* give credit to the attached device */
+/* Input: int fd file handle */
+/* unsigned char socketID the socket to close */
+/* */
+/* Return: -1 on error or 1 if all is OK */
+/* */
+/*******************************************************************/
+
+/* needed for sending of commands (channel 2) or scanning */
+int Credit(int fd, unsigned char socketID, int credit)
+{
+ int rd;
+ unsigned char buf[100];
+ unsigned char rBuf[100];
+ cmdHeader_t *cmd = (cmdHeader_t*)buf;
+ cmd->psid = 0;
+ cmd->ssid = 0;
+ cmd->lengthH = 0;
+ cmd->lengthL = 0x0b;
+ cmd->credit = 1;
+ cmd->control = 0;
+ cmd->command = 0x03;
+
+ buf[sizeof(cmdHeader_t)+0] = socketID;
+ buf[sizeof(cmdHeader_t)+1] = socketID;
+ buf[sizeof(cmdHeader_t)+2] = credit >> 8;
+ buf[sizeof(cmdHeader_t)+3] = credit & 0xff;
+ rd = sendReceiveCmd(fd, buf, 11, rBuf, 10);
+ if ( rd == 10 )
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+/*******************************************************************/
+/* Function askForCredit() */
+/* Convenience function */
+/* handle the CreditRequest command */
+/* Input: int fd file handle */
+/* unsigned char socketID */
+/* IN/Out int *sndSize for error handling */
+/* IN/Out int *rcvSize for error handling */
+/* */
+/* Return: credit */
+/* */
+/* Remark: CreditRequest() will be called in a loop as long as */
+/* the returned credit is 0 */
+/* */
+/*******************************************************************/
+#define MAX_CREDIT_REQUEST 2
+int askForCredit(int fd, unsigned char socketID, int *sndSize, int *rcvSize)
+{
+ int credit = 0;
+ int count = 0;
+
+ while (credit == 0 )
+ {
+ while((credit=CreditRequest(fd,socketID)) == 0 && count < MAX_CREDIT_REQUEST )
+ usleep(250000);
+
+ if ( credit == -1 )
+ {
+ if ( errno == ENODEV || count == MAX_CREDIT_REQUEST )
+ {
+ break;
+ }
+ credit = 0;
+ /* init printer and reopen the printer channel */
+ CloseChannel(fd, socketID);
+ if ( Init(fd) )
+ {
+ OpenChannel(fd, socketID, sndSize, rcvSize);
+ }
+ }
+ /* if the parent died, live this loop if credit not got */
+ if ( credit == 0 && getppid() == ppid )
+ return 0;
+ count++;
+ }
+ return credit;
+}
+
+/*******************************************************************/
+/* Function writeData() */
+/* Convenience function */
+/* write the data to the device */
+/* Input: int fd file handle */
+/* unsigned char socketID the deetination socket */
+/* unsigned char *buf the datas to be send */
+/* int len how many datas are to we send */
+/* int eoj set out of band flag if eoj set */
+/* */
+/* Return: number of bytes written or -1; */
+/* */
+/*******************************************************************/
+
+int writeData(int fd, unsigned char socketID, const unsigned char *buf, int len, int eoj)
+{
+ unsigned char cmd[6];
+ int wr = 0;
+ int ret = 0;
+ struct itimerval ti, oti;
+ struct timeval beg;
+ static unsigned char *buffer = NULL;
+ static int bLen = 0;
+ if ( debugD4 )
+ {
+ fprintf(stderr,"--- Send Data ---\n");
+ gettimeofday(&beg, NULL);
+ }
+ len += 6;
+ if ( len > bLen )
+ {
+ if ( buffer == NULL )
+ buffer = (unsigned char*)malloc(len);
+ else
+ buffer = (unsigned char*)realloc(buffer, len);
+ if ( buffer == NULL )
+ return -1;
+ bLen = len;
+ }
+ cmd[0] = socketID;
+ cmd[1] = socketID;
+ cmd[2] = len >> 8;
+ cmd[3] = len & 0xff;
+ cmd[4] = 0;
+ cmd[5] = eoj ? 1 : 0;
+
+ memcpy(buffer, cmd, 6);
+ memcpy(buffer + 6, buf, len - 6 );
+ while( ret > -1 && wr != len )
+ {
+ SET_TIMER(ti,oti,d4WrTimeout);
+ ret = SafeWrite(fd, buffer+wr, len-wr );
+ RESET_TIMER(ti,oti);
+ if ( ret == -1 )
+ {
+ perror("write: ");
+ }
+ else
+ {
+ wr += ret;
+ }
+ }
+
+ if ( debugD4 )
+ {
+# if PTIME
+ gettimeofday(&end, NULL);
+ dt = (end.tv_sec - beg.tv_sec) * 1000000;
+ dt += end.tv_usec - beg.tv_usec;
+# endif
+ fprintf(stderr,"Send: ");
+ for ( ret = 0; (wr > 0) && (ret < ((wr > 20) ? 20 : wr)) ; ret++ )
+ fprintf(stderr,"%02x ", buffer[ret]);
+ fprintf(stderr,"\n ");
+ for ( ret = 0; (wr > 0) && (ret < ((wr > 20) ? 20 : wr)) ; ret++ )
+ fprintf(stderr,"%c ", isprint(buffer[ret])&&!isspace(buffer[ret])?buffer[ret]:' ');
+ fprintf(stderr,"\n");
+# if PTIME
+ fprintf(stderr,"Write time %5.3f s\n",(double)dt/1000000);
+# endif
+ }
+
+ if ( wr > 6 )
+ wr -= 6;
+ else
+ wr = -1;
+ return wr;
+
+}
+
+/*******************************************************************/
+/* Function readData() */
+/* Convenience function */
+/* give credit and read then the expected datas */
+/* Input: int fd file handle */
+/* unsigned char socketID the destination socket */
+/* unsigned char *buf the datas to be send */
+/* int len howmany datas are to we send */
+/* */
+/* Return: number of bytes written or -1; */
+/* */
+/*******************************************************************/
+
+int readData(int fd, unsigned char socketID, unsigned char *buf, int len)
+{
+ int ret;
+ /* give credit */
+ if ( Credit(fd, socketID, 1) == 1 )
+ {
+ /* wait a little bit */
+ usleep(1000);
+ ret = _readData(fd, buf, len);
+ return ret;
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+/*******************************************************************/
+/* Function readData() */
+/* Convenience function */
+/* give credit and read then the expected datas */
+/* Input: int fd file handle */
+/* unsigned char socketID the destination socket */
+/* unsigned char *buf the datas to be send */
+/* int len howmany datas are to we send */
+/* */
+/* Return: number of bytes written or -1; */
+/* */
+/*******************************************************************/
+
+void flushData(int fd, unsigned char socketID)
+{
+ if (debugD4)
+ fprintf(stderr, "flushData %d\n", socketID);
+ /* give credit */
+ if (socketID != (unsigned char) -1)
+ {
+ if ( Credit(fd, socketID, 1) == 1 )
+ {
+ /* wait a little bit */
+ usleep(1000);
+ _flushData(fd);
+ }
+ }
+ else
+ _flushData(fd);
+}
+
+/*******************************************************************/
+/* Function clearSndBuf() */
+/* Convenience function */
+/* */
+/* Input: int fd file handle */
+/* */
+/* */
+/*******************************************************************/
+
+static void clearSndBuf(int fd)
+{
+ char buf[256];
+ struct itimerval ti, oti;
+
+ SET_TIMER(ti,oti, d4RdTimeout);
+ while ( read(fd, buf, sizeof(buf) ) > 0 )
+ SET_TIMER(ti,oti, d4RdTimeout);
+ RESET_TIMER(ti,oti);
+}
+
+void setDebug(int debug)
+{
+ debugD4 = debug;
+}
+
+#if 0 /* implementation later ? */
+int InitReply(int fd)
+{
+ unsigned char buf[20];
+ initReply_t cmd;
+
+ cmd.head.psid = 0;
+ cmd.head.ssid = 0;
+ cmd.head.lengthH = 0;
+ cmd.head.lengthL = 9;
+ cmd.head.credit = 1;
+ cmd.head.control = 0;
+ cmd.head.command = 0x80;
+ cmd.head.result = 0; /* put the correct value here, 0,1,2 or 0x0b */
+ cmd.revision = 0x10;
+
+}
+
+int ExitReply(int fd)
+{
+ replyHeader_t cmd;
+ cmd.psid = 0;
+ cmd.ssid = 0;
+ cmd.lengthH = 0;
+ cmd.lengthL = 7;
+ cmd.credit = 1; /* always ignored */
+ cmd.control = 0;
+ cmd.command = 0x88;
+ cmd.result = 0x0; /* put the correct value here always 0 */
+}
+
+int Error(int fd)
+{
+ char
+ error_t cmd;
+ cmd.head.psid = 0;
+ cmd.head.ssid = 0;
+ cmd.head.lengthH = 0;
+ cmd.head.lengthL = 0x0a;
+ cmd.head.credit = 0;
+ cmd.head.control = 0;
+ cmd.head.command = 0x7f;
+ cmd.epsid = psid;
+ cmd.essid = ssid;
+ cmd.ecode = 0x80; /* + 1...7 */
+}
+
+int GetSocketIDReply(int fd, unsigned char socketID)
+{
+ /* the service name may not be longer as 40 bytes */
+ int len = sizeof(replyHeader_t) + 1 + strlen(serviceName);
+ unsigned char buf[100];
+ replyHeader_t *cmd = buf;
+ cmd->psid = 0;
+ cmd->ssid = 0;
+ cmd->lengthH = 0;
+ cmd->lengthL = len & 0xff;
+ cmd->credit = 1;
+ cmd->control = 0;
+ cmd->command = 0x89;
+ cmd->result = 0; /* put the correct vale here 0 or 0x0a */
+ buf[sizeof(cmdHeader_t)] = socketID;
+ strcpy(buf+1+sizeof(cmdHeader_t), serviceName);
+
+}
+
+int GetServiceName(inf fd, unsigned char socketID)
+{
+ int rd;
+ unsigned char buf[100];
+ cmdHeader_t *cmd = buf;
+ cmd->psid = 0;
+ cmd->ssid = 0;
+ cmd->lengthH = 0;
+ cmd->lengthL = 8;
+ cmd->credit = 1;
+ cmd->control = 0;
+ cmd->command = 0x0a;
+ buf[sizeof(cmdHeader_t)] = socketID;
+}
+
+/* as GetSocketIDReply but with command 0x8a instead 0f 0x89 */
+int GetServiceNameReply(inf fd)
+{
+ /* the service name may not be longer as 40 bytes */
+ int len = sizeof(replyHeader_t) + 1 + strlen(serviceName);
+ unsigned char buf[100];
+ replyHeader_t *cmd = buf;
+ cmd->psid = 0;
+ cmd->ssid = 0;
+ cmd->lengthH = 0;
+ cmd->lengthL = len & 0xff;
+ cmd->credit = 1;
+ cmd->control = 0;
+ cmd->command = 0x8a;
+ cmd->result = 0; /* put the correct vale here 0 or 0x0a */
+ buf[sizeof(replyHeader_t)] = socketID;
+ strcpy(buf+1+sizeof(replyHeader_t), serviceName);
+
+}
+
+int CreditReply(int fd, unsigned char socketID, int credit)
+{
+ unsigned char buf[100];
+ replyHeader_t *cmd = buf;
+ cmd->psid = 0;
+ cmd->ssid = 0;
+ cmd->lengthH = 0;
+ cmd->lengthL = 0x0b;
+ cmd->credit = 1;
+ cmd->control = 0;
+ cmd->command = 0x83;
+ buf[sizeof(replyHeader_t)] = socketID;
+ buf[sizeof(replyHeader_t)+1] = socketID;
+}
+
+#endif
+
diff --git a/src/escputil/d4lib.h b/src/escputil/d4lib.h
new file mode 100644
index 0000000..41a6c6b
--- /dev/null
+++ b/src/escputil/d4lib.h
@@ -0,0 +1,51 @@
+/*
+ *
+ * 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 D4LIB_H
+
+#define D4LIB_H
+
+extern int debugD4; /* allow printout of debug informations */
+
+extern int EnterIEEE(int fd);
+extern int Init(int fd);
+extern int Exit(int fd);
+extern int GetSocketID(int fd, const char *serviceName);
+extern int OpenChannel(int fd, unsigned char sockId, int *sndSz, int *rcvSz);
+extern int CloseChannel(int fd, unsigned char socketID);
+extern int CreditRequest(int fd, unsigned char socketID);
+extern int Credit(int fd, unsigned char socketID, int credit);
+
+/* convenience function */
+extern int SafeWrite(int fd, const void *data, int len);
+extern int askForCredit(int fd, unsigned char socketID, int *sndSz, int *rcvSz);
+extern int writeData(int fd, unsigned char socketID, const unsigned char *buf, int len, int eoj);
+extern int readData(int fd, unsigned char socketID, unsigned char *buf, int len);
+extern int readAnswer(int fd, unsigned char *buf, int len);
+extern void flushData(int fd, unsigned char socketID);
+extern void setDebug(int debug);
+
+extern int d4WrTimeout;
+extern int d4RdTimeout;
+extern int ppid;
+
+#if D4_DEBUG
+#define DEBUG 1
+#endif
+
+#endif
+
diff --git a/src/escputil/escputil.c b/src/escputil/escputil.c
index 836889c..249c104 100644
--- a/src/escputil/escputil.c
+++ b/src/escputil/escputil.c
@@ -1,9 +1,9 @@
/*
- * "$Id: escputil.c,v 1.39.2.18 2004/05/08 19:47:36 rlk Exp $"
+ * "$Id: escputil.c,v 1.74 2005/04/26 02:01:09 rlk Exp $"
*
* Printer maintenance utility for EPSON Stylus (R) printers
*
- * Copyright 2000 Robert Krawitz (rlk@alum.mit.edu)
+ * Copyright 2000-2003 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
@@ -23,12 +23,14 @@
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#include "../../lib/libprintut.h"
+#include <gutenprint/gutenprint.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
+#include <signal.h>
+#include <sys/wait.h>
#if defined(HAVE_VARARGS_H) && !defined(HAVE_STDARG_H)
#include <varargs.h>
#else
@@ -40,7 +42,7 @@
#ifdef HAVE_POLL
#include <sys/poll.h>
#endif
-#ifdef __GNU_LIBRARY__
+#ifdef HAVE_GETOPT_H
#include <getopt.h>
#endif
#ifdef HAVE_READLINE_READLINE_H
@@ -49,22 +51,23 @@
#ifdef HAVE_READLINE_HISTORY_H
#include <readline/history.h>
#endif
-#include <gimp-print/gimp-print-intl-internal.h>
+#include <gutenprint/gutenprint-intl-internal.h>
+#include "d4lib.h"
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_extended_ink_info(int);
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 version " VERSION ", Copyright (C) 2000-2003 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");
@@ -87,34 +90,35 @@ 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__
+#ifdef HAVE_GETOPT_H
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 }
+ { "printer-name", 1, NULL, (int) 'P' },
+ { "raw-device", 1, NULL, (int) 'r' },
+ { "ink-level", 0, NULL, (int) 'i' },
+ { "extended-ink-info", 0, NULL, (int) 'e' },
+ { "clean-head", 0, NULL, (int) 'c' },
+ { "nozzle-check", 0, NULL, (int) 'n' },
+ { "align-head", 0, NULL, (int) 'a' },
+ { "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' },
+ { "short-name", 0, NULL, (int) 'S' },
+ { 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\
+Usage: escputil [-c | -n | -a | -i | -e | -s | -d | -l | -M]\n\
+ [-P printer | -r device] [-u] [-q] [-m model] [ -S ]\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\
+Examples: escputil --ink-level --raw-device /dev/usb/lp0\n\
+ escputil --clean-head --new --printer-name MyQueue\n\
\n\
Commands:\n\
-c|--clean-head Clean the print head.\n\
@@ -125,12 +129,12 @@ Examples: escputil --clean-head --printer stpex-on-third-floor\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\
+ -e|--extended-ink-info Obtain the extended ink information from the\n\
+ printer. This requires read/write access to the raw\n\
+ 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\
@@ -143,17 +147,18 @@ Examples: escputil --clean-head --printer stpex-on-third-floor\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\
+ newer). Only needed when not using a raw device.\n\
-q|--quiet Suppress the banner.\n\
+ -S|--short-name Print the short name of the printer with --identify.\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\
+Usage: escputil [-c | -n | -a | -i | -e | -s | -d | -l | -M]\n\
+ [-P printer | -r device] [-u] [-q] [-m model] [ -S ]\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\
+Examples: escputil -i -r /dev/usb/lp0\n\
+ escputil -c -u -P MyQueue\n\
\n\
Commands:\n\
-c Clean the print head.\n\
@@ -164,12 +169,12 @@ Examples: escputil -c -P stpex-on-third-floor\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\
+ -e Obtain the extended ink information from the printer.\n\
+ Only for R800 printer and friends. 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\
@@ -181,138 +186,47 @@ Examples: escputil -c -P stpex-on-third-floor\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\
+ Only needed when not using a raw device.\n\
-q Suppress the banner.\n\
+ -S Print the short name of the printer with -d.\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 },
- { "C41sx", N_("Stylus C41sx"), 3, 15, 0, 2, 9 },
- { "C41ux", N_("Stylus C41ux"), 3, 15, 0, 2, 9 },
- { "C42sx", N_("Stylus C42sx"), 3, 15, 0, 2, 9 },
- { "C42ux", N_("Stylus C42ux"), 3, 15, 0, 2, 9 },
- { "C43sx", N_("Stylus C43sx"), 3, 15, 0, 2, 9 },
- { "C43ux", N_("Stylus C43ux"), 3, 15, 0, 2, 9 },
- { "C44sx", N_("Stylus C44sx"), 3, 15, 0, 2, 9 },
- { "C44ux", N_("Stylus C44ux"), 3, 15, 0, 2, 9 },
- { "C50", N_("Stylus C50"), 3, 15, 0, 2, 9 },
- { "C60", N_("Stylus C60"), 3, 15, 0, 0, 0 },
- { "C61", N_("Stylus C61"), 3, 15, 0, 0, 0 },
- { "C62", N_("Stylus C62"), 3, 15, 0, 0, 0 },
- { "C63", N_("Stylus C63"), 4, 15, 0, 1, 7 },
- { "C64", N_("Stylus C64"), 4, 15, 0, 1, 7 },
- { "C70", N_("Stylus C70"), 4, 15, 0, 1, 7 },
- { "C80", N_("Stylus C80"), 4, 15, 0, 1, 7 },
- { "C82", N_("Stylus C82"), 4, 15, 0, 1, 7 },
- { "C83", N_("Stylus C83"), 4, 15, 0, 1, 7 },
- { "C84", N_("Stylus C84"), 4, 15, 0, 1, 7 },
- { "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 },
- { "830", N_("Stylus Photo 830"), 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 },
- { "915", N_("Stylus Photo 915"), 3, 15, 0, 0, 0 },
- { "925", N_("Stylus Photo 925"), 3, 15, 0, 0, 0 },
- { "935", N_("Stylus Photo 935"), 3, 15, 0, 0, 0 },
- { "950", N_("Stylus Photo 950"), 4, 15, 0, 0, 0 },
- { "960", N_("Stylus Photo 960"), 4, 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 },
- { "2100", N_("Stylus Photo 2100"),4, 15, 0, 0, 0 },
- { "2200", N_("Stylus Photo 2200"),4, 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 },
- { "7600", N_("Stylus Pro 7600"), 3, 15, 0, 0, 0 },
- { "9000", N_("Stylus Pro 9000"), 1, 7, 0, 0, 0 },
- { "9500", N_("Stylus Pro 9500"), 1, 7, 0, 0, 0 },
- { "9600", N_("Stylus Pro 9600"), 3, 15, 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 },
- { "CX3100", N_("Stylus CX-3100"), 4, 15, 0, 1, 7 },
- { "CX3200", N_("Stylus CX-3200"), 4, 15, 0, 1, 7 },
- { "CX5100", N_("Stylus CX-5100"), 4, 15, 0, 1, 7 },
- { "CX5200", N_("Stylus CX-5200"), 4, 15, 0, 1, 7 },
- { "CX6300", N_("Stylus CX-6300"), 4, 15, 0, 1, 7 },
- { "CX6400", N_("Stylus CX-6400"), 4, 15, 0, 1, 7 },
- { "CX8300", N_("Stylus CX-8300"), 4, 15, 0, 1, 7 },
- { "CX8400", N_("Stylus CX-8400"), 4, 15, 0, 1, 7 },
- { NULL, NULL, 0, 0, 0, 0, 0 },
-};
-
-char *printer = NULL;
+char *the_printer = NULL;
char *raw_device = NULL;
char *printer_model = NULL;
char printer_cmd[1025];
int bufpos = 0;
int isnew = 0;
+int print_short_name = 0;
+const stp_printer_t *the_printer_t = NULL;
+int printer_was_in_packet_mode = 0;
+
+static int stp_debug = 0;
+#define STP_DEBUG(x) do { if (stp_debug || getenv("STP_DEBUG")) x; } while (0)
+static int send_size = 0x0200;
+static int receive_size = 0x0200;
+int socket_id = -1;
+
+typedef enum
+ {
+ CMD_INK_LEVEL,
+ CMD_STATUS
+ } status_cmd_t;
static void
print_models(void)
{
- stp_printer_t *printer = &printer_list[0];
- while (printer->short_name)
+ int printer_count = stp_printer_model_count();
+ int i;
+ for (i = 0; i < printer_count; i++)
{
- printf("%10s %s\n", printer->short_name, _(printer->long_name));
- printer++;
+ const stp_printer_t *printer = stp_get_printer_by_index(i);
+ if (strcmp(stp_printer_get_family(printer), "escp2") == 0)
+ {
+ printf("%-15s %s\n", stp_printer_get_driver(printer),
+ _(stp_printer_get_long_name(printer)));
+ }
}
}
@@ -324,19 +238,21 @@ do_help(int code)
}
static void
-exit_packet_mode(void)
+exit_packet_mode_old(int do_init)
{
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;
+ if (!do_init)
+ bufpos -= 2;
}
static void
-initialize_print_cmd(void)
+initialize_print_cmd(int do_init)
{
bufpos = 0;
if (isnew)
- exit_packet_mode();
+ exit_packet_mode_old(do_init);
}
int
@@ -351,14 +267,20 @@ main(int argc, char **argv)
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, PACKAGE_LOCALE_DIR);
#endif
-
+
+ stp_init();
+ if (getenv("STP_DEBUG"))
+ stp_debug = 1;
+ else
+ stp_debug = 0;
+ setDebug(stp_debug);
while (1)
{
-#ifdef __GNU_LIBRARY__
+#if defined(HAVE_GETOPT_H) && defined(HAVE_GETOPT_LONG)
int option_index = 0;
- c = getopt_long(argc, argv, "P:r:icnaosduqm:hlM", optlist, &option_index);
+ c = getopt_long(argc, argv, "P:r:iecnasduqm:hlMS", optlist, &option_index);
#else
- c = getopt(argc, argv, "P:r:icnaosduqm:hlM");
+ c = getopt(argc, argv, "P:r:iecnasduqm:hlMS");
#endif
if (c == -1)
break;
@@ -369,6 +291,7 @@ main(int argc, char **argv)
break;
case 'c':
case 'i':
+ case 'e':
case 'n':
case 'a':
case 'd':
@@ -379,21 +302,21 @@ main(int argc, char **argv)
operation = c;
break;
case 'P':
- if (printer || raw_device)
+ if (the_printer || raw_device)
{
printf(_("You may only specify one printer or raw device."));
do_help(1);
}
- printer = xmalloc(strlen(optarg) + 1);
- strcpy(printer, optarg);
+ the_printer = stp_malloc(strlen(optarg) + 1);
+ strcpy(the_printer, optarg);
break;
case 'r':
- if (printer || raw_device)
+ if (the_printer || raw_device)
{
printf(_("You may only specify one printer or raw device."));
do_help(1);
}
- raw_device = xmalloc(strlen(optarg) + 1);
+ raw_device = stp_malloc(strlen(optarg) + 1);
strcpy(raw_device, optarg);
break;
case 'm':
@@ -402,7 +325,7 @@ main(int argc, char **argv)
printf(_("You may only specify one printer model."));
do_help(1);
}
- printer_model = xmalloc(strlen(optarg) + 1);
+ printer_model = stp_malloc(strlen(optarg) + 1);
strcpy(printer_model, optarg);
break;
case 'u':
@@ -417,6 +340,9 @@ main(int argc, char **argv)
case 'M':
print_models();
exit(0);
+ case 'S':
+ print_short_name = 1;
+ break;
default:
printf("%s\n", _(banner));
fprintf(stderr, _("Unknown option %c\n"), c);
@@ -427,15 +353,15 @@ main(int argc, char **argv)
printf("%s\n", banner);
if (operation == 0)
{
- fprintf(stderr, "Usage: %s [OPTIONS] command\n", argv[0]);
+ fprintf(stderr, _("Usage: %s [OPTIONS] command\n"), argv[0]);
#ifdef __GNU_LIBRARY__
- fprintf(stderr, "Type `%s --help' for more information.\n", argv[0]);
+ fprintf(stderr, _("Type `%s --help' for more information.\n"), argv[0]);
#else
- fprintf(stderr, "Type `%s -h' for more information.\n", argv[0]);
+ fprintf(stderr, _("Type `%s -h' for more information.\n"), argv[0]);
#endif
exit(1);
}
- initialize_print_cmd();
+ initialize_print_cmd(1);
switch(operation)
{
case 'c':
@@ -447,12 +373,12 @@ main(int argc, char **argv)
case 'i':
do_ink_level();
break;
+ case 'e':
+ do_extended_ink_info(1);
+ break;
case 'a':
do_align();
break;
- case 'o':
- do_align_color();
- break;
case 'd':
do_identify();
break;
@@ -490,20 +416,20 @@ do_print_cmd(void)
!access("/usr/bin/lpr", X_OK) ||
!access("/usr/bsd/lpr", X_OK))
{
- if (printer == NULL)
+ if (the_printer == NULL)
strcpy(command, "lpr -l");
else
- snprintf(command, 1023, "lpr -P%s -l", printer);
+ snprintf(command, 1023, "lpr -P%s -l", the_printer);
}
- else if (printer == NULL)
+ else if (the_printer == NULL)
strcpy(command, "lp -s -oraw");
else
- snprintf(command, 1023, "lp -s -oraw -d%s", printer);
+ snprintf(command, 1023, "lp -s -oraw -d%s", the_printer);
if ((pfile = popen(command, "w")) == NULL)
{
- fprintf(stderr, _("Cannot print to printer %s with %s\n"), printer,
- command);
+ fprintf(stderr, _("Cannot print to printer %s with %s\n"),
+ the_printer, command);
return 1;
}
}
@@ -546,19 +472,17 @@ do_print_cmd(void)
}
static int
-read_from_printer(int fd, char *buf, int bufsize)
+read_from_printer(int fd, char *buf, int bufsize, int quiet)
{
#ifdef HAVE_POLL
struct pollfd ufds;
#endif
int status;
- int retry = 10;
-
+ int retry = 100;
#ifdef HAVE_FCNTL_H
fcntl(fd, F_SETFL,
O_NONBLOCK | fcntl(fd, F_GETFL));
#endif
-
memset(buf, 0, bufsize);
do
@@ -568,21 +492,27 @@ read_from_printer(int fd, char *buf, int bufsize)
ufds.events = POLLIN;
ufds.revents = 0;
if ((status = poll(&ufds, 1, 1000)) < 0)
- break; /* poll error */
+ break;
#endif
status = read(fd, buf, bufsize - 1);
if (status == 0 || (status < 0 && errno == EAGAIN))
{
- sleep(1);
+ usleep(20000);
status = 0; /* not an error (read would have blocked) */
}
}
while ((status == 0) && (--retry != 0));
if (status == 0 && retry == 0)
- fprintf(stderr, _("Read from printer timed out\n"));
+ {
+ if (!quiet)
+ fprintf(stderr, _("Read from printer timed out\n"));
+ }
else if (status < 0)
- fprintf(stderr, _("Cannot read from %s: %s\n"), raw_device, strerror(errno));
+ {
+ if (!quiet)
+ fprintf(stderr, _("Cannot read from %s: %s\n"), raw_device, strerror(errno));
+ }
return status;
}
@@ -611,6 +541,16 @@ do_remote_cmd(const char *cmd, int nargs, ...)
}
static void
+add_string(const char *str, int size)
+{
+ if (size > 0)
+ {
+ memcpy(printer_cmd + bufpos, str, size);
+ bufpos += size;
+ }
+}
+
+static void
add_newlines(int count)
{
int i;
@@ -632,185 +572,672 @@ add_resets(int count)
}
}
-const char *colors[] =
+static int
+init_packet(int fd, int force)
{
- N_("Black"),
- N_("Cyan"),
- N_("Magenta"),
- N_("Yellow"),
- N_("Light Cyan"),
- N_("Light Magenta"),
- N_("Black/Dark Yellow"),
- 0
-};
+ int status;
-void
-do_ink_level(void)
+ if (!force)
+ {
+ STP_DEBUG(fprintf(stderr, "Flushing data...\n"));
+ flushData(fd, (unsigned char) -1);
+ }
+
+ STP_DEBUG(fprintf(stderr, "EnterIEEE...\n"));
+ if (!EnterIEEE(fd))
+ {
+ return 1;
+ }
+ STP_DEBUG(fprintf(stderr, "Init...\n"));
+ if (!Init(fd))
+ {
+ return 1;
+ }
+
+ STP_DEBUG(fprintf(stderr, "GetSocket...\n"));
+ socket_id = GetSocketID(fd, "EPSON-CTRL");
+ if (!socket_id)
+ {
+ return 1;
+ }
+ STP_DEBUG(fprintf(stderr, "OpenChannel...\n"));
+ switch ( OpenChannel(fd, socket_id, &send_size, &receive_size) )
+ {
+ case -1:
+ STP_DEBUG(fprintf(stderr,"Fatal Error return 1\n"));
+ return 1; /* unrecoverable error */
+ break;
+ case 0:
+ STP_DEBUG(fprintf(stderr, "Error\n")); /* recoverable error ? */
+ return 1;
+ break;
+ }
+
+ status = 1;
+ STP_DEBUG(fprintf(stderr, "Flushing data...\n"));
+ flushData(fd, socket_id);
+ return 0;
+}
+
+static volatile int alarm_interrupt;
+
+static void
+alarm_handler(int sig)
+{
+ alarm_interrupt = 1;
+}
+
+static const stp_printer_t *
+initialize_printer(int quiet)
{
+ int printer_count = stp_printer_model_count();
+ int found = 0;
+ int packet_initialized = 0;
int fd;
- int status;
- int retry = 6;
- char buf[1024];
- char *ind;
int i;
- if (!raw_device)
+ int credit;
+ int retry = 4;
+ int tries = 0;
+ int status;
+ int forced_packet_mode = 0;
+ char* pos;
+ char* spos;
+ unsigned char buf[1024];
+ const char init_str[] = "\033\1@EJL ID\r\n";
+
+ quiet = 0;
+
+ fd = open(raw_device, O_RDWR, 0666);
+ if (fd == -1)
{
- fprintf(stderr,_("Obtaining ink levels requires using a raw device.\n"));
+ fprintf(stderr, _("Cannot open %s read/write: %s\n"), raw_device,
+ strerror(errno));
exit(1);
}
- do
+
+ if (!printer_model)
{
- if (retry <= 4)
- sleep(1);
- fd = open(raw_device, O_RDWR, 0666);
- if (fd == -1)
+ do
{
- fprintf(stderr, _("Cannot open %s read/write: %s\n"), raw_device,
- strerror(errno));
- exit(1);
- }
- add_resets(2);
- initialize_print_cmd();
- if (isnew && !(retry & 1))
- do_remote_cmd("IQ", 1, 1);
- else
- do_remote_cmd("ST", 2, 0, 1);
- add_resets(2);
- if (write(fd, printer_cmd, bufpos) < bufpos)
+ alarm_interrupt = 0;
+ signal(SIGALRM, alarm_handler);
+ alarm(5);
+ status = SafeWrite(fd, init_str, sizeof(init_str) - 1);
+ alarm(0);
+ signal(SIGALRM, SIG_DFL);
+ STP_DEBUG(fprintf(stderr, "status %d alarm %d\n", status, alarm_interrupt));
+ if (status != sizeof(init_str) - 1 && (status != -1 || !alarm_interrupt))
+ {
+ fprintf(stderr, _("Cannot write to %s: %s\n"), raw_device,
+ strerror(errno));
+ exit(1);
+ }
+ STP_DEBUG(fprintf(stderr, "Try %d alarm %d\n", tries, alarm_interrupt));
+ STP_DEBUG(fprintf(stderr, "Reading response of old init command ...\n"));
+ status = read_from_printer(fd, (char*)buf, 1024, 1);
+ if (status <= 0 && tries > 0)
+ {
+ forced_packet_mode = !init_packet(fd, 1);
+ status = 1;
+ }
+ if (status > 0 && !strstr((char *) buf, "@EJL ID") && tries < 1)
+ {
+ STP_DEBUG(fprintf(stderr, "Found bad data: %s\n", buf));
+ /*
+ * We know the printer's not dead. Try to turn off status
+ * and try again.
+ */
+ initialize_print_cmd(1);
+ do_remote_cmd("ST", 2, 0, 0);
+ add_resets(2);
+ (void) SafeWrite(fd, printer_cmd, bufpos);
+ status = 0;
+ }
+ tries++;
+ } while (status <= 0);
+
+ if (forced_packet_mode || ((buf[3] == status) && (buf[6] == 0x7f)))
{
- fprintf(stderr, _("Cannot write to %s: %s\n"), raw_device,
- strerror(errno));
- exit(1);
+ STP_DEBUG(fprintf(stderr, "Printer in packet mode....\n"));
+ packet_initialized = 1;
+ isnew = 1;
+
+ credit = askForCredit(fd, socket_id, &send_size, &receive_size);
+ if ( credit > -1 )
+ {
+ /* request status command */
+ if ( (status = writeData(fd, socket_id, (const unsigned char*)"di\1\0\1", 5, 1)) > 0 )
+ {
+ do
+ {
+ if ( ( status = readData(fd, socket_id, (unsigned char*)buf, 1023) ) <= -1 )
+ {
+ return NULL;
+ }
+ STP_DEBUG(fprintf(stderr, "readData try %d status %d\n", retry, status));
+ }
+ while ( (retry-- != 0) && strncmp("di", (char*)buf, 2) && strncmp("@EJL ID", (char*)buf, 7));
+ if (!retry)
+ {
+ return NULL;
+ }
+ }
+ else /* could not write */
+ {
+ fprintf(stderr, _("\nCannot write to %s: %s\n"), raw_device, strerror(errno));
+ return NULL;
+ }
+ }
+ else /* no credit */
+ {
+ STP_DEBUG(fprintf(stderr, _("\nCannot get credit (packet mode)!\n")));
+ return NULL;
+ }
}
- status = read_from_printer(fd, buf, 1024);
- if (status < 0)
- exit(1);
- (void) close(fd);
- ind = buf;
- do
- ind = strchr(ind, 'I');
- while (ind && ind[1] != 'Q' && (ind[1] != '\0' && ind[2] != ':'));
- if (!ind || ind[1] != 'Q' || ind[2] != ':' || ind[3] == ';')
+ STP_DEBUG(fprintf(stderr, "status: %i\n", status));
+ STP_DEBUG(fprintf(stderr, "Buf: %s\n", buf));
+ if (status > 0)
{
- ind = NULL;
+ pos = strstr((char*)buf, "@EJL ID");
+ STP_DEBUG(fprintf(stderr, "pos: %s\n", pos));
+ if (pos)
+ pos = strchr(pos, (int) ';');
+ STP_DEBUG(fprintf(stderr, "pos: %s\n", pos));
+ if (pos)
+ pos = strchr(pos + 1, (int) ';');
+ STP_DEBUG(fprintf(stderr, "pos: %s\n", pos));
+ if (pos)
+ pos = strchr(pos, (int) ':');
+ STP_DEBUG(fprintf(stderr, "pos: %s\n", pos));
+ if (pos)
+ {
+ spos = strchr(pos, (int) ';');
+ }
+ if (!pos)
+ {
+ if (!quiet)
+ {
+ printf(_("\nCannot detect printer type.\n"
+ "Please use -m to specify your printer model.\n"));
+ do_help(1);
+ }
+ return NULL;
+ }
+ if (spos)
+ *spos = '\000';
+ printer_model = pos + 1;
+ STP_DEBUG(fprintf(stderr, "printer model: %s\n", printer_model));
}
- } while (--retry != 0 && !ind);
- if (!ind)
- {
- fprintf(stderr, _("Cannot parse output from printer\n"));
- exit(1);
}
- ind += 3;
- printf("%20s %s\n", _("Ink color"), _("Percent remaining"));
- for (i = 0; i < 7; i++)
+
+ i = 0;
+ while ((i < printer_count) && !found)
{
- int val, j;
- if (!ind[0] || ind[0] == ';')
- exit(0);
- for (j = 0; j < 2; j++)
+ the_printer_t = stp_get_printer_by_index(i);
+
+ if (strcmp(stp_printer_get_family(the_printer_t), "escp2") == 0)
{
- 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);
+ const char *short_name = stp_printer_get_driver(the_printer_t);
+ const char *long_name = stp_printer_get_long_name(the_printer_t);
+ if (!strcasecmp(printer_model, short_name) ||
+ !strcasecmp(printer_model, long_name) ||
+ (!strncmp(short_name, "escp2-", strlen("escp2-")) &&
+ !strcasecmp(printer_model, short_name + strlen("escp2-"))) ||
+ (!strncmp(long_name, "EPSON ", strlen("EPSON ")) &&
+ !strcasecmp(printer_model, long_name + strlen("EPSON "))))
+ {
+ const stp_vars_t *printvars;
+ stp_parameter_t desc;
+
+ printvars = stp_printer_get_defaults(the_printer_t);
+ stp_describe_parameter(printvars, "SupportsPacketMode",
+ &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_BOOLEAN)
+ isnew = desc.deflt.boolean;
+ stp_parameter_description_destroy(&desc);
+ found = 1;
+ STP_DEBUG(fprintf(stderr, "Found it! %s\n", printer_model));
+
+ }
}
- val = (ind[0] << 4) + ind[1];
- printf("%20s %3d\n", _(colors[i]), val);
- ind += 2;
+ i++;
}
- exit(0);
+
+ if (isnew && !packet_initialized)
+ {
+ isnew = !init_packet(fd, 0);
+ }
+
+ close(fd);
+ STP_DEBUG(fprintf(stderr, "new? %s\n", isnew?"yes":"no"));
+ return (found)?the_printer_t:NULL;
}
-void
-do_identify(void)
+static const stp_printer_t *
+get_printer(int quiet)
+{
+ if (the_printer_t)
+ return the_printer_t;
+ else
+ {
+ const stp_printer_t *printer = initialize_printer(quiet);
+ STP_DEBUG(fprintf(stderr, "init done...\n"));
+ return printer;
+ }
+}
+
+static const char *colors_new[] =
+ {
+ N_("Black"),
+ N_("Matte Black"),
+ N_("Photo Black"),
+ N_("Cyan"),
+ N_("Magenta"),
+ N_("Yellow"),
+ N_("Light Cyan"),
+ N_("Light Magenta"),
+ N_("Dark Yellow"),
+ N_("Light Black"),
+ N_("unknown"),
+ N_("Red"),
+ N_("Blue"),
+ N_("Gloss Optimizer"),
+ };
+
+static int color_count = sizeof(colors_new) / sizeof(const char *);
+
+static void
+do_status_command_internal(status_cmd_t cmd)
{
int fd;
int status;
+ int credit;
+ int col_number;
+ int retry = 4;
char buf[1024];
+ char *ind = NULL;
+ char *oind;
+ int i;
+ const stp_printer_t *printer;
+ const stp_vars_t *printvars;
+ stp_parameter_t desc;
+ const char *cmd_name = NULL;
+ switch (cmd)
+ {
+ case CMD_INK_LEVEL:
+ cmd_name = _("ink levels");
+ break;
+ case CMD_STATUS:
+ cmd_name = _("status");
+ break;
+ }
if (!raw_device)
{
- fprintf(stderr,
- _("Printer identification requires using a raw device.\n"));
+ fprintf(stderr,_("Obtaining %s requires using a raw device.\n"),
+ _(cmd_name));
exit(1);
}
+
+ STP_DEBUG(fprintf(stderr, "%s...\n", cmd_name));
+ printer = get_printer(1);
+ STP_DEBUG(fprintf(stderr, "%s found %s\n", cmd_name,
+ stp_printer_get_long_name(printer)));
+ if (!printer)
+ {
+ fprintf(stderr, _("Cannot identify printer!\n"));
+ exit(0);
+ }
+ printvars = stp_printer_get_defaults(printer);
+ stp_describe_parameter(printvars, "ChannelNames", &desc);
+ if (desc.p_type != STP_PARAMETER_TYPE_STRING_LIST)
+ {
+ fprintf(stderr, _("Printer does not support listing ink types!\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));
+ 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))
+
+ if (isnew)
{
- fprintf(stderr, _("Cannot write to %s: %s\n"),
- raw_device, strerror(errno));
+ credit = askForCredit(fd, socket_id, &send_size, &receive_size);
+ if ( credit > -1 )
+ {
+ /* request status command */
+ if ( (status = writeData(fd, socket_id, (const unsigned char*)"st\1\0\1", 5, 1)) > 0 )
+ {
+ do
+ {
+ if ( ( status = readData(fd, socket_id, (unsigned char*)buf, 1023) ) <= -1 )
+ {
+ stp_parameter_description_destroy(&desc);
+ exit(1);
+ }
+ STP_DEBUG(fprintf(stderr, "readData try %d status %d\n", retry, status));
+ }
+ while ( (retry-- != 0) && strncmp("st", buf, 2) && strncmp("@BDC ST", buf, 7) );
+ /* "@BCD ST ST" found */
+ if (!retry)
+ {
+ stp_parameter_description_destroy(&desc);
+ exit(1);
+ }
+ buf[status] = '\0';
+ if (cmd == CMD_INK_LEVEL)
+ {
+ if ( buf[7] == '2' )
+ {
+ STP_DEBUG(fprintf(stderr, "New format ink!\n"));
+ /* new binary format ! */
+ i = 10;
+ while (buf[i] != 0x0f && i < status)
+ i += buf[i + 1] + 2;
+ ind = buf + i;
+ i = 4;
+ col_number = 0;
+ printf("%20s %s\n", _("Ink color"), _("Percent remaining"));
+ while (i < ind[1] + 3)
+ {
+ if (ind[i] == 0)
+ {
+ /* black */
+ switch (col_number)
+ {
+ case 0:
+ printf("%20s %3d\n", _(colors_new[0]), ind[i + 1]);
+ break;
+ case 3:
+ printf("%20s %3d\n", _(colors_new[1]), ind[i + 1]);
+ break;
+ case 4:
+ printf("%20s %3d\n", _(colors_new[2]), ind[i + 1]);
+ break;
+ }
+ }
+ else
+ {
+ if (ind[i] + 2 < color_count)
+ printf("%20s %3d\n", _(colors_new[ind[i] + 2]), ind[i + 1]);
+ else
+ printf("%18s%2x %3d\n", _("Unknown"), ind[i] + 2, ind[i + 1]);
+ }
+ col_number++;
+ i+=3;
+ }
+ ind = NULL;
+ }
+ else
+ /* old format */
+ {
+ STP_DEBUG(fprintf(stderr, "Old format ink!\n"));
+ buf[status] = '\0';
+ ind = buf;
+ do
+ {
+ oind = ind;
+ ind = strchr(ind, 'I');
+ }
+ while (ind && oind != ind && ind[1] != 'Q' && (ind[1] != '\0' && ind[2] != ':'));
+ if (!ind || ind[1] != 'Q' || ind[2] != ':' || ind[3] == ';')
+ {
+ ind = NULL;
+ }
+ }
+ }
+ else
+ ind = buf;
+ CloseChannel(fd, socket_id);
+ }
+ else /* could not write */
+ {
+ stp_parameter_description_destroy(&desc);
+ fprintf(stderr, _("\nCannot write to %s: %s\n"), raw_device, strerror(errno));
+ exit(1);
+ }
+ }
+ else /* no credit */
+ {
+ stp_parameter_description_destroy(&desc);
+ STP_DEBUG(fprintf(stderr, _("\nCannot get credit (packet mode)!\n")));
+ exit(1);
+ }
+ }
+ else
+ {
+ do
+ {
+ add_resets(2);
+ initialize_print_cmd(1);
+ do_remote_cmd("ST", 2, 0, 1);
+ add_resets(2);
+ if (SafeWrite(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, 1);
+ if (status < 0)
+ {
+ stp_parameter_description_destroy(&desc);
+ exit(1);
+ }
+ ind = buf;
+ if (cmd == CMD_INK_LEVEL)
+ {
+ do
+ {
+ oind = ind;
+ ind = strchr(ind, 'I');
+ }
+ while (ind && oind != ind && ind[1] != 'Q' && (ind[1] != '\0' && ind[2] != ':'));
+ if (!ind || ind[1] != 'Q' || ind[2] != ':' || ind[3] == ';')
+ {
+ ind = NULL;
+ }
+ }
+ } while (--retry != 0 && !ind);
+ }
+
+ if (!ind)
+ {
+ stp_parameter_description_destroy(&desc);
exit(1);
}
- status = read_from_printer(fd, buf, 1024);
- if (status < 0)
- exit(1);
- printf("%s\n", buf);
+
+ if (cmd == CMD_INK_LEVEL)
+ {
+ ind += 3;
+
+ printf("%20s %s\n", _("Ink color"), _("Percent remaining"));
+ for (i = 0; i < stp_string_list_count(desc.bounds.str); 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",_(stp_string_list_param(desc.bounds.str, i)->text),
+ val);
+ ind += 2;
+ }
+ }
+ else
+ {
+ char *where;
+ while ((where = strchr(ind, ';')) != NULL)
+ *where = '\n';
+ printf("%s\n", ind);
+ }
+ stp_parameter_description_destroy(&desc);
(void) close(fd);
exit(0);
}
void
-do_status(void)
+do_ink_level(void)
+{
+ do_status_command_internal(CMD_INK_LEVEL);
+}
+
+void
+do_extended_ink_info(int extended_output)
{
int fd;
int status;
+ int credit;
+ int retry = 4;
char buf[1024];
- char *where;
- memset(buf, 0, 1024);
+ unsigned val, id, year, month, ik1, ik2;
+
+ char *ind;
+ int i;
+ const stp_printer_t *printer;
+ const stp_vars_t *printvars;
+ stp_parameter_t desc;
+
if (!raw_device)
{
- fprintf(stderr, _("Printer status requires using a raw device.\n"));
+ fprintf(stderr,_("Obtaining extended ink information requires using a raw device.\n"));
exit(1);
}
+
+ printer = get_printer(1);
+ if (!printer)
+ {
+ fprintf(stderr, _("Cannot identify printer!\n"));
+ exit(0);
+ }
+ printvars = stp_printer_get_defaults(printer);
+ stp_describe_parameter(printvars, "ChannelNames", &desc);
+
fd = open(raw_device, O_RDWR, 0666);
if (fd == -1)
{
fprintf(stderr, _("Cannot open %s read/write: %s\n"), raw_device,
- strerror(errno));
+ strerror(errno));
exit(1);
}
- bufpos = 0;
- initialize_print_cmd();
- do_remote_cmd("ST", 2, 0, 1);
- if (write(fd, printer_cmd, bufpos) < bufpos)
+
+ if (isnew)
{
- fprintf(stderr, _("Cannot write to %s: %s\n"),
- raw_device, strerror(errno));
- exit(1);
+ for (i = 0; i < stp_string_list_count(desc.bounds.str); i++)
+ {
+ credit = askForCredit(fd, socket_id, &send_size, &receive_size);
+ if ( credit > -1 )
+ {
+ char req[] = "ii\2\0\1\1";
+ req[5] = i + 1;
+ /* request status command */
+ if ( (status = writeData(fd, socket_id, (const unsigned char*)req, 6, 1)) > 0 )
+ {
+ retry = 4;
+ do
+ {
+ if ( ( status = readData(fd, socket_id, (unsigned char*) buf, 1023) ) <= -1 )
+ {
+ stp_parameter_description_destroy(&desc);
+ exit(1);
+ }
+ } while ((retry-- != 0) && strncmp("ii", buf, 2) && strncmp("@BDC PS", buf, 7));
+ if (!retry) /* couldn't read answer */
+ {
+ stp_parameter_description_destroy(&desc);
+ exit(1);
+ }
+ ind = strchr(buf, 'I');
+ if (sscanf(ind,
+ "II:01;IQT:%x;TSH:NAVL;PDY:%x;PDM:%x;IC1:%x;IC2:000A;IK1:%x;IK2:%x;TOV:18;TVU:06;LOG:INKbyEPSON;",
+ &val, &year, &month, &id, &ik1, &ik2 ) == 6)
+ {
+ if (i == 0)
+ printf("%15s %20s %12s %7s\n",
+ _("Ink color"), _("Percent remaining"), _("Part number"),
+ _("Date"));
+ printf("%15s %20d T0%03d 20%02d-%02d\n",
+ _(stp_string_list_param(desc.bounds.str, i)->text),
+ val, id, year, month);
+ }
+ }
+ else /* could not write */
+ {
+ stp_parameter_description_destroy(&desc);
+ exit(1);
+ }
+ }
+ else /* no credit */
+ {
+ stp_parameter_description_destroy(&desc);
+ exit(1);
+ }
+ }
+ CloseChannel(fd, socket_id);
}
- status = read_from_printer(fd, buf, 1024);
- if (status < 0)
- exit(1);
- initialize_print_cmd();
- do_remote_cmd("ST", 2, 0, 0);
- add_resets(2);
- (void) write(fd, printer_cmd, bufpos);
- (void) read_from_printer(fd, buf, 1024);
- while ((where = strchr(buf, ';')) != NULL)
- *where = '\n';
- printf("%s\n", buf);
- (void) close(fd);
+ else
+ {
+ (void) close(fd);
+ do_ink_level();
+ }
+ stp_parameter_description_destroy(&desc);
exit(0);
}
+void
+do_identify(void)
+{
+ const stp_printer_t *printer;
+ if (!raw_device)
+ {
+ fprintf(stderr,
+ _("Printer identification requires using a raw device.\n"));
+ exit(1);
+ }
+ if (printer_model)
+ printer_model = NULL;
+ printer = get_printer(1);
+ if (printer)
+ {
+ if (print_short_name)
+ printf("%s\n", stp_printer_get_driver(printer));
+ else
+ printf("%s\n", _(stp_printer_get_long_name(printer)));
+ exit(0);
+ }
+ else
+ {
+ fprintf(stderr, _("Cannot identify printer model.\n"));
+ exit(1);
+ }
+}
+
+void
+do_status(void)
+{
+ do_status_command_internal(CMD_STATUS);
+ exit(1);
+}
+
void
do_head_clean(void)
{
+ if (raw_device)
+ (void) get_printer(1);
do_remote_cmd("CH", 2, 0, 0);
printf(_("Cleaning heads...\n"));
exit(do_print_cmd());
@@ -819,6 +1246,8 @@ do_head_clean(void)
void
do_nozzle_check(void)
{
+ if (raw_device)
+ (void) get_printer(1);
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"));
@@ -908,75 +1337,6 @@ printer_error(void)
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)
- 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)
{
@@ -1032,7 +1392,7 @@ do_final_alignment(void)
{
printf(_("About to save settings..."));
fflush(stdout);
- initialize_print_cmd();
+ initialize_print_cmd(1);
do_remote_cmd("SV", 0);
if (do_print_cmd())
{
@@ -1071,10 +1431,45 @@ do_align(void)
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;
+ const stp_printer_t *printer = get_printer(0);
+ stp_parameter_t desc;
+ int passes = 0;
+ int choices = 0;
+ const char *printer_name;
+ stp_vars_t *v = stp_vars_create();
+
+ if (!printer)
+ return;
+
+ printer_name = stp_printer_get_long_name(printer);
+ stp_set_driver(v, stp_printer_get_driver(printer));
+
+ stp_describe_parameter(v, "AlignmentPasses", &desc);
+ if (desc.p_type != STP_PARAMETER_TYPE_INT)
+ {
+ fprintf(stderr,
+ "Unable to retrieve number of alignment passes for printer %s\n",
+ printer_name);
+ return;
+ }
+ passes = desc.deflt.integer;
+ stp_parameter_description_destroy(&desc);
+
+ stp_describe_parameter(v, "AlignmentChoices", &desc);
+ if (desc.p_type != STP_PARAMETER_TYPE_INT)
+ {
+ fprintf(stderr,
+ "Unable to retrieve number of alignment choices for printer %s\n",
+ printer_name);
+ return;
+ }
+ choices = desc.deflt.integer;
+ stp_parameter_description_destroy(&desc);
+ if (passes <= 0 || choices <= 0)
+ {
+ printf("No alignment required for printer %s\n", printer_name);
+ return;
+ }
do
{
@@ -1082,14 +1477,14 @@ do_align(void)
printf(_(printer_msg), _(printer_name));
inbuf = do_get_input(_("Press enter to continue > "));
top:
- initialize_print_cmd();
+ initialize_print_cmd(1);
for (curpass = 0; curpass < passes; curpass++)
do_remote_cmd("DT", 3, 0, curpass, 0);
if (do_print_cmd())
printer_error();
printf(_("Please inspect the print, and choose the best pair of lines in each pattern.\n"
"Type a pair number, '?' for help, or 'r' to repeat the procedure.\n"));
- initialize_print_cmd();
+ initialize_print_cmd(1);
for (curpass = 1; curpass <= passes; curpass ++)
{
reread:
@@ -1101,7 +1496,7 @@ do_align(void)
case 'R':
printf(_("Please insert a fresh sheet of paper.\n"));
fflush(stdout);
- initialize_print_cmd();
+ initialize_print_cmd(1);
(void) do_get_input(_("Press enter to continue > "));
/* Ick. Surely there's a cleaner way? */
goto top;
@@ -1146,7 +1541,7 @@ do_align(void)
"quality printing.\n"), (choices + 1) / 2);
printf(_("Please insert a fresh sheet of paper.\n"));
(void) do_get_input(_("Press enter to continue > "));
- initialize_print_cmd();
+ initialize_print_cmd(1);
for (curpass = 0; curpass < passes; curpass++)
do_remote_cmd("DT", 3, 0, curpass, 0);
if (do_print_cmd())
@@ -1155,129 +1550,6 @@ do_align(void)
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)
{
@@ -1288,12 +1560,12 @@ do_get_input (const char *prompt)
/* free only if previously allocated */
if (input)
{
- free (input);
+ stp_free (input);
input = NULL;
}
#if (HAVE_LIBREADLINE > 0 && defined HAVE_READLINE_READLINE_H)
/* get input with libreadline, if present */
- input = readline ((char *) prompt);
+ input = readline (prompt);
/* if input, add to history list */
#ifdef HAVE_READLINE_HISTORY_H
if (input && *input)
@@ -1303,7 +1575,7 @@ do_get_input (const char *prompt)
#endif
#else
/* no libreadline; use fgets instead */
- input = xmalloc (sizeof (char) * BUFSIZ);
+ input = stp_malloc (sizeof (char) * BUFSIZ);
memset(input, 0, BUFSIZ);
printf ("%s", prompt);
fgets_status = fgets (input, BUFSIZ, stdin);
diff --git a/src/foomatic/Makefile.am b/src/foomatic/Makefile.am
index 8e14614..294104a 100644
--- a/src/foomatic/Makefile.am
+++ b/src/foomatic/Makefile.am
@@ -1,4 +1,4 @@
-## $Id: Makefile.am,v 1.16.2.15 2003/04/18 23:15:27 rlk Exp $
+## $Id: Makefile.am,v 1.45 2005/04/12 00:45:09 rlk Exp $
## Copyright (C) 2000 Roger Leigh
##
## This program is free software; you can redistribute it and/or modify
@@ -23,48 +23,40 @@ AUTOMAKE_OPTIONS = 1.4 gnu
MAINT_CHARSET = latin1
+include $(top_srcdir)/scripts/global.mk
-## Variables
-AM_CFLAGS = $(GNUCFLAGS)
-INCLUDES = @INCLUDES@ $(LIBGIMPPRINT_CFLAGS) -I$(top_srcdir)/src/main
-LIBPRINTUT = $(top_builddir)/lib/libprintut.la
-LIBS = $(INTLLIBS) @LIBS@
+## Variables
+DISTDIRS = foomatic-templates-ijs
+LOCAL_CPPFLAGS = $(GUTENPRINT_CFLAGS)
-## Programs
+if BUILD_FOOMATIC_3
+BUILD_FOOMATIC = 1
+endif
-FOOMATIC_NOINST_BIN = printer_options printer_margins paper_sizes gimp-print-version \
- stp_limits printers
-noinst_PROGRAMS = @FOOMATIC_NOINST_BIN@
+## Programs
-EXTRA_PROGRAMS = printer_options printer_margins gimp-print-version paper_sizes \
- stp_limits printers
+if BUILD_FOOMATIC
+noinst_PROGRAMS = printer_options printer_margins paper_sizes gutenprint-version \
+ printers
+endif
printer_options_SOURCES = printer_options.c
-printer_options_LDADD = $(LIBPRINTUT) $(LIBGIMPPRINT_LIBS)
-printer_options_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
+printer_options_LDADD = $(GUTENPRINT_LIBS)
printer_margins_SOURCES = printer_margins.c
-printer_margins_LDADD = $(LIBPRINTUT) $(LIBGIMPPRINT_LIBS)
-printer_margins_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
+printer_margins_LDADD = $(GUTENPRINT_LIBS)
-gimp_print_version_SOURCES = gimp-print-version.c
-gimp_print_version_LDADD = $(LIBPRINTUT) $(LIBGIMPPRINT_LIBS)
-gimp_print_version_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
+gutenprint_version_SOURCES = gutenprint-version.c
+gutenprint_version_LDADD = $(GUTENPRINT_LIBS)
paper_sizes_SOURCES = paper_sizes.c
-paper_sizes_LDADD = $(LIBPRINTUT) $(LIBGIMPPRINT_LIBS)
-paper_sizes_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
-
-stp_limits_SOURCES = stp_limits.c
-stp_limits_LDADD = $(LIBPRINTUT) $(LIBGIMPPRINT_LIBS)
-stp_limits_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
+paper_sizes_LDADD = $(GUTENPRINT_LIBS)
printers_SOURCES = printers.c
-printers_LDADD = $(LIBPRINTUT) $(LIBGIMPPRINT_LIBS)
-printers_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
+printers_LDADD = $(GUTENPRINT_LIBS)
## Rules
@@ -81,28 +73,11 @@ else
FOOMATIC_GENERATOR_FOOMATIC_3_OPTS =
endif
-if BUILD_FOOMATIC_OLDIDS
-FOOMATIC_GENERATOR_OLDIDS_OPTS = -o
-else
-FOOMATIC_GENERATOR_OLDIDS_OPTS =
-endif
-
-if BUILD_IJS
-FOOMATIC_GENERATOR_EXTRA_OPTS = -d all
-FOOMATIC_IJS = yes
-else
-FOOMATIC_GENERATOR_EXTRA_OPTS = -d noijs
-FOOMATIC_IJS =
-endif
-
all-local: $(INSTALL_DATA_LOCAL_DEPS)
install-data-local: $(INSTALL_DATA_LOCAL_DEPS)
if test -n "$(INSTALL_DATA_LOCAL_DEPS)" ; then \
- $(MAKE) install-kit FOOMATIC_DB=foomatic-db/gimp-print ; \
- if test -n "$(FOOMATIC_IJS)" ; then \
- $(MAKE) install-kit FOOMATIC_DB=foomatic-db/gimp-print-ijs ; \
- fi ; \
+ $(MAKE) install-kit FOOMATIC_DB=foomatic-db/gutenprint-ijs.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@ ; \
fi
install-kit:
@@ -118,23 +93,27 @@ clean-local:
foomatic-data: foomatic-stamp
-foomatic-stamp: foomatic-generator foomatic-printermap $(EXTRA_PROGRAMS)
+foomatic-stamp: foomatic-generator foomatic-printermap $(noinst_PROGRAMS) mk_printerlist $(top_srcdir)/src/main/printers.xml $(top_srcdir)/src/main/papers.xml
-$(RM) -r foomatic-db
- ./foomatic-generator -m $(srcdir)/foomatic-printermap -t $(srcdir)/foomatic-templates $(FOOMATIC_GENERATOR_EXTRA_OPTS) $(FOOMATIC_GENERATOR_FOOMATIC_3_OPTS) $(FOOMATIC_GENERATOR_OLDIDS_OPTS)
+ ./foomatic-generator -m $(srcdir)/foomatic-printermap -t $(srcdir)/foomatic-templates $(FOOMATIC_GENERATOR_EXTRA_OPTS) $(FOOMATIC_GENERATOR_FOOMATIC_3_OPTS)
touch foomatic-stamp
-$(LIBGIMPPRINT_LIBS):
- cd ../main ; \
- $(MAKE)
+dist-hook:
+ for dir in $(DISTDIRS) ; do \
+ if test -d $(srcdir)/$$dir ; then \
+ mkdir $(distdir)/$$dir; \
+ for dirfile in $(srcdir)/$$dir/*.xml; do \
+ if test -f $$dirfile ; then \
+ cp -p $$dirfile $(distdir)/$$dir; \
+ fi \
+ done \
+ fi \
+ done
## Clean
-CLEANFILES = $(noinst_PROGRAMS) foomatic-stamp
+CLEANFILES = foomatic-stamp
MAINTAINERCLEANFILES = Makefile.in
-EXTRA_DIST = foomatic-printermap \
- oldprinterids \
- foomatic-templates-gs/*.xml \
- foomatic-templates-ijs/*.xml
-
+EXTRA_DIST = foomatic-printermap
diff --git a/src/foomatic/Makefile.in b/src/foomatic/Makefile.in
index 5dea9ed..761df60 100644
--- a/src/foomatic/Makefile.in
+++ b/src/foomatic/Makefile.in
@@ -1,6 +1,8 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
-# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -10,330 +12,457 @@
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
+@SET_MAKE@
-SHELL = @SHELL@
+# Variables
+
+SOURCES = $(gutenprint_version_SOURCES) $(paper_sizes_SOURCES) $(printer_margins_SOURCES) $(printer_options_SOURCES) $(printers_SOURCES)
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-
-DESTDIR =
-
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
-
top_builddir = ../..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-transform = @program_transform_name@
-
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
-host_alias = @host_alias@
+build_triplet = @build@
host_triplet = @host@
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(srcdir)/foomatic-generator.in $(srcdir)/mk_printerlist.in \
+ $(top_srcdir)/scripts/global.mk
+@BUILD_FOOMATIC_TRUE@noinst_PROGRAMS = printer_options$(EXEEXT) \
+@BUILD_FOOMATIC_TRUE@ printer_margins$(EXEEXT) \
+@BUILD_FOOMATIC_TRUE@ paper_sizes$(EXEEXT) \
+@BUILD_FOOMATIC_TRUE@ gutenprint-version$(EXEEXT) \
+@BUILD_FOOMATIC_TRUE@ printers$(EXEEXT)
+subdir = src/foomatic
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gimp.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/stp.m4 $(top_srcdir)/m4/stp_cups.m4 \
+ $(top_srcdir)/m4/stp_gimp.m4 $(top_srcdir)/m4/stp_option.m4 \
+ $(top_srcdir)/m4/stp_release.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = foomatic-generator mk_printerlist
+PROGRAMS = $(noinst_PROGRAMS)
+am_gutenprint_version_OBJECTS = gutenprint-version.$(OBJEXT)
+gutenprint_version_OBJECTS = $(am_gutenprint_version_OBJECTS)
+am__DEPENDENCIES_1 = $(top_builddir)/src/main/libgutenprint.la
+gutenprint_version_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_paper_sizes_OBJECTS = paper_sizes.$(OBJEXT)
+paper_sizes_OBJECTS = $(am_paper_sizes_OBJECTS)
+paper_sizes_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_printer_margins_OBJECTS = printer_margins.$(OBJEXT)
+printer_margins_OBJECTS = $(am_printer_margins_OBJECTS)
+printer_margins_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_printer_options_OBJECTS = printer_options.$(OBJEXT)
+printer_options_OBJECTS = $(am_printer_options_OBJECTS)
+printer_options_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_printers_OBJECTS = printers.$(OBJEXT)
+printers_OBJECTS = $(am_printers_OBJECTS)
+printers_DEPENDENCIES = $(am__DEPENDENCIES_1)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(gutenprint_version_SOURCES) $(paper_sizes_SOURCES) \
+ $(printer_margins_SOURCES) $(printer_options_SOURCES) \
+ $(printers_SOURCES)
+DIST_SOURCES = $(gutenprint_version_SOURCES) $(paper_sizes_SOURCES) \
+ $(printer_margins_SOURCES) $(printer_options_SOURCES) \
+ $(printers_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
-AS = @AS@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
-BISON_PROG = @BISON_PROG@
-BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
-CATALOGS = @CATALOGS@
-CATOBJEXT = @CATOBJEXT@
+BUILD_CUPS_FALSE = @BUILD_CUPS_FALSE@
+BUILD_CUPS_PPDS_FALSE = @BUILD_CUPS_PPDS_FALSE@
+BUILD_CUPS_PPDS_TRUE = @BUILD_CUPS_PPDS_TRUE@
+BUILD_CUPS_TRUE = @BUILD_CUPS_TRUE@
+BUILD_ESCPUTIL_FALSE = @BUILD_ESCPUTIL_FALSE@
+BUILD_ESCPUTIL_TRUE = @BUILD_ESCPUTIL_TRUE@
+BUILD_FOOMATIC_3_FALSE = @BUILD_FOOMATIC_3_FALSE@
+BUILD_FOOMATIC_3_TRUE = @BUILD_FOOMATIC_3_TRUE@
+BUILD_FOOMATIC_FALSE = @BUILD_FOOMATIC_FALSE@
+BUILD_FOOMATIC_TRUE = @BUILD_FOOMATIC_TRUE@
+BUILD_GENPPD_STATIC_FALSE = @BUILD_GENPPD_STATIC_FALSE@
+BUILD_GENPPD_STATIC_TRUE = @BUILD_GENPPD_STATIC_TRUE@
+BUILD_GHOSTSCRIPT_FALSE = @BUILD_GHOSTSCRIPT_FALSE@
+BUILD_GHOSTSCRIPT_TRUE = @BUILD_GHOSTSCRIPT_TRUE@
+BUILD_GIMP2_FALSE = @BUILD_GIMP2_FALSE@
+BUILD_GIMP2_TRUE = @BUILD_GIMP2_TRUE@
+BUILD_GIMP_FALSE = @BUILD_GIMP_FALSE@
+BUILD_GIMP_TRUE = @BUILD_GIMP_TRUE@
+BUILD_LIBGUTENPRINTUI2_FALSE = @BUILD_LIBGUTENPRINTUI2_FALSE@
+BUILD_LIBGUTENPRINTUI2_TRUE = @BUILD_LIBGUTENPRINTUI2_TRUE@
+BUILD_LIBGUTENPRINTUI_FALSE = @BUILD_LIBGUTENPRINTUI_FALSE@
+BUILD_LIBGUTENPRINTUI_TRUE = @BUILD_LIBGUTENPRINTUI_TRUE@
+BUILD_MODULES_FALSE = @BUILD_MODULES_FALSE@
+BUILD_MODULES_TRUE = @BUILD_MODULES_TRUE@
+BUILD_TESTPATTERN_FALSE = @BUILD_TESTPATTERN_FALSE@
+BUILD_TESTPATTERN_TRUE = @BUILD_TESTPATTERN_TRUE@
+BUILD_TEST_FALSE = @BUILD_TEST_FALSE@
+BUILD_TEST_TRUE = @BUILD_TEST_TRUE@
+BUILD_TRANSLATED_CUPS_PPDS_FALSE = @BUILD_TRANSLATED_CUPS_PPDS_FALSE@
+BUILD_TRANSLATED_CUPS_PPDS_TRUE = @BUILD_TRANSLATED_CUPS_PPDS_TRUE@
CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
CONVERT = @CONVERT@
-CUPS_BACKEND_BIN = @CUPS_BACKEND_BIN@
-CUPS_BIN = @CUPS_BIN@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
CUPS_CFLAGS = @CUPS_CFLAGS@
-CUPS_CONF = @CUPS_CONF@
CUPS_CONFIG = @CUPS_CONFIG@
-CUPS_FILTER_BIN = @CUPS_FILTER_BIN@
-CUPS_INSTALL = @CUPS_INSTALL@
CUPS_LIBS = @CUPS_LIBS@
-CUPS_MAN = @CUPS_MAN@
-CUPS_NOINST_BIN = @CUPS_NOINST_BIN@
-CUPS_PKG = @CUPS_PKG@
+CUPS_PPDS_AT_TOP_LEVEL_FALSE = @CUPS_PPDS_AT_TOP_LEVEL_FALSE@
+CUPS_PPDS_AT_TOP_LEVEL_TRUE = @CUPS_PPDS_AT_TOP_LEVEL_TRUE@
CUPS_PPD_PS_LEVEL = @CUPS_PPD_PS_LEVEL@
-DATADIRNAME = @DATADIRNAME@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
DB2HTML = @DB2HTML@
DB2PDF = @DB2PDF@
DB2PS = @DB2PS@
-DLLTOOL = @DLLTOOL@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIALOG = @DIALOG@
+DOXYGEN = @DOXYGEN@
DVIPDF = @DVIPDF@
DVIPS = @DVIPS@
ECHO = @ECHO@
-ESCPUTIL_BIN = @ESCPUTIL_BIN@
-ESCPUTIL_MAN = @ESCPUTIL_MAN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
EXEEXT = @EXEEXT@
-FOOMATIC_3_NOINST_BIN = @FOOMATIC_3_NOINST_BIN@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+FIND = @FIND@
FOOMATIC_CONFIGURE = @FOOMATIC_CONFIGURE@
-FOOMATIC_INSTALL = @FOOMATIC_INSTALL@
FOOMATIC_KITLOAD = @FOOMATIC_KITLOAD@
-FOOMATIC_OLDIDS_NOINST_BIN = @FOOMATIC_OLDIDS_NOINST_BIN@
FOOMATIC_PPDFILE = @FOOMATIC_PPDFILE@
-GENCAT = @GENCAT@
-GIMPPRINT_BINARY_AGE = @GIMPPRINT_BINARY_AGE@
-GIMPPRINT_CFLAGS = @GIMPPRINT_CFLAGS@
-GIMPPRINT_CURRENT_INTERFACE = @GIMPPRINT_CURRENT_INTERFACE@
-GIMPPRINT_DEPLIBS = @GIMPPRINT_DEPLIBS@
-GIMPPRINT_INTERFACE_AGE = @GIMPPRINT_INTERFACE_AGE@
-GIMPPRINT_LIBS = @GIMPPRINT_LIBS@
-GIMPPRINT_MAJOR_VERSION = @GIMPPRINT_MAJOR_VERSION@
-GIMPPRINT_MICRO_VERSION = @GIMPPRINT_MICRO_VERSION@
-GIMPPRINT_MINOR_VERSION = @GIMPPRINT_MINOR_VERSION@
-GIMPPRINT_VERSION = @GIMPPRINT_VERSION@
+GENPPD_LIBS = @GENPPD_LIBS@
+GIMP2_CFLAGS = @GIMP2_CFLAGS@
+GIMP2_LIBS = @GIMP2_LIBS@
GIMPTOOL = @GIMPTOOL@
+GIMPTOOL2_CHECK = @GIMPTOOL2_CHECK@
GIMPTOOL_CHECK = @GIMPTOOL_CHECK@
-GIMP_BIN = @GIMP_BIN@
GIMP_CFLAGS = @GIMP_CFLAGS@
GIMP_CFLAGS_NOUI = @GIMP_CFLAGS_NOUI@
GIMP_DATA_DIR = @GIMP_DATA_DIR@
GIMP_LIBS = @GIMP_LIBS@
GIMP_LIBS_NOUI = @GIMP_LIBS_NOUI@
GIMP_PLUGIN_DIR = @GIMP_PLUGIN_DIR@
-GLIBC21 = @GLIBC21@
-GMOFILES = @GMOFILES@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_CONFIG = @GLIB_CONFIG@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
GMSGFMT = @GMSGFMT@
GNUCFLAGS = @GNUCFLAGS@
-IJS_BIN = @IJS_BIN@
+GTK2_CFLAGS = @GTK2_CFLAGS@
+GTK2_LIBS = @GTK2_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+GUTENPRINTUI2_BINARY_AGE = @GUTENPRINTUI2_BINARY_AGE@
+GUTENPRINTUI2_CFLAGS = @GUTENPRINTUI2_CFLAGS@
+GUTENPRINTUI2_CURRENT_INTERFACE = @GUTENPRINTUI2_CURRENT_INTERFACE@
+GUTENPRINTUI2_INTERFACE_AGE = @GUTENPRINTUI2_INTERFACE_AGE@
+GUTENPRINTUI2_LIBDEPS = @GUTENPRINTUI2_LIBDEPS@
+GUTENPRINTUI2_LIBS = $(top_builddir)/src/gutenprintui2/libgutenprintui2.la
+GUTENPRINTUI2_VERSION = @GUTENPRINTUI2_VERSION@
+GUTENPRINTUI_BINARY_AGE = @GUTENPRINTUI_BINARY_AGE@
+GUTENPRINTUI_CFLAGS = @GUTENPRINTUI_CFLAGS@
+GUTENPRINTUI_CURRENT_INTERFACE = @GUTENPRINTUI_CURRENT_INTERFACE@
+GUTENPRINTUI_INTERFACE_AGE = @GUTENPRINTUI_INTERFACE_AGE@
+GUTENPRINTUI_LIBDEPS = @GUTENPRINTUI_LIBDEPS@
+GUTENPRINTUI_LIBS = $(top_builddir)/src/gutenprintui/libgutenprintui.la
+GUTENPRINTUI_VERSION = @GUTENPRINTUI_VERSION@
+GUTENPRINT_BINARY_AGE = @GUTENPRINT_BINARY_AGE@
+GUTENPRINT_CFLAGS = @GUTENPRINT_CFLAGS@
+GUTENPRINT_CURRENT_INTERFACE = @GUTENPRINT_CURRENT_INTERFACE@
+GUTENPRINT_INTERFACE_AGE = @GUTENPRINT_INTERFACE_AGE@
+GUTENPRINT_LIBDEPS = @GUTENPRINT_LIBDEPS@
+
+# Libraries
+GUTENPRINT_LIBS = $(top_builddir)/src/main/libgutenprint.la
+GUTENPRINT_MAJOR_VERSION = @GUTENPRINT_MAJOR_VERSION@
+GUTENPRINT_MICRO_VERSION = @GUTENPRINT_MICRO_VERSION@
+GUTENPRINT_MINOR_VERSION = @GUTENPRINT_MINOR_VERSION@
+GUTENPRINT_VERSION = @GUTENPRINT_VERSION@
IJS_CFLAGS = @IJS_CFLAGS@
IJS_CONFIG = @IJS_CONFIG@
-IJS_INSTALL = @IJS_INSTALL@
IJS_LIBS = @IJS_LIBS@
-INSTOBJEXT = @INSTOBJEXT@
-INTLBISON = @INTLBISON@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SAMPLES_FALSE = @INSTALL_SAMPLES_FALSE@
+INSTALL_SAMPLES_TRUE = @INSTALL_SAMPLES_TRUE@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_USER_GUIDE_FALSE = @INSTALL_USER_GUIDE_FALSE@
+INSTALL_USER_GUIDE_TRUE = @INSTALL_USER_GUIDE_TRUE@
INTLLIBS = @INTLLIBS@
-INTLOBJS = @INTLOBJS@
-INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDFLAGS = @LDFLAGS@
LEX = @LEX@
-LIBGIMPPRINT_LIBS = @LIBGIMPPRINT_LIBS@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
LIBICONV = @LIBICONV@
-LIBM = @LIBM@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
LIBREADLINE_DEPS = @LIBREADLINE_DEPS@
+LIBS = $(INTLLIBS) @LIBS@
LIBTOOL = @LIBTOOL@
LIBTOOL_DEPS = @LIBTOOL_DEPS@
LN_S = @LN_S@
LTALLOCA = @LTALLOCA@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
-LT_AGE = @LT_AGE@
-LT_CURRENT = @LT_CURRENT@
-LT_RELEASE = @LT_RELEASE@
-LT_REVISION = @LT_REVISION@
MAINT = @MAINT@
MAINTAINER_CFLAGS = @MAINTAINER_CFLAGS@
-MAIN_BIN = @MAIN_BIN@
-MAIN_DAT = @MAIN_DAT@
-MAIN_MAN = @MAIN_MAN@
-MAIN_SCR = @MAIN_SCR@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
MKINSTALLDIRS = @MKINSTALLDIRS@
MSGFMT = @MSGFMT@
-OBJDUMP = @OBJDUMP@
+MSGMERGE = @MSGMERGE@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
PLUG_IN_PATH = @PLUG_IN_PATH@
-POFILES = @POFILES@
POSUB = @POSUB@
-PRINT_VASPRINTF = @PRINT_VASPRINTF@
RANLIB = @RANLIB@
RELEASE_DATE = @RELEASE_DATE@
RM = @RM@
-SAMPLE_IMAGES = @SAMPLE_IMAGES@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
STRIP = @STRIP@
-TESTPATTERN_BIN = @TESTPATTERN_BIN@
-TEST_BIN = @TEST_BIN@
TEXI2HTML = @TEXI2HTML@
-USER_GUIDE = @USER_GUIDE@
-USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_LEVEL3_PS_FALSE = @USE_LEVEL3_PS_FALSE@
+USE_LEVEL3_PS_TRUE = @USE_LEVEL3_PS_TRUE@
USE_NLS = @USE_NLS@
+USE_NLS_FALSE = @USE_NLS_FALSE@
+USE_NLS_TRUE = @USE_NLS_TRUE@
VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
YACC = @YACC@
-YACC_PROG = @YACC_PROG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
cups_bindir = @cups_bindir@
cups_conf_datadir = @cups_conf_datadir@
cups_conf_serverbin = @cups_conf_serverbin@
cups_conf_serverroot = @cups_conf_serverroot@
cups_exec_prefix = @cups_exec_prefix@
cups_prefix = @cups_prefix@
+cups_sbindir = @cups_sbindir@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+gimp2_plug_indir = @gimp2_plug_indir@
gimp_plug_indir = @gimp_plug_indir@
-gimpprint_cflags = @gimpprint_cflags@
-gimpprint_libs = @gimpprint_libs@
-
+gutenprint_cflags = @gutenprint_cflags@
+gutenprint_libs = @gutenprint_libs@
+gutenprintui2_cflags = @gutenprintui2_cflags@
+gutenprintui2_libs = @gutenprintui2_libs@
+gutenprintui_cflags = @gutenprintui_cflags@
+gutenprintui_libs = @gutenprintui_libs@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
AUTOMAKE_OPTIONS = 1.4 gnu
-
MAINT_CHARSET = latin1
-
-AM_CFLAGS = $(GNUCFLAGS)
-INCLUDES = @INCLUDES@ $(LIBGIMPPRINT_CFLAGS) -I$(top_srcdir)/src/main
-LIBPRINTUT = $(top_builddir)/lib/libprintut.la
-LIBS = $(INTLLIBS) @LIBS@
-
-FOOMATIC_NOINST_BIN = printer_options printer_margins paper_sizes gimp-print-version stp_limits printers
-
-
-noinst_PROGRAMS = @FOOMATIC_NOINST_BIN@
-
-EXTRA_PROGRAMS = printer_options printer_margins gimp-print-version paper_sizes stp_limits printers
-
-
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(LOCAL_CPPFLAGS) $(GNUCFLAGS)
+DISTDIRS = foomatic-templates-ijs
+LOCAL_CPPFLAGS = $(GUTENPRINT_CFLAGS)
+@BUILD_FOOMATIC_3_TRUE@BUILD_FOOMATIC = 1
printer_options_SOURCES = printer_options.c
-printer_options_LDADD = $(LIBPRINTUT) $(LIBGIMPPRINT_LIBS)
-printer_options_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
-
+printer_options_LDADD = $(GUTENPRINT_LIBS)
printer_margins_SOURCES = printer_margins.c
-printer_margins_LDADD = $(LIBPRINTUT) $(LIBGIMPPRINT_LIBS)
-printer_margins_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
-
-gimp_print_version_SOURCES = gimp-print-version.c
-gimp_print_version_LDADD = $(LIBPRINTUT) $(LIBGIMPPRINT_LIBS)
-gimp_print_version_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
-
+printer_margins_LDADD = $(GUTENPRINT_LIBS)
+gutenprint_version_SOURCES = gutenprint-version.c
+gutenprint_version_LDADD = $(GUTENPRINT_LIBS)
paper_sizes_SOURCES = paper_sizes.c
-paper_sizes_LDADD = $(LIBPRINTUT) $(LIBGIMPPRINT_LIBS)
-paper_sizes_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
-
-stp_limits_SOURCES = stp_limits.c
-stp_limits_LDADD = $(LIBPRINTUT) $(LIBGIMPPRINT_LIBS)
-stp_limits_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
-
+paper_sizes_LDADD = $(GUTENPRINT_LIBS)
printers_SOURCES = printers.c
-printers_LDADD = $(LIBPRINTUT) $(LIBGIMPPRINT_LIBS)
-printers_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
-@BUILD_FOOMATIC_TRUE@INSTALL_DATA_LOCAL_DEPS = foomatic-data
+printers_LDADD = $(GUTENPRINT_LIBS)
@BUILD_FOOMATIC_FALSE@INSTALL_DATA_LOCAL_DEPS =
-@BUILD_FOOMATIC_3_TRUE@FOOMATIC_GENERATOR_FOOMATIC_3_OPTS = -f 3
+@BUILD_FOOMATIC_TRUE@INSTALL_DATA_LOCAL_DEPS = foomatic-data
@BUILD_FOOMATIC_3_FALSE@FOOMATIC_GENERATOR_FOOMATIC_3_OPTS =
-@BUILD_FOOMATIC_OLDIDS_TRUE@FOOMATIC_GENERATOR_OLDIDS_OPTS = -o
-@BUILD_FOOMATIC_OLDIDS_FALSE@FOOMATIC_GENERATOR_OLDIDS_OPTS =
-@BUILD_IJS_TRUE@FOOMATIC_GENERATOR_EXTRA_OPTS = -d all
-@BUILD_IJS_FALSE@FOOMATIC_GENERATOR_EXTRA_OPTS = -d noijs
-@BUILD_IJS_TRUE@FOOMATIC_IJS = yes
-@BUILD_IJS_FALSE@FOOMATIC_IJS =
-
-CLEANFILES = $(noinst_PROGRAMS) foomatic-stamp
+@BUILD_FOOMATIC_3_TRUE@FOOMATIC_GENERATOR_FOOMATIC_3_OPTS = -f 3
+CLEANFILES = foomatic-stamp
MAINTAINERCLEANFILES = Makefile.in
+EXTRA_DIST = foomatic-printermap
+all: all-am
-EXTRA_DIST = foomatic-printermap oldprinterids foomatic-templates-gs/*.xml foomatic-templates-ijs/*.xml
-
-mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
-CONFIG_HEADER = ../../config.h
-CONFIG_CLEAN_FILES = foomatic-generator
-noinst_PROGRAMS = @FOOMATIC_NOINST_BIN@
-PROGRAMS = $(noinst_PROGRAMS)
-
-
-DEFS = @DEFS@ -I. -I$(srcdir) -I../..
-CPPFLAGS = @CPPFLAGS@
-LDFLAGS = @LDFLAGS@
-printer_options_OBJECTS = printer_options.$(OBJEXT)
-printer_options_LDFLAGS =
-printer_margins_OBJECTS = printer_margins.$(OBJEXT)
-printer_margins_LDFLAGS =
-gimp_print_version_OBJECTS = gimp-print-version.$(OBJEXT)
-gimp_print_version_LDFLAGS =
-paper_sizes_OBJECTS = paper_sizes.$(OBJEXT)
-paper_sizes_LDFLAGS =
-stp_limits_OBJECTS = stp_limits.$(OBJEXT)
-stp_limits_LDFLAGS =
-printers_OBJECTS = printers.$(OBJEXT)
-printers_LDFLAGS =
-CFLAGS = @CFLAGS@
-COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-DIST_COMMON = Makefile.am Makefile.in foomatic-generator.in
-
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = tar
-GZIP_ENV = --best
-SOURCES = $(printer_options_SOURCES) $(printer_margins_SOURCES) $(gimp_print_version_SOURCES) $(paper_sizes_SOURCES) $(stp_limits_SOURCES) $(printers_SOURCES)
-OBJECTS = $(printer_options_OBJECTS) $(printer_margins_OBJECTS) $(gimp_print_version_OBJECTS) $(paper_sizes_OBJECTS) $(stp_limits_OBJECTS) $(printers_OBJECTS)
-
-all: all-redirect
.SUFFIXES:
-.SUFFIXES: .S .c .lo .o .obj .s
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/foomatic/Makefile
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-foomatic-generator: $(top_builddir)/config.status foomatic-generator.in
- cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-mostlyclean-noinstPROGRAMS:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/scripts/global.mk $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/foomatic/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/foomatic/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+foomatic-generator: $(top_builddir)/config.status $(srcdir)/foomatic-generator.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+mk_printerlist: $(top_builddir)/config.status $(srcdir)/mk_printerlist.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
clean-noinstPROGRAMS:
- -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
-
-distclean-noinstPROGRAMS:
-
-maintainer-clean-noinstPROGRAMS:
-
-.c.o:
- $(COMPILE) -c $<
-
-# FIXME: We should only use cygpath when building on Windows,
-# and only if it is available.
-.c.obj:
- $(COMPILE) -c `cygpath -w $<`
-
-.s.o:
- $(COMPILE) -c $<
-
-.S.o:
- $(COMPILE) -c $<
+ @list='$(noinst_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+gutenprint-version$(EXEEXT): $(gutenprint_version_OBJECTS) $(gutenprint_version_DEPENDENCIES)
+ @rm -f gutenprint-version$(EXEEXT)
+ $(LINK) $(gutenprint_version_LDFLAGS) $(gutenprint_version_OBJECTS) $(gutenprint_version_LDADD) $(LIBS)
+paper_sizes$(EXEEXT): $(paper_sizes_OBJECTS) $(paper_sizes_DEPENDENCIES)
+ @rm -f paper_sizes$(EXEEXT)
+ $(LINK) $(paper_sizes_LDFLAGS) $(paper_sizes_OBJECTS) $(paper_sizes_LDADD) $(LIBS)
+printer_margins$(EXEEXT): $(printer_margins_OBJECTS) $(printer_margins_DEPENDENCIES)
+ @rm -f printer_margins$(EXEEXT)
+ $(LINK) $(printer_margins_LDFLAGS) $(printer_margins_OBJECTS) $(printer_margins_LDADD) $(LIBS)
+printer_options$(EXEEXT): $(printer_options_OBJECTS) $(printer_options_DEPENDENCIES)
+ @rm -f printer_options$(EXEEXT)
+ $(LINK) $(printer_options_LDFLAGS) $(printer_options_OBJECTS) $(printer_options_LDADD) $(LIBS)
+printers$(EXEEXT): $(printers_OBJECTS) $(printers_DEPENDENCIES)
+ @rm -f printers$(EXEEXT)
+ $(LINK) $(printers_LDFLAGS) $(printers_OBJECTS) $(printers_LDADD) $(LIBS)
mostlyclean-compile:
- -rm -f *.o core *.core
-rm -f *.$(OBJEXT)
-clean-compile:
-
distclean-compile:
-rm -f *.tab.c
-maintainer-clean-compile:
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gutenprint-version.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paper_sizes.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printer_margins.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printer_options.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printers.Po@am__quote@
-.c.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
-.s.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
-.S.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.c.lo:
+@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
mostlyclean-libtool:
-rm -f *.lo
@@ -342,185 +471,207 @@ clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-
-maintainer-clean-libtool:
-
-printer_options$(EXEEXT): $(printer_options_OBJECTS) $(printer_options_DEPENDENCIES)
- @rm -f printer_options$(EXEEXT)
- $(LINK) $(printer_options_LDFLAGS) $(printer_options_OBJECTS) $(printer_options_LDADD) $(LIBS)
-
-printer_margins$(EXEEXT): $(printer_margins_OBJECTS) $(printer_margins_DEPENDENCIES)
- @rm -f printer_margins$(EXEEXT)
- $(LINK) $(printer_margins_LDFLAGS) $(printer_margins_OBJECTS) $(printer_margins_LDADD) $(LIBS)
-
-gimp-print-version$(EXEEXT): $(gimp_print_version_OBJECTS) $(gimp_print_version_DEPENDENCIES)
- @rm -f gimp-print-version$(EXEEXT)
- $(LINK) $(gimp_print_version_LDFLAGS) $(gimp_print_version_OBJECTS) $(gimp_print_version_LDADD) $(LIBS)
-
-paper_sizes$(EXEEXT): $(paper_sizes_OBJECTS) $(paper_sizes_DEPENDENCIES)
- @rm -f paper_sizes$(EXEEXT)
- $(LINK) $(paper_sizes_LDFLAGS) $(paper_sizes_OBJECTS) $(paper_sizes_LDADD) $(LIBS)
-
-stp_limits$(EXEEXT): $(stp_limits_OBJECTS) $(stp_limits_DEPENDENCIES)
- @rm -f stp_limits$(EXEEXT)
- $(LINK) $(stp_limits_LDFLAGS) $(stp_limits_OBJECTS) $(stp_limits_LDADD) $(LIBS)
-
-printers$(EXEEXT): $(printers_OBJECTS) $(printers_DEPENDENCIES)
- @rm -f printers$(EXEEXT)
- $(LINK) $(printers_LDFLAGS) $(printers_OBJECTS) $(printers_LDADD) $(LIBS)
-
+ -rm -f libtool
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
tags: TAGS
-ID: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
- here=`pwd` && cd $(srcdir) \
- && mkid -f$$here/ID $$unique $(LISP)
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
- || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
-mostlyclean-tags:
-
-clean-tags:
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
- -rm -f TAGS ID
-
-maintainer-clean-tags:
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-
-subdir = src/foomatic
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
- $(mkinstalldirs) $(distdir)/foomatic-templates-gs \
- $(distdir)/foomatic-templates-ijs
- @for file in $(DISTFILES); do \
- d=$(srcdir); \
+ $(mkdir_p) $(distdir)/../../scripts
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
- || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $$d/$$file $(distdir)/$$file || :; \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
fi; \
done
-gimp-print-version.o: gimp-print-version.c ../../config.h \
- ../../include/gimp-print/gimp-print.h ../../lib/libprintut.h \
- ../../lib/xmalloc.h
-paper_sizes.o: paper_sizes.c ../../config.h \
- ../../include/gimp-print/gimp-print.h ../../lib/libprintut.h \
- ../../lib/xmalloc.h
-printer_margins.o: printer_margins.c ../../config.h \
- ../../include/gimp-print/gimp-print.h ../../lib/libprintut.h \
- ../../lib/xmalloc.h
-printer_options.o: printer_options.c ../../config.h \
- ../../include/gimp-print/gimp-print.h ../../lib/libprintut.h \
- ../../lib/xmalloc.h
-printers.o: printers.c ../../config.h \
- ../../include/gimp-print/gimp-print.h ../../lib/libprintut.h \
- ../../lib/xmalloc.h
-stp_limits.o: stp_limits.c ../../config.h \
- ../../include/gimp-print/gimp-print.h ../../lib/libprintut.h \
- ../../lib/xmalloc.h
-
-info-am:
-info: info-am
-dvi-am:
-dvi: dvi-am
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-hook
check-am: all-am
check: check-am
-installcheck-am:
-installcheck: installcheck-am
-install-exec-am:
+all-am: Makefile $(PROGRAMS) all-local
+installdirs:
+install: install-am
install-exec: install-exec-am
-
-install-data-am: install-data-local
install-data: install-data-am
+uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-am
-uninstall-am:
-uninstall: uninstall-am
-all-am: Makefile $(PROGRAMS) all-local
-all-redirect: all-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs:
-
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
- -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-mostlyclean-am: mostlyclean-noinstPROGRAMS mostlyclean-compile \
- mostlyclean-libtool mostlyclean-tags \
- mostlyclean-generic
+clean: clean-am
-mostlyclean: mostlyclean-am
+clean-am: clean-generic clean-libtool clean-local clean-noinstPROGRAMS \
+ mostlyclean-am
-clean-am: clean-noinstPROGRAMS clean-compile clean-libtool clean-tags \
- clean-generic mostlyclean-am clean-local
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
-clean: clean-am
+dvi: dvi-am
-distclean-am: distclean-noinstPROGRAMS distclean-compile \
- distclean-libtool distclean-tags distclean-generic \
- clean-am
- -rm -f libtool
+dvi-am:
-distclean: distclean-am
+html: html-am
-maintainer-clean-am: maintainer-clean-noinstPROGRAMS \
- maintainer-clean-compile maintainer-clean-libtool \
- maintainer-clean-tags maintainer-clean-generic \
- distclean-am
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
-.PHONY: mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \
-clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \
-mostlyclean-compile distclean-compile clean-compile \
-maintainer-clean-compile mostlyclean-libtool distclean-libtool \
-clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
-distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
-dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
-install-exec install-data-local install-data-am install-data install-am \
-install uninstall-am uninstall all-local all-redirect all-am all \
-installdirs mostlyclean-generic distclean-generic clean-generic \
-maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am all-local check check-am clean \
+ clean-generic clean-libtool clean-local clean-noinstPROGRAMS \
+ ctags dist-hook distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-data-local install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags uninstall uninstall-am \
+ uninstall-info-am
@SET_MAKE@
+export STP_MODULE_PATH = $(top_builddir)/src/main/.libs:$(top_builddir)/src/main
+export STP_DATA_PATH = $(top_srcdir)/src/main
+
+# Rules
+
+$(top_builddir)/src/main/libgutenprint.la:
+ cd $(top_builddir)/src/main; \
+ $(MAKE)
+
+$(top_builddir)/src/gutenprintui/libgutenprintui.la:
+ cd $(top_builddir)/src/gutenprintui; \
+ $(MAKE)
+
+$(top_builddir)/src/gutenprintui2/libgutenprintui2.la:
+ cd $(top_builddir)/src/gutenprintui2; \
+ $(MAKE)
+
all-local: $(INSTALL_DATA_LOCAL_DEPS)
install-data-local: $(INSTALL_DATA_LOCAL_DEPS)
if test -n "$(INSTALL_DATA_LOCAL_DEPS)" ; then \
- $(MAKE) install-kit FOOMATIC_DB=foomatic-db/gimp-print ; \
- if test -n "$(FOOMATIC_IJS)" ; then \
- $(MAKE) install-kit FOOMATIC_DB=foomatic-db/gimp-print-ijs ; \
- fi ; \
+ $(MAKE) install-kit FOOMATIC_DB=foomatic-db/gutenprint-ijs.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@ ; \
fi
install-kit:
@@ -536,15 +687,22 @@ clean-local:
foomatic-data: foomatic-stamp
-foomatic-stamp: foomatic-generator foomatic-printermap $(EXTRA_PROGRAMS)
+foomatic-stamp: foomatic-generator foomatic-printermap $(noinst_PROGRAMS) mk_printerlist $(top_srcdir)/src/main/printers.xml $(top_srcdir)/src/main/papers.xml
-$(RM) -r foomatic-db
- ./foomatic-generator -m $(srcdir)/foomatic-printermap -t $(srcdir)/foomatic-templates $(FOOMATIC_GENERATOR_EXTRA_OPTS) $(FOOMATIC_GENERATOR_FOOMATIC_3_OPTS) $(FOOMATIC_GENERATOR_OLDIDS_OPTS)
+ ./foomatic-generator -m $(srcdir)/foomatic-printermap -t $(srcdir)/foomatic-templates $(FOOMATIC_GENERATOR_EXTRA_OPTS) $(FOOMATIC_GENERATOR_FOOMATIC_3_OPTS)
touch foomatic-stamp
-$(LIBGIMPPRINT_LIBS):
- cd ../main ; \
- $(MAKE)
-
+dist-hook:
+ for dir in $(DISTDIRS) ; do \
+ if test -d $(srcdir)/$$dir ; then \
+ mkdir $(distdir)/$$dir; \
+ for dirfile in $(srcdir)/$$dir/*.xml; do \
+ if test -f $$dirfile ; then \
+ cp -p $$dirfile $(distdir)/$$dir; \
+ fi \
+ done \
+ fi \
+ done
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
diff --git a/src/foomatic/foomatic-generator.in b/src/foomatic/foomatic-generator.in
index b5b3f7a..1675125 100644
--- a/src/foomatic/foomatic-generator.in
+++ b/src/foomatic/foomatic-generator.in
@@ -6,7 +6,6 @@ Getopt::Long::Configure("no_ignore_case", "pass_through");
GetOptions("m=s" => \$opt_m, # Map file
"t=s" => \$opt_t, # Template directory
"f=s" => \$opt_f, # Foomatic version
- "o" => \$opt_o, # Old Foomatic IDs
"d=s" => \@opt_d); # which Drivers?
# Wherever we put it...
@@ -17,27 +16,7 @@ $mapfile = $opt_m;
my $templatedir;
$templatedir = $opt_t;
-my @drivertypes = ();
-for my $d (@opt_d) {
- if (lc($d) eq "gs") {
- push (@drivertypes, "gs");
- }
- if (lc($d) eq "ijs") {
- push (@drivertypes, "ijs");
- }
- if (lc($d) eq "nogs") {
- @drivertypes = ("ijs");
- }
- if (lc($d) eq "noijs") {
- @drivertypes = ("gs");
- }
- if (lc($d) eq "all") {
- @drivertypes = ("gs", "ijs");
- }
- if (lc($d) eq "both") {
- @drivertypes = ("gs", "ijs");
- }
-}
+my @drivertypes = (ijs);
exit 0 if ($#drivertypes < 0); # Nothing to be done, exit silently
@@ -45,8 +24,10 @@ exit 0 if ($#drivertypes < 0); # Nothing to be done, exit silently
my $foomatic3 = ((defined($opt_f)) && ($opt_f >= 2.9));
# The following substitutions happen to the template XML files:
-# @@STPVER@@ - the version number (ie '4.1.5')
-# @@DRVNAME@@ - driver name (ie gimp-print)
+# @@STPVER@@ - the version number (e. g. "5.0.0-beta4")
+# @@STPREL@@ - the version number (e. g. "5.0")
+# @@REMAP@@ - option remappings (to shorten names)
+# @@DRVNAME@@ - driver name (ie gutenprint)
# @@STPRINTERS@@ - <printers>...</printers> clause for the driver
# @@OPTCONSTRAINTS@@ - <constraints>...</constraints> object for the option
# @@ENUMVALS@@ - <enum_vals>...</enum_vals> section for the enum option
@@ -59,27 +40,13 @@ my $foomatic3 = ((defined($opt_f)) && ($opt_f >= 2.9));
#
# 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,
+my $funcs = { '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 },
- 'PrintoutMode' => { 'OPTCONSTRAINTS' =>
+ 'RenderResolution' => { 'OPTCONSTRAINTS' => \&build_resolution_cons,
+ 'ENUMVALS' => \&build_resolution_ev },
+ 'PrintoutMode' => { 'OPTCONSTRAINTS' =>
\&build_printoutmode_cons,
- 'ENUMVALS' =>
+ 'ENUMVALS' =>
\&build_printoutmode_ev },
};
@@ -89,24 +56,38 @@ my $drivervals = { 'PageSize' => \&optmap_pagesize,
my $debug = 0;
-# Foomatic name => Gimp-print name
-%argnamemap = ('Quality' => 'Resolution');
-
-$colormap = { 'gs' => { 'Grayscale' => '0',
- 'Color' => '1',
- 'BlackAndWhite' => '2' },
- 'ijs' => { 'Grayscale' => 'DeviceGray',
+$colormap = { 'ijs' => { 'Grayscale' => 'DeviceGray',
'Color' => 'DeviceRGB',
'BlackAndWhite' =>
'DeviceGray -dBitsPerSample=1',
'RawCMYK' => 'DeviceCMYK' }
};
+my $groupname_prefix = "Gutenprint";
+
+my @parameter_class_names = (
+ "Printer Features",
+ "Output Control"
+ );
+
+my @parameter_level_names = (
+ "Common",
+ "Extra 1",
+ "Extra 2",
+ "Extra 3",
+ "Extra 4",
+ "Extra 5"
+ );
+
+my $option_remap = "";
+my $opt_index = 0;
+
use Data::Dumper;
open PIPE, "./printer_options|" or die "Cannot run printer_options: $!\n";
print STDERR "Loading options from ./printer_options...";
while(<PIPE>) {
+ #print $_;
next if m!^#!;
eval $_;
}
@@ -117,51 +98,26 @@ if ($foomatic3) {
open PIPE, "./printer_margins|" or die "Cannot run printer_margins: $!\n";
print STDERR "Loading margins from ./printer_margins...";
$code = join('', <PIPE>);
+ #print $code;
close PIPE or die "Cannot run printer_margins: $!\n";
eval $code or die "Cannot run printer_margins: $!\n";
print STDERR "done.\n";
}
-open PIPE, "./stp_limits|" or die "Cannot run stp_limits: $!\n";
-print STDERR "Loading options from ./stp_limits...";
-while(<PIPE>) {
- 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(<PIPE>) {
+ #print $_;
next if m!^#!;
eval $_;
}
close PIPE or die "Cannot run printers: $!\n";
print STDERR "done.\n";
-my %oldid;
-if ($opt_o) {
- # Load table to translate the Foomatic IDs to the old (numerical) ones
- print STDERR
- "Loading printer ID translation table from @srcdir@/oldprinterids...";
- my $translation_table = "@srcdir@/oldprinterids";
- open TRTAB, "< $translation_table" or
- die "Cannot read printer ID translation table: $!\n";
- while (<TRTAB>) {
- chomp;
- if (/^\s*(\S+)\s+(\S+)\s*$/) {
- $oldid{"printer/$2"} = "printer/$1";
- }
- }
- close TRTAB;
- 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);
+my ($a, $b, $otmp, $vtmp);
for $a (keys(%stpdata)) {
for $otmp (keys %{$stpdata{$a}}) {
for $vtmp (keys (%{$stpdata{$a}{$otmp}})) {
@@ -173,8 +129,10 @@ for $a (keys(%stpdata)) {
}
}
+#print Dumper(%ev_choices);
+
if ($foomatic3) {
- # Generate data for "PrintoutMode" option, only needed for
+ # Generate data for "PrintoutMode" option, only needed for
# Foomatic 2.9.x or newer
print STDERR "Generating data for \"PrintoutMode\" option...";
($printoutmode, $printoutmodechoices) = getprintoutmode();
@@ -199,6 +157,83 @@ if ($foomatic3) {
}
}
+# Make list of needed Foomatic entries for the numerical options. If
+# for one and the same numerical option there are printers with
+# different value ranges, there must be made an extra Foomatic entry
+# for each value range. Therefore the filenames of numerical options
+# are numbered (eg. Contrast-1.xml).
+for $a (keys(%stp_float_values)) {
+ for $vtmp (keys %{$stp_float_values{$a}}) {
+ for $otmp (keys %{$stp_float_values{$a}{$vtmp}}) {
+ my $min = $stp_float_values{$a}{'MINVAL'}{$otmp};
+ my $max = $stp_float_values{$a}{'MAXVAL'}{$otmp};
+ my $def = $stp_float_values{$a}{'DEFVAL'}{$otmp};
+ # Skip options with invalid values, the library contains such
+ # options in the case when only one constant value is allowed
+ next if (($min >= $max) || ($def < $min) || ($def > $max));
+ my $minmax = "${min}_${max}";
+ if (!$seen_fnumopt{$otmp}{$minmax}++) {
+ if (!defined($fnums{$otmp})) {
+ $fnums{$otmp} = 0;
+ }
+ $fnums{$otmp} ++;
+ push (@floatnumopts_list, "${otmp}-$fnums{$otmp}");
+ $numopt_ranges{"${otmp}-$fnums{$otmp}"}{'MINVAL'} = $min;
+ $numopt_ranges{"${otmp}-$fnums{$otmp}"}{'MAXVAL'} = $max;
+ }
+ }
+ }
+}
+for $a (keys(%stp_int_values)) {
+ for $vtmp (keys %{$stp_int_values{$a}}) {
+ for $otmp (keys %{$stp_int_values{$a}{$vtmp}}) {
+ my $min = $stp_int_values{$a}{'MINVAL'}{$otmp};
+ my $max = $stp_int_values{$a}{'MAXVAL'}{$otmp};
+ my $def = $stp_int_values{$a}{'DEFVAL'}{$otmp};
+ # Skip options with invalid values, the library contains such
+ # options in the case when only one constant value is allowed
+ next if (($min >= $max) || ($def < $min) || ($def > $max));
+ my $minmax = "${min}_${max}";
+ if (!$seen_inumopt{$otmp}{$minmax}++) {
+ if (!defined($inums{$otmp})) {
+ $inums{$otmp} = 0;
+ }
+ $inums{$otmp} ++;
+ push (@intnumopts_list, "${otmp}-$inums{$otmp}");
+ $numopt_ranges{"${otmp}-$inums{$otmp}"}{'MINVAL'} = $min;
+ $numopt_ranges{"${otmp}-$inums{$otmp}"}{'MAXVAL'} = $max;
+ }
+ }
+ }
+}
+
+for $a (keys(%stp_dimension_values)) {
+ for $vtmp (keys %{$stp_dimension_values{$a}}) {
+ for $otmp (keys %{$stp_dimension_values{$a}{$vtmp}}) {
+ my $min = $stp_dimension_values{$a}{'MINVAL'}{$otmp};
+ my $max = $stp_dimension_values{$a}{'MAXVAL'}{$otmp};
+ my $def = $stp_dimension_values{$a}{'DEFVAL'}{$otmp};
+ # Skip options with invalid values, the library contains such
+ # options in the case when only one constant value is allowed
+ next if (($min >= $max) || ($def < $min) || ($def > $max));
+ my $minmax = "${min}_${max}";
+ if (!$seen_inumopt{$otmp}{$minmax}++) {
+ if (!defined($inums{$otmp})) {
+ $inums{$otmp} = 0;
+ }
+ $inums{$otmp} ++;
+ push (@dimensionnumopts_list, "${otmp}-$inums{$otmp}");
+ $numopt_ranges{"${otmp}-$inums{$otmp}"}{'MINVAL'} = $min;
+ $numopt_ranges{"${otmp}-$inums{$otmp}"}{'MAXVAL'} = $max;
+ }
+ }
+ }
+}
+
+#print join("\n", @floatnumopts_list);
+#print join("\n", @intnumopts_list);
+#print join("\n", @dimensionnumopts_list);
+
# 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
#
@@ -206,16 +241,9 @@ if ($foomatic3) {
open PRINTERS, $mapfile or die "Cannot open mapfile $mapfile: $!\n";
for (<PRINTERS>) {
- if (m!^\#\s*gptofoo\s+([^\s]+)\s+([^\s]+)!) {
- my $foomaticid = $2;
- my $deviceclass = $1;
- if ($opt_o) {
- # Translate the Foomatic IDs to the old (numerical) ones
- $foomaticid = $oldid{$foomaticid}
- if defined($oldid{$foomaticid});
- }
- push (@{$mapstp{$deviceclass}}, $foomaticid);
- $mapfoo{$foomaticid} = $deviceclass; # do we need?
+ if (m!^#\s*gptofoo\s+([^\s]+)\s+([^\s]+)!) {
+ push (@{$mapstp{$1}}, $2);
+ $mapfoo{$2} = $1; # do we need?
}
}
@@ -225,14 +253,14 @@ $missing_drivers = 0;
for (keys(%stpdata)) {
if (!defined($mapstp{$_})) {
$missing_drivers = 1;
- warn "No foomatic printer IDs for gimp-print printer $_.\n";
+ warn "No foomatic printer IDs for gutenprint printer $_.\n";
}
}
for (keys(%mapstp)) {
if (!defined($stpdata{$_})) {
$missing_drivers = 1;
- warn "No gimp-print printer for foomatic ID $_.\n";
+ warn "No gutenprint printer for foomatic ID $_.\n";
}
}
@@ -241,24 +269,29 @@ if ($missing_drivers) {
}
# Figure out version etc
-open PIPE, "./gimp-print-version|" or die "Cannot run gimp-print-version: $!\n";
+open PIPE, "./gutenprint-version|" or die "Cannot run gutenprint-version: $!\n";
my $stpvers = <PIPE>;
-close PIPE or die "Cannot run gimp-print-version: $!\n";
+close PIPE or die "Cannot run gutenprint-version: $!\n";
chomp $stpvers;
+open PIPE, "./gutenprint-version -|" or die "Cannot run gutenprint-version: $!\n";
+my $stprel = <PIPE>;
+close PIPE or die "Cannot run gutenprint-version: $!\n";
+chomp $stprel;
+
# Build <printers> clause...
my @printerlist = ();
push (@printerlist, " <printers>\n");
my $p1;
for $p1 (keys(%mapstp)) {
- push (@printerlist, " <!-- gimp-print driver: $p1 -->\n");
+ push (@printerlist, " <!-- gutenprint driver: $p1 -->\n");
for my $id (@{$mapstp{$p1}}) {
if ($foomatic3) {
- # Add unprintable margins (only Foonmatic 2.9.x)
+ # Add unprintable margins (only Foomatic 2.9.x)
push(@printerlist, " <printer>\n");
push(@printerlist, " <id>$id</id>\n");
push(@printerlist, " <margins>\n");
- my ($cleft, $cright, $ctop, $cbottom) =
+ my ($cleft, $cright, $ctop, $cbottom) =
(undef, undef, undef, undef);
if (defined($imageableareas{$p1}{'Custom'})) {
$cleft = $imageableareas{$p1}{'Custom'}{'left'};
@@ -316,33 +349,28 @@ for $p1 (keys(%mapstp)) {
}
push (@printerlist, " </printers>\n");
-$drivernameprefix = "gimp-print";
+$drivernameprefix = "gutenprint";
print STDERR "Using driver name prefix \"$drivernameprefix\"\n";
my $generalsubs = { 'STPVER' => $stpvers,
+ 'STPREL' => $stprel,
+ 'REMAP' => $option_remap,
'DRVNAME' => $drivernameprefix,
'STPRINTERS' => join('', @printerlist) };
my $optiongroups = { 'PageSize' => 'General',
- 'InputSlot' => 'General',
- 'MediaType' => 'General',
- 'InkType' => 'General',
+ 'STP_InputSlot' => 'General',
+ 'STP_MediaType' => 'General',
'PrintoutMode' => 'General',
- 'Resolution' => 'PrintoutMode',
- 'Quality' => 'PrintoutMode',
- 'Color' => 'PrintoutMode',
- 'ImageType' => 'PrintoutMode',
- 'Dither' => 'PrintoutMode',
- 'Gamma' => 'Adjustment',
- 'Density' => 'Adjustment',
- 'Brightness' => 'Adjustment',
- 'Contrast' => 'Adjustment',
- 'Saturation' => 'Adjustment',
- 'Cyan' => 'Adjustment',
- 'Magenta' => 'Adjustment',
- 'Yellow' => 'Adjustment' };
-
-my @numericsubs = ('MINVAL', 'MAXVAL', 'DEFVAL');
+ 'STP_RenderResolution' => 'General',
+ 'STP_Quality' => 'General',
+ 'Color' => 'General',
+ 'STP_ImageType' => 'General'};
+
+my @numericsubs = ('MINVAL', 'MAXVAL');
+
+my $specialoutputfilenames = { 'Resolution' => 'PrinterResolution',
+ 'RenderResolution' => 'Resolution' };
# OK, make the db directory...
mkdir "foomatic-db", 0755 or
@@ -354,6 +382,7 @@ my $tmpl;
for $drivertype (@drivertypes) {
$drivertypesuffix = "-$drivertype";
$drivertypesuffix =~ s/-gs//;
+ $drivertypesuffix .= ".$stprel";
my $drvname = "$drivernameprefix$drivertypesuffix";
$generalsubs->{'DRVNAME'} = $drvname;
print "Generating Foomatic data for driver \"$drvname\"...\n";
@@ -362,28 +391,62 @@ for $drivertype (@drivertypes) {
mkdir "foomatic-db/$drvname", 0755 or
die "Cannot create directory foomatic-db/$drvname: $!\n"
unless -d "foomatic-db/$drvname";
- mkdir "foomatic-db/$drvname/opt", 0755 or
+ mkdir "foomatic-db/$drvname/opt", 0755 or
die "Cannot create directory foomatic-db/$drvname/opt: $!\n"
unless -d "foomatic-db/$drvname/opt";
mkdir "foomatic-db/$drvname/driver", 0755 or
die "Cannot create directory foomatic-db/$drvname/driver: $!\n"
unless -d 'foomatic-db/$drvname/driver';
- opendir TDIR, "$templatedir-$drivertype" or
- die "Cannot open templates directory: $!\n";
+ my $order = 1000;
- while ($tmpl=readdir(TDIR)) {
+# opendir TDIR, "$templatedir-$drivertype" or
+# die "Cannot open templates directory: $!\n";
+
+ for $fooopt (sort (keys(%ev_choices), @floatnumopts_list,
+ @dimensionnumopts_list,
+ @intnumopts_list), "PrintoutMode", "Model",
+ "RenderResolution", "gutenprint") {
- # Only XML files
- next if ($tmpl !~ m!.+\.xml$!);
# The "PrintoutMode" option is only supported by Foomatic 2.9.x or
- # newer
- next if ((!$foomatic3) && ($tmpl eq "PrintoutMode.xml"));
+ # newer (preliminary skipped always, do not remove the
+ # infrastructure for "PrintoutMode", it will be re-activated later
+ # on)
+ next if ((!$foomatic3) && ($fooopt eq "PrintoutMode"));
+
+ # "x_resolution" and "y_resolution" appear in %ev_choices but are
+ # not option names, so skip them
+ next if $fooopt =~ /^[xy]_resolution$/;
+
+ my ($num_opt, $type, $tmpl);
+ if (member($fooopt, @floatnumopts_list)) {
+ $num_opt = 1;
+ $type = "float";
+ $tmpl = "NumericalOptions.xml";
+ } elsif (member($fooopt, @intnumopts_list)) {
+ $num_opt = 1;
+ $type = "int";
+ $tmpl = "NumericalOptions.xml";
+ } elsif (member($fooopt, @dimensionnumopts_list)) {
+ $num_opt = 1;
+ $type = "dimension";
+ $tmpl = "NumericalOptions.xml";
+ } else {
+ $num_opt = 0;
+ $type = "enum";
+ $tmpl = "${fooopt}.xml";
+ $tmpl = "OtherOptions.xml"
+ if ! -r "$templatedir-$drivertype/$tmpl";
+ }
- my $fooopt = $tmpl;
- $fooopt =~ s!\.xml$!!;
- my $stpopt = $argnamemap{$fooopt};
- $stpopt = $fooopt if ! defined ($stpopt);
+ # Remove number appended to the end of the file name of
+ # numerical options
+ my $shortname = $fooopt;
+ $shortname =~ s!-\d+$!!;
+
+ #my $stpopt = $argnamemap{$shortname};
+ #$stpopt = $shortname if ! defined ($stpopt);
+ my $stpopt = $shortname;
# print STDERR "Argnamemap '$fooopt' => '$stpopt'\n";
@@ -391,7 +454,7 @@ for $drivertype (@drivertypes) {
my @datafile = <TMPL>;
close TMPL;
- print STDERR "Processing $tmpl...";
+ print STDERR "Processing \"$fooopt\"...";
my $template = join('',@datafile);
@@ -406,8 +469,29 @@ for $drivertype (@drivertypes) {
# Put the options into PPD groups (Foomatic >= 2.9)
if ($foomatic3) {
- my $substitution = "\n <arg_group>" .
- $optiongroups->{$fooopt} . "</arg_group>";
+ my $group;
+ if (defined($optiongroups->{$shortname})) {
+ # Group names given by table (esp. "General" for special
+ # Options)
+ $group = $optiongroups->{$shortname};
+ } elsif (defined($param_classes{$shortname}) &&
+ defined($param_levels{$shortname}) &&
+ $parameter_class_names[$param_classes{$shortname}] &&
+ $parameter_level_names[$param_levels{$shortname}]) {
+ # Group names given by libgutenprint
+ $group = $groupname_prefix . " " .
+ $parameter_class_names[$param_classes{$shortname}] . " " .
+ $parameter_level_names[$param_levels{$shortname}];
+ # Remove the spaces (the name with spaces Foomatic will
+ # generate automatically)
+ $group =~ s! !!g;
+ } else {
+ # All the above did not assign a group name? Use
+ # "Miscellaneous" (Should usually not happen)
+ $group = "Miscellaneous";
+ }
+ my $substitution = "\n <arg_group>" .
+ $group . "</arg_group>";
$template =~ s!\@\@GROUP\@\@!$substitution!g;
} else {
$template =~ s!\@\@GROUP\@\@!!g;
@@ -415,11 +499,52 @@ for $drivertype (@drivertypes) {
# Now do the numeric substitutions
+ $template =~ s!\@\@TYPE\@\@!$type!g;
for $substr (@numericsubs) {
- my $substitution = $stp_values{$substr}{$stpopt};
+ my $substitution;
+ my $substitution = $numopt_ranges{$fooopt}{$substr};
$template =~ s!\@\@$substr\@\@!$substitution!g;
}
+ # Substitutions for generic template files
+
+ my $lowercaseshortname = lc($fooopt);
+ my $subopt = $stpopt;
+
+ # The maximum length of the short name of an option is 31
+ # characters to be accepted in a PPD. The maximum length of a
+ # main keyword in a PPD is 40 characters, with
+ # "FoomaticRIPDefault" having 18, a short name of a numerical
+ # option (only those have "FoomaticRIPDefault" entries) is 22.
+
+ # We do not touch options whose names are short enough.
+
+ # As this problem did not occur with Gimp Print 4.2.7, none of
+ # the option names modified here already existed in
+ # Gimp-Print, all options concerned are new Gutenprint
+ # options. We also do not modify the parameters to be inserted
+ # in the GhostScript command line, so the Gutenprint library
+ # or the IJS server do not need to be modified.
+
+ my $maxlen = ($type eq "enum" ? 31 : 22);
+ my $shortopt = $subopt;
+ if (length($subopt) > $maxlen) {
+ my $nostpopt = $stpopt;
+ $nostpopt =~ s/^STP_//;
+ my $stropt = sprintf("%03d", $opt_index);
+ $shortopt = "STP_OPT_$stropt";
+ $opt_index++;
+ }
+ if ($tmpl !~ /^$fooopt/) {
+ $template =~ s!\@\@LOWERCASESHORTNAME\@\@!$lowercaseshortname!g;
+ $template =~ s!\@\@LONGNAME\@\@!$longnames{$shortname}!g;
+ $template =~ s!\@\@SHORTNAME\@\@!$shortopt!g;
+ $template =~ s!\@\@ORDER\@\@!$order!g;
+ #$order += 10;
+ $template =~ s!\@\@SPOT\@\@!B!g;
+ $template =~ s!\@\@PROTO\@\@!$subopt=\%s,!g;
+ }
+
# Now do special-purpose substitutions
for $substr (keys(%{$funcs->{$fooopt}})) {
@@ -429,11 +554,45 @@ for $drivertype (@drivertypes) {
}
}
+ if ($template =~ m!\@\@OPTCONSTRAINTS\@\@!) {
+ my $substitution = ($num_opt ? build_num_cons($fooopt) :
+ build_cons($stpopt));
+ # Skip this option if there are no constraints (no printers
+ # using this option)
+ if ($substitution !~ m!</constraint>!s) {
+ print STDERR "No printers using $fooopt\n";
+ next;
+ }
+ if (defined($substitution)) {
+ $template =~ s!\@\@OPTCONSTRAINTS\@\@!$substitution!g;
+ }
+ }
+ if ($template =~ m!\@\@ENUMVALS\@\@!) {
+ my $substitution = build_ev($stpopt);
+ # Skip this option if there are no choices (an enum option
+ # without choices does not make sense)
+ if ($substitution !~ m!</ev_shortname>!s) {
+ print STDERR "No choices for $fooopt\n";
+ next;
+ }
+ if (defined($substitution)) {
+ $template =~ s!\@\@ENUMVALS\@\@!$substitution!g;
+ }
+ }
+
# Any more?
grep (m!\@\@([^\@]+)\@\@!g
- && do { warn " Unknown substitution $1 in $tmpl!\n"; },
+ && do { warn " Unknown substitution $1 in $fooopt!\n"; },
split("\n",$template));
+ # File name for the option XML file
+
+ $tmpl = "${fooopt}.xml" if $tmpl !~ /^$fooopt\.xml$/;
+
+ if (my $f = $specialoutputfilenames->{$fooopt}) {
+ $tmpl = "${f}.xml";
+ }
+
# Finally, write out the new file
# Options are under opt/
@@ -441,7 +600,7 @@ for $drivertype (@drivertypes) {
# Special case the actual driver file under driver/
$dbfilename = "foomatic-db/$drvname/driver/$drvname.xml"
- if ($tmpl eq 'gimp-print.xml');
+ if ($tmpl eq 'gutenprint.xml');
open NEWF, "> $dbfilename" or die "Cannot create $dbfilename: $!";
print STDERR "writing $dbfilename...";
@@ -454,13 +613,17 @@ for $drivertype (@drivertypes) {
closedir TDIR;
# The paper size and resolution maps must be regenerated for the next
- # driver, because the "driverval"s are different for the different
+ # driver, because the "driverval"s are different for the different
# drivers. So delete the caches.
undef $pagemap;
undef %rescache;
}
+
+# member( $a, @b ) returns 1 if $a is in @b, 0 otherwise.
+sub member { my $e = shift; foreach (@_) { $e eq $_ and return 1 } 0 };
+
sub get_ev_shortname {
my ($val) = @_;
$val =~ s/ //g;
@@ -487,10 +650,6 @@ sub build_ev {
my $ev_longname = @$ev[1];
my $ev_shortname = @$ev[0];
- # The GhostScript driver has no "RawCMYK" output type setting
- next if (($drivertype eq "gs") && ($stpopt eq "Color") &&
- ($ev_shortname eq "RawCMYK"));
-
my $ev_id = get_ev_key($ev_shortname, $drvname);
my $ev_driverval;
@@ -504,7 +663,7 @@ sub build_ev {
$ev_driverval = $ev_shortname;
}
# Remove "Roll" paper sizes, user has to use "Custom" instead.
- next if (($stpopt eq "PageSize") && ($ev_driverval eq ""));
+ next if (($stpopt eq "STP_PageSize") && ($ev_driverval eq ""));
push (@vals,
" <enum_val id='$ev_id'>\n",
" <ev_longname><en>$ev_longname</en></ev_longname>\n",
@@ -557,14 +716,14 @@ sub build_cons {
for $stpname (keys(%stpdata)) {
if (0) {
- print STDERR " Processing gimp-print printer $stpname...\n";
+ print STDERR " Processing gutenprint 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?
+ # Add this printer to argument constraints?
if ($stpdata{$stpname}{$stpopt}) {
# What's the default value?
@@ -592,7 +751,7 @@ sub build_cons {
push (@PNCONS,
" <constraint sense='true'>\n",
" <driver>$drvname</driver>\n",
- " <printer>$fooname</printer><!-- gimp-print name: $stpname -->\n",
+ " <printer>$fooname</printer><!-- gutenprint name: $stpname -->\n",
" <arg_defval>$foodefval</arg_defval>\n",
" </constraint>\n");
}
@@ -607,6 +766,98 @@ sub build_cons {
" </constraints>\n");
}
+sub build_num_cons {
+
+ my ($foooptfile) = @_;
+
+ my $drvname = "$drivernameprefix$drivertypesuffix";
+
+ my @PNCONS = ();
+
+ # Do we have a float or an int option?
+ my $type;
+ if (member($foooptfile, @floatnumopts_list)) {
+ $type = "float";
+ } elsif (member($foooptfile, @dimensionnumopts_list)) {
+ $type = "dimension";
+ } else {
+ $type = "int";
+ }
+
+ # Name of the actual option
+ my $stpopt = $foooptfile;
+ $stpopt =~ s!-\d+$!!;
+
+ # For each stp printer...
+ my $stpname;
+ for $stpname (keys(%stpdata)) {
+
+ if (0) {
+ print STDERR " Processing gutenprint printer $stpname...\n";
+ print STDERR
+ " There are no foomatic printers mapped to $stpname!?\n"
+ if !$mapstp{$stpname};
+ }
+
+ # Add this printer to argument constraints? The printer must provide
+ # this option and a default value for it.
+ my $stpdef;
+ if ((defined($stpdef =
+ $stp_float_values{$stpname}{"DEFVAL"}{$stpopt})) ||
+ (defined($stpdef =
+ $stp_int_values{$stpname}{"DEFVAL"}{$stpopt})) ||
+ (defined($stpdef =
+ $stp_dimension_values{$stpname}{"DEFVAL"}{$stpopt}))) {
+ # Find minimum and maximum
+ my ($min, $max);
+ if ($type eq "float") {
+ $min = $stp_float_values{$stpname}{"MINVAL"}{$stpopt};
+ $max = $stp_float_values{$stpname}{"MAXVAL"}{$stpopt};
+ } elsif ($type eq "dimension") {
+ $min = $stp_dimension_values{$stpname}{"MINVAL"}{$stpopt};
+ $max = $stp_dimension_values{$stpname}{"MAXVAL"}{$stpopt};
+ } else {
+ $min = $stp_int_values{$stpname}{"MINVAL"}{$stpopt};
+ $max = $stp_int_values{$stpname}{"MAXVAL"}{$stpopt};
+ }
+ # Does the range of this option with this printer match
+ # the Foomatic option entry we are building currently?
+ if (defined($numopt_ranges{$foooptfile}{'MINVAL'}) &&
+ defined($numopt_ranges{$foooptfile}{'MAXVAL'}) &&
+ ($min == $numopt_ranges{$foooptfile}{'MINVAL'}) &&
+ ($max == $numopt_ranges{$foooptfile}{'MAXVAL'})) {
+
+ if (0) {
+ print STDERR
+ " Default for $stpname/$stpopt is $stpdef\n";
+ }
+
+ my $fooname;
+ for $fooname (@{$mapstp{$stpname}}) {
+
+ if (0) {
+ print STDERR
+ " Printer $fooname takes option $stpopt.\n";
+ }
+
+ push (@PNCONS,
+ " <constraint sense='true'>\n",
+ " <driver>$drvname</driver>\n",
+ " <printer>$fooname</printer><!-- gutenprint name: $stpname -->\n",
+ " <arg_defval>$stpdef</arg_defval>\n",
+ " </constraint>\n");
+ }
+ }
+ }
+
+ }
+
+ return join('',
+ "<constraints>\n",
+ @PNCONS,
+ " </constraints>\n");
+}
+
sub optmap_pagesize {
my ($value) = @_;
@@ -618,13 +869,9 @@ sub optmap_pagesize {
my ($name, $width, $height) = ($1, $2, $3);
if (($width > 0 and $height > 0) or
($name eq "Custom")) {
- if ($drivertype eq "gs") {
- $pagemap->{$name} = "$width $height";
- } else {
- $pagemap->{$name} = "-dDEVICEWIDTHPOINTS=$width -dDEVICEHEIGHTPOINTS=$height";
- }
+ $pagemap->{$name} = "-dDEVICEWIDTHPOINTS=$width -dDEVICEHEIGHTPOINTS=$height";
# print STDERR "PageSize '$name' driverval '$width $height'\n";
- }
+ }
}
close PUTIL;
}
@@ -699,26 +946,11 @@ sub build_model_ev {
# Put in the basic choice info: ev names, etc
my $ev_shortname = $ev;
my $ev_longname = $printer_name{$ev};
+ my $make = $printer_make{$ev};
my $ev_shortname = get_ev_shortname($ev);
my $ev_id = get_ev_key($ev, $drvname);
my $ev_driverval;
- if ($drivertype eq "gs") {
- $ev_driverval = $ev;
- } else {
- my $make;
- if ($ev =~ /^escp2/) {
- $make = "EPSON";
- } elsif ($ev =~ /^bjc/) {
- $make = "CANON";
- } elsif ($ev =~ /^pcl/) {
- $make = "HEWLETT-PACKARD";
- } elsif ($ev =~ /^lexmark/) {
- $make = "LEXMARK";
- } else {
- die "Could not determine printer manufacturer from \"$ev\"!\n";
- }
- $ev_driverval = "-sDeviceManufacturer=$make -sDeviceModel=$ev";
- }
+ $ev_driverval = "-sDeviceManufacturer=$make -sDeviceModel=$ev";
push (@vals,
" <enum_val id='$ev_id'>\n",
" <ev_longname><en>$ev_longname</en></ev_longname>\n",
@@ -760,16 +992,7 @@ sub build_model_ev {
# 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.
-#
-# In the case of the GhostScript driver The driverval is "X Y", and gets
-# passed in a /HWResolution ps clause, for the IJS driver it is "XxY" and
-# gets passed via the "-r" command line option of GhostScript.
+# determine what to do for the gs resolution argument.
sub compute_resolutions {
my ($stpname) = @_;
@@ -783,30 +1006,20 @@ sub compute_resolutions {
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;
- if ($drivertype eq "gs") {
- $r = {'x' => $x,
- 'y' => $y,
- 'driverval' => "$x $y",
- 'ev_key' => get_ev_key("res-$x-$y", $drvname)
- };
- } else {
- $r = {'x' => $x,
- 'y' => $y,
- 'driverval' => "${x}x${y}",
- 'ev_key' => get_ev_key("res-$x-$y", $drvname)
- };
- }
+ for $qual (keys(%{$stpdata{$stpname}{'STP_Resolution'}})) {
+ my ($x) = $stpdata{$stpname}{'x_resolution'}{$qual};
+ my ($y) = $stpdata{$stpname}{'y_resolution'}{$qual};
+
+ my $r = {'x' => $x,
+ 'y' => $y,
+ 'driverval' => "${x}x${y}",
+ 'ev_key' => get_ev_key("res-$x-$y", $drvname)
+ };
push (@reslist, $r);
# Default?
$defval = get_ev_key("res-$x-$y", $drvname)
- if ($qual eq $defaults{$stpname}{'Resolution'});
+ if ($qual eq $defaults{$stpname}{'STP_Resolution'});
# Note that this resolution value exists
$resolutions{"$x $y"} = { 'x' => $x,
@@ -847,15 +1060,10 @@ sub build_resolution_ev {
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_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;
- if ($drivertype eq "gs") {
- $ev_driverval = "$x $y";
- } else {
- $ev_driverval = "${x}x${y}";
- }
+ my $ev_driverval = "${x}x${y}";
push (@vals,
" <enum_val id='$ev_id'>\n",
@@ -888,7 +1096,7 @@ sub build_resolution_ev {
push (@vals,
" <constraint sense='true'>\n",
" <driver>$drvname</driver>\n",
- " <printer>$fooprn</printer><!-- stpname: $stpprn -->\n",
+ " <printer>$fooprn</printer><!-- gutenprint name: $stpprn -->\n",
" </constraint>\n");
}
}
@@ -929,7 +1137,7 @@ sub build_resolution_cons {
push (@PNCONS,
" <constraint sense='true'>\n",
" <driver>$drvname</driver>\n",
- " <printer>$fooname</printer><!-- stpname: $stpname -->\n",
+ " <printer>$fooname</printer><!-- gutenprint name: $stpname -->\n",
" <arg_defval>$foodefval</arg_defval>\n",
" </constraint>\n");
}
@@ -957,7 +1165,7 @@ sub build_printoutmode_ev {
my $ev_longname = $printoutmodechoices->{$choice};
my $ev_shortname = $choice;
- my $ev_id =
+ my $ev_id =
get_ev_key($modes{$choice}{$ev_driverval}, $drvname);
push (@vals,
@@ -976,7 +1184,7 @@ sub build_printoutmode_ev {
for $stpprn (keys(%stpdata)) {
my $fooprn;
for $fooprn (@{$mapstp{$stpprn}}) {
- if ($printoutmode->{$stpprn}{$choice} eq
+ if ($printoutmode->{$stpprn}{$choice} eq
$ev_driverval) {
# OK, this choice applies to this printer
push (@vals,
@@ -1017,7 +1225,7 @@ sub build_printoutmode_cons {
# What's the default value (always the "Normal" mode)?
my $normalmode = $printoutmode->{$stpname}{'Normal'};
- my $foodefval = get_ev_key($modes{'Normal'}{$normalmode},
+ my $foodefval = get_ev_key($modes{'Normal'}{$normalmode},
$drvname);
push (@PNCONS,
@@ -1038,6 +1246,8 @@ sub build_printoutmode_cons {
sub qualityorder {
# List of suffixes of the Quality choices
my @suffixes = (
+ # HP
+ "mono",
# General
"",
"dpi",
@@ -1061,8 +1271,6 @@ sub qualityorder {
"hq2uni",
# Canon
"dmt",
- # HP
- "mono",
);
my ($a, $b) = @_;
# Bring the suffixes to lower case
@@ -1078,7 +1286,7 @@ sub qualityorder {
if (($firstinlist) && ($secondinlist)) {return 0};
}
- # Equal quality
+ # Unknown qualities
die "The quality choice suffixes $a and $b are unknown!\n";
return 0;
@@ -1126,19 +1334,22 @@ sub getprintoutmode {
my $stpprn;
for $stpprn (keys(%stpdata)) {
my $modeinfo = {};
- my ($draftminres, $draftbestsymmetry, $draftlowestqualstr) =
+ my ($draftminres, $draftbestsymmetry, $draftlowestqualstr) =
(99999999, 99999999, "xxx");
- my $normaldefaultqual = $defaults{$stpprn}{'Resolution'};
- my ($highmaxres, $highbestsymmetry, $highbestqualstr) =
+ my ($normalminres, $normalbestsymmetry, $normaluni,
+ $normallowestqualstr) =
+ (99999999, 99999999, 0, "xxx");
+ my ($highmaxres, $highbestsymmetry, $highbestqualstr) =
(0, 99999999, "");
- my ($veryhighmaxres, $veryhighbestsymmetry, $veryhighbestqualstr) =
+ my ($veryhighmaxres, $veryhighbestsymmetry, $veryhighbestqualstr) =
(0, 99999999, "");
- my ($photomaxres, $photobestsymmetry, $photobestqualstr) =
+ my ($photomaxres, $photobestsymmetry, $photobestqualstr) =
(0, 99999999, "");
# Go through all choices of the "Quality" option and find the
# best values for the "PrintoutMode" option
my $quality;
- for $quality (keys(%{$stpdata{$stpprn}{'Resolution'}})) {
+ for $quality (keys(%{$stpdata{$stpprn}{'STP_Resolution'}})) {
+
my ($xres, $yres, $qualstr);
if ($quality =~ /^(\d+)x(\d+)(\D.*)$/) {
$xres = $1;
@@ -1149,7 +1360,9 @@ sub getprintoutmode {
$yres = $1;
$qualstr = $2;
} else {
- die "Invalid quality: $quality\n";
+ $xres = $stpdata{$stpprn}{'x_resolution'};
+ $yres = $stpdata{$stpprn}{'y_resolution'};
+ $qualstr = $quality;
}
# Resolution in dots per square inch
my $respersquareinch = $xres * $yres;
@@ -1160,54 +1373,126 @@ sub getprintoutmode {
### Mode: DRAFT
- # Use always the lowest available resolution/quality,
+ # Use always the lowest available resolution/quality,
# preferrably symmetric resolutions,
# Do not use resolutions with less than 150 dpi in both
# demensions.
- # VeryFast dithering, ImageType LineArt
+ # ImageType Text
+
+ my $qualitysetting =
+ (defined($stpdata{$stpprn}{'STP_Quality'}) ?
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'Draft'}) ?
+ 'Draft' :
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'Economy'}) ?
+ 'Economy' :
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'FastEconomy'}) ?
+ 'FastEconomy' :
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'Standard'}) ?
+ 'Standard' : 'ERROR' )))) : '');
+ die ("\n\n'STP_Quality' option without 'Draft', 'Economy', " .
+ "'FastEconomy', and 'Standard' choices for the '$stpprn' " .
+ "device class!\n")
+ if $qualitysetting eq 'ERROR';
+
+ my $imagesetting =
+ (defined($stpdata{$stpprn}{'STP_ImageType'}) ?
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'TextGraphics'}) ?
+ 'TextGraphics' :
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'TextGraphics'}) ?
+ 'TextGraphics' :
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'LineArt'}) ?
+ 'LineArt' :
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'Graphics'}) ?
+ 'Graphics' : 'ERROR' )))) : '');
+ die ("\n\n'STP_ImageType' option without 'TextGraphics', " .
+ "'LineArt', and 'Graphics' choices for the '$stpprn' " .
+ "device class!\n")
+ if $imagesetting eq 'ERROR';
if (($respersquareinch < $draftminres) ||
- (($respersquareinch == $draftminres) &&
+ (($respersquareinch == $draftminres) &&
($symmetry < $draftbestsymmetry)) ||
(($respersquareinch == $draftminres) &&
($symmetry == $draftbestsymmetry) &&
(qualityorder($qualstr, $draftlowestqualstr) < 0))) {
- $draftbestsymmetry = $symmetry;
- $draftminres = $respersquareinch;
- $draftlowestqualstr = $qualstr;
- next if (($xres < 150) && # Resolution not lower than
- ($yres < 150)); # 150x150, 360x120 allowed
- $modeinfo->{'Draft'} = {
- 'quality' => $quality,
- 'xres' => $xres,
- 'yres' => $yres,
- 'dither' => 'VeryFast',
- 'image' => 'LineArt'
+ unless (($xres < 150) && # Resolution not lower than
+ ($yres < 150)) { # 150x150, 360x120 allowed
+ $draftbestsymmetry = $symmetry;
+ $draftminres = $respersquareinch;
+ $draftlowestqualstr = $qualstr;
+ $modeinfo->{'Draft'} = {
+ 'stpres' => $quality,
+ 'quality' => $qualitysetting,
+ 'image' => $imagesetting,
+ 'xres' => $xres,
+ 'yres' => $yres
+ }
}
}
### Mode: NORMAL
- # Default resolution/quality of GIMP-Print, upgrade to
- # unidirectional if possible, use 600x600 dpi for
- # Lexmark Z..
-
- # Adaptive Hybrid dithering, ImageType Photographs
-
- if ((($stpprn =~ /^lexmark\-z/) &&
- ($xres == 600) && ($yres == 600) && ($qualstr eq "uni")) ||
- (($stpprn !~ /^lexmark\-z/) &&
- (($quality eq "${normaldefaultqual}uni") ||
- (($quality eq $normaldefaultqual) &&
- (!defined($normal->{'quality'})))))) {
- $modeinfo->{'Normal'} = {
- 'quality' => $quality,
- 'xres' => $xres,
- 'yres' => $yres,
- 'dither' => 'Adaptive',
- 'image' => 'Photographs'
+ # Lowest resolution which is at least 300x300 dpi (600x600 dpi
+ # for Lexmark Z..), low quality level, unidirectional if
+ # possible,
+
+ # ImageType TextGraphics
+
+ $qualitysetting =
+ (defined($stpdata{$stpprn}{'STP_Quality'}) ?
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'Standard'}) ?
+ 'Standard' :
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'High'}) ?
+ 'High' :
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'Draft'}) ?
+ 'Draft' : 'ERROR' ))) : '');
+ die ("\n\n'STP_Quality' option without 'Draft', 'Standard', and " .
+ "'High' choices for the '$stpprn' device class!\n")
+ if $qualitysetting eq 'ERROR';
+
+ $imagesetting =
+ (defined($stpdata{$stpprn}{'STP_ImageType'}) ?
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'TextGraphics'}) ?
+ 'TextGraphics' :
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'Graphics'}) ?
+ 'Graphics' :
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'LineArt'}) ?
+ 'LineArt' :
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'Photo'}) ?
+ 'Photo' : 'ERROR' )))) : '');
+ die ("\n\n'STP_ImageType' option without 'TextGraphics', 'Graphics', " .
+ "'LineArt', and 'Photo' choices for the '$stpprn' " .
+ "device class!\n")
+ if $imagesetting eq 'ERROR';
+
+ if (($respersquareinch < $normalminres) ||
+ (($respersquareinch == $normalminres) &&
+ ($symmetry < $normalbestsymmetry)) ||
+ (($respersquareinch == $normalminres) &&
+ ($symmetry == $normalbestsymmetry) &&
+ (($qualstr =~ /uni/) > $normaluni)) ||
+ (($respersquareinch == $normalminres) &&
+ ($symmetry == $normalbestsymmetry) &&
+ (($qualstr =~ /uni/) == $normaluni) &&
+ (qualityorder($qualstr, $normallowestqualstr) < 0))) {
+ unless ((($xres < 300) || # Resolution not lower than
+ ($yres < 300)) || # 300x300, (600x600 on Lexmark)
+ (($stpprn =~ /^lexmark\-z/) &&
+ (($xres < 600) ||
+ ($yres < 600)))) {
+ $normalbestsymmetry = $symmetry;
+ $normalminres = $respersquareinch;
+ $normaluni = ($qualstr =~ /uni/);
+ $normallowestqualstr = $qualstr;
+ $modeinfo->{'Normal'} = {
+ 'stpres' => $quality,
+ 'quality' => $qualitysetting,
+ 'image' => $imagesetting,
+ 'xres' => $xres,
+ 'yres' => $yres
+ }
}
}
@@ -1215,18 +1500,48 @@ sub getprintoutmode {
# High: The highest resolution which is not higher than
# 720x720 dpi (Lexmark Z..: 1200x1200 dpi),
- # unidirectional if possible,
+ # unidirectional if possible,
# not "fol", "fourp", "hq", "hq2"
- # Adaptive Hybrid dithering, ImageType Photographs
+ # ImageType TextGraphics
+
+ $qualitysetting =
+ (defined($stpdata{$stpprn}{'STP_Quality'}) ?
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'High'}) ?
+ 'High' :
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'Best'}) ?
+ 'Best' :
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'Photo'}) ?
+ 'Photo' :
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'Standard'}) ?
+ 'Standard' : 'ERROR' )))) : '');
+ die ("\n\n'STP_Quality' option without 'High', 'Best', " .
+ "'Photo', and 'Standard' choices for the '$stpprn' " .
+ "device class!\n")
+ if $qualitysetting eq 'ERROR';
+
+ $imagesetting =
+ (defined($stpdata{$stpprn}{'STP_ImageType'}) ?
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'TextGraphics'}) ?
+ 'TextGraphics' :
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'Graphics'}) ?
+ 'Graphics' :
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'Photo'}) ?
+ 'Photo' :
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'LineArt'}) ?
+ 'LineArt' : 'ERROR' )))) : '');
+ die ("\n\n'STP_ImageType' option without 'TextGraphics', 'Graphics', " .
+ "'LineArt', and 'Photo' choices for the '$stpprn' " .
+ "device class!\n")
+ if $imagesetting eq 'ERROR';
if (($respersquareinch > $highmaxres) ||
- (($respersquareinch == $highmaxres) &&
+ (($respersquareinch == $highmaxres) &&
($symmetry < $highbestsymmetry)) ||
(($respersquareinch == $highmaxres) &&
($symmetry == $highbestsymmetry) &&
(qualityorder($qualstr, $highbestqualstr) > 0))) {
- unless ((($stpprn !~ /^lexmark\-z/) &&
+ unless ((($stpprn !~ /^lexmark\-z/) &&
(($xres > 720) || # Resolution not higher than
($yres > 720))) || # 720x720 for non Lexmark
($xres > 1200) || # not bigger than 1200x1200
@@ -1237,26 +1552,56 @@ sub getprintoutmode {
$highmaxres = $respersquareinch;
$highbestqualstr = $qualstr;
$modeinfo->{'High'} = {
- 'quality' => $quality,
+ 'stpres' => $quality,
+ 'quality' => $qualitysetting,
+ 'image' => $imagesetting,
'xres' => $xres,
- 'yres' => $yres,
- 'dither' => 'Adaptive',
- 'image' => 'Photographs'
+ 'yres' => $yres
}
}
}
### Mode: VERY HIGH
- # Use always the highest available resolution/quality,
+ # Use always the highest available resolution/quality,
# preferrably symmetric resolutions,
# On Epsons: Maximum 1440x720, not "hq2".
- # Adaptive Hybrid dithering, ImageType Photographs
+ # ImageType TextGraphics
+
+ $qualitysetting =
+ (defined($stpdata{$stpprn}{'STP_Quality'}) ?
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'Best'}) ?
+ 'Best' :
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'High'}) ?
+ 'High' :
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'Photo'}) ?
+ 'Photo' :
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'Standard'}) ?
+ 'Standard' : 'ERROR' )))) : '');
+ die ("\n\n'STP_Quality' option without 'High', 'Best', " .
+ "'Photo', and 'Standard' choices for the '$stpprn' " .
+ "device class!\n")
+ if $qualitysetting eq 'ERROR';
+
+ $imagesetting =
+ (defined($stpdata{$stpprn}{'STP_ImageType'}) ?
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'TextGraphics'}) ?
+ 'TextGraphics' :
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'Graphics'}) ?
+ 'Graphics' :
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'Photo'}) ?
+ 'Photo' :
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'LineArt'}) ?
+ 'LineArt' : 'ERROR' )))) : '');
+ die ("\n\n'STP_ImageType' option without 'TextGraphics', 'Graphics', " .
+ "'LineArt', and 'Photo' choices for the '$stpprn' " .
+ "device class!\n")
+ if $imagesetting eq 'ERROR';
if (($respersquareinch > $veryhighmaxres) ||
- (($respersquareinch == $veryhighmaxres) &&
+ (($respersquareinch == $veryhighmaxres) &&
($symmetry < $veryhighbestsymmetry)) ||
(($respersquareinch == $veryhighmaxres) &&
($symmetry == $veryhighbestsymmetry) &&
@@ -1269,49 +1614,85 @@ sub getprintoutmode {
$veryhighmaxres = $respersquareinch;
$veryhighbestqualstr = $qualstr;
$modeinfo->{'VeryHigh'} = {
- 'quality' => $quality,
+ 'stpres' => $quality,
+ 'quality' => $qualitysetting,
+ 'image' => $imagesetting,
'xres' => $xres,
- 'yres' => $yres,
- 'dither' => 'Adaptive',
- 'image' => 'Photographs'
+ 'yres' => $yres
}
}
}
### Mode: PHOTO
- # Use always the highest available resolution/quality,
- # preferrably symmetric resolutions,
-
- # On Epsons: Maximum 2880x720
-
- # EvenTone dithering, ImageType Photographs
+ # High: The highest resolution which is not higher than
+ # 720x720 dpi (Lexmark Z..: 1200x1200 dpi),
+ # unidirectional if possible,
+
+ # ImageType Photographs
+
+ $qualitysetting =
+ (defined($stpdata{$stpprn}{'STP_Quality'}) ?
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'HighPhoto'}) ?
+ 'HighPhoto' :
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'Photo'}) ?
+ 'Photo' :
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'UltraPhoto'}) ?
+ 'UltraPhoto' :
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'Best'}) ?
+ 'Best' :
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'High'}) ?
+ 'High' :
+ (defined($stpdata{$stpprn}{'STP_Quality'}{'Standard'}) ?
+ 'Standard' : 'ERROR' )))))) : '');
+ die ("\n\n'STP_Quality' option without 'HighPhoto', 'Photo', " .
+ "'UltraPhoto', 'Best', 'High', and 'Standard' choices " .
+ "for the '$stpprn' device class!\n")
+ if $qualitysetting eq 'ERROR';
+
+ $imagesetting =
+ (defined($stpdata{$stpprn}{'STP_ImageType'}) ?
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'Photo'}) ?
+ 'Photo' :
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'Graphics'}) ?
+ 'Graphics' :
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'TextGraphics'}) ?
+ 'TextGraphics' :
+ (defined($stpdata{$stpprn}{'STP_ImageType'}{'LineArt'}) ?
+ 'LineArt' : 'ERROR' )))) : '');
+ die ("\n\n'STP_ImageType' option without 'TextGraphics', 'Graphics', " .
+ "'LineArt', and 'Photo' choices for the '$stpprn' " .
+ "device class!\n")
+ if $imagesetting eq 'ERROR';
if (($respersquareinch > $photomaxres) ||
- (($respersquareinch == $photomaxres) &&
+ (($respersquareinch == $photomaxres) &&
($symmetry < $photobestsymmetry)) ||
(($respersquareinch == $photomaxres) &&
($symmetry == $photobestsymmetry) &&
(qualityorder($qualstr, $photobestqualstr) > 0))) {
- unless (($stpprn =~ /^escp2/) && # Epson
- (($xres > 2880) || # Resolution not higher than
- ($yres > 720))) { # 2880x720
+ unless ((($stpprn !~ /^lexmark\-z/) &&
+ (($xres > 720) || # Resolution not higher than
+ ($yres > 720))) || # 720x720 for non Lexmark
+ ($xres > 1200) || # not bigger than 1200x1200
+ ($yres > 1200) || # in general
+ ($qualstr =~ /^(hq2)$/)) { # Not "hq2"
$photobestsymmetry = $symmetry;
$photomaxres = $respersquareinch;
$photobestqualstr = $qualstr;
$modeinfo->{'Photo'} = {
- 'quality' => $quality,
+ 'stpres' => $quality,
+ 'quality' => $qualitysetting,
+ 'image' => $imagesetting,
'xres' => $xres,
- 'yres' => $yres,
- 'dither' => 'EvenTone',
- 'image' => 'Photographs'
+ 'yres' => $yres
}
}
}
}
# We must have a "Normal" mode for every printer.
- if (!defined($modeinfo->{'Normal'}{'quality'})) {
+ if (!defined($modeinfo->{'Normal'}{'stpres'})) {
die "No 'Normal' mode for $stpprn!\n";
}
@@ -1320,26 +1701,33 @@ sub getprintoutmode {
for my $m (keys(%{$modeinfo})) {
# If we didn't find anything for a certain mode, skip this
# mode
- next if (!defined($modeinfo->{$m}{'quality'}));
+ next if (!defined($modeinfo->{$m}{'stpres'}));
my $modestr =
- "GSResolution=$modeinfo->{$m}{'xres'}x" .
- "$modeinfo->{$m}{'yres'}DPI " .
- "Quality=$modeinfo->{$m}{'quality'} " .
- "Dither=$modeinfo->{$m}{'dither'} " .
- "ImageType=$modeinfo->{$m}{'image'}";
- if (defined($stpdata{$stpprn}{'Color'}{'Color'})) {
+ (defined($stpdata{$stpprn}{'STP_ImageType'}) ?
+ "STP_ImageType=$modeinfo->{$m}{'image'} " : "") .
+ (defined($stpdata{$stpprn}{'STP_Quality'}) ?
+ "STP_Quality=$modeinfo->{$m}{'quality'} " :
+ "STP_Resolution=$modeinfo->{$m}{'stpres'} ") .
+ "Resolution=$modeinfo->{$m}{'xres'}x" .
+ "$modeinfo->{$m}{'yres'}dpi";
+ if (defined($stpdata{$stpprn}{'Color'}{'Color'})) {
# Color printer
- $modes->{$stpprn}{$m} = $modestr . " OutputType=Color";
- $modes->{$stpprn}{"$m.Gray"} =
- $modestr . " OutputType=Grayscale";
+ $modes->{$stpprn}{$m} = $modestr . " STP_OutputType=Color";
+ if (defined($stpdata{$stpprn}{'Color'}{'Grayscale'})) {
+ $modes->{$stpprn}{"$m.Gray"} =
+ $modestr . " OutputType=Grayscale";
+ } elsif (defined($stpdata{$stpprn}{'Color'}{'BlackAndWhite'})) {
+ $modes->{$stpprn}{"$m.Gray"} =
+ $modestr . " OutputType=BlackAndWhite";
+ }
# Some HP inkjets have a "600mono" quality mode which
# is only available in Grayscale, replace this mode by
# "300dpi" in the settings for color printing
if ($modes->{$stpprn}{$m} =~ /600mono/) {
- if(!defined($stpdata{$stpprn}{'Resolution'}{'300dpi'})){
+ if(!defined($stpdata{$stpprn}{'STP_Resolution'}{'300dpi'})){
die "No '300dpi' mode for $stpprn!";
}
- $modes->{$stpprn}{$m} =~ s/600x600DPI/300x300DPI/;
+ $modes->{$stpprn}{$m} =~ s/600x600dpi/300x300dpi/;
$modes->{$stpprn}{$m} =~ s/600mono/300dpi/;
}
} else {
@@ -1355,21 +1743,21 @@ sub getprintoutmode {
}
# Remove 'VeryHigh' and 'High' if they are identical to lower
# quality modes
- if ($modes->{$stpprn}{'VeryHigh'} eq
+ if ($modes->{$stpprn}{'VeryHigh'} eq
$modes->{$stpprn}{'High'}) {
delete($modes->{$stpprn}{'VeryHigh'});
}
- if ($modes->{$stpprn}{'High'} eq
+ if ($modes->{$stpprn}{'High'} eq
$modes->{$stpprn}{'Normal'}) {
delete($modes->{$stpprn}{'High'});
}
- if (defined($stpdata{$stpprn}{'Color'}{'Color'})) {
+ if (defined($stpdata{$stpprn}{'Color'}{'Color'})) {
# Color printer
- if ($modes->{$stpprn}{'VeryHigh.Gray'} eq
+ if ($modes->{$stpprn}{'VeryHigh.Gray'} eq
$modes->{$stpprn}{'High.Gray'}) {
delete($modes->{$stpprn}{'VeryHigh.Gray'});
}
- if ($modes->{$stpprn}{'High.Gray'} eq
+ if ($modes->{$stpprn}{'High.Gray'} eq
$modes->{$stpprn}{'Normal.Gray'}) {
delete($modes->{$stpprn}{'High.Gray'});
}
diff --git a/src/foomatic/foomatic-printermap b/src/foomatic/foomatic-printermap
index 8056645..dc5f67f 100644
--- a/src/foomatic/foomatic-printermap
+++ b/src/foomatic/foomatic-printermap
@@ -57,6 +57,14 @@
#gptofoo bjc-7000 printer/Canon-BJC-7000
#gptofoo bjc-7100 printer/Canon-BJC-7100
#gptofoo bjc-8200 printer/Canon-BJC-8200
+#gptofoo canon-cp100 printer/Canon-CP-100
+#gptofoo canon-cp100 printer/Canon-CP-200
+#gptofoo canon-cp100 printer/Canon-CP-300
+#gptofoo canon-cp220 printer/Canon-CP-220
+#gptofoo canon-cp220 printer/Canon-CP-330
+#gptofoo canon-cp220 printer/Canon-SELPHY-CP-400
+#gptofoo canon-cp220 printer/Canon-SELPHY-CP-500
+#gptofoo canon-cp220 printer/Canon-SELPHY-CP-600
#gptofoo pcl-4 printer/Canon-GP_335
#gptofoo pcl-3 printer/Canon-LBP-4sx
#gptofoo pcl-4l printer/Canon-LBP-430
@@ -64,7 +72,6 @@
#gptofoo pcl-6 printer/Canon-LBP-1260
#gptofoo pcl-6 printer/Canon-LBP-1760
#gptofoo bjc-4300 printer/Canon-S100
-#gptofoo bjc-s200 printer/Canon-S200
#gptofoo bjc-s800 printer/Canon-S300
#gptofoo bjc-s400 printer/Canon-S400
#gptofoo bjc-s450 printer/Canon-S450
@@ -108,17 +115,23 @@
#gptofoo escp2-c43ux printer/Epson-Stylus_C43UX
#gptofoo escp2-c44sx printer/Epson-Stylus_C44SX
#gptofoo escp2-c44ux printer/Epson-Stylus_C44UX
+#gptofoo escp2-c45 printer/Epson-Stylus_C45
+#gptofoo escp2-c46 printer/Epson-Stylus_C46
#gptofoo escp2-c50 printer/Epson-Stylus_C50
#gptofoo escp2-c60 printer/Epson-Stylus_C60
#gptofoo escp2-c61 printer/Epson-Stylus_C61
#gptofoo escp2-c62 printer/Epson-Stylus_C62
#gptofoo escp2-c63 printer/Epson-Stylus_C63
#gptofoo escp2-c64 printer/Epson-Stylus_C64
+#gptofoo escp2-c65 printer/Epson-Stylus_C65
+#gptofoo escp2-c66 printer/Epson-Stylus_C66
#gptofoo escp2-c70 printer/Epson-Stylus_C70
#gptofoo escp2-c80 printer/Epson-Stylus_C80
#gptofoo escp2-c82 printer/Epson-Stylus_C82
#gptofoo escp2-c83 printer/Epson-Stylus_C83
#gptofoo escp2-c84 printer/Epson-Stylus_C84
+#gptofoo escp2-c85 printer/Epson-Stylus_C85
+#gptofoo escp2-c86 printer/Epson-Stylus_C86
#gptofoo escp2 printer/Epson-Stylus_Color
#gptofoo escp2 printer/Epson-Stylus_Color_I
#gptofoo escp2 printer/Epson-Stylus_Color_II
@@ -181,9 +194,20 @@
#gptofoo escp2-ex printer/Epson-Stylus_Photo_EX
#gptofoo escp2-ex3 printer/Epson-Stylus_Photo_EX3
#gptofoo escp2-r200 printer/Epson-Stylus_Photo_R200
+#gptofoo escp2-r210 printer/Epson-Stylus_Photo_R210
#gptofoo escp2-r300 printer/Epson-Stylus_Photo_R300
+#gptofoo escp2-r310 printer/Epson-Stylus_Photo_R310
+#gptofoo escp2-rx400 printer/Epson-Stylus_Photo_RX400
+#gptofoo escp2-rx420 printer/Epson-Stylus_Photo_RX420
+#gptofoo escp2-rx425 printer/Epson-Stylus_Photo_RX425
+#gptofoo escp2-rx430 printer/Epson-Stylus_Photo_RX430
#gptofoo escp2-rx500 printer/Epson-Stylus_Photo_RX500
+#gptofoo escp2-rx510 printer/Epson-Stylus_Photo_RX510
#gptofoo escp2-rx600 printer/Epson-Stylus_Photo_RX600
+#gptofoo escp2-rx620 printer/Epson-Stylus_Photo_RX620
+#gptofoo escp2-rx630 printer/Epson-Stylus_Photo_RX630
+#gptofoo escp2-r800 printer/Epson-Stylus_Photo_R800
+#gptofoo escp2-r1800 printer/Epson-Stylus_Photo_R1800
#gptofoo escp2-5000 printer/Epson-Stylus_Pro_5000
#gptofoo escp2-5500 printer/Epson-Stylus_Pro_5500
#gptofoo escp2-7000 printer/Epson-Stylus_Pro_7000
@@ -195,14 +219,21 @@
#gptofoo escp2-10000 printer/Epson-Stylus_Pro_10000
#gptofoo escp2-scan2000 printer/Epson-Stylus_Scan_2000
#gptofoo escp2-scan2500 printer/Epson-Stylus_Scan_2500
+#gptofoo escp2-cx1500 printer/Epson-Stylus_CX1500
#gptofoo escp2-cx3100 printer/Epson-Stylus_CX3100
#gptofoo escp2-cx3200 printer/Epson-Stylus_CX3200
+#gptofoo escp2-cx3500 printer/Epson-Stylus_CX3500
+#gptofoo escp2-cx3600 printer/Epson-Stylus_CX3600
+#gptofoo escp2-cx3650 printer/Epson-Stylus_CX3650
+#gptofoo escp2-cx4600 printer/Epson-Stylus_CX4600
#gptofoo escp2-cx5100 printer/Epson-Stylus_CX5100
#gptofoo escp2-cx5200 printer/Epson-Stylus_CX5200
#gptofoo escp2-cx5300 printer/Epson-Stylus_CX5300
#gptofoo escp2-cx5400 printer/Epson-Stylus_CX5400
#gptofoo escp2-cx6300 printer/Epson-Stylus_CX6300
#gptofoo escp2-cx6400 printer/Epson-Stylus_CX6400
+#gptofoo escp2-cx6500 printer/Epson-Stylus_CX6500
+#gptofoo escp2-cx6600 printer/Epson-Stylus_CX6600
#gptofoo escp2-cx8300 printer/Epson-Stylus_CX8300
#gptofoo escp2-cx8400 printer/Epson-Stylus_CX8400
#gptofoo escp2-cl700 printer/Epson-CL_700
@@ -221,10 +252,15 @@
#gptofoo escp2-mj8000c printer/Epson-MJ_8000C
#gptofoo escp2-pm700c printer/Epson-PM_700C
#gptofoo escp2-pmg700 printer/Epson-PM_G700
+#gptofoo escp2-pmg720 printer/Epson-PM_G720
+#gptofoo escp2-pmg800 printer/Epson-PM_G800
+#gptofoo escp2-pmg820 printer/Epson-PM_G820
#gptofoo escp2-pm730c printer/Epson-PM_730C
#gptofoo escp2-pm740c printer/Epson-PM_740C
#gptofoo escp2-pm750c printer/Epson-PM_750C
-#gptofoo escp2-pmd750 printer/Epson-PM_D700
+#gptofoo escp2-pmd750 printer/Epson-PM_D750
+#gptofoo escp2-pmd770 printer/Epson-PM_D770
+#gptofoo escp2-pmd1000 printer/Epson-PM_D1000
#gptofoo escp2-pm760c printer/Epson-PM_760C
#gptofoo escp2-pm770c printer/Epson-PM_770C
#gptofoo escp2-pm780c printer/Epson-PM_780C
@@ -234,8 +270,10 @@
#gptofoo escp2-pm870c printer/Epson-PM_870C
#gptofoo escp2-pm880c printer/Epson-PM_880C
#gptofoo escp2-pm930c printer/Epson-PM_930C
+#gptofoo escp2-pm940c printer/Epson-PM_940C
#gptofoo escp2-pm950c printer/Epson-PM_950C
#gptofoo escp2-pm970c printer/Epson-PM_970C
+#gptofoo escp2-pm980c printer/Epson-PM_980C
#gptofoo escp2-pm2000c printer/Epson-PM_2000C
#gptofoo escp2-pm2200c printer/Epson-PM_2200C
#gptofoo escp2-pm3000c printer/Epson-PM_3000C
@@ -247,9 +285,15 @@
#gptofoo escp2-pm7000c printer/Epson-PM_7000C
#gptofoo escp2-pm9000c printer/Epson-PM_9000C
#gptofoo escp2-pm10000 printer/Epson-PM_10000
+#gptofoo escp2-pxg900 printer/Epson-PX_G900
+#gptofoo escp2-pxg920 printer/Epson-PX_G920
+#gptofoo escp2-pxg5000 printer/Epson-PX_G5000
#gptofoo escp2-pxv500 printer/Epson-PX_V500
+#gptofoo escp2-pxv600 printer/Epson-PX_V600
#gptofoo escp2-px7000 printer/Epson-PX_7000
#gptofoo escp2-px9000 printer/Epson-PX_9000
+#gptofoo fujifilm-cx400 printer/Fujifilm-Printpix-CX-400
+#gptofoo fujifilm-cx550 printer/Fujifilm-Printpix-CX-550
#gptofoo pcl-4 printer/Fujitsu-PrintPartner_10V
#gptofoo pcl-4 printer/Fujitsu-PrintPartner_16DV
#gptofoo pcl-6 printer/Fujitsu-PrintPartner_20W
@@ -385,7 +429,7 @@
#gptofoo pcl-4 printer/HP-LaserJet_4M
#gptofoo pcl-4 printer/HP-LaserJet_4ML
#gptofoo pcl-4 printer/HP-LaserJet_4P
-#gptofoo pcl-4 printer/HP-LaserJet_4Si
+#gptofoo pcl-4si printer/HP-LaserJet_4Si
#gptofoo pcl-4v printer/HP-LaserJet_4V
#gptofoo pcl-5 printer/HP-LaserJet_5
#gptofoo pcl-4 printer/HP-LaserJet_5L
@@ -397,7 +441,9 @@
#gptofoo pcl-4 printer/HP-LaserJet_6L
#gptofoo pcl-4 printer/HP-LaserJet_6MP
#gptofoo pcl-4 printer/HP-LaserJet_6P
+#gptofoo pcl-5 printer/HP-LaserJet_1010
#gptofoo pcl-5 printer/HP-LaserJet_1012
+#gptofoo pcl-5 printer/HP-LaserJet_1015
#gptofoo pcl-6 printer/HP-LaserJet_1100
#gptofoo pcl-6 printer/HP-LaserJet_1100A
#gptofoo pcl-6 printer/HP-LaserJet_1150
@@ -503,6 +549,7 @@
#gptofoo pcl-900 printer/HP-PSC_2210
#gptofoo pcl-2 printer/IBM-4019
#gptofoo pcl-3 printer/IBM-4029_030_LaserPrinter_10
+#gptofoo pcl-2 printer/IBM-4312
#gptofoo pcl-6 printer/IBM-Infoprint_12
#gptofoo pcl-4 printer/IBM-Page_Printer_3112
#gptofoo pcl-6 printer/Infotec-4651_MF
@@ -570,6 +617,7 @@
#gptofoo pcl-2 printer/NEC-SuperScript_860
#gptofoo pcl-2 printer/NEC-SuperScript_870
#gptofoo pcl-2 printer/NEC-SuperScript_1260
+#gptofoo pcl-4 printer/NEC-SuperScript_1400
#gptofoo pcl-4 printer/NEC-SuperScript_1800
#gptofoo pcl-2 printer/Okidata-OL400
#gptofoo pcl-2 printer/Okidata-OL400e
@@ -588,6 +636,14 @@
#gptofoo pcl-4l printer/Okidata-Super_6e
#gptofoo pcl-2 printer/Olivetti-JP350S
#gptofoo pcl-2 printer/Olivetti-PG_306
+#gptofoo olympus-p10 printer/Olympus-P-10
+#gptofoo olympus-p200 printer/Olympus-P-200
+#gptofoo olympus-p300 printer/Olympus-P-300E
+#gptofoo olympus-p300 printer/Olympus-P-300U
+#gptofoo olympus-p300 printer/Olympus-P-330E
+#gptofoo olympus-p300 printer/Olympus-P-330NE
+#gptofoo olympus-p400 printer/Olympus-P-400
+#gptofoo olympus-p440 printer/Olympus-P-440
#gptofoo pcl-2 printer/PCPI-1030
#gptofoo pcl-2 printer/Panasonic-KX-P4410
#gptofoo pcl-3 printer/Panasonic-KX-P4450
@@ -611,6 +667,7 @@
#gptofoo pcl-2 printer/Seiko-SpeedJET_200
#gptofoo pcl-6 printer/Sharp-AR-161
#gptofoo pcl-601 printer/Sony-IJP-V100
+#gptofoo sony-updp10 printer/Sony-UP-DP10
#gptofoo pcl-2 printer/Star-LS-04
#gptofoo pcl-2 printer/Star-LaserPrinter_8
#gptofoo pcl-3 printer/Tally-MT908
diff --git a/src/foomatic/foomatic-templates-gs/Brightness.xml b/src/foomatic/foomatic-templates-gs/Brightness.xml
deleted file mode 100644
index 17bf2a7..0000000
--- a/src/foomatic/foomatic-templates-gs/Brightness.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<option type="float" id="opt/@@DRVNAME@@-brightness">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>stpBrightness</en>
- </arg_longname>
- <arg_shortname>
- <en>stpBrightness</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>100</arg_order>
- <arg_spot>A</arg_spot>
- <arg_postscript />
- <arg_proto>&lt;&lt;/Brightness %s&gt;&gt;setpagedevice</arg_proto>
- </arg_execution>
- <constraints>
- <constraint sense="true">
- <driver>@@DRVNAME@@</driver>
- <arg_defval>@@DEFVAL@@</arg_defval>
- </constraint>
- </constraints>
- <arg_max>@@MAXVAL@@</arg_max>
- <arg_min>@@MINVAL@@</arg_min>
-</option>
diff --git a/src/foomatic/foomatic-templates-gs/Color.xml b/src/foomatic/foomatic-templates-gs/Color.xml
deleted file mode 100644
index df7403e..0000000
--- a/src/foomatic/foomatic-templates-gs/Color.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<option type="enum" id="opt/@@DRVNAME@@-color">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Output Type</en>
- </arg_longname>
- <arg_shortname>
- <en>OutputType</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>100</arg_order>
- <arg_spot>A</arg_spot>
- <arg_postscript />
- <arg_proto>&lt;&lt;/Color %s&gt;&gt;setpagedevice</arg_proto>
- </arg_execution>
-
- @@OPTCONSTRAINTS@@
- @@ENUMVALS@@
-
-</option>
diff --git a/src/foomatic/foomatic-templates-gs/Contrast.xml b/src/foomatic/foomatic-templates-gs/Contrast.xml
deleted file mode 100644
index 523fe37..0000000
--- a/src/foomatic/foomatic-templates-gs/Contrast.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<option type="float" id="opt/@@DRVNAME@@-contrast">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Contrast Level</en>
- </arg_longname>
- <arg_shortname>
- <en>Contrast</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>100</arg_order>
- <arg_spot>A</arg_spot>
- <arg_postscript />
- <arg_proto>&lt;&lt;/Contrast %s&gt;&gt;setpagedevice</arg_proto>
- </arg_execution>
- <constraints>
- <constraint sense="true">
- <driver>@@DRVNAME@@</driver>
- <arg_defval>@@DEFVAL@@</arg_defval>
- </constraint>
- </constraints>
- <arg_max>@@MAXVAL@@</arg_max>
- <arg_min>@@MINVAL@@</arg_min>
-</option>
diff --git a/src/foomatic/foomatic-templates-gs/Cyan.xml b/src/foomatic/foomatic-templates-gs/Cyan.xml
deleted file mode 100644
index cff323d..0000000
--- a/src/foomatic/foomatic-templates-gs/Cyan.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<option type="float" id="opt/@@DRVNAME@@-cyan">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Cyan Level</en>
- </arg_longname>
- <arg_shortname>
- <en>Cyan</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>100</arg_order>
- <arg_spot>A</arg_spot>
- <arg_postscript />
- <arg_proto>&lt;&lt;/Cyan %s&gt;&gt;setpagedevice</arg_proto>
- </arg_execution>
- <constraints>
- <constraint sense="true">
- <driver>@@DRVNAME@@</driver>
- <arg_defval>@@DEFVAL@@</arg_defval>
- </constraint>
- </constraints>
- <arg_max>@@MAXVAL@@</arg_max>
- <arg_min>@@MINVAL@@</arg_min>
-</option>
diff --git a/src/foomatic/foomatic-templates-gs/Density.xml b/src/foomatic/foomatic-templates-gs/Density.xml
deleted file mode 100644
index 5748ccc..0000000
--- a/src/foomatic/foomatic-templates-gs/Density.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<option type="float" id="opt/@@DRVNAME@@-density">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Density</en>
- </arg_longname>
- <arg_shortname>
- <en>Density</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>100</arg_order>
- <arg_spot>A</arg_spot>
- <arg_postscript />
- <arg_proto>&lt;&lt;/Density %s&gt;&gt;setpagedevice</arg_proto>
- </arg_execution>
- <constraints>
- <constraint sense="true">
- <driver>@@DRVNAME@@</driver>
- <arg_defval>@@DEFVAL@@</arg_defval>
- </constraint>
- </constraints>
- <arg_max>@@MAXVAL@@</arg_max>
- <arg_min>@@MINVAL@@</arg_min>
-</option>
diff --git a/src/foomatic/foomatic-templates-gs/Dither.xml b/src/foomatic/foomatic-templates-gs/Dither.xml
deleted file mode 100644
index 54af711..0000000
--- a/src/foomatic/foomatic-templates-gs/Dither.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<option type="enum" id="opt/@@DRVNAME@@-dither">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Dither Algorithm</en>
- </arg_longname>
- <arg_shortname>
- <en>Dither</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>100</arg_order>
- <arg_spot>A</arg_spot>
- <arg_postscript />
- <arg_proto>&lt;&lt;/Dither(%s)&gt;&gt;setpagedevice</arg_proto>
- </arg_execution>
-
- @@OPTCONSTRAINTS@@
- @@ENUMVALS@@
-
-</option>
diff --git a/src/foomatic/foomatic-templates-gs/Gamma.xml b/src/foomatic/foomatic-templates-gs/Gamma.xml
deleted file mode 100644
index 9e7008d..0000000
--- a/src/foomatic/foomatic-templates-gs/Gamma.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<option type="float" id="opt/@@DRVNAME@@-gamma">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>stpGamma</en>
- </arg_longname>
- <arg_shortname>
- <en>stpGamma</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>100</arg_order>
- <arg_spot>A</arg_spot>
- <arg_postscript />
- <arg_proto>&lt;&lt;/Gamma %s&gt;&gt;setpagedevice</arg_proto>
- </arg_execution>
- <constraints>
- <constraint sense="true">
- <driver>@@DRVNAME@@</driver>
- <arg_defval>@@DEFVAL@@</arg_defval>
- </constraint>
- </constraints>
- <arg_max>@@MAXVAL@@</arg_max>
- <arg_min>@@MINVAL@@</arg_min>
-</option>
diff --git a/src/foomatic/foomatic-templates-gs/ImageType.xml b/src/foomatic/foomatic-templates-gs/ImageType.xml
deleted file mode 100644
index 37e2279..0000000
--- a/src/foomatic/foomatic-templates-gs/ImageType.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<option type="enum" id="opt/@@DRVNAME@@-imagetype">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Image Type</en>
- </arg_longname>
- <arg_shortname>
- <en>ImageType</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>100</arg_order>
- <arg_spot>A</arg_spot>
- <arg_postscript />
- <arg_proto>&lt;&lt;/ImageType %s&gt;&gt;setpagedevice</arg_proto>
- </arg_execution>
- <constraints>
- <constraint sense="true">
- <driver>@@DRVNAME@@</driver>
- <arg_defval>@@DRVNAME@@-LineArt</arg_defval>
- </constraint>
- </constraints>
- <enum_vals>
- <enum_val id="@@DRVNAME@@-LineArt">
- <ev_longname>
- <en>Line art</en>
- </ev_longname>
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <ev_shortname>
- <en>LineArt</en>
- <!-- Until someone tells me how to learn the user locale in
- backends, the shortname must be monolingual in <en>! -->
- </ev_shortname>
- <ev_driverval>0</ev_driverval>
- </enum_val>
- <enum_val id="@@DRVNAME@@-SolidColors">
- <ev_longname>
- <en>Primarily solid colors or smooth gradients</en>
- </ev_longname>
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <ev_shortname>
- <en>Solids</en>
- <!-- Until someone tells me how to learn the user locale in
- backends, the shortname must be monolingual in <en>! -->
- </ev_shortname>
- <ev_driverval>1</ev_driverval>
- </enum_val>
- <enum_val id="@@DRVNAME@@-Photographs">
- <ev_longname>
- <en>Continuous-tone photographs</en>
- </ev_longname>
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <ev_shortname>
- <en>Photographs</en>
- <!-- Until someone tells me how to learn the user locale in
- backends, the shortname must be monolingual in <en>! -->
- </ev_shortname>
- <ev_driverval>2</ev_driverval>
- </enum_val>
- </enum_vals>
-</option>
diff --git a/src/foomatic/foomatic-templates-gs/InkType.xml b/src/foomatic/foomatic-templates-gs/InkType.xml
deleted file mode 100644
index 26ef05e..0000000
--- a/src/foomatic/foomatic-templates-gs/InkType.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<option type="enum" id="opt/@@DRVNAME@@-inktype">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Ink Type</en>
- </arg_longname>
- <arg_shortname>
- <en>InkType</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>100</arg_order>
- <arg_spot>A</arg_spot>
- <arg_postscript />
- <arg_proto>&lt;&lt;/InkType(%s)&gt;&gt;setpagedevice</arg_proto>
- </arg_execution>
-
- @@OPTCONSTRAINTS@@
- @@ENUMVALS@@
-
-</option>
diff --git a/src/foomatic/foomatic-templates-gs/InputSlot.xml b/src/foomatic/foomatic-templates-gs/InputSlot.xml
deleted file mode 100644
index 8237045..0000000
--- a/src/foomatic/foomatic-templates-gs/InputSlot.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<option type="enum" id="opt/@@DRVNAME@@-inputslot">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Input Slot</en>
- </arg_longname>
- <arg_shortname>
- <en>InputSlot</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>100</arg_order>
- <arg_spot>A</arg_spot>
- <arg_postscript />
- <arg_proto>&lt;&lt;/InputSlot(%s)&gt;&gt;setpagedevice</arg_proto>
- </arg_execution>
-
- @@OPTCONSTRAINTS@@
- @@ENUMVALS@@
-
-</option>
diff --git a/src/foomatic/foomatic-templates-gs/Magenta.xml b/src/foomatic/foomatic-templates-gs/Magenta.xml
deleted file mode 100644
index 5e07b96..0000000
--- a/src/foomatic/foomatic-templates-gs/Magenta.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<option type="float" id="opt/@@DRVNAME@@-magenta">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Magenta Level</en>
- </arg_longname>
- <arg_shortname>
- <en>Magenta</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>100</arg_order>
- <arg_spot>A</arg_spot>
- <arg_postscript />
- <arg_proto>&lt;&lt;/Magenta %s&gt;&gt;setpagedevice</arg_proto>
- </arg_execution>
- <constraints>
- <constraint sense="true">
- <driver>@@DRVNAME@@</driver>
- <arg_defval>@@DEFVAL@@</arg_defval>
- </constraint>
- </constraints>
- <arg_max>@@MAXVAL@@</arg_max>
- <arg_min>@@MINVAL@@</arg_min>
-</option>
diff --git a/src/foomatic/foomatic-templates-gs/MediaType.xml b/src/foomatic/foomatic-templates-gs/MediaType.xml
deleted file mode 100644
index a1d736b..0000000
--- a/src/foomatic/foomatic-templates-gs/MediaType.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<option type="enum" id="opt/@@DRVNAME@@-mediatype">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Media Type</en>
- </arg_longname>
- <arg_shortname>
- <en>MediaType</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>100</arg_order>
- <arg_spot>A</arg_spot>
- <arg_postscript />
- <arg_proto>&lt;&lt;/stpMediaType(%s)&gt;&gt;setpagedevice</arg_proto>
- </arg_execution>
-
- @@OPTCONSTRAINTS@@
- @@ENUMVALS@@
-
-</option>
diff --git a/src/foomatic/foomatic-templates-gs/PageSize.xml b/src/foomatic/foomatic-templates-gs/PageSize.xml
deleted file mode 100644
index e551094..0000000
--- a/src/foomatic/foomatic-templates-gs/PageSize.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<option type="enum" id="opt/@@DRVNAME@@-pagesize">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Page Size</en>
- </arg_longname>
- <arg_shortname>
- <en>PageSize</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>100</arg_order>
- <arg_spot>Z</arg_spot>
- <arg_postscript />
- <arg_proto>&lt;&lt;/PageSize[%s]/ImagingBBox null&gt;&gt;setpagedevice</arg_proto>
- </arg_execution>
-
- @@OPTCONSTRAINTS@@
- @@ENUMVALS@@
-
-</option>
diff --git a/src/foomatic/foomatic-templates-gs/PrintoutMode.xml b/src/foomatic/foomatic-templates-gs/PrintoutMode.xml
deleted file mode 100644
index eb1b0bb..0000000
--- a/src/foomatic/foomatic-templates-gs/PrintoutMode.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<option type="enum" id="opt/@@DRVNAME@@-printoutmode">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Printout Mode</en>
- </arg_longname>
- <arg_shortname>
- <en>PrintoutMode</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>10</arg_order>
- <arg_spot>A</arg_spot>
- <arg_composite />
- </arg_execution>
-
- @@OPTCONSTRAINTS@@
- @@ENUMVALS@@
-
-</option>
diff --git a/src/foomatic/foomatic-templates-gs/Quality.xml b/src/foomatic/foomatic-templates-gs/Quality.xml
deleted file mode 100644
index eb8bed9..0000000
--- a/src/foomatic/foomatic-templates-gs/Quality.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<option type="enum" id="opt/@@DRVNAME@@-quality">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Quality</en>
- </arg_longname>
- <arg_shortname>
- <en>Quality</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>100</arg_order>
- <arg_spot>Z</arg_spot>
- <arg_postscript />
- <arg_proto>&lt;&lt;/Quality(%s)&gt;&gt;setpagedevice</arg_proto>
- </arg_execution>
-
- @@OPTCONSTRAINTS@@
- @@ENUMVALS@@
-
-</option>
diff --git a/src/foomatic/foomatic-templates-gs/Resolution.xml b/src/foomatic/foomatic-templates-gs/Resolution.xml
deleted file mode 100644
index a51029f..0000000
--- a/src/foomatic/foomatic-templates-gs/Resolution.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<option type="enum" id="opt/@@DRVNAME@@-resolution">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Ghostscript Resolution</en>
- </arg_longname>
- <arg_shortname>
- <en>GSResolution</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>100</arg_order>
- <arg_spot>A</arg_spot>
- <arg_postscript />
- <arg_proto>&lt;&lt;/HWResolution[%s]&gt;&gt;setpagedevice</arg_proto>
- </arg_execution>
-
- @@OPTCONSTRAINTS@@
- @@ENUMVALS@@
-
-</option>
diff --git a/src/foomatic/foomatic-templates-gs/Saturation.xml b/src/foomatic/foomatic-templates-gs/Saturation.xml
deleted file mode 100644
index dc66f5d..0000000
--- a/src/foomatic/foomatic-templates-gs/Saturation.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<option type="float" id="opt/@@DRVNAME@@-saturation">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>stpSaturation</en>
- </arg_longname>
- <arg_shortname>
- <en>stpSaturation</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>100</arg_order>
- <arg_spot>A</arg_spot>
- <arg_postscript />
- <arg_proto>&lt;&lt;/Saturation %s&gt;&gt;setpagedevice</arg_proto>
- </arg_execution>
- <constraints>
- <constraint sense="true">
- <driver>@@DRVNAME@@</driver>
- <arg_defval>@@DEFVAL@@</arg_defval>
- </constraint>
- </constraints>
- <arg_max>@@MAXVAL@@</arg_max>
- <arg_min>@@MINVAL@@</arg_min>
-</option>
diff --git a/src/foomatic/foomatic-templates-gs/Yellow.xml b/src/foomatic/foomatic-templates-gs/Yellow.xml
deleted file mode 100644
index 43f3d59..0000000
--- a/src/foomatic/foomatic-templates-gs/Yellow.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<option type="float" id="opt/@@DRVNAME@@-yellow">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Yellow Level</en>
- </arg_longname>
- <arg_shortname>
- <en>Yellow</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>100</arg_order>
- <arg_spot>A</arg_spot>
- <arg_postscript />
- <arg_proto>&lt;&lt;/Yellow %s&gt;&gt;setpagedevice</arg_proto>
- </arg_execution>
- <constraints>
- <constraint sense="true">
- <driver>@@DRVNAME@@</driver>
- <arg_defval>@@DEFVAL@@</arg_defval>
- </constraint>
- </constraints>
- <arg_max>@@MAXVAL@@</arg_max>
- <arg_min>@@MINVAL@@</arg_min>
-</option>
diff --git a/src/foomatic/foomatic-templates-gs/gimp-print.xml b/src/foomatic/foomatic-templates-gs/gimp-print.xml
deleted file mode 100644
index 23af826..0000000
--- a/src/foomatic/foomatic-templates-gs/gimp-print.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<driver id="driver/@@DRVNAME@@">
- <name>@@DRVNAME@@</name>
- <url>http://gimp-print.sourceforge.net/</url>
- <execution>
- <ghostscript />
- <prototype>gs -q -dPARANOIDSAFER -dNOPAUSE -dBATCH -sDEVICE=stp %A%Z -sOutputFile=- -</prototype>
- </execution>
- <comments>
- <en>
-
- &lt;b&gt;This page provides data for the GhostScript
- (&quot;stp&quot;) driver of the GIMP-Print 4.2.x series, if you
- are using the IJS driver of the GIMP-Print 4.2.x series, go to the
- &quot;&lt;a
- href=&quot;show_driver.cgi?driver=gimp-print-ijs&quot;&gt;gimp-print-ijs&lt;/a&gt;&quot;
- page, and if you are using GIMP-Print 4.0.x, go to the &quot;&lt;a
- href=&quot;show_driver.cgi?driver=stp&quot;&gt;stp&lt;/a&gt;&quot;
- page.&lt;/b&gt;&lt;p&gt;
-
- GIMP-Print supports a wide variety of Epson Stylus, HP DeskJet,
- LaserJet, Canon BubbleJet, Lexmark inkjet 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.&lt;p&gt;
-
- The execution information currently here corresponds to driver
- version @@STPVER@@. If you use another version, use the Foomatic
- data which comes with the GIMP-Print package.&lt;p&gt;
-
- Note that the Foomatic datafiles provided here are only for the
- GhostScript driver of GIMP-Print. For the native CUPS driver there
- are special PPD files provided by the GIMP-Print package.&lt;p&gt;
-
- To get a pre-patched/pre-compiled GNU-GhostScript 6.51 with this driver
- (version 4.2.0) download
- &lt;a href="http://space.tin.it/computer/wvtberti/linux/stp_driver/gs_stp.htm"&gt;Daniele Berti's source and binary RPMS&lt;/a&gt;.
- </en>
- </comments>
- @@STPRINTERS@@
-</driver>
diff --git a/src/foomatic/foomatic-templates-ijs/Brightness.xml b/src/foomatic/foomatic-templates-ijs/Brightness.xml
deleted file mode 100644
index 527e434..0000000
--- a/src/foomatic/foomatic-templates-ijs/Brightness.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<option type="float" id="opt/@@DRVNAME@@-brightness">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>stpBrightness</en>
- </arg_longname>
- <arg_shortname>
- <en>stpBrightness</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>170</arg_order>
- <arg_spot>B</arg_spot>
- <arg_substitution />
- <arg_proto>Brightness=%s,</arg_proto>
- </arg_execution>
- <constraints>
- <constraint sense="true">
- <driver>@@DRVNAME@@</driver>
- <arg_defval>@@DEFVAL@@</arg_defval>
- </constraint>
- </constraints>
- <arg_max>@@MAXVAL@@</arg_max>
- <arg_min>@@MINVAL@@</arg_min>
-</option>
diff --git a/src/foomatic/foomatic-templates-ijs/Contrast.xml b/src/foomatic/foomatic-templates-ijs/Contrast.xml
deleted file mode 100644
index 9a9210d..0000000
--- a/src/foomatic/foomatic-templates-ijs/Contrast.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<option type="float" id="opt/@@DRVNAME@@-contrast">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Contrast Level</en>
- </arg_longname>
- <arg_shortname>
- <en>Contrast</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>190</arg_order>
- <arg_spot>B</arg_spot>
- <arg_substitution />
- <arg_proto>Contrast=%s,</arg_proto>
- </arg_execution>
- <constraints>
- <constraint sense="true">
- <driver>@@DRVNAME@@</driver>
- <arg_defval>@@DEFVAL@@</arg_defval>
- </constraint>
- </constraints>
- <arg_max>@@MAXVAL@@</arg_max>
- <arg_min>@@MINVAL@@</arg_min>
-</option>
diff --git a/src/foomatic/foomatic-templates-ijs/Cyan.xml b/src/foomatic/foomatic-templates-ijs/Cyan.xml
deleted file mode 100644
index 997148f..0000000
--- a/src/foomatic/foomatic-templates-ijs/Cyan.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<option type="float" id="opt/@@DRVNAME@@-cyan">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Cyan Level</en>
- </arg_longname>
- <arg_shortname>
- <en>Cyan</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>210</arg_order>
- <arg_spot>B</arg_spot>
- <arg_substitution />
- <arg_proto>Cyan=%s,</arg_proto>
- </arg_execution>
- <constraints>
- <constraint sense="true">
- <driver>@@DRVNAME@@</driver>
- <arg_defval>@@DEFVAL@@</arg_defval>
- </constraint>
- </constraints>
- <arg_max>@@MAXVAL@@</arg_max>
- <arg_min>@@MINVAL@@</arg_min>
-</option>
diff --git a/src/foomatic/foomatic-templates-ijs/Density.xml b/src/foomatic/foomatic-templates-ijs/Density.xml
deleted file mode 100644
index 6525c0f..0000000
--- a/src/foomatic/foomatic-templates-ijs/Density.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<option type="float" id="opt/@@DRVNAME@@-density">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Density</en>
- </arg_longname>
- <arg_shortname>
- <en>Density</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>160</arg_order>
- <arg_spot>B</arg_spot>
- <arg_substitution />
- <arg_proto>Density=%s,</arg_proto>
- </arg_execution>
- <constraints>
- <constraint sense="true">
- <driver>@@DRVNAME@@</driver>
- <arg_defval>@@DEFVAL@@</arg_defval>
- </constraint>
- </constraints>
- <arg_max>@@MAXVAL@@</arg_max>
- <arg_min>@@MINVAL@@</arg_min>
-</option>
diff --git a/src/foomatic/foomatic-templates-ijs/Dither.xml b/src/foomatic/foomatic-templates-ijs/Dither.xml
deleted file mode 100644
index cd1c9a2..0000000
--- a/src/foomatic/foomatic-templates-ijs/Dither.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<option type="enum" id="opt/@@DRVNAME@@-dither">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Dither Algorithm</en>
- </arg_longname>
- <arg_shortname>
- <en>Dither</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>140</arg_order>
- <arg_spot>B</arg_spot>
- <arg_substitution />
- <arg_proto>Dither=%s,</arg_proto>
- </arg_execution>
-
- @@OPTCONSTRAINTS@@
- @@ENUMVALS@@
-
-</option>
diff --git a/src/foomatic/foomatic-templates-ijs/Gamma.xml b/src/foomatic/foomatic-templates-ijs/Gamma.xml
deleted file mode 100644
index 3a9d9b4..0000000
--- a/src/foomatic/foomatic-templates-ijs/Gamma.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<option type="float" id="opt/@@DRVNAME@@-gamma">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>stpGamma</en>
- </arg_longname>
- <arg_shortname>
- <en>stpGamma</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>180</arg_order>
- <arg_spot>B</arg_spot>
- <arg_substitution />
- <arg_proto>Gamma=%s,</arg_proto>
- </arg_execution>
- <constraints>
- <constraint sense="true">
- <driver>@@DRVNAME@@</driver>
- <arg_defval>@@DEFVAL@@</arg_defval>
- </constraint>
- </constraints>
- <arg_max>@@MAXVAL@@</arg_max>
- <arg_min>@@MINVAL@@</arg_min>
-</option>
diff --git a/src/foomatic/foomatic-templates-ijs/ImageType.xml b/src/foomatic/foomatic-templates-ijs/ImageType.xml
deleted file mode 100644
index e279a43..0000000
--- a/src/foomatic/foomatic-templates-ijs/ImageType.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<option type="enum" id="opt/@@DRVNAME@@-imagetype">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Image Type</en>
- </arg_longname>
- <arg_shortname>
- <en>ImageType</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>150</arg_order>
- <arg_spot>B</arg_spot>
- <arg_substitution />
- <arg_proto>ImageType=%s,</arg_proto>
- </arg_execution>
- <constraints>
- <constraint sense="true">
- <driver>@@DRVNAME@@</driver>
- <arg_defval>@@DRVNAME@@-LineArt</arg_defval>
- </constraint>
- </constraints>
- <enum_vals>
- <enum_val id="@@DRVNAME@@-LineArt">
- <ev_longname>
- <en>Line art</en>
- </ev_longname>
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <ev_shortname>
- <en>LineArt</en>
- <!-- Until someone tells me how to learn the user locale in
- backends, the shortname must be monolingual in <en>! -->
- </ev_shortname>
- <ev_driverval>0</ev_driverval>
- </enum_val>
- <enum_val id="@@DRVNAME@@-SolidColors">
- <ev_longname>
- <en>Primarily solid colors or smooth gradients</en>
- </ev_longname>
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <ev_shortname>
- <en>Solids</en>
- <!-- Until someone tells me how to learn the user locale in
- backends, the shortname must be monolingual in <en>! -->
- </ev_shortname>
- <ev_driverval>1</ev_driverval>
- </enum_val>
- <enum_val id="@@DRVNAME@@-Photographs">
- <ev_longname>
- <en>Continuous-tone photographs</en>
- </ev_longname>
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <ev_shortname>
- <en>Photographs</en>
- <!-- Until someone tells me how to learn the user locale in
- backends, the shortname must be monolingual in <en>! -->
- </ev_shortname>
- <ev_driverval>2</ev_driverval>
- </enum_val>
- </enum_vals>
-</option>
diff --git a/src/foomatic/foomatic-templates-ijs/InkType.xml b/src/foomatic/foomatic-templates-ijs/InkType.xml
deleted file mode 100644
index 7b6d3ea..0000000
--- a/src/foomatic/foomatic-templates-ijs/InkType.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<option type="enum" id="opt/@@DRVNAME@@-inktype">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Ink Type</en>
- </arg_longname>
- <arg_shortname>
- <en>InkType</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>110</arg_order>
- <arg_spot>B</arg_spot>
- <arg_substitution />
- <arg_proto>InkType=%s,</arg_proto>
- </arg_execution>
-
- @@OPTCONSTRAINTS@@
- @@ENUMVALS@@
-
-</option>
diff --git a/src/foomatic/foomatic-templates-ijs/InputSlot.xml b/src/foomatic/foomatic-templates-ijs/InputSlot.xml
deleted file mode 100644
index 414f69c..0000000
--- a/src/foomatic/foomatic-templates-ijs/InputSlot.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<option type="enum" id="opt/@@DRVNAME@@-inputslot">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Input Slot</en>
- </arg_longname>
- <arg_shortname>
- <en>InputSlot</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>130</arg_order>
- <arg_spot>B</arg_spot>
- <arg_substitution />
- <arg_proto>MediaSource=%s,</arg_proto>
- </arg_execution>
-
- @@OPTCONSTRAINTS@@
- @@ENUMVALS@@
-
-</option>
diff --git a/src/foomatic/foomatic-templates-ijs/Magenta.xml b/src/foomatic/foomatic-templates-ijs/Magenta.xml
deleted file mode 100644
index 1f7c608..0000000
--- a/src/foomatic/foomatic-templates-ijs/Magenta.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<option type="float" id="opt/@@DRVNAME@@-magenta">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Magenta Level</en>
- </arg_longname>
- <arg_shortname>
- <en>Magenta</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>220</arg_order>
- <arg_spot>B</arg_spot>
- <arg_substitution />
- <arg_proto>Magenta=%s,</arg_proto>
- </arg_execution>
- <constraints>
- <constraint sense="true">
- <driver>@@DRVNAME@@</driver>
- <arg_defval>@@DEFVAL@@</arg_defval>
- </constraint>
- </constraints>
- <arg_max>@@MAXVAL@@</arg_max>
- <arg_min>@@MINVAL@@</arg_min>
-</option>
diff --git a/src/foomatic/foomatic-templates-ijs/NumericalOptions.xml b/src/foomatic/foomatic-templates-ijs/NumericalOptions.xml
new file mode 100644
index 0000000..5f55c40
--- /dev/null
+++ b/src/foomatic/foomatic-templates-ijs/NumericalOptions.xml
@@ -0,0 +1,21 @@
+<option type="@@TYPE@@" id="opt/@@DRVNAME@@-@@LOWERCASESHORTNAME@@">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname>
+ <en>@@LONGNAME@@</en>
+ </arg_longname>
+ <arg_shortname>
+ <en>@@SHORTNAME@@</en><!-- backends only know <en> shortnames! -->
+ </arg_shortname>
+ <arg_execution>@@GROUP@@
+ <arg_order>@@ORDER@@</arg_order>
+ <arg_spot>@@SPOT@@</arg_spot>
+ <arg_substitution />
+ <arg_proto>@@PROTO@@</arg_proto>
+ </arg_execution>
+
+ @@OPTCONSTRAINTS@@
+
+ <arg_max>@@MAXVAL@@</arg_max>
+ <arg_min>@@MINVAL@@</arg_min>
+</option>
diff --git a/src/foomatic/foomatic-templates-gs/Model.xml b/src/foomatic/foomatic-templates-ijs/OtherOptions.xml
index ba9e6c7..e0ecee4 100644
--- a/src/foomatic/foomatic-templates-gs/Model.xml
+++ b/src/foomatic/foomatic-templates-ijs/OtherOptions.xml
@@ -1,18 +1,17 @@
-<option type="enum" id="opt/@@DRVNAME@@-model">
+<option type="enum" id="opt/@@DRVNAME@@-@@LOWERCASESHORTNAME@@">
<!-- A multilingual <comments> block can appear here, too;
it should be treated as documentation for the user. -->
<arg_longname>
- <en>Printer Model</en>
+ <en>@@LONGNAME@@</en>
</arg_longname>
<arg_shortname>
- <en>Model</en><!-- backends only know <en> shortnames! -->
+ <en>@@SHORTNAME@@</en><!-- backends only know <en> shortnames! -->
</arg_shortname>
<arg_execution>@@GROUP@@
- <arg_order>10</arg_order>
- <arg_spot>A</arg_spot>
- <arg_required />
+ <arg_order>@@ORDER@@</arg_order>
+ <arg_spot>@@SPOT@@</arg_spot>
<arg_substitution />
- <arg_proto> -sModel=%s</arg_proto>
+ <arg_proto>@@PROTO@@</arg_proto>
</arg_execution>
@@OPTCONSTRAINTS@@
diff --git a/src/foomatic/foomatic-templates-ijs/Quality.xml b/src/foomatic/foomatic-templates-ijs/Quality.xml
deleted file mode 100644
index 4b09b86..0000000
--- a/src/foomatic/foomatic-templates-ijs/Quality.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<option type="enum" id="opt/@@DRVNAME@@-quality">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Quality</en>
- </arg_longname>
- <arg_shortname>
- <en>Quality</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>100</arg_order>
- <arg_spot>B</arg_spot>
- <arg_substitution />
- <arg_proto>Quality=%s,</arg_proto>
- </arg_execution>
-
- @@OPTCONSTRAINTS@@
- @@ENUMVALS@@
-
-</option>
diff --git a/src/foomatic/foomatic-templates-ijs/MediaType.xml b/src/foomatic/foomatic-templates-ijs/RenderResolution.xml
index 0a56b72..ab29dbf 100644
--- a/src/foomatic/foomatic-templates-ijs/MediaType.xml
+++ b/src/foomatic/foomatic-templates-ijs/RenderResolution.xml
@@ -1,17 +1,17 @@
-<option type="enum" id="opt/@@DRVNAME@@-mediatype">
+<option type="enum" id="opt/@@DRVNAME@@-resolution">
<!-- A multilingual <comments> block can appear here, too;
it should be treated as documentation for the user. -->
<arg_longname>
- <en>Media Type</en>
+ <en>Rendering Resolution</en>
</arg_longname>
<arg_shortname>
- <en>MediaType</en><!-- backends only know <en> shortnames! -->
+ <en>Resolution</en><!-- backends only know <en> shortnames! -->
</arg_shortname>
<arg_execution>@@GROUP@@
<arg_order>120</arg_order>
- <arg_spot>B</arg_spot>
+ <arg_spot>A</arg_spot>
<arg_substitution />
- <arg_proto>MediaType=%s,</arg_proto>
+ <arg_proto> -r%s</arg_proto>
</arg_execution>
@@OPTCONSTRAINTS@@
diff --git a/src/foomatic/foomatic-templates-ijs/Resolution.xml b/src/foomatic/foomatic-templates-ijs/Resolution.xml
index bcdd0e1..0006a40 100644
--- a/src/foomatic/foomatic-templates-ijs/Resolution.xml
+++ b/src/foomatic/foomatic-templates-ijs/Resolution.xml
@@ -1,17 +1,17 @@
-<option type="enum" id="opt/@@DRVNAME@@-resolution">
+<option type="enum" id="opt/@@DRVNAME@@-printerresolution">
<!-- A multilingual <comments> block can appear here, too;
it should be treated as documentation for the user. -->
<arg_longname>
- <en>Ghostscript Resolution</en>
+ <en>Printer Resolution</en>
</arg_longname>
<arg_shortname>
- <en>GSResolution</en><!-- backends only know <en> shortnames! -->
+ <en>PrinterResolution</en><!-- backends only know <en> shortnames! -->
</arg_shortname>
<arg_execution>@@GROUP@@
- <arg_order>120</arg_order>
- <arg_spot>A</arg_spot>
+ <arg_order>800</arg_order>
+ <arg_spot>B</arg_spot>
<arg_substitution />
- <arg_proto> -r%s</arg_proto>
+ <arg_proto>Resolution=%s,</arg_proto>
</arg_execution>
@@OPTCONSTRAINTS@@
diff --git a/src/foomatic/foomatic-templates-ijs/Saturation.xml b/src/foomatic/foomatic-templates-ijs/Saturation.xml
deleted file mode 100644
index aa1cb58..0000000
--- a/src/foomatic/foomatic-templates-ijs/Saturation.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<option type="float" id="opt/@@DRVNAME@@-saturation">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>stpSaturation</en>
- </arg_longname>
- <arg_shortname>
- <en>stpSaturation</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>200</arg_order>
- <arg_spot>B</arg_spot>
- <arg_substitution />
- <arg_proto>Saturation=%s,</arg_proto>
- </arg_execution>
- <constraints>
- <constraint sense="true">
- <driver>@@DRVNAME@@</driver>
- <arg_defval>@@DEFVAL@@</arg_defval>
- </constraint>
- </constraints>
- <arg_max>@@MAXVAL@@</arg_max>
- <arg_min>@@MINVAL@@</arg_min>
-</option>
diff --git a/src/foomatic/foomatic-templates-ijs/Yellow.xml b/src/foomatic/foomatic-templates-ijs/Yellow.xml
deleted file mode 100644
index b632741..0000000
--- a/src/foomatic/foomatic-templates-ijs/Yellow.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<option type="float" id="opt/@@DRVNAME@@-yellow">
- <!-- A multilingual <comments> block can appear here, too;
- it should be treated as documentation for the user. -->
- <arg_longname>
- <en>Yellow Level</en>
- </arg_longname>
- <arg_shortname>
- <en>Yellow</en><!-- backends only know <en> shortnames! -->
- </arg_shortname>
- <arg_execution>@@GROUP@@
- <arg_order>230</arg_order>
- <arg_spot>B</arg_spot>
- <arg_substitution />
- <arg_proto>Yellow=%s</arg_proto>
- </arg_execution>
- <constraints>
- <constraint sense="true">
- <driver>@@DRVNAME@@</driver>
- <arg_defval>@@DEFVAL@@</arg_defval>
- </constraint>
- </constraints>
- <arg_max>@@MAXVAL@@</arg_max>
- <arg_min>@@MINVAL@@</arg_min>
-</option>
diff --git a/src/foomatic/foomatic-templates-ijs/gimp-print.xml b/src/foomatic/foomatic-templates-ijs/gutenprint.xml
index ffea11a..f5cb082 100644
--- a/src/foomatic/foomatic-templates-ijs/gimp-print.xml
+++ b/src/foomatic/foomatic-templates-ijs/gutenprint.xml
@@ -3,21 +3,25 @@
<url>http://gimp-print.sourceforge.net/</url>
<execution>
<filter />
- <prototype>gs -q -dPARANOIDSAFER -dNOPAUSE -dBATCH -sDEVICE=ijs -sIjsServer=ijsgimpprint -dIjsUseOutputFD%A -sIjsParams=&quot;%B&quot;%Z -sOutputFile=- -</prototype>
+ <prototype>gs -q -dPARANOIDSAFER -dNOPAUSE -dBATCH -sDEVICE=ijs -sIjsServer=ijsgutenprint.@@STPREL@@ -dIjsUseOutputFD%A -sIjsParams=&quot;@@REMAP@@STP_VERSION=@@STPVER@@,%B&quot;%Z -sOutputFile=- -</prototype>
</execution>
<comments>
<en>
&lt;b&gt;This page provides data for the IJS driver of the
- GIMP-Print 4.2.x series, if you are using the GhostScript
- (&quot;stp&quot;) driver of the GIMP-Print 4.2.x series, go to the
+ Gutenprint 5.0 series, if you are using the GhostScript
+ (&quot;stp&quot;) driver of the Gimp-Print 4.3.x series, go to the
&quot;&lt;a
- href=&quot;show_driver.cgi?driver=gimp-print&quot;&gt;gimp-print&lt;/a&gt;&quot;
- page, and if you are using GIMP-Print 4.0.x, go to the &quot;&lt;a
+ href=&quot;show_driver.cgi?driver=gimp-print-unstable&quot;&gt;gimp-print-unstable&lt;/a&gt;&quot;
+ page, if you are using the IJS
+ driver of the Gimp-Print 4.2.x series, go to the
+ &quot;&lt;a
+ href=&quot;show_driver.cgi?driver=gimp-print-ijs&quot;&gt;gimp-print-ijs&lt;/a&gt;&quot;
+ page, and if you are using Gimp-Print 4.0.x, go to the &quot;&lt;a
href=&quot;show_driver.cgi?driver=stp&quot;&gt;stp&lt;/a&gt;&quot;
page.&lt;/b&gt;&lt;p&gt;
- GIMP-Print supports a wide variety of Epson Stylus, HP DeskJet,
+ Gutenprint supports a wide variety of Epson Stylus, HP DeskJet,
LaserJet, Canon BubbleJet, Lexmark inkjet printers, with the
primary goal being uncompromising quality. Epson Stylus printers
in particular are supported in all resolutions and modes, and the
@@ -28,11 +32,11 @@
The execution information currently here corresponds to driver
version @@STPVER@@. If you use another version, use the Foomatic
- data which comes with the GIMP-Print package.&lt;p&gt;
+ data which comes with the Gutenprint package.&lt;p&gt;
Note that the Foomatic datafiles provided here are only for the
- IJS driver of GIMP-Print. For the native CUPS driver there
- are special PPD files provided by the GIMP-Print package.&lt;p&gt;
+ IJS driver of Gutenprint. For the native CUPS driver there
+ are special PPD files provided by the Gutenprint package.&lt;p&gt;
This driver does not require patching and rebuilding GhostScript.
It is enough when you have an IJS enabled GhostScript (GNU
diff --git a/src/foomatic/gimp-print-version.c b/src/foomatic/gutenprint-version.c
index 1b10dd0..786dfe6 100644
--- a/src/foomatic/gimp-print-version.c
+++ b/src/foomatic/gutenprint-version.c
@@ -1,5 +1,5 @@
/*
- * "$Id: gimp-print-version.c,v 1.2 2001/09/02 13:30:26 rlk Exp $"
+ * "$Id: gutenprint-version.c,v 1.2 2005/04/12 00:45:10 rlk Exp $"
*
* Dump the per-printer options for Grant Taylor's *-omatic database
*
@@ -24,18 +24,16 @@
#include <config.h>
#endif
#include <stdio.h>
-#ifdef INCLUDE_GIMP_PRINT_H
-#include INCLUDE_GIMP_PRINT_H
-#else
-#include <gimp-print/gimp-print.h>
-#endif
-#include "../../lib/libprintut.h"
+#include <gutenprint/gutenprint.h>
int
main(int argc, char **argv)
{
#ifdef VERSION
- printf("%s\n", VERSION);
+ if (argc > 1)
+ printf("%s\n", GUTENPRINT_RELEASE_VERSION);
+ else
+ printf("%s\n", VERSION);
return 0;
#else
fprintf(stderr, "VERSION not defined!\n");
diff --git a/src/foomatic/mk_printerlist.in b/src/foomatic/mk_printerlist.in
new file mode 100644
index 0000000..a8f516f
--- /dev/null
+++ b/src/foomatic/mk_printerlist.in
@@ -0,0 +1,30 @@
+#!@PERL@
+
+%printer_list = ();
+@printer_names = ();
+
+eval `./printers`;
+
+open PRINTERS, "(wget -q -O - http://www.linuxprinting.org/printer_list.cgi; cat foomatic-printermap) |" or die "Can't get print list: $!";
+
+while (<PRINTERS>) {
+ if (/make ==/) {
+ /.*== "(.*)".*/;
+ $current_make = $1;
+ } elsif (/=new Option/) {
+ /.*"(.*)", *"(.*)".*/;
+ my $printer = "$current_make " . $1;
+ $printer_list{$2} = $printer;
+ } elsif (/^\#gptofoo/) {
+ chomp;
+ my ($junk, $key, $id) = split;
+ $id =~ s,printer/,,;
+ my ($string) = sprintf("%-30s %-15s %s\n", $printer_list{$id}, $key,
+ $printer_name{$key});
+ push @printer_names, $string;
+ }
+}
+
+close PRINTERS;
+
+print sort @printer_names;
diff --git a/src/foomatic/oldprinterids b/src/foomatic/oldprinterids
deleted file mode 100644
index 3129cb3..0000000
--- a/src/foomatic/oldprinterids
+++ /dev/null
@@ -1,640 +0,0 @@
-100576 HP-LaserJet_4000
-100704 HP-OfficeJet_635
-101152 Panasonic-KX-P2123
-101952 Canon-MultiPASS_C5500
-102080 Ricoh-Aficio_220
-102304 HP-PSC_500
-105504 Xerox-DocuPrint_C8
-106848 Epson-Stylus_Color_300
-108128 HP-DesignJet_230
-108320 HP-DeskJet_932C
-108896 Okidata-OL610e_S
-109440 Okidata-Okijet_2500
-110464 Canon-MultiPASS_C5000
-110624 HP-LaserJet_2
-111392 Canon-MultiPASS_C3000
-112832 Printrex-820_DL
-112864 Ricoh-Afico_FX10
-113312 Canon-Multipass_L6000
-113888 Xerox-Document_Centre_400
-114016 IBM-4303_Network_Color_Printer
-114592 Brother-HL-4Ve
-114656 Canon-BJC-7100
-114816 Kyocera-FS-3500
-115488 Olivetti-JP450
-116128 Panasonic-KX-P2023
-116256 Fujitsu-PrintPartner_16DV
-117472 Minolta-PagePro_8L
-121952 Brother-HL-2060
-122016 NEC-SuperScript_660
-122048 Lexmark-Z11
-122080 Lexmark-Z51
-122336 HP-Color_LaserJet_5
-122496 HP-DesignJet_750C_Plus
-123584 Xerox-DocuPrint_XJ8C
-123776 Canon-BJC-8200
-123968 Brother-HL-630
-125024 Okidata-OL830Plus
-125408 Xerox-DocuPrint_C20
-125632 QMS-LPK-100
-125696 Epson-L-1000
-126048 Dymo-CoStar-LabelWriter_II
-126049 Dymo-CoStar-LabelWriter_XL
-126080 Dymo-CoStar-LabelWriter_XLplus
-126081 Dymo-CoStar-EL40
-126082 Dymo-CoStar-EL60
-126083 Dymo-CoStar-Turbo
-126084 Dymo-CoStar-SE250
-126085 Dymo-CoStar-SE250plus
-126086 Dymo-CoStar-ASCII_250
-126087 Dymo-CoStar-ASCIIplus
-126112 Avery-Personal_Label_Printer
-126113 Avery-Personal_Label_Printerplus
-126176 Seiko-SLP
-126177 Seiko-SLP_Plus
-126178 Seiko-SLP_EZ30
-126179 Seiko-SLP_Pro
-126180 Seiko-SLP_120
-126181 Seiko-SLP_220
-126496 Lexmark-Winwriter_400
-126752 Xerox-Document_Homecentre
-127776 HP-DeskJet_510
-128576 Kyocera-FS-600
-129184 HP-DeskJet_520
-129376 NEC-SuperScript_1800
-129472 Canon-BJC-3000
-129632 Canon-BJC-8500
-130080 Tektronix-Phaser_PX
-130112 DEC-LN03
-130208 Tektronix-4696
-130272 Tektronix-4697
-130336 Tektronix-Phaser_IISX
-130656 Samsung-ML-85G
-131424 HP-PhotoSmart_P1000
-132800 Compaq-IJ900
-132832 Compaq-IJ300
-132864 Compaq-IJ750
-133152 HP-DeskJet_842C
-133664 HP-DeskJet_840C
-134880 HP-DesignJet_3500CP
-135401 DEC-1800
-135529 NEC-SilentWriter_LC_890
-136928 HP-OfficeJet_R60
-138697 Panasonic-KX-P2135
-139017 Canon-BJC-1000
-141417 Canon-LBP-4sx
-142569 Xerox-WorkCentre_XD120f
-142825 NEC-SuperScript_610plus
-142944 HP-OfficeJet_710
-143104 Olivetti-JP470
-143689 Panasonic-KX-P6300_GDI
-144320 Brother-DCP-1200
-146569 DEC-DECWriter_500i
-147433 Star-NL-10
-151625 QMS-ps-810
-152585 HP-LaserJet_6P
-152800 Brother-HL-1020
-153056 HP-DeskJet_340C
-156105 HP-DeskJet_810C
-157312 Tektronix-Phaser_850
-158569 Epson-EPL-5700
-158816 Kyocera-F-800T
-160032 Xerox-WorkCentre_385
-160288 Brother-MFC-9600
-160969 Apple-LaserWriter_16_600
-161705 HP-DeskJet_812C
-164576 Xerox-WorkCentre_XE90fx
-165408 Brother-HL-1270N
-165536 Brother-HL-1660e
-167008 Epson-Stylus_Photo_1200
-168201 Citizen-printiva600C
-169641 Apple-LaserWriter_IINTX
-173248 HP-DesignJet_350C
-173888 Samsung-SI-630A
-174249 HP-DeskJet_612C
-175232 HP-DeskJet_930C
-178185 Okidata-OL800
-178336 Apple-LaserWriter_IIg
-180160 IBM-Execjet_4072
-181792 Kyocera-FS-1750
-181984 Lexmark-Optra_W810
-182528 Okidata-OL820
-182633 Okidata-Okipage_6w
-185033 HP-OfficeJet_600
-185225 Brother-HL-1250
-186729 HP-DeskJet_970C
-188457 Okidata-Okipage_10e
-189961 Canon-LBP-8A1
-190537 DEC-DECwriter_520ic
-190601 DEC-DECwriter_110i
-190793 Brother-HL-10h
-191689 IBM-Page_Printer_3112
-193321 Star-LC_90
-194345 Ricoh-Aficio_Color_2206
-194601 Okidata-OL400ex
-194697 Okidata-OL810ex
-195529 Citizen-ProJet_II
-195561 Citizen-ProJet_IIc
-195593 Seiko-SpeedJET_200
-196201 Panasonic-KX-P4410
-202441 Tektronix-Phaser_780
-204617 Olivetti-PG_306
-204745 IBM-ProPrinterII
-206505 HP-DeskJet_610C
-20672 Epson-Stylus_Color_1520
-208969 Epson-Stylus_Color_3000
-210153 Samsung-ML-5000a
-211017 Brother-MFC-6550MC
-212905 Sharp-AR-161
-214153 Epson-Stylus_Color_500
-21536 Canon-BJC-5100
-219977 HP-DeskJet_610CL
-222377 Canon-BJ-330
-225673 Apple-12_640ps
-22624 HP-DeskJet_560C
-226985 HP-DeskJet_890C
-22720 HP-DeskJet_1100C
-22784 HP-PaintJet
-22848 HP-PaintJet_XL
-22944 DEC-LJ250
-22976 HP-LaserJet
-230121 Panasonic-KX-P1150
-230377 HP-LaserJet_4P
-23040 HP-LaserJet_Plus
-23104 HP-LaserJet_2D
-23168 HP-LaserJet_3D
-231689 Panasonic-KX-P6150
-23232 HP-LaserJet_6
-23296 Epson-ActionPrinter_3250
-23360 IBM-3853_JetPrinter
-23424 Ricoh-4081
-234281 Fujitsu-PrintPartner_20W
-23488 Tektronix-4693d_color_printer_2-bit_mode
-234953 Brother-HL-1240
-23552 Tektronix-4693d_color_printer_4-bit_mode
-23584 Tektronix-3693d_color_printer_8-bit_mode
-23648 Apple-Dot_Matrix
-23776 Apple-ImageWriter
-23840 Apple-ImageWriter_LQ
-23904 Epson-LQ-2550
-240041 Alps-MD-5000
-240073 Alps-MD-4000
-240105 Alps-MD-2000
-240137 Alps-MD-1000
-240169 Alps-MD-1300
-24128 Fujitsu-1200
-24192 Fujitsu-2400
-24256 Fujitsu-3400
-24320 Epson-LQ-24
-244361 Epson-Stylus_Color_660
-24448 Epson-Dot_Matrix
-244617 Epson-LX-1050
-245033 NEC-Silentwriter2_S60P
-24512 Canon-LIPS-III
-24576 DEC-LA50
-24640 DEC-LA75
-24704 DEC-LA75_Plus
-247625 Kyocera-FS-3750
-24768 NEC-PinWriter_P6
-24832 NEC-PinWriter_P6_plus
-24896 NEC-PinWriter_P60
-24960 NEC-PinWriter_P7
-249705 HP-DeskJet_692C
-25024 NEC-PinWriter_P7_plus
-250601 HP-DeskJet_832C
-25088 NEC-PinWriter_P70
-25152 Okidata-Microline_182
-25216 Okidata-Okipage_4wplus
-25280 Star-StarJet_48
-25344 Tektronix-4695
-25408 Xerox-2700_XES
-25472 Xerox-3700_XES
-255049 Ricoh-Aficio_401
-25568 Xerox-4045_XES
-25696 Epson-Stylus_Color_I
-257577 Canon-LBP-430
-258089 HP-OfficeJet_Pro_1170C
-25824 Epson-Stylus_Color_PRO
-259689 HP-PhotoSmart_P1100
-26016 Epson-Stylus_Color_600
-261321 CalComp-Artisan_1023_penplotter
-261673 Brother-HL-1030
-262185 Star-LC24-100
-263305 Epson-LQ-570plus
-266185 HP-LaserJet_3150
-266313 Epson-Stylus_Color_670
-267881 HP-DeskJet
-268521 HP-ThinkJet
-269289 Kyocera-FS-1200
-270089 Xerox-DocuPrint_C6
-272681 Canon-BJC-6500
-273833 HP-DeskJet_950C
-279593 Apple-StyleWriter_I
-279657 Apple-StyleWriter_II
-279721 Apple-StyleWriter_1200
-279785 Apple-Color_StyleWriter_2200
-279849 Apple-Color_StyleWriter_1500
-279913 Apple-Color_StyleWriter_2400
-280649 Canon-GP_405
-284105 Epson-Stylus_Photo_870
-284169 Epson-Stylus_Photo_1270
-287273 Heidelberg-Digimaster_9110
-287337 Infotec-4651_MF
-287401 Hitachi-DDP_70_with_MicroPress
-287561 HP-Mopier_240
-287657 Kodak-IS_70_CPII
-287689 Kodak-DigiSource_9110
-287721 Canon-LBP-600
-289961 HP-OfficeJet_R45
-290665 Xerox-WorkCentre_XK35c
-290953 HP-DeskJet_1220C
-291081 Apollo-P-1200
-293641 HP-DeskJet_815C
-29472 Ricoh-Aficio_AP2000
-295273 Okidata-Okipage_8w_Lite
-309929 Canon-BJC-2100
-310313 QMS-magicolor_2plus
-311113 Kyocera-FS-680
-311177 HP-DeskJet_320
-312041 Kyocera-FS-3700plus
-312169 HP-OfficeJet_T65
-312297 Epson-EPL-5700L
-312329 Raven-LP-410
-312393 Star-LS-04
-315753 Lexmark-Optra_T610
-316361 Epson-ActionLaser_II
-317129 Lexmark-Z32
-317225 Canon-BJC-6100
-317321 Epson-Stylus_Color_480
-317385 Epson-Stylus_Color_1500
-317481 Epson-Stylus_Color_1160
-317545 Epson-Stylus_Photo_720
-317609 Epson-Stylus_Photo_2000P
-317801 Epson-Stylus_Color_880
-317865 Epson-Stylus_Color_980
-321929 Lexmark-Optra_E312
-325321 Samsung-QL-85G
-32640 Samsung-ML-5050G
-32672 Samsung-ML-85
-32704 Samsung-SF_MSYS_MJ-4700_4800_4500C
-32736 Samsung-ML-7000_7000P_7000N
-327401 Lexmark-Z22
-32768 Samsung-ML-6000_6100
-32832 Samsung-ML-7050
-328361 Brother-4550
-328553 Lexmark-Z52
-332073 Okidata-ML_380
-334409 Samsung-ML-4600
-34016 HP-LaserJet_2P_Plus
-365001 Kyocera-F-1200
-365353 LaserMaster-LM_1000
-365417 Star-LaserPrinter_8
-365737 HP-Color_LaserJet_8550GN
-369705 Xerox-DocuPrint_M760
-373513 Epson-EPL-5200
-375433 DEC-LA70
-378665 Lexmark-Optra_M412
-378729 Lexmark-Optra_M410
-378825 Lexmark-Optra_T612
-378889 Lexmark-Optra_T614
-378953 Lexmark-Optra_T616
-381449 Apple-ImageWriter_II
-413673 Canon-BJC-6200
-413737 Apollo-P-2200
-42048 Samsung-QL-5100A
-421586 Okidata-Okipage_10ex
-421650 Okidata-Okipage_8z
-421714 HP-OfficeJet_Pro_1150C
-421842 HP-OfficeJet_G55
-421906 HP-OfficeJet_G85
-421970 HP-OfficeJet_G95
-423122 Canon-LBP-800
-423826 Canon-BJ-30
-439378 HP-LaserJet_4V
-439570 HP-LaserJet_4Si
-44128 Apple-LaserWriter_NT
-44192 Imagen-ImPress
-44256 CItoh-M8510
-44320 Mitsubishi-CP50_Color_Printer
-448242 HP-DeskJet_648C
-46400 Epson-LQ-500
-464242 Epson-Stylus_Color_777
-47328 Brother-MP-21C
-474610 HP-LaserJet_3200
-475634 Star-NX-1001
-477618 Xerox-DocuPrint_C11
-479986 Canon-S450
-48000 Brother-MFC-4350
-48064 Brother-MFC-8300
-486066 Lexmark-Z12
-487986 IBM-4029_030_LaserPrinter_10
-490066 HP-DesignJet_ColorPro_CAD
-490898 Ricoh-Aficio_700
-491506 HP-LaserJet_4
-49568 Canon-BJC-210SP
-49888 HP-Color_LaserJet_5000
-516274 Epson-Stylus_Scan_2500
-517394 Samsung-ML-4500
-517810 Epson-Stylus_Color_680
-517906 HP-Business_Inkjet_2250
-517970 HP-Business_Inkjet_2250TN
-523058 HP-DeskJet_955C
-530418 HP-DeskJet_990C
-530994 HP-Business_Inkjet_2200
-531058 NEC-SuperScript_4600N
-537362 HP-OfficeJet_T45
-539634 Brother-HL-960
-54176 Panasonic-KX-P1180i
-542482 Sharp-AJ-1800
-543058 IBM-Infoprint_12
-545746 Brother-MFC-9050
-547282 Epson-Stylus_800
-547378 Epson-EPL-7100
-549970 Epson-EPL-5500W
-550610 Tektronix-Phaser_350
-551282 Canon-BJC-55
-551346 Canon-BJC-50
-551410 Canon-BJC-85
-551474 Canon-LBP-1000
-552146 Kyocera-F-1010
-55232 Panasonic-KX-P1624
-554770 HP-2563
-555026 Oce-9050
-556050 Okidata-Microline_IBM_compatible_9_pin
-56608 NEC-Silentwriter_95f
-56672 DEC-LN17
-581554 Xerox-DocuPrint_P1202
-582898 Apple-LaserWriter_Pro_630
-58363 HP-DeskJet_500
-58464 HP-DeskJet_550C
-58656 Canon-BJ-10e
-58688 Canon-BJ-20
-58720 Canon-BJ-200
-58752 Canon-BJC-210
-58816 Canon-BJC-240
-59008 Lexmark-1100
-59296 Lexmark-1000
-593266 Lexmark-Z42
-59328 Lexmark-1020
-59360 Lexmark-2030
-59392 Lexmark-2050
-59424 Lexmark-2070
-59456 Lexmark-3000
-59520 Lexmark-7000
-59552 Lexmark-7200
-59584 Lexmark-Optra_E
-59616 Lexmark-Optra_Ep
-59648 Lexmark-Optra_S_1250
-59776 HP-LaserJet_4L
-599218 Okidata-DP_5000
-60128 Epson-Stylus_Photo_750
-60192 Canon-BJC-610
-60224 NEC-P2X
-602258 Canon-S400
-602386 Canon-S4500
-60256 HP-DeskJet_870C
-60384 Canon-BJC-250
-60416 Canon-BJC-70
-60448 Canon-BJC-4000
-60480 Canon-BJC-4100
-605074 HP-LaserJet_5Si
-60512 Canon-BJC-4200
-60544 Canon-BJC-4300
-60576 Canon-BJC-4550
-60608 Canon-MultiPASS_C2500
-60640 Canon-BJC-800
-60672 Canon-BJC-7000
-60704 Lexmark-Winwriter_100
-60736 Lexmark-Winwriter_150c
-607474 Epson-Stylus_Color_580
-60768 Lexmark-Winwriter_200
-60800 Lexmark-Optra_Color_40
-60832 Lexmark-Optra_Color_45
-60864 Lexmark-Optra_Color_1275
-60896 Lexmark-Optra_Color_1200
-60928 HP-DeskJet_670C
-60960 HP-DeskJet_690C
-609714 HP-LaserJet_3200se
-60992 HP-DeskJet_855C
-61024 HP-DeskJet_850C
-61120 HP-DeskJet_1600C
-61152 HP-DeskJet_1600CM
-61184 Epson-Stylus_Color
-61216 Epson-Stylus_Color_II
-61248 Epson-Stylus_Color_IIs
-61344 Epson-Stylus_Color_800
-613522 Brother-HL-1650
-613618 Brother-HL-1670N
-61472 HP-DeskJet_710C
-61504 HP-DeskJet_720C
-61536 HP-DeskJet_722C
-61568 HP-DeskJet_820C
-615698 NEC-Pinwriter_P20
-61600 HP-DeskJet_1000C
-61632 NEC-SuperScript_660plus
-61664 NEC-SuperScript_750C
-616946 Seiko-SLP-100
-61696 NEC-SuperScript_150C
-616978 Seiko-SLP-200
-617010 Seiko-SLP-240
-61728 NEC-SuperScript_870
-61760 NEC-SuperScript_650C
-61792 NEC-SuperScript_100C
-61824 NEC-SuperScript_860
-61856 NEC-SuperScript_660i
-618706 Lexmark-Z31
-61888 NEC-SuperScript_1260
-619538 Kyocera-FS-1000
-619666 Epson-EPL-5200plus
-62016 Lexmark-5700
-620306 HP-DeskJet_350C
-62048 Canon-LBP-460
-62080 Canon-BJC-620
-62112 Epson-Stylus_Color_740
-62240 Canon-BJC-4400
-62304 HP-LaserJet_4050
-62368 HP-LaserJet_6L
-623858 HP-DeskJet_Plus
-623922 HP-DeskJet_Portable
-624114 HP-DeskJet_680C
-62496 Panasonic-KX-P1123
-62528 Brother-HL-720
-62624 Xerox-DocuPrint_N17
-62720 HP-LaserJet_5L
-62816 HP-LaserJet_1100
-62912 Epson-Stylus_Color_400
-62944 Okidata-OL610e_PS
-62976 Okidata-Okipage_6ex
-63008 Canon-GP_335
-63040 HP-DeskJet_400
-631698 Panasonic-KX-Pxxxx_24-pin
-63200 IBM-4019
-63264 Canon-BJ-300
-63328 Epson-LP_8000
-633554 Epson-EPL-5800
-63360 Epson-LQ-850
-63456 Brother-HL-1050
-63520 HP-LaserJet_5
-63552 Brother-HL-760
-635698 HP-DeskJet_960C
-63584 Brother-HL-660
-63616 Okidata-OL410e
-63648 Lexmark-Optra_Eplus
-63680 HP-PaintJet_XL300
-63712 HP-DeskJet_1200C
-63744 Ricoh-4801
-63776 Ricoh-6000
-638194 Xerox-DocuPrint_M750
-63840 Epson-Stylus_Color_850
-63904 Olivetti-JP350S
-640082 Sharp-AJ-2000
-64032 Okidata-Okipage_6e
-64064 HP-LaserJet_2100M
-64096 HP-LaserJet_2100
-64192 HP-DeskJet_660C
-642674 Minolta-PagePro_1100
-64288 Xerox-DocuPrint_N32
-64320 Xerox-DocuPrint_C55
-64416 Canon-LBP-660
-64512 HP-2500C
-64576 HP-DeskJet_600
-64672 Okidata-Okipage_4w
-64704 Okidata-Okipage_8c
-64736 Okidata-Okipage_8w
-64864 HP-LaserJet_5MP
-64960 HP-LaserJet_3100
-64992 HP-DesignJet_650C
-65216 Panasonic-KX-P5400
-65248 Panasonic-KX-P6100
-65280 Panasonic-KX-P6500
-65312 Panasonic-KX-P4450
-65344 Panasonic-KX-P8475
-65376 Panasonic-KX-P8410
-65408 Panasonic-KX-P8420
-65440 Lexmark-5000
-65600 Canon-MultiPASS_C3500
-65696 Brother-HL-10V
-65856 Epson-Stylus_Pro_XL
-65984 HP-2000C
-66016 Epson-Stylus_Color_640
-66176 Okidata-OL810e_PS
-66336 Lexmark-1020_Business
-66400 HP-DeskJet_420C
-66496 Minolta-PagePro_6
-66528 Minolta-PagePro_8
-67136 HP-LaserJet_5000
-67168 HP-LaserJet_8000
-67200 HP-LaserJet_8100
-67232 HP-Mopier_320
-67296 HP-LaserJet_6MP
-67424 Canon-BJC-7004
-67456 Epson-ActionLaser_1100
-67584 Canon-BJC-5000
-67744 QMS-2425_Turbo_EX
-68320 Okidata-Okijet_2010
-68384 HP-DeskJet_880C
-68512 HP-DeskJet_672C
-68672 HP-DeskJet_697C
-68736 Kyocera-FS-1700plus
-69088 HP-LaserJet_4ML
-69120 HP-LaserJet_4M
-69472 Fujitsu-PrintPartner_8000
-69504 Xerox-DocuPrint_XJ6C
-69568 Lexmark-Optra_S_1855
-69824 HP-Color_LaserJet_4500
-70016 Okidata-OL600e
-70144 Lexmark-4039_10plus
-70208 Panasonic-KX-P2150
-70496 Kyocera-P-2000
-70528 Kyocera-F-3300
-70560 HP-DeskJet_694C
-70720 Lexmark-Valuewriter_300
-70752 Xerox-DocuPrint_P8e
-70912 Lexmark-3200
-71008 Brother-HL-730
-71040 HP-DeskJet_882C
-71232 HP-DeskJet_712C
-71392 Canon-BJC-6000
-71424 Epson-Stylus_Photo_700
-71680 HP-LaserJet_1100A
-71712 Xerox-WorkCentre_470cx
-72000 HP-DeskJet_895C
-72288 Canon-LBP-4plus
-72544 Lexmark-Optra_K_1220
-72736 Lexmark-Optra_E310
-73216 Brother-HL-1060
-73408 Xerox-WorkCentre_XE80
-73472 Epson-Stylus_Color_460
-73760 Brother-MFC_7150C
-74016 Canon-LBP-4U
-74144 Lexmark-Optra_Rplus
-74176 HP-LaserJet_2P
-74208 HP-OfficeJet_625
-74304 Brother-MC-3000
-74464 QMS-magicolor_2
-74528 Brother-HL-8
-74592 PCPI-1030
-74688 IBM-4029_10P
-75104 HP-LaserJet_4_Plus
-75168 HP-LaserJet_5P
-75232 Canon-BJC-4310SP
-75296 Epson-Stylus_Color_440
-75520 HP-DeskJet_682C
-75712 Epson-SQ_1170
-75808 Epson-Stylus_Photo_EX
-75936 Okidata-Microline_192plus
-76064 Minolta-PagePro_6e
-76096 Minolta-PagePro_6ex
-76224 Fujitsu-PrintPartner_10V
-76352 Oce-3165
-76640 HP-OfficeJet_Pro_1175C
-76704 HP-DeskJet_310
-76896 HP-DeskJet_1120C
-77088 Okidata-Okipage_8p
-77152 Xerox-DocuPrint_4508
-77216 Canon-LBP-1760
-77248 Canon-LBP-1260
-77312 Panasonic-KX-P1124
-77472 Kyocera-FS-800
-77568 Canon-BJC-600
-77824 Apple-Color_StyleWriter_2500
-77952 HP-OfficeJet_500
-78144 HP-LaserJet_3
-78336 Brother-HL-1260
-78688 HP-LaserJet_2_w_PS
-78720 NEC-Silentwriter2_model_290
-78816 DEC-LN07
-79840 HP-DeskJet_500C
-80160 Xerox-DocuPrint_P12
-80288 Star-LC24-200
-80320 Xerox-WorkCentre_450cp
-80896 Epson-Stylus_Color_860
-81408 Brother-HL-1040
-81568 Brother-MFC-9500
-82496 Okidata-Super_6e
-83072 Brother-MFC-9100c
-83520 Epson-Stylus_Photo
-84256 Brother-HL-820
-84864 Xerox-DocuPrint_P8
-85344 Okidata-Okipage_12i
-86176 HP-LaserJet_3P_w_PS
-86208 Okidata-Okipage_20DXn
-86784 Lexmark-Optra_Se_3455
-87552 Samsung-QL-6050
-87968 Minolta-PagePro_6L
-89152 Canon-BJC-2000
-90592 Panasonic-KX-PS600
-90976 Canon-BJ-5
-91232 HP-LaserJet_5M
-91840 Kyocera-FS-5900C
-92192 Epson-Stylus_Color_900
-93120 Kyocera-FS-600_KPDL-2
-94016 Apple-LaserWriter_Select_360
-96288 Epson-Stylus_Color_760
-96480 Tally-MT908
-96512 Canon-BJC-80
-96576 Okidata-OL400w
-97312 Brother-HJ-400
-99136 Star-WinType_4000
-99616 HP-DeskJet_540C
-99840 Brother-HL-1070
diff --git a/src/foomatic/paper_sizes.c b/src/foomatic/paper_sizes.c
index 2165875..e22f5fd 100644
--- a/src/foomatic/paper_sizes.c
+++ b/src/foomatic/paper_sizes.c
@@ -1,5 +1,5 @@
/*
- * "$Id: paper_sizes.c,v 1.4 2001/09/02 13:30:26 rlk Exp $"
+ * "$Id: paper_sizes.c,v 1.8 2004/09/17 18:38:12 rleigh Exp $"
*
* Dump the per-printer options for Grant Taylor's *-omatic database
*
@@ -24,23 +24,18 @@
#include <config.h>
#endif
#include <stdio.h>
-#ifdef INCLUDE_GIMP_PRINT_H
-#include INCLUDE_GIMP_PRINT_H
-#else
-#include <gimp-print/gimp-print.h>
-#endif
-#include "../../lib/libprintut.h"
+#include <gutenprint/gutenprint.h>
int
main(int argc, char **argv)
{
int i;
+
+ stp_init();
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));
+ const stp_papersize_t *p = stp_get_papersize_by_index(i);
+ printf("%s %d %d\n", p->name, p->width, p->height);
}
return 0;
}
diff --git a/src/foomatic/printer_margins.c b/src/foomatic/printer_margins.c
index da6ed7d..fef4d6f 100644
--- a/src/foomatic/printer_margins.c
+++ b/src/foomatic/printer_margins.c
@@ -1,9 +1,10 @@
/*
- * "$Id: printer_margins.c,v 1.1.2.1 2003/01/05 22:40:39 tillkamppeter Exp $"
+ * "$Id: printer_margins.c,v 1.15 2004/09/17 18:38:12 rleigh Exp $"
*
* Dump the per-printer margins for Grant Taylor's *-omatic database
*
- * Copyright 2000 Robert Krawitz (rlk@alum.mit.edu)
+ * Copyright 2000, 2003 Robert Krawitz (rlk@alum.mit.edu) and
+ * Till Kamppeter (till.kamppeter@gmx.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
@@ -24,70 +25,85 @@
#include <config.h>
#endif
#include <stdio.h>
-#ifdef INCLUDE_GIMP_PRINT_H
-#include INCLUDE_GIMP_PRINT_H
-#else
-#include <gimp-print/gimp-print.h>
-#endif
-#include "../../lib/libprintut.h"
#include <string.h>
+#include <gutenprint/gutenprint.h>
int
-main(int argc, char **argv)
-{
+main(int argc, char **argv) {
int i, k;
- for (i = 0; i < stp_known_printers(); i++)
- {
- stp_vars_t v;
- const stp_printer_t p = stp_get_printer_by_index(i);
- const stp_vars_t printvars = stp_printer_get_printvars(p);
- const stp_printfuncs_t* printfuncs = stp_printer_get_printfuncs(p);
- int num_opts;
- stp_param_t *opts;
- const char *defopt;
- int width, height,
- bottom, left,
- top, right;
- printf("# Printer model %s, long name `%s'\n",
- stp_printer_get_driver(p), stp_printer_get_long_name(p));
- v = stp_allocate_copy(printvars);
- opts = (*(printfuncs->parameters))(p, NULL, "PageSize", &num_opts);
- defopt = (*(printfuncs->default_parameters))(p, NULL, "PageSize");
- for (k = 0; k < num_opts; k++) {
- const stp_papersize_t papersize = stp_get_papersize_by_name(opts[k].name);
-
- if (!papersize) {
- printf("Unable to look up size %s!\n", opts[k].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[k].name);
-
- (*(printfuncs->media_size))(p, v, &width, &height);
- (*(printfuncs->imageable_area))(p, v, &left, &right, &bottom, &top);
-
- if (strcmp(opts[k].name, "Custom") == 0) {
- /* Use relative values for the custom size */
- right = width - right;
- top = height - top;
- }
-
- printf("$imageableareas{'%s'}{'%s'} = {\n",
- stp_printer_get_driver(p), opts[k].name);
- printf(" 'left' => '%d',\n", left);
- printf(" 'right' => '%d',\n", right);
- printf(" 'top' => '%d',\n", top);
- printf(" 'bottom' => '%d',\n", bottom);
- printf(" 'width' => '%d',\n", width);
- printf(" 'height' => '%d'\n", height);
- printf("};\n");
+
+ stp_init();
+ for (i = 0; i < stp_printer_model_count(); i++) {
+ const stp_printer_t *p = stp_get_printer_by_index(i);
+ const char *driver = stp_printer_get_driver(p);
+ const char *family = stp_printer_get_family(p);
+ stp_vars_t *pv =
+ stp_vars_create_copy(stp_printer_get_defaults(p));
+ stp_parameter_t desc;
+ int num_opts;
+ int printer_is_color = 0;
+ const stp_param_string_t *opt;
+ int width, height, bottom, left, top, right;
+ if (strcmp(family, "ps") == 0 || strcmp(family, "raw") == 0)
+ continue;
+ stp_describe_parameter(pv, "PrintingMode", &desc);
+ if (stp_string_list_is_present(desc.bounds.str, "Color"))
+ printer_is_color = 1;
+ stp_parameter_description_destroy(&desc);
+ if (printer_is_color)
+ stp_set_string_parameter(pv, "PrintingMode", "Color");
+ else
+ stp_set_string_parameter(pv, "PrintingMode", "BW");
+ stp_set_string_parameter(pv, "ChannelBitDepth", "8");
+ printf("# Printer model %s, long name `%s'\n", driver,
+ stp_printer_get_long_name(p));
+ stp_describe_parameter(pv, "PageSize", &desc);
+ printf("$defaults{'%s'}{'PageSize'} = '%s';\n",
+ driver, desc.deflt.str);
+ num_opts = stp_string_list_count(desc.bounds.str);
+
+ for (k = 0; k < num_opts; k++) {
+ const stp_papersize_t *papersize;
+ opt = stp_string_list_param(desc.bounds.str, k);
+ papersize = stp_get_papersize_by_name(opt->name);
+
+ if (!papersize) {
+ printf("Unable to lookup size %s!\n", opt->name);
+ continue;
}
+
+ width = papersize->width;
+ height = papersize->height;
+
+ stp_set_string_parameter(pv, "PageSize", opt->name);
+
+ stp_get_media_size(pv, &width, &height);
+ stp_get_imageable_area(pv, &left, &right, &bottom, &top);
+ bottom = height - bottom;
+ top = height - top;
+
+ if (strcmp(opt->name, "Custom") == 0) {
+ /* Use relative values for the custom size */
+ right = width - right;
+ top = height - top;
+ width = 0;
+ height = 0;
+ }
+
+ printf("$stpdata{'%s'}{'PageSize'}{'%s'} = '%s';\n",
+ driver, opt->name, opt->text);
+ printf("$imageableareas{'%s'}{'%s'} = {\n",
+ driver, opt->name);
+ printf(" 'left' => '%d',\n", left);
+ printf(" 'right' => '%d',\n", right);
+ printf(" 'top' => '%d',\n", top);
+ printf(" 'bottom' => '%d',\n", bottom);
+ printf(" 'width' => '%d',\n", width);
+ printf(" 'height' => '%d'\n", height);
+ printf("};\n");
}
+ stp_parameter_description_destroy(&desc);
+ stp_vars_destroy(pv);
+ }
return 0;
}
diff --git a/src/foomatic/printer_options.c b/src/foomatic/printer_options.c
index b1bc4bb..4c383d5 100644
--- a/src/foomatic/printer_options.c
+++ b/src/foomatic/printer_options.c
@@ -1,5 +1,5 @@
/*
- * "$Id: printer_options.c,v 1.9.4.1 2002/03/30 22:21:33 tillkamppeter Exp $"
+ * "$Id: printer_options.c,v 1.47 2005/04/17 01:58:16 rlk Exp $"
*
* Dump the per-printer options for Grant Taylor's *-omatic database
*
@@ -24,99 +24,245 @@
#include <config.h>
#endif
#include <stdio.h>
-#ifdef INCLUDE_GIMP_PRINT_H
-#include INCLUDE_GIMP_PRINT_H
-#else
-#include <gimp-print/gimp-print.h>
-#endif
-#include "../../lib/libprintut.h"
-
-const char *params[] =
-{
- "PageSize",
- "Resolution",
- "InkType",
- "MediaType",
- "InputSlot"
-};
-
-int nparams = sizeof(params) / sizeof(const char *);
+#include <string.h>
+#include <gutenprint/gutenprint.h>
+#include <gutenprint/gutenprint-intl.h>
int
main(int argc, char **argv)
{
int i, j, k;
- for (i = 0; i < stp_known_printers(); i++)
+
+ stp_init();
+ for (i = 0; i < stp_printer_model_count(); 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;
+ stp_parameter_list_t params;
+ int nparams;
+ stp_parameter_t desc;
+ const stp_printer_t *printer = stp_get_printer_by_index(i);
+ const char *driver = stp_printer_get_driver(printer);
+ const char *family = stp_printer_get_family(printer);
+ stp_vars_t *pv = stp_vars_create_copy(stp_printer_get_defaults(printer));
int tcount = 0;
- printf("# Printer model %s, long name `%s'\n",
- stp_printer_get_driver(p), stp_printer_get_long_name(p));
+ size_t count;
+ int printer_is_color = 0;
+ if (strcmp(family, "ps") == 0 || strcmp(family, "raw") == 0)
+ continue;
+
+ /* Set Job Mode to "Job" as this enables the Duplex option */
+ stp_set_string_parameter(pv, "JobMode", "Job");
+
+ stp_describe_parameter(pv, "PrintingMode", &desc);
+ if (stp_string_list_is_present(desc.bounds.str, "Color"))
+ printer_is_color = 1;
+ stp_parameter_description_destroy(&desc);
+ if (printer_is_color)
+ stp_set_string_parameter(pv, "PrintingMode", "Color");
+ else
+ stp_set_string_parameter(pv, "PrintingMode", "BW");
+ stp_set_string_parameter(pv, "ChannelBitDepth", "8");
+
+ printf("# Printer model %s, long name `%s'\n", driver,
+ stp_printer_get_long_name(printer));
+
+ params = stp_get_parameter_list(pv);
+ nparams = stp_parameter_list_count(params);
+
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)
+ const stp_parameter_t *p = stp_parameter_list_param(params, k);
+ if (p->read_only || p->p_level > STP_PARAMETER_LEVEL_ADVANCED4 ||
+ (p->p_class != STP_PARAMETER_CLASS_OUTPUT &&
+ p->p_class != STP_PARAMETER_CLASS_FEATURE))
+ continue;
+ count = 0;
+ stp_describe_parameter(pv, p->name, &desc);
+ if (desc.is_active)
{
- for (j = 0; j < count; j++)
+ if ((desc.p_type == STP_PARAMETER_TYPE_DOUBLE ||
+ desc.p_type == STP_PARAMETER_TYPE_DIMENSION ||
+ desc.p_type == STP_PARAMETER_TYPE_INT) &&
+ !desc.is_mandatory)
+ {
+ /*
+ * Create a dummy option that enables or disables
+ * the option as appropriate. The long name ends in
+ * enable, rather than starts with enable, because
+ * CUPS has this nasty habit of sorting options
+ * alphabetically rather than leaving them in the
+ * order listed. This ensures that the enable
+ * option is adjacent to the value it controls.
+ */
+ printf("$longnames{'STP_Enable%s'} = '%s Enable';\n",
+ desc.name, desc.text);
+ printf("$param_classes{'STP_Enable%s'} = %d;\n",
+ desc.name, desc.p_class);
+ printf("$param_levels{'STP_Enable%s'} = %d;\n",
+ desc.name, desc.p_level);
+ printf("$defaults{'%s'}{'STP_Enable%s'} = 'Disabled';\n",
+ driver, desc.name);
+ printf("$stpdata{'%s'}{'STP_Enable%s'}{'Disabled'} = 'Disabled';\n",
+ driver, desc.name);
+ printf("$stpdata{'%s'}{'STP_Enable%s'}{'Enabled'} = 'Enabled';\n",
+ driver, desc.name);
+ printf("$longnames{'STP_%s'} = '%s Value';\n",
+ desc.name, desc.text);
+ }
+ else
+ printf("$longnames{'STP_%s'} = '%s';\n",
+ desc.name, desc.text);
+ printf("$param_classes{'STP_%s'} = %d;\n",
+ desc.name, desc.p_class);
+ printf("$param_levels{'STP_%s'} = %d;\n",
+ desc.name, desc.p_level);
+ if (desc.p_type == STP_PARAMETER_TYPE_STRING_LIST)
+ {
+ count = stp_string_list_count(desc.bounds.str);
+ if (count > 0)
+ {
+ if (desc.is_mandatory)
+ {
+ printf("$defaults{'%s'}{'STP_%s'} = '%s';\n",
+ driver, desc.name, desc.deflt.str);
+ }
+ else
+ {
+ printf("$defaults{'%s'}{'STP_%s'} = '%s';\n",
+ driver, desc.name, "None");
+ printf("$stpdata{'%s'}{'STP_%s'}{'%s'} = '%s';\n",
+ driver, desc.name, "None", "None");
+ }
+ for (j = 0; j < count; j++)
+ {
+ const stp_param_string_t *param =
+ stp_string_list_param(desc.bounds.str, j);
+ printf("$stpdata{'%s'}{'STP_%s'}{'%s'} = '%s';\n",
+ driver, desc.name, param->name, param->text);
+ if (strcmp(desc.name, "Resolution") == 0)
+ {
+ int x, y;
+ stp_set_string_parameter(pv, "Resolution",
+ param->name);
+ stp_describe_resolution(pv, &x, &y);
+ if (x > 0 && y > 0)
+ {
+ printf("$stpdata{'%s'}{'%s'}{'%s'} = '%d';\n",
+ driver, "x_resolution", param->name, x);
+ printf("$stpdata{'%s'}{'%s'}{'%s'} = '%d';\n",
+ driver, "y_resolution", param->name, y);
+ }
+ }
+ }
+ }
+ }
+ else if (desc.p_type == STP_PARAMETER_TYPE_BOOLEAN)
{
- 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);
+ if (desc.is_mandatory)
+ {
+ printf("$defaults{'%s'}{'STP_%s'} = '%d';\n",
+ driver, desc.name, desc.deflt.boolean);
+ }
+ else
+ {
+ printf("$defaults{'%s'}{'STP_%s'} = '%s';\n",
+ driver, desc.name, "None");
+ printf("$stpdata{'%s'}{'STP_%s'}{'%s'} = '%s';\n",
+ driver, desc.name, "None", "None");
+ }
+
+ printf("$stpdata{'%s'}{'STP_%s'}{'0'} = 'False';\n",
+ driver, desc.name);
+ printf("$stpdata{'%s'}{'STP_%s'}{'1'} = 'True';\n",
+ driver, desc.name);
}
- free(retval);
+ else if (desc.p_type == STP_PARAMETER_TYPE_DOUBLE)
+ {
+ if (desc.bounds.dbl.lower <= desc.deflt.dbl &&
+ desc.bounds.dbl.upper >= desc.deflt.dbl)
+ {
+ printf("$stp_float_values{'%s'}{'MINVAL'}{'STP_%s'} = %.3f;\n",
+ driver, desc.name, desc.bounds.dbl.lower);
+ printf("$stp_float_values{'%s'}{'MAXVAL'}{'STP_%s'} = %.3f;\n",
+ driver, desc.name, desc.bounds.dbl.upper);
+ printf("$stp_float_values{'%s'}{'DEFVAL'}{'STP_%s'} = %.3f;\n",
+ driver, desc.name, desc.deflt.dbl);
+ /* printf("$stp_float_values{'%s'}{'LONG_NAME'}{'STP_%s'} = '%s';\n",
+ driver, desc.name, _(desc.text)); */
+ printf("$stp_float_values{'%s'}{'CATEGORY'}{'STP_%s'} = '%s';\n",
+ driver, desc.name, _(desc.category));
+ printf("$stp_float_values{'%s'}{'HELP'}{'STP_%s'} = q(%s);\n",
+ driver, desc.name, (desc.help ? _(desc.help) : "''"));
+ printf("$stp_float_values{'%s'}{'MANDATORY'}{'STP_%s'} = q(%d);\n",
+ driver, desc.name, desc.is_mandatory);
+ }
+ }
+ else if (desc.p_type == STP_PARAMETER_TYPE_INT)
+ {
+ if (desc.bounds.integer.lower <= desc.deflt.integer &&
+ desc.bounds.integer.upper >= desc.deflt.integer)
+ {
+ printf("$stp_int_values{'%s'}{'MINVAL'}{'STP_%s'} = %d;\n",
+ driver, desc.name, desc.bounds.integer.lower);
+ printf("$stp_int_values{'%s'}{'MAXVAL'}{'STP_%s'} = %d;\n",
+ driver, desc.name, desc.bounds.integer.upper);
+ printf("$stp_int_values{'%s'}{'DEFVAL'}{'STP_%s'} = %d;\n",
+ driver, desc.name, desc.deflt.integer);
+ /* printf("$stp_int_values{'%s'}{'LONG_NAME'}{'STP_%s'} = '%s';\n",
+ driver, desc.name, _(desc.text)); */
+ printf("$stp_int_values{'%s'}{'CATEGORY'}{'STP_%s'} = '%s';\n",
+ driver, desc.name, _(desc.category));
+ printf("$stp_int_values{'%s'}{'HELP'}{'STP_%s'} = q(%s);\n",
+ driver, desc.name, (desc.help ? _(desc.help) : "''"));
+ printf("$stp_int_values{'%s'}{'MANDATORY'}{'STP_%s'} = q(%d);\n",
+ driver, desc.name, desc.is_mandatory);
+ }
+ }
+ else if (desc.p_type == STP_PARAMETER_TYPE_DIMENSION)
+ {
+ if (desc.bounds.dimension.lower <= desc.deflt.dimension &&
+ desc.bounds.dimension.upper >= desc.deflt.dimension)
+ {
+ printf("$stp_dimension_values{'%s'}{'MINVAL'}{'STP_%s'} = %d;\n",
+ driver, desc.name, desc.bounds.dimension.lower);
+ printf("$stp_dimension_values{'%s'}{'MAXVAL'}{'STP_%s'} = %d;\n",
+ driver, desc.name, desc.bounds.dimension.upper);
+ printf("$stp_dimension_values{'%s'}{'DEFVAL'}{'STP_%s'} = %d;\n",
+ driver, desc.name, desc.deflt.dimension);
+ /* printf("$stp_dimension_values{'%s'}{'LONG_NAME'}{'STP_%s'} = '%s';\n",
+ driver, desc.name, _(desc.text)); */
+ printf("$stp_dimension_values{'%s'}{'CATEGORY'}{'STP_%s'} = '%s';\n",
+ driver, desc.name, _(desc.category));
+ printf("$stp_dimension_values{'%s'}{'HELP'}{'STP_%s'} = q(%s);\n",
+ driver, desc.name, (desc.help ? _(desc.help) : "''"));
+ printf("$stp_dimension_values{'%s'}{'MANDATORY'}{'STP_%s'} = q(%d);\n",
+ driver, desc.name, desc.is_mandatory);
+ }
+ }
+ tcount += count;
}
- tcount += count;
+ stp_parameter_description_destroy(&desc);
}
+ stp_parameter_list_destroy(params);
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)
+ if (printer_is_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");
+ driver, "Color", "Color");
printf("$stpdata{'%s'}{'%s'}{'%s'} = '%s';\n",
- stp_printer_get_driver(p), "Color", "RawCMYK",
- "Raw CMYK");
+ driver, "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");
+ driver, "Color", "RawCMYK", "Raw CMYK");
}
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");
- }
+ printf("$defaults{'%s'}{'%s'} = '%s';\n",
+ driver, "Color", "Grayscale");
+ printf("$stpdata{'%s'}{'%s'}{'%s'} = '%s';\n",
+ driver, "Color", "Grayscale", "Gray Scale");
+ printf("$stpdata{'%s'}{'%s'}{'%s'} = '%s';\n",
+ driver, "Color", "BlackAndWhite", "Black and White");
}
+ stp_vars_destroy(pv);
}
return 0;
}
diff --git a/src/foomatic/printers.c b/src/foomatic/printers.c
index 6e7ab31..112abf0 100644
--- a/src/foomatic/printers.c
+++ b/src/foomatic/printers.c
@@ -1,5 +1,5 @@
/*
- * "$Id: printers.c,v 1.2 2001/09/02 13:30:26 rlk Exp $"
+ * "$Id: printers.c,v 1.10 2004/09/17 18:38:12 rleigh Exp $"
*
* Dump the per-printer options for Grant Taylor's *-omatic database
*
@@ -24,22 +24,21 @@
#include <config.h>
#endif
#include <stdio.h>
-#ifdef INCLUDE_GIMP_PRINT_H
-#include INCLUDE_GIMP_PRINT_H
-#else
-#include <gimp-print/gimp-print.h>
-#endif
-#include "../../lib/libprintut.h"
+#include <gutenprint/gutenprint.h>
int
main(int argc, char **argv)
{
int i;
- for (i = 0; i < stp_known_printers(); i++)
+
+ stp_init();
+ for (i = 0; i < stp_printer_model_count(); i++)
{
- const stp_papersize_t p = stp_get_printer_by_index(i);
+ const stp_printer_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));
+ printf("$printer_make{'%s'} = '%s';\n", stp_printer_get_driver(p),
+ stp_printer_get_manufacturer(p));
}
return 0;
}
diff --git a/src/foomatic/stp_limits.c b/src/foomatic/stp_limits.c
deleted file mode 100644
index 6015774..0000000
--- a/src/foomatic/stp_limits.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * "$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 <config.h>
-#endif
-#include <stdio.h>
-#ifdef INCLUDE_GIMP_PRINT_H
-#include INCLUDE_GIMP_PRINT_H
-#else
-#include <gimp-print/gimp-print.h>
-#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/COPYING b/src/ghost/COPYING
deleted file mode 100644
index a43ea21..0000000
--- a/src/ghost/COPYING
+++ /dev/null
@@ -1,339 +0,0 @@
- 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.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) 19yy <name of author>
-
- 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.
-
- <signature of Ty Coon>, 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 b/src/ghost/Makefile
deleted file mode 100644
index 74950e8..0000000
--- a/src/ghost/Makefile
+++ /dev/null
@@ -1,539 +0,0 @@
-# Generated automatically from Makefile.in by configure.
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
-
-# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-SHELL = /bin/sh
-
-srcdir = .
-top_srcdir = ../..
-prefix = /usr/local
-exec_prefix = ${prefix}
-
-bindir = ${exec_prefix}/Tools//
-sbindir = ${exec_prefix}/sbin
-libexecdir = ${exec_prefix}/libexec
-datadir = ${prefix}/Libraries/share
-sysconfdir = ${prefix}/etc
-sharedstatedir = ${prefix}/com
-localstatedir = ${prefix}/var
-libdir = ${exec_prefix}/Libraries//
-infodir = ${prefix}/Library/info
-mandir = ${prefix}/Library/man
-includedir = ${prefix}/Headers//
-oldincludedir = /usr/include
-
-DESTDIR =
-
-pkgdatadir = $(datadir)/gimp-print
-pkglibdir = $(libdir)/gimp-print
-pkgincludedir = $(includedir)/gimp-print
-
-top_builddir = ../..
-
-ACLOCAL = aclocal -I src/main
-AUTOCONF = autoconf
-AUTOMAKE = automake
-AUTOHEADER = autoheader
-
-INSTALL = /usr/bin/ginstall -c
-INSTALL_PROGRAM = ${INSTALL} $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_SCRIPT = ${INSTALL_PROGRAM}
-transform = s,x,x,
-
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_alias = i686-pc-linux-gnu
-host_triplet = i686-pc-linux-gnu
-ALL_LINGUAS = en_GB sv no fr da pl sk el nl es pt de ja cs nb uk hu
-AS = @AS@
-AWK = gawk
-BISON_PROG = /usr/bin/bison
-BUILD_INCLUDED_LIBINTL = no
-CATALOGS = en_GB.gmo sv.gmo no.gmo fr.gmo da.gmo pl.gmo sk.gmo el.gmo nl.gmo es.gmo pt.gmo de.gmo ja.gmo cs.gmo nb.gmo uk.gmo hu.gmo
-CATOBJEXT = .gmo
-CC = gcc
-CONVERT = /usr/X11R6/bin/convert
-CUPS_BACKEND_BIN = $(CUPS_BACKEND_BIN)
-CUPS_BIN = $(CUPS_BIN)
-CUPS_CFLAGS =
-CUPS_CONF = $(CUPS_CONF)
-CUPS_CONFIG = /usr/bin/cups-config
-CUPS_FILTER_BIN = $(CUPS_FILTER_BIN)
-CUPS_INSTALL =
-CUPS_LIBS = -Wl,-rpath,/usr/lib -lcupsimage -lcups -lssl -lcrypto -lnsl -lcrypt
-CUPS_MAN = $(CUPS_MAN)
-CUPS_NOINST_BIN = $(CUPS_NOINST_BIN)
-CUPS_PKG = $(CUPS_PKG)
-CUPS_PPD_PS_LEVEL = 2
-DATADIRNAME = share
-DB2HTML = /usr/bin/db2html
-DB2PDF = /usr/bin/db2pdf
-DB2PS = /usr/bin/db2ps
-DLLTOOL = @DLLTOOL@
-DVIPDF = /usr/local/Tools/dvipdf
-DVIPS = /usr/bin/dvips
-ECHO = echo
-ESCPUTIL_BIN = $(ESCPUTIL_BIN)
-ESCPUTIL_MAN = $(ESCPUTIL_MAN)
-EXEEXT =
-FOOMATIC_3_NOINST_BIN =
-FOOMATIC_CONFIGURE = /usr/local/bin/foomatic-configure
-FOOMATIC_INSTALL =
-FOOMATIC_KITLOAD = /usr/local/sbin/foomatic-kitload
-FOOMATIC_NOINST_BIN = $(FOOMATIC_NOINST_BIN)
-FOOMATIC_OLDIDS_NOINST_BIN = $(FOOMATIC_OLDIDS_NOINST_BIN)
-FOOMATIC_PPDFILE =
-GENCAT = gencat
-GIMPPRINT_BINARY_AGE = 1
-GIMPPRINT_CFLAGS =
-GIMPPRINT_CURRENT_INTERFACE = 2
-GIMPPRINT_DEPLIBS = -lm
-GIMPPRINT_INTERFACE_AGE = 3
-GIMPPRINT_LIBS = -lgimpprint
-GIMPPRINT_MAJOR_VERSION = 4
-GIMPPRINT_MICRO_VERSION = 7
-GIMPPRINT_MINOR_VERSION = 2
-GIMPPRINT_VERSION = 4.2.7
-GIMPTOOL = /usr/local/Tools/gimptool
-GIMPTOOL_CHECK = /usr/local/Tools/gimptool
-GIMP_BIN = $(GIMP_BIN)
-GIMP_CFLAGS = -I/usr/local/Headers// -I/opt/gnome/include/gtk-1.2 -I/usr/include/glib-1.2 -I/usr/lib/glib/include -I/usr/X11R6/include
-GIMP_CFLAGS_NOUI = -I/usr/local/Headers// -I/usr/include/glib-1.2 -I/usr/lib/glib/include
-GIMP_DATA_DIR = /usr/local/Libraries/share/gimp/1.2
-GIMP_LIBS = -L/usr/local/Libraries// -lgimpui -lgimp -L/opt/gnome/lib -L/usr/X11R6/lib -lgtk -lgdk -L/usr/lib -rdynamic -lgmodule -lglib -ldl -lXi -lXext -lX11 -lm
-GIMP_LIBS_NOUI = -L/usr/local/Libraries// -lgimp -L/usr/lib -lglib
-GIMP_PLUGIN_DIR = /usr/local/Libraries///gimp/1.2
-GLIBC21 = yes
-GMOFILES = en_GB.gmo sv.gmo no.gmo fr.gmo da.gmo pl.gmo sk.gmo el.gmo nl.gmo es.gmo pt.gmo de.gmo ja.gmo cs.gmo nb.gmo uk.gmo hu.gmo
-GMSGFMT = /usr/bin/msgfmt
-GNUCFLAGS = -Wall -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Wwrite-strings -pedantic
-IJS_CFLAGS = -I/usr/local/Headers///ijs
-IJS_CONFIG = /usr/local/Tools/ijs-config
-IJS_INSTALL =
-IJS_LIBS = -L/usr/local/Libraries// -lijs
-INSTOBJEXT = .mo
-INTLBISON = :
-INTLLIBS =
-INTLOBJS =
-INTL_LIBTOOL_SUFFIX_PREFIX =
-LEX = flex
-LIBGIMPPRINT_LIBS = $(top_builddir)/src/main/libgimpprint.la
-LIBICONV =
-LIBM = -lm
-LIBREADLINE_DEPS = -lreadline -lncurses
-LIBTOOL = $(SHELL) $(top_builddir)/libtool
-LIBTOOL_DEPS = scripts/ltmain.sh
-LN_S = ln -s
-LTALLOCA =
-LTLIBOBJS = xgetcwd.lo xmalloc.lo
-LT_AGE = 1
-LT_CURRENT = 2
-LT_RELEASE = 4.2
-LT_REVISION = 3
-MAINT =
-MAINTAINER_CFLAGS =
-MAIN_BIN =
-MAIN_DAT =
-MAIN_MAN =
-MAIN_SCR =
-MAKEINFO = makeinfo
-MKINSTALLDIRS = scripts/mkinstalldirs
-MSGFMT = /usr/bin/msgfmt
-OBJDUMP = @OBJDUMP@
-OBJEXT = o
-PACKAGE = gimp-print
-PERL = /usr/bin/perl
-PLUG_IN_PATH = admin-bin
-POFILES = en_GB.po sv.po no.po fr.po da.po pl.po sk.po el.po nl.po es.po pt.po de.po ja.po cs.po nb.po uk.po hu.po
-POSUB = po
-PRINT_VASPRINTF =
-RANLIB = ranlib
-RELEASE_DATE = 15 Jul 2004
-RM = rm
-SAMPLE_IMAGES = $(SAMPLE_IMAGES)
-STRIP = strip
-TESTPATTERN_BIN =
-TEST_BIN = $(TEST_BIN)
-TEXI2HTML = /usr/bin/texi2html
-USER_GUIDE = $(USER_GUIDE)
-USE_INCLUDED_LIBINTL = no
-USE_NLS = yes
-VERSION = 4.2.7
-YACC = bison -y
-YACC_PROG =
-cups_bindir = /usr/local/bin
-cups_conf_datadir = /usr/share/cups
-cups_conf_serverbin = /usr/lib/cups
-cups_conf_serverroot = /etc/cups
-cups_exec_prefix = /usr/local
-cups_prefix = /usr/local
-gimp_plug_indir = /usr/local/Libraries///gimp/1.2/plug-ins
-gimpprint_cflags =
-gimpprint_libs = -lgimpprint -lm
-
-AUTOMAKE_OPTIONS = 1.4 gnu
-
-MAINT_CHARSET = latin1
-
-MAINCODE = canon.c color.c dither.c escp2.c escp2-data.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 print-dither.h print-escp2.h
-
-
-MAINFILES = $(MAINCODE) $(MAINHEADERS)
-#ALL_LOCAL_DEPS = $(srcdir)/$(addprefix gdevstp-,$(MAINCODE)) $(srcdir)/$(addprefix gdevstp-,$(MAINHEADERS))
-ALL_LOCAL_DEPS =
-
-GHCODE = -e 's/print-printers.c/gdevstp-printers.c/' -e 's/^\\\#include "\(gimp\-\)*\(.*\)\.h"$$/\\\#include "gdevstp-\2.h"/' -e 's/^\\\#include <gimp-print\/gimp-print\(.*\)\.h>$$/\\\#include "gdevstp-print\1.h"/'
-
-
-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-print-dither.h $(srcdir)/gdevstp-dither-matrices.c $(srcdir)/gdevstp-escp2.c $(srcdir)/gdevstp-print-escp2.h $(srcdir)/gdevstp-escp2-data.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
-
-
-AM_CFLAGS = $(GNUCFLAGS)
-INCLUDES = -I/usr/local/Headers///ijs -I$(top_srcdir)/include -I$(top_builddir)/include -I$(top_srcdir)/intl $(LIBGIMPPRINT_CFLAGS)
-LIBPRINTUT = $(top_builddir)/lib/libprintut.la
-LIBS = -L/usr/local/Libraries// -lijs -lz $(INTLLIBS)
-
-IJS_BIN = ijsgimpprint
-
-bin_PROGRAMS = $(IJS_BIN)
-
-EXTRA_PROGRAMS = ijsgimpprint
-
-ijsgimpprint_LDADD = $(LIBPRINTUT) $(LIBGIMPPRINT_LIBS)
-ijsgimpprint_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
-mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
-CONFIG_HEADER = ../../config.h
-CONFIG_CLEAN_FILES = contrib.mak.addon
-bin_PROGRAMS = $(IJS_BIN)
-PROGRAMS = $(bin_PROGRAMS)
-
-
-DEFS = -DHAVE_CONFIG_H -I. -I$(srcdir) -I../..
-CPPFLAGS =
-LDFLAGS =
-ijsgimpprint_SOURCES = ijsgimpprint.c
-ijsgimpprint_OBJECTS = ijsgimpprint.$(OBJEXT)
-ijsgimpprint_LDFLAGS =
-CFLAGS = -g -O2
-COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-DIST_COMMON = README COPYING Makefile.am Makefile.in \
-contrib.mak.addon.in
-
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = tar
-GZIP_ENV = --best
-DEP_FILES = .deps/ijsgimpprint.P
-SOURCES = ijsgimpprint.c
-OBJECTS = ijsgimpprint.$(OBJEXT)
-
-all: all-redirect
-.SUFFIXES:
-.SUFFIXES: .S .c .lo .o .obj .s
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOMAKE) --gnu src/ghost/Makefile
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-contrib.mak.addon: $(top_builddir)/config.status contrib.mak.addon.in
- cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-mostlyclean-binPROGRAMS:
-
-clean-binPROGRAMS:
- -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
-
-distclean-binPROGRAMS:
-
-maintainer-clean-binPROGRAMS:
-
-install-binPROGRAMS: $(bin_PROGRAMS)
- @$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(bindir)
- @list='$(bin_PROGRAMS)'; for p in $$list; do \
- if test -f $$p; then \
- echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
- $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
- else :; fi; \
- done
-
-uninstall-binPROGRAMS:
- @$(NORMAL_UNINSTALL)
- list='$(bin_PROGRAMS)'; for p in $$list; do \
- rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
- done
-
-# FIXME: We should only use cygpath when building on Windows,
-# and only if it is available.
-.c.obj:
- $(COMPILE) -c `cygpath -w $<`
-
-.s.o:
- $(COMPILE) -c $<
-
-.S.o:
- $(COMPILE) -c $<
-
-mostlyclean-compile:
- -rm -f *.o core *.core
- -rm -f *.$(OBJEXT)
-
-clean-compile:
-
-distclean-compile:
- -rm -f *.tab.c
-
-maintainer-clean-compile:
-
-.s.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
-
-.S.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-distclean-libtool:
-
-maintainer-clean-libtool:
-
-ijsgimpprint$(EXEEXT): $(ijsgimpprint_OBJECTS) $(ijsgimpprint_DEPENDENCIES)
- @rm -f ijsgimpprint$(EXEEXT)
- $(LINK) $(ijsgimpprint_LDFLAGS) $(ijsgimpprint_OBJECTS) $(ijsgimpprint_LDADD) $(LIBS)
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- here=`pwd` && cd $(srcdir) \
- && mkid -f$$here/ID $$unique $(LISP)
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
- tags=; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
- || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
-
-mostlyclean-tags:
-
-clean-tags:
-
-distclean-tags:
- -rm -f TAGS ID
-
-maintainer-clean-tags:
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-
-subdir = src/ghost
-
-distdir: $(DISTFILES)
- here=`cd $(top_builddir) && pwd`; \
- top_distdir=`cd $(top_distdir) && pwd`; \
- distdir=`cd $(distdir) && pwd`; \
- cd $(top_srcdir) \
- && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu src/ghost/Makefile
- @for file in $(DISTFILES); do \
- d=$(srcdir); \
- if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
- else \
- test -f $(distdir)/$$file \
- || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $$d/$$file $(distdir)/$$file || :; \
- fi; \
- done
-
-DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
-
--include $(DEP_FILES)
-
-mostlyclean-depend:
-
-clean-depend:
-
-distclean-depend:
- -rm -rf .deps
-
-maintainer-clean-depend:
-
-%.o: %.c
- @echo '$(COMPILE) -c $<'; \
- $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
- @-cp .deps/$(*F).pp .deps/$(*F).P; \
- tr ' ' '\012' < .deps/$(*F).pp \
- | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
- >> .deps/$(*F).P; \
- rm .deps/$(*F).pp
-
-%.lo: %.c
- @echo '$(LTCOMPILE) -c $<'; \
- $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
- @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
- < .deps/$(*F).pp > .deps/$(*F).P; \
- tr ' ' '\012' < .deps/$(*F).pp \
- | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
- >> .deps/$(*F).P; \
- rm -f .deps/$(*F).pp
-info-am:
-info: info-am
-dvi-am:
-dvi: dvi-am
-check-am: all-am
-check: check-am
-installcheck-am:
-installcheck: installcheck-am
-install-exec-am: install-binPROGRAMS
-install-exec: install-exec-am
-
-install-data-am:
-install-data: install-data-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-am
-uninstall-am: uninstall-binPROGRAMS
-uninstall: uninstall-am
-all-am: Makefile $(PROGRAMS) all-local
-all-redirect: all-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs:
- $(mkinstalldirs) $(DESTDIR)$(bindir)
-
-
-mostlyclean-generic:
-
-clean-generic:
- -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
- -rm -f config.cache config.log stamp-h stamp-h[0-9]*
-
-maintainer-clean-generic:
- -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \
- mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
- mostlyclean-generic
-
-mostlyclean: mostlyclean-am
-
-clean-am: clean-binPROGRAMS clean-compile clean-libtool clean-tags \
- clean-depend clean-generic mostlyclean-am
-
-clean: clean-am
-
-distclean-am: distclean-binPROGRAMS distclean-compile distclean-libtool \
- distclean-tags distclean-depend distclean-generic \
- clean-am
- -rm -f libtool
-
-distclean: distclean-am
-
-maintainer-clean-am: maintainer-clean-binPROGRAMS \
- maintainer-clean-compile maintainer-clean-libtool \
- maintainer-clean-tags maintainer-clean-depend \
- maintainer-clean-generic distclean-am
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
-
-maintainer-clean: maintainer-clean-am
-
-.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
-maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
-mostlyclean-compile distclean-compile clean-compile \
-maintainer-clean-compile mostlyclean-libtool distclean-libtool \
-clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
-distclean-tags clean-tags maintainer-clean-tags distdir \
-mostlyclean-depend distclean-depend clean-depend \
-maintainer-clean-depend info-am info dvi-am dvi check check-am \
-installcheck-am installcheck install-exec-am install-exec \
-install-data-am install-data install-am install uninstall-am uninstall \
-all-local all-redirect all-am all installdirs mostlyclean-generic \
-distclean-generic clean-generic maintainer-clean-generic clean \
-mostlyclean distclean maintainer-clean
-
-
-
-
-all-local: $(ALL_LOCAL_DEPS)
-
-$(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
- echo '#define VERSION "4.2.7"' > $(srcdir)/$@
- echo '#define RELEASE_DATE "15 Jul 2004"' >> $(srcdir)/$@
- 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)
-
-$(LIBGIMPPRINT_LIBS):
- cd ../main ; \
- $(MAKE)
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/src/ghost/Makefile.am b/src/ghost/Makefile.am
index a2e3e7c..2425fb5 100644
--- a/src/ghost/Makefile.am
+++ b/src/ghost/Makefile.am
@@ -1,4 +1,4 @@
-## $Id: Makefile.am,v 1.17.2.6 2002/06/05 23:52:05 rlk Exp $
+## $Id: Makefile.am,v 1.37 2005/04/18 11:20:01 rlk Exp $
## Copyright (C) 2000 Roger Leigh
##
## This program is free software; you can redistribute it and/or modify
@@ -23,138 +23,23 @@ AUTOMAKE_OPTIONS = 1.4 gnu
MAINT_CHARSET = latin1
-## Use old compatability method for now...
-
-## Variables
-
-MAINCODE = canon.c \
- color.c \
- dither.c \
- escp2.c \
- escp2-data.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 \
- print-dither.h \
- print-escp2.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 <gimp-print\/gimp-print\(.*\)\.h>$$/\\\#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
- echo '#define VERSION "@VERSION@"' > $(srcdir)/$@
- echo '#define RELEASE_DATE "@RELEASE_DATE@"' >> $(srcdir)/$@
- 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)
+include $(top_srcdir)/scripts/global.mk
## 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-print-dither.h \
- $(srcdir)/gdevstp-dither-matrices.c \
- $(srcdir)/gdevstp-escp2.c \
- $(srcdir)/gdevstp-print-escp2.h \
- $(srcdir)/gdevstp-escp2-data.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
-
## Variables
-AM_CFLAGS = $(GNUCFLAGS)
-INCLUDES = @IJS_CFLAGS@ @INCLUDES@ $(LIBGIMPPRINT_CFLAGS)
-LIBPRINTUT = $(top_builddir)/lib/libprintut.la
-LIBS = @IJS_LIBS@ @LIBS@ $(INTLLIBS)
-
-## Programs
-
-IJS_BIN = ijsgimpprint
+LOCAL_CPPFLAGS = $(GUTENPRINT_CFLAGS) @IJS_CFLAGS@
-bin_PROGRAMS = @IJS_BIN@
-EXTRA_PROGRAMS = ijsgimpprint
-
-ijsgimpprint_LDADD = $(LIBPRINTUT) $(LIBGIMPPRINT_LIBS)
-ijsgimpprint_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
+## Programs
-$(LIBGIMPPRINT_LIBS):
- cd ../main ; \
- $(MAKE)
+if BUILD_GHOSTSCRIPT
+bin_PROGRAMS = ijsgutenprint.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@
+ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_SOURCES = ijsgutenprint.c
+ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_LDADD = $(GUTENPRINT_LIBS) $(IJS_LIBS)
+ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_LDFLAGS = $(STATIC_LDOPTS)
+endif
diff --git a/src/ghost/Makefile.in b/src/ghost/Makefile.in
index 18819dd..566a4f6 100644
--- a/src/ghost/Makefile.in
+++ b/src/ghost/Makefile.in
@@ -1,6 +1,8 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
-# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -10,322 +12,430 @@
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
+@SET_MAKE@
-SHELL = @SHELL@
+# Variables
+
+SOURCES = $(ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_SOURCES)
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-
-DESTDIR =
-
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
-
top_builddir = ../..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-transform = @program_transform_name@
-
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
-host_alias = @host_alias@
+build_triplet = @build@
host_triplet = @host@
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(top_srcdir)/scripts/global.mk
+@BUILD_GHOSTSCRIPT_TRUE@bin_PROGRAMS = ijsgutenprint.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@$(EXEEXT)
+subdir = src/ghost
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gimp.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/stp.m4 $(top_srcdir)/m4/stp_cups.m4 \
+ $(top_srcdir)/m4/stp_gimp.m4 $(top_srcdir)/m4/stp_option.m4 \
+ $(top_srcdir)/m4/stp_release.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am__ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_SOURCES_DIST = \
+ ijsgutenprint.c
+@BUILD_GHOSTSCRIPT_TRUE@am_ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_OBJECTS = \
+@BUILD_GHOSTSCRIPT_TRUE@ ijsgutenprint.$(OBJEXT)
+ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_OBJECTS = $(am_ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_OBJECTS)
+am__DEPENDENCIES_1 = $(top_builddir)/src/main/libgutenprint.la
+am__DEPENDENCIES_2 =
+@BUILD_GHOSTSCRIPT_TRUE@ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_DEPENDENCIES = \
+@BUILD_GHOSTSCRIPT_TRUE@ $(am__DEPENDENCIES_1) \
+@BUILD_GHOSTSCRIPT_TRUE@ $(am__DEPENDENCIES_2)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_SOURCES)
+DIST_SOURCES = $(am__ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_SOURCES_DIST)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
-AS = @AS@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
-BISON_PROG = @BISON_PROG@
-BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
-CATALOGS = @CATALOGS@
-CATOBJEXT = @CATOBJEXT@
+BUILD_CUPS_FALSE = @BUILD_CUPS_FALSE@
+BUILD_CUPS_PPDS_FALSE = @BUILD_CUPS_PPDS_FALSE@
+BUILD_CUPS_PPDS_TRUE = @BUILD_CUPS_PPDS_TRUE@
+BUILD_CUPS_TRUE = @BUILD_CUPS_TRUE@
+BUILD_ESCPUTIL_FALSE = @BUILD_ESCPUTIL_FALSE@
+BUILD_ESCPUTIL_TRUE = @BUILD_ESCPUTIL_TRUE@
+BUILD_FOOMATIC_3_FALSE = @BUILD_FOOMATIC_3_FALSE@
+BUILD_FOOMATIC_3_TRUE = @BUILD_FOOMATIC_3_TRUE@
+BUILD_FOOMATIC_FALSE = @BUILD_FOOMATIC_FALSE@
+BUILD_FOOMATIC_TRUE = @BUILD_FOOMATIC_TRUE@
+BUILD_GENPPD_STATIC_FALSE = @BUILD_GENPPD_STATIC_FALSE@
+BUILD_GENPPD_STATIC_TRUE = @BUILD_GENPPD_STATIC_TRUE@
+BUILD_GHOSTSCRIPT_FALSE = @BUILD_GHOSTSCRIPT_FALSE@
+BUILD_GHOSTSCRIPT_TRUE = @BUILD_GHOSTSCRIPT_TRUE@
+BUILD_GIMP2_FALSE = @BUILD_GIMP2_FALSE@
+BUILD_GIMP2_TRUE = @BUILD_GIMP2_TRUE@
+BUILD_GIMP_FALSE = @BUILD_GIMP_FALSE@
+BUILD_GIMP_TRUE = @BUILD_GIMP_TRUE@
+BUILD_LIBGUTENPRINTUI2_FALSE = @BUILD_LIBGUTENPRINTUI2_FALSE@
+BUILD_LIBGUTENPRINTUI2_TRUE = @BUILD_LIBGUTENPRINTUI2_TRUE@
+BUILD_LIBGUTENPRINTUI_FALSE = @BUILD_LIBGUTENPRINTUI_FALSE@
+BUILD_LIBGUTENPRINTUI_TRUE = @BUILD_LIBGUTENPRINTUI_TRUE@
+BUILD_MODULES_FALSE = @BUILD_MODULES_FALSE@
+BUILD_MODULES_TRUE = @BUILD_MODULES_TRUE@
+BUILD_TESTPATTERN_FALSE = @BUILD_TESTPATTERN_FALSE@
+BUILD_TESTPATTERN_TRUE = @BUILD_TESTPATTERN_TRUE@
+BUILD_TEST_FALSE = @BUILD_TEST_FALSE@
+BUILD_TEST_TRUE = @BUILD_TEST_TRUE@
+BUILD_TRANSLATED_CUPS_PPDS_FALSE = @BUILD_TRANSLATED_CUPS_PPDS_FALSE@
+BUILD_TRANSLATED_CUPS_PPDS_TRUE = @BUILD_TRANSLATED_CUPS_PPDS_TRUE@
CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
CONVERT = @CONVERT@
-CUPS_BACKEND_BIN = @CUPS_BACKEND_BIN@
-CUPS_BIN = @CUPS_BIN@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
CUPS_CFLAGS = @CUPS_CFLAGS@
-CUPS_CONF = @CUPS_CONF@
CUPS_CONFIG = @CUPS_CONFIG@
-CUPS_FILTER_BIN = @CUPS_FILTER_BIN@
-CUPS_INSTALL = @CUPS_INSTALL@
CUPS_LIBS = @CUPS_LIBS@
-CUPS_MAN = @CUPS_MAN@
-CUPS_NOINST_BIN = @CUPS_NOINST_BIN@
-CUPS_PKG = @CUPS_PKG@
+CUPS_PPDS_AT_TOP_LEVEL_FALSE = @CUPS_PPDS_AT_TOP_LEVEL_FALSE@
+CUPS_PPDS_AT_TOP_LEVEL_TRUE = @CUPS_PPDS_AT_TOP_LEVEL_TRUE@
CUPS_PPD_PS_LEVEL = @CUPS_PPD_PS_LEVEL@
-DATADIRNAME = @DATADIRNAME@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
DB2HTML = @DB2HTML@
DB2PDF = @DB2PDF@
DB2PS = @DB2PS@
-DLLTOOL = @DLLTOOL@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIALOG = @DIALOG@
+DOXYGEN = @DOXYGEN@
DVIPDF = @DVIPDF@
DVIPS = @DVIPS@
ECHO = @ECHO@
-ESCPUTIL_BIN = @ESCPUTIL_BIN@
-ESCPUTIL_MAN = @ESCPUTIL_MAN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
EXEEXT = @EXEEXT@
-FOOMATIC_3_NOINST_BIN = @FOOMATIC_3_NOINST_BIN@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+FIND = @FIND@
FOOMATIC_CONFIGURE = @FOOMATIC_CONFIGURE@
-FOOMATIC_INSTALL = @FOOMATIC_INSTALL@
FOOMATIC_KITLOAD = @FOOMATIC_KITLOAD@
-FOOMATIC_NOINST_BIN = @FOOMATIC_NOINST_BIN@
-FOOMATIC_OLDIDS_NOINST_BIN = @FOOMATIC_OLDIDS_NOINST_BIN@
FOOMATIC_PPDFILE = @FOOMATIC_PPDFILE@
-GENCAT = @GENCAT@
-GIMPPRINT_BINARY_AGE = @GIMPPRINT_BINARY_AGE@
-GIMPPRINT_CFLAGS = @GIMPPRINT_CFLAGS@
-GIMPPRINT_CURRENT_INTERFACE = @GIMPPRINT_CURRENT_INTERFACE@
-GIMPPRINT_DEPLIBS = @GIMPPRINT_DEPLIBS@
-GIMPPRINT_INTERFACE_AGE = @GIMPPRINT_INTERFACE_AGE@
-GIMPPRINT_LIBS = @GIMPPRINT_LIBS@
-GIMPPRINT_MAJOR_VERSION = @GIMPPRINT_MAJOR_VERSION@
-GIMPPRINT_MICRO_VERSION = @GIMPPRINT_MICRO_VERSION@
-GIMPPRINT_MINOR_VERSION = @GIMPPRINT_MINOR_VERSION@
-GIMPPRINT_VERSION = @GIMPPRINT_VERSION@
+GENPPD_LIBS = @GENPPD_LIBS@
+GIMP2_CFLAGS = @GIMP2_CFLAGS@
+GIMP2_LIBS = @GIMP2_LIBS@
GIMPTOOL = @GIMPTOOL@
+GIMPTOOL2_CHECK = @GIMPTOOL2_CHECK@
GIMPTOOL_CHECK = @GIMPTOOL_CHECK@
-GIMP_BIN = @GIMP_BIN@
GIMP_CFLAGS = @GIMP_CFLAGS@
GIMP_CFLAGS_NOUI = @GIMP_CFLAGS_NOUI@
GIMP_DATA_DIR = @GIMP_DATA_DIR@
GIMP_LIBS = @GIMP_LIBS@
GIMP_LIBS_NOUI = @GIMP_LIBS_NOUI@
GIMP_PLUGIN_DIR = @GIMP_PLUGIN_DIR@
-GLIBC21 = @GLIBC21@
-GMOFILES = @GMOFILES@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_CONFIG = @GLIB_CONFIG@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
GMSGFMT = @GMSGFMT@
GNUCFLAGS = @GNUCFLAGS@
+GTK2_CFLAGS = @GTK2_CFLAGS@
+GTK2_LIBS = @GTK2_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+GUTENPRINTUI2_BINARY_AGE = @GUTENPRINTUI2_BINARY_AGE@
+GUTENPRINTUI2_CFLAGS = @GUTENPRINTUI2_CFLAGS@
+GUTENPRINTUI2_CURRENT_INTERFACE = @GUTENPRINTUI2_CURRENT_INTERFACE@
+GUTENPRINTUI2_INTERFACE_AGE = @GUTENPRINTUI2_INTERFACE_AGE@
+GUTENPRINTUI2_LIBDEPS = @GUTENPRINTUI2_LIBDEPS@
+GUTENPRINTUI2_LIBS = $(top_builddir)/src/gutenprintui2/libgutenprintui2.la
+GUTENPRINTUI2_VERSION = @GUTENPRINTUI2_VERSION@
+GUTENPRINTUI_BINARY_AGE = @GUTENPRINTUI_BINARY_AGE@
+GUTENPRINTUI_CFLAGS = @GUTENPRINTUI_CFLAGS@
+GUTENPRINTUI_CURRENT_INTERFACE = @GUTENPRINTUI_CURRENT_INTERFACE@
+GUTENPRINTUI_INTERFACE_AGE = @GUTENPRINTUI_INTERFACE_AGE@
+GUTENPRINTUI_LIBDEPS = @GUTENPRINTUI_LIBDEPS@
+GUTENPRINTUI_LIBS = $(top_builddir)/src/gutenprintui/libgutenprintui.la
+GUTENPRINTUI_VERSION = @GUTENPRINTUI_VERSION@
+GUTENPRINT_BINARY_AGE = @GUTENPRINT_BINARY_AGE@
+GUTENPRINT_CFLAGS = @GUTENPRINT_CFLAGS@
+GUTENPRINT_CURRENT_INTERFACE = @GUTENPRINT_CURRENT_INTERFACE@
+GUTENPRINT_INTERFACE_AGE = @GUTENPRINT_INTERFACE_AGE@
+GUTENPRINT_LIBDEPS = @GUTENPRINT_LIBDEPS@
+
+# Libraries
+GUTENPRINT_LIBS = $(top_builddir)/src/main/libgutenprint.la
+GUTENPRINT_MAJOR_VERSION = @GUTENPRINT_MAJOR_VERSION@
+GUTENPRINT_MICRO_VERSION = @GUTENPRINT_MICRO_VERSION@
+GUTENPRINT_MINOR_VERSION = @GUTENPRINT_MINOR_VERSION@
+GUTENPRINT_VERSION = @GUTENPRINT_VERSION@
IJS_CFLAGS = @IJS_CFLAGS@
IJS_CONFIG = @IJS_CONFIG@
-IJS_INSTALL = @IJS_INSTALL@
IJS_LIBS = @IJS_LIBS@
-INSTOBJEXT = @INSTOBJEXT@
-INTLBISON = @INTLBISON@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SAMPLES_FALSE = @INSTALL_SAMPLES_FALSE@
+INSTALL_SAMPLES_TRUE = @INSTALL_SAMPLES_TRUE@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_USER_GUIDE_FALSE = @INSTALL_USER_GUIDE_FALSE@
+INSTALL_USER_GUIDE_TRUE = @INSTALL_USER_GUIDE_TRUE@
INTLLIBS = @INTLLIBS@
-INTLOBJS = @INTLOBJS@
-INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDFLAGS = @LDFLAGS@
LEX = @LEX@
-LIBGIMPPRINT_LIBS = @LIBGIMPPRINT_LIBS@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
LIBICONV = @LIBICONV@
-LIBM = @LIBM@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
LIBREADLINE_DEPS = @LIBREADLINE_DEPS@
+LIBS = $(INTLLIBS) @LIBS@
LIBTOOL = @LIBTOOL@
LIBTOOL_DEPS = @LIBTOOL_DEPS@
LN_S = @LN_S@
LTALLOCA = @LTALLOCA@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
-LT_AGE = @LT_AGE@
-LT_CURRENT = @LT_CURRENT@
-LT_RELEASE = @LT_RELEASE@
-LT_REVISION = @LT_REVISION@
MAINT = @MAINT@
MAINTAINER_CFLAGS = @MAINTAINER_CFLAGS@
-MAIN_BIN = @MAIN_BIN@
-MAIN_DAT = @MAIN_DAT@
-MAIN_MAN = @MAIN_MAN@
-MAIN_SCR = @MAIN_SCR@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
MKINSTALLDIRS = @MKINSTALLDIRS@
MSGFMT = @MSGFMT@
-OBJDUMP = @OBJDUMP@
+MSGMERGE = @MSGMERGE@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
PLUG_IN_PATH = @PLUG_IN_PATH@
-POFILES = @POFILES@
POSUB = @POSUB@
-PRINT_VASPRINTF = @PRINT_VASPRINTF@
RANLIB = @RANLIB@
RELEASE_DATE = @RELEASE_DATE@
RM = @RM@
-SAMPLE_IMAGES = @SAMPLE_IMAGES@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
STRIP = @STRIP@
-TESTPATTERN_BIN = @TESTPATTERN_BIN@
-TEST_BIN = @TEST_BIN@
TEXI2HTML = @TEXI2HTML@
-USER_GUIDE = @USER_GUIDE@
-USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_LEVEL3_PS_FALSE = @USE_LEVEL3_PS_FALSE@
+USE_LEVEL3_PS_TRUE = @USE_LEVEL3_PS_TRUE@
USE_NLS = @USE_NLS@
+USE_NLS_FALSE = @USE_NLS_FALSE@
+USE_NLS_TRUE = @USE_NLS_TRUE@
VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
YACC = @YACC@
-YACC_PROG = @YACC_PROG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
cups_bindir = @cups_bindir@
cups_conf_datadir = @cups_conf_datadir@
cups_conf_serverbin = @cups_conf_serverbin@
cups_conf_serverroot = @cups_conf_serverroot@
cups_exec_prefix = @cups_exec_prefix@
cups_prefix = @cups_prefix@
+cups_sbindir = @cups_sbindir@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+gimp2_plug_indir = @gimp2_plug_indir@
gimp_plug_indir = @gimp_plug_indir@
-gimpprint_cflags = @gimpprint_cflags@
-gimpprint_libs = @gimpprint_libs@
-
+gutenprint_cflags = @gutenprint_cflags@
+gutenprint_libs = @gutenprint_libs@
+gutenprintui2_cflags = @gutenprintui2_cflags@
+gutenprintui2_libs = @gutenprintui2_libs@
+gutenprintui_cflags = @gutenprintui_cflags@
+gutenprintui_libs = @gutenprintui_libs@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
AUTOMAKE_OPTIONS = 1.4 gnu
-
MAINT_CHARSET = latin1
-
-MAINCODE = canon.c color.c dither.c escp2.c escp2-data.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 print-dither.h print-escp2.h
-
-
-MAINFILES = $(MAINCODE) $(MAINHEADERS)
-@BUILD_GHOST_TRUE@ALL_LOCAL_DEPS = $(srcdir)/$(addprefix gdevstp-,$(MAINCODE)) $(srcdir)/$(addprefix gdevstp-,$(MAINHEADERS))
-@BUILD_GHOST_FALSE@ALL_LOCAL_DEPS =
-
-GHCODE = -e 's/print-printers.c/gdevstp-printers.c/' -e 's/^\\\#include "\(gimp\-\)*\(.*\)\.h"$$/\\\#include "gdevstp-\2.h"/' -e 's/^\\\#include <gimp-print\/gimp-print\(.*\)\.h>$$/\\\#include "gdevstp-print\1.h"/'
-
-
-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-print-dither.h $(srcdir)/gdevstp-dither-matrices.c $(srcdir)/gdevstp-escp2.c $(srcdir)/gdevstp-print-escp2.h $(srcdir)/gdevstp-escp2-data.c $(srcdir)/gdevstp-lexmark.c $(srcdir)/gdevstp-pcl.c $(srcdir)/gdevstp-ps.c
-
-
-# End of old compatability cruft
-
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(LOCAL_CPPFLAGS) $(GNUCFLAGS)
MAINTAINERCLEANFILES = Makefile.in
+LOCAL_CPPFLAGS = $(GUTENPRINT_CFLAGS) @IJS_CFLAGS@
+@BUILD_GHOSTSCRIPT_TRUE@ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_SOURCES = ijsgutenprint.c
+@BUILD_GHOSTSCRIPT_TRUE@ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_LDADD = $(GUTENPRINT_LIBS) $(IJS_LIBS)
+@BUILD_GHOSTSCRIPT_TRUE@ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_LDFLAGS = $(STATIC_LDOPTS)
+all: all-am
-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
-
-
-AM_CFLAGS = $(GNUCFLAGS)
-INCLUDES = @IJS_CFLAGS@ @INCLUDES@ $(LIBGIMPPRINT_CFLAGS)
-LIBPRINTUT = $(top_builddir)/lib/libprintut.la
-LIBS = @IJS_LIBS@ @LIBS@ $(INTLLIBS)
-
-IJS_BIN = ijsgimpprint
-
-bin_PROGRAMS = @IJS_BIN@
-
-EXTRA_PROGRAMS = ijsgimpprint
-
-ijsgimpprint_LDADD = $(LIBPRINTUT) $(LIBGIMPPRINT_LIBS)
-ijsgimpprint_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
-mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
-CONFIG_HEADER = ../../config.h
-CONFIG_CLEAN_FILES = contrib.mak.addon
-bin_PROGRAMS = @IJS_BIN@
-PROGRAMS = $(bin_PROGRAMS)
-
-
-DEFS = @DEFS@ -I. -I$(srcdir) -I../..
-CPPFLAGS = @CPPFLAGS@
-LDFLAGS = @LDFLAGS@
-ijsgimpprint_SOURCES = ijsgimpprint.c
-ijsgimpprint_OBJECTS = ijsgimpprint.$(OBJEXT)
-ijsgimpprint_LDFLAGS =
-CFLAGS = @CFLAGS@
-COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-DIST_COMMON = README COPYING Makefile.am Makefile.in \
-contrib.mak.addon.in
-
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = tar
-GZIP_ENV = --best
-SOURCES = ijsgimpprint.c
-OBJECTS = ijsgimpprint.$(OBJEXT)
-
-all: all-redirect
.SUFFIXES:
-.SUFFIXES: .S .c .lo .o .obj .s
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/ghost/Makefile
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-contrib.mak.addon: $(top_builddir)/config.status contrib.mak.addon.in
- cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-mostlyclean-binPROGRAMS:
-
-clean-binPROGRAMS:
- -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
-
-distclean-binPROGRAMS:
-
-maintainer-clean-binPROGRAMS:
-
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/scripts/global.mk $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/ghost/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/ghost/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
install-binPROGRAMS: $(bin_PROGRAMS)
@$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(bindir)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
@list='$(bin_PROGRAMS)'; for p in $$list; do \
- if test -f $$p; then \
- echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
- $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
else :; fi; \
done
uninstall-binPROGRAMS:
@$(NORMAL_UNINSTALL)
- list='$(bin_PROGRAMS)'; for p in $$list; do \
- rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
done
-.c.o:
- $(COMPILE) -c $<
-
-# FIXME: We should only use cygpath when building on Windows,
-# and only if it is available.
-.c.obj:
- $(COMPILE) -c `cygpath -w $<`
-
-.s.o:
- $(COMPILE) -c $<
-
-.S.o:
- $(COMPILE) -c $<
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+ijsgutenprint.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@$(EXEEXT): $(ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_OBJECTS) $(ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_DEPENDENCIES)
+ @rm -f ijsgutenprint.@GUTENPRINT_MAJOR_VERSION@.@GUTENPRINT_MINOR_VERSION@$(EXEEXT)
+ $(LINK) $(ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_LDFLAGS) $(ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_OBJECTS) $(ijsgutenprint_@GUTENPRINT_MAJOR_VERSION@_@GUTENPRINT_MINOR_VERSION@_LDADD) $(LIBS)
mostlyclean-compile:
- -rm -f *.o core *.core
-rm -f *.$(OBJEXT)
-clean-compile:
-
distclean-compile:
-rm -f *.tab.c
-maintainer-clean-compile:
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ijsgutenprint.Po@am__quote@
-.c.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
-.s.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
-.S.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.c.lo:
+@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
mostlyclean-libtool:
-rm -f *.lo
@@ -334,175 +444,198 @@ clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-
-maintainer-clean-libtool:
-
-ijsgimpprint$(EXEEXT): $(ijsgimpprint_OBJECTS) $(ijsgimpprint_DEPENDENCIES)
- @rm -f ijsgimpprint$(EXEEXT)
- $(LINK) $(ijsgimpprint_LDFLAGS) $(ijsgimpprint_OBJECTS) $(ijsgimpprint_LDADD) $(LIBS)
-
+ -rm -f libtool
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
tags: TAGS
-ID: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
- here=`pwd` && cd $(srcdir) \
- && mkid -f$$here/ID $$unique $(LISP)
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
- || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
-
-mostlyclean-tags:
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
-clean-tags:
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
- -rm -f TAGS ID
-
-maintainer-clean-tags:
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-
-subdir = src/ghost
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
- @for file in $(DISTFILES); do \
- d=$(srcdir); \
+ $(mkdir_p) $(distdir)/../../scripts
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
- || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $$d/$$file $(distdir)/$$file || :; \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
fi; \
done
-ijsgimpprint.o: ijsgimpprint.c ../../config.h \
- ../../include/gimp-print/gimp-print.h \
- ../../include/gimp-print/gimp-print-intl-internal.h
-
-info-am:
-info: info-am
-dvi-am:
-dvi: dvi-am
check-am: all-am
check: check-am
-installcheck-am:
-installcheck: installcheck-am
-install-exec-am: install-binPROGRAMS
+all-am: Makefile $(PROGRAMS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
install-exec: install-exec-am
-
-install-data-am:
install-data: install-data-am
+uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-am
-uninstall-am: uninstall-binPROGRAMS
-uninstall: uninstall-am
-all-am: Makefile $(PROGRAMS) all-local
-all-redirect: all-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs:
- $(mkinstalldirs) $(DESTDIR)$(bindir)
-
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
- -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
- -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \
- mostlyclean-libtool mostlyclean-tags \
- mostlyclean-generic
+clean: clean-am
-mostlyclean: mostlyclean-am
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
-clean-am: clean-binPROGRAMS clean-compile clean-libtool clean-tags \
- clean-generic mostlyclean-am
+dvi: dvi-am
-clean: clean-am
+dvi-am:
-distclean-am: distclean-binPROGRAMS distclean-compile distclean-libtool \
- distclean-tags distclean-generic clean-am
- -rm -f libtool
+html: html-am
-distclean: distclean-am
+info: info-am
-maintainer-clean-am: maintainer-clean-binPROGRAMS \
- maintainer-clean-compile maintainer-clean-libtool \
- maintainer-clean-tags maintainer-clean-generic \
- distclean-am
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
-.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
-maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
-mostlyclean-compile distclean-compile clean-compile \
-maintainer-clean-compile mostlyclean-libtool distclean-libtool \
-clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
-distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
-dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
-install-exec install-data-am install-data install-am install \
-uninstall-am uninstall all-local all-redirect all-am all installdirs \
-mostlyclean-generic distclean-generic clean-generic \
-maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+mostlyclean: mostlyclean-am
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
-@SET_MAKE@
+pdf: pdf-am
-all-local: $(ALL_LOCAL_DEPS)
+pdf-am:
-$(srcdir)/gdevstp-print.h: $(top_srcdir)/include/gimp-print/gimp-print.h
- sed $(GHCODE) $< > $(srcdir)/$@
+ps: ps-am
-$(srcdir)/gdevstp-print-internal.h: $(top_srcdir)/src/main/gimp-print-internal.h
- echo '#define VERSION "@VERSION@"' > $(srcdir)/$@
- echo '#define RELEASE_DATE "@RELEASE_DATE@"' >> $(srcdir)/$@
- sed $(GHCODE) $< >> $(srcdir)/$@
+ps-am:
-$(srcdir)/gdevstp-print-intl-internal.h: $(top_srcdir)/include/gimp-print/gimp-print-intl-internal.h
- sed $(GHCODE) $< > $(srcdir)/$@
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am
-gdevstp-%.h: $(srcdir)/../main/%.h Makefile
- cd $(srcdir) ; sed $(GHCODE) $< > $@
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic clean-libtool ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-binPROGRAMS install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-info-am
-gdevstp-printers.c: ../main/print-printers.c
- sed $(GHCODE) $< > $@
-gdevstp-%: $(srcdir)/../main/print-% Makefile
- cd $(srcdir) ; sed $(GHCODE) $< > $@
+@SET_MAKE@
-../main/print-printers.c: ../printdef/printdef $(srcdir)/../main/printers.xml
- ../printdef/printdef < $(srcdir)/../main/printers.xml > $(top_builddir)/src/main/print-printers.c
+export STP_MODULE_PATH = $(top_builddir)/src/main/.libs:$(top_builddir)/src/main
+export STP_DATA_PATH = $(top_srcdir)/src/main
-printdefl.o: printdefy.o
+# Rules
-../printdef/printdef: $(addprefix ../printdef/, printdefl.l printdefy.y printdef.h)
- cd ../printdef ; \
+$(top_builddir)/src/main/libgutenprint.la:
+ cd $(top_builddir)/src/main; \
$(MAKE)
-$(LIBGIMPPRINT_LIBS):
- cd ../main ; \
+$(top_builddir)/src/gutenprintui/libgutenprintui.la:
+ cd $(top_builddir)/src/gutenprintui; \
$(MAKE)
+$(top_builddir)/src/gutenprintui2/libgutenprintui2.la:
+ cd $(top_builddir)/src/gutenprintui2; \
+ $(MAKE)
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
diff --git a/src/ghost/README b/src/ghost/README
deleted file mode 100644
index 22e7f82..0000000
--- a/src/ghost/README
+++ /dev/null
@@ -1,1633 +0,0 @@
-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.52. 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.
-
- GNU Ghostscript 6.53 and 7.05 and ESP Ghostscript 7.05 contain a
- version of the Gimp-Print driver based on the Gimp-Print 4.2.0
- release with a bug fix. Building Gimp-Print is much simpler with
- Ghostscript 6.53 and 7.05 for that reason.
-
- Gimp-Print includes another driver based on the new IJS protocol.
- IJS is an initiative to improve the quality and ease of use of
- printing with Ghostscript. It permits adding or upgrading drivers
- without recompiling Ghostscript. An IJS driver runs in a separate
- process that communicates with Ghostscript via an IPC channel. The
- Gimp-Print IJS driver may be used with AFPL Ghostscript, as it runs
- in a separate process.
-
- The original stp driver will not be maintained beyond Gimp-Print
- 4.2; it will be phased out and replaced by the IJS driver
- (ijsgimpprint). It currently has all of the capabilities of the stp
- driver, but it is perhaps not as mature.
-
- IJS support was incorporated into Ghostscript in GNU Ghostscript
- 6.53 and AFPL Ghostscript 7.04, as IJS 0.32.
-
- Finally, the distribution also 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".
-
-
-AUTHOR:
--------
-
- The Ghostscript stp driver was originally written by Henryk Richter
- (buggs@comlab.uni-rostock.de), and was integrated into Gimp-Print
- during the 3.1 development series. Gimp-Print itself was originally
- written by Michael Sweet <mike@easysw.com>, 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.
-
- The IJS driver was originally written by Russell Lang, and
- incorporated into Gimp-Print in early 2002. This driver corresponds
- with the IJS protocol 0.32.
-
-
-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 OF THE STP DRIVER:
------ --- ------------ -- --- --- -------
-
-For GNU Ghostscript 6.53 and 7.05, and ESP Ghostscript 7.05
-(recommended):
-
- Building Gimp-Print for GNU Ghostscript 6.53 and 7.05 and ESP
- Ghostscript 7.05 is much simpler, as the driver is already in the
- Ghostscript package. It is sufficient to build and install the
- Gimp-Print library and Ghostscript.
-
-1) First build and install the core Gimp-Print library. 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.
-
-2) In the Ghostscript source directory, run
-
- ./configure --with-gimp-print
- make
- make install
-
-For Ghostscript 5.10, 5.50, 6.51, or 6.52:
-
-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.
-
-
-BUILD AND INSTALLATION OF THE IJS GIMPPRINT DRIVER:
------ --- ------------ -- --- --- --------- -------
-
- GNU Ghostscript 6.53 and beyond, and AFPL Ghostscript 7.04 and
- beyond, are required in order to use this driver. These
- instructions correspond to GNU Ghostscript 6.53.
-
- You must first build Ghostscript itself with support for the IJS
- driver. This is done as follows, within the Ghostscript source
- directory:
-
- cd ghostscript-6.53
- ./configure --with-ijs
- make
- make install
-
- The Ghostscript installation (as of 6.53, and likely 7.04) does not
- install certain files that are required to build the IJS driver.
- This should be fixed in future Ghostscript releases. To build and
- install these files, you need to have the "aclocal", "autoconf",
- and "automake" packages installed. These are not normally
- installed by default on most Linux and UNIX systems. You may
- install them from your distribution, or download them from
- ftp.gnu.org. After these packages are installed, run:
-
- cd ghostscript-6.53/ijs
- autoconf
- ./configure
- make
- make install
-
- You will perhaps get error messages during the autoconf process.
- The important point is that the configure works correctly. This
- will install the necessary header files and libraries.
-
- After the IJS core files and Ghostscript are installed, you can
- build and install the IJS driver within the Gimp-Print package.
- This is done as follows, within the Gimp-Print source directory:
-
- ./configure --with-ijs
- make
- make install
-
- or
-
- ./configure --with-ijs --with-foomatic
- make
- make install
-
- if you also want to have the Foomatic data for the IJS driver
- (see the README file in the main directory of this package).
-
- If you do not wish to build the Gimp Print plugin, you may run
-
- ./configure --with-ijs --without-gimp
-
- ./configure --with-ijs --with-foomatic --without-gimp
-
-
-DEBIAN:
--------
-
-Debian users can try the following (contributed by Stuart Miles and
-updated by Dan Christensen <jdc@julian.uwo.ca>): 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 for the STP Driver:
--------- --- --- --- -------
-
-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 device name is "stp" (-sDEVICE=stp)
-
-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. The driver name used
-by Foomatic is "gimp-print".
-
-Overview for the IJS Driver:
--------- --- --- --- -------
-
-Most options for the ijsgimpprint driver are similar to those for the
-stp driver. The major difference is that most of the Gimp-Print
-specific options are bundled together into a single option that is
-passed in as a special "-sIjsParams" parameter, and the normal
-Ghostscript "-s" and "-d" flags, indicating whether an option is a
-string or a number, are not used in this special parameter.
-
-The device name is "ijs" (-sDEVICE=ijs). In addition, the location of
-the driver program must be specified. This will typically be
-/usr/local/bin/ijsgimpprint; the parameter in this case is
--sIjsServer=/usr/local/bin/ijsgimpprint .
-
-Also, -dIjsUseOutputFD should be specified whenever output from
-Ghostscript will go to stdout or into a pipe. It may be specified in
-all other cases, with only a slight performance degradation.
-
-The -sIjsParams parameter contains a single string containing a
-comma-separated list of sub-options:
-
--sIjsParams=Option1=Value1,Option2=Value2
-
-and so forth.
-
-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. The driver name used
-by Foomatic is "gimp-print-ijs".
-
-
-Printer Model Selection:
-------- ----- ----------
-
-STP: -sModel=name
-IJS: -sDeviceManufacturer=vendor -sDeviceModel=name
-
-This option must be supplied. There is no default. The IJS driver
-requires the vendor (it's part of the protocol), but the ijsgimpprint
-driver ignores it. It should be CANON, EPSON, LEXMARK, or
-HEWLETT-PACKARD. The value of the -sDeviceModel parameter is the same
-as the value of the -sModel parameter in the stp driver.
-
-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-6200 CANON BJC 6200
-bjc-6500 CANON BJC 6500
-bjc-7000 CANON BJC 7000
-bjc-7100 CANON BJC 7100
-bjc-8200 CANON BJC 8200
-bjc-s200 CANON S200
-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-c41sx EPSON Stylus C41SX
-escp2-c41ux EPSON Stylus C41UX
-escp2-c42sx EPSON Stylus C42SX
-escp2-c42ux EPSON Stylus C42UX
-escp2-c43sx EPSON Stylus C43SX
-escp2-c43ux EPSON Stylus C43UX
-escp2-c44sx EPSON Stylus C44SX
-escp2-c44ux EPSON Stylus C44UX
-escp2-c50 EPSON Stylus C50
-escp2-c60 EPSON Stylus C60
-escp2-c61 EPSON Stylus C61
-escp2-c62 EPSON Stylus C62
-escp2-c70 EPSON Stylus C70
-escp2-c80 EPSON Stylus C80
-escp2-c82 EPSON Stylus C82
-escp2-c83 EPSON Stylus C83
-escp2-c84 EPSON Stylus C84
-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-ex3 EPSON Stylus Photo EX3
-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-825 EPSON Stylus Photo 825
-escp2-830 EPSON Stylus Photo 830
-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-ph900 EPSON Stylus Photo 900
-escp2-915 EPSON Stylus Photo 915
-escp2-925 EPSON Stylus Photo 925
-escp2-950 EPSON Stylus Photo 950
-escp2-960 EPSON Stylus Photo 960
-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-2100 EPSON Stylus Photo 2100
-escp2-2200 EPSON Stylus Photo 2200
-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-7600 EPSON Stylus Pro 7600
-escp2-9000 EPSON Stylus Pro 9000
-escp2-9500 EPSON Stylus Pro 9500
-escp2-9600 EPSON Stylus Pro 9600
-escp2-10000 EPSON Stylus Pro 10000
-escp2-scan2000 EPSON Stylus Scan 2000
-escp2-scan2500 EPSON Stylus Scan 2500
-escp2-cx3200 EPSON Stylus CX-3200
-escp2-cx5200 EPSON Stylus CX-5200
-escp2-cl700 EPSON CL-700
-escp2-cl750 EPSON CL-750
-escp2-em900c EPSON EM-900C
-escp2-em930c EPSON EM-930C
-escp2-mc10000 EPSON MC-10000
-escp2-mc2000 EPSON MC-2000
-escp2-mc5000 EPSON MC-5000
-escp2-mc7000 EPSON MC-7000
-escp2-mc9000 EPSON MC-9000
-escp2-mj930c EPSON MJ-930C
-escp2-mj5100c EPSON MJ-5100C
-escp2-mj6000c EPSON MJ-6000C
-escp2-mj8000c EPSON MJ-8000C
-escp2-pm10000 EPSON PM-10000
-escp2-pm2000c EPSON PM-2000C
-escp2-pm2200c EPSON PM-2200C
-escp2-pm3000c EPSON PM-3000C
-escp2-pm3300c EPSON PM-3300C
-escp2-pm3500c EPSON PM-3500C
-escp2-pm4000px EPSON PM-4000PX
-escp2-pm5000c EPSON PM-5000C
-escp2-pm7000c EPSON PM-7000C
-escp2-pm700c EPSON PM-700C
-escp2-pm730c EPSON PM-730C
-escp2-pm750c EPSON PM-750C
-escp2-pm760c EPSON PM-760C
-escp2-pm770c EPSON PM-770C
-escp2-pm780c EPSON PM-780C
-escp2-pm790pt EPSON PM-790PT
-escp2-pm800c EPSON PM-800C
-escp2-pm850pt EPSON PM-850PT
-escp2-pm880c EPSON PM-880C
-escp2-pm9000c EPSON PM-9000C
-escp2-pm950c EPSON PM-950C
-escp2-pm970c EPSON PM-970C
-escp2-px7000 EPSON PX-7000
-escp2-px9000 EPSON PX-9000
-pcl-desnj-230 HP DesignJet 230
-pcl-desnj-250 HP DesignJet 250
-pcl-desnj-430 HP DesignJet 430
-pcl-desnj-450 HP DesignJet 450
-pcl-desnj-455 HP DesignJet 455
-pcl-desnj-488 HP DesignJet 488
-pcl-desnj-700 HP DesignJet 700
-pcl-750 HP DesignJet 750C
-pcl-desnj-2500 HP DesignJet 2500
-pcl-desnj-3500 HP DesignJet 3500
-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-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-4l HP LaserJet 4L
-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
-lexmark-z53 Lexmark Z53
-
-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:
------ ---------- ----------
-
-STP: -sQuality=quality
-IJS: -sIjsParams=Quality=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.
-
-"Interleave" 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 Interleave (6, *)
-360mwuni 360 DPI Interleave Unidirectional (6)
-360sw 360 DPI (7, 17, *)
-360swuni 360 DPI Unidirectional (7, 17)
-360hq 360 DPI High Quality (7, 8, 17)
-360hquni 360 DPI High Quality Unidirectional (7, 8, 17)
-
-720x360sw 720 x 360 DPI (9, 10)
-720x360swuni 720 x 360 DPI Unidirectional (9, 10)
-
-720mw 720 DPI Interleave (11)
-720mwuni 720 DPI Interleave 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 Interleave (12)
-1440x720mwuni 1440 x 720 DPI Interleave 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 most printers 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, C80, and C82; and Stylus Photo 950, 960,
- 2100, and 2200.
-
-(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, C41, C42, C60, C61, and C62; the
- Stylus Color 480, 580, 680, 740, 760, 777, 860, 880, 83, and 1160,
- and the Stylus Photo 750, 780, 785, 790, 810, 820, 830, 870, 875,
- 890, 895, 915, 925, 1270, 1280, 1290, and 2000P, and the Stylus
- Scan 2000 and 2500.
-
-(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, Stylus Color Pro,
- Stylus Color Pro XL, 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, C61, C62, C70, C80, and C82, the Stylus Color 680,
- 777, 880, 83, and 980, and Stylus Photo 780, 790, 810, 820, 830,
- 890, 915, 925, 950, 960, 1280, and 1290. This resolution is
- offered on the Stylus Photo 2100 and 2200, but may not work
- correctly.
-
-(16) Works on Epson Stylus Photo 830, 925, 950, 960, 2100, 2200;
- Stylus C61, C62, C70, C80, C82 ; Stylus Pro 7600 and 9600. This
- resolution is not supported by Epson on the C70 and C80, but it
- works correctly on at least some such printers.
-
-(17) These resolutions print at particularly high speed on the Epson
- Stylus Photo 950, 960, 2100, and 2200 when printing in Four Color
- Standard or Three Color Composite modes, or when printing in
- monochrome or grayscale with any ink type other than Two Level
- Grayscale, Seven Color Photo, or Quadtone.
-
-
-The Stylus Pro printers (Stylus Pro 5000, 5500, 7000, 7500, 7600,
-9000, 9500, 9600, and 10000) support additional interleave modes known
-as Full Overlap (FOL), Four Pass, and FOL2. The Stylus Pro 5500,
-7500, 7600, 9500, 9600, 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 Interleave
-360mwuni 360 DPI Interleave 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 Interleave
-720mwuni 720 DPI Interleave 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 Interleave
-1440x720mwuni 1440 x 720 DPI Interleave 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
-
-In addition, the Stylus Pro 7600 and 9600 printers support the
-following resolutions:
-
-2880x720dpi 2880 x 720 DPI
-2880x720uni 2880 x 720 DPI Unidirectional
-2880x720mw 2880 x 720 DPI Interleave
-2880x720mwuni 2880 x 720 DPI Interleave Unidirectional
-2880x720fol 2880 x 720 DPI FOL
-2880x720foluni 2880 x 720 DPI FOL Unidirectional
-2880x720fourp 2880 x 720 DPI Four Pass
-2880x720fourpuni 2880 x 720 DPI Four Pass Unidirectional
-
-1440x1440dpi 1440 x 1440 DPI
-1440x1440uni 1440 x 1440 DPI Unidirectional
-1440x1440mw 1440 x 1440 DPI Interleave
-1440x1440mwuni 1440 x 1440 DPI Interleave Unidirectional
-1440x1440fol 1440 x 1440 DPI FOL
-1440x1440foluni 1440 x 1440 DPI FOL Unidirectional
-1440x1440fourp 1440 x 1440 DPI Four Pass
-1440x1440fourpuni 1440 x 1440 DPI Four Pass Unidirectional
-
-2880x1440dpi 2880 x 1440 DPI
-2880x1440uni 2880 x 1440 DPI Unidirectional
-2880x1440mw 2880 x 1440 DPI Interleave
-2880x1440mwuni 2880 x 1440 DPI Interleave Unidirectional
-2880x1440fol 2880 x 1440 DPI FOL
-2880x1440foluni 2880 x 1440 DPI FOL Unidirectional
-2880x1440fourp 2880 x 1440 DPI Four Pass
-2880x1440fourpuni 2880 x 1440 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 8500):
-
-300x300dpi 300x300 DPI
-300x300dmt 300x300 DPI DMT
-600x600dpi 600x600 DPI
-600x600dmt 600x600 DPI DMT
-1200x600dpi 1200x600 DPI
-1200x1200dpi 1200x1200 DPI
-
-1440 DPI printers (BJC 30, BJC 50, BJC 55, BJC 80, BJC 85, BJC 210,
- BJC 240, BJC 250, BJC 1000, BJC 2000, BJC 3000, BJC 4300, BJC
- 4400, BJC 6000, BJC 6100, BJC 6200, BJC 6500, BJC 8200, S400,
- S450, S800, S4500):
-
-360x360dpi 360x360 DPI
-360x360dmt 360x360 DPI DMT
-720x360dpi 720x360 DPI
-720x720dpi 720x720 DPI
-1440x720dpi 1440x720 DPI
-1440x1440dpi 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.
-
-STP: -sInkType=inktype
-IJS: -sIjsParams=InkType=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.
-
-Photo7 Seven Color Photo (CcMmYKk, for the Epson Stylus
- Photo 2100 and 2200, and Stylus Pro 7600 and 9600)
-PhotoCMYK Six Color Photo
-PhotoCMY Five Color Photo Composite
-CMYK Four Color Standard
-RGB Three Color Composite
-Quadtone Quadtone grayscale inks (special third party inksets
- designed to produce superior results for grayscale
- images)
-Gray2 Two Level Grayscale (Kk, for the Epson stylus Photo
- 2100 and 2200, and Stylus Pro 7600 and 9600)
-
-
-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.
-
-STP: -sMediaType=mediatype
-IJS: -sIjsParams=MediaType=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.
-
-STP: -sInputSlot=mediasource
-IJS: -sIjsParams=MediaSource=mediasource
-
-Epson printers without a roll feed mechanism should not have this
-option set.
-
-For Epson printers with a roll feed mechanism without a paper cutter
-(Stylus Photo 785, 825, 870, 875, 890, 895, 915, 1200, 1270, 1280,
-1290):
-
-Standard Standard
-Roll Roll Feed
-
-For Epson printers with a roll feed mechanism with a paper cutter
-(Stylus Photo 925, 950, 960, 2100, 2200):
-
-Standard Standard
-RollCutPage Roll feed, cut each page
-RollCutNone Roll feed, do not cut
-
-NOTE: The -sInputSlot=RollCutPage does not work with the STP driver,
-only with the IJS driver.
-
-For Epson Stylus Pro printers without a roll feed mechanism (Stylus
-Pro 5000, 5500):
-
-CutSheet1 Cut sheet bin 1
-CutSheet2 Cut sheet bin 2
-CutSheetAuto Cut sheet autoselect
-ManualSelect Manual selection
-
-For Epson Stylus Pro printers with a roll feed mechanism (Stylus Pro
-7000, 7500, 7600, 9000, 9500, 9600, 10000, 10600):
-
-Standard Standard
-Roll Roll Feed
-
-
-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'.
-
-STP: -sPAPERSIZE=papersize
-IJS: -sPAPERSIZE=papersize (for known Ghostscript paper sizes)
- or
- -dDEVICEWIDTHPOINTS=x -dDEVICEHEIGHTPOINTS=y
- where x and y are the width and height of the paper
- respectively, in points (1/72")
-
-
-
- * Common English paper sizes
-
-Letter Letter 8.5in x 11in x=612, y=792
-Legal Legal 8.5in x 14in x=612, y=1008
-Tabloid Tabloid 11in x 17in x=792, y=1224
-Executive Executive 7.25in x 10.5in x=522, y=756
-Postcard Postcard 100mm x 147mm x=283, y=416
-w216h360 3x5 x=216, y=360
-w288h432 4x6 x=288, y=432
-w324h495 Epson 4x6 Photo Paper x=324, y=495
-w360h504 5x7 x=360, y=504
-w360h576 5x8 x=360, y=576
-8x10 8x10 x=576, y=720
-Statement Manual 5.5in x 8.5in x=396, y=612
-TabloidExtra 12x18 x=864, y=1296
-SuperB 13x19 x=936, y=1368
-
- * Common photographic paper sizes
-
-w576h864 8x12 Sometimes used for 35 mm x=576, y=864
-w792h1008 11x14 x=792, y=1008
-w1152h1440 16x20 x=1152, y=1440
-w1152h1728 16x24 20x24 for 35 mm x=1152, y=1728
-w1440h1728 20x24 x=1440, y=1728
-w1440h2160 20x30 24x30 for 35 mm x=1440, y=2160
-w1584h2160 22x30 Common watercolor size x=1440, y=2160
-w1728h2160 24x30 x=1728, y=2160
-w1728h2592 24x36 Sometimes used for 35 mm x=1728, y=2592
-w2160h2880 30x40 x=2160, y=2880
-
- 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 x=4768, y=6749
-w3370h4768 2A 1189mm x 1682mm x=3370, y=4768
-A0 A0 841mm x 1189mm x=2384, y=3370
-A1 A1 594mm x 841mm x=1684, y=2384
-A2 A2 420mm x 594mm x=1191, y=1684
-A3 A3 297mm x 420mm x=842, y=1191
-A4 A4 210mm x 297mm x=595, y=842
-A5 A5 148mm x 210mm x=420, y=595
-A6 A6 105mm x 148mm x=297, y=420
-A7 A7 74mm x 105mm x=210, y=297
-A8 A8 52mm x 74mm x=148, y=210
-A9 A9 37mm x 52mm x=105, y=148
-A10 A10 26mm x 37mm x=73, y=105
-
- * Stock sizes for normal trims.
- * Allowance for trim is 3 millimetres.
-
-w2437h3458 RA0 860mm x 1220mm x=2437, y=3458
-w1729h2437 RA1 610mm x 860mm x=1729, y=2437
-w1218h1729 RA2 430mm x 610mm x=1218, y=1729
-w864h1218 RA3 305mm x 430mm x=864, y=1218
-w609h864 RA4 215mm x 305mm x=609, y=864
-
- * Stock sizes for bled work or extra trims.
-
-w2551h3628 SRA0 900mm x 1280mm x=2551, y=3628
-w1814h2551 SRA1 640mm x 900mm x=1814, y=2551
-w1275h1814 SRA2 450mm x 640mm x=1275, y=1814
-w907h1275 SRA3 320mm x 450mm x=907, y=1275
-w637h907 SRA4 225mm x 320mm x=637, y=907
-
- * "B" series: Posters, wall charts and similar items.
-
-w5669h8016 4B ISO 2000mm x 2828mm x=5669, y=8016
-w4008h5669 2B ISO 1414mm x 2000mm x=4008, y=5669
-ISOB0 B0 ISO 1000mm x 1414mm x=2834, y=4008
-ISOB1 B1 ISO 707mm x 1000mm x=2004, y=2834
-ISOB2 B2 ISO 500mm x 707mm x=1417, y=2004
-ISOB3 B3 ISO 353mm x 500mm x=1000, y=1417
-ISOB4 B4 ISO 250mm x 353mm x=708, y=1000
-ISOB5 B5 ISO 176mm x 250mm x=498, y=708
-ISOB6 B6 ISO 125mm x 176mm x=354, y=498
-ISOB7 B7 ISO 88mm x 125mm x=249, y=354
-ISOB8 B8 ISO 62mm x 88mm x=175, y=249
-ISOB9 B9 ISO 44mm x 62mm x=124, y=175
-ISOB10 B10 ISO 31mm x 44mm x=87, y=124
-
-B0 B0 JIS x=2919, y=4127
-B1 B1 JIS x=2063, y=2919
-B2 B2 JIS x=1459, y=2063
-B3 B3 JIS x=1029, y=1459
-B4 B4 JIS x=727, y=1029
-B5 B5 JIS x=518, y=727
-B6 B6 JIS x=362, y=518
-B7 B7 JIS x=257, y=362
-B8 B8 JIS x=180, y=257
-B9 B9 JIS x=127, y=180
-B10 B10 JIS x=90, y=127
-
- * "C" series: Envelopes or folders suitable for A size stationery.
-
-C0 C0 917mm x 1297mm x=2599, y=3676
-C1 C1 648mm x 917mm x=1836, y=2599
-C2 C2 458mm x 648mm x=1298, y=1836
-C3 C3 324mm x 458mm x=918, y=1298
-C4 C4 229mm x 324mm x=649, y=918
-C5 C5 162mm x 229mm x=459, y=649
-w354h918 B6-C4 125mm x 324mm x=354, y=918
-C6 C6 114mm x 162mm x=323, y=459
-DL DL 110mm x 220mm x=311, y=623
-w229h459 C7-6 81mm x 162mm x=229, y=459
-C7 C7 81mm x 114mm x=229, y=323
-C8 C8 57mm x 81mm x=161, y=229
-C9 C9 40mm x 57mm x=113, y=161
-C10 C10 28mm x 40mm x=79, y=113
-
- * US CAD standard paper sizes
-
-ARCHA ArchA 9x12in x=648, y=864
-ARCHA_trans ArchA transverse 12x9 in x=864, y=648
-ARCHB ArchB 12x18in x=864, y=1296
-ARCHB_trans ArchB transverse 18x12in x=1296, y=864
-ARCHC ArchC 18x24in x=1296, y=1728
-ARCHC_trans ArchC transverse 24x18in x=1728, y=1296
-ARCHD ArchD 24x36in x=1728, y=2592
-ARCHD_trans ArchD transverse 36x24in x=2592, y=1728
-ARCHE ArchE 36x48in x=2592, y=3456
-ARCHE_trans ArchE transverse 48x36in x=3456, y=2592
-
- * Foolscap
-
-w612h936 American foolscap x=612, y=936
-w648h936 European foolscap x=648, y=936
-
- * 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 x=535, y=697
-w569h731 Large Crown Quarto 201mm x 258mm x=569, y=731
-w620h782 Demy Quarto 219mm x 276mm x=620, y=782
-w671h884 Royal Quarto 237mm x 312mm x=671, y=884
-w348h527 Crown Octavo 123mm x 186mm x=348, y=527
-w365h561 Large Crown Octavo 129mm x 198mm x=365, y=561
-w391h612 Demy Octavo 138mm x 216mm x=391, y=612
-w442h663 Royal Octavo 156mm x 234mm x=442, y=663
-
- * Paperback sizes in common usage
-
-w314h504 Small paperback 111mm x 178mm x=314, y=504
-w314h513 Penguin small paperback 111mm x 181mm x=314, y=513
-w365h561 Penguin large paperback 129mm x 198mm x=365, y=561
-
- * Miscellaneous sizes
-
-w283h420 Hagaki Card 100 x 148 mm x=283, y=420
-w420h567 Oufuku Card 148 x 200 mm x=420, y=567
-w340h666 Long 3 Japanese long envelope #3 x=340, y=666
-w255h581 Long 4 Japanese long envelope #4 x=255, y=581
-w680h941 Kaku Japanese Kaku envelope #4 x=680, y=941
-COM10 Commercial 10 US Commercial 10 env x=297, y=684
-w315h414 A2 Invitation US A2 invitation x=315, y=414
-
-
-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.
-
-The STP parameter is specified. The IJS parameter is created by
-removing the "-d" and beginning the options list with -sIjsParams.
-Thus
-
--dCyan=xxx
-
-becomes
-
--sIjsParams=Cyan=xxx
-
--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.
-
-STP: -sDither=algorithm
-IJS: -sIjsParams=Dither=algorithm
-
-Adaptive Adaptive Hybrid
-EvenTone EvenTone screening (experimental)
-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.
-
-EvenTone dithering is a relatively new screening technology developed
-by Raph Levien. It offers superior smoothness in highlights and
-midtones, and increased accuracy in shadows, resulting in
-significantly improved results overall. The version of EvenTone
-dithering that we are using is enhanced with some additional
-improvements we have made. It currently only operates with CMYK (4,
-6, or 7 color output) with RGB input, and should be considered
-experimental. Note that it is patented (see US patent 5917614), but
-it is licensed for use with GPL software. See
-http://www.levien.com/patents.html for more information.
-
-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
------- ----
-
-STP: -dColor=x x: 0 ... 2 (1 on color printers, 0 otherwise)
-
-0 Grayscale
-1 Color (RGB)
-2 Black and white
-
-IJS:
-
-Black and white: -sProcessColorModel=DeviceGray -dBitsPerSample=1
-Grayscale: -sProcessColorModel=DeviceGray
-Color (RGB): -sProcessColorModel=DeviceRGB
-Color (CMYK): -sProcessColorModel=DeviceCMYK
-
- 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.
-
- CMYK output may be used with the IJS driver only. It is useful if
- you're printing a CMYK graphic and want explicit control over the
- inks. Generally it yields inferior quality, as Gimp-Print has good
- algorithms for converting RGB (screen) into CMYK (inks) that take
- into account paper type, ink type, and other variables. In CMYK
- mode, the brightness, contrast, and saturation controls do not
- function.
-
-
-Image type (to optimize the dither):
------ ---- --- -------- --- --------
-
-STP: -dImageType=x x: 0 ... 2 (0)
-
-IJS: -sIjsParams=ImageType=x
-
-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:
----------
-
-Note that a lot of these options are used for demonstration; generally
-adjusting the density is a bad idea!
-
-Example 1 (print charts to file, using A4 paper, color, 360 dpi):
-gs -sDEVICE=stp -sModel=escp2-ex -dDensity=1.6 -dGamma=1.5 -dSaturation=0.9 \
- -dBrightness=.4 -dImageType=1 -sPAPERSIZE=a4 \
- -sOutputFile=itsyourchoice.prn foo.ps
-
-gs -sDEVICE=ijs -sIjsServer=/usr/local/bin/ijsgimpprint \
- -sDeviceManufacturer=EPSON -sDeviceModel=escp2-ex -sPAPERSIZE=a4 \
- -sOutputFile=itsyourchoice.prn \
- -sIjsParams=Density=1.6,Gamma=1.5,Saturation=0.9,Brightness=0.4,ImageType=1 \
- 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 -sMediaType=GlossyPhoto \
- -dImageType=2 -sOutputFile=/dev/lp0 foo.ps
-
-gs -sDEVICE=ijs -sIjsServer=/usr/local/bin/ijsgimpprint \
- -sDeviceManufacturer=EPSON -sDeviceModel=escp2-870 \
- -sOutputFile=/dev/lp0 \
- -sIjsParams='Quality=1440x720hq,MediaType=GlossyPhoto,Density=0.8,ImageType=2' \
- 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
-
-gs -sDEVICE=ijs -sIjsServer=/usr/local/bin/ijsgimpprint \
- -sDeviceManufacturer=EPSON -sDeviceModel=escp2-660 -dIjsUseOutputFD \
- -sProcessColorModel=DeviceGray -dBitsPerSample=1 -sOutputFile=- \
- -sIjsParams='Quality=720sw,Density=0.8' foo.ps
diff --git a/src/ghost/README.bsd b/src/ghost/README.bsd
deleted file mode 100644
index c6729db..0000000
--- a/src/ghost/README.bsd
+++ /dev/null
@@ -1,57 +0,0 @@
-stp printing with FreeBSD
-=========================
-
-by Philipp Huber <uebs@gmx.at> (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
deleted file mode 100644
index b41d477..0000000
--- a/src/ghost/contrib.mak.addon.in
+++ /dev/null
@@ -1,17 +0,0 @@
-### --------------- 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
deleted file mode 100644
index 2c03f85..0000000
--- a/src/ghost/contrib.mak.addon.old
+++ /dev/null
@@ -1,55 +0,0 @@
-### --------------- 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-escp2-data.$(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 $(GLSRC)gdevstp-print-dither.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 $(GLSRC)gdevstp-print-dither.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 $(GLSRC)gdevstp-print-escp2.h
- $(GLCC) $(GLO_)gdevstp-escp2.$(OBJ) $(C_) -DDISABLE_NLS $(GLSRC)gdevstp-escp2.c
-
-$(GLOBJ)gdevstp-escp2-data.$(OBJ) : $(GLSRC)gdevstp-escp2-data.c $(PDEVH) $(GLSRC)gdevstp-print.h $(GLSRC)gdevstp-print-internal.h $(GLSRC)gdevstp-print-escp2.h
- $(GLCC) $(GLO_)gdevstp-escp2-data.$(OBJ) $(C_) -DDISABLE_NLS $(GLSRC)gdevstp-escp2-data.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
deleted file mode 100644
index 1f654c0..0000000
--- a/src/ghost/debian-patch
+++ /dev/null
@@ -1,40 +0,0 @@
-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 <sharkey@debian.org> 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
deleted file mode 100644
index 92d0cc3..0000000
--- a/src/ghost/debian-patch-stp
+++ /dev/null
@@ -1,34 +0,0 @@
-#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
deleted file mode 100644
index 90bf684..0000000
--- a/src/ghost/devs.mak.addon-5.10
+++ /dev/null
@@ -1,55 +0,0 @@
-### --------------- 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-escp2-data.$(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 gdevstp-print-dither.h
- $(CCC) -DDISABLE_NLS gdevstp-dither.c
-
-gdevstp-dither-matrices.$(OBJ) : gdevstp-dither-matrices.c $(PDEVH) gdevstp-print.h gdevstp-print-internal.h gdevstp-print-dither.h
- $(CCC) -DDISABLE_NLS gdevstp-dither.c
-
-gdevstp-escp2.$(OBJ) : gdevstp-escp2.c $(PDEVH) gdevstp-print.h gdevstp-print-internal.h gdevstp-print-escp2.h
- $(CCC) -DDISABLE_NLS gdevstp-escp2.c
-
-gdevstp-escp2-data.$(OBJ) : gdevstp-escp2-data.c $(PDEVH) gdevstp-print.h gdevstp-print-internal.h gdevstp-print-escp2.h
- $(CCC) -DDISABLE_NLS gdevstp-escp2-data.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
deleted file mode 100644
index 2b565f6..0000000
--- a/src/ghost/gdevstp.c
+++ /dev/null
@@ -1,737 +0,0 @@
-/*
-
- stp driver for ghostscript
-
- -gs frontend derived from gdevbmp and gdevcdj
-
-
- written in January 2000 by
- Henryk Richter <buggs@comlab.uni-rostock.de>
- 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.2.1 2002/01/24 01:29:02 rlk Exp $ */
-/* stp output driver */
-#include "gdevprn.h"
-#include "gdevpccm.h"
-#include "gsparam.h"
-#include <stdlib.h>
-
-#ifdef DISABLE_NLS
-#include "gdevstp-print.h"
-#else
-#include <gimp-print/gimp-print.h>
-#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_set_left(stp_data.v, 0);
- stp_set_orientation(stp_data.v, ORIENT_PORTRAIT);
- 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/ghost/ijsgimpprint.c b/src/ghost/ijsgimpprint.c
deleted file mode 100644
index 2ec49cf..0000000
--- a/src/ghost/ijsgimpprint.c
+++ /dev/null
@@ -1,1028 +0,0 @@
-/*
- * $Id: ijsgimpprint.c,v 1.2.2.15 2002/12/08 21:12:40 rlk Exp $
- *
- * ijs server for gimp-print.
- *
- * Copyright 2001 Robert Krawitz (rlk@alum.mit.edu)
- *
- * Originally written by Russell Lang, copyright assigned to 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.
- *
- * Revision History:
- *
- * See ChangeLog
- */
-
-/* ijs server for gimp-print */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include <gimp-print/gimp-print.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <locale.h>
-#include <ijs.h>
-#include <ijs_server.h>
-#include <errno.h>
-#include <gimp-print/gimp-print-intl-internal.h>
-
-static int stp_debug = 0;
-
-#define STP_DEBUG(x) do { if (stp_debug || getenv("STP_DEBUG")) x; } while (0)
-
-typedef struct _GimpParamList GimpParamList;
-
-struct _GimpParamList {
- GimpParamList *next;
- char *key;
- char *value;
- int value_size;
-};
-
-typedef struct _IMAGE
-{
- IjsServerCtx *ctx;
- stp_vars_t v;
- char *filename; /* OutputFile */
- int fd; /* OutputFD + 1 (so that 0 is invalid) */
- int width; /* pixels */
- int height; /* pixels */
- int bps; /* bytes per sample */
- int n_chan; /* number of channels */
- int xres; /* dpi */
- int yres;
- int output_type;
- int row; /* row number in buffer */
- int row_width; /* length of a row */
- char *row_buf; /* buffer for raster */
- double total_bytes; /* total size of raster */
- double bytes_left; /* bytes remaining to be read */
- GimpParamList *params;
-} IMAGE;
-
-static const char DeviceGray[] = "DeviceGray";
-static const char DeviceRGB[] = "DeviceRGB";
-static const char DeviceCMYK[] = "DeviceCMYK";
-
-static char *
-c_strdup(const char *s)
-{
- char *ret = malloc(strlen(s) + 1);
- strcpy(ret, s);
- return ret;
-}
-
-static int
-image_init(IMAGE *img, IjsPageHeader *ph)
-{
- img->width = ph->width;
- img->height = ph->height;
- img->bps = ph->bps;
- img->n_chan = ph->n_chan;
- img->xres = ph->xres;
- img->yres = ph->yres;
-
- img->row = -1;
- img->row_width = (ph->n_chan * ph->bps * ph->width + 7) >> 3;
- img->row_buf = (char *)malloc(img->row_width);
- STP_DEBUG(fprintf(stderr, "image_init\n"));
- STP_DEBUG(fprintf(stderr,
- "ph width %d height %d bps %d n_chan %d xres %f yres %f\n",
- ph->width, ph->height, ph->bps, ph->n_chan, ph->xres,
- ph->yres));
-
- if ((img->bps == 1) && (img->n_chan == 1) &&
- (strncmp(ph->cs, DeviceGray, strlen(DeviceGray)) == 0))
- {
- STP_DEBUG(fprintf(stderr, "output monochrome\n"));
- img->output_type = OUTPUT_MONOCHROME;
- /* 8-bit greyscale */
- }
- else if ((img->bps == 8) && (img->n_chan == 1) &&
- (strncmp(ph->cs, DeviceGray, strlen(DeviceGray)) == 0))
- {
- STP_DEBUG(fprintf(stderr, "output gray\n"));
- img->output_type = OUTPUT_GRAY;
- /* 8-bit greyscale */
- }
- else if ((img->bps == 8) && (img->n_chan == 3) &&
- (strncmp(ph->cs, DeviceRGB, strlen(DeviceRGB)) == 0))
- {
- STP_DEBUG(fprintf(stderr, "output color\n"));
- img->output_type = OUTPUT_COLOR;
- /* 24-bit colour */
- }
- else if ((img->bps == 8) && (img->n_chan == 4) &&
- (strncmp(ph->cs, DeviceCMYK, strlen(DeviceCMYK)) == 0))
- {
- STP_DEBUG(fprintf(stderr, "output CMYK\n"));
- img->output_type = OUTPUT_RAW_CMYK;
- /* 32-bit CMYK colour */
- }
- else
- {
- fprintf(stderr, _("Bad color space: bps %d channels %d space %s\n"),
- img->bps, img->n_chan, ph->cs);
- /* unsupported */
- return -1;
- }
-
- if (img->row_buf == NULL)
- {
- STP_DEBUG(fprintf(stderr, _("No row buffer\n")));
- return -1;
- }
-
- return 0;
-}
-
-static void
-image_finish(IMAGE *img)
-{
- if (img->row_buf)
- free(img->row_buf);
- img->row_buf = NULL;
-}
-
-static int
-get_float(const char *str, const char *name, float *pval,
- float min_value, float max_value)
-{
- float new_value;
- /* Force locale to "C", because decimal numbers coming from the IJS
- client are always with a decimal point, nver with a decimal comma */
- setlocale(LC_ALL, "C");
- if (sscanf(str, "%f", &new_value) == 1)
- {
- setlocale(LC_ALL, "");
- if ((new_value >= min_value) && (new_value <= max_value))
- {
- *pval = new_value;
- return 0;
- }
- else
- fprintf(stderr,
- _("Parameter %s out of range (value %f, min %f, max %f)\n"),
- name, new_value, min_value, max_value);
- }
- else
- {
- setlocale(LC_ALL, "");
- fprintf(stderr, _("Unable to parse parameter %s=%s (expect a number)\n"),
- name, str);
- }
- return -1;
-}
-
-static int
-get_int(const char *str, const char *name, int *pval,
- int min_value, int max_value)
-{
- int new_value;
- /* Force locale to "C", because decimal numbers sent to the IJS
- client must have a decimal point, nver a decimal comma */
- setlocale(LC_ALL, "C");
- if (sscanf(str, "%d", &new_value) == 1)
- {
- setlocale(LC_ALL, "");
- if ((new_value >= min_value) && (new_value <= max_value))
- {
- *pval = new_value;
- return 0;
- }
- fprintf(stderr,
- _("Parameter %s out of range (value %d, min %d, max %d)\n"),
- name, new_value, min_value, max_value);
- }
- else
- {
- setlocale(LC_ALL, "");
- fprintf(stderr, _("Unable to parse parameter %s=%s (expect a number)\n"),
- name, str);
- }
- return -1;
-}
-
-/* A C implementation of /^(\d\.+\-eE)+x(\d\.+\-eE)+$/ */
-static int
-gimp_parse_wxh (const char *val, int size,
- double *pw, double *ph)
-{
- char buf[256];
- char *tail;
- int i;
-
- for (i = 0; i < size; i++)
- if (val[i] == 'x')
- break;
-
- if (i + 1 >= size)
- return IJS_ESYNTAX;
-
- if (i >= sizeof(buf))
- return IJS_EBUF;
-
- memcpy (buf, val, i);
- buf[i] = 0;
- /* Force locale to "C", because decimal numbers coming from the IJS
- client are always with a decimal point, nver with a decimal comma */
- setlocale(LC_ALL, "C");
- *pw = strtod (buf, &tail);
- setlocale(LC_ALL, "");
- if (tail == buf)
- return IJS_ESYNTAX;
-
- if (size - i > sizeof(buf))
- return IJS_EBUF;
-
- memcpy (buf, val + i + 1, size - i - 1);
- buf[size - i - 1] = 0;
- /* Force locale to "C", because decimal numbers coming from the IJS
- client are always with a decimal point, nver with a decimal comma */
- setlocale(LC_ALL, "C");
- *ph = strtod (buf, &tail);
- setlocale(LC_ALL, "");
- if (tail == buf)
- return IJS_ESYNTAX;
-
- return 0;
-}
-
-/**
- * gimp_find_key: Search parameter list for key.
- *
- * @key: key to look up
- *
- * Return value: GimpParamList entry matching @key, or NULL.
- **/
-static GimpParamList *
-gimp_find_key (GimpParamList *pl, const char *key)
-{
- GimpParamList *curs;
-
- for (curs = pl; curs != NULL; curs = curs->next)
- {
- if (!strcmp (curs->key, key))
- return curs;
- }
- return NULL;
-}
-
-static int
-gimp_status_cb (void *status_cb_data,
- IjsServerCtx *ctx,
- IjsJobId job_id)
-{
- return 0;
-}
-
-static int
-gimp_list_cb (void *list_cb_data,
- IjsServerCtx *ctx,
- IjsJobId job_id,
- char *val_buf,
- int val_size)
-{
- const char *param_list = "OutputFile,OutputFD,DeviceManufacturer,DeviceModel,Quality,MediaName,MediaType,MediaSource,InkType,Dither,ImageType,Brightness,Gamma,Contrast,Cyan,Magenta,Yellow,Saturation,Density,PrintableArea,PrintableTopLeft,TopLeft,Dpi";
- int size = strlen (param_list);
-
- if (size > val_size)
- return IJS_EBUF;
-
- memcpy (val_buf, param_list, size);
- return size;
-}
-
-static int
-gimp_enum_cb (void *enum_cb_data,
- IjsServerCtx *ctx,
- IjsJobId job_id,
- const char *key,
- char *val_buf,
- int val_size)
-{
- const char *val = NULL;
- if (!strcmp (key, "ColorSpace"))
- val = "DeviceRGB,DeviceGray,DeviceCMYK";
- else if (!strcmp (key, "DeviceManufacturer"))
- val = "Gimp-Print";
- else if (!strcmp (key, "DeviceModel"))
- val = "gimp-print";
- else if (!strcmp (key, "PageImageFormat"))
- val = "Raster";
-
- if (val == NULL)
- return IJS_EUNKPARAM;
- else
- {
- int size = strlen (val);
-
- if (size > val_size)
- return IJS_EBUF;
- memcpy (val_buf, val, size);
- return size;
- }
-}
-
-static int
-gimp_get_cb (void *get_cb_data,
- IjsServerCtx *ctx,
- IjsJobId job_id,
- const char *key,
- char *val_buf,
- int val_size)
-{
- IMAGE *img = (IMAGE *)get_cb_data;
- stp_vars_t v = img->v;
- stp_printer_t printer = stp_get_printer_by_driver(stp_get_driver(v));
- GimpParamList *pl = img->params;
- GimpParamList *curs;
- const char *val = NULL;
- char buf[256];
-
- STP_DEBUG(fprintf(stderr, "gimp_get_cb: %s\n", key));
- if (!printer)
- {
- if (strlen(stp_get_driver(v)) == 0)
- fprintf(stderr, _("Printer must be specified with -sModel\n"));
- else
- fprintf(stderr, _("Printer %s is not a known model\n"),
- stp_get_driver(v));
- return IJS_EUNKPARAM;
- }
- curs = gimp_find_key (pl, key);
- if (curs != NULL)
- {
- if (curs->value_size > val_size)
- return IJS_EBUF;
- memcpy (val_buf, curs->value, curs->value_size);
- return curs->value_size;
- }
-
- if (!strcmp(key, "PrintableArea"))
- {
- int l, r, b, t;
- int h, w;
- (*stp_printer_get_printfuncs(printer)->imageable_area)
- (printer, v, &l, &r, &b, &t);
- h = t - b;
- w = r - l;
- /* Force locale to "C", because decimal numbers sent to the IJS
- client must have a decimal point, nver a decimal comma */
- setlocale(LC_ALL, "C");
- sprintf(buf, "%gx%g", (double) w / 72.0, (double) h / 72.0);
- setlocale(LC_ALL, "");
- STP_DEBUG(fprintf(stderr, "PrintableArea %d %d %s\n", h, w, buf));
- val = buf;
- }
- else if (!strcmp(key, "Dpi"))
- {
- int x, y;
- (*stp_printer_get_printfuncs(printer)->describe_resolution)
- (printer, stp_get_resolution(v), &x, &y);
- /* Force locale to "C", because decimal numbers sent to the IJS
- client must have a decimal point, nver a decimal comma */
- setlocale(LC_ALL, "C");
- sprintf(buf, "%d", x);
- setlocale(LC_ALL, "");
- STP_DEBUG(fprintf(stderr, "Dpi %d %d (%d) %s\n", x, y, x, buf));
- stp_set_scaling(v, -x);
- val = buf;
- }
- else if (!strcmp(key, "PrintableTopLeft"))
- {
- int l, r, b, t;
- int h, w;
- (*stp_printer_get_printfuncs(printer)->media_size)
- (printer, v, &w, &h);
- (*stp_printer_get_printfuncs(printer)->imageable_area)
- (printer, v, &l, &r, &b, &t);
- t = h - t;
- /* Force locale to "C", because decimal numbers sent to the IJS
- client must have a decimal point, nver a decimal comma */
- setlocale(LC_ALL, "C");
- sprintf(buf, "%gx%g", (double) l / 72.0, (double) t / 72.0);
- setlocale(LC_ALL, "");
- STP_DEBUG(fprintf(stderr, "PrintableTopLeft %d %d %s\n", t, l, buf));
- val = buf;
- }
- else if (!strcmp (key, "DeviceManufacturer"))
- val = "Gimp-Print";
- else if (!strcmp (key, "DeviceModel"))
- val = stp_get_driver(img->v);
- else if (!strcmp (key, "PageImageFormat"))
- val = "Raster";
-
- if (val == NULL)
- return IJS_EUNKPARAM;
- else
- {
- int size = strlen (val);
-
- if (size > val_size)
- return IJS_EBUF;
- memcpy (val_buf, val, size);
- return size;
- }
-}
-
-static int
-gimp_set_cb (void *set_cb_data, IjsServerCtx *ctx, IjsJobId jobid,
- const char *key, const char *value, int value_size)
-{
- int code = 0;
- char vbuf[256];
- const stp_vars_t lower = stp_minimum_settings();
- const stp_vars_t upper = stp_maximum_settings();
- int i;
- float z;
- IMAGE *img = (IMAGE *)set_cb_data;
- STP_DEBUG(fprintf (stderr, "gimp_set_cb: %s=", key));
- STP_DEBUG(fwrite (value, 1, value_size, stderr));
- STP_DEBUG(fputs ("\n", stderr));
- if (value_size > sizeof(vbuf)-1)
- return -1;
- memset(vbuf, 0, sizeof(vbuf));
- memcpy(vbuf, value, value_size);
-
- if (strcmp(key, "OutputFile") == 0)
- {
- if (img->filename)
- free(img->filename);
- img->filename = c_strdup(vbuf);
- }
- else if (strcmp(key, "OutputFD") == 0) {
- /* Force locale to "C", because decimal numbers sent to the IJS
- client must have a decimal point, nver a decimal comma */
- setlocale(LC_ALL, "C");
- img->fd = atoi(vbuf) + 1;
- setlocale(LC_ALL, "");
- } else if (strcmp(key, "DeviceManufacturer") == 0)
- ; /* We don't care who makes it */
- else if (strcmp(key, "DeviceModel") == 0)
- {
- stp_printer_t printer = stp_get_printer_by_driver(vbuf);
- stp_set_driver(img->v, vbuf);
- if (printer)
- {
- stp_set_printer_defaults(img->v, printer, NULL);
- if (strlen(stp_get_resolution(img->v)) == 0)
- stp_set_resolution(img->v,
- ((*stp_printer_get_printfuncs(printer)->default_parameters)
- (printer, NULL, "Resolution")));
- if (strlen(stp_get_dither_algorithm(img->v)) == 0)
- stp_set_dither_algorithm(img->v, stp_default_dither_algorithm());
- }
- else
- code = IJS_ERANGE;
- }
- else if (strcmp(key, "PPDFile") == 0)
- stp_set_ppd_file(img->v, vbuf);
- else if (strcmp(key, "Quality") == 0)
- stp_set_resolution(img->v, vbuf);
-#if 0
- else if (strcmp(key, "MediaName") == 0)
- stp_set_media_size(img->v, vbuf);
-#endif
- else if (strcmp(key, "TopLeft") == 0)
- {
- int l, r, b, t, pw, ph;
- double w, h;
- stp_printer_t printer =
- (stp_get_printer_by_driver(stp_get_driver(img->v)));
- ((*stp_printer_get_printfuncs(printer)->imageable_area))
- (printer, img->v, &l, &r, &b, &t);
- (*stp_printer_get_printfuncs(printer)->media_size)
- (printer, img->v, &pw, &ph);
- STP_DEBUG(fprintf(stderr, "l %d r %d t %d b %d pw %d ph %d\n",
- l, r, t, b, pw, ph));
- code = gimp_parse_wxh(vbuf, strlen(vbuf), &w, &h);
- if (code == 0)
- {
- int al = (w * 72) - l;
- int ah = (h * 72) - (ph - t);
- STP_DEBUG(fprintf(stderr, "left top %f %f %d %d %s\n",
- w * 72, h * 72, al, ah, vbuf));
- if (al >= 0)
- stp_set_left(img->v, al);
- if (ah >= 0)
- stp_set_top(img->v, ah);
- }
- }
- else if (strcmp(key, "PaperSize") == 0)
- {
- double w, h;
- code = gimp_parse_wxh(vbuf, strlen(vbuf), &w, &h);
- if (code == 0)
- {
- stp_papersize_t p;
- w *= 72;
- h *= 72;
- STP_DEBUG(fprintf(stderr, "paper size %f %f %s\n", w, h, vbuf));
- stp_set_page_width(img->v, w);
- stp_set_page_height(img->v, h);
- if ((p = stp_get_papersize_by_size(h, w)) != NULL)
- {
- STP_DEBUG(fprintf(stderr, "Found page size %s\n",
- stp_papersize_get_name(p)));
- stp_set_media_size(img->v, stp_papersize_get_name(p));
- }
- else
- STP_DEBUG(fprintf(stderr, "No matching paper size found\n"));
- }
- }
- else if (strcmp(key, "MediaType") == 0)
- stp_set_media_type(img->v, vbuf);
- else if (strcmp(key, "MediaSource") == 0)
- stp_set_media_source(img->v, vbuf);
- else if (strcmp(key, "InkType") == 0)
- stp_set_ink_type(img->v, vbuf);
- else if (strcmp(key, "Dither") == 0)
- stp_set_dither_algorithm(img->v, vbuf);
- else if (strcmp(key, "ImageType") == 0)
- {
- code = get_int(vbuf, key, &i,
- stp_get_image_type(lower), stp_get_image_type(upper));
- if (code == 0)
- stp_set_image_type(img->v, i);
- }
- else if (strcmp(key, "Brightness") == 0)
- {
- code = get_float(vbuf, key, &z,
- stp_get_brightness(lower), stp_get_brightness(upper));
- if (code == 0)
- stp_set_brightness(img->v, z);
- }
- else if (strcmp(key, "Gamma") == 0)
- {
- code = get_float(vbuf, key, &z,
- stp_get_gamma(lower), stp_get_gamma(upper));
- if (code == 0)
- stp_set_gamma(img->v, z);
- }
- else if (strcmp(key, "Contrast") == 0)
- {
- code = get_float(vbuf, key, &z,
- stp_get_contrast(lower), stp_get_contrast(upper));
- if (code == 0)
- stp_set_contrast(img->v, z);
- }
- else if (strcmp(key, "Cyan") == 0)
- {
- code = get_float(vbuf, key, &z,
- stp_get_cyan(lower), stp_get_cyan(upper));
- if (code == 0)
- stp_set_cyan(img->v, z);
- }
- else if (strcmp(key, "Magenta") == 0)
- {
- code = get_float(vbuf, key, &z,
- stp_get_magenta(lower), stp_get_magenta(upper));
- if (code == 0)
- stp_set_magenta(img->v, z);
- }
- else if (strcmp(key, "Yellow") == 0)
- {
- code = get_float(vbuf, key, &z,
- stp_get_yellow(lower), stp_get_yellow(upper));
- if (code == 0)
- stp_set_yellow(img->v, z);
- }
- else if (strcmp(key, "Saturation") == 0)
- {
- code = get_float(vbuf, key, &z,
- stp_get_saturation(lower), stp_get_saturation(upper));
- if (code == 0)
- stp_set_saturation(img->v, z);
- }
- else if (strcmp(key, "Density") == 0)
- {
- code = get_float(vbuf, key, &z,
- stp_get_density(lower), stp_get_density(upper));
- if (code == 0)
- stp_set_density(img->v, z);
- }
- else if (strcmp (key, "Duplex") == 0)
- {
- }
- else if (strcmp (key, "PS:Duplex") == 0)
- {
- }
- else if (strcmp (key, "Tumble") == 0)
- {
- }
- else if (strcmp (key, "PS:Tumble") == 0)
- {
- }
- else
- {
- fprintf(stderr, _("Unknown option %s\n"), key);
- code = -1;
- }
-
- if (code == 0)
- {
- GimpParamList *pl = gimp_find_key (img->params, key);
-
- if (pl == NULL)
- {
- pl = (GimpParamList *)malloc (sizeof (GimpParamList));
- pl->next = img->params;
- pl->key = malloc (strlen(key) + 1);
- memcpy (pl->key, key, strlen(key) + 1);
- img->params = pl;
- }
- else
- {
- free (pl->value);
- }
- pl->value = malloc (value_size);
- memcpy (pl->value, value, value_size);
- pl->value_size = value_size;
- }
-
- return code;
-}
-
-/**********************************************************/
-
-static void
-gimp_outfunc(void *data, const char *buffer, size_t bytes)
-{
- if ((data != NULL) && (buffer != NULL) && (bytes != 0))
- fwrite(buffer, 1, bytes, (FILE *)data);
-}
-
-/**********************************************************/
-/* stp_image_t functions */
-
-static void
-gimp_image_init(stp_image_t *image)
-{
-}
-
-static void
-gimp_image_reset(stp_image_t *image)
-{
-}
-
-/* bytes per pixel (NOT bits per pixel) */
-static int
-gimp_image_bpp(stp_image_t *image)
-{
- IMAGE *img = (IMAGE *)(image->rep);
- STP_DEBUG(fprintf(stderr, "gimp_image_bpp: bps=%d n_chan=%d returning %d\n",
- img->bps, img->n_chan, (img->bps * img->n_chan + 7) / 8));
- return (img->bps * img->n_chan + 7) / 8;
-}
-
-static int
-gimp_image_width(stp_image_t *image)
-{
- IMAGE *img = (IMAGE *)(image->rep);
- return img->width;
-}
-
-static int
-gimp_image_height(stp_image_t *image)
-{
- IMAGE *img = (IMAGE *)(image->rep);
- return img->height * img->xres / img->yres;
-}
-
-static int
-image_next_row(IMAGE *img)
-{
- int status = 0;
- double n_bytes = img->bytes_left;
- if (img->bytes_left)
- {
-
- if (n_bytes > img->row_width)
- n_bytes = img->row_width;
-#ifdef VERBOSE
- STP_DEBUG(fprintf(stderr, "%.0f bytes left, reading %.d, on row %d\n",
- img->bytes_left, (int) n_bytes, img->row));
-#endif
- status = ijs_server_get_data(img->ctx, img->row_buf, (int) n_bytes);
- if (status)
- {
- STP_DEBUG(fprintf(stderr, "page aborted!\n"));
- }
- else
- {
- img->row++;
- img->bytes_left -= n_bytes;
- }
- }
- else
- return 1; /* Done */
- return status;
-}
-
-static stp_image_status_t
-gimp_image_get_row(stp_image_t *image, unsigned char *data, int row)
-{
- IMAGE *img = (IMAGE *)(image->rep);
- int physical_row = row * img->yres / img->xres;
-
- if ((physical_row < 0) || (physical_row >= img->height))
- return STP_IMAGE_ABORT;
-
- /* Read until we reach the requested row. */
- while (physical_row > img->row)
- {
- if (image_next_row(img))
- return STP_IMAGE_ABORT;
- }
-
- if (physical_row == img->row)
- {
- unsigned i, j, length;
- switch (img->bps)
- {
- case 8:
- memcpy(data, img->row_buf, img->row_width);
- break;
- case 1:
- length = img->width / 8;
- for (i = 0; i < length; i++)
- for (j = 128; j > 0; j >>= 1)
- {
- if (img->row_buf[i] & j)
- data[0] = 255;
- else
- data[0] = 0;
- data++;
- }
- length = img->width % 8;
- for (j = 128; j > 1 << (7 - length); j >>= 1)
- {
- if (img->row_buf[i] & j)
- data[0] = 255;
- else
- data[0] = 0;
- data++;
- }
- break;
- default:
- return STP_IMAGE_ABORT;
- }
- }
- else
- return STP_IMAGE_ABORT;
- return STP_IMAGE_OK;
-}
-
-
-static const char *
-gimp_image_get_appname(stp_image_t *image)
-{
- return "ijsgimp";
-}
-
-static void
-gimp_image_progress_init(stp_image_t *image)
-{
-}
-
-static void
-gimp_image_note_progress(stp_image_t *image, double current, double total)
-{
- char buf[256];
- sprintf(buf, _("%.0f of %.0f\n"), current, total);
- STP_DEBUG(gimp_outfunc(stderr, buf, strlen(buf)));
-}
-
-static void
-gimp_image_progress_conclude(stp_image_t *image)
-{
-}
-
-/**********************************************************/
-
-static void
-stp_dbg(const char *msg, const stp_vars_t v)
-{
- fprintf(stderr,"%s Settings: c: %f m: %f y: %f\n",
- msg, stp_get_cyan(v), stp_get_magenta(v), stp_get_yellow(v));
- fprintf(stderr, "Ink type %s\n", stp_get_ink_type(v));
- fprintf(stderr,"Settings: bright: %f contrast: %f\n",
- stp_get_brightness(v), stp_get_contrast(v));
- fprintf(stderr,"Settings: Gamma: %f Saturation: %f Density: %f\n",
- stp_get_gamma(v), stp_get_saturation(v), stp_get_density(v));
- fprintf(stderr, "Settings: width %d, height %d\n",
- stp_get_page_width(v), stp_get_page_height(v));
- fprintf(stderr, "Settings: output type %d image type %d\n",
- stp_get_output_type(v), stp_get_image_type(v));
- fprintf(stderr, "Settings: Quality %s\n", stp_get_resolution(v));
- fprintf(stderr, "Settings: Dither %s\n", stp_get_dither_algorithm(v));
- fprintf(stderr, "Settings: MediaSource %s\n", stp_get_media_source(v));
- fprintf(stderr, "Settings: MediaType %s\n", stp_get_media_type(v));
- fprintf(stderr, "Settings: MediaSize %s\n", stp_get_media_size(v));
- fprintf(stderr, "Settings: Model %s\n", stp_get_driver(v));
- fprintf(stderr, "Settings: InkType %s\n", stp_get_ink_type(v));
- fprintf(stderr, "Settings: OutputTo %s\n", stp_get_output_to(v));
-}
-
-int
-main (int argc, char **argv)
-{
- IjsPageHeader ph;
- int status;
- int page = 0;
- IMAGE img;
- stp_image_t si;
- stp_printer_t printer = NULL;
- FILE *f = NULL;
-
- memset(&img, 0, sizeof(img));
-
- img.ctx = ijs_server_init();
- if (img.ctx == NULL)
- return 1;
-
- stp_init();
- img.v = stp_allocate_vars();
- if (img.v == NULL)
- {
- ijs_server_done(img.ctx);
- return 1;
- }
- stp_set_top(img.v, 0);
- stp_set_left(img.v, 0);
- stp_set_orientation(img.v, ORIENT_PORTRAIT);
-
- /* Error messages to stderr. */
- stp_set_errfunc(img.v, gimp_outfunc);
- stp_set_errdata(img.v, stderr);
-
- /* Printer data goes to file f, but we haven't opened it yet. */
- stp_set_outfunc(img.v, gimp_outfunc);
- stp_set_outdata(img.v, NULL);
-
- memset(&si, 0, sizeof(si));
- si.init = gimp_image_init;
- si.reset = gimp_image_reset;
- si.transpose = NULL;
- si.hflip = NULL;
- si.vflip = NULL;
- si.crop = NULL;
- si.rotate_ccw = NULL;
- si.rotate_cw = NULL;
- si.rotate_180 = NULL;
- si.bpp = gimp_image_bpp;
- si.width = gimp_image_width;
- si.height = gimp_image_height;
- si.get_row = gimp_image_get_row;
- si.get_appname = gimp_image_get_appname;
- si.progress_init = gimp_image_progress_init;
- si.note_progress = gimp_image_note_progress;
- si.progress_conclude = gimp_image_progress_conclude;
- si.rep = &img;
-
- ijs_server_install_status_cb (img.ctx, gimp_status_cb, &img);
- ijs_server_install_list_cb (img.ctx, gimp_list_cb, &img);
- ijs_server_install_enum_cb (img.ctx, gimp_enum_cb, &img);
- ijs_server_install_get_cb (img.ctx, gimp_get_cb, &img);
- ijs_server_install_set_cb(img.ctx, gimp_set_cb, &img);
-
- STP_DEBUG(stp_dbg("about to start", img.v));
-
- do
- {
-
- status = ijs_server_get_page_header(img.ctx, &ph);
- if (status)
- {
- if (status < 0)
- fprintf(stderr, _("ijs_server_get_page_header failed %d\n"),
- status);
- break;
- }
- STP_DEBUG(fprintf(stderr, "got page header, %d x %d\n",
- ph.width, ph.height));
- STP_DEBUG(stp_dbg("have page header", img.v));
-
- status = image_init(&img, &ph);
- if (status)
- {
- fprintf(stderr, _("image_init failed %d\n"), status);
- break;
- }
-
- if (page == 0)
- {
- if (img.fd)
- {
- f = fdopen(img.fd - 1, "wb");
- if (!f)
- {
- fprintf(stderr, _("Unable to open file descriptor: %s\n"),
- strerror(errno));
- status = -1;
- break;
- }
- }
- else if (img.filename && strlen(img.filename) > 0)
- {
- f = fopen(img.filename, "wb");
- if (!f)
- {
- status = -1;
- fprintf(stderr, _("Unable to open %s: %s\n"), img.filename,
- strerror(errno));
- break;
- }
- }
-
- /* Printer data to file */
- stp_set_outdata(img.v, f);
-
- printer = stp_get_printer_by_driver(stp_get_driver(img.v));
- if (printer == NULL)
- {
- fprintf(stderr, _("Unknown printer %s\n"),
- stp_get_driver(img.v));
- status = -1;
- break;
- }
- stp_merge_printvars(img.v, stp_printer_get_printvars(printer));
- if (strlen(stp_get_resolution(img.v)) == 0)
- stp_set_resolution(img.v,
- stp_printer_get_printfuncs(printer)->
- default_parameters(printer, NULL, "Resolution"));
- if (strlen(stp_get_dither_algorithm(img.v)) == 0)
- stp_set_dither_algorithm(img.v, stp_default_dither_algorithm());
- }
-
- img.total_bytes = (double) ((ph.n_chan * ph.bps * ph.width + 7) >> 3)
- * (double) ph.height;
- img.bytes_left = img.total_bytes;
-
- stp_set_app_gamma(img.v, (float)1.7);
- stp_set_cmap(img.v, NULL);
- stp_set_scaling(img.v, (float)-img.xres); /* resolution of image */
- stp_set_output_type(img.v, img.output_type);
- stp_set_page_number(img.v, page);
- stp_set_job_mode(img.v, STP_JOB_MODE_JOB);
- STP_DEBUG(stp_dbg("about to print", img.v));
- if (stp_printer_get_printfuncs(printer)->verify(printer, img.v))
- {
- if (page == 0)
- stp_printer_get_printfuncs(printer)->start_job(printer, &si, img.v);
- stp_printer_get_printfuncs(printer)->print(printer, &si, img.v);
- }
- else
- {
- fprintf(stderr, _("Bad parameters; cannot continue!\n"));
- status = -1;
- break;
- }
-
- while (img.bytes_left)
- {
- status = image_next_row(&img);
- if (status)
- {
- fprintf(stderr, _("Get next row failed at %.0f\n"),
- img.bytes_left);
- break;
- }
- }
-
- image_finish(&img);
- page++;
- }
- while (status == 0);
- stp_printer_get_printfuncs(printer)->end_job(printer, &si, img.v);
-
- if (f)
- {
- fclose(f);
- }
-
- if (status > 0)
- status = 0; /* normal exit */
-
- ijs_server_done(img.ctx);
-
- STP_DEBUG(fprintf (stderr, "server exiting with status %d\n", status));
- return status;
-}
diff --git a/src/ghost/ijsgutenprint.c b/src/ghost/ijsgutenprint.c
new file mode 100644
index 0000000..45826fc
--- /dev/null
+++ b/src/ghost/ijsgutenprint.c
@@ -0,0 +1,1374 @@
+/*
+ * $Id: ijsgutenprint.c,v 1.8 2005/06/18 21:13:52 rlk Exp $
+ *
+ * IJS server for Gutenprint.
+ *
+ * Copyright 2001 Robert Krawitz (rlk@alum.mit.edu)
+ *
+ * Originally written by Russell Lang, copyright assigned to 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.
+ *
+ * Revision History:
+ *
+ * See ChangeLog
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <locale.h>
+#include <ijs.h>
+#include <ijs_server.h>
+#include <errno.h>
+#include <gutenprint/gutenprint-intl-internal.h>
+
+
+static int stp_debug = 1;
+volatile int SDEBUG = 1;
+
+#define STP_DEBUG(x) \
+do \
+{ \
+ if (stp_debug || getenv("STP_DEBUG")) \
+ fprintf(stderr, "DEBUG: "); \
+ if (stp_debug || getenv("STP_DEBUG")) \
+ x; \
+} while (0)
+
+typedef struct _GutenprintParamList GutenprintParamList;
+
+struct _GutenprintParamList {
+ GutenprintParamList *next;
+ char *key;
+ char *value;
+ int value_size;
+};
+
+typedef struct _IMAGE
+{
+ IjsServerCtx *ctx;
+ stp_vars_t *v;
+ char *filename; /* OutputFile */
+ int fd; /* OutputFD + 1 (so that 0 is invalid) */
+ int width; /* pixels */
+ int height; /* pixels */
+ int bps; /* bytes per sample */
+ int n_chan; /* number of channels */
+ int xres; /* dpi */
+ int yres;
+ int output_type;
+ int monochrome_flag; /* for monochrome output */
+ int row; /* row number in buffer */
+ int row_width; /* length of a row */
+ char *row_buf; /* buffer for raster */
+ double total_bytes; /* total size of raster */
+ double bytes_left; /* bytes remaining to be read */
+ GutenprintParamList *params;
+} IMAGE;
+
+static const char DeviceGray[] = "DeviceGray";
+static const char DeviceRGB[] = "DeviceRGB";
+static const char DeviceCMYK[] = "DeviceCMYK";
+
+static const char *version_id;
+static int version_is_ok = 1;
+static const char version_mismatch[] = N_("\
+ijsgutenprint: the version of Gutenprint software installed (%s)\n\
+ does not match the PPD file (%s). If you have upgraded your version\n\
+ of Gutenprint recently, you must reinstall all printer queues.\n\
+ Please refer to your vendor's documentation or the ``foomatic-ppdfile''\n\
+ command for instructions.\n\
+ERROR: ijsgutenprint: the version of Gutenprint software installed (%s) does not match the PPD file (%s).\n");
+
+const char *gutenprint_ppd_version = NULL;
+
+static stp_string_list_t *option_remap_list = NULL;
+static int print_messages_as_errors = 0;
+
+static char *
+c_strdup(const char *s)
+{
+ char *ret = stp_malloc(strlen(s) + 1);
+ strcpy(ret, s);
+ return ret;
+}
+
+static int
+image_init(IMAGE *img, IjsPageHeader *ph)
+{
+ img->width = ph->width;
+ img->height = ph->height;
+ img->bps = ph->bps;
+ img->n_chan = ph->n_chan;
+ img->xres = ph->xres;
+ img->yres = ph->yres;
+
+ img->row = -1;
+ img->row_width = (ph->n_chan * ph->bps * ph->width + 7) >> 3;
+ if (img->row_buf)
+ stp_free(img->row_buf);
+ img->row_buf = (char *)stp_malloc(img->row_width);
+ STP_DEBUG(fprintf(stderr, "stp_image_init\n"));
+ STP_DEBUG(fprintf(stderr,
+ "ijsgutenprint: ph width %d height %d bps %d n_chan %d xres %f yres %f\n",
+ ph->width, ph->height, ph->bps, ph->n_chan, ph->xres,
+ ph->yres));
+
+ stp_set_string_parameter(img->v, "ChannelBitDepth", "8");
+ if ((img->bps == 1) && (img->n_chan == 1) &&
+ (strncmp(ph->cs, DeviceGray, strlen(DeviceGray)) == 0))
+ {
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: output monochrome\n"));
+ stp_set_string_parameter(img->v, "InputImageType", "Whitescale");
+ stp_set_string_parameter(img->v, "PrintingMode", "BW");
+ stp_set_string_parameter(img->v, "ColorCorrection", "Threshold");
+ img->monochrome_flag = 1;
+ /* 8-bit greyscale */
+ }
+ else if (img->bps == 8 || img->bps == 16)
+ {
+ if (img->bps == 8)
+ stp_set_string_parameter(img->v, "ChannelBitDepth", "8");
+ else
+ stp_set_string_parameter(img->v, "ChannelBitDepth", "16");
+ if ((img->n_chan == 1) &&
+ (strncmp(ph->cs, DeviceGray, strlen(DeviceGray)) == 0))
+ {
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: output gray\n"));
+ stp_set_string_parameter(img->v, "InputImageType", "Whitescale");
+ stp_set_string_parameter(img->v, "PrintingMode", "BW");
+ img->monochrome_flag = 0;
+ /* 8/16-bit greyscale */
+ }
+ else if ((img->n_chan == 3) &&
+ (strncmp(ph->cs, DeviceRGB, strlen(DeviceRGB)) == 0))
+ {
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: output color\n"));
+ stp_set_string_parameter(img->v, "InputImageType", "RGB");
+ stp_set_string_parameter(img->v, "PrintingMode", "Color");
+ img->monochrome_flag = 0;
+ /* 24/48-bit RGB colour */
+ }
+ else if ((img->n_chan == 4) &&
+ (strncmp(ph->cs, DeviceCMYK, strlen(DeviceCMYK)) == 0))
+ {
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: output CMYK\n"));
+ stp_set_string_parameter(img->v, "InputImageType", "CMYK");
+ stp_set_string_parameter(img->v, "PrintingMode", "Color");
+ img->monochrome_flag = 0;
+ /* 32/64-bit CMYK colour */
+ }
+ }
+ else
+ {
+ fprintf(stderr, _("ERROR: ijsgutenprint: Bad color space: bps %d channels %d space %s\n"),
+ img->bps, img->n_chan, ph->cs);
+ /* unsupported */
+ return -1;
+ }
+
+ if (img->row_buf == NULL)
+ {
+ STP_DEBUG(fprintf(stderr, _("ERROR: ijsgutenprint: No row buffer\n")));
+ return -1;
+ }
+
+ return 0;
+}
+
+static void
+image_finish(IMAGE *img)
+{
+ if (img->row_buf)
+ stp_free(img->row_buf);
+ img->row_buf = NULL;
+}
+
+static double
+get_float(const char *str, const char *name, double *pval)
+{
+ float new_value;
+ int status = 0;
+ /* Force locale to "C", because decimal numbers coming from the IJS
+ client are always with a decimal point, nver with a decimal comma */
+ setlocale(LC_ALL, "C");
+ if (sscanf(str, "%f", &new_value) == 1)
+ *pval = new_value;
+ else
+ {
+ fprintf(stderr, _("ERROR: ijsgutenprint: Unable to parse parameter %s=%s (expect a number)\n"),
+ name, str);
+ status = -1;
+ }
+ setlocale(LC_ALL, "");
+ return status;
+}
+
+static int
+get_int(const char *str, const char *name, int *pval)
+{
+ int new_value;
+ int status = 0;
+ /* Force locale to "C", because decimal numbers sent to the IJS
+ client must have a decimal point, nver a decimal comma */
+ setlocale(LC_ALL, "C");
+ if (sscanf(str, "%d", &new_value) == 1)
+ *pval = new_value;
+ else
+ {
+ fprintf(stderr, _("ERROR: ijsgutenprint: Unable to parse parameter %s=%s (expect a number)\n"),
+ name, str);
+ status = -1;
+ }
+ setlocale(LC_ALL, "");
+ return status;
+}
+
+static int
+parse_wxh_internal(const char *val, int size, double *pw, double *ph)
+{
+ char buf[256];
+ char *tail;
+ int i;
+
+ for (i = 0; i < size; i++)
+ if (val[i] == 'x')
+ break;
+
+ if (i + 1 >= size)
+ return IJS_ESYNTAX;
+
+ if (i >= sizeof(buf))
+ return IJS_EBUF;
+
+ memcpy (buf, val, i);
+ buf[i] = 0;
+ *pw = strtod (buf, &tail);
+ if (tail == buf)
+ return IJS_ESYNTAX;
+
+ if (size - i > sizeof(buf))
+ return IJS_EBUF;
+
+ memcpy (buf, val + i + 1, size - i - 1);
+ buf[size - i - 1] = 0;
+ *ph = strtod (buf, &tail);
+ if (tail == buf)
+ return IJS_ESYNTAX;
+
+ return 0;
+}
+
+/* A C implementation of /^(\d\.+\-eE)+x(\d\.+\-eE)+$/ */
+static int
+gutenprint_parse_wxh (const char *val, int size, double *pw, double *ph)
+{
+ /* Force locale to "C", because decimal numbers coming from the IJS
+ client are always with a decimal point, nver with a decimal comma */
+ int status;
+ setlocale(LC_ALL, "C");
+ status = parse_wxh_internal(val, size, pw, ph);
+ setlocale(LC_ALL, "");
+ return status;
+}
+
+/**
+ * gutenprint_find_key: Search parameter list for key.
+ *
+ * @key: key to look up
+ *
+ * Return value: GutenprintParamList entry matching @key, or NULL.
+ **/
+static GutenprintParamList *
+gutenprint_find_key (GutenprintParamList *pl, const char *key)
+{
+ GutenprintParamList *curs;
+
+ for (curs = pl; curs != NULL; curs = curs->next)
+ {
+ if (!strcmp (curs->key, key))
+ return curs;
+ }
+ return NULL;
+}
+
+static int
+gutenprint_status_cb (void *status_cb_data,
+ IjsServerCtx *ctx,
+ IjsJobId job_id)
+{
+ return 0;
+}
+
+static const char *
+list_all_parameters(void)
+{
+ static char *param_string = NULL;
+ size_t param_length = 0;
+ size_t offset = 0;
+ if (param_length == 0)
+ {
+ stp_string_list_t *sl = stp_string_list_create();
+ int printer_count = stp_printer_model_count();
+ int i;
+ stp_string_list_add_string(sl, "PrintableArea", NULL);
+ stp_string_list_add_string(sl, "Dpi", NULL);
+ stp_string_list_add_string(sl, "PrintableTopLeft", NULL);
+ stp_string_list_add_string(sl, "DeviceManufacturer", NULL);
+ stp_string_list_add_string(sl, "DeviceModel", NULL);
+ stp_string_list_add_string(sl, "PageImageFormat", NULL);
+ stp_string_list_add_string(sl, "OutputFile", NULL);
+ stp_string_list_add_string(sl, "OutputFd", NULL);
+ stp_string_list_add_string(sl, "PaperSize", NULL);
+ stp_string_list_add_string(sl, "MediaName", NULL);
+ stp_string_list_add_string(sl, "STP_VERSION", NULL);
+ for (i = 0; i < printer_count; i++)
+ {
+ const stp_printer_t *printer = stp_get_printer_by_index(i);
+ stp_parameter_list_t params =
+ stp_get_parameter_list(stp_printer_get_defaults(printer));
+ size_t count = stp_parameter_list_count(params);
+ int j;
+ if (strcmp(stp_printer_get_family(printer), "ps") == 0 ||
+ strcmp(stp_printer_get_family(printer), "raw") == 0)
+ continue;
+ for (j = 0; j < count; j++)
+ {
+ const stp_parameter_t *param =
+ stp_parameter_list_param(params, j);
+ char *tmp =
+ stp_malloc(strlen(param->name) + strlen("STP_") + 1);
+ sprintf(tmp, "STP_%s", param->name);
+ if ((param->p_level < STP_PARAMETER_LEVEL_ADVANCED4) &&
+ (param->p_type != STP_PARAMETER_TYPE_RAW) &&
+ (param->p_type != STP_PARAMETER_TYPE_FILE) &&
+ (!param->read_only) &&
+ (strcmp(param->name, "Resolution") != 0) &&
+ (strcmp(param->name, "PageSize") != 0) &&
+ (!stp_string_list_is_present(sl, tmp)))
+ {
+ sprintf(tmp, "STP_%s", param->name);
+ stp_string_list_add_string(sl, tmp, NULL);
+ if ((param->p_type == STP_PARAMETER_TYPE_DOUBLE ||
+ param->p_type == STP_PARAMETER_TYPE_DIMENSION) &&
+ !param->read_only && param->is_active &&
+ !param->is_mandatory)
+ {
+ char *tmp1 =
+ stp_malloc(strlen(param->name) + strlen("STP_Enable") + 1);
+ sprintf(tmp1, "STP_Enable%s", param->name);
+ stp_string_list_add_string(sl, tmp1, NULL);
+ free(tmp1);
+ }
+ }
+ free(tmp);
+ }
+ stp_parameter_list_destroy(params);
+ }
+ for (i = 0; i < stp_string_list_count(sl); i++)
+ param_length += strlen(stp_string_list_param(sl, i)->name) + 1;
+ param_string = stp_malloc(param_length);
+ for (i = 0; i < stp_string_list_count(sl); i++)
+ {
+ stp_param_string_t *param = stp_string_list_param(sl, i);
+ strcpy(param_string + offset, param->name);
+ offset += strlen(param->name) + 1;
+ param_string[offset - 1] = ',';
+ }
+ if (offset != param_length)
+ {
+ fprintf(stderr, "ERROR: ijsgutenprint: Bad string length %lu != %lu!\n",
+ (unsigned long) offset,
+ (unsigned long) param_length);
+ exit(1);
+ }
+ param_string[param_length - 1] = '\0';
+ }
+ return param_string;
+}
+
+
+static int
+gutenprint_list_cb (void *list_cb_data,
+ IjsServerCtx *ctx,
+ IjsJobId job_id,
+ char *val_buf,
+ int val_size)
+{
+ const char *param_list = list_all_parameters();
+ int size = strlen (param_list);
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: gutenprint_list_cb: %s\n", param_list));
+
+ if (size > val_size)
+ return IJS_EBUF;
+
+ memcpy (val_buf, param_list, size);
+ return size;
+}
+
+static int
+gutenprint_enum_cb (void *enum_cb_data,
+ IjsServerCtx *ctx,
+ IjsJobId job_id,
+ const char *key,
+ char *val_buf,
+ int val_size)
+{
+ const char *val = NULL;
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: gutenprint_enum_cb: key=%s\n", key));
+ if (!strcmp (key, "ColorSpace"))
+ val = "DeviceRGB,DeviceGray,DeviceCMYK";
+ else if (!strcmp (key, "DeviceManufacturer"))
+ val = "Gutenprint";
+ else if (!strcmp (key, "DeviceModel"))
+ val = "gutenprint";
+ else if (!strcmp (key, "PageImageFormat"))
+ val = "Raster";
+ else if (!strcmp (key, "BitsPerSample"))
+ val = "8,16";
+ else if (!strcmp (key, "ByteSex"))
+ {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ val="little-endian";
+#else
+ val="big-endian";
+#endif
+ }
+
+ if (val == NULL)
+ return IJS_EUNKPARAM;
+ else
+ {
+ int size = strlen (val);
+
+ if (size > val_size)
+ return IJS_EBUF;
+ memcpy (val_buf, val, size);
+ return size;
+ }
+}
+
+static int
+gutenprint_get_cb (void *get_cb_data,
+ IjsServerCtx *ctx,
+ IjsJobId job_id,
+ const char *key,
+ char *val_buf,
+ int val_size)
+{
+ IMAGE *img = (IMAGE *)get_cb_data;
+ stp_vars_t *v = img->v;
+ const stp_printer_t *printer = stp_get_printer(v);
+ GutenprintParamList *pl = img->params;
+ GutenprintParamList *curs;
+ const char *val = NULL;
+ char buf[256];
+
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: gutenprint_get_cb: %s\n", key));
+ if (!printer)
+ {
+ if (strlen(stp_get_driver(v)) == 0)
+ fprintf(stderr, _("ERROR: ijsgutenprint: Printer must be specified with -sDeviceModel\n"));
+ else
+ fprintf(stderr, _("ERROR: ijsgutenprint: Printer %s is not a known model\n"),
+ stp_get_driver(v));
+ return IJS_EUNKPARAM;
+ }
+ curs = gutenprint_find_key (pl, key);
+ if (curs != NULL)
+ {
+ if (curs->value_size > val_size)
+ return IJS_EBUF;
+ memcpy (val_buf, curs->value, curs->value_size);
+ return curs->value_size;
+ }
+
+ if (!strcmp(key, "PrintableArea"))
+ {
+ int l, r, b, t;
+ int h, w;
+ stp_get_imageable_area(v, &l, &r, &b, &t);
+ h = b - t;
+ w = r - l;
+ /* Force locale to "C", because decimal numbers sent to the IJS
+ client must have a decimal point, nver a decimal comma */
+ setlocale(LC_ALL, "C");
+ sprintf(buf, "%gx%g", (double) w / 72.0, (double) h / 72.0);
+ setlocale(LC_ALL, "");
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: PrintableArea %d %d %s\n", h, w, buf));
+ val = buf;
+ }
+ else if (!strcmp(key, "Dpi"))
+ {
+ int x, y;
+ stp_describe_resolution(v, &x, &y);
+ /* Force locale to "C", because decimal numbers sent to the IJS
+ client must have a decimal point, nver a decimal comma */
+ setlocale(LC_ALL, "C");
+ sprintf(buf, "%d", x);
+ setlocale(LC_ALL, "");
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: Dpi %d %d (%d) %s\n", x, y, x, buf));
+ val = buf;
+ }
+ else if (!strcmp(key, "PrintableTopLeft"))
+ {
+ int l, r, b, t;
+ int h, w;
+ stp_get_media_size(v, &w, &h);
+ stp_get_imageable_area(v, &l, &r, &b, &t);
+ /* Force locale to "C", because decimal numbers sent to the IJS
+ client must have a decimal point, nver a decimal comma */
+ setlocale(LC_ALL, "C");
+ sprintf(buf, "%gx%g", (double) l / 72.0, (double) t / 72.0);
+ setlocale(LC_ALL, "");
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: PrintableTopLeft %d %d %s\n", t, l, buf));
+ val = buf;
+ }
+ else if (!strcmp (key, "DeviceManufacturer"))
+ val = "Gutenprint";
+ else if (!strcmp (key, "DeviceModel"))
+ val = stp_get_driver(img->v);
+ else if (!strcmp (key, "PageImageFormat"))
+ val = "Raster";
+
+ if (val == NULL)
+ return IJS_EUNKPARAM;
+ else
+ {
+ int size = strlen (val);
+
+ if (size > val_size)
+ return IJS_EBUF;
+ memcpy (val_buf, val, size);
+ return size;
+ }
+}
+
+static void
+print_debug_setcb(const char *key, const char *value, int value_size)
+{
+ fprintf (stderr, "ijsgutenprint: gutenprint_set_cb: %s='", key);
+ fwrite (value, 1, value_size, stderr);
+ fputs ("'\n", stderr);
+}
+
+static int
+gutenprint_set_cb (void *set_cb_data, IjsServerCtx *ctx, IjsJobId jobid,
+ const char *key, const char *value, int value_size)
+{
+ int code = 0;
+ char vbuf[256];
+ int i;
+ double z;
+ IMAGE *img = (IMAGE *)set_cb_data;
+ STP_DEBUG(print_debug_setcb(key, value, value_size));
+ if (value_size > sizeof(vbuf)-1)
+ return -1;
+ memset(vbuf, 0, sizeof(vbuf));
+ memcpy(vbuf, value, value_size);
+
+ if (strcmp(key, "OutputFile") == 0)
+ {
+ if (img->filename)
+ stp_free(img->filename);
+ img->filename = c_strdup(vbuf);
+ }
+ else if (strcmp(key, "OutputFD") == 0)
+ {
+ /* Force locale to "C", because decimal numbers sent to the IJS
+ client must have a decimal point, nver a decimal comma */
+ setlocale(LC_ALL, "C");
+ img->fd = atoi(vbuf) + 1;
+ setlocale(LC_ALL, "");
+ }
+ else if (strcmp(key, "DeviceManufacturer") == 0)
+ ; /* We don't care who makes it */
+ else if (strcmp(key, "DeviceModel") == 0)
+ {
+ const stp_printer_t *printer = stp_get_printer_by_driver(vbuf);
+ stp_set_driver(img->v, vbuf);
+ if (printer &&
+ strcmp(stp_printer_get_family(printer), "ps") != 0 &&
+ strcmp(stp_printer_get_family(printer), "raw") != 0)
+ {
+ stp_set_printer_defaults(img->v, printer);
+ /* Reset JobMode to "Job" */
+ stp_set_string_parameter(img->v, "JobMode", "Job");
+ }
+ else
+ {
+ fprintf(stderr, _("ijsgutenprint: unknown DeviceModel %s\n"), vbuf);
+ code = IJS_ERANGE;
+ }
+ }
+ else if (strcmp(key, "TopLeft") == 0)
+ {
+ int l, r, b, t, pw, ph;
+ double w, h;
+ stp_get_imageable_area(img->v, &l, &r, &b, &t);
+ stp_get_media_size(img->v, &pw, &ph);
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: l %d r %d t %d b %d pw %d ph %d\n",
+ l, r, t, b, pw, ph));
+ code = gutenprint_parse_wxh(vbuf, strlen(vbuf), &w, &h);
+ if (code == 0)
+ {
+ int al = (w * 72) + .5;
+ int ah = (h * 72) + .5;
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: left top %f %f %d %d %s\n",
+ w * 72, h * 72, al, ah, vbuf));
+ if (al >= 0)
+ stp_set_left(img->v, al);
+ if (ah >= 0)
+ stp_set_top(img->v, ah);
+ stp_set_width(img->v, r - l);
+ stp_set_height(img->v, b - t);
+ }
+ else
+ fprintf(stderr, _("ERROR: ijsgutenprint: cannot parse TopLeft %s\n"), vbuf);
+ }
+ else if (strcmp(key, "PaperSize") == 0)
+ {
+ double w, h;
+ code = gutenprint_parse_wxh(vbuf, strlen(vbuf), &w, &h);
+ if (code == 0)
+ {
+ const stp_papersize_t *p;
+ w *= 72;
+ h *= 72;
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: paper size %f %f %s\n", w, h, vbuf));
+ stp_set_page_width(img->v, w);
+ stp_set_page_height(img->v, h);
+ if ((p = stp_get_papersize_by_size(h, w)) != NULL)
+ {
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: Found page size %s\n", p->name));
+ stp_set_string_parameter(img->v, "PageSize", p->name);
+ }
+ else
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: No matching paper size found\n"));
+ }
+ else
+ fprintf(stderr, _("ERROR: ijsgutenprint: cannot parse PaperSize %s\n"), vbuf);
+ }
+
+/*
+ * Duplex & Tumble. The PS: values come from the PostScript document, the
+ * others come from the command line. However, the PS: values seem to get
+ * fed back again as non PS: values after the command line is processed.
+ * The net effect is that the command line is always overridden by the
+ * values from the document.
+ */
+
+ else if ((strcmp (key, "Duplex") == 0) || (strcmp (key, "PS:Duplex") == 0))
+ {
+ stp_set_string_parameter(img->v, "x_Duplex", vbuf);
+ }
+ else if ((strcmp (key, "Tumble") == 0) || (strcmp (key, "PS:Tumble") == 0))
+ {
+ stp_set_string_parameter(img->v, "x_Tumble", vbuf);
+ }
+ else if (strcmp(key, "STP_VERSION") == 0)
+ {
+ if (strcmp(vbuf, version_id) != 0)
+ {
+ fprintf(stderr, _(version_mismatch),
+ version_id, vbuf, version_id, vbuf);
+ version_is_ok = 0;
+ gutenprint_ppd_version = c_strdup(vbuf);
+ code = IJS_ERANGE;
+ }
+ }
+ else if (strncmp(key, "STP_OPT_REMAP_", strlen("STP_OPT_REMAP_")) == 0)
+ {
+ const char *xkey = key + strlen("STP_OPT_REMAP_");
+ char *buf1 = stp_malloc(strlen("STP_OPT_") + strlen(xkey) + 1);
+ char *buf2 = c_strdup(vbuf);
+ strcpy(buf1, "STP_OPT_");
+ strcpy(buf1 + strlen("STP_OPT_"), xkey);
+ stp_string_list_add_string(option_remap_list, buf1, buf2);
+ stp_free(buf1);
+ stp_free(buf2);
+ }
+ else if (strncmp(key, "STP_", 4) == 0)
+ {
+ stp_curve_t *curve;
+ stp_parameter_t desc;
+ const char *xkey = key + 4;
+ stp_param_string_t *pstr = stp_string_list_find(option_remap_list, key);
+ if (pstr)
+ {
+ xkey = pstr->text;
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: remapping %s to %s\n",
+ key, xkey));
+ }
+
+ stp_describe_parameter(img->v, xkey, &desc);
+ switch (desc.p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ stp_set_string_parameter(img->v, xkey, vbuf);
+ break;
+ case STP_PARAMETER_TYPE_FILE:
+ stp_set_file_parameter(img->v, xkey, vbuf);
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ curve = stp_curve_create_from_string(vbuf);
+ if (curve)
+ {
+ stp_set_curve_parameter(img->v, xkey, curve);
+ stp_curve_destroy(curve);
+ }
+ else
+ fprintf(stderr, _("ERROR: ijsgutenprint: cannot parse curve %s\n"), vbuf);
+ break;
+ case STP_PARAMETER_TYPE_DOUBLE:
+ code = get_float(vbuf, xkey, &z);
+ if (code == 0)
+ stp_set_float_parameter(img->v, xkey, z);
+ else
+ fprintf(stderr, _("ERROR: ijsgutenprint: cannot parse %s float %s\n"), xkey, vbuf);
+ break;
+ case STP_PARAMETER_TYPE_INT:
+ code = get_int(vbuf, xkey, &i);
+ if (code == 0)
+ stp_set_int_parameter(img->v, xkey, i);
+ else
+ fprintf(stderr, _("ERROR: ijsgutenprint: cannot parse %s int %s\n"), xkey, vbuf);
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ code = get_int(vbuf, xkey, &i);
+ if (code == 0)
+ stp_set_dimension_parameter(img->v, xkey, i);
+ else
+ fprintf(stderr, _("ERROR: ijsgutenprint: cannot parse %s dimension %s\n"), xkey, vbuf);
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ code = get_int(vbuf, xkey, &i);
+ if (code == 0)
+ stp_set_boolean_parameter(img->v, xkey, i);
+ else
+ fprintf(stderr, _("ERROR: ijsgutenprint: cannot parse %s boolean %s\n"), xkey, vbuf);
+ break;
+ default:
+ if (strncmp(xkey, "Enable", strlen("Enable")) == 0)
+ {
+ STP_DEBUG(fprintf(stderr,
+ "ijsgutenprint: Setting dummy enable parameter %s %s\n",
+ xkey, vbuf));
+ stp_set_string_parameter(img->v, xkey, vbuf);
+ }
+ else
+ fprintf(stderr, _("ERROR: ijsgutenprint: Bad parameter %s %d\n"), key, desc.p_type);
+ }
+ stp_parameter_description_destroy(&desc);
+ }
+
+ if (code == 0)
+ {
+ GutenprintParamList *pl = gutenprint_find_key (img->params, key);
+
+ if (pl == NULL)
+ {
+ pl = (GutenprintParamList *)stp_malloc (sizeof (GutenprintParamList));
+ pl->next = img->params;
+ pl->key = stp_malloc (strlen(key) + 1);
+ memcpy (pl->key, key, strlen(key) + 1);
+ img->params = pl;
+ }
+ else
+ {
+ stp_free (pl->value);
+ }
+ pl->value = stp_malloc (value_size);
+ memcpy (pl->value, value, value_size);
+ pl->value_size = value_size;
+ }
+ else
+ fprintf(stderr, _("ERROR: ijsgutenprint: bad key code %d\n"), code);
+
+ return code;
+}
+
+/**********************************************************/
+
+static void
+gutenprint_errfunc(void *file, const char *buf, size_t bytes)
+{
+ size_t next_nl = 0;
+ size_t where = 0;
+ FILE *prn = (FILE *)file;
+ while (where < bytes)
+ {
+ if (print_messages_as_errors)
+ fputs("ERROR: Gutenprint: ", prn);
+ else
+ fputs("DEBUG: Gutenprint internal: ", prn);
+ while (next_nl < bytes)
+ {
+ if (buf[next_nl++] == '\n')
+ break;
+ }
+ fwrite(buf + where, 1, next_nl - where, prn);
+ where = next_nl;
+ }
+}
+
+static void
+gutenprint_outfunc(void *data, const char *buffer, size_t bytes)
+{
+ if ((data != NULL) && (buffer != NULL) && (bytes != 0))
+ fwrite(buffer, 1, bytes, (FILE *)data);
+}
+
+/**********************************************************/
+/* stp_image_t functions */
+
+static int
+gutenprint_image_width(stp_image_t *image)
+{
+ IMAGE *img = (IMAGE *)(image->rep);
+ return img->width;
+}
+
+static int
+gutenprint_image_height(stp_image_t *image)
+{
+ IMAGE *img = (IMAGE *)(image->rep);
+ return img->height * img->xres / img->yres;
+}
+
+static int
+image_next_row(IMAGE *img)
+{
+ int status = 0;
+ double n_bytes = img->bytes_left;
+ if (img->bytes_left)
+ {
+
+ if (n_bytes > img->row_width)
+ n_bytes = img->row_width;
+#ifdef VERBOSE
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: %.0f bytes left, reading %.d, on row %d\n",
+ img->bytes_left, (int) n_bytes, img->row));
+#endif
+ status = ijs_server_get_data(img->ctx, img->row_buf, (int) n_bytes);
+ if (status)
+ {
+ STP_DEBUG(fprintf(stderr, "ERROR: ijsgutenprint: page aborted!\n"));
+ }
+ else
+ {
+ img->row++;
+ img->bytes_left -= n_bytes;
+ }
+ }
+ else
+ return 1; /* Done */
+ return status;
+}
+
+static stp_image_status_t
+gutenprint_image_get_row(stp_image_t *image, unsigned char *data, size_t byte_limit,
+ int row)
+{
+ IMAGE *img = (IMAGE *)(image->rep);
+ int physical_row = row * img->yres / img->xres;
+
+ if ((physical_row < 0) || (physical_row >= img->height))
+ return STP_IMAGE_STATUS_ABORT;
+
+ /* Read until we reach the requested row. */
+ while (physical_row > img->row)
+ {
+ if (image_next_row(img))
+ return STP_IMAGE_STATUS_ABORT;
+ }
+
+ if (physical_row == img->row)
+ {
+ unsigned i, j, length;
+ switch (img->bps)
+ {
+ case 16:
+ case 8:
+ memcpy(data, img->row_buf, img->row_width);
+ break;
+ case 1:
+ length = img->width / 8;
+ for (i = 0; i < length; i++)
+ for (j = 128; j > 0; j >>= 1)
+ {
+ if (img->row_buf[i] & j)
+ data[0] = 255;
+ else
+ data[0] = 0;
+ data++;
+ }
+ length = img->width % 8;
+ for (j = 128; j > 1 << (7 - length); j >>= 1)
+ {
+ if (img->row_buf[i] & j)
+ data[0] = 255;
+ else
+ data[0] = 0;
+ data++;
+ }
+ break;
+ default:
+ return STP_IMAGE_STATUS_ABORT;
+ }
+ }
+ else
+ return STP_IMAGE_STATUS_ABORT;
+ return STP_IMAGE_STATUS_OK;
+}
+
+
+static const char *
+gutenprint_image_get_appname(stp_image_t *image)
+{
+ return "ijsgutenprint";
+}
+
+/**********************************************************/
+
+static const char *
+safe_get_string_parameter(const stp_vars_t *v, const char *param)
+{
+ const char *val = stp_get_string_parameter(v, param);
+ if (val)
+ return val;
+ else
+ return "NULL";
+}
+
+static void
+stp_dbg(const char *msg, const stp_vars_t *v)
+{
+ stp_parameter_list_t params = stp_get_parameter_list(v);
+ int count = stp_parameter_list_count(params);
+ int i;
+ fprintf(stderr, "DEBUG: %s\n", msg);
+ fprintf(stderr, "DEBUG: ijsgutenprint: Settings: Model %s\n", stp_get_driver(v));
+ for (i = 0; i < count; i++)
+ {
+ const stp_parameter_t *p = stp_parameter_list_param(params, i);
+ switch (p->p_type)
+ {
+ case STP_PARAMETER_TYPE_DOUBLE:
+ if (stp_check_float_parameter(v, p->name, STP_PARAMETER_DEFAULTED))
+ fprintf(stderr, "DEBUG: ijsgutenprint: Settings: %s %f\n",
+ p->name, stp_get_float_parameter(v, p->name));
+ break;
+ case STP_PARAMETER_TYPE_INT:
+ if (stp_check_int_parameter(v, p->name, STP_PARAMETER_DEFAULTED))
+ fprintf(stderr, "DEBUG: ijsgutenprint: Settings: %s %d\n",
+ p->name, stp_get_int_parameter(v, p->name));
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ if (stp_check_dimension_parameter(v, p->name, STP_PARAMETER_DEFAULTED))
+ fprintf(stderr, "DEBUG: ijsgutenprint: Settings: %s %d\n",
+ p->name, stp_get_dimension_parameter(v, p->name));
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ if (stp_check_boolean_parameter(v, p->name, STP_PARAMETER_DEFAULTED))
+ fprintf(stderr, "DEBUG: ijsgutenprint: Settings: %s %d\n",
+ p->name, stp_get_boolean_parameter(v, p->name));
+ break;
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ if (stp_check_string_parameter(v, p->name, STP_PARAMETER_DEFAULTED))
+ fprintf(stderr, "DEBUG: ijsgutenprint: Settings: %s %s\n",
+ p->name, safe_get_string_parameter(v, p->name));
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ if (stp_check_curve_parameter(v, p->name, STP_PARAMETER_DEFAULTED))
+ {
+ char *curve =
+ stp_curve_write_string(stp_get_curve_parameter(v, p->name));
+ fprintf(stderr, "DEBUG: ijsgutenprint: Settings: %s %s\n",
+ p->name, curve);
+ stp_free(curve);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ stp_parameter_list_destroy(params);
+}
+
+static void
+purge_unused_float_parameters(stp_vars_t *v)
+{
+ int i;
+ stp_parameter_list_t params = stp_get_parameter_list(v);
+ size_t count = stp_parameter_list_count(params);
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: Purging unused floating point parameters"));
+ for (i = 0; i < count; i++)
+ {
+ const stp_parameter_t *param = stp_parameter_list_param(params, i);
+ if (param->p_type == STP_PARAMETER_TYPE_DOUBLE &&
+ !param->read_only && param->is_active && !param->is_mandatory)
+ {
+ size_t bytes = strlen(param->name) + strlen("Enable") + 1;
+ char *tmp = stp_malloc(bytes);
+ const char *value;
+ sprintf(tmp, "Enable%s", param->name);
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: Looking for parameter %s\n", tmp));
+ value = stp_get_string_parameter(v, tmp);
+ if (value)
+ {
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: Found %s: %s\n", tmp, value));
+ if (strcmp(value, "Disabled") == 0)
+ {
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: Clearing %s\n", param->name));
+ stp_clear_float_parameter(v, param->name);
+ }
+ }
+ stp_free(tmp);
+ }
+ if (param->p_type == STP_PARAMETER_TYPE_DIMENSION &&
+ !param->read_only && param->is_active && !param->is_mandatory)
+ {
+ size_t bytes = strlen(param->name) + strlen("Enable") + 1;
+ char *tmp = stp_malloc(bytes);
+ const char *value;
+ sprintf(tmp, "Enable%s", param->name);
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: Looking for parameter %s\n", tmp));
+ value = stp_get_string_parameter(v, tmp);
+ if (value)
+ {
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: Found %s: %s\n", tmp, value));
+ if (strcmp(value, "Disabled") == 0)
+ {
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: Clearing %s\n", param->name));
+ stp_clear_dimension_parameter(v, param->name);
+ }
+ }
+ stp_free(tmp);
+ }
+ }
+ stp_parameter_list_destroy(params);
+}
+
+static void
+validate_options(stp_image_t *image)
+{
+ IMAGE *im = (IMAGE *) (image->rep);
+ stp_vars_t *v = im->v;
+ stp_parameter_list_t params = stp_get_parameter_list(v);
+ int nparams = stp_parameter_list_count(params);
+ int i;
+ for (i = 0; i < nparams; i++)
+ {
+ const stp_parameter_t *param = stp_parameter_list_param(params, i);
+ stp_parameter_t desc;
+ stp_describe_parameter(v, param->name, &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_STRING_LIST)
+ {
+ if (!stp_string_list_is_present
+ (desc.bounds.str, stp_get_string_parameter(v, desc.name)))
+ {
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: clearing string %s (%s)\n",
+ desc.name, stp_get_string_parameter(v, desc.name)));
+ stp_clear_string_parameter(v, desc.name);
+ if (desc.is_mandatory)
+ {
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: setting default string %s to %s\n",
+ desc.name, desc.deflt.str));
+ stp_set_string_parameter(v, desc.name, desc.deflt.str);
+ if (strcmp(desc.name, "PageSize") == 0)
+ {
+ const stp_papersize_t *ps =
+ stp_get_papersize_by_name(desc.deflt.str);
+ if (ps->width > 0)
+ {
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: setting page width to %d\n",
+ ps->width));
+ if (ps->width < stp_get_page_width(v))
+ stp_set_page_width(v, ps->width);
+ if (ps->width < stp_get_left(v) + stp_get_width(v))
+ {
+#if 0
+ if (im->width < ps->width)
+ im->width = ps->width;
+#endif
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: setting width to %d\n",
+ ps->width - stp_get_left(v)));
+ stp_set_width(v, ps->width - stp_get_left(v));
+ }
+ }
+ if (ps->height > 0)
+ {
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: setting page height to %d\n",
+ ps->height));
+ if (ps->height < stp_get_page_height(v))
+ stp_set_page_height(v, ps->height);
+ if (ps->height < stp_get_top(v) + stp_get_height(v))
+ {
+#if 0
+ if (im->height < ps->height)
+ im->height = ps->height;
+#endif
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: setting height to %d\n",
+ ps->height - stp_get_top(v)));
+ stp_set_height(v, ps->height - stp_get_top(v));
+ }
+ }
+ }
+ }
+ }
+ }
+ stp_parameter_description_destroy(&desc);
+ }
+ stp_parameter_list_destroy(params);
+}
+
+
+
+int
+main (int argc, char **argv)
+{
+ IjsPageHeader ph;
+ int status;
+ int page = 0;
+ IMAGE img;
+ stp_image_t si;
+ const stp_printer_t *printer = NULL;
+ FILE *f = NULL;
+ int l, t, r, b, w, h;
+ int width, height;
+
+ if (getenv("STP_DEBUG_STARTUP"))
+ while (SDEBUG)
+ ;
+
+ memset(&img, 0, sizeof(img));
+
+ stp_init();
+ version_id = stp_get_version();
+ option_remap_list = stp_string_list_create();
+
+ img.ctx = ijs_server_init();
+ if (img.ctx == NULL)
+ return 1;
+
+ img.v = stp_vars_create();
+ if (img.v == NULL)
+ {
+ ijs_server_done(img.ctx);
+ return 1;
+ }
+ stp_set_top(img.v, 0);
+ stp_set_left(img.v, 0);
+
+ /* Error messages to stderr. */
+ stp_set_errfunc(img.v, gutenprint_errfunc);
+ stp_set_errdata(img.v, stderr);
+
+ /* Printer data goes to file f, but we haven't opened it yet. */
+ stp_set_outfunc(img.v, gutenprint_outfunc);
+ stp_set_outdata(img.v, NULL);
+
+ memset(&si, 0, sizeof(si));
+ si.width = gutenprint_image_width;
+ si.height = gutenprint_image_height;
+ si.get_row = gutenprint_image_get_row;
+ si.get_appname = gutenprint_image_get_appname;
+ si.rep = &img;
+
+ ijs_server_install_status_cb (img.ctx, gutenprint_status_cb, &img);
+ ijs_server_install_list_cb (img.ctx, gutenprint_list_cb, &img);
+ ijs_server_install_enum_cb (img.ctx, gutenprint_enum_cb, &img);
+ ijs_server_install_get_cb (img.ctx, gutenprint_get_cb, &img);
+ ijs_server_install_set_cb(img.ctx, gutenprint_set_cb, &img);
+
+ STP_DEBUG(stp_dbg("ijsgutenprint: about to start\n", img.v));
+
+ do
+ {
+
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: About to get page header\n"));
+ status = ijs_server_get_page_header(img.ctx, &ph);
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: Got page header %d\n", status));
+ if (status)
+ {
+ if (status < 0)
+ fprintf(stderr, _("ERROR: ijsgutenprint: ijs_server_get_page_header failed %d\n"),
+ status);
+ break;
+ }
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: got page header, %d x %d\n",
+ ph.width, ph.height));
+ STP_DEBUG(stp_dbg("ijsgutenprint: have page header\n", img.v));
+
+ status = image_init(&img, &ph);
+ if (status)
+ {
+ fprintf(stderr, _("ERROR: ijsgutenprint: image_init failed %d\n"), status);
+ break;
+ }
+
+ if (page == 0)
+ {
+ if (img.fd)
+ {
+ f = fdopen(img.fd - 1, "wb");
+ if (!f)
+ {
+ fprintf(stderr, _("ERROR: ijsgutenprint: Unable to open file descriptor: %s\n"),
+ strerror(errno));
+ status = -1;
+ break;
+ }
+ }
+ else if (img.filename && strlen(img.filename) > 0)
+ {
+ f = fopen(img.filename, "wb");
+ if (!f)
+ {
+ status = -1;
+ fprintf(stderr, _("ERROR: ijsgutenprint: Unable to open %s: %s\n"), img.filename,
+ strerror(errno));
+ break;
+ }
+ }
+
+ /* Printer data to file */
+ stp_set_outdata(img.v, f);
+
+ printer = stp_get_printer(img.v);
+ if (printer == NULL)
+ {
+ fprintf(stderr, _("ERROR: ijsgutenprint: Unknown printer %s\n"),
+ stp_get_driver(img.v));
+ status = -1;
+ break;
+ }
+ stp_merge_printvars(img.v, stp_printer_get_defaults(printer));
+ }
+
+
+ img.total_bytes = (double) ((ph.n_chan * ph.bps * ph.width + 7) >> 3)
+ * (double) ph.height;
+ img.bytes_left = img.total_bytes;
+
+ stp_set_float_parameter(img.v, "AppGamma", 1.7);
+ stp_get_media_size(img.v, &w, &h);
+ stp_get_imageable_area(img.v, &l, &r, &b, &t);
+ if (l < 0)
+ width = r;
+ else
+ width = r - l;
+ stp_set_width(img.v, width);
+ if (t < 0)
+ height = b;
+ else
+ height = b - t;
+ stp_set_height(img.v, height);
+ stp_set_int_parameter(img.v, "PageNumber", page);
+
+/*
+ * Fix up the duplex/tumble settings stored in the "x_" parameters
+ * If Duplex is "true" then look at "Tumble". If duplex is not "true" or "false"
+ * then just take it (e.g. Duplex=DuplexNoTumble).
+ */
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: x_Duplex=%s\n", safe_get_string_parameter(img.v, "x_Duplex")));
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: x_Tumble=%s\n", safe_get_string_parameter(img.v, "x_Tumble")));
+
+ if (stp_get_string_parameter(img.v, "x_Duplex"))
+ {
+ if (strcmp(stp_get_string_parameter(img.v, "x_Duplex"), "false") == 0)
+ stp_set_string_parameter(img.v, "Duplex", "None");
+ else if (strcmp(stp_get_string_parameter(img.v, "x_Duplex"), "true") == 0)
+ {
+ if (stp_get_string_parameter(img.v, "x_Tumble"))
+ {
+ if (strcmp(stp_get_string_parameter(img.v, "x_Tumble"), "false") == 0)
+ stp_set_string_parameter(img.v, "Duplex", "DuplexNoTumble");
+ else
+ stp_set_string_parameter(img.v, "Duplex", "DuplexTumble");
+ }
+ else /* Tumble missing, assume false */
+ stp_set_string_parameter(img.v, "Duplex", "DuplexNoTumble");
+ }
+ else /* Not true or false */
+ stp_set_string_parameter(img.v, "Duplex", stp_get_string_parameter(img.v, "x_Duplex"));
+ }
+
+/* can I destroy the unused parameters? */
+
+ STP_DEBUG(fprintf(stderr, "ijsgutenprint: Duplex=%s\n", safe_get_string_parameter(img.v, "Duplex")));
+
+ purge_unused_float_parameters(img.v);
+ validate_options(&si);
+ STP_DEBUG(stp_dbg("ijsgutenprint: about to print", img.v));
+ print_messages_as_errors = 1;
+ if (!version_is_ok)
+ {
+ fprintf(stderr, _(version_mismatch), version_id,
+ gutenprint_ppd_version, version_id, gutenprint_ppd_version);
+ status = IJS_ERANGE;
+ break;
+ }
+ else if (stp_verify(img.v))
+ {
+ if (page == 0)
+ stp_start_job(img.v, &si);
+ stp_print(img.v, &si);
+ }
+ else
+ {
+ fprintf(stderr, _("ERROR: ijsgutenprint: Bad parameters; cannot continue!\n"));
+ status = IJS_ERANGE;
+ break;
+ }
+
+ while (img.bytes_left)
+ {
+ status = image_next_row(&img);
+ if (status)
+ {
+ fprintf(stderr, _("ERROR: ijsgutenprint: Get next row failed at %.0f\n"),
+ img.bytes_left);
+ break;
+ }
+ }
+
+ image_finish(&img);
+ page++;
+ }
+ while (status == 0);
+ if (status > 0)
+ stp_end_job(img.v, &si);
+
+ if (f)
+ {
+ fclose(f);
+ }
+
+ if (status > 0)
+ status = 0; /* normal exit */
+
+ ijs_server_done(img.ctx);
+
+ STP_DEBUG(fprintf (stderr, "ijsgutenprint: server exiting with status %d\n", status));
+ return status;
+}
diff --git a/src/gimp/Makefile.am b/src/gimp/Makefile.am
index 297e5de..6541d80 100644
--- a/src/gimp/Makefile.am
+++ b/src/gimp/Makefile.am
@@ -1,4 +1,4 @@
-## $Id: Makefile.am,v 1.18.4.5 2002/11/30 23:17:24 rleigh Exp $
+## $Id: Makefile.am,v 1.35 2004/09/17 18:38:13 rleigh Exp $
## Copyright (C) 2000 Roger Leigh
##
## This program is free software; you can redistribute it and/or modify
@@ -23,37 +23,30 @@ AUTOMAKE_OPTIONS = 1.4 gnu
MAINT_CHARSET = latin1
+include $(top_srcdir)/scripts/global.mk
-## Variables
-AM_CFLAGS = $(GNUCFLAGS)
-INCLUDES = @INCLUDES@ $(GIMP_CFLAGS) $(LIBGIMPPRINT_CFLAGS)
-LIBS = $(INTLLIBS) @LIBS@
-LIBPRINTUT = $(top_builddir)/lib/libprintut.la
+## Variables
-libexecdir = $(gimptool_prefix)/plug-ins
+LOCAL_CPPFLAGS = $(GUTENPRINT_CFLAGS) $(GIMP_CFLAGS)
## Programs
-GIMP_BIN = print
-
-gimp_plug_in_PROGRAMS = @GIMP_BIN@
-
-EXTRA_PROGRAMS = print
+if BUILD_GIMP
+gimp_plug_in_PROGRAMS = print
+endif
print_SOURCES = \
print-image-gimp.c \
print-intl.h \
print.c \
- gimp_color_window.c \
- gimp_main_window.c \
print_gimp.h
-print_LDADD = $(LIBPRINTUT) $(GIMP_LIBS) $(LIBGIMPPRINT_LIBS)
-print_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
+
+print_LDADD = $(GIMP_LIBS) $(GUTENPRINTUI_LIBS)
+print_DEPENDENCIES = $(GUTENPRINTUI_LIBS) $(GUTENPRINT_LIBS)
## Clean
-CLEANFILES = $(EXTRA_PROGRAMS)
MAINTAINERCLEANFILES = Makefile.in
diff --git a/src/gimp/Makefile.in b/src/gimp/Makefile.in
index d257b80..8282702 100644
--- a/src/gimp/Makefile.in
+++ b/src/gimp/Makefile.in
@@ -1,6 +1,8 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
-# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -10,105 +12,158 @@
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
+@SET_MAKE@
-SHELL = @SHELL@
+# Variables
+
+SOURCES = $(print_SOURCES)
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-
-DESTDIR =
-
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
-
top_builddir = ../..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-transform = @program_transform_name@
-
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
-host_alias = @host_alias@
+build_triplet = @build@
host_triplet = @host@
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(top_srcdir)/scripts/global.mk
+@BUILD_GIMP_TRUE@gimp_plug_in_PROGRAMS = print$(EXEEXT)
+subdir = src/gimp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gimp.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/stp.m4 $(top_srcdir)/m4/stp_cups.m4 \
+ $(top_srcdir)/m4/stp_gimp.m4 $(top_srcdir)/m4/stp_option.m4 \
+ $(top_srcdir)/m4/stp_release.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(gimp_plug_indir)"
+gimp_plug_inPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(gimp_plug_in_PROGRAMS)
+am_print_OBJECTS = print-image-gimp.$(OBJEXT) print.$(OBJEXT)
+print_OBJECTS = $(am_print_OBJECTS)
+am__DEPENDENCIES_1 =
+am__DEPENDENCIES_2 = \
+ $(top_builddir)/src/gutenprintui/libgutenprintui.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(print_SOURCES)
+DIST_SOURCES = $(print_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
-AS = @AS@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
-BISON_PROG = @BISON_PROG@
-BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
-CATALOGS = @CATALOGS@
-CATOBJEXT = @CATOBJEXT@
+BUILD_CUPS_FALSE = @BUILD_CUPS_FALSE@
+BUILD_CUPS_PPDS_FALSE = @BUILD_CUPS_PPDS_FALSE@
+BUILD_CUPS_PPDS_TRUE = @BUILD_CUPS_PPDS_TRUE@
+BUILD_CUPS_TRUE = @BUILD_CUPS_TRUE@
+BUILD_ESCPUTIL_FALSE = @BUILD_ESCPUTIL_FALSE@
+BUILD_ESCPUTIL_TRUE = @BUILD_ESCPUTIL_TRUE@
+BUILD_FOOMATIC_3_FALSE = @BUILD_FOOMATIC_3_FALSE@
+BUILD_FOOMATIC_3_TRUE = @BUILD_FOOMATIC_3_TRUE@
+BUILD_FOOMATIC_FALSE = @BUILD_FOOMATIC_FALSE@
+BUILD_FOOMATIC_TRUE = @BUILD_FOOMATIC_TRUE@
+BUILD_GENPPD_STATIC_FALSE = @BUILD_GENPPD_STATIC_FALSE@
+BUILD_GENPPD_STATIC_TRUE = @BUILD_GENPPD_STATIC_TRUE@
+BUILD_GHOSTSCRIPT_FALSE = @BUILD_GHOSTSCRIPT_FALSE@
+BUILD_GHOSTSCRIPT_TRUE = @BUILD_GHOSTSCRIPT_TRUE@
+BUILD_GIMP2_FALSE = @BUILD_GIMP2_FALSE@
+BUILD_GIMP2_TRUE = @BUILD_GIMP2_TRUE@
+BUILD_GIMP_FALSE = @BUILD_GIMP_FALSE@
+BUILD_GIMP_TRUE = @BUILD_GIMP_TRUE@
+BUILD_LIBGUTENPRINTUI2_FALSE = @BUILD_LIBGUTENPRINTUI2_FALSE@
+BUILD_LIBGUTENPRINTUI2_TRUE = @BUILD_LIBGUTENPRINTUI2_TRUE@
+BUILD_LIBGUTENPRINTUI_FALSE = @BUILD_LIBGUTENPRINTUI_FALSE@
+BUILD_LIBGUTENPRINTUI_TRUE = @BUILD_LIBGUTENPRINTUI_TRUE@
+BUILD_MODULES_FALSE = @BUILD_MODULES_FALSE@
+BUILD_MODULES_TRUE = @BUILD_MODULES_TRUE@
+BUILD_TESTPATTERN_FALSE = @BUILD_TESTPATTERN_FALSE@
+BUILD_TESTPATTERN_TRUE = @BUILD_TESTPATTERN_TRUE@
+BUILD_TEST_FALSE = @BUILD_TEST_FALSE@
+BUILD_TEST_TRUE = @BUILD_TEST_TRUE@
+BUILD_TRANSLATED_CUPS_PPDS_FALSE = @BUILD_TRANSLATED_CUPS_PPDS_FALSE@
+BUILD_TRANSLATED_CUPS_PPDS_TRUE = @BUILD_TRANSLATED_CUPS_PPDS_TRUE@
CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
CONVERT = @CONVERT@
-CUPS_BACKEND_BIN = @CUPS_BACKEND_BIN@
-CUPS_BIN = @CUPS_BIN@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
CUPS_CFLAGS = @CUPS_CFLAGS@
-CUPS_CONF = @CUPS_CONF@
CUPS_CONFIG = @CUPS_CONFIG@
-CUPS_FILTER_BIN = @CUPS_FILTER_BIN@
-CUPS_INSTALL = @CUPS_INSTALL@
CUPS_LIBS = @CUPS_LIBS@
-CUPS_MAN = @CUPS_MAN@
-CUPS_NOINST_BIN = @CUPS_NOINST_BIN@
-CUPS_PKG = @CUPS_PKG@
+CUPS_PPDS_AT_TOP_LEVEL_FALSE = @CUPS_PPDS_AT_TOP_LEVEL_FALSE@
+CUPS_PPDS_AT_TOP_LEVEL_TRUE = @CUPS_PPDS_AT_TOP_LEVEL_TRUE@
CUPS_PPD_PS_LEVEL = @CUPS_PPD_PS_LEVEL@
-DATADIRNAME = @DATADIRNAME@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
DB2HTML = @DB2HTML@
DB2PDF = @DB2PDF@
DB2PS = @DB2PS@
-DLLTOOL = @DLLTOOL@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIALOG = @DIALOG@
+DOXYGEN = @DOXYGEN@
DVIPDF = @DVIPDF@
DVIPS = @DVIPS@
ECHO = @ECHO@
-ESCPUTIL_BIN = @ESCPUTIL_BIN@
-ESCPUTIL_MAN = @ESCPUTIL_MAN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
EXEEXT = @EXEEXT@
-FOOMATIC_3_NOINST_BIN = @FOOMATIC_3_NOINST_BIN@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+FIND = @FIND@
FOOMATIC_CONFIGURE = @FOOMATIC_CONFIGURE@
-FOOMATIC_INSTALL = @FOOMATIC_INSTALL@
FOOMATIC_KITLOAD = @FOOMATIC_KITLOAD@
-FOOMATIC_NOINST_BIN = @FOOMATIC_NOINST_BIN@
-FOOMATIC_OLDIDS_NOINST_BIN = @FOOMATIC_OLDIDS_NOINST_BIN@
FOOMATIC_PPDFILE = @FOOMATIC_PPDFILE@
-GENCAT = @GENCAT@
-GIMPPRINT_BINARY_AGE = @GIMPPRINT_BINARY_AGE@
-GIMPPRINT_CFLAGS = @GIMPPRINT_CFLAGS@
-GIMPPRINT_CURRENT_INTERFACE = @GIMPPRINT_CURRENT_INTERFACE@
-GIMPPRINT_DEPLIBS = @GIMPPRINT_DEPLIBS@
-GIMPPRINT_INTERFACE_AGE = @GIMPPRINT_INTERFACE_AGE@
-GIMPPRINT_LIBS = @GIMPPRINT_LIBS@
-GIMPPRINT_MAJOR_VERSION = @GIMPPRINT_MAJOR_VERSION@
-GIMPPRINT_MICRO_VERSION = @GIMPPRINT_MICRO_VERSION@
-GIMPPRINT_MINOR_VERSION = @GIMPPRINT_MINOR_VERSION@
-GIMPPRINT_VERSION = @GIMPPRINT_VERSION@
+GENPPD_LIBS = @GENPPD_LIBS@
+GIMP2_CFLAGS = @GIMP2_CFLAGS@
+GIMP2_LIBS = @GIMP2_LIBS@
GIMPTOOL = @GIMPTOOL@
+GIMPTOOL2_CHECK = @GIMPTOOL2_CHECK@
GIMPTOOL_CHECK = @GIMPTOOL_CHECK@
GIMP_CFLAGS = @GIMP_CFLAGS@
GIMP_CFLAGS_NOUI = @GIMP_CFLAGS_NOUI@
@@ -116,196 +171,272 @@ GIMP_DATA_DIR = @GIMP_DATA_DIR@
GIMP_LIBS = @GIMP_LIBS@
GIMP_LIBS_NOUI = @GIMP_LIBS_NOUI@
GIMP_PLUGIN_DIR = @GIMP_PLUGIN_DIR@
-GLIBC21 = @GLIBC21@
-GMOFILES = @GMOFILES@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_CONFIG = @GLIB_CONFIG@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
GMSGFMT = @GMSGFMT@
GNUCFLAGS = @GNUCFLAGS@
-IJS_BIN = @IJS_BIN@
+GTK2_CFLAGS = @GTK2_CFLAGS@
+GTK2_LIBS = @GTK2_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+GUTENPRINTUI2_BINARY_AGE = @GUTENPRINTUI2_BINARY_AGE@
+GUTENPRINTUI2_CFLAGS = @GUTENPRINTUI2_CFLAGS@
+GUTENPRINTUI2_CURRENT_INTERFACE = @GUTENPRINTUI2_CURRENT_INTERFACE@
+GUTENPRINTUI2_INTERFACE_AGE = @GUTENPRINTUI2_INTERFACE_AGE@
+GUTENPRINTUI2_LIBDEPS = @GUTENPRINTUI2_LIBDEPS@
+GUTENPRINTUI2_LIBS = $(top_builddir)/src/gutenprintui2/libgutenprintui2.la
+GUTENPRINTUI2_VERSION = @GUTENPRINTUI2_VERSION@
+GUTENPRINTUI_BINARY_AGE = @GUTENPRINTUI_BINARY_AGE@
+GUTENPRINTUI_CFLAGS = @GUTENPRINTUI_CFLAGS@
+GUTENPRINTUI_CURRENT_INTERFACE = @GUTENPRINTUI_CURRENT_INTERFACE@
+GUTENPRINTUI_INTERFACE_AGE = @GUTENPRINTUI_INTERFACE_AGE@
+GUTENPRINTUI_LIBDEPS = @GUTENPRINTUI_LIBDEPS@
+GUTENPRINTUI_LIBS = $(top_builddir)/src/gutenprintui/libgutenprintui.la
+GUTENPRINTUI_VERSION = @GUTENPRINTUI_VERSION@
+GUTENPRINT_BINARY_AGE = @GUTENPRINT_BINARY_AGE@
+GUTENPRINT_CFLAGS = @GUTENPRINT_CFLAGS@
+GUTENPRINT_CURRENT_INTERFACE = @GUTENPRINT_CURRENT_INTERFACE@
+GUTENPRINT_INTERFACE_AGE = @GUTENPRINT_INTERFACE_AGE@
+GUTENPRINT_LIBDEPS = @GUTENPRINT_LIBDEPS@
+
+# Libraries
+GUTENPRINT_LIBS = $(top_builddir)/src/main/libgutenprint.la
+GUTENPRINT_MAJOR_VERSION = @GUTENPRINT_MAJOR_VERSION@
+GUTENPRINT_MICRO_VERSION = @GUTENPRINT_MICRO_VERSION@
+GUTENPRINT_MINOR_VERSION = @GUTENPRINT_MINOR_VERSION@
+GUTENPRINT_VERSION = @GUTENPRINT_VERSION@
IJS_CFLAGS = @IJS_CFLAGS@
IJS_CONFIG = @IJS_CONFIG@
-IJS_INSTALL = @IJS_INSTALL@
IJS_LIBS = @IJS_LIBS@
-INSTOBJEXT = @INSTOBJEXT@
-INTLBISON = @INTLBISON@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SAMPLES_FALSE = @INSTALL_SAMPLES_FALSE@
+INSTALL_SAMPLES_TRUE = @INSTALL_SAMPLES_TRUE@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_USER_GUIDE_FALSE = @INSTALL_USER_GUIDE_FALSE@
+INSTALL_USER_GUIDE_TRUE = @INSTALL_USER_GUIDE_TRUE@
INTLLIBS = @INTLLIBS@
-INTLOBJS = @INTLOBJS@
-INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDFLAGS = @LDFLAGS@
LEX = @LEX@
-LIBGIMPPRINT_LIBS = @LIBGIMPPRINT_LIBS@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
LIBICONV = @LIBICONV@
-LIBM = @LIBM@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
LIBREADLINE_DEPS = @LIBREADLINE_DEPS@
+LIBS = $(INTLLIBS) @LIBS@
LIBTOOL = @LIBTOOL@
LIBTOOL_DEPS = @LIBTOOL_DEPS@
LN_S = @LN_S@
LTALLOCA = @LTALLOCA@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
-LT_AGE = @LT_AGE@
-LT_CURRENT = @LT_CURRENT@
-LT_RELEASE = @LT_RELEASE@
-LT_REVISION = @LT_REVISION@
MAINT = @MAINT@
MAINTAINER_CFLAGS = @MAINTAINER_CFLAGS@
-MAIN_BIN = @MAIN_BIN@
-MAIN_DAT = @MAIN_DAT@
-MAIN_MAN = @MAIN_MAN@
-MAIN_SCR = @MAIN_SCR@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
MKINSTALLDIRS = @MKINSTALLDIRS@
MSGFMT = @MSGFMT@
-OBJDUMP = @OBJDUMP@
+MSGMERGE = @MSGMERGE@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
PLUG_IN_PATH = @PLUG_IN_PATH@
-POFILES = @POFILES@
POSUB = @POSUB@
-PRINT_VASPRINTF = @PRINT_VASPRINTF@
RANLIB = @RANLIB@
RELEASE_DATE = @RELEASE_DATE@
RM = @RM@
-SAMPLE_IMAGES = @SAMPLE_IMAGES@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
STRIP = @STRIP@
-TESTPATTERN_BIN = @TESTPATTERN_BIN@
-TEST_BIN = @TEST_BIN@
TEXI2HTML = @TEXI2HTML@
-USER_GUIDE = @USER_GUIDE@
-USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_LEVEL3_PS_FALSE = @USE_LEVEL3_PS_FALSE@
+USE_LEVEL3_PS_TRUE = @USE_LEVEL3_PS_TRUE@
USE_NLS = @USE_NLS@
+USE_NLS_FALSE = @USE_NLS_FALSE@
+USE_NLS_TRUE = @USE_NLS_TRUE@
VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
YACC = @YACC@
-YACC_PROG = @YACC_PROG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
cups_bindir = @cups_bindir@
cups_conf_datadir = @cups_conf_datadir@
cups_conf_serverbin = @cups_conf_serverbin@
cups_conf_serverroot = @cups_conf_serverroot@
cups_exec_prefix = @cups_exec_prefix@
cups_prefix = @cups_prefix@
+cups_sbindir = @cups_sbindir@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+gimp2_plug_indir = @gimp2_plug_indir@
gimp_plug_indir = @gimp_plug_indir@
-gimpprint_cflags = @gimpprint_cflags@
-gimpprint_libs = @gimpprint_libs@
-
+gutenprint_cflags = @gutenprint_cflags@
+gutenprint_libs = @gutenprint_libs@
+gutenprintui2_cflags = @gutenprintui2_cflags@
+gutenprintui2_libs = @gutenprintui2_libs@
+gutenprintui_cflags = @gutenprintui_cflags@
+gutenprintui_libs = @gutenprintui_libs@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
AUTOMAKE_OPTIONS = 1.4 gnu
-
MAINT_CHARSET = latin1
-
-AM_CFLAGS = $(GNUCFLAGS)
-INCLUDES = @INCLUDES@ $(GIMP_CFLAGS) $(LIBGIMPPRINT_CFLAGS)
-LIBS = $(INTLLIBS) @LIBS@
-LIBPRINTUT = $(top_builddir)/lib/libprintut.la
-
-libexecdir = $(gimptool_prefix)/plug-ins
-
-GIMP_BIN = print
-
-gimp_plug_in_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 = $(LIBPRINTUT) $(GIMP_LIBS) $(LIBGIMPPRINT_LIBS)
-print_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
-
-CLEANFILES = $(EXTRA_PROGRAMS)
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(LOCAL_CPPFLAGS) $(GNUCFLAGS)
+LOCAL_CPPFLAGS = $(GUTENPRINT_CFLAGS) $(GIMP_CFLAGS)
+print_SOURCES = \
+ print-image-gimp.c \
+ print-intl.h \
+ print.c \
+ print_gimp.h
+
+print_LDADD = $(GIMP_LIBS) $(GUTENPRINTUI_LIBS)
+print_DEPENDENCIES = $(GUTENPRINTUI_LIBS) $(GUTENPRINT_LIBS)
MAINTAINERCLEANFILES = Makefile.in
-mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
-CONFIG_HEADER = ../../config.h
-CONFIG_CLEAN_FILES =
-gimp_plug_in_PROGRAMS = @GIMP_BIN@
-PROGRAMS = $(gimp_plug_in_PROGRAMS)
-
-
-DEFS = @DEFS@ -I. -I$(srcdir) -I../..
-CPPFLAGS = @CPPFLAGS@
-LDFLAGS = @LDFLAGS@
-print_OBJECTS = print-image-gimp.$(OBJEXT) print.$(OBJEXT) \
-gimp_color_window.$(OBJEXT) gimp_main_window.$(OBJEXT)
-print_LDFLAGS =
-CFLAGS = @CFLAGS@
-COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-DIST_COMMON = Makefile.am Makefile.in
-
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+all: all-am
-TAR = tar
-GZIP_ENV = --best
-SOURCES = $(print_SOURCES)
-OBJECTS = $(print_OBJECTS)
-
-all: all-redirect
.SUFFIXES:
-.SUFFIXES: .S .c .lo .o .obj .s
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/gimp/Makefile
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-
-mostlyclean-gimp_plug_inPROGRAMS:
-
-clean-gimp_plug_inPROGRAMS:
- -test -z "$(gimp_plug_in_PROGRAMS)" || rm -f $(gimp_plug_in_PROGRAMS)
-
-distclean-gimp_plug_inPROGRAMS:
-
-maintainer-clean-gimp_plug_inPROGRAMS:
-
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/scripts/global.mk $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/gimp/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/gimp/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
install-gimp_plug_inPROGRAMS: $(gimp_plug_in_PROGRAMS)
@$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(gimp_plug_indir)
+ test -z "$(gimp_plug_indir)" || $(mkdir_p) "$(DESTDIR)$(gimp_plug_indir)"
@list='$(gimp_plug_in_PROGRAMS)'; for p in $$list; do \
- if test -f $$p; then \
- echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(gimp_plug_indir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
- $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(gimp_plug_indir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(gimp_plug_inPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(gimp_plug_indir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(gimp_plug_inPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(gimp_plug_indir)/$$f" || exit 1; \
else :; fi; \
done
uninstall-gimp_plug_inPROGRAMS:
@$(NORMAL_UNINSTALL)
- list='$(gimp_plug_in_PROGRAMS)'; for p in $$list; do \
- rm -f $(DESTDIR)$(gimp_plug_indir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ @list='$(gimp_plug_in_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(gimp_plug_indir)/$$f'"; \
+ rm -f "$(DESTDIR)$(gimp_plug_indir)/$$f"; \
done
-.c.o:
- $(COMPILE) -c $<
-
-# FIXME: We should only use cygpath when building on Windows,
-# and only if it is available.
-.c.obj:
- $(COMPILE) -c `cygpath -w $<`
-
-.s.o:
- $(COMPILE) -c $<
-
-.S.o:
- $(COMPILE) -c $<
+clean-gimp_plug_inPROGRAMS:
+ @list='$(gimp_plug_in_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+print$(EXEEXT): $(print_OBJECTS) $(print_DEPENDENCIES)
+ @rm -f print$(EXEEXT)
+ $(LINK) $(print_LDFLAGS) $(print_OBJECTS) $(print_LDADD) $(LIBS)
mostlyclean-compile:
- -rm -f *.o core *.core
-rm -f *.$(OBJEXT)
-clean-compile:
-
distclean-compile:
-rm -f *.tab.c
-maintainer-clean-compile:
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-image-gimp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Po@am__quote@
-.c.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
-.s.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
-.S.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.c.lo:
+@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
mostlyclean-libtool:
-rm -f *.lo
@@ -314,155 +445,200 @@ clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-
-maintainer-clean-libtool:
-
-print$(EXEEXT): $(print_OBJECTS) $(print_DEPENDENCIES)
- @rm -f print$(EXEEXT)
- $(LINK) $(print_LDFLAGS) $(print_OBJECTS) $(print_LDADD) $(LIBS)
-
+ -rm -f libtool
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
tags: TAGS
-ID: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
- here=`pwd` && cd $(srcdir) \
- && mkid -f$$here/ID $$unique $(LISP)
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
- || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
-mostlyclean-tags:
-
-clean-tags:
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
- -rm -f TAGS ID
-
-maintainer-clean-tags:
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-
-subdir = src/gimp
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
- @for file in $(DISTFILES); do \
- d=$(srcdir); \
+ $(mkdir_p) $(distdir)/../../scripts
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
- || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $$d/$$file $(distdir)/$$file || :; \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
fi; \
done
-gimp_color_window.o: gimp_color_window.c ../../config.h \
- ../../lib/libprintut.h ../../lib/xmalloc.h print_gimp.h \
- ../../include/gimp-print/gimp-print.h print-intl.h \
- ../../include/gimp-print/gimp-print-intl.h
-gimp_main_window.o: gimp_main_window.c ../../config.h \
- ../../lib/libprintut.h ../../lib/xmalloc.h print_gimp.h \
- ../../include/gimp-print/gimp-print.h print-intl.h \
- ../../include/gimp-print/gimp-print-intl.h
-print-image-gimp.o: print-image-gimp.c ../../config.h \
- ../../lib/libprintut.h ../../lib/xmalloc.h print_gimp.h \
- ../../include/gimp-print/gimp-print.h print-intl.h \
- ../../include/gimp-print/gimp-print-intl.h
-print.o: print.c ../../config.h ../../lib/libprintut.h \
- ../../lib/xmalloc.h print_gimp.h \
- ../../include/gimp-print/gimp-print.h print-intl.h \
- ../../include/gimp-print/gimp-print-intl.h
-
-info-am:
-info: info-am
-dvi-am:
-dvi: dvi-am
check-am: all-am
check: check-am
-installcheck-am:
-installcheck: installcheck-am
-install-exec-am:
+all-am: Makefile $(PROGRAMS)
+installdirs:
+ for dir in "$(DESTDIR)$(gimp_plug_indir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
install-exec: install-exec-am
-
-install-data-am: install-gimp_plug_inPROGRAMS
install-data: install-data-am
+uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-am
-uninstall-am: uninstall-gimp_plug_inPROGRAMS
-uninstall: uninstall-am
-all-am: Makefile $(PROGRAMS)
-all-redirect: all-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs:
- $(mkinstalldirs) $(DESTDIR)$(gimp_plug_indir)
-
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
- -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
- -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-mostlyclean-am: mostlyclean-gimp_plug_inPROGRAMS mostlyclean-compile \
- mostlyclean-libtool mostlyclean-tags \
- mostlyclean-generic
+clean: clean-am
-mostlyclean: mostlyclean-am
+clean-am: clean-generic clean-gimp_plug_inPROGRAMS clean-libtool \
+ mostlyclean-am
-clean-am: clean-gimp_plug_inPROGRAMS clean-compile clean-libtool \
- clean-tags clean-generic mostlyclean-am
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
-clean: clean-am
+dvi: dvi-am
-distclean-am: distclean-gimp_plug_inPROGRAMS distclean-compile \
- distclean-libtool distclean-tags distclean-generic \
- clean-am
- -rm -f libtool
+dvi-am:
-distclean: distclean-am
+html: html-am
-maintainer-clean-am: maintainer-clean-gimp_plug_inPROGRAMS \
- maintainer-clean-compile maintainer-clean-libtool \
- maintainer-clean-tags maintainer-clean-generic \
- distclean-am
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
+info: info-am
+
+info-am:
+
+install-data-am: install-gimp_plug_inPROGRAMS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
-.PHONY: mostlyclean-gimp_plug_inPROGRAMS distclean-gimp_plug_inPROGRAMS \
-clean-gimp_plug_inPROGRAMS maintainer-clean-gimp_plug_inPROGRAMS \
-uninstall-gimp_plug_inPROGRAMS install-gimp_plug_inPROGRAMS \
-mostlyclean-compile distclean-compile clean-compile \
-maintainer-clean-compile mostlyclean-libtool distclean-libtool \
-clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
-distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
-dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
-install-exec install-data-am install-data install-am install \
-uninstall-am uninstall all-redirect all-am all installdirs \
-mostlyclean-generic distclean-generic clean-generic \
-maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+uninstall-am: uninstall-gimp_plug_inPROGRAMS uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-gimp_plug_inPROGRAMS clean-libtool ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-gimp_plug_inPROGRAMS install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-gimp_plug_inPROGRAMS \
+ uninstall-info-am
@SET_MAKE@
+export STP_MODULE_PATH = $(top_builddir)/src/main/.libs:$(top_builddir)/src/main
+export STP_DATA_PATH = $(top_srcdir)/src/main
+
+# Rules
+
+$(top_builddir)/src/main/libgutenprint.la:
+ cd $(top_builddir)/src/main; \
+ $(MAKE)
+
+$(top_builddir)/src/gutenprintui/libgutenprintui.la:
+ cd $(top_builddir)/src/gutenprintui; \
+ $(MAKE)
+
+$(top_builddir)/src/gutenprintui2/libgutenprintui2.la:
+ cd $(top_builddir)/src/gutenprintui2; \
+ $(MAKE)
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
diff --git a/src/gimp/gimp_color_window.c b/src/gimp/gimp_color_window.c
deleted file mode 100644
index 418f4f5..0000000
--- a/src/gimp/gimp_color_window.c
+++ /dev/null
@@ -1,581 +0,0 @@
-/*
- * "$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 <config.h>
-#endif
-#include "../../lib/libprintut.h"
-
-#include "print_gimp.h"
-
-#include "print-intl.h"
-#include <string.h>
-
-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
deleted file mode 100644
index 538f7e3..0000000
--- a/src/gimp/gimp_main_window.c
+++ /dev/null
@@ -1,3314 +0,0 @@
-/*
- * "$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 <config.h>
-#endif
-#include "../../lib/libprintut.h"
-
-#define MAX_PREVIEW_PPI (40)
-
-#include "print_gimp.h"
-
-#include "print-intl.h"
-#include <string.h>
-
-/*
- * 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
index f10bcc3..d630931 100644
--- a/src/gimp/print-image-gimp.c
+++ b/src/gimp/print-image-gimp.c
@@ -1,5 +1,5 @@
/*
- * "$Id: print-image-gimp.c,v 1.5 2001/07/28 01:42:25 rlk Exp $"
+ * "$Id: print-image-gimp.c,v 1.13 2004/05/09 16:06:09 rleigh Exp $"
*
* Print plug-in for the GIMP.
*
@@ -25,7 +25,7 @@
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#include "../../lib/libprintut.h"
+#include <string.h>
#include "print_gimp.h"
@@ -82,60 +82,101 @@ typedef struct
/* 5: Flip horizontally about the vertical centre-line of the image */
int mirror; /* Set if mirroring rows end-for-end. */
+ gint32 image_ID;
+ gint32 ncolors;
+ gint32 real_bpp;
+ GimpImageBaseType base_type;
+ guchar *cmap;
+ guchar *alpha_table;
+ guchar *tmp;
+ gint last_printed_percent;
+ gint initialized;
} 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 void Image_conclude(stp_image_t *image);
static stp_image_status_t Image_get_row(stp_image_t *image,
- unsigned char *data, int row);
+ unsigned char *data,
+ size_t byte_limit, 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 =
+static void Image_transpose(stpui_image_t *image);
+static void Image_hflip(stpui_image_t *image);
+static void Image_vflip(stpui_image_t *image);
+static void Image_rotate_ccw(stpui_image_t *image);
+static void Image_rotate_cw(stpui_image_t *image);
+static void Image_rotate_180(stpui_image_t *image);
+static void Image_crop(stpui_image_t *image, int, int, int, int);
+
+static stpui_image_t theImage =
{
- Image_init,
- Image_reset,
+ {
+ Image_init,
+ Image_reset,
+ Image_width,
+ Image_height,
+ Image_get_row,
+ Image_get_appname,
+ Image_conclude,
+ NULL,
+ },
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
+ Image_crop
};
-stp_image_t *
-Image_GimpDrawable_new(GimpDrawable *drawable)
+static void
+compute_alpha_table(Gimp_Image_t *image)
{
- Gimp_Image_t *i = xmalloc(sizeof(Gimp_Image_t));
- i->drawable = drawable;
- gimp_pixel_rgn_init(&(i->rgn), drawable, 0, 0,
+ unsigned val, alpha;
+ image->alpha_table = stp_malloc(65536 * sizeof(unsigned char));
+ for (val = 0; val < 256; val++)
+ for (alpha = 0; alpha < 256; alpha++)
+ image->alpha_table[(val * 256) + alpha] =
+ val * alpha / 255 + 255 - alpha;
+}
+
+static inline unsigned char
+alpha_lookup(Gimp_Image_t *image, int val, int alpha)
+{
+ return image->alpha_table[(val * 256) + alpha];
+}
+
+stpui_image_t *
+Image_GimpDrawable_new(GimpDrawable *drawable, gint32 image_ID)
+{
+ Gimp_Image_t *im = stp_malloc(sizeof(Gimp_Image_t));
+ memset(im, 0, sizeof(Gimp_Image_t));
+ im->drawable = drawable;
+ gimp_pixel_rgn_init(&(im->rgn), drawable, 0, 0,
drawable->width, drawable->height, FALSE, FALSE);
- theImage.rep = i;
- theImage.reset(&theImage);
+ im->image_ID = image_ID;
+ im->base_type = gimp_image_base_type(image_ID);
+ im->initialized = 0;
+ theImage.im.rep = im;
+ theImage.im.reset(&(theImage.im));
+ switch (im->base_type)
+ {
+ case GIMP_INDEXED:
+ im->cmap = gimp_image_get_cmap(image_ID, &(im->ncolors));
+ im->real_bpp = 3;
+ break;
+ case GIMP_GRAY:
+ im->real_bpp = 1;
+ break;
+ case GIMP_RGB:
+ im->real_bpp = 3;
+ break;
+ }
+ if (im->drawable->bpp == 2 || im->drawable->bpp == 4)
+ compute_alpha_table(im);
return &theImage;
}
@@ -148,54 +189,174 @@ Image_init(stp_image_t *image)
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;
+ Gimp_Image_t *im = (Gimp_Image_t *) (image->rep);
+ im->columns = FALSE;
+ im->ox = 0;
+ im->oy = 0;
+ im->increment = 1;
+ im->w = im->drawable->width;
+ im->h = im->drawable->height;
+ im->mirror = FALSE;
+}
+
+static int
+Image_width(stp_image_t *image)
+{
+ Gimp_Image_t *im = (Gimp_Image_t *) (image->rep);
+ return im->w;
+}
+
+static int
+Image_height(stp_image_t *image)
+{
+ Gimp_Image_t *im = (Gimp_Image_t *) (image->rep);
+ return im->h;
+}
+
+static stp_image_status_t
+Image_get_row(stp_image_t *image, unsigned char *data, size_t byte_limit,
+ int row)
+{
+ Gimp_Image_t *im = (Gimp_Image_t *) (image->rep);
+ int last_printed_percent;
+ guchar *inter;
+ if (!im->initialized)
+ {
+ gimp_progress_init(_("Printing..."));
+ switch (im->base_type)
+ {
+ case GIMP_INDEXED:
+ im->tmp = stp_malloc(im->drawable->bpp * im->w);
+ break;
+ case GIMP_GRAY:
+ if (im->drawable->bpp == 2)
+ im->tmp = stp_malloc(im->drawable->bpp * im->w);
+ break;
+ case GIMP_RGB:
+ if (im->drawable->bpp == 4)
+ im->tmp = stp_malloc(im->drawable->bpp * im->w);
+ break;
+ }
+ im->initialized = 1;
+ }
+ if (im->tmp)
+ inter = im->tmp;
+ else
+ inter = data;
+ if (im->columns)
+ gimp_pixel_rgn_get_col(&(im->rgn), inter,
+ im->oy + row * im->increment, im->ox, im->w);
+ else
+ gimp_pixel_rgn_get_row(&(im->rgn), inter,
+ im->ox, im->oy + row * im->increment, im->w);
+ if (im->cmap)
+ {
+ int i;
+ if (im->alpha_table)
+ {
+ for (i = 0; i < im->w; i++)
+ {
+ int j;
+ for (j = 0; j < 3; j++)
+ {
+ gint32 tval = im->cmap[(3 * inter[2 * i]) + j];
+ data[(3 * i) + j] = alpha_lookup(im, tval,
+ inter[(2 * i) + 1]);
+ }
+
+ }
+ }
+ else
+ {
+ for (i = 0; i < im->w; i++)
+ {
+ data[(3 * i) + 0] = im->cmap[(3 * inter[i]) + 0];
+ data[(3 * i) + 1] = im->cmap[(3 * inter[i]) + 1];
+ data[(3 * i) + 2] = im->cmap[(3 * inter[i]) + 2];
+ }
+ }
+ }
+ else if (im->alpha_table)
+ {
+ int i;
+ for (i = 0; i < im->w; i++)
+ {
+ int j;
+ for (j = 0; j < im->real_bpp; j++)
+ {
+ gint32 tval = inter[(i * im->drawable->bpp) + j];
+ data[(i * im->real_bpp) + j] =
+ alpha_lookup(im, tval,
+ inter[((i + 1) * im->drawable->bpp) - 1]);
+ }
+
+ }
+ }
+ if (im->mirror)
+ {
+ /* Flip row -- probably inefficiently */
+ int f;
+ int l;
+ int b = im->real_bpp;
+ for (f = 0, l = im->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;
+ }
+ }
+ }
+ last_printed_percent = row * 100 / im->h;
+ if (last_printed_percent > im->last_printed_percent)
+ {
+ gimp_progress_update((double) row / (double) im->h);
+ im->last_printed_percent = last_printed_percent;
+ }
+ return STP_IMAGE_STATUS_OK;
}
static void
-Image_transpose(stp_image_t *image)
+Image_transpose(stpui_image_t *image)
{
- Gimp_Image_t *i = (Gimp_Image_t *) (image->rep);
+ Gimp_Image_t *im = (Gimp_Image_t *) (image->im.rep);
int tmp;
- if (i->mirror) i->ox += i->w - 1;
+ if (im->mirror) im->ox += im->w - 1;
- i->columns = !i->columns;
+ im->columns = !im->columns;
- tmp = i->ox;
- i->ox = i->oy;
- i->oy = tmp;
+ tmp = im->ox;
+ im->ox = im->oy;
+ im->oy = tmp;
- tmp = i->mirror;
- i->mirror = i->increment < 0;
- i->increment = tmp ? -1 : 1;
+ tmp = im->mirror;
+ im->mirror = im->increment < 0;
+ im->increment = tmp ? -1 : 1;
- tmp = i->w;
- i->w = i->h;
- i->h = tmp;
+ tmp = im->w;
+ im->w = im->h;
+ im->h = tmp;
- if (i->mirror) i->ox -= i->w - 1;
+ if (im->mirror) im->ox -= im->w - 1;
}
static void
-Image_hflip(stp_image_t *image)
+Image_hflip(stpui_image_t *image)
{
- Gimp_Image_t *i = (Gimp_Image_t *) (image->rep);
- i->mirror = !i->mirror;
+ Gimp_Image_t *im = (Gimp_Image_t *) (image->im.rep);
+ im->mirror = !im->mirror;
}
static void
-Image_vflip(stp_image_t *image)
+Image_vflip(stpui_image_t *image)
{
- Gimp_Image_t *i = (Gimp_Image_t *) (image->rep);
- i->oy += (i->h-1) * i->increment;
- i->increment = -i->increment;
+ Gimp_Image_t *im = (Gimp_Image_t *) (image->im.rep);
+ im->oy += (im->h-1) * im->increment;
+ im->increment = -im->increment;
}
/*
@@ -206,17 +367,17 @@ Image_vflip(stp_image_t *image)
*/
static void
-Image_crop(stp_image_t *image, int left, int top, int right, int bottom)
+Image_crop(stpui_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;
+ Gimp_Image_t *im = (Gimp_Image_t *) (image->im.rep);
+ int xmax = (im->columns ? im->drawable->height : im->drawable->width) - 1;
+ int ymax = (im->columns ? im->drawable->width : im->drawable->height) - 1;
- int nx = i->ox + i->mirror ? right : left;
- int ny = i->oy + top * (i->increment);
+ int nx = im->ox + im->mirror ? right : left;
+ int ny = im->oy + top * (im->increment);
- int nw = i->w - left - right;
- int nh = i->h - top - bottom;
+ int nw = im->w - left - right;
+ int nh = im->h - top - bottom;
int wmax, hmax;
@@ -227,7 +388,7 @@ Image_crop(stp_image_t *image, int left, int top, int right, int bottom)
else if (ny > ymax) ny = ymax;
wmax = xmax - nx + 1;
- hmax = i->increment ? ny + 1 : ymax - ny + 1;
+ hmax = im->increment ? ny + 1 : ymax - ny + 1;
if (nw < 1) nw = 1;
else if (nw > wmax) nw = wmax;
@@ -235,109 +396,52 @@ Image_crop(stp_image_t *image, int left, int top, int right, int bottom)
if (nh < 1) nh = 1;
else if (nh > hmax) nh = hmax;
- i->ox = nx;
- i->oy = ny;
- i->w = nw;
- i->h = nh;
+ im->ox = nx;
+ im->oy = ny;
+ im->w = nw;
+ im->h = nh;
}
static void
-Image_rotate_ccw(stp_image_t *image)
+Image_rotate_ccw(stpui_image_t *image)
{
Image_transpose(image);
Image_vflip(image);
}
static void
-Image_rotate_cw(stp_image_t *image)
+Image_rotate_cw(stpui_image_t *image)
{
Image_transpose(image);
Image_hflip(image);
}
static void
-Image_rotate_180(stp_image_t *image)
+Image_rotate_180(stpui_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)
+Image_conclude(stp_image_t *image)
{
+ Gimp_Image_t *im = (Gimp_Image_t *) (image->rep);
gimp_progress_update(1);
+ if (im->alpha_table)
+ stp_free(im->alpha_table);
+ if (im->tmp)
+ stp_free(im->tmp);
}
static const char *
Image_get_appname(stp_image_t *image)
{
- static char pluginname[] = PLUG_IN_NAME " plug-in V" PLUG_IN_VERSION
+ static char pluginname[] = "Print plug-in V" VERSION " - " RELEASE_DATE
" for GIMP";
return pluginname;
}
/*
- * End of "$Id: print-image-gimp.c,v 1.5 2001/07/28 01:42:25 rlk Exp $".
+ * End of "$Id: print-image-gimp.c,v 1.13 2004/05/09 16:06:09 rleigh Exp $".
*/
diff --git a/src/gimp/print-intl.h b/src/gimp/print-intl.h
index dfc5c12..4599852 100644
--- a/src/gimp/print-intl.h
+++ b/src/gimp/print-intl.h
@@ -1,7 +1,7 @@
/*
- * "$Id: print-intl.h,v 1.2 2001/09/08 17:17:34 rleigh Exp $"
+ * "$Id: print-intl.h,v 1.6 2004/09/17 18:38:13 rleigh Exp $"
*
- * I18N header file for the gimp-print plugin.
+ * 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)
@@ -20,17 +20,20 @@
* 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__
+
+#ifndef GIMP_PRINT_INTL_H
+#define GIMP_PRINT_INTL_H
#include <glib.h>
-#include <gimp-print/gimp-print-intl.h>
+#include <gutenprint/gutenprint-intl.h>
-#define INIT_LOCALE(domain) G_STMT_START{ \
- gtk_set_locale (); \
- setlocale (LC_NUMERIC, "C"); \
- bindtextdomain (domain, PACKAGE_LOCALE_DIR); \
- textdomain (domain); \
- }G_STMT_END
+#define INIT_LOCALE(domain) \
+do \
+{ \
+ gtk_set_locale (); \
+ setlocale (LC_NUMERIC, "C"); \
+ bindtextdomain (domain, PACKAGE_LOCALE_DIR); \
+ textdomain (domain); \
+} while (0)
-#endif /* __PRINT_INTL_H__ */
+#endif /* GIMP_PRINT_INTL_H */
diff --git a/src/gimp/print.c b/src/gimp/print.c
index 56e9521..ac3d15e 100644
--- a/src/gimp/print.c
+++ b/src/gimp/print.c
@@ -1,5 +1,5 @@
/*
- * "$Id: print.c,v 1.22.4.4 2003/01/24 02:52:18 rlk Exp $"
+ * "$Id: print.c,v 1.65 2004/09/29 00:41:59 rlk Exp $"
*
* Print plug-in for the GIMP.
*
@@ -24,19 +24,14 @@
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#include "../../lib/libprintut.h"
+#include <gutenprintui/gutenprintui.h>
#include "print_gimp.h"
#include <sys/types.h>
#include <signal.h>
#include <ctype.h>
#include <sys/wait.h>
-#ifdef __EMX__
-#define INCL_DOSDEVICES
-#define INCL_DOSERRORS
-#include <os2.h>
-#endif
#include <unistd.h>
#include <stdio.h>
@@ -48,14 +43,17 @@
* 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);
+static int do_print_dialog (char *proc_name, gint32 image_ID);
+
+/*
+ * Work around GIMP library not being const-safe. This is a very ugly
+ * hack, but the excessive warnings generated can mask more serious
+ * problems.
+ */
+
+#define BAD_CONST_CHAR char *
/*
* Globals...
@@ -69,40 +67,7 @@ GimpPlugInInfo PLUG_IN_INFO = /* Plug-in information */
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));
- }
-}
+static stpui_plist_t gimp_vars;
/*
* 'main()' - Main entry - just call gimp_main()...
@@ -110,8 +75,6 @@ check_plist(int count)
MAIN()
-static int print_finished = 0;
-
/*
* 'query()' - Respond to a plug-in query...
*/
@@ -119,105 +82,78 @@ static int print_finished = 0;
static void
query (void)
{
- static const GimpParamDef args[] =
+ 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" },
+ { GIMP_PDB_INT32, (BAD_CONST_CHAR) "run_mode", (BAD_CONST_CHAR) "Interactive, non-interactive" },
+ { GIMP_PDB_IMAGE, (BAD_CONST_CHAR) "image", (BAD_CONST_CHAR) "Input image" },
+ { GIMP_PDB_DRAWABLE, (BAD_CONST_CHAR) "drawable", (BAD_CONST_CHAR) "Input drawable" },
+ { GIMP_PDB_STRING, (BAD_CONST_CHAR) "output_to", (BAD_CONST_CHAR) "Print command or filename (| to pipe to command)" },
+ { GIMP_PDB_STRING, (BAD_CONST_CHAR) "driver", (BAD_CONST_CHAR) "Printer driver short name" },
+ { GIMP_PDB_STRING, (BAD_CONST_CHAR) "ppd_file", (BAD_CONST_CHAR) "PPD file" },
+ { GIMP_PDB_INT32, (BAD_CONST_CHAR) "output_type", (BAD_CONST_CHAR) "Output type (0 = gray, 1 = color)" },
+ { GIMP_PDB_STRING, (BAD_CONST_CHAR) "resolution", (BAD_CONST_CHAR) "Resolution (\"300\", \"720\", etc.)" },
+ { GIMP_PDB_STRING, (BAD_CONST_CHAR) "media_size", (BAD_CONST_CHAR) "Media size (\"Letter\", \"A4\", etc.)" },
+ { GIMP_PDB_STRING, (BAD_CONST_CHAR) "media_type", (BAD_CONST_CHAR) "Media type (\"Plain\", \"Glossy\", etc.)" },
+ { GIMP_PDB_STRING, (BAD_CONST_CHAR) "media_source", (BAD_CONST_CHAR) "Media source (\"Tray1\", \"Manual\", etc.)" },
+ { GIMP_PDB_FLOAT, (BAD_CONST_CHAR) "brightness", (BAD_CONST_CHAR) "Brightness (0-400%)" },
+ { GIMP_PDB_FLOAT, (BAD_CONST_CHAR) "scaling", (BAD_CONST_CHAR) "Output scaling (0-100%, -PPI)" },
+ { GIMP_PDB_INT32, (BAD_CONST_CHAR) "orientation", (BAD_CONST_CHAR) "Output orientation (-1 = auto, 0 = portrait, 1 = landscape)" },
+ { GIMP_PDB_INT32, (BAD_CONST_CHAR) "left", (BAD_CONST_CHAR) "Left offset (points, -1 = centered)" },
+ { GIMP_PDB_INT32, (BAD_CONST_CHAR) "top", (BAD_CONST_CHAR) "Top offset (points, -1 = centered)" },
+ { GIMP_PDB_FLOAT, (BAD_CONST_CHAR) "gamma", (BAD_CONST_CHAR) "Output gamma (0.1 - 3.0)" },
+ { GIMP_PDB_FLOAT, (BAD_CONST_CHAR) "contrast", (BAD_CONST_CHAR) "Contrast" },
+ { GIMP_PDB_FLOAT, (BAD_CONST_CHAR) "cyan", (BAD_CONST_CHAR) "Cyan level" },
+ { GIMP_PDB_FLOAT, (BAD_CONST_CHAR) "magenta", (BAD_CONST_CHAR) "Magenta level" },
+ { GIMP_PDB_FLOAT, (BAD_CONST_CHAR) "yellow", (BAD_CONST_CHAR) "Yellow level" },
+ { GIMP_PDB_INT32, (BAD_CONST_CHAR) "linear", (BAD_CONST_CHAR) "Linear output (0 = normal, 1 = linear)" },
+ { GIMP_PDB_INT32, (BAD_CONST_CHAR) "image_type", (BAD_CONST_CHAR) "Image type (0 = line art, 1 = solid tones, 2 = continuous tone, 3 = monochrome)"},
+ { GIMP_PDB_FLOAT, (BAD_CONST_CHAR) "saturation", (BAD_CONST_CHAR) "Saturation (0-1000%)" },
+ { GIMP_PDB_FLOAT, (BAD_CONST_CHAR) "density", (BAD_CONST_CHAR) "Density (0-200%)" },
+ { GIMP_PDB_STRING, (BAD_CONST_CHAR) "ink_type", (BAD_CONST_CHAR) "Type of ink or cartridge" },
+ { GIMP_PDB_STRING, (BAD_CONST_CHAR) "dither_algorithm", (BAD_CONST_CHAR) "Dither algorithm" },
+ { GIMP_PDB_INT32, (BAD_CONST_CHAR) "unit", (BAD_CONST_CHAR) "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 <mike@easysw.com> and Robert Krawitz <rlk@alum.mit.edu>";
- 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_("<Image>/File/Print..."),
- types,
+ static const gchar *blurb = "This plug-in prints images from The GIMP.";
+ static const gchar *help = "Prints images to PostScript, PCL, or ESC/P2 printers.";
+ static const gchar *auth = "Michael Sweet <mike@easysw.com> and Robert Krawitz <rlk@alum.mit.edu>";
+ static const gchar *copy = "Copyright 1997-2000 by Michael Sweet and Robert Krawitz";
+ static const gchar *types = "RGB*,GRAY*,INDEXED*";
+
+ gimp_plugin_domain_register ((BAD_CONST_CHAR) PACKAGE, (BAD_CONST_CHAR) PACKAGE_LOCALE_DIR);
+
+ gimp_install_procedure ((BAD_CONST_CHAR) "file_print_gimp",
+ (BAD_CONST_CHAR) blurb,
+ (BAD_CONST_CHAR) help,
+ (BAD_CONST_CHAR) auth,
+ (BAD_CONST_CHAR) copy,
+ (BAD_CONST_CHAR) VERSION " - " RELEASE_DATE,
+ (BAD_CONST_CHAR) N_("<Image>/File/Print..."),
+ (BAD_CONST_CHAR) 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;
-}
+static guchar *gimp_thumbnail_data = NULL;
-void
-gimp_writefunc(void *file, const char *buf, size_t bytes)
+static guchar *
+stpui_get_thumbnail_data_function(void *image_ID, gint *width, gint *height,
+ gint *bpp, gint page)
{
- FILE *prn = (FILE *)file;
- fwrite(buf, 1, bytes, prn);
+ if (gimp_thumbnail_data)
+ g_free(gimp_thumbnail_data);
+ gimp_thumbnail_data =
+ gimp_image_get_thumbnail_data((gint) image_ID, width, height, bpp);
+ return gimp_thumbnail_data;
}
/*
* '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. */
@@ -228,26 +164,21 @@ run (char *name, /* I - Name of print program. */
{
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
+ gdouble xres, yres;
+ char *image_filename;
+ char *image_basename;
+ stpui_image_t *image;
+ gint32 image_ID;
+ gint32 base_type;
+ if (getenv("STP_DEBUG_STARTUP"))
+ while (SDEBUG)
+ ;
/*
- * Initialise libgimpprint
+ * Initialise libgutenprint
*/
stp_init();
@@ -255,17 +186,20 @@ run (char *name, /* I - Name of print program. */
#ifdef INIT_I18N_UI
INIT_I18N_UI();
#else
+ /*
+ * With GCC and glib 1.2, there will be a warning here about braces in
+ * expressions. Getting rid of it causes more problems than it solves.
+ * In particular, turning on -ansi on the command line causes a number of
+ * other useful things, such as strcasecmp, popen, and snprintf to go away
+ */
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);
+ stpui_printer_initialize(&gimp_vars);
/*
* Initialize parameter data...
*/
- current_printer = stp_get_printer_by_index (0);
run_mode = (GimpRunModeType)param[0].data.d_int32;
values = g_new (GimpParam, 1);
@@ -280,8 +214,16 @@ run (char *name, /* I - Name of print program. */
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;
+ if (image_filename)
+ {
+ image_basename = image_filename;
+ if (strchr(image_filename, '/'))
+ image_basename = strrchr(image_filename, '/') + 1;
+ stpui_set_image_filename(image_basename);
+ g_free(image_filename);
+ }
+ else
+ stpui_set_image_filename("Untitled");
/* eventually export the image */
switch (run_mode)
@@ -310,9 +252,26 @@ run (char *name, /* I - Name of print program. */
*/
drawable = gimp_drawable_get (drawable_ID);
+ stpui_set_image_dimensions(drawable->width, drawable->height);
+ gimp_image_get_resolution (image_ID, &xres, &yres);
+ stpui_set_image_resolution(xres, yres);
+ stpui_set_image_channel_depth(8);
+ base_type = gimp_image_base_type(image_ID);
+ switch (base_type)
+ {
+ case GIMP_INDEXED:
+ case GIMP_RGB:
+ stpui_set_image_type("RGB");
+ break;
+ case GIMP_GRAY:
+ stpui_set_image_type("Whitescale");
+ break;
+ default:
+ break;
+ }
- image_width = drawable->width;
- image_height = drawable->height;
+ image = Image_GimpDrawable_new(drawable, image_ID);
+ stp_set_float_parameter(gimp_vars.v, "AppGamma", gimp_gamma());
/*
* See how we will run
@@ -325,9 +284,9 @@ run (char *name, /* I - Name of print program. */
* Get information from the dialog...
*/
- if (!do_print_dialog (name))
+ if (!do_print_dialog (name, image_ID))
goto cleanup;
- stp_copy_vars(vars, plist[plist_current].v);
+ stpui_plist_copy(&gimp_vars, stpui_get_current_printer());
break;
case GIMP_RUN_NONINTERACTIVE:
@@ -338,65 +297,75 @@ run (char *name, /* I - Name of print program. */
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 0
+ /* What do we do with old output_to? Probably best ignore it. */
+ stpui_plist_set_output_to(&gimp_vars, param[3].data.d_string);
+#endif
+ stp_set_driver(gimp_vars.v, param[4].data.d_string);
+ stp_set_file_parameter(gimp_vars.v, "PPDFile", param[5].data.d_string);
+ switch (param[6].data.d_int32)
+ {
+ case 0:
+ default:
+ stp_set_string_parameter(gimp_vars.v, "PrintingMode", "BW");
+ case 1:
+ stp_set_string_parameter(gimp_vars.v, "PrintingMode", "Color");
+ }
+ stp_set_string_parameter(gimp_vars.v, "Resolution", param[7].data.d_string);
+ stp_set_string_parameter(gimp_vars.v, "PageSize", param[8].data.d_string);
+ stp_set_string_parameter(gimp_vars.v, "MediaType", param[9].data.d_string);
+ stp_set_string_parameter(gimp_vars.v, "InputSlot", param[10].data.d_string);
if (nparams > 11)
- stp_set_brightness(vars, param[11].data.d_float);
+ stp_set_float_parameter(gimp_vars.v, "Brightness", param[11].data.d_float);
if (nparams > 12)
- stp_set_scaling(vars, param[12].data.d_float);
+ gimp_vars.scaling = param[12].data.d_float;
if (nparams > 13)
- stp_set_orientation(vars, param[13].data.d_int32);
+ gimp_vars.orientation = param[13].data.d_int32;
if (nparams > 14)
- stp_set_left(vars, param[14].data.d_int32);
+ stp_set_left(gimp_vars.v, param[14].data.d_int32);
if (nparams > 15)
- stp_set_top(vars, param[15].data.d_int32);
+ stp_set_top(gimp_vars.v, param[15].data.d_int32);
if (nparams > 16)
- stp_set_gamma(vars, param[16].data.d_float);
+ stp_set_float_parameter(gimp_vars.v, "Gamma", param[16].data.d_float);
if (nparams > 17)
- stp_set_contrast(vars, param[17].data.d_float);
+ stp_set_float_parameter(gimp_vars.v, "Contrast", param[17].data.d_float);
if (nparams > 18)
- stp_set_cyan(vars, param[18].data.d_float);
+ stp_set_float_parameter(gimp_vars.v, "Cyan", param[18].data.d_float);
if (nparams > 19)
- stp_set_magenta(vars, param[19].data.d_float);
+ stp_set_float_parameter(gimp_vars.v, "Magenta", param[19].data.d_float);
if (nparams > 20)
- stp_set_yellow(vars, param[20].data.d_float);
+ stp_set_float_parameter(gimp_vars.v, "Yellow", param[20].data.d_float);
if (nparams > 21)
- stp_set_image_type(vars, param[22].data.d_int32);
+ stp_set_string_parameter(gimp_vars.v, "ImageOptimization", param[21].data.d_string);
if (nparams > 22)
- stp_set_saturation(vars, param[23].data.d_float);
+ stp_set_float_parameter(gimp_vars.v, "Saturation", param[23].data.d_float);
if (nparams > 23)
- stp_set_density(vars, param[24].data.d_float);
+ stp_set_float_parameter(gimp_vars.v, "Density", param[24].data.d_float);
if (nparams > 24)
- stp_set_ink_type(vars, param[25].data.d_string);
+ stp_set_string_parameter(gimp_vars.v, "InkType", param[25].data.d_string);
if (nparams > 25)
- stp_set_dither_algorithm(vars, param[26].data.d_string);
+ stp_set_string_parameter(gimp_vars.v, "DitherAlgorithm",
+ param[26].data.d_string);
if (nparams > 26)
- stp_set_unit(vars, param[27].data.d_int32);
+ gimp_vars.unit = param[27].data.d_int32;
}
- current_printer = stp_get_printer_by_driver (stp_get_driver(vars));
break;
case GIMP_RUN_WITH_LAST_VALS:
@@ -408,6 +377,9 @@ run (char *name, /* I - Name of print program. */
break;
}
+ if (gimp_thumbnail_data)
+ g_free(gimp_thumbnail_data);
+
/*
* Print the image...
*/
@@ -424,151 +396,18 @@ run (char *name, /* I - Name of print program. */
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;
+ if (! stpui_print(&gimp_vars, image))
+ values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR;
/*
* Store data...
+ * FIXME! This is broken!
*/
+#if 0
if (run_mode == GIMP_RUN_INTERACTIVE)
gimp_set_data (PLUG_IN_NAME, vars, sizeof (vars));
+#endif
}
/*
@@ -579,766 +418,40 @@ run (char *name, /* I - Name of print program. */
cleanup:
if (export == GIMP_EXPORT_EXPORT)
gimp_image_delete (image_ID);
- stp_free_vars(vars);
+ stp_vars_destroy(gimp_vars.v);
}
/*
* '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 *))
+static void
+gimp_writefunc(void *file, const char *buf, size_t bytes)
{
- 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;
+ FILE *prn = (FILE *)file;
+ fwrite(buf, 1, bytes, prn);
}
-int
-add_printer(const gp_plist_t *key, int add_only)
+static void
+gimp_errfunc(void *file, const char *buf, size_t bytes)
{
- /*
- * 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);
- }
- 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;
+ char formatbuf[32];
+ snprintf(formatbuf, 31, "%%%ds", bytes);
+ g_message(formatbuf, buf);
}
-/*
- * '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)
+static gint
+do_print_dialog (gchar *proc_name, gint32 image_ID)
{
- 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);
+ char *filename = gimp_personal_rc_file ((BAD_CONST_CHAR) "printrc");
+ stpui_set_printrc_file(filename);
+ g_free(filename);
+ if (! getenv("STP_PRINT_MESSAGES_TO_STDERR"))
+ stpui_set_errfunc(gimp_errfunc);
+ stpui_set_thumbnail_func(stpui_get_thumbnail_data_function);
+ stpui_set_thumbnail_data((void *) image_ID);
+ return stpui_do_print_dialog();
}
-
-/*
- * '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
-
-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"));
- plist[0].active = 1;
- 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')
- {
- int printer_exists = 0;
- *ptr = '\0';
- /* check for duplicate printers--yes, they can happen,
- * and it makes gimp-print forget everything about the
- * printer */
- for (i = 1; i < plist_count; i++)
- if (strcmp(line, plist[i].name) == 0)
- {
- printer_exists = 1;
- break;
- }
- if (printer_exists)
- break;
-
- check_plist(plist_count + 1);
- 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
- result = g_strdup_printf("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[plist_count].active = 1;
- plist_count ++;
- }
- break;
-
- case PRINTERS_LPSTAT :
- if ((sscanf(line, "printer %127s", name) == 1) ||
- (sscanf(line, "Printer: %127s", name) == 1))
- {
- int printer_exists = 0;
- /* check for duplicate printers--yes, they can happen,
- * and it makes gimp-print forget everything about the
- * printer */
- for (i = 1; i < plist_count; i++)
- if (strcmp(name, plist[i].name) == 0)
- {
- printer_exists = 1;
- break;
- }
- if (printer_exists)
- break;
- 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
- result = g_strdup_printf("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[plist_count].active = 1;
- 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.4.4 2003/01/24 02:52:18 rlk Exp $".
- */
diff --git a/src/gimp/print_gimp.h b/src/gimp/print_gimp.h
index cc5e682..9ef3140 100644
--- a/src/gimp/print_gimp.h
+++ b/src/gimp/print_gimp.h
@@ -1,5 +1,5 @@
/*
- * "$Id: print_gimp.h,v 1.20 2001/09/05 00:39:42 rlk Exp $"
+ * "$Id: print_gimp.h,v 1.44 2004/09/17 18:38:13 rleigh Exp $"
*
* Print plug-in for the GIMP.
*
@@ -34,91 +34,13 @@
#endif
#include <gtk/gtk.h>
-
-/*
- * 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 <libgimp/gimp.h>
#include <libgimp/gimpui.h>
-#ifdef INCLUDE_GIMP_PRINT_H
-#include INCLUDE_GIMP_PRINT_H
-#else
-#include <gimp-print/gimp-print.h>
-#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
- */
+#include <gutenprint/gutenprint.h>
+#include <gutenprintui/gutenprintui.h>
/* 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);
+extern stpui_image_t *Image_GimpDrawable_new(GimpDrawable *drawable, gint32);
#endif /* __PRINT_GIMP_H__ */
diff --git a/src/printdef/Makefile.am b/src/gimp2/Makefile.am
index bb9faa3..49f45fa 100644
--- a/src/printdef/Makefile.am
+++ b/src/gimp2/Makefile.am
@@ -1,4 +1,4 @@
-## $Id: Makefile.am,v 1.8 2001/11/10 14:42:43 rlk Exp $
+## $Id: Makefile.am,v 1.5 2004/12/29 19:09:55 rlk Exp $
## Copyright (C) 2000 Roger Leigh
##
## This program is free software; you can redistribute it and/or modify
@@ -23,28 +23,30 @@ AUTOMAKE_OPTIONS = 1.4 gnu
MAINT_CHARSET = latin1
+include $(top_srcdir)/scripts/global.mk
-## Variables
-AM_CFLAGS = $(GNUCFLAGS)
-INCLUDES = @INCLUDES@
+## Variables
-LFLAGS = -i
-YFLAGS = -d
+LOCAL_CPPFLAGS = $(GUTENPRINT_CFLAGS) $(GIMP2_CFLAGS)
## Programs
-noinst_PROGRAMS = printdef
-printdef_SOURCES = printdefl.l printdefy.y printdef.h
+if BUILD_GIMP2
+gimp2_plug_in_PROGRAMS = print
+endif
-printdefl.o: printdefy.o
-printdef.o: printdefy.o
+print_SOURCES = \
+ print-image-gimp.c \
+ print-intl.h \
+ print.c \
+ print_gimp.h
+
+print_LDADD = $(GIMP2_LIBS) $(GUTENPRINTUI2_LIBS)
+print_DEPENDENCIES = $(GUTENPRINTUI2_LIBS) $(GUTENPRINT_LIBS)
## Clean
-DISTCLEANFILES = printdefl.c printdefy.c printdefy.h
MAINTAINERCLEANFILES = Makefile.in
-
-EXTRA_DIST = printdefy.h
diff --git a/src/gimp2/Makefile.in b/src/gimp2/Makefile.in
new file mode 100644
index 0000000..897d99e
--- /dev/null
+++ b/src/gimp2/Makefile.in
@@ -0,0 +1,644 @@
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Variables
+
+SOURCES = $(print_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(top_srcdir)/scripts/global.mk
+@BUILD_GIMP2_TRUE@gimp2_plug_in_PROGRAMS = print$(EXEEXT)
+subdir = src/gimp2
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gimp.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/stp.m4 $(top_srcdir)/m4/stp_cups.m4 \
+ $(top_srcdir)/m4/stp_gimp.m4 $(top_srcdir)/m4/stp_option.m4 \
+ $(top_srcdir)/m4/stp_release.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(gimp2_plug_indir)"
+gimp2_plug_inPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(gimp2_plug_in_PROGRAMS)
+am_print_OBJECTS = print-image-gimp.$(OBJEXT) print.$(OBJEXT)
+print_OBJECTS = $(am_print_OBJECTS)
+am__DEPENDENCIES_1 =
+am__DEPENDENCIES_2 = \
+ $(top_builddir)/src/gutenprintui2/libgutenprintui2.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(print_SOURCES)
+DIST_SOURCES = $(print_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CUPS_FALSE = @BUILD_CUPS_FALSE@
+BUILD_CUPS_PPDS_FALSE = @BUILD_CUPS_PPDS_FALSE@
+BUILD_CUPS_PPDS_TRUE = @BUILD_CUPS_PPDS_TRUE@
+BUILD_CUPS_TRUE = @BUILD_CUPS_TRUE@
+BUILD_ESCPUTIL_FALSE = @BUILD_ESCPUTIL_FALSE@
+BUILD_ESCPUTIL_TRUE = @BUILD_ESCPUTIL_TRUE@
+BUILD_FOOMATIC_3_FALSE = @BUILD_FOOMATIC_3_FALSE@
+BUILD_FOOMATIC_3_TRUE = @BUILD_FOOMATIC_3_TRUE@
+BUILD_FOOMATIC_FALSE = @BUILD_FOOMATIC_FALSE@
+BUILD_FOOMATIC_TRUE = @BUILD_FOOMATIC_TRUE@
+BUILD_GENPPD_STATIC_FALSE = @BUILD_GENPPD_STATIC_FALSE@
+BUILD_GENPPD_STATIC_TRUE = @BUILD_GENPPD_STATIC_TRUE@
+BUILD_GHOSTSCRIPT_FALSE = @BUILD_GHOSTSCRIPT_FALSE@
+BUILD_GHOSTSCRIPT_TRUE = @BUILD_GHOSTSCRIPT_TRUE@
+BUILD_GIMP2_FALSE = @BUILD_GIMP2_FALSE@
+BUILD_GIMP2_TRUE = @BUILD_GIMP2_TRUE@
+BUILD_GIMP_FALSE = @BUILD_GIMP_FALSE@
+BUILD_GIMP_TRUE = @BUILD_GIMP_TRUE@
+BUILD_LIBGUTENPRINTUI2_FALSE = @BUILD_LIBGUTENPRINTUI2_FALSE@
+BUILD_LIBGUTENPRINTUI2_TRUE = @BUILD_LIBGUTENPRINTUI2_TRUE@
+BUILD_LIBGUTENPRINTUI_FALSE = @BUILD_LIBGUTENPRINTUI_FALSE@
+BUILD_LIBGUTENPRINTUI_TRUE = @BUILD_LIBGUTENPRINTUI_TRUE@
+BUILD_MODULES_FALSE = @BUILD_MODULES_FALSE@
+BUILD_MODULES_TRUE = @BUILD_MODULES_TRUE@
+BUILD_TESTPATTERN_FALSE = @BUILD_TESTPATTERN_FALSE@
+BUILD_TESTPATTERN_TRUE = @BUILD_TESTPATTERN_TRUE@
+BUILD_TEST_FALSE = @BUILD_TEST_FALSE@
+BUILD_TEST_TRUE = @BUILD_TEST_TRUE@
+BUILD_TRANSLATED_CUPS_PPDS_FALSE = @BUILD_TRANSLATED_CUPS_PPDS_FALSE@
+BUILD_TRANSLATED_CUPS_PPDS_TRUE = @BUILD_TRANSLATED_CUPS_PPDS_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CUPS_CFLAGS = @CUPS_CFLAGS@
+CUPS_CONFIG = @CUPS_CONFIG@
+CUPS_LIBS = @CUPS_LIBS@
+CUPS_PPDS_AT_TOP_LEVEL_FALSE = @CUPS_PPDS_AT_TOP_LEVEL_FALSE@
+CUPS_PPDS_AT_TOP_LEVEL_TRUE = @CUPS_PPDS_AT_TOP_LEVEL_TRUE@
+CUPS_PPD_PS_LEVEL = @CUPS_PPD_PS_LEVEL@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DB2HTML = @DB2HTML@
+DB2PDF = @DB2PDF@
+DB2PS = @DB2PS@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIALOG = @DIALOG@
+DOXYGEN = @DOXYGEN@
+DVIPDF = @DVIPDF@
+DVIPS = @DVIPS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+FIND = @FIND@
+FOOMATIC_CONFIGURE = @FOOMATIC_CONFIGURE@
+FOOMATIC_KITLOAD = @FOOMATIC_KITLOAD@
+FOOMATIC_PPDFILE = @FOOMATIC_PPDFILE@
+GENPPD_LIBS = @GENPPD_LIBS@
+GIMP2_CFLAGS = @GIMP2_CFLAGS@
+GIMP2_LIBS = @GIMP2_LIBS@
+GIMPTOOL = @GIMPTOOL@
+GIMPTOOL2_CHECK = @GIMPTOOL2_CHECK@
+GIMPTOOL_CHECK = @GIMPTOOL_CHECK@
+GIMP_CFLAGS = @GIMP_CFLAGS@
+GIMP_CFLAGS_NOUI = @GIMP_CFLAGS_NOUI@
+GIMP_DATA_DIR = @GIMP_DATA_DIR@
+GIMP_LIBS = @GIMP_LIBS@
+GIMP_LIBS_NOUI = @GIMP_LIBS_NOUI@
+GIMP_PLUGIN_DIR = @GIMP_PLUGIN_DIR@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_CONFIG = @GLIB_CONFIG@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GMSGFMT = @GMSGFMT@
+GNUCFLAGS = @GNUCFLAGS@
+GTK2_CFLAGS = @GTK2_CFLAGS@
+GTK2_LIBS = @GTK2_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+GUTENPRINTUI2_BINARY_AGE = @GUTENPRINTUI2_BINARY_AGE@
+GUTENPRINTUI2_CFLAGS = @GUTENPRINTUI2_CFLAGS@
+GUTENPRINTUI2_CURRENT_INTERFACE = @GUTENPRINTUI2_CURRENT_INTERFACE@
+GUTENPRINTUI2_INTERFACE_AGE = @GUTENPRINTUI2_INTERFACE_AGE@
+GUTENPRINTUI2_LIBDEPS = @GUTENPRINTUI2_LIBDEPS@
+GUTENPRINTUI2_LIBS = $(top_builddir)/src/gutenprintui2/libgutenprintui2.la
+GUTENPRINTUI2_VERSION = @GUTENPRINTUI2_VERSION@
+GUTENPRINTUI_BINARY_AGE = @GUTENPRINTUI_BINARY_AGE@
+GUTENPRINTUI_CFLAGS = @GUTENPRINTUI_CFLAGS@
+GUTENPRINTUI_CURRENT_INTERFACE = @GUTENPRINTUI_CURRENT_INTERFACE@
+GUTENPRINTUI_INTERFACE_AGE = @GUTENPRINTUI_INTERFACE_AGE@
+GUTENPRINTUI_LIBDEPS = @GUTENPRINTUI_LIBDEPS@
+GUTENPRINTUI_LIBS = $(top_builddir)/src/gutenprintui/libgutenprintui.la
+GUTENPRINTUI_VERSION = @GUTENPRINTUI_VERSION@
+GUTENPRINT_BINARY_AGE = @GUTENPRINT_BINARY_AGE@
+GUTENPRINT_CFLAGS = @GUTENPRINT_CFLAGS@
+GUTENPRINT_CURRENT_INTERFACE = @GUTENPRINT_CURRENT_INTERFACE@
+GUTENPRINT_INTERFACE_AGE = @GUTENPRINT_INTERFACE_AGE@
+GUTENPRINT_LIBDEPS = @GUTENPRINT_LIBDEPS@
+
+# Libraries
+GUTENPRINT_LIBS = $(top_builddir)/src/main/libgutenprint.la
+GUTENPRINT_MAJOR_VERSION = @GUTENPRINT_MAJOR_VERSION@
+GUTENPRINT_MICRO_VERSION = @GUTENPRINT_MICRO_VERSION@
+GUTENPRINT_MINOR_VERSION = @GUTENPRINT_MINOR_VERSION@
+GUTENPRINT_VERSION = @GUTENPRINT_VERSION@
+IJS_CFLAGS = @IJS_CFLAGS@
+IJS_CONFIG = @IJS_CONFIG@
+IJS_LIBS = @IJS_LIBS@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SAMPLES_FALSE = @INSTALL_SAMPLES_FALSE@
+INSTALL_SAMPLES_TRUE = @INSTALL_SAMPLES_TRUE@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_USER_GUIDE_FALSE = @INSTALL_USER_GUIDE_FALSE@
+INSTALL_USER_GUIDE_TRUE = @INSTALL_USER_GUIDE_TRUE@
+INTLLIBS = @INTLLIBS@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE_DEPS = @LIBREADLINE_DEPS@
+LIBS = $(INTLLIBS) @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBTOOL_DEPS = @LIBTOOL_DEPS@
+LN_S = @LN_S@
+LTALLOCA = @LTALLOCA@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_CFLAGS = @MAINTAINER_CFLAGS@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
+PLUG_IN_PATH = @PLUG_IN_PATH@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+RELEASE_DATE = @RELEASE_DATE@
+RM = @RM@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEXI2HTML = @TEXI2HTML@
+USE_LEVEL3_PS_FALSE = @USE_LEVEL3_PS_FALSE@
+USE_LEVEL3_PS_TRUE = @USE_LEVEL3_PS_TRUE@
+USE_NLS = @USE_NLS@
+USE_NLS_FALSE = @USE_NLS_FALSE@
+USE_NLS_TRUE = @USE_NLS_TRUE@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+YACC = @YACC@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+cups_bindir = @cups_bindir@
+cups_conf_datadir = @cups_conf_datadir@
+cups_conf_serverbin = @cups_conf_serverbin@
+cups_conf_serverroot = @cups_conf_serverroot@
+cups_exec_prefix = @cups_exec_prefix@
+cups_prefix = @cups_prefix@
+cups_sbindir = @cups_sbindir@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+gimp2_plug_indir = @gimp2_plug_indir@
+gimp_plug_indir = @gimp_plug_indir@
+gutenprint_cflags = @gutenprint_cflags@
+gutenprint_libs = @gutenprint_libs@
+gutenprintui2_cflags = @gutenprintui2_cflags@
+gutenprintui2_libs = @gutenprintui2_libs@
+gutenprintui_cflags = @gutenprintui_cflags@
+gutenprintui_libs = @gutenprintui_libs@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AUTOMAKE_OPTIONS = 1.4 gnu
+MAINT_CHARSET = latin1
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(LOCAL_CPPFLAGS) $(GNUCFLAGS)
+LOCAL_CPPFLAGS = $(GUTENPRINT_CFLAGS) $(GIMP2_CFLAGS)
+print_SOURCES = \
+ print-image-gimp.c \
+ print-intl.h \
+ print.c \
+ print_gimp.h
+
+print_LDADD = $(GIMP2_LIBS) $(GUTENPRINTUI2_LIBS)
+print_DEPENDENCIES = $(GUTENPRINTUI2_LIBS) $(GUTENPRINT_LIBS)
+MAINTAINERCLEANFILES = Makefile.in
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/scripts/global.mk $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/gimp2/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/gimp2/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-gimp2_plug_inPROGRAMS: $(gimp2_plug_in_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(gimp2_plug_indir)" || $(mkdir_p) "$(DESTDIR)$(gimp2_plug_indir)"
+ @list='$(gimp2_plug_in_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(gimp2_plug_inPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(gimp2_plug_indir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(gimp2_plug_inPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(gimp2_plug_indir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-gimp2_plug_inPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(gimp2_plug_in_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(gimp2_plug_indir)/$$f'"; \
+ rm -f "$(DESTDIR)$(gimp2_plug_indir)/$$f"; \
+ done
+
+clean-gimp2_plug_inPROGRAMS:
+ @list='$(gimp2_plug_in_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+print$(EXEEXT): $(print_OBJECTS) $(print_DEPENDENCIES)
+ @rm -f print$(EXEEXT)
+ $(LINK) $(print_LDFLAGS) $(print_OBJECTS) $(print_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-image-gimp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(mkdir_p) $(distdir)/../../scripts
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+ for dir in "$(DESTDIR)$(gimp2_plug_indir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-generic clean-gimp2_plug_inPROGRAMS clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-gimp2_plug_inPROGRAMS
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-gimp2_plug_inPROGRAMS uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-gimp2_plug_inPROGRAMS clean-libtool ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-gimp2_plug_inPROGRAMS install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-gimp2_plug_inPROGRAMS \
+ uninstall-info-am
+
+
+@SET_MAKE@
+
+export STP_MODULE_PATH = $(top_builddir)/src/main/.libs:$(top_builddir)/src/main
+export STP_DATA_PATH = $(top_srcdir)/src/main
+
+# Rules
+
+$(top_builddir)/src/main/libgutenprint.la:
+ cd $(top_builddir)/src/main; \
+ $(MAKE)
+
+$(top_builddir)/src/gutenprintui/libgutenprintui.la:
+ cd $(top_builddir)/src/gutenprintui; \
+ $(MAKE)
+
+$(top_builddir)/src/gutenprintui2/libgutenprintui2.la:
+ cd $(top_builddir)/src/gutenprintui2; \
+ $(MAKE)
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/gimp2/print-image-gimp.c b/src/gimp2/print-image-gimp.c
new file mode 100644
index 0000000..8227409
--- /dev/null
+++ b/src/gimp2/print-image-gimp.c
@@ -0,0 +1,447 @@
+/*
+ * "$Id: print-image-gimp.c,v 1.2 2004/06/22 18:52:15 rleigh 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 <cpbs@debian.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 <config.h>
+#endif
+#include <string.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. */
+
+ gint32 image_ID;
+ gint32 ncolors;
+ gint32 real_bpp;
+ GimpImageBaseType base_type;
+ guchar *cmap;
+ guchar *alpha_table;
+ guchar *tmp;
+ gint last_printed_percent;
+ gint initialized;
+} Gimp_Image_t;
+
+static const char *Image_get_appname(stp_image_t *image);
+static void Image_conclude(stp_image_t *image);
+static stp_image_status_t Image_get_row(stp_image_t *image,
+ unsigned char *data,
+ size_t byte_limit, int row);
+static int Image_height(stp_image_t *image);
+static int Image_width(stp_image_t *image);
+static void Image_reset(stp_image_t *image);
+static void Image_init(stp_image_t *image);
+
+static void Image_transpose(stpui_image_t *image);
+static void Image_hflip(stpui_image_t *image);
+static void Image_vflip(stpui_image_t *image);
+static void Image_rotate_ccw(stpui_image_t *image);
+static void Image_rotate_cw(stpui_image_t *image);
+static void Image_rotate_180(stpui_image_t *image);
+static void Image_crop(stpui_image_t *image, int, int, int, int);
+
+static stpui_image_t theImage =
+{
+ {
+ Image_init,
+ Image_reset,
+ Image_width,
+ Image_height,
+ Image_get_row,
+ Image_get_appname,
+ Image_conclude,
+ NULL,
+ },
+ Image_transpose,
+ Image_hflip,
+ Image_vflip,
+ Image_rotate_ccw,
+ Image_rotate_cw,
+ Image_rotate_180,
+ Image_crop
+};
+
+static void
+compute_alpha_table(Gimp_Image_t *image)
+{
+ unsigned val, alpha;
+ image->alpha_table = stp_malloc(65536 * sizeof(unsigned char));
+ for (val = 0; val < 256; val++)
+ for (alpha = 0; alpha < 256; alpha++)
+ image->alpha_table[(val * 256) + alpha] =
+ val * alpha / 255 + 255 - alpha;
+}
+
+static inline unsigned char
+alpha_lookup(Gimp_Image_t *image, int val, int alpha)
+{
+ return image->alpha_table[(val * 256) + alpha];
+}
+
+stpui_image_t *
+Image_GimpDrawable_new(GimpDrawable *drawable, gint32 image_ID)
+{
+ Gimp_Image_t *im = stp_malloc(sizeof(Gimp_Image_t));
+ memset(im, 0, sizeof(Gimp_Image_t));
+ im->drawable = drawable;
+ gimp_pixel_rgn_init(&(im->rgn), drawable, 0, 0,
+ drawable->width, drawable->height, FALSE, FALSE);
+ im->image_ID = image_ID;
+ im->base_type = gimp_image_base_type(image_ID);
+ im->initialized = 0;
+ theImage.im.rep = im;
+ theImage.im.reset(&(theImage.im));
+ switch (im->base_type)
+ {
+ case GIMP_INDEXED:
+ im->cmap = gimp_image_get_cmap(image_ID, &(im->ncolors));
+ im->real_bpp = 3;
+ break;
+ case GIMP_GRAY:
+ im->real_bpp = 1;
+ break;
+ case GIMP_RGB:
+ im->real_bpp = 3;
+ break;
+ }
+ if (im->drawable->bpp == 2 || im->drawable->bpp == 4)
+ compute_alpha_table(im);
+ return &theImage;
+}
+
+static void
+Image_init(stp_image_t *image)
+{
+ /* Nothing to do. */
+}
+
+static void
+Image_reset(stp_image_t *image)
+{
+ Gimp_Image_t *im = (Gimp_Image_t *) (image->rep);
+ im->columns = FALSE;
+ im->ox = 0;
+ im->oy = 0;
+ im->increment = 1;
+ im->w = im->drawable->width;
+ im->h = im->drawable->height;
+ im->mirror = FALSE;
+}
+
+static int
+Image_width(stp_image_t *image)
+{
+ Gimp_Image_t *im = (Gimp_Image_t *) (image->rep);
+ return im->w;
+}
+
+static int
+Image_height(stp_image_t *image)
+{
+ Gimp_Image_t *im = (Gimp_Image_t *) (image->rep);
+ return im->h;
+}
+
+static stp_image_status_t
+Image_get_row(stp_image_t *image, unsigned char *data, size_t byte_limit,
+ int row)
+{
+ Gimp_Image_t *im = (Gimp_Image_t *) (image->rep);
+ int last_printed_percent;
+ guchar *inter;
+ if (!im->initialized)
+ {
+ gimp_progress_init(_("Printing..."));
+ switch (im->base_type)
+ {
+ case GIMP_INDEXED:
+ im->tmp = stp_malloc(im->drawable->bpp * im->w);
+ break;
+ case GIMP_GRAY:
+ if (im->drawable->bpp == 2)
+ im->tmp = stp_malloc(im->drawable->bpp * im->w);
+ break;
+ case GIMP_RGB:
+ if (im->drawable->bpp == 4)
+ im->tmp = stp_malloc(im->drawable->bpp * im->w);
+ break;
+ }
+ im->initialized = 1;
+ }
+ if (im->tmp)
+ inter = im->tmp;
+ else
+ inter = data;
+ if (im->columns)
+ gimp_pixel_rgn_get_col(&(im->rgn), inter,
+ im->oy + row * im->increment, im->ox, im->w);
+ else
+ gimp_pixel_rgn_get_row(&(im->rgn), inter,
+ im->ox, im->oy + row * im->increment, im->w);
+ if (im->cmap)
+ {
+ int i;
+ if (im->alpha_table)
+ {
+ for (i = 0; i < im->w; i++)
+ {
+ int j;
+ for (j = 0; j < 3; j++)
+ {
+ gint32 tval = im->cmap[(3 * inter[2 * i]) + j];
+ data[(3 * i) + j] = alpha_lookup(im, tval,
+ inter[(2 * i) + 1]);
+ }
+
+ }
+ }
+ else
+ {
+ for (i = 0; i < im->w; i++)
+ {
+ data[(3 * i) + 0] = im->cmap[(3 * inter[i]) + 0];
+ data[(3 * i) + 1] = im->cmap[(3 * inter[i]) + 1];
+ data[(3 * i) + 2] = im->cmap[(3 * inter[i]) + 2];
+ }
+ }
+ }
+ else if (im->alpha_table)
+ {
+ int i;
+ for (i = 0; i < im->w; i++)
+ {
+ int j;
+ for (j = 0; j < im->real_bpp; j++)
+ {
+ gint32 tval = inter[(i * im->drawable->bpp) + j];
+ data[(i * im->real_bpp) + j] =
+ alpha_lookup(im, tval,
+ inter[((i + 1) * im->drawable->bpp) - 1]);
+ }
+
+ }
+ }
+ if (im->mirror)
+ {
+ /* Flip row -- probably inefficiently */
+ int f;
+ int l;
+ int b = im->real_bpp;
+ for (f = 0, l = im->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;
+ }
+ }
+ }
+ last_printed_percent = row * 100 / im->h;
+ if (last_printed_percent > im->last_printed_percent)
+ {
+ gimp_progress_update((double) row / (double) im->h);
+ im->last_printed_percent = last_printed_percent;
+ }
+ return STP_IMAGE_STATUS_OK;
+}
+
+static void
+Image_transpose(stpui_image_t *image)
+{
+ Gimp_Image_t *im = (Gimp_Image_t *) (image->im.rep);
+ int tmp;
+
+ if (im->mirror) im->ox += im->w - 1;
+
+ im->columns = !im->columns;
+
+ tmp = im->ox;
+ im->ox = im->oy;
+ im->oy = tmp;
+
+ tmp = im->mirror;
+ im->mirror = im->increment < 0;
+ im->increment = tmp ? -1 : 1;
+
+ tmp = im->w;
+ im->w = im->h;
+ im->h = tmp;
+
+ if (im->mirror) im->ox -= im->w - 1;
+}
+
+static void
+Image_hflip(stpui_image_t *image)
+{
+ Gimp_Image_t *im = (Gimp_Image_t *) (image->im.rep);
+ im->mirror = !im->mirror;
+}
+
+static void
+Image_vflip(stpui_image_t *image)
+{
+ Gimp_Image_t *im = (Gimp_Image_t *) (image->im.rep);
+ im->oy += (im->h-1) * im->increment;
+ im->increment = -im->increment;
+}
+
+/*
+ * Image_crop:
+ *
+ * Crop the given number of pixels off the LEFT, TOP, RIGHT and BOTTOM
+ * of the image.
+ */
+
+static void
+Image_crop(stpui_image_t *image, int left, int top, int right, int bottom)
+{
+ Gimp_Image_t *im = (Gimp_Image_t *) (image->im.rep);
+ int xmax = (im->columns ? im->drawable->height : im->drawable->width) - 1;
+ int ymax = (im->columns ? im->drawable->width : im->drawable->height) - 1;
+
+ int nx = im->ox + im->mirror ? right : left;
+ int ny = im->oy + top * (im->increment);
+
+ int nw = im->w - left - right;
+ int nh = im->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 = im->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;
+
+ im->ox = nx;
+ im->oy = ny;
+ im->w = nw;
+ im->h = nh;
+}
+
+static void
+Image_rotate_ccw(stpui_image_t *image)
+{
+ Image_transpose(image);
+ Image_vflip(image);
+}
+
+static void
+Image_rotate_cw(stpui_image_t *image)
+{
+ Image_transpose(image);
+ Image_hflip(image);
+}
+
+static void
+Image_rotate_180(stpui_image_t *image)
+{
+ Image_vflip(image);
+ Image_hflip(image);
+}
+
+static void
+Image_conclude(stp_image_t *image)
+{
+ Gimp_Image_t *im = (Gimp_Image_t *) (image->rep);
+ gimp_progress_update(1);
+ if (im->alpha_table)
+ stp_free(im->alpha_table);
+ if (im->tmp)
+ stp_free(im->tmp);
+}
+
+static const char *
+Image_get_appname(stp_image_t *image)
+{
+ static char pluginname[] = "Print plug-in V" VERSION " - " RELEASE_DATE
+ " for GIMP";
+ return pluginname;
+}
+
+/*
+ * End of "$Id: print-image-gimp.c,v 1.2 2004/06/22 18:52:15 rleigh Exp $".
+ */
diff --git a/src/gimp2/print-intl.h b/src/gimp2/print-intl.h
new file mode 100644
index 0000000..634f23a
--- /dev/null
+++ b/src/gimp2/print-intl.h
@@ -0,0 +1,38 @@
+/*
+ * "$Id: print-intl.h,v 1.3 2004/09/17 18:38:13 rleigh Exp $"
+ *
+ * I18N header file for the GIMP2 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 GIMP2_PRINT_INTL_H
+#define GIMP2_PRINT_INTL_H
+
+#include <glib.h>
+#include <gutenprint/gutenprint-intl.h>
+
+#define INIT_LOCALE(domain) \
+do \
+{ \
+ gtk_set_locale (); \
+ setlocale (LC_NUMERIC, "C"); \
+ bindtextdomain (domain, PACKAGE_LOCALE_DIR); \
+ textdomain (domain); \
+} while (0)
+
+#endif /* GIMP2_PRINT_INTL_H */
diff --git a/src/gimp2/print.c b/src/gimp2/print.c
new file mode 100644
index 0000000..8ae4e26
--- /dev/null
+++ b/src/gimp2/print.c
@@ -0,0 +1,462 @@
+/*
+ * "$Id: print.c,v 1.6 2004/11/01 20:46: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 <config.h>
+#endif
+
+#include <gutenprintui2/gutenprintui.h>
+#include "print_gimp.h"
+
+#include <sys/types.h>
+#include <signal.h>
+#include <ctype.h>
+#include <sys/wait.h>
+
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "print-intl.h"
+
+/*
+ * Local functions...
+ */
+
+static void query (void);
+static void run (const char *name,
+ gint nparams,
+ const GimpParam *param,
+ gint *nreturn_vals,
+ GimpParam **return_vals);
+static int do_print_dialog (const gchar *proc_name,
+ gint32 image_ID);
+
+/*
+ * Work around GIMP library not being const-safe. This is a very ugly
+ * hack, but the excessive warnings generated can mask more serious
+ * problems.
+ */
+
+#define BAD_CONST_CHAR char *
+
+/*
+ * Globals...
+ */
+
+GimpPlugInInfo PLUG_IN_INFO = /* Plug-in information */
+{
+ NULL, /* init_proc */
+ NULL, /* quit_proc */
+ query, /* query_proc */
+ run, /* run_proc */
+};
+
+static stpui_plist_t gimp_vars;
+
+/*
+ * 'main()' - Main entry - just call gimp_main()...
+ */
+
+MAIN()
+
+/*
+ * 'query()' - Respond to a plug-in query...
+ */
+
+static void
+query (void)
+{
+ static GimpParamDef args[] =
+ {
+ { GIMP_PDB_INT32, (BAD_CONST_CHAR) "run_mode", (BAD_CONST_CHAR) "Interactive, non-interactive" },
+ { GIMP_PDB_IMAGE, (BAD_CONST_CHAR) "image", (BAD_CONST_CHAR) "Input image" },
+ { GIMP_PDB_DRAWABLE, (BAD_CONST_CHAR) "drawable", (BAD_CONST_CHAR) "Input drawable" },
+ { GIMP_PDB_STRING, (BAD_CONST_CHAR) "output_to", (BAD_CONST_CHAR) "Print command or filename (| to pipe to command)" },
+ { GIMP_PDB_STRING, (BAD_CONST_CHAR) "driver", (BAD_CONST_CHAR) "Printer driver short name" },
+ { GIMP_PDB_STRING, (BAD_CONST_CHAR) "ppd_file", (BAD_CONST_CHAR) "PPD file" },
+ { GIMP_PDB_INT32, (BAD_CONST_CHAR) "output_type", (BAD_CONST_CHAR) "Output type (0 = gray, 1 = color)" },
+ { GIMP_PDB_STRING, (BAD_CONST_CHAR) "resolution", (BAD_CONST_CHAR) "Resolution (\"300\", \"720\", etc.)" },
+ { GIMP_PDB_STRING, (BAD_CONST_CHAR) "media_size", (BAD_CONST_CHAR) "Media size (\"Letter\", \"A4\", etc.)" },
+ { GIMP_PDB_STRING, (BAD_CONST_CHAR) "media_type", (BAD_CONST_CHAR) "Media type (\"Plain\", \"Glossy\", etc.)" },
+ { GIMP_PDB_STRING, (BAD_CONST_CHAR) "media_source", (BAD_CONST_CHAR) "Media source (\"Tray1\", \"Manual\", etc.)" },
+ { GIMP_PDB_FLOAT, (BAD_CONST_CHAR) "brightness", (BAD_CONST_CHAR) "Brightness (0-400%)" },
+ { GIMP_PDB_FLOAT, (BAD_CONST_CHAR) "scaling", (BAD_CONST_CHAR) "Output scaling (0-100%, -PPI)" },
+ { GIMP_PDB_INT32, (BAD_CONST_CHAR) "orientation", (BAD_CONST_CHAR) "Output orientation (-1 = auto, 0 = portrait, 1 = landscape)" },
+ { GIMP_PDB_INT32, (BAD_CONST_CHAR) "left", (BAD_CONST_CHAR) "Left offset (points, -1 = centered)" },
+ { GIMP_PDB_INT32, (BAD_CONST_CHAR) "top", (BAD_CONST_CHAR) "Top offset (points, -1 = centered)" },
+ { GIMP_PDB_FLOAT, (BAD_CONST_CHAR) "gamma", (BAD_CONST_CHAR) "Output gamma (0.1 - 3.0)" },
+ { GIMP_PDB_FLOAT, (BAD_CONST_CHAR) "contrast", (BAD_CONST_CHAR) "Contrast" },
+ { GIMP_PDB_FLOAT, (BAD_CONST_CHAR) "cyan", (BAD_CONST_CHAR) "Cyan level" },
+ { GIMP_PDB_FLOAT, (BAD_CONST_CHAR) "magenta", (BAD_CONST_CHAR) "Magenta level" },
+ { GIMP_PDB_FLOAT, (BAD_CONST_CHAR) "yellow", (BAD_CONST_CHAR) "Yellow level" },
+ { GIMP_PDB_INT32, (BAD_CONST_CHAR) "linear", (BAD_CONST_CHAR) "Linear output (0 = normal, 1 = linear)" },
+ { GIMP_PDB_INT32, (BAD_CONST_CHAR) "image_type", (BAD_CONST_CHAR) "Image type (0 = line art, 1 = solid tones, 2 = continuous tone, 3 = monochrome)"},
+ { GIMP_PDB_FLOAT, (BAD_CONST_CHAR) "saturation", (BAD_CONST_CHAR) "Saturation (0-1000%)" },
+ { GIMP_PDB_FLOAT, (BAD_CONST_CHAR) "density", (BAD_CONST_CHAR) "Density (0-200%)" },
+ { GIMP_PDB_STRING, (BAD_CONST_CHAR) "ink_type", (BAD_CONST_CHAR) "Type of ink or cartridge" },
+ { GIMP_PDB_STRING, (BAD_CONST_CHAR) "dither_algorithm", (BAD_CONST_CHAR) "Dither algorithm" },
+ { GIMP_PDB_INT32, (BAD_CONST_CHAR) "unit", (BAD_CONST_CHAR) "Unit 0=Inches 1=Metric" },
+ };
+
+ static const gchar *blurb = "This plug-in prints images from The GIMP.";
+ static const gchar *help = "Prints images to PostScript, PCL, or ESC/P2 printers.";
+ static const gchar *auth = "Michael Sweet <mike@easysw.com> and Robert Krawitz <rlk@alum.mit.edu>";
+ static const gchar *copy = "Copyright 1997-2000 by Michael Sweet and Robert Krawitz";
+ static const gchar *types = "RGB*,GRAY*,INDEXED*";
+
+ gimp_plugin_domain_register ((BAD_CONST_CHAR) PACKAGE, (BAD_CONST_CHAR) PACKAGE_LOCALE_DIR);
+
+ gimp_install_procedure ((BAD_CONST_CHAR) "file_print_gimp",
+ (BAD_CONST_CHAR) blurb,
+ (BAD_CONST_CHAR) help,
+ (BAD_CONST_CHAR) auth,
+ (BAD_CONST_CHAR) copy,
+ (BAD_CONST_CHAR) VERSION " - " RELEASE_DATE,
+ (BAD_CONST_CHAR) N_("<Image>/File/Print..."),
+ (BAD_CONST_CHAR) types,
+ GIMP_PLUGIN,
+ G_N_ELEMENTS (args), 0,
+ args, NULL);
+}
+
+static guchar *gimp_thumbnail_data = NULL;
+
+static guchar *
+stpui_get_thumbnail_data_function(void *image_ID, gint *width, gint *height,
+ gint *bpp, gint page)
+{
+ if (gimp_thumbnail_data)
+ g_free(gimp_thumbnail_data);
+ gimp_thumbnail_data =
+ gimp_image_get_thumbnail_data((gint) image_ID, width, height, bpp);
+ return gimp_thumbnail_data;
+}
+
+/*
+ * 'run()' - Run the plug-in...
+ */
+
+volatile int SDEBUG = 1;
+
+static void
+run (const char *name, /* I - Name of print program. */
+ gint nparams, /* I - Number of parameters passed in */
+ const GimpParam *param, /* I - Parameter values */
+ gint *nreturn_vals, /* O - Number of return values */
+ GimpParam **return_vals) /* O - Return values */
+{
+ GimpDrawable *drawable; /* Drawable for image */
+ GimpRunMode run_mode; /* Current run mode */
+ GimpParam *values; /* Return values */
+ gint32 drawable_ID; /* drawable ID */
+ GimpExportReturn export = GIMP_EXPORT_CANCEL; /* return value of gimp_export_image() */
+ gdouble xres, yres;
+ char *image_filename;
+ stpui_image_t *image;
+ gint32 image_ID;
+ gint32 base_type;
+ if (getenv("STP_DEBUG_STARTUP"))
+ while (SDEBUG)
+ ;
+
+ /*
+ * Initialise libgutenprint
+ */
+
+ stp_init();
+
+ stp_set_output_codeset("UTF-8");
+
+#ifdef INIT_I18N_UI
+ INIT_I18N_UI();
+#else
+ /*
+ * With GCC and glib 1.2, there will be a warning here about braces in
+ * expressions. Getting rid of it causes more problems than it solves.
+ * In particular, turning on -ansi on the command line causes a number of
+ * other useful things, such as strcasecmp, popen, and snprintf to go away
+ */
+ INIT_LOCALE (PACKAGE);
+#endif
+
+ stpui_printer_initialize(&gimp_vars);
+ /*
+ * Initialize parameter data...
+ */
+
+ run_mode = (GimpRunMode)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 (image_filename)
+ {
+ if (strchr(image_filename, '/'))
+ image_filename = strrchr(image_filename, '/') + 1;
+ stpui_set_image_filename(image_filename);
+ /* g_free(image_filename); */
+ }
+ else
+ stpui_set_image_filename("Untitled");
+
+ /* 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);
+ stpui_set_image_dimensions(drawable->width, drawable->height);
+ gimp_image_get_resolution (image_ID, &xres, &yres);
+ stpui_set_image_resolution(xres, yres);
+ stpui_set_image_channel_depth(8);
+ base_type = gimp_image_base_type(image_ID);
+ switch (base_type)
+ {
+ case GIMP_INDEXED:
+ case GIMP_RGB:
+ stpui_set_image_type("RGB");
+ break;
+ case GIMP_GRAY:
+ stpui_set_image_type("Whitescale");
+ break;
+ default:
+ break;
+ }
+
+ image = Image_GimpDrawable_new(drawable, image_ID);
+ stp_set_float_parameter(gimp_vars.v, "AppGamma", gimp_gamma());
+
+ /*
+ * See how we will run
+ */
+
+ switch (run_mode)
+ {
+ case GIMP_RUN_INTERACTIVE:
+ /*
+ * Get information from the dialog...
+ */
+
+ if (!do_print_dialog (name, image_ID))
+ goto cleanup;
+ stpui_plist_copy(&gimp_vars, stpui_get_current_printer());
+ 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
+ {
+#if 0
+ /* What do we do with old output_to? Probably best ignore it. */
+ stpui_plist_set_output_to(&gimp_vars, param[3].data.d_string);
+#endif
+ stp_set_driver(gimp_vars.v, param[4].data.d_string);
+ stp_set_file_parameter(gimp_vars.v, "PPDFile", param[5].data.d_string);
+ switch (param[6].data.d_int32)
+ {
+ case 0:
+ default:
+ stp_set_string_parameter(gimp_vars.v, "PrintingMode", "BW");
+ case 1:
+ stp_set_string_parameter(gimp_vars.v, "PrintingMode", "Color");
+ }
+ stp_set_string_parameter(gimp_vars.v, "Resolution", param[7].data.d_string);
+ stp_set_string_parameter(gimp_vars.v, "PageSize", param[8].data.d_string);
+ stp_set_string_parameter(gimp_vars.v, "MediaType", param[9].data.d_string);
+ stp_set_string_parameter(gimp_vars.v, "InputSlot", param[10].data.d_string);
+
+ if (nparams > 11)
+ stp_set_float_parameter(gimp_vars.v, "Brightness", param[11].data.d_float);
+
+ if (nparams > 12)
+ gimp_vars.scaling = param[12].data.d_float;
+
+ if (nparams > 13)
+ gimp_vars.orientation = param[13].data.d_int32;
+
+ if (nparams > 14)
+ stp_set_left(gimp_vars.v, param[14].data.d_int32);
+
+ if (nparams > 15)
+ stp_set_top(gimp_vars.v, param[15].data.d_int32);
+
+ if (nparams > 16)
+ stp_set_float_parameter(gimp_vars.v, "Gamma", param[16].data.d_float);
+
+ if (nparams > 17)
+ stp_set_float_parameter(gimp_vars.v, "Contrast", param[17].data.d_float);
+
+ if (nparams > 18)
+ stp_set_float_parameter(gimp_vars.v, "Cyan", param[18].data.d_float);
+
+ if (nparams > 19)
+ stp_set_float_parameter(gimp_vars.v, "Magenta", param[19].data.d_float);
+
+ if (nparams > 20)
+ stp_set_float_parameter(gimp_vars.v, "Yellow", param[20].data.d_float);
+
+ if (nparams > 21)
+ stp_set_string_parameter(gimp_vars.v, "ImageOptimization", param[21].data.d_string);
+
+ if (nparams > 22)
+ stp_set_float_parameter(gimp_vars.v, "Saturation", param[23].data.d_float);
+
+ if (nparams > 23)
+ stp_set_float_parameter(gimp_vars.v, "Density", param[24].data.d_float);
+
+ if (nparams > 24)
+ stp_set_string_parameter(gimp_vars.v, "InkType", param[25].data.d_string);
+
+ if (nparams > 25)
+ stp_set_string_parameter(gimp_vars.v, "DitherAlgorithm",
+ param[26].data.d_string);
+
+ if (nparams > 26)
+ gimp_vars.unit = param[27].data.d_int32;
+ }
+
+ 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;
+ }
+
+ if (gimp_thumbnail_data)
+ g_free(gimp_thumbnail_data);
+
+ /*
+ * 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);
+
+ if (! stpui_print(&gimp_vars, image))
+ values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR;
+
+ /*
+ * Store data...
+ * FIXME! This is broken!
+ */
+
+#if 0
+ if (run_mode == GIMP_RUN_INTERACTIVE)
+ gimp_set_data (PLUG_IN_NAME, vars, sizeof (vars));
+#endif
+ }
+
+ /*
+ * Detach from the drawable...
+ */
+ gimp_drawable_detach (drawable);
+
+ cleanup:
+ if (export == GIMP_EXPORT_EXPORT)
+ gimp_image_delete (image_ID);
+ stp_vars_destroy(gimp_vars.v);
+}
+
+/*
+ * 'do_print_dialog()' - Pop up the print dialog...
+ */
+
+static void
+gimp_writefunc(void *file, const char *buf, size_t bytes)
+{
+ FILE *prn = (FILE *)file;
+ fwrite(buf, 1, bytes, prn);
+}
+
+static void
+gimp_errfunc(void *file, const char *buf, size_t bytes)
+{
+ char formatbuf[32];
+ snprintf(formatbuf, 31, "%%%ds", bytes);
+ g_message(formatbuf, buf);
+}
+
+static gint
+do_print_dialog (const gchar *proc_name,
+ gint32 image_ID)
+{
+ /*
+ * Generate the filename for the current user...
+ */
+ char *filename = gimp_personal_rc_file ((BAD_CONST_CHAR) "printrc");
+ stpui_set_printrc_file(filename);
+ g_free(filename);
+ if (! getenv("STP_PRINT_MESSAGES_TO_STDERR"))
+ stpui_set_errfunc(gimp_errfunc);
+ stpui_set_thumbnail_func(stpui_get_thumbnail_data_function);
+ stpui_set_thumbnail_data((void *) image_ID);
+ return stpui_do_print_dialog();
+}
diff --git a/src/gimp2/print_gimp.h b/src/gimp2/print_gimp.h
new file mode 100644
index 0000000..c6f9239
--- /dev/null
+++ b/src/gimp2/print_gimp.h
@@ -0,0 +1,46 @@
+/*
+ * "$Id: print_gimp.h,v 1.4 2004/11/01 20:46:34 rleigh 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 <gtk/gtk.h>
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include <gutenprint/gutenprint.h>
+#include <gutenprintui2/gutenprintui.h>
+
+/* How to create an Image wrapping a Gimp drawable */
+extern stpui_image_t *Image_GimpDrawable_new(GimpDrawable *drawable, gint32);
+
+#endif /* __PRINT_GIMP_H__ */
diff --git a/src/gutenprintui/Makefile.am b/src/gutenprintui/Makefile.am
new file mode 100644
index 0000000..8e4a642
--- /dev/null
+++ b/src/gutenprintui/Makefile.am
@@ -0,0 +1,77 @@
+## $Id: Makefile.am,v 1.4 2005/06/26 10:56:51 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
+
+include $(top_srcdir)/scripts/global.mk
+
+
+## Variables
+
+m4datadir = $(datadir)/aclocal
+pkgconfigdatadir = $(libdir)/pkgconfig
+
+
+## Programs
+
+if BUILD_LIBGUTENPRINTUI
+lib_LTLIBRARIES = libgutenprintui.la
+endif
+
+libgutenprintui_la_SOURCES = \
+ printrcy.y \
+ printrcl.l \
+ printrc.h \
+ plist.c \
+ panel.c \
+ ui-utils.c \
+ print-image-thumbnail.c \
+ gutenprintui-internal.h
+
+libgutenprintui_la_LIBADD = $(GUTENPRINTUI_LIBDEPS)
+# Uncommment to build an unversioned library (version in soname)
+libgutenprintui_la_CFLAGS = $(AM_CFLAGS) $(GUTENPRINT_CFLAGS) $(GTK_CFLAGS)
+#libgutenprintui_la_LDFLAGS = -release $(GUTENPRINT_VERSION) \
+# -rpath $(libdir) -no-undefined
+# Uncomment to build a versioned library
+libgutenprintui_la_LDFLAGS = \
+ -version-info $(GUTENPRINTUI_CURRENT_INTERFACE):$(GUTENPRINTUI_INTERFACE_AGE):$(GUTENPRINTUI_BINARY_AGE) \
+ -rpath $(libdir) -no-undefined
+
+AM_LFLAGS = -i
+AM_YFLAGS = -d
+
+printrcy.o: printrcl.o
+plist.o: printrcy.o
+
+## Data
+
+pkgconfigdata_DATA = gutenprintui.pc
+
+
+## Rules
+
+
+## Clean
+
+MAINTAINERCLEANFILES = Makefile.in printrcl.c printrcy.c printrcy.h
diff --git a/src/gutenprintui/Makefile.in b/src/gutenprintui/Makefile.in
new file mode 100644
index 0000000..88b87b1
--- /dev/null
+++ b/src/gutenprintui/Makefile.in
@@ -0,0 +1,782 @@
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Variables
+
+
+SOURCES = $(libgutenprintui_la_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(srcdir)/gutenprintui.pc.in $(top_srcdir)/scripts/global.mk \
+ printrcl.c printrcy.c printrcy.h
+subdir = src/gutenprintui
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gimp.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/stp.m4 $(top_srcdir)/m4/stp_cups.m4 \
+ $(top_srcdir)/m4/stp_gimp.m4 $(top_srcdir)/m4/stp_option.m4 \
+ $(top_srcdir)/m4/stp_release.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = gutenprintui.pc
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(libdir)" \
+ "$(DESTDIR)$(pkgconfigdatadir)"
+libLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgutenprintui_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_libgutenprintui_la_OBJECTS = libgutenprintui_la-printrcy.lo \
+ libgutenprintui_la-printrcl.lo libgutenprintui_la-plist.lo \
+ libgutenprintui_la-panel.lo libgutenprintui_la-ui-utils.lo \
+ libgutenprintui_la-print-image-thumbnail.lo
+libgutenprintui_la_OBJECTS = $(am_libgutenprintui_la_OBJECTS)
+@BUILD_LIBGUTENPRINTUI_TRUE@am_libgutenprintui_la_rpath = -rpath \
+@BUILD_LIBGUTENPRINTUI_TRUE@ $(libdir)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS)
+LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS)
+YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS)
+LTYACCCOMPILE = $(LIBTOOL) --mode=compile $(YACC) $(YFLAGS) \
+ $(AM_YFLAGS)
+SOURCES = $(libgutenprintui_la_SOURCES)
+DIST_SOURCES = $(libgutenprintui_la_SOURCES)
+pkgconfigdataDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkgconfigdata_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CUPS_FALSE = @BUILD_CUPS_FALSE@
+BUILD_CUPS_PPDS_FALSE = @BUILD_CUPS_PPDS_FALSE@
+BUILD_CUPS_PPDS_TRUE = @BUILD_CUPS_PPDS_TRUE@
+BUILD_CUPS_TRUE = @BUILD_CUPS_TRUE@
+BUILD_ESCPUTIL_FALSE = @BUILD_ESCPUTIL_FALSE@
+BUILD_ESCPUTIL_TRUE = @BUILD_ESCPUTIL_TRUE@
+BUILD_FOOMATIC_3_FALSE = @BUILD_FOOMATIC_3_FALSE@
+BUILD_FOOMATIC_3_TRUE = @BUILD_FOOMATIC_3_TRUE@
+BUILD_FOOMATIC_FALSE = @BUILD_FOOMATIC_FALSE@
+BUILD_FOOMATIC_TRUE = @BUILD_FOOMATIC_TRUE@
+BUILD_GENPPD_STATIC_FALSE = @BUILD_GENPPD_STATIC_FALSE@
+BUILD_GENPPD_STATIC_TRUE = @BUILD_GENPPD_STATIC_TRUE@
+BUILD_GHOSTSCRIPT_FALSE = @BUILD_GHOSTSCRIPT_FALSE@
+BUILD_GHOSTSCRIPT_TRUE = @BUILD_GHOSTSCRIPT_TRUE@
+BUILD_GIMP2_FALSE = @BUILD_GIMP2_FALSE@
+BUILD_GIMP2_TRUE = @BUILD_GIMP2_TRUE@
+BUILD_GIMP_FALSE = @BUILD_GIMP_FALSE@
+BUILD_GIMP_TRUE = @BUILD_GIMP_TRUE@
+BUILD_LIBGUTENPRINTUI2_FALSE = @BUILD_LIBGUTENPRINTUI2_FALSE@
+BUILD_LIBGUTENPRINTUI2_TRUE = @BUILD_LIBGUTENPRINTUI2_TRUE@
+BUILD_LIBGUTENPRINTUI_FALSE = @BUILD_LIBGUTENPRINTUI_FALSE@
+BUILD_LIBGUTENPRINTUI_TRUE = @BUILD_LIBGUTENPRINTUI_TRUE@
+BUILD_MODULES_FALSE = @BUILD_MODULES_FALSE@
+BUILD_MODULES_TRUE = @BUILD_MODULES_TRUE@
+BUILD_TESTPATTERN_FALSE = @BUILD_TESTPATTERN_FALSE@
+BUILD_TESTPATTERN_TRUE = @BUILD_TESTPATTERN_TRUE@
+BUILD_TEST_FALSE = @BUILD_TEST_FALSE@
+BUILD_TEST_TRUE = @BUILD_TEST_TRUE@
+BUILD_TRANSLATED_CUPS_PPDS_FALSE = @BUILD_TRANSLATED_CUPS_PPDS_FALSE@
+BUILD_TRANSLATED_CUPS_PPDS_TRUE = @BUILD_TRANSLATED_CUPS_PPDS_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CUPS_CFLAGS = @CUPS_CFLAGS@
+CUPS_CONFIG = @CUPS_CONFIG@
+CUPS_LIBS = @CUPS_LIBS@
+CUPS_PPDS_AT_TOP_LEVEL_FALSE = @CUPS_PPDS_AT_TOP_LEVEL_FALSE@
+CUPS_PPDS_AT_TOP_LEVEL_TRUE = @CUPS_PPDS_AT_TOP_LEVEL_TRUE@
+CUPS_PPD_PS_LEVEL = @CUPS_PPD_PS_LEVEL@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DB2HTML = @DB2HTML@
+DB2PDF = @DB2PDF@
+DB2PS = @DB2PS@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIALOG = @DIALOG@
+DOXYGEN = @DOXYGEN@
+DVIPDF = @DVIPDF@
+DVIPS = @DVIPS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+FIND = @FIND@
+FOOMATIC_CONFIGURE = @FOOMATIC_CONFIGURE@
+FOOMATIC_KITLOAD = @FOOMATIC_KITLOAD@
+FOOMATIC_PPDFILE = @FOOMATIC_PPDFILE@
+GENPPD_LIBS = @GENPPD_LIBS@
+GIMP2_CFLAGS = @GIMP2_CFLAGS@
+GIMP2_LIBS = @GIMP2_LIBS@
+GIMPTOOL = @GIMPTOOL@
+GIMPTOOL2_CHECK = @GIMPTOOL2_CHECK@
+GIMPTOOL_CHECK = @GIMPTOOL_CHECK@
+GIMP_CFLAGS = @GIMP_CFLAGS@
+GIMP_CFLAGS_NOUI = @GIMP_CFLAGS_NOUI@
+GIMP_DATA_DIR = @GIMP_DATA_DIR@
+GIMP_LIBS = @GIMP_LIBS@
+GIMP_LIBS_NOUI = @GIMP_LIBS_NOUI@
+GIMP_PLUGIN_DIR = @GIMP_PLUGIN_DIR@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_CONFIG = @GLIB_CONFIG@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GMSGFMT = @GMSGFMT@
+GNUCFLAGS = @GNUCFLAGS@
+GTK2_CFLAGS = @GTK2_CFLAGS@
+GTK2_LIBS = @GTK2_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+GUTENPRINTUI2_BINARY_AGE = @GUTENPRINTUI2_BINARY_AGE@
+GUTENPRINTUI2_CFLAGS = @GUTENPRINTUI2_CFLAGS@
+GUTENPRINTUI2_CURRENT_INTERFACE = @GUTENPRINTUI2_CURRENT_INTERFACE@
+GUTENPRINTUI2_INTERFACE_AGE = @GUTENPRINTUI2_INTERFACE_AGE@
+GUTENPRINTUI2_LIBDEPS = @GUTENPRINTUI2_LIBDEPS@
+GUTENPRINTUI2_LIBS = $(top_builddir)/src/gutenprintui2/libgutenprintui2.la
+GUTENPRINTUI2_VERSION = @GUTENPRINTUI2_VERSION@
+GUTENPRINTUI_BINARY_AGE = @GUTENPRINTUI_BINARY_AGE@
+GUTENPRINTUI_CFLAGS = @GUTENPRINTUI_CFLAGS@
+GUTENPRINTUI_CURRENT_INTERFACE = @GUTENPRINTUI_CURRENT_INTERFACE@
+GUTENPRINTUI_INTERFACE_AGE = @GUTENPRINTUI_INTERFACE_AGE@
+GUTENPRINTUI_LIBDEPS = @GUTENPRINTUI_LIBDEPS@
+GUTENPRINTUI_LIBS = $(top_builddir)/src/gutenprintui/libgutenprintui.la
+GUTENPRINTUI_VERSION = @GUTENPRINTUI_VERSION@
+GUTENPRINT_BINARY_AGE = @GUTENPRINT_BINARY_AGE@
+GUTENPRINT_CFLAGS = @GUTENPRINT_CFLAGS@
+GUTENPRINT_CURRENT_INTERFACE = @GUTENPRINT_CURRENT_INTERFACE@
+GUTENPRINT_INTERFACE_AGE = @GUTENPRINT_INTERFACE_AGE@
+GUTENPRINT_LIBDEPS = @GUTENPRINT_LIBDEPS@
+
+# Libraries
+GUTENPRINT_LIBS = $(top_builddir)/src/main/libgutenprint.la
+GUTENPRINT_MAJOR_VERSION = @GUTENPRINT_MAJOR_VERSION@
+GUTENPRINT_MICRO_VERSION = @GUTENPRINT_MICRO_VERSION@
+GUTENPRINT_MINOR_VERSION = @GUTENPRINT_MINOR_VERSION@
+GUTENPRINT_VERSION = @GUTENPRINT_VERSION@
+IJS_CFLAGS = @IJS_CFLAGS@
+IJS_CONFIG = @IJS_CONFIG@
+IJS_LIBS = @IJS_LIBS@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SAMPLES_FALSE = @INSTALL_SAMPLES_FALSE@
+INSTALL_SAMPLES_TRUE = @INSTALL_SAMPLES_TRUE@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_USER_GUIDE_FALSE = @INSTALL_USER_GUIDE_FALSE@
+INSTALL_USER_GUIDE_TRUE = @INSTALL_USER_GUIDE_TRUE@
+INTLLIBS = @INTLLIBS@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE_DEPS = @LIBREADLINE_DEPS@
+LIBS = $(INTLLIBS) @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBTOOL_DEPS = @LIBTOOL_DEPS@
+LN_S = @LN_S@
+LTALLOCA = @LTALLOCA@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_CFLAGS = @MAINTAINER_CFLAGS@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
+PLUG_IN_PATH = @PLUG_IN_PATH@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+RELEASE_DATE = @RELEASE_DATE@
+RM = @RM@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEXI2HTML = @TEXI2HTML@
+USE_LEVEL3_PS_FALSE = @USE_LEVEL3_PS_FALSE@
+USE_LEVEL3_PS_TRUE = @USE_LEVEL3_PS_TRUE@
+USE_NLS = @USE_NLS@
+USE_NLS_FALSE = @USE_NLS_FALSE@
+USE_NLS_TRUE = @USE_NLS_TRUE@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+YACC = @YACC@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+cups_bindir = @cups_bindir@
+cups_conf_datadir = @cups_conf_datadir@
+cups_conf_serverbin = @cups_conf_serverbin@
+cups_conf_serverroot = @cups_conf_serverroot@
+cups_exec_prefix = @cups_exec_prefix@
+cups_prefix = @cups_prefix@
+cups_sbindir = @cups_sbindir@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+gimp2_plug_indir = @gimp2_plug_indir@
+gimp_plug_indir = @gimp_plug_indir@
+gutenprint_cflags = @gutenprint_cflags@
+gutenprint_libs = @gutenprint_libs@
+gutenprintui2_cflags = @gutenprintui2_cflags@
+gutenprintui2_libs = @gutenprintui2_libs@
+gutenprintui_cflags = @gutenprintui_cflags@
+gutenprintui_libs = @gutenprintui_libs@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AUTOMAKE_OPTIONS = 1.4 gnu
+MAINT_CHARSET = latin1
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(LOCAL_CPPFLAGS) $(GNUCFLAGS)
+m4datadir = $(datadir)/aclocal
+pkgconfigdatadir = $(libdir)/pkgconfig
+@BUILD_LIBGUTENPRINTUI_TRUE@lib_LTLIBRARIES = libgutenprintui.la
+libgutenprintui_la_SOURCES = \
+ printrcy.y \
+ printrcl.l \
+ printrc.h \
+ plist.c \
+ panel.c \
+ ui-utils.c \
+ print-image-thumbnail.c \
+ gutenprintui-internal.h
+
+libgutenprintui_la_LIBADD = $(GUTENPRINTUI_LIBDEPS)
+# Uncommment to build an unversioned library (version in soname)
+libgutenprintui_la_CFLAGS = $(AM_CFLAGS) $(GUTENPRINT_CFLAGS) $(GTK_CFLAGS)
+#libgutenprintui_la_LDFLAGS = -release $(GUTENPRINT_VERSION) \
+# -rpath $(libdir) -no-undefined
+# Uncomment to build a versioned library
+libgutenprintui_la_LDFLAGS = \
+ -version-info $(GUTENPRINTUI_CURRENT_INTERFACE):$(GUTENPRINTUI_INTERFACE_AGE):$(GUTENPRINTUI_BINARY_AGE) \
+ -rpath $(libdir) -no-undefined
+
+AM_LFLAGS = -i
+AM_YFLAGS = -d
+pkgconfigdata_DATA = gutenprintui.pc
+MAINTAINERCLEANFILES = Makefile.in printrcl.c printrcy.c printrcy.h
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .l .lo .o .obj .y
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/scripts/global.mk $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/gutenprintui/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/gutenprintui/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+gutenprintui.pc: $(top_builddir)/config.status $(srcdir)/gutenprintui.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ p=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
+ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+printrcy.h: printrcy.c
+ @if test ! -f $@; then \
+ rm -f printrcy.c; \
+ $(MAKE) printrcy.c; \
+ else :; fi
+libgutenprintui.la: $(libgutenprintui_la_OBJECTS) $(libgutenprintui_la_DEPENDENCIES)
+ $(LINK) $(am_libgutenprintui_la_rpath) $(libgutenprintui_la_LDFLAGS) $(libgutenprintui_la_OBJECTS) $(libgutenprintui_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgutenprintui_la-panel.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgutenprintui_la-plist.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgutenprintui_la-print-image-thumbnail.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgutenprintui_la-printrcl.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgutenprintui_la-printrcy.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgutenprintui_la-ui-utils.Plo@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgutenprintui_la-printrcy.lo: printrcy.c
+@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui_la_CFLAGS) $(CFLAGS) -MT libgutenprintui_la-printrcy.lo -MD -MP -MF "$(DEPDIR)/libgutenprintui_la-printrcy.Tpo" -c -o libgutenprintui_la-printrcy.lo `test -f 'printrcy.c' || echo '$(srcdir)/'`printrcy.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgutenprintui_la-printrcy.Tpo" "$(DEPDIR)/libgutenprintui_la-printrcy.Plo"; else rm -f "$(DEPDIR)/libgutenprintui_la-printrcy.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='printrcy.c' object='libgutenprintui_la-printrcy.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui_la_CFLAGS) $(CFLAGS) -c -o libgutenprintui_la-printrcy.lo `test -f 'printrcy.c' || echo '$(srcdir)/'`printrcy.c
+
+libgutenprintui_la-printrcl.lo: printrcl.c
+@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui_la_CFLAGS) $(CFLAGS) -MT libgutenprintui_la-printrcl.lo -MD -MP -MF "$(DEPDIR)/libgutenprintui_la-printrcl.Tpo" -c -o libgutenprintui_la-printrcl.lo `test -f 'printrcl.c' || echo '$(srcdir)/'`printrcl.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgutenprintui_la-printrcl.Tpo" "$(DEPDIR)/libgutenprintui_la-printrcl.Plo"; else rm -f "$(DEPDIR)/libgutenprintui_la-printrcl.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='printrcl.c' object='libgutenprintui_la-printrcl.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui_la_CFLAGS) $(CFLAGS) -c -o libgutenprintui_la-printrcl.lo `test -f 'printrcl.c' || echo '$(srcdir)/'`printrcl.c
+
+libgutenprintui_la-plist.lo: plist.c
+@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui_la_CFLAGS) $(CFLAGS) -MT libgutenprintui_la-plist.lo -MD -MP -MF "$(DEPDIR)/libgutenprintui_la-plist.Tpo" -c -o libgutenprintui_la-plist.lo `test -f 'plist.c' || echo '$(srcdir)/'`plist.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgutenprintui_la-plist.Tpo" "$(DEPDIR)/libgutenprintui_la-plist.Plo"; else rm -f "$(DEPDIR)/libgutenprintui_la-plist.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='plist.c' object='libgutenprintui_la-plist.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui_la_CFLAGS) $(CFLAGS) -c -o libgutenprintui_la-plist.lo `test -f 'plist.c' || echo '$(srcdir)/'`plist.c
+
+libgutenprintui_la-panel.lo: panel.c
+@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui_la_CFLAGS) $(CFLAGS) -MT libgutenprintui_la-panel.lo -MD -MP -MF "$(DEPDIR)/libgutenprintui_la-panel.Tpo" -c -o libgutenprintui_la-panel.lo `test -f 'panel.c' || echo '$(srcdir)/'`panel.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgutenprintui_la-panel.Tpo" "$(DEPDIR)/libgutenprintui_la-panel.Plo"; else rm -f "$(DEPDIR)/libgutenprintui_la-panel.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='panel.c' object='libgutenprintui_la-panel.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui_la_CFLAGS) $(CFLAGS) -c -o libgutenprintui_la-panel.lo `test -f 'panel.c' || echo '$(srcdir)/'`panel.c
+
+libgutenprintui_la-ui-utils.lo: ui-utils.c
+@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui_la_CFLAGS) $(CFLAGS) -MT libgutenprintui_la-ui-utils.lo -MD -MP -MF "$(DEPDIR)/libgutenprintui_la-ui-utils.Tpo" -c -o libgutenprintui_la-ui-utils.lo `test -f 'ui-utils.c' || echo '$(srcdir)/'`ui-utils.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgutenprintui_la-ui-utils.Tpo" "$(DEPDIR)/libgutenprintui_la-ui-utils.Plo"; else rm -f "$(DEPDIR)/libgutenprintui_la-ui-utils.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ui-utils.c' object='libgutenprintui_la-ui-utils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui_la_CFLAGS) $(CFLAGS) -c -o libgutenprintui_la-ui-utils.lo `test -f 'ui-utils.c' || echo '$(srcdir)/'`ui-utils.c
+
+libgutenprintui_la-print-image-thumbnail.lo: print-image-thumbnail.c
+@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui_la_CFLAGS) $(CFLAGS) -MT libgutenprintui_la-print-image-thumbnail.lo -MD -MP -MF "$(DEPDIR)/libgutenprintui_la-print-image-thumbnail.Tpo" -c -o libgutenprintui_la-print-image-thumbnail.lo `test -f 'print-image-thumbnail.c' || echo '$(srcdir)/'`print-image-thumbnail.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgutenprintui_la-print-image-thumbnail.Tpo" "$(DEPDIR)/libgutenprintui_la-print-image-thumbnail.Plo"; else rm -f "$(DEPDIR)/libgutenprintui_la-print-image-thumbnail.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='print-image-thumbnail.c' object='libgutenprintui_la-print-image-thumbnail.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui_la_CFLAGS) $(CFLAGS) -c -o libgutenprintui_la-print-image-thumbnail.lo `test -f 'print-image-thumbnail.c' || echo '$(srcdir)/'`print-image-thumbnail.c
+
+.l.c:
+ $(LEXCOMPILE) $<
+ sed '/^#/ s|$(LEX_OUTPUT_ROOT)\.c|$@|' $(LEX_OUTPUT_ROOT).c >$@
+ rm -f $(LEX_OUTPUT_ROOT).c
+
+.y.c:
+ $(YACCCOMPILE) $<
+ if test -f y.tab.h; then \
+ to=`echo "$*_H" | sed \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
+ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`; \
+ sed -e "/^#/!b" -e "s/Y_TAB_H/$$to/g" -e "s|y\.tab\.h|$*.h|" \
+ y.tab.h >$*.ht; \
+ rm -f y.tab.h; \
+ if cmp -s $*.ht $*.h; then \
+ rm -f $*.ht ;\
+ else \
+ mv $*.ht $*.h; \
+ fi; \
+ fi
+ if test -f y.output; then \
+ mv y.output $*.output; \
+ fi
+ sed '/^#/ s|y\.tab\.c|$@|' y.tab.c >$@t && mv $@t $@
+ rm -f y.tab.c
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgconfigdataDATA: $(pkgconfigdata_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgconfigdatadir)" || $(mkdir_p) "$(DESTDIR)$(pkgconfigdatadir)"
+ @list='$(pkgconfigdata_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgconfigdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgconfigdatadir)/$$f'"; \
+ $(pkgconfigdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgconfigdatadir)/$$f"; \
+ done
+
+uninstall-pkgconfigdataDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkgconfigdata_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgconfigdatadir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgconfigdatadir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(mkdir_p) $(distdir)/../../scripts
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdatadir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -rm -f printrcl.c
+ -rm -f printrcy.c
+ -rm -f printrcy.h
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgconfigdataDATA
+
+install-exec-am: install-libLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES \
+ uninstall-pkgconfigdataDATA
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am \
+ install-libLTLIBRARIES install-man install-pkgconfigdataDATA \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags uninstall uninstall-am \
+ uninstall-info-am uninstall-libLTLIBRARIES \
+ uninstall-pkgconfigdataDATA
+
+
+@SET_MAKE@
+
+export STP_MODULE_PATH = $(top_builddir)/src/main/.libs:$(top_builddir)/src/main
+export STP_DATA_PATH = $(top_srcdir)/src/main
+
+# Rules
+
+$(top_builddir)/src/main/libgutenprint.la:
+ cd $(top_builddir)/src/main; \
+ $(MAKE)
+
+$(top_builddir)/src/gutenprintui/libgutenprintui.la:
+ cd $(top_builddir)/src/gutenprintui; \
+ $(MAKE)
+
+$(top_builddir)/src/gutenprintui2/libgutenprintui2.la:
+ cd $(top_builddir)/src/gutenprintui2; \
+ $(MAKE)
+
+printrcy.o: printrcl.o
+plist.o: printrcy.o
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/gutenprintui/gutenprintui-internal.h b/src/gutenprintui/gutenprintui-internal.h
new file mode 100644
index 0000000..bc4d487
--- /dev/null
+++ b/src/gutenprintui/gutenprintui-internal.h
@@ -0,0 +1,243 @@
+/*
+ * "$Id: gutenprintui-internal.h,v 1.1 2004/09/17 18:38:13 rleigh 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 __GIMP_PRINT_UI_INTERNAL_H__
+#define __GIMP_PRINT_UI_INTERNAL_H__
+
+#ifdef __GNUC__
+#define inline __inline__
+#endif
+
+#include <sys/types.h>
+#include <gtk/gtk.h>
+
+#include <gutenprint/gutenprint.h>
+
+typedef struct
+{
+ GtkWidget *checkbox;
+ int current;
+ int deflt;
+} boolean_option_t;
+
+typedef struct
+{
+ gint callback_id;
+ char *default_val;
+ stp_string_list_t *params;
+ GtkWidget *combo;
+ GtkWidget *label;
+} list_option_t;
+
+typedef struct
+{
+ GtkObject *adjustment;
+ gfloat upper;
+ gfloat lower;
+ gfloat deflt;
+ gfloat scale;
+} float_option_t;
+
+typedef struct
+{
+ GtkWidget *label;
+ GtkWidget *button;
+ GtkWidget *dialog;
+ GtkWidget *gamma_curve;
+ const char *help_text;
+ stp_curve_t *current;
+ const stp_curve_t *deflt;
+ gboolean is_visible;
+} curve_option_t;
+
+typedef struct
+{
+ const stp_parameter_t *fast_desc;
+ int is_active;
+ int is_enabled;
+ GtkWidget *checkbox;
+ union {
+ list_option_t list;
+ float_option_t flt;
+ curve_option_t curve;
+ boolean_option_t bool;
+ } info;
+} option_t;
+
+typedef struct
+{
+ const char *name;
+ const char *help;
+ gdouble scale;
+ GtkWidget *checkbox;
+ const char *format;
+} unit_t;
+
+typedef struct
+{
+ const char *name;
+ const char *help;
+ const char *value;
+ GtkWidget *button;
+} radio_group_t;
+
+typedef struct
+{
+ unsigned char *base_addr;
+ int bpp;
+ off_t offset;
+ off_t limit;
+} priv_t;
+
+#define PLUG_IN_VERSION VERSION " - " RELEASE_DATE
+#define PLUG_IN_NAME "Print"
+
+#define INVALID_TOP 1
+#define INVALID_LEFT 2
+
+#define SCALE_ENTRY_LABEL(adj) \
+ GTK_LABEL (gtk_object_get_data (GTK_OBJECT(adj), "label"))
+
+#define SCALE_ENTRY_SCALE(adj) \
+ GTK_HSCALE (gtk_object_get_data (GTK_OBJECT(adj), "scale"))
+#define SCALE_ENTRY_SCALE_ADJ(adj) \
+ gtk_range_get_adjustment \
+ (GTK_RANGE (gtk_object_get_data (GTK_OBJECT (adj), "scale")))
+
+#define SCALE_ENTRY_SPINBUTTON(adj) \
+ GTK_SPIN_BUTTON (gtk_object_get_data (GTK_OBJECT (adj), "spinbutton"))
+#define SCALE_ENTRY_SPINBUTTON_ADJ(adj) \
+ gtk_spin_button_get_adjustment \
+ (GTK_SPIN_BUTTON (gtk_object_get_data (GTK_OBJECT (adj), "spinbutton")))
+
+extern gint stpui_plist_count; /* Number of system printers */
+extern gint stpui_plist_current; /* Current system printer */
+extern stpui_plist_t *stpui_plist; /* System printers */
+extern const char *stpui_printrc_current_printer;
+extern int stpui_show_all_paper_sizes;
+extern stp_string_list_t *stpui_system_print_queues;
+
+/*
+ * Function prototypes
+ */
+
+extern stpui_plist_t *stpui_plist_create(const char *name, const char *driver);
+extern const char *stpui_combo_get_name(GtkWidget *combo,
+ const stp_string_list_t *options);
+extern void stpui_table_attach_aligned(GtkTable *table, gint column,
+ gint row, const gchar *label_text,
+ gfloat xalign, gfloat yalign,
+ GtkWidget *widget, gint colspan,
+ gboolean left_align);
+
+extern GtkWidget *stpui_create_entry(GtkWidget *table, int hpos, int vpos,
+ const char *text, const char *help,
+ GtkSignalFunc callback);
+extern GSList *stpui_create_radio_button(radio_group_t *radio, GSList *group,
+ GtkWidget *table, int hpos, int vpos,
+ GtkSignalFunc callback);
+extern void stpui_set_adjustment_tooltip (GtkObject *adj, const gchar *tip);
+extern void stpui_create_new_combo(option_t *option, GtkWidget *table,
+ int hpos, int vpos, gboolean is_optional);
+extern void stpui_help_init (void);
+extern void stpui_help_free (void);
+extern void stpui_enable_help (void);
+extern void stpui_disable_help (void);
+extern void stpui_set_help_data (GtkWidget *widget, const gchar *tooltip);
+
+extern GtkWidget *stpui_dialog_new(const gchar *title,
+ const gchar *wmclass_name,
+ GtkWindowPosition position,
+ gint allow_shrink,
+ gint allow_grow,
+ gint auto_shrink,
+ /* specify action area buttons as va_list:
+ * const gchar *label,
+ * GtkSignalFunc callback,
+ * gpointer data,
+ * GtkObject *slot_object,
+ * GtkWidget **widget_ptr,
+ * gboolean default_action,
+ * gboolean connect_delete,
+ */
+ ...);
+
+extern GtkWidget *stpui_option_menu_new(gboolean menu_only,
+ /* specify menu items as va_list:
+ * const gchar *label,
+ * GtkSignalFunc callback,
+ * gpointer data,
+ * gpointer user_data,
+ * GtkWidget **widget_ptr,
+ * gboolean active
+ */
+ ...);
+
+extern GtkObject *stpui_scale_entry_new(GtkTable *table,
+ gint column,
+ gint row,
+ const gchar *text,
+ gint scale_usize,
+ gint spinbutton_usize,
+ gfloat value,
+ gfloat lower,
+ gfloat upper,
+ gfloat step_increment,
+ gfloat page_increment,
+ guint digits,
+ gboolean constrain,
+ gfloat unconstrained_lower,
+ gfloat unconstrained_upper,
+ const gchar *tooltip);
+
+extern void stpui_create_scale_entry(option_t *option,
+ GtkTable *table,
+ gint column,
+ gint row,
+ const gchar *text,
+ gint scale_usize,
+ gint spinbutton_usize,
+ gfloat value,
+ gfloat lower,
+ gfloat upper,
+ gfloat step_increment,
+ gfloat page_increment,
+ guint digits,
+ gboolean constrain,
+ gfloat unconstrained_lower,
+ gfloat unconstrained_upper,
+ const gchar *tooltip,
+ gboolean is_optional);
+
+
+/* Thumbnails -- keep it simple! */
+
+stp_image_t *stpui_image_thumbnail_new(const guchar *data, gint w, gint h,
+ gint bpp);
+
+#endif /* __GIMP_PRINT_UI_INTERNAL_H__ */
diff --git a/src/gutenprintui/gutenprintui.pc.in b/src/gutenprintui/gutenprintui.pc.in
new file mode 100644
index 0000000..4e98dcf
--- /dev/null
+++ b/src/gutenprintui/gutenprintui.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: Gutenprint UI (GTK+-1.2 version)
+Description: Gutenprint Top Quality Printer Drivers - GTK+-1.2 User Interface
+Requires: gutenprint
+Version: @VERSION@
+Libs: -L${libdir} @gutenprintui_libs@
+Cflags: -I${includedir} @gutenprintui_cflags@
diff --git a/src/gutenprintui/panel.c b/src/gutenprintui/panel.c
new file mode 100644
index 0000000..30a576c
--- /dev/null
+++ b/src/gutenprintui/panel.c
@@ -0,0 +1,4923 @@
+/*
+ * "$Id: panel.c,v 1.3 2005/06/30 01:42:56 rlk Exp $"
+ *
+ * Main window code for Print plug-in for the GIMP.
+ *
+ * Copyright 1997-2003 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 <config.h>
+#endif
+
+#define MAX_PREVIEW_PPI (400)
+#define INCH 72
+#define FINCH ((gdouble) INCH)
+#define ROUNDUP(x, y) (((x) + ((y) - 1)) / (y))
+#define SCALE(x, y) (((x) + (1.0 / (2.0 * (y)))) * (y))
+
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <gutenprintui/gutenprintui.h>
+#include "gutenprintui-internal.h"
+
+#include <string.h>
+#include <stdio.h>
+
+#define MAXIMUM_PARAMETER_LEVEL STP_PARAMETER_LEVEL_ADVANCED4
+
+/*
+ * Constants for GUI.
+ */
+static int preview_size_vert = 360;
+static int preview_size_horiz = 300;
+static const int minimum_image_percent = 5.0;
+static const int thumbnail_hintw = 128;
+static const int thumbnail_hinth = 128;
+
+#define MOVE_CONSTRAIN 0
+#define MOVE_HORIZONTAL 1
+#define MOVE_VERTICAL 2
+#define MOVE_ANY (MOVE_HORIZONTAL | MOVE_VERTICAL)
+#define MOVE_GRID 4
+
+/*
+ * Main window widgets
+ */
+
+static GtkWidget *main_vbox;
+static GtkWidget *main_hbox;
+static GtkWidget *right_vbox;
+static GtkWidget *notebook;
+
+static GtkWidget *output_color_vbox;
+static GtkWidget *cyan_button;
+static GtkWidget *magenta_button;
+static GtkWidget *yellow_button;
+static GtkWidget *black_button;
+
+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 *top_entry;
+/*
+static GtkWidget *bottom_entry;
+*/
+static GtkWidget *bottom_border_entry;
+static GtkWidget *width_entry;
+static GtkWidget *height_entry;
+static GtkWidget *units_hbox;
+static GtkWidget *units_label;
+
+static GtkWidget *custom_size_width;
+static GtkWidget *custom_size_height;
+static GtkWidget *show_all_paper_sizes_button;
+static GtkWidget *auto_paper_size_button;
+
+static GtkWidget *orientation_menu; /* 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 GtkObject *scaling_adjustment; /* Adjustment object for scaling */
+
+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 GtkWidget *manufacturer_clist; /* Manufacturer widget */
+static GtkWidget *manufacturer_crawler; /* Scrolled Window for menu */
+static gint plist_callback_id = -1;
+static GtkWidget *ppd_file; /* PPD file entry */
+static GtkWidget *ppd_box;
+static GtkWidget *ppd_label; /* PPD file entry */
+static GtkWidget *ppd_button; /* PPD file browse button */
+static GtkWidget *ppd_browser; /* File selection dialog for PPDs */
+static GtkWidget *new_printer_dialog; /* New printer dialog window */
+static GtkWidget *new_printer_entry; /* New printer text entry */
+static GtkWidget *file_button; /* PPD file browse button */
+static GtkWidget *file_entry; /* FSD for print files */
+static GtkWidget *file_browser; /* FSD for print files */
+static GtkWidget *standard_cmd_entry; /* FSD for print files */
+static GtkWidget *custom_command_entry; /* FSD for print files */
+static GtkWidget *queue_combo; /* FSD for print files */
+static gint queue_callback_id = -1;
+
+static GtkWidget *adjust_color_button;
+static GtkWidget *about_dialog;
+
+static GtkWidget *page_size_table;
+static GtkWidget *printer_features_table;
+static GtkWidget *color_adjustment_table;
+
+static GtkWidget *copy_count_spin_button;
+
+static gboolean preview_valid = FALSE;
+static gboolean frame_valid = FALSE;
+static gboolean need_exposure = FALSE;
+static gboolean suppress_scaling_adjustment = FALSE;
+static gboolean suppress_scaling_callback = FALSE;
+static gboolean thumbnail_update_pending = FALSE;
+/*
+ * These are semaphores, not true booleans.
+ */
+static gint suppress_preview_update = 0;
+static gint suppress_preview_reset = 0;
+
+static GtkDrawingArea *preview = NULL; /* Preview drawing area widget */
+static GtkDrawingArea *swatch = NULL;
+static gint mouse_x, mouse_y; /* Last mouse position */
+static gint orig_top, orig_left; /* Original mouse position at start */
+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 preview_thumbnail_w, preview_thumbnail_h;
+static gint preview_x, preview_y, preview_w, preview_h;
+
+static gint physical_orientation = -2; /* Actual orientation */
+
+static gint paper_width, paper_height; /* Physical width */
+static gint printable_width, printable_height; /* Size of printable area */
+static gint print_width, print_height; /* Printed area of image */
+static gint left, right, top, bottom; /* Imageable region */
+static gint image_width, image_height; /* Image size (possibly rotated) */
+static gint image_true_width, image_true_height; /* Original image */
+static gdouble image_xres, image_yres; /* Original image resolution */
+static gint do_update_thumbnail = 0;
+static gint saveme = 0; /* True if printrc should be saved */
+static gint runme = 0; /* True if print should proceed */
+static gint exit_after_file_ok = 0; /* True if we should exit after file browser complete */
+static gint auto_paper_size = 0; /* True if we're using auto paper size now */
+
+
+
+static void scaling_update (GtkAdjustment *adjustment);
+static void scaling_callback (GtkWidget *widget);
+static void plist_callback (GtkWidget *widget, gpointer data);
+static void queue_callback (GtkWidget *widget, gpointer data);
+static void custom_media_size_callback(GtkWidget *widget, gpointer data);
+static void show_all_paper_sizes_callback(GtkWidget *widget, gpointer data);
+static void auto_paper_size_callback(GtkWidget *widget, gpointer data);
+static void combo_callback (GtkWidget *widget, gpointer data);
+static void output_type_callback (GtkWidget *widget, gpointer data);
+static void unit_callback (GtkWidget *widget, gpointer data);
+static void orientation_callback (GtkWidget *widget, gpointer data);
+static void printandsave_callback (void);
+static void about_callback (void);
+static void print_callback (void);
+static void save_callback (void);
+static void setup_callback (GtkWidget *widget);
+
+static void setup_update (void);
+static void setup_open_callback (void);
+static void setup_ok_callback (void);
+static void setup_cancel_callback (void);
+static void new_printer_open_callback (void);
+static void new_printer_ok_callback (void);
+static void ppd_browse_callback (void);
+static void ppd_ok_callback (void);
+static void file_browse_callback (void);
+static void file_ok_callback (void);
+static void file_cancel_callback (void);
+static void build_printer_driver_clist(void);
+static void print_driver_callback (GtkWidget *widget,
+ gint row,
+ gint column,
+ GdkEventButton *event,
+ gpointer data);
+static void manufacturer_callback (GtkWidget *widget,
+ gint row,
+ gint column,
+ GdkEventButton *event,
+ gpointer data);
+static void command_type_callback (GtkWidget *widget, gpointer data);
+
+static void do_preview_thumbnail (void);
+static void invalidate_preview_thumbnail (void);
+static void invalidate_frame (void);
+
+static GtkWidget *color_adjust_dialog;
+
+static void preview_update (void);
+static void preview_expose (void);
+static void preview_button_callback (GtkWidget *widget,
+ GdkEventButton *bevent,
+ gpointer data);
+static void preview_motion_callback (GtkWidget *widget,
+ GdkEventMotion *mevent,
+ gpointer data);
+static void position_callback (GtkWidget *widget);
+static void position_button_callback (GtkWidget *widget,
+ gpointer data);
+static void copy_count_callback (GtkAdjustment *widget,
+ gpointer data);
+static void plist_build_combo(GtkWidget *combo,
+ GtkWidget *label,
+ stp_string_list_t *items,
+ int active,
+ const gchar *cur_item,
+ const gchar *def_value,
+ GtkSignalFunc callback,
+ gint *callback_id,
+ int (*check_func)(const char *string),
+ gpointer data);
+static void initialize_thumbnail(void);
+static void set_color_defaults (void);
+static void redraw_color_swatch (void);
+static void color_update (GtkAdjustment *adjustment);
+static void dimension_update (GtkAdjustment *adjustment);
+static void set_controls_active (GtkObject *checkbutton, gpointer optno);
+static void update_adjusted_thumbnail (void);
+
+static void set_media_size(const gchar *new_media_size);
+static const stp_printer_t *tmp_printer = NULL;
+
+static option_t *current_options = NULL;
+static int current_option_count = 0;
+
+static unit_t units[] =
+ {
+ { N_("Inch"), N_("Set the base unit of measurement to inches"),
+ 72.0, NULL, "%.2f" },
+ { N_("cm"), N_("Set the base unit of measurement to centimetres"),
+ 72.0 / 2.54, NULL, "%.2f" },
+ { N_("Points"), N_("Set the base unit of measurement to points (1/72\")"),
+ 1.0, NULL, "%.0f" },
+ { N_("mm"), N_("Set the base unit of measurement to millimetres"),
+ 72.0 / 25.4, NULL, "%.1f" },
+ { N_("Pica"), N_("Set the base unit of measurement to picas (1/12\")"),
+ 72.0 / 12.0, NULL, "%.1f" },
+ };
+static const gint unit_count = sizeof(units) / sizeof(unit_t);
+
+static radio_group_t output_types[] =
+ {
+ { N_("Color"), N_("Color output"), "Color", NULL },
+ { N_("Grayscale"),
+ N_("Print in shades of gray using black ink"), "BW", NULL }
+ };
+
+static const gint output_type_count = (sizeof(output_types) /
+ sizeof(radio_group_t));
+
+/*
+ * The order of these entries must match the order in command_t in
+ * gutenprintui.h
+ */
+static radio_group_t command_options[] =
+ {
+ { N_("Standard Command"), N_("Use standard print command"), "Standard", NULL },
+ { N_("Custom Command"), N_("Use custom print command"), "Custom", NULL },
+ { N_("File"), N_("Print to a file"), "File", NULL }
+ };
+
+static const gint command_options_count = (sizeof(command_options) /
+ sizeof(radio_group_t));
+
+static gdouble preview_ppi = 10;
+
+static stp_string_list_t *printer_list = 0;
+static stpui_plist_t *pv;
+static const char *manufacturer = 0;
+
+static gint thumbnail_w, thumbnail_h, thumbnail_bpp;
+static guchar *thumbnail_data;
+static guchar *adjusted_thumbnail_data;
+static guchar *preview_thumbnail_data;
+
+static void
+set_gtk_curve_values(GtkWidget *gcurve, const stp_curve_t *seed)
+{
+ if (stp_curve_get_gamma(seed))
+ {
+ gtk_curve_set_gamma(GTK_CURVE(gcurve), stp_curve_get_gamma(seed));
+ }
+ else
+ {
+ stp_curve_t *copy = stp_curve_create_copy(seed);
+ const float *fdata;
+ size_t count;
+ stp_curve_resample(copy, 256);
+ fdata = stp_curve_get_float_data(copy, &count);
+ gtk_curve_set_vector(GTK_CURVE(gcurve), count, (float *) fdata);
+ stp_curve_destroy(copy);
+ }
+}
+
+static void
+set_stp_curve_values(GtkWidget *widget, option_t *opt)
+{
+ int i;
+ double lo, hi;
+ gfloat vector[256];
+ GtkWidget *gcurve = GTK_WIDGET(widget);
+ stp_curve_t *curve = stp_curve_create_copy(opt->info.curve.deflt);
+ gtk_curve_get_vector(GTK_CURVE(gcurve), 256, vector);
+ stp_curve_get_bounds(opt->info.curve.deflt, &lo, &hi);
+ for (i = 0; i < 256; i++)
+ {
+ if (vector[i] > hi)
+ vector[i] = hi;
+ else if (vector[i] < lo)
+ vector[i] = lo;
+ }
+ switch (GTK_CURVE(gcurve)->curve_type)
+ {
+ case GTK_CURVE_TYPE_SPLINE:
+ stp_curve_set_interpolation_type(curve, STP_CURVE_TYPE_SPLINE);
+ break;
+ default:
+ stp_curve_set_interpolation_type(curve, STP_CURVE_TYPE_LINEAR);
+ break;
+ }
+ stp_curve_set_float_data(curve, 256, vector);
+ stp_set_curve_parameter(pv->v, opt->fast_desc->name, curve);
+ stp_curve_destroy(curve);
+}
+
+static int
+open_curve_editor(GtkObject *button, gpointer xopt)
+{
+ option_t *opt = (option_t *)xopt;
+ if (opt->info.curve.is_visible == FALSE)
+ {
+ GtkWidget *gcurve =
+ GTK_WIDGET(GTK_GAMMA_CURVE(opt->info.curve.gamma_curve)->curve);
+ const stp_curve_t *seed =
+ stp_get_curve_parameter(pv->v, opt->fast_desc->name);
+ stp_curve_t *nseed = NULL;
+ if (!seed)
+ seed = opt->info.curve.deflt;
+ if (seed)
+ nseed = stp_curve_create_copy(seed);
+ gtk_widget_set_sensitive(GTK_WIDGET(opt->checkbox), FALSE);
+ gtk_widget_show(GTK_WIDGET(opt->info.curve.dialog));
+ set_gtk_curve_values(gcurve, seed);
+ opt->info.curve.is_visible = TRUE;
+ if (opt->info.curve.current)
+ stp_curve_destroy(opt->info.curve.current);
+ opt->info.curve.current = nseed;
+ invalidate_preview_thumbnail();
+ update_adjusted_thumbnail();
+ }
+/* gtk_window_activate_focus(GTK_WINDOW(opt->info.curve.dialog)); */
+ return 1;
+}
+
+static int
+set_default_curve_callback(GtkObject *button, gpointer xopt)
+{
+ option_t *opt = (option_t *)xopt;
+ GtkWidget *gcurve =
+ GTK_WIDGET(GTK_GAMMA_CURVE(opt->info.curve.gamma_curve)->curve);
+ const stp_curve_t *seed = opt->info.curve.deflt;
+ set_gtk_curve_values(gcurve, seed);
+ set_stp_curve_values(gcurve, opt);
+ invalidate_preview_thumbnail();
+ update_adjusted_thumbnail();
+ return 1;
+}
+
+static int
+set_previous_curve_callback(GtkObject *button, gpointer xopt)
+{
+ option_t *opt = (option_t *)xopt;
+ GtkWidget *gcurve =
+ GTK_WIDGET(GTK_GAMMA_CURVE(opt->info.curve.gamma_curve)->curve);
+ const stp_curve_t *seed = opt->info.curve.current;
+ if (!seed)
+ seed = opt->info.curve.deflt;
+ set_gtk_curve_values(gcurve, seed);
+ set_stp_curve_values(gcurve, opt);
+ invalidate_preview_thumbnail();
+ update_adjusted_thumbnail();
+ return 1;
+}
+
+static int
+set_curve_callback(GtkObject *button, gpointer xopt)
+{
+ option_t *opt = (option_t *)xopt;
+ GtkWidget *gcurve =
+ GTK_WIDGET(GTK_GAMMA_CURVE(opt->info.curve.gamma_curve)->curve);
+ gtk_widget_hide(opt->info.curve.dialog);
+ gtk_widget_set_sensitive(GTK_WIDGET(opt->checkbox), TRUE);
+ opt->info.curve.is_visible = FALSE;
+ set_stp_curve_values(gcurve, opt);
+ if (opt->info.curve.current)
+ stp_curve_destroy(opt->info.curve.current);
+ opt->info.curve.current = NULL;
+ invalidate_preview_thumbnail();
+ update_adjusted_thumbnail();
+ return 1;
+}
+
+static gint
+curve_draw_callback(GtkWidget *widget, GdkEvent *event, gpointer xopt)
+{
+ option_t *opt = (option_t *)xopt;
+ switch (event->type)
+ {
+ case GDK_BUTTON_RELEASE:
+ set_stp_curve_values(widget, opt);
+ invalidate_preview_thumbnail();
+ update_adjusted_thumbnail();
+ break;
+ default:
+ break;
+ }
+ return 1;
+}
+
+static gint
+curve_type_changed(GtkWidget *widget, gpointer xopt)
+{
+ option_t *opt = (option_t *)xopt;
+ set_stp_curve_values(widget, opt);
+ invalidate_preview_thumbnail();
+ update_adjusted_thumbnail();
+ return 1;
+}
+
+static int
+cancel_curve_callback(GtkObject *button, gpointer xopt)
+{
+ option_t *opt = (option_t *)xopt;
+ if (opt->info.curve.is_visible)
+ {
+ stp_set_curve_parameter(pv->v, opt->fast_desc->name,
+ opt->info.curve.current);
+ stp_curve_destroy(opt->info.curve.current);
+ opt->info.curve.current = NULL;
+ gtk_widget_hide(opt->info.curve.dialog);
+ gtk_widget_set_sensitive(GTK_WIDGET(opt->checkbox), TRUE);
+ opt->info.curve.is_visible = FALSE;
+ invalidate_preview_thumbnail();
+ update_adjusted_thumbnail();
+ }
+ return 1;
+}
+
+static void
+stpui_create_curve(option_t *opt,
+ GtkTable *table,
+ gint column,
+ gint row,
+ const gchar *text,
+ const stp_curve_t *deflt,
+ gboolean is_optional)
+{
+ double lower, upper;
+ opt->checkbox = gtk_check_button_new();
+ gtk_table_attach(GTK_TABLE(table), opt->checkbox,
+ column, column + 1, row, row + 1,
+ GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
+ if (is_optional)
+ gtk_widget_show(opt->checkbox);
+ else
+ gtk_widget_hide(opt->checkbox);
+
+ opt->info.curve.label = gtk_label_new(text);
+ gtk_misc_set_alignment (GTK_MISC (opt->info.curve.label), 0.0, 0.5);
+ gtk_table_attach (GTK_TABLE (table), opt->info.curve.label,
+ column + 1, column + 2, row, row + 1,
+ GTK_FILL, GTK_FILL, 0, 0);
+ gtk_widget_show (opt->info.curve.label);
+
+ opt->info.curve.button = gtk_button_new_with_label(_("Edit Curve..."));
+ gtk_signal_connect(GTK_OBJECT(opt->info.curve.button), "clicked",
+ GTK_SIGNAL_FUNC(open_curve_editor), opt);
+ gtk_table_attach (GTK_TABLE (table), opt->info.curve.button,
+ column + 2, column + 3, row, row + 1,
+ GTK_FILL, GTK_FILL, 0, 0);
+ gtk_widget_show(opt->info.curve.button);
+
+ opt->info.curve.dialog =
+ stpui_dialog_new(_(opt->fast_desc->text), _(opt->fast_desc->text),
+ GTK_WIN_POS_MOUSE, FALSE, TRUE, FALSE,
+ _("Set Default"), set_default_curve_callback,
+ opt, NULL, NULL, FALSE, FALSE,
+ _("Restore Previous"), set_previous_curve_callback,
+ opt, NULL, NULL, FALSE, FALSE,
+ _("OK"), set_curve_callback,
+ opt, NULL, NULL, FALSE, FALSE,
+ _("Cancel"), cancel_curve_callback,
+ opt, NULL, NULL, FALSE, FALSE,
+ NULL);
+ opt->info.curve.gamma_curve = gtk_gamma_curve_new();
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(opt->info.curve.dialog)->vbox),
+ opt->info.curve.gamma_curve, TRUE, TRUE, 0);
+ stp_curve_get_bounds(opt->info.curve.deflt, &lower, &upper);
+ gtk_curve_set_range(GTK_CURVE(GTK_GAMMA_CURVE(opt->info.curve.gamma_curve)->curve),
+ 0.0, 1.0, lower, upper);
+ gtk_widget_set_usize
+ (GTK_WIDGET(GTK_GAMMA_CURVE(opt->info.curve.gamma_curve)->curve), 256, 256);
+ gtk_widget_show(opt->info.curve.gamma_curve);
+
+ gtk_signal_connect
+ (GTK_OBJECT(GTK_GAMMA_CURVE(opt->info.curve.gamma_curve)->curve),
+ "curve-type-changed", GTK_SIGNAL_FUNC(curve_type_changed), opt);
+ gtk_signal_connect
+ (GTK_OBJECT(GTK_GAMMA_CURVE(opt->info.curve.gamma_curve)->curve),
+ "event", GTK_SIGNAL_FUNC(curve_draw_callback), opt);
+
+ if (opt->fast_desc->help)
+ {
+ stpui_set_help_data (opt->info.curve.label, opt->fast_desc->help);
+ stpui_set_help_data (opt->info.curve.button, opt->fast_desc->help);
+ stpui_set_help_data (opt->info.curve.gamma_curve, opt->fast_desc->help);
+ }
+}
+
+static int
+checkbox_callback(GtkObject *button, gpointer xopt)
+{
+ option_t *opt = (option_t *)xopt;
+ GtkWidget *checkbox = GTK_WIDGET(opt->info.bool.checkbox);
+ opt->info.bool.current =
+ gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbox));
+ stp_set_boolean_parameter(pv->v, opt->fast_desc->name,
+ opt->info.bool.current);
+ invalidate_frame();
+ invalidate_preview_thumbnail();
+ if (opt->fast_desc->p_class == STP_PARAMETER_CLASS_OUTPUT)
+ update_adjusted_thumbnail();
+ preview_update();
+ return 1;
+}
+
+static int
+print_mode_is_color(const stp_vars_t *v)
+{
+ const char *printing_mode = stp_get_string_parameter(v, "PrintingMode");
+ if (!printing_mode)
+ {
+ int answer = 1;
+ stp_parameter_t desc;
+ stp_describe_parameter(v, "PrintingMode", &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_STRING_LIST &&
+ strcmp(desc.deflt.str, "BW") == 0)
+ answer = 0;
+ stp_parameter_description_destroy(&desc);
+ return answer;
+ }
+ if (strcmp(printing_mode, "BW") == 0)
+ return 0;
+ else
+ return 1;
+}
+
+static void
+set_current_printer(void)
+{
+ pv = &(stpui_plist[stpui_plist_current]);
+ if (print_mode_is_color(pv->v))
+ stp_set_string_parameter(pv->v, "PrintingMode", "Color");
+ else
+ stp_set_string_parameter(pv->v, "PrintingMode", "BW");
+}
+
+
+static void
+stpui_create_boolean(option_t *opt,
+ GtkTable *table,
+ gint column,
+ gint row,
+ const gchar *text,
+ int deflt,
+ gboolean is_optional)
+{
+ opt->checkbox = gtk_check_button_new();
+ gtk_table_attach(GTK_TABLE(table), opt->checkbox,
+ column, column + 1, row, row + 1,
+ GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
+ if (is_optional)
+ gtk_widget_show(opt->checkbox);
+ else
+ gtk_widget_hide(opt->checkbox);
+
+ opt->info.bool.checkbox =
+ gtk_toggle_button_new_with_label(_(opt->fast_desc->text));
+ gtk_table_attach(GTK_TABLE(table), opt->info.bool.checkbox,
+ column + 1, column + 3, row, row + 1,
+ GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
+ gtk_widget_show(opt->info.bool.checkbox);
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON(opt->info.bool.checkbox),
+ stp_get_boolean_parameter(pv->v, opt->fast_desc->name));
+ gtk_signal_connect(GTK_OBJECT(opt->info.bool.checkbox), "toggled",
+ GTK_SIGNAL_FUNC(checkbox_callback), opt);
+}
+
+static void
+build_queue_combo(void)
+{
+ plist_build_combo(queue_combo,
+ NULL,
+ stpui_system_print_queues,
+ 1,
+ stpui_plist_get_queue_name(pv),
+ NULL,
+ queue_callback,
+ &queue_callback_id,
+ NULL,
+ NULL);
+}
+
+static void
+build_printer_combo(void)
+{
+ int i;
+ if (printer_list)
+ stp_string_list_destroy(printer_list);
+ printer_list = stp_string_list_create();
+ for (i = 0; i < stpui_plist_count; i++)
+ stp_string_list_add_string(printer_list,
+ stpui_plist[i].name, stpui_plist[i].name);
+ plist_build_combo(printer_combo,
+ NULL,
+ printer_list,
+ 1,
+ stp_string_list_param(printer_list, stpui_plist_current)->name,
+ NULL,
+ plist_callback,
+ &plist_callback_id,
+ NULL,
+ NULL);
+}
+
+static int
+check_page_size(const char *paper_size)
+{
+ const stp_papersize_t *ps = stp_get_papersize_by_name(paper_size);
+ if (ps && (ps->paper_unit == PAPERSIZE_ENGLISH_STANDARD ||
+ ps->paper_unit == PAPERSIZE_METRIC_STANDARD))
+ return 1;
+ else
+ return 0;
+}
+
+static void
+build_page_size_combo(option_t *option)
+{
+ /*
+ * Some printers don't support any "standard" page sizes. If the number
+ * of page sizes is small, just display all of them.
+ */
+ if (stpui_show_all_paper_sizes ||
+ stp_string_list_count(option->info.list.params) < 10)
+ plist_build_combo(option->info.list.combo, option->info.list.label,
+ option->info.list.params, option->is_active,
+ stp_get_string_parameter(pv->v, option->fast_desc->name),
+ option->info.list.default_val, combo_callback,
+ &(option->info.list.callback_id), NULL, option);
+ else
+ plist_build_combo(option->info.list.combo, option->info.list.label,
+ option->info.list.params, option->is_active,
+ stp_get_string_parameter(pv->v, option->fast_desc->name),
+ option->info.list.default_val, combo_callback,
+ &(option->info.list.callback_id),
+ check_page_size, option);
+}
+
+static void
+build_a_combo(option_t *option)
+{
+ const gchar *new_value;
+ stp_parameter_activity_t active;
+ if (option->fast_desc &&
+ option->fast_desc->p_type == STP_PARAMETER_TYPE_STRING_LIST)
+ {
+ const gchar *val = stp_get_string_parameter(pv->v,
+ option->fast_desc->name);
+ if (option->info.list.params == NULL || ! option->is_active ||
+ stp_string_list_count(option->info.list.params) == 0)
+ stp_set_string_parameter(pv->v, option->fast_desc->name, NULL);
+ else if (!val || strlen(val) == 0 ||
+ ! stp_string_list_is_present(option->info.list.params, val))
+ stp_set_string_parameter(pv->v, option->fast_desc->name,
+ option->info.list.default_val);
+ if (strcmp(option->fast_desc->name, "PageSize") == 0)
+ build_page_size_combo(option);
+ else
+ plist_build_combo(option->info.list.combo, option->info.list.label,
+ option->info.list.params,
+ option->is_active,
+ stp_get_string_parameter(pv->v,
+ option->fast_desc->name),
+ option->info.list.default_val, combo_callback,
+ &(option->info.list.callback_id), NULL, option);
+ if (strcmp(option->fast_desc->name, "PageSize") == 0)
+ set_media_size
+ (stp_get_string_parameter(pv->v, option->fast_desc->name));
+ }
+ else
+ plist_build_combo(option->info.list.combo, option->info.list.label,
+ NULL, 0, "", "", combo_callback,
+ &(option->info.list.callback_id), NULL, option);
+ new_value =
+ stpui_combo_get_name(option->info.list.combo, option->info.list.params);
+ active = stp_get_string_parameter_active(pv->v, option->fast_desc->name);
+ stp_set_string_parameter(pv->v, option->fast_desc->name, new_value);
+ stp_set_string_parameter_active(pv->v, option->fast_desc->name, active);
+}
+
+static void
+populate_options(const stp_vars_t *v)
+{
+ stp_parameter_list_t params = stp_get_parameter_list(v);
+ int i;
+ int idx;
+ if (current_options)
+ {
+ for (i = 0; i < current_option_count; i++)
+ {
+ option_t *opt = &(current_options[i]);
+ switch (opt->fast_desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ if (opt->info.list.combo)
+ {
+ gtk_widget_destroy(opt->info.list.combo);
+ gtk_widget_destroy(opt->info.list.label);
+ if (opt->info.list.params)
+ stp_string_list_destroy(opt->info.list.params);
+ g_free(opt->info.list.default_val);
+ }
+ break;
+ case STP_PARAMETER_TYPE_DOUBLE:
+ case STP_PARAMETER_TYPE_DIMENSION:
+ if (opt->info.flt.adjustment)
+ {
+ gtk_widget_destroy
+ (GTK_WIDGET
+ (SCALE_ENTRY_SCALE(opt->info.flt.adjustment)));
+ gtk_widget_destroy
+ (GTK_WIDGET
+ (SCALE_ENTRY_LABEL(opt->info.flt.adjustment)));
+ gtk_widget_destroy
+ (GTK_WIDGET
+ (SCALE_ENTRY_SPINBUTTON(opt->info.flt.adjustment)));
+ }
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ gtk_widget_destroy(GTK_WIDGET(opt->info.curve.label));
+ gtk_widget_destroy(GTK_WIDGET(opt->info.curve.button));
+ gtk_widget_destroy(GTK_WIDGET(opt->info.curve.dialog));
+ if (opt->info.curve.current)
+ stp_curve_destroy(opt->info.curve.current);
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ gtk_widget_destroy(GTK_WIDGET(opt->info.bool.checkbox));
+ break;
+ default:
+ break;
+ }
+ if (opt->checkbox)
+ gtk_widget_destroy(GTK_WIDGET(opt->checkbox));
+ }
+ g_free(current_options);
+ }
+ current_option_count = stp_parameter_list_count(params);
+ current_options = g_malloc(sizeof(option_t) * current_option_count);
+
+ for (idx = 0, i = 0; i < current_option_count; i++)
+ {
+ stp_parameter_t desc;
+ const stp_parameter_t *param = stp_parameter_list_param(params, i);
+ if (!param->read_only &&
+ (param->p_class == STP_PARAMETER_CLASS_OUTPUT ||
+ param->p_class == STP_PARAMETER_CLASS_FEATURE ||
+ (param->p_class == STP_PARAMETER_CLASS_CORE &&
+ strcmp(param->name, "PageSize") == 0)))
+ {
+ option_t *opt = &(current_options[idx]);
+ opt->fast_desc = stp_parameter_list_param(params, i);
+ stp_describe_parameter(v, opt->fast_desc->name, &desc);
+ opt->checkbox = NULL;
+ opt->is_active = 0;
+ opt->is_enabled = 0;
+ switch (opt->fast_desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ opt->info.list.callback_id = -1;
+ opt->info.list.default_val = g_strdup(desc.deflt.str);
+ if (desc.bounds.str)
+ opt->info.list.params =
+ stp_string_list_create_copy(desc.bounds.str);
+ else
+ opt->info.list.params = NULL;
+ opt->info.list.combo = NULL;
+ opt->info.list.label = NULL;
+ opt->is_active = desc.is_active;
+ break;
+ case STP_PARAMETER_TYPE_DOUBLE:
+ opt->info.flt.adjustment = NULL;
+ opt->info.flt.upper = desc.bounds.dbl.upper;
+ opt->info.flt.lower = desc.bounds.dbl.lower;
+ opt->info.flt.deflt = desc.deflt.dbl;
+ opt->info.flt.scale = 1.0;
+ opt->is_active = desc.is_active;
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ opt->info.flt.adjustment = NULL;
+ opt->info.flt.upper = desc.bounds.dimension.upper;
+ opt->info.flt.lower = desc.bounds.dimension.lower;
+ opt->info.flt.deflt = desc.deflt.dimension;
+ opt->info.flt.scale = 1.0;
+ opt->is_active = desc.is_active;
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ opt->info.curve.label = NULL;
+ opt->info.curve.button = NULL;
+ opt->info.curve.dialog = NULL;
+ opt->info.curve.gamma_curve = NULL;
+ opt->info.curve.current = NULL;
+ opt->info.curve.deflt = desc.deflt.curve;
+ opt->info.curve.is_visible = FALSE;
+ opt->is_active = desc.is_active;
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ opt->info.bool.checkbox = NULL;
+ opt->info.bool.current = 0;
+ opt->info.bool.deflt = desc.deflt.boolean;
+ opt->is_active = desc.is_active;
+ default:
+ break;
+ }
+ idx++;
+ stp_parameter_description_destroy(&desc);
+ }
+ }
+ current_option_count = idx;
+ stp_parameter_list_destroy(params);
+}
+
+static void
+populate_option_table(GtkWidget *table, int p_class)
+{
+ int i, j;
+ int current_pos = 0;
+ int counts[STP_PARAMETER_LEVEL_INVALID][STP_PARAMETER_TYPE_INVALID];
+ int vpos[STP_PARAMETER_LEVEL_INVALID][STP_PARAMETER_TYPE_INVALID];
+ for (i = 0; i < STP_PARAMETER_LEVEL_INVALID; i++)
+ for (j = 0; j < STP_PARAMETER_TYPE_INVALID; j++)
+ {
+ vpos[i][j] = 0;
+ counts[i][j] = 0;
+ }
+
+
+ /* First scan the options to figure out where to start */
+ for (i = 0; i < current_option_count; i++)
+ {
+ const stp_parameter_t *desc = current_options[i].fast_desc;
+ /*
+ * Specialize the core parameters (page size is the only one we want)
+ * Yuck.
+ */
+ if (!desc->read_only && desc->p_class == p_class &&
+ (desc->p_class != STP_PARAMETER_CLASS_CORE ||
+ strcmp(desc->name, "PageSize") == 0))
+ {
+ switch (desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ case STP_PARAMETER_TYPE_DIMENSION:
+ case STP_PARAMETER_TYPE_DOUBLE:
+ case STP_PARAMETER_TYPE_CURVE:
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ counts[desc->p_level][desc->p_type]++;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ /* Now, figure out where we're going to put the options */
+ for (i = 0; i < STP_PARAMETER_LEVEL_INVALID; i++)
+ {
+ int level_count = 0;
+ for (j = 0; j < STP_PARAMETER_TYPE_INVALID; j++)
+ level_count += counts[i][j];
+ if (level_count > 0 && current_pos > 0)
+ {
+ GtkWidget *sep = gtk_hseparator_new();
+ gtk_table_attach(GTK_TABLE(table), sep, 0, 4,
+ current_pos, current_pos + 1,
+ GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
+ if (i <= MAXIMUM_PARAMETER_LEVEL)
+ gtk_widget_show(sep);
+ current_pos++;
+ }
+ for (j = 0; j < STP_PARAMETER_TYPE_INVALID; j++)
+ {
+ vpos[i][j] = current_pos;
+ current_pos += counts[i][j];
+ }
+ }
+
+ for (i = 0; i < current_option_count; i++)
+ {
+ option_t *opt = &(current_options[i]);
+ const stp_curve_t *xcurve;
+ const stp_parameter_t *desc = opt->fast_desc;
+ if (!desc->read_only && desc->p_class == p_class &&
+ (desc->p_class != STP_PARAMETER_CLASS_CORE ||
+ strcmp(desc->name, "PageSize") == 0))
+ {
+ gdouble unit_scaler;
+ gdouble minor_increment;
+ gint digits;
+ switch (desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ stpui_create_new_combo(opt, table, 0,
+ vpos[desc->p_level][desc->p_type]++,
+ !(desc->is_mandatory));
+ if (desc->p_level > MAXIMUM_PARAMETER_LEVEL)
+ stp_set_string_parameter_active(pv->v, desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_DOUBLE:
+ stpui_create_scale_entry(opt, GTK_TABLE(table), 0,
+ vpos[desc->p_level][desc->p_type]++,
+ _(desc->text), 200, 0,
+ opt->info.flt.deflt,
+ opt->info.flt.lower,
+ opt->info.flt.upper,
+ .001, .01, 3, TRUE, 0, 0, NULL,
+ !(desc->is_mandatory));
+ stpui_set_adjustment_tooltip(opt->info.flt.adjustment,
+ _(desc->help));
+ gtk_signal_connect(GTK_OBJECT(opt->info.flt.adjustment),
+ "value_changed",
+ GTK_SIGNAL_FUNC(color_update), opt);
+ if (desc->p_level > MAXIMUM_PARAMETER_LEVEL)
+ stp_set_float_parameter_active(pv->v, desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ unit_scaler = units[pv->unit].scale;
+ if (unit_scaler > 100)
+ {
+ digits = 3;
+ minor_increment = .001;
+ }
+ else if (unit_scaler > 10)
+ {
+ digits = 2;
+ minor_increment = .01;
+ }
+ else if (unit_scaler > 1)
+ {
+ digits = 1;
+ minor_increment = .1;
+ }
+ else
+ {
+ digits = 0;
+ minor_increment = 1;
+ }
+ stpui_create_scale_entry(opt, GTK_TABLE(table), 0,
+ vpos[desc->p_level][desc->p_type]++,
+ _(desc->text), 200, 0,
+ opt->info.flt.deflt / unit_scaler,
+ opt->info.flt.lower / unit_scaler,
+ opt->info.flt.upper / unit_scaler,
+ minor_increment, minor_increment * 10,
+ digits, TRUE, 0, 0, NULL,
+ !(desc->is_mandatory));
+ stpui_set_adjustment_tooltip(opt->info.flt.adjustment,
+ _(desc->help));
+ gtk_signal_connect(GTK_OBJECT(opt->info.flt.adjustment),
+ "value_changed",
+ GTK_SIGNAL_FUNC(dimension_update), opt);
+ if (desc->p_level > MAXIMUM_PARAMETER_LEVEL)
+ stp_set_dimension_parameter_active(pv->v, desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ xcurve = stp_get_curve_parameter(pv->v, opt->fast_desc->name);
+ if (xcurve)
+ opt->info.curve.current = stp_curve_create_copy(xcurve);
+ else
+ opt->info.curve.current = NULL;
+ stpui_create_curve(opt, GTK_TABLE(table), 0,
+ vpos[desc->p_level][desc->p_type]++,
+ _(desc->text), opt->info.curve.deflt,
+ !(desc->is_mandatory));
+ if (desc->p_level > MAXIMUM_PARAMETER_LEVEL)
+ stp_set_curve_parameter_active(pv->v, desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ opt->info.bool.current =
+ stp_get_boolean_parameter(pv->v, opt->fast_desc->name);
+ stpui_create_boolean(opt, GTK_TABLE(table), 0,
+ vpos[desc->p_level][desc->p_type]++,
+ _(desc->text), opt->info.bool.deflt,
+ !(desc->is_mandatory));
+ if (desc->p_level > MAXIMUM_PARAMETER_LEVEL)
+ stp_set_boolean_parameter_active(pv->v, desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_INT:
+ stp_set_int_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_RAW:
+ stp_set_raw_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_FILE:
+ if (strcmp(opt->fast_desc->name, "PPDFile") != 0)
+ stp_set_file_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ default:
+ break;
+ }
+ if (opt->checkbox)
+ gtk_signal_connect
+ (GTK_OBJECT(opt->checkbox), "toggled",
+ GTK_SIGNAL_FUNC(set_controls_active), opt);
+ }
+ }
+}
+
+static void
+set_options_active(const char *omit)
+{
+ int i;
+ for (i = 0; i < current_option_count; i++)
+ {
+ option_t *opt = &(current_options[i]);
+ const stp_parameter_t *desc = opt->fast_desc;
+ GtkObject *adj;
+ if (omit && strcmp(omit, opt->fast_desc->name) == 0)
+ continue;
+ switch (desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ build_a_combo(opt);
+ break;
+ case STP_PARAMETER_TYPE_DOUBLE:
+ case STP_PARAMETER_TYPE_DIMENSION:
+ adj = opt->info.flt.adjustment;
+ if (adj)
+ {
+ if (opt->is_active && desc->p_level <= MAXIMUM_PARAMETER_LEVEL)
+ {
+ gtk_widget_show(GTK_WIDGET(SCALE_ENTRY_LABEL(adj)));
+ gtk_widget_show(GTK_WIDGET(SCALE_ENTRY_SCALE(adj)));
+ gtk_widget_show(GTK_WIDGET(SCALE_ENTRY_SPINBUTTON(adj)));
+ }
+ else
+ {
+ gtk_widget_hide(GTK_WIDGET(SCALE_ENTRY_LABEL(adj)));
+ gtk_widget_hide(GTK_WIDGET(SCALE_ENTRY_SCALE(adj)));
+ gtk_widget_hide(GTK_WIDGET(SCALE_ENTRY_SPINBUTTON(adj)));
+ }
+ }
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ if (opt->is_active && desc->p_level <= MAXIMUM_PARAMETER_LEVEL)
+ {
+ gtk_widget_show(GTK_WIDGET(opt->info.curve.label));
+ gtk_widget_show(GTK_WIDGET(opt->info.curve.button));
+ }
+ else
+ {
+ gtk_widget_hide(GTK_WIDGET(opt->info.curve.label));
+ gtk_widget_hide(GTK_WIDGET(opt->info.curve.button));
+ gtk_widget_hide(GTK_WIDGET(opt->info.curve.dialog));
+ }
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ if (opt->is_active && desc->p_level <= MAXIMUM_PARAMETER_LEVEL)
+ {
+ gtk_widget_show(GTK_WIDGET(opt->info.bool.checkbox));
+ }
+ else
+ {
+ gtk_widget_hide(GTK_WIDGET(opt->info.bool.checkbox));
+ }
+ break;
+ default:
+ break;
+ }
+ if (opt->checkbox)
+ {
+ if (!(opt->is_active) || desc->p_level > MAXIMUM_PARAMETER_LEVEL)
+ gtk_widget_hide(GTK_WIDGET(opt->checkbox));
+ else if (!(desc->is_mandatory))
+ gtk_widget_show(GTK_WIDGET(opt->checkbox));
+ }
+ }
+}
+
+static void
+color_button_callback(GtkWidget *widget, gpointer data)
+{
+ invalidate_preview_thumbnail();
+ update_adjusted_thumbnail();
+}
+
+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"),
+ stpui_get_image_filename(),
+ VERSION " - " RELEASE_DATE);
+
+ print_dialog =
+ stpui_dialog_new (plug_in_name, "print",
+ GTK_WIN_POS_MOUSE,
+ FALSE, TRUE, FALSE,
+
+ _("About"), about_callback,
+ NULL, NULL, NULL, FALSE, FALSE,
+ _("Print and\nSave Settings"), printandsave_callback,
+ NULL, NULL, NULL, FALSE, FALSE,
+ _("Save\nSettings"), save_callback,
+ NULL, NULL, NULL, FALSE, FALSE,
+ _("Print"), 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,
+ TRUE, TRUE, 0);
+ gtk_widget_show (main_vbox);
+
+ main_hbox = gtk_hbox_new (FALSE, 4);
+ gtk_box_pack_start (GTK_BOX (main_vbox), main_hbox, TRUE, TRUE, 0);
+ gtk_widget_show (main_hbox);
+
+ right_vbox = gtk_vbox_new (FALSE, 2);
+ gtk_box_pack_end (GTK_BOX (main_hbox), right_vbox, FALSE, FALSE, 0);
+ gtk_widget_show (right_vbox);
+
+ notebook = gtk_notebook_new ();
+ gtk_box_pack_start (GTK_BOX (right_vbox), notebook, TRUE, TRUE, 0);
+ gtk_widget_show (notebook);
+}
+
+static gint
+drawing_area_resize_callback(GtkWidget *widget, GdkEventConfigure *event)
+{
+ preview_size_vert = event->height - 1;
+ preview_size_horiz = event->width - 1;
+ invalidate_preview_thumbnail();
+ invalidate_frame();
+ preview_update();
+ return 1;
+}
+
+static void
+create_preview (void)
+{
+ GtkWidget *frame;
+ GtkWidget *event_box;
+
+ frame = gtk_frame_new (_("Preview"));
+ gtk_box_pack_start (GTK_BOX (main_hbox), frame, TRUE, TRUE, 0);
+ gtk_widget_show (frame);
+
+ preview = (GtkDrawingArea *) gtk_drawing_area_new ();
+ gtk_drawing_area_size(preview, preview_size_horiz + 1, preview_size_vert +1);
+ gtk_signal_connect(GTK_OBJECT(preview), "configure_event",
+ GTK_SIGNAL_FUNC(drawing_area_resize_callback), NULL);
+ 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 (preview_expose), NULL);
+ gtk_signal_connect (GTK_OBJECT (preview), "button_press_event",
+ GTK_SIGNAL_FUNC (preview_button_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (preview), "button_release_event",
+ GTK_SIGNAL_FUNC (preview_button_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (preview), "motion_notify_event",
+ GTK_SIGNAL_FUNC (preview_motion_callback), NULL);
+ gtk_widget_show (GTK_WIDGET (preview));
+
+ stpui_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."));
+
+ gtk_widget_set_events (GTK_WIDGET (preview),
+ GDK_EXPOSURE_MASK | GDK_BUTTON_MOTION_MASK |
+ GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
+}
+
+static GtkWidget *
+create_positioning_entry(GtkWidget *table, int hpos, int vpos,
+ const char *text, const char *help)
+{
+ return stpui_create_entry
+ (table, hpos, vpos, text, help, GTK_SIGNAL_FUNC(position_callback));
+}
+
+static GtkWidget *
+create_positioning_button(GtkWidget *box, int invalid,
+ const char *text, const char *help)
+{
+ GtkWidget *button = gtk_button_new_with_label(_(text));
+ gtk_box_pack_start(GTK_BOX(box), button, FALSE, TRUE, 0);
+ gtk_widget_show(button);
+ stpui_set_help_data(button, help);
+ gtk_signal_connect(GTK_OBJECT(button), "clicked",
+ GTK_SIGNAL_FUNC(position_button_callback),
+ (gpointer) invalid);
+ return button;
+}
+
+static void
+create_paper_size_frame(void)
+{
+ GtkWidget *frame;
+ GtkWidget *vbox;
+ GtkWidget *media_size_table;
+ GtkWidget *table;
+ int vpos = 0;
+
+ frame = gtk_frame_new (_("Paper Size"));
+ gtk_box_pack_start (GTK_BOX (right_vbox), frame, FALSE, TRUE, 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, 1, FALSE);
+ gtk_container_add (GTK_CONTAINER (vbox), table);
+ gtk_widget_show (table);
+
+ /*
+ * Media size combo box.
+ */
+
+ page_size_table = gtk_table_new(1, 1, FALSE);
+ gtk_widget_show (page_size_table);
+ gtk_table_attach_defaults(GTK_TABLE(table), page_size_table,
+ 0, 2, vpos, vpos + 1);
+ vpos++;
+ show_all_paper_sizes_button =
+ gtk_check_button_new_with_label(_("Show All Paper Sizes"));
+ gtk_table_attach_defaults
+ (GTK_TABLE(table), show_all_paper_sizes_button, 0, 2, vpos, vpos + 1);
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON(show_all_paper_sizes_button),
+ stpui_show_all_paper_sizes);
+ gtk_signal_connect(GTK_OBJECT(show_all_paper_sizes_button), "toggled",
+ GTK_SIGNAL_FUNC(show_all_paper_sizes_callback), NULL);
+ gtk_widget_show(show_all_paper_sizes_button);
+ vpos++;
+
+ /*
+ * Custom media size entries
+ */
+
+ media_size_table = gtk_table_new (1, 1, FALSE);
+ stpui_table_attach_aligned(GTK_TABLE (table), 0, vpos++, _("Dimensions:"),
+ 0.0, 0.5, media_size_table, 1, TRUE);
+ gtk_table_set_col_spacings (GTK_TABLE (media_size_table), 4);
+
+ custom_size_width = stpui_create_entry
+ (media_size_table, 0, 3, _("Width:"),
+ _("Width of the paper that you wish to print to"),
+ custom_media_size_callback);
+
+ custom_size_height = stpui_create_entry
+ (media_size_table, 2, 3, _("Height:"),
+ _("Height of the paper that you wish to print to"),
+ custom_media_size_callback);
+
+ vpos++;
+ auto_paper_size_button =
+ gtk_check_button_new_with_label(_("Automatic Paper Size"));
+ gtk_table_attach_defaults
+ (GTK_TABLE(table), auto_paper_size_button, 0, 2, vpos, vpos + 1);
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON(auto_paper_size_button), FALSE);
+ gtk_signal_connect(GTK_OBJECT(auto_paper_size_button), "toggled",
+ GTK_SIGNAL_FUNC(auto_paper_size_callback), NULL);
+}
+
+static void
+create_copy_number_frame(void)
+{
+ GtkWidget *frame;
+ GtkWidget *vbox;
+ GtkWidget *event_box;
+ GtkAdjustment *adj;
+
+ fprintf(stderr, "create_copy_number_frame\n");
+ frame = gtk_frame_new (_("Number of Copies"));
+ gtk_box_pack_start (GTK_BOX (right_vbox), frame, FALSE, TRUE, 0);
+ gtk_widget_show (frame);
+
+ vbox = gtk_hbox_new (FALSE, 2);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
+ gtk_container_add (GTK_CONTAINER (frame), vbox);
+ gtk_widget_show (vbox);
+
+ event_box = gtk_event_box_new ();
+ gtk_container_add (GTK_CONTAINER (vbox), event_box);
+ stpui_set_help_data(event_box,
+ _("Select the number of copies to print; "
+ "a value between 1 and 100"));
+ gtk_widget_show (event_box);
+
+ /*
+ * Number of Copies Spin Button
+ */
+
+ adj = (GtkAdjustment *) gtk_adjustment_new (1.0f, 1.0f, 100.0f,
+ 1.0f, 5.0f, 0.0f);
+ copy_count_spin_button = gtk_spin_button_new (adj, 0, 0);
+ gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (copy_count_spin_button), FALSE);
+ gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (copy_count_spin_button), TRUE);
+ gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (copy_count_spin_button),
+ GTK_UPDATE_IF_VALID);
+
+ gtk_signal_connect(GTK_OBJECT (adj), "value_changed",
+ GTK_SIGNAL_FUNC (copy_count_callback),
+ NULL);
+
+ gtk_container_add (GTK_CONTAINER (event_box), copy_count_spin_button);
+ gtk_widget_show(copy_count_spin_button);
+}
+
+static void
+create_positioning_frame (void)
+{
+ GtkWidget *frame;
+ GtkWidget *table;
+ GtkWidget *box;
+ GtkWidget *sep;
+
+ frame = gtk_frame_new (_("Image Position"));
+ gtk_box_pack_start (GTK_BOX (right_vbox), frame, FALSE, TRUE, 0);
+ gtk_widget_show (frame);
+
+ table = gtk_table_new (1, 1, 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_container_add (GTK_CONTAINER (frame), table);
+ gtk_widget_show (table);
+
+ /*
+ * Orientation option menu.
+ */
+
+ orientation_menu =
+ stpui_option_menu_new (FALSE,
+ _("Auto"), orientation_callback,
+ (gpointer) ORIENT_AUTO, NULL, NULL, 0,
+ _("Portrait"), orientation_callback,
+ (gpointer) ORIENT_PORTRAIT, NULL, NULL, 0,
+ _("Landscape"), orientation_callback,
+ (gpointer) ORIENT_LANDSCAPE, NULL, NULL, 0,
+ _("Upside down"), orientation_callback,
+ (gpointer) ORIENT_UPSIDEDOWN, NULL, NULL, 0,
+ _("Seascape"), orientation_callback,
+ (gpointer) ORIENT_SEASCAPE, NULL, NULL, 0,
+ NULL);
+ stpui_set_help_data (orientation_menu,
+ _("Select the orientation: portrait, landscape, "
+ "upside down, or seascape (upside down landscape)"));
+ stpui_table_attach_aligned (GTK_TABLE (table), 0, 0, _("Orientation:"),
+ 1.0, 0.5, orientation_menu, 4, TRUE);
+ sep = gtk_hseparator_new ();
+ gtk_table_attach_defaults (GTK_TABLE (table), sep, 0, 6, 1, 2);
+ gtk_widget_show (sep);
+
+ /*
+ * Position entries
+ */
+
+ left_entry = create_positioning_entry
+ (table, 0, 2, _("Left:"),
+ _("Distance from the left of the paper to the image"));
+#if 0
+ right_entry = create_positioning_entry
+ (table, 0, 3, _("Right:"),
+ _("Distance from the left of the paper to the right of the image"));
+#endif
+ right_border_entry = create_positioning_entry
+ (table, 0, 4, _("Right:"),
+ _("Distance from the right of the paper to the image"));
+ top_entry = create_positioning_entry
+ (table, 3, 2, _("Top:"),
+ _("Distance from the top of the paper to the image"));
+#if 0
+ bottom_entry = create_positioning_entry
+ (table, 3, 3, _("Bottom:"),
+ _("Distance from the top of the paper to bottom of the image"));
+#endif
+ bottom_border_entry = create_positioning_entry
+ (table, 3, 4, _("Bottom:"),
+ _("Distance from the bottom of the paper to the image"));
+ /*
+ * Center options
+ */
+
+ sep = gtk_hseparator_new ();
+ gtk_table_attach_defaults (GTK_TABLE (table), sep, 0, 6, 5, 6);
+ gtk_widget_show (sep);
+
+ box = gtk_hbox_new (TRUE, 4);
+ stpui_table_attach_aligned (GTK_TABLE (table), 0, 7, _("Center:"), 0.5, 0.5,
+ box, 5, TRUE);
+ recenter_horizontal_button = create_positioning_button
+ (box, INVALID_LEFT, _("Horizontal"),
+ _("Center the image horizontally on the paper"));
+ recenter_button = create_positioning_button
+ (box, INVALID_LEFT | INVALID_TOP, _("Both"),
+ _("Center the image on the paper"));
+ recenter_vertical_button = create_positioning_button
+ (box, INVALID_TOP, _("Vertical"),
+ _("Center the image vertically on the paper"));
+}
+
+static void
+create_printer_dialog (void)
+{
+ GtkWidget *table;
+ GtkWidget *label;
+ GtkWidget *event_box;
+ GSList *group;
+ gint i;
+ stp_string_list_t *manufacturer_list = stp_string_list_create();
+
+ setup_dialog = stpui_dialog_new(_("Setup Printer"), "print",
+ GTK_WIN_POS_MOUSE, FALSE, TRUE, FALSE,
+ _("OK"), setup_ok_callback,
+ NULL, NULL, NULL, TRUE, FALSE,
+ _("Cancel"), setup_cancel_callback,
+ NULL, 1, NULL, FALSE, TRUE,
+
+ NULL);
+
+ /*
+ * Top-level table for dialog.
+ */
+
+ table = gtk_table_new (4, 4, FALSE);
+ gtk_container_set_border_width (GTK_CONTAINER (table), 6);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 4);
+ gtk_table_set_row_spacing (GTK_TABLE (table), 0, 150);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (setup_dialog)->vbox), table,
+ TRUE, TRUE, 0);
+ gtk_widget_show (table);
+
+ /*
+ * Printer driver option menu.
+ */
+
+ label = gtk_label_new (_("Printer Make:"));
+ gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+ gtk_table_attach (GTK_TABLE (table), label, 1, 2, 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, 2, 4, 0, 2,
+ GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0);
+ gtk_widget_show (event_box);
+
+ stpui_set_help_data (event_box, _("Select the make of your printer"));
+
+ manufacturer_crawler = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (manufacturer_crawler),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_container_add (GTK_CONTAINER (event_box), manufacturer_crawler);
+ gtk_widget_show (manufacturer_crawler);
+
+ manufacturer_clist = gtk_clist_new (1);
+ gtk_widget_set_usize (manufacturer_clist, 200, 0);
+ gtk_clist_set_selection_mode(GTK_CLIST(manufacturer_clist),GTK_SELECTION_SINGLE);
+ gtk_container_add (GTK_CONTAINER (manufacturer_crawler), manufacturer_clist);
+ gtk_widget_show (manufacturer_clist);
+
+ gtk_signal_connect (GTK_OBJECT (manufacturer_clist), "select_row",
+ GTK_SIGNAL_FUNC (manufacturer_callback), NULL);
+
+
+ label = gtk_label_new (_("Printer Model:"));
+ gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+ gtk_table_attach (GTK_TABLE (table), label, 4, 5, 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, 5, 7, 0, 2,
+ GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0);
+ gtk_widget_show (event_box);
+
+ stpui_set_help_data (event_box, _("Select your printer model"));
+
+ 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 (print_driver_callback), NULL);
+
+
+ for (i = 0; i < stp_printer_model_count (); i ++)
+ {
+ const stp_printer_t *the_printer = stp_get_printer_by_index (i);
+
+ if (strcmp(stp_printer_get_long_name (the_printer), "") != 0 &&
+ strcmp(stp_printer_get_family(the_printer), "raw") != 0)
+ {
+ const gchar *make = stp_printer_get_manufacturer(the_printer);
+ if (! stp_string_list_is_present(manufacturer_list, make))
+ stp_string_list_add_string(manufacturer_list, make, make);
+ }
+ }
+
+ for (i = 0; i < stp_string_list_count(manufacturer_list); i++)
+ {
+ const stp_param_string_t *param =
+ stp_string_list_param(manufacturer_list, i);
+ gchar *xname = g_strdup(param->name);
+ gtk_clist_insert(GTK_CLIST(manufacturer_clist), i, &xname);
+ gtk_clist_set_row_data_full(GTK_CLIST(manufacturer_clist), i, xname,
+ g_free);
+ }
+ stp_string_list_destroy(manufacturer_list);
+ gtk_clist_sort(GTK_CLIST(manufacturer_clist));
+ build_printer_driver_clist();
+
+ /*
+ * 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, 1, 2, 3, 4,
+ GTK_FILL, GTK_FILL, 0, 0);
+ gtk_widget_show (ppd_label);
+
+ ppd_box = gtk_hbox_new (FALSE, 8);
+ gtk_table_attach (GTK_TABLE (table), ppd_box, 2, 7, 3, 4,
+ GTK_FILL, GTK_FILL, 0, 0);
+
+ ppd_file = gtk_entry_new ();
+ gtk_box_pack_start (GTK_BOX (ppd_box), ppd_file, TRUE, TRUE, 0);
+ gtk_widget_show (ppd_file);
+
+ stpui_set_help_data(ppd_file,_("Enter the correct PPD filename for your printer"));
+
+ 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 (ppd_box), ppd_button, FALSE, FALSE, 0);
+ gtk_widget_show (ppd_button);
+ gtk_widget_show (ppd_box);
+
+ stpui_set_help_data(ppd_button,
+ _("Choose the correct PPD filename for your printer"));
+ gtk_signal_connect (GTK_OBJECT (ppd_button), "clicked",
+ GTK_SIGNAL_FUNC (ppd_browse_callback), NULL);
+
+ /*
+ * Print command.
+ */
+
+ group = NULL;
+ for (i = 0; i < command_options_count; i++)
+ group = stpui_create_radio_button(&(command_options[i]), group, table,
+ 0, i > 0 ? i + 5 : i + 4,
+ command_type_callback);
+
+ standard_cmd_entry = gtk_entry_new();
+ gtk_table_attach (GTK_TABLE (table), standard_cmd_entry, 2, 7, 5, 6,
+ GTK_FILL, GTK_FILL, 0, 0);
+ gtk_entry_set_editable(GTK_ENTRY(standard_cmd_entry), FALSE);
+ gtk_widget_set_sensitive(standard_cmd_entry, FALSE);
+ gtk_widget_show (standard_cmd_entry);
+
+ queue_combo = gtk_combo_new ();
+ event_box = gtk_event_box_new ();
+ gtk_container_add (GTK_CONTAINER (event_box), queue_combo);
+ gtk_widget_show (queue_combo);
+ gtk_widget_show (event_box);
+ build_queue_combo();
+
+ stpui_set_help_data(event_box,
+ _("Select the name of the output queue (not the type, "
+ "or model, of printer) that you wish to print to"));
+ label = gtk_label_new(_("Printer Queue:"));
+ gtk_widget_show(label);
+ gtk_table_attach (GTK_TABLE (table), label, 2, 3, 4, 5,
+ GTK_FILL, GTK_FILL, 0, 0);
+ gtk_table_attach (GTK_TABLE (table), event_box, 3, 7, 4, 5,
+ GTK_FILL, GTK_FILL, 0, 0);
+
+ custom_command_entry = gtk_entry_new ();
+ gtk_table_attach (GTK_TABLE (table), custom_command_entry, 2, 7, 6, 7,
+ GTK_FILL, GTK_FILL, 0, 0);
+ gtk_signal_connect(GTK_OBJECT(custom_command_entry), "activate",
+ GTK_SIGNAL_FUNC(setup_callback), NULL);
+ gtk_widget_set_sensitive(custom_command_entry, FALSE);
+ gtk_widget_show (custom_command_entry);
+
+ stpui_set_help_data
+ (custom_command_entry, _("Enter the correct command to print to your printer. "));
+
+ file_entry = gtk_entry_new ();
+ gtk_table_attach (GTK_TABLE (table), file_entry, 2, 6, 7, 8,
+ GTK_FILL, GTK_FILL, 0, 0);
+ gtk_signal_connect(GTK_OBJECT(file_entry), "activate",
+ GTK_SIGNAL_FUNC(setup_callback), NULL);
+ gtk_widget_show (file_entry);
+
+ gtk_widget_set_sensitive(file_entry, FALSE);
+ stpui_set_help_data
+ (file_entry, _("Enter the file to print to. "));
+
+ file_button = gtk_button_new_with_label (_("Browse"));
+
+ gtk_table_attach (GTK_TABLE (table), file_button, 6, 7, 7, 8,
+ GTK_FILL, GTK_FILL, 0, 0);
+ gtk_widget_show (file_button);
+
+ stpui_set_help_data(file_button, _("File to print to"));
+ gtk_signal_connect (GTK_OBJECT (file_button), "clicked",
+ GTK_SIGNAL_FUNC (file_browse_callback), 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 (file_ok_callback), NULL);
+ gtk_signal_connect
+ (GTK_OBJECT (GTK_FILE_SELECTION (file_browser)->cancel_button), "clicked",
+ GTK_SIGNAL_FUNC (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 (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 =
+ stpui_dialog_new (_("Define New Printer"), "print",
+ GTK_WIN_POS_MOUSE, FALSE, FALSE, FALSE,
+ _("OK"), new_printer_ok_callback,
+ NULL, NULL, NULL, TRUE, FALSE,
+ _("Cancel"), gtk_widget_hide,
+ NULL, 1, NULL, FALSE, TRUE,
+ NULL);
+
+ table = gtk_table_new (1, 1, 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);
+ stpui_table_attach_aligned(GTK_TABLE (table), 0, 0, _("Printer Name:"), 1.0,
+ 0.5, new_printer_entry, 1, TRUE);
+
+ stpui_set_help_data(new_printer_entry,
+ _("Enter the name you wish to give this logical printer"));
+ gtk_signal_connect (GTK_OBJECT (new_printer_entry), "activate",
+ GTK_SIGNAL_FUNC (new_printer_ok_callback), NULL);
+}
+
+static void
+create_about_dialog (void)
+{
+ GtkWidget *label;
+ about_dialog =
+ stpui_dialog_new (_("About Gutenprint " PLUG_IN_VERSION), "print",
+ GTK_WIN_POS_MOUSE, FALSE, FALSE, FALSE,
+ _("OK"), gtk_widget_hide,
+ NULL, 1, NULL, TRUE, TRUE,
+ NULL);
+
+ label = gtk_label_new
+ (_("Gutenprint Version " PLUG_IN_VERSION "\n"
+ "\n"
+ "Copyright (C) 1997-2003 Michael Sweet, Robert Krawitz,\n"
+ "and the rest of the Gutenprint 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 *sep;
+ GtkWidget *printer_hbox;
+ GtkWidget *button;
+ GtkWidget *event_box;
+ GtkWidget *scrolled_window;
+ gint vpos = 0;
+
+ create_printer_dialog ();
+ create_about_dialog ();
+ create_new_printer_dialog ();
+
+ table = gtk_table_new (1, 1, 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);
+
+ stpui_set_help_data(event_box,
+ _("Select the name of the printer (not the type, "
+ "or model, of printer) that you wish to print to"));
+ stpui_table_attach_aligned(GTK_TABLE (table), 0, vpos++, _("Printer Name:"),
+ 0.0, 0.5, event_box, 1, TRUE);
+ printer_model_label = gtk_label_new ("");
+ stpui_table_attach_aligned(GTK_TABLE (table), 0, vpos++, _("Printer Model:"),
+ 0.0, 0.0, printer_model_label, 1, TRUE);
+ printer_hbox = gtk_hbox_new (TRUE, 4);
+ gtk_table_attach(GTK_TABLE (table), printer_hbox,
+ 1, 4, vpos, vpos + 1,
+ GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
+ vpos += 2;
+ gtk_widget_show (printer_hbox);
+
+ /*
+ * Setup printer button
+ */
+
+ button = gtk_button_new_with_label (_("Setup Printer..."));
+ stpui_set_help_data(button,
+ _("Choose the printer model, PPD file, and command "
+ "that is used to print to this printer"));
+ 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 (setup_open_callback), NULL);
+
+ /*
+ * New printer button
+ */
+
+ button = gtk_button_new_with_label (_("New Printer..."));
+ stpui_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."));
+ 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 (new_printer_open_callback), NULL);
+
+ sep = gtk_hseparator_new ();
+ gtk_table_attach (GTK_TABLE (table), sep, 0, 5, vpos, vpos + 1,
+ GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
+ gtk_widget_show (sep);
+ vpos++;
+
+ printer_features_table = gtk_table_new(1, 1, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (printer_features_table), 2);
+ gtk_table_set_row_spacings (GTK_TABLE (printer_features_table), 0);
+ gtk_widget_show (printer_features_table);
+
+ scrolled_window = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window),
+ printer_features_table);
+ gtk_table_attach_defaults(GTK_TABLE(table), scrolled_window,
+ 0, 6, vpos, vpos + 1);
+ gtk_widget_show(scrolled_window);
+}
+
+static void
+create_scaling_frame (void)
+{
+ GtkWidget *frame;
+ GtkWidget *vbox;
+ GtkWidget *hbox;
+ GtkWidget *table;
+ GtkWidget *box;
+ GtkWidget *label;
+ GtkWidget *event_box;
+ GtkWidget *sep;
+ GSList *group;
+
+ frame = gtk_frame_new (_("Image Size"));
+ gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
+
+ hbox = gtk_hbox_new (FALSE, 2);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 4);
+ gtk_container_add (GTK_CONTAINER (frame), hbox);
+ gtk_widget_show (hbox);
+
+ vbox = gtk_vbox_new (FALSE, 2);
+/* gtk_container_set_border_width (GTK_CONTAINER (vbox), 4); */
+ gtk_container_add (GTK_CONTAINER (hbox), vbox);
+ gtk_widget_show (vbox);
+
+ table = gtk_table_new (1, 1, 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 plist_callback at the end of initialization
+ * everything will be put right.
+ */
+ scaling_adjustment =
+ stpui_scale_entry_new (GTK_TABLE (table), 0, 0, _("Scaling:"), 100, 75,
+ 100.0, minimum_image_percent, 100.0,
+ 1.0, 10.0, 1, TRUE, 0, 0, NULL);
+ stpui_set_adjustment_tooltip(scaling_adjustment,
+ _("Set the scale (size) of the image"));
+ gtk_signal_connect (GTK_OBJECT (scaling_adjustment), "value_changed",
+ GTK_SIGNAL_FUNC (scaling_update), NULL);
+
+ box = gtk_hbox_new (FALSE, 4);
+ gtk_box_pack_start (GTK_BOX (vbox), box, TRUE, TRUE, 0);
+ gtk_widget_show (box);
+
+ /*
+ * The scale by percent/ppi toggles
+ */
+
+ table = gtk_table_new (1, 1, 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_FILL, 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);
+
+ stpui_set_help_data(event_box,
+ _("Select whether scaling is measured as percent of "
+ "available page size or number of output dots per inch"));
+
+ scaling_percent = gtk_radio_button_new_with_label (NULL, _("Percent"));
+ group = gtk_radio_button_group (GTK_RADIO_BUTTON (scaling_percent));
+ stpui_table_attach_aligned(GTK_TABLE (table), 0, 0, NULL, 0.5, 0.5,
+ scaling_percent, 2, TRUE);
+
+ stpui_set_help_data(scaling_percent, _("Scale the print to the size of the page"));
+ gtk_signal_connect (GTK_OBJECT (scaling_percent), "toggled",
+ GTK_SIGNAL_FUNC (scaling_callback), NULL);
+
+ scaling_ppi = gtk_radio_button_new_with_label (group, _("PPI"));
+ stpui_table_attach_aligned(GTK_TABLE (table), 2, 0, NULL, 0.5, 0.5,
+ scaling_ppi, 1, TRUE);
+
+ stpui_set_help_data(scaling_ppi,
+ _("Scale the print to the number of dots per inch"));
+ gtk_signal_connect (GTK_OBJECT (scaling_ppi), "toggled",
+ GTK_SIGNAL_FUNC (scaling_callback), NULL);
+
+ sep = gtk_vseparator_new ();
+ gtk_box_pack_start (GTK_BOX (hbox), sep, FALSE, FALSE, 8);
+ gtk_widget_show (sep);
+
+ /*
+ * The width/height enries
+ */
+
+ table = gtk_table_new (1, 1, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 2);
+ gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, FALSE, 0);
+ gtk_widget_show (table);
+
+ width_entry = create_positioning_entry
+ (table, 0, 0, _("Width:"), _("Set the width of the print"));
+ height_entry = create_positioning_entry
+ (table, 0, 1, _("Height:"), _("Set the height of the print"));
+
+ /*
+ * 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), 2, 2);
+ gtk_box_pack_end (GTK_BOX (hbox), scaling_image, FALSE, FALSE, 0);
+ gtk_widget_show (scaling_image);
+
+ stpui_set_help_data(scaling_image,
+ _("Set the print size to the size of the image"));
+ gtk_signal_connect (GTK_OBJECT (scaling_image), "clicked",
+ GTK_SIGNAL_FUNC (scaling_callback), NULL);
+}
+
+/*
+ * create_color_adjust_window (void)
+ *
+ * NOTES:
+ * creates the color adjuster popup, allowing the user to adjust brightness,
+ * contrast, saturation, etc.
+ */
+static void
+create_color_adjust_window (void)
+{
+ GtkWidget *table;
+ GtkWidget *label;
+ GtkWidget *event_box;
+ GtkWidget *scrolled_window;
+
+ initialize_thumbnail();
+
+ color_adjust_dialog =
+ stpui_dialog_new(_("Print Color Adjust"), "print",
+ GTK_WIN_POS_MOUSE, FALSE, TRUE, FALSE,
+
+ _("Set Defaults"), set_color_defaults,
+ NULL, NULL, NULL, FALSE, FALSE,
+ _("Close"), gtk_widget_hide,
+ NULL, 1, NULL, TRUE, TRUE,
+
+ NULL);
+
+ table = gtk_table_new (1, 1, 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), 0);
+/* gtk_table_set_row_spacing (GTK_TABLE (table), 8, 6); */
+
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (color_adjust_dialog)->vbox),
+ table, TRUE, TRUE, 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, 1, 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, thumbnail_w, thumbnail_h);
+ gtk_container_add (GTK_CONTAINER (event_box), GTK_WIDGET (swatch));
+ gtk_widget_show (GTK_WIDGET (swatch));
+
+ stpui_set_help_data (GTK_WIDGET (event_box), _("Image preview"));
+ gtk_signal_connect (GTK_OBJECT (swatch), "expose_event",
+ GTK_SIGNAL_FUNC (redraw_color_swatch),
+ NULL);
+
+ event_box = gtk_event_box_new ();
+ gtk_widget_show (GTK_WIDGET (event_box));
+ gtk_table_attach (GTK_TABLE (table), GTK_WIDGET (event_box),
+ 1, 2, 0, 1, 0, 0, 0, 0);
+
+ output_color_vbox = gtk_vbox_new(TRUE, 0);
+ gtk_container_add(GTK_CONTAINER(event_box), output_color_vbox);
+ gtk_widget_show(GTK_WIDGET(output_color_vbox));
+
+ label = gtk_label_new(_("View Output Channels:"));
+ gtk_box_pack_start(GTK_BOX(output_color_vbox), label, TRUE, TRUE, 0);
+ gtk_widget_show(GTK_WIDGET(label));
+
+ cyan_button = gtk_toggle_button_new_with_label(_("Cyan"));
+ gtk_box_pack_start(GTK_BOX(output_color_vbox), cyan_button, TRUE, TRUE, 0);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cyan_button), TRUE);
+ gtk_widget_show(GTK_WIDGET(cyan_button));
+ gtk_signal_connect (GTK_OBJECT (cyan_button), "toggled",
+ GTK_SIGNAL_FUNC (color_button_callback), NULL);
+
+ magenta_button = gtk_toggle_button_new_with_label(_("Magenta"));
+ gtk_box_pack_start(GTK_BOX(output_color_vbox), magenta_button, TRUE, TRUE,0);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(magenta_button), TRUE);
+ gtk_widget_show(GTK_WIDGET(magenta_button));
+ gtk_signal_connect (GTK_OBJECT (magenta_button), "toggled",
+ GTK_SIGNAL_FUNC (color_button_callback), NULL);
+
+ yellow_button = gtk_toggle_button_new_with_label(_("Yellow"));
+ gtk_box_pack_start(GTK_BOX(output_color_vbox), yellow_button, TRUE, TRUE, 0);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(yellow_button), TRUE);
+ gtk_widget_show(GTK_WIDGET(yellow_button));
+ gtk_signal_connect (GTK_OBJECT (yellow_button), "toggled",
+ GTK_SIGNAL_FUNC (color_button_callback), NULL);
+
+ black_button = gtk_toggle_button_new_with_label(_("Black"));
+ gtk_box_pack_start(GTK_BOX(output_color_vbox), black_button, TRUE, TRUE, 0);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(black_button), TRUE);
+ gtk_widget_show(GTK_WIDGET(black_button));
+ gtk_signal_connect (GTK_OBJECT (black_button), "toggled",
+ GTK_SIGNAL_FUNC (color_button_callback), NULL);
+
+ color_adjustment_table = gtk_table_new(1, 1, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (color_adjustment_table), 2);
+ gtk_table_set_row_spacings (GTK_TABLE (color_adjustment_table), 0);
+ gtk_container_set_border_width (GTK_CONTAINER (color_adjustment_table), 4);
+ gtk_widget_show (color_adjustment_table);
+ scrolled_window = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window),
+ color_adjustment_table);
+ gtk_table_attach_defaults(GTK_TABLE(table), scrolled_window,
+ 0, 2, 1, 2);
+ gtk_widget_show(scrolled_window);
+}
+
+static void
+create_image_settings_frame (void)
+{
+ GtkWidget *vbox;
+ GtkWidget *hbox;
+ GtkWidget *table;
+ GtkWidget *label;
+ GtkWidget *event_box;
+ GtkWidget *sep;
+ GSList *group;
+ gint i;
+
+ 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 (_("Output")));
+ gtk_widget_show (vbox);
+
+ table = gtk_table_new (1, 1, 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_FILL, GTK_FILL, 0, 0);
+ gtk_widget_show (event_box);
+
+ /*
+ * Output type toggles.
+ */
+
+ table = gtk_table_new (1, 1, 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_FILL, 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);
+
+ stpui_set_help_data(event_box, _("Select the desired output type"));
+
+ group = NULL;
+ for (i = 0; i < output_type_count; i++)
+ group = stpui_create_radio_button(&(output_types[i]), group, table, 0, i,
+ output_type_callback);
+
+ sep = gtk_hseparator_new ();
+ gtk_box_pack_start (GTK_BOX (vbox), sep, FALSE, FALSE, 0);
+ gtk_widget_show (sep);
+
+ /*
+ * Color adjust button
+ */
+ hbox = gtk_hbox_new (FALSE, 4);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
+ gtk_widget_show(hbox);
+ label = gtk_label_new("");
+ gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
+ gtk_widget_show(label);
+
+ adjust_color_button = gtk_button_new_with_label (_("Adjust Output..."));
+ gtk_misc_set_padding (GTK_MISC (GTK_BIN (adjust_color_button)->child), 4, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), adjust_color_button, FALSE, FALSE, 0);
+ gtk_widget_show(adjust_color_button);
+ label = gtk_label_new("");
+ gtk_box_pack_end(GTK_BOX(hbox), label, TRUE, TRUE, 0);
+ gtk_widget_show(label);
+
+ stpui_set_help_data(adjust_color_button,
+ _("Adjust color balance, brightness, contrast, "
+ "saturation, and dither algorithm"));
+ gtk_signal_connect_object (GTK_OBJECT (adjust_color_button), "clicked",
+ GTK_SIGNAL_FUNC (gtk_widget_show),
+ GTK_OBJECT (color_adjust_dialog));
+}
+
+static void
+create_units_frame (void)
+{
+ GtkWidget *vbox;
+ GtkWidget *table;
+ GtkWidget *label;
+ GtkWidget *event_box;
+ GSList *group;
+ gint i;
+
+ units_hbox = gtk_hbox_new(FALSE, 0);
+ label = gtk_label_new(_("Size Units:"));
+ gtk_widget_show(label);
+ gtk_box_pack_start(GTK_BOX(units_hbox), label, TRUE, TRUE, 0);
+ units_label = gtk_label_new(_(" "));
+ gtk_widget_show(units_label);
+ gtk_box_pack_start(GTK_BOX(units_hbox), units_label, TRUE, TRUE, 0);
+ gtk_widget_show(units_hbox);
+
+ vbox = gtk_vbox_new (FALSE, 4);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
+ gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, units_hbox);
+ gtk_widget_show (vbox);
+
+ /*
+ * The units toggles
+ */
+
+ table = gtk_table_new (1, 1, 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_FILL, 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);
+
+ stpui_set_help_data(event_box,
+ _("Select the base unit of measurement for printing"));
+
+ group = NULL;
+ for (i = 0; i < unit_count; i++)
+ {
+ unit_t *unit = &(units[i]);
+ unit->checkbox = gtk_radio_button_new_with_label(group, _(unit->name));
+ group = gtk_radio_button_group(GTK_RADIO_BUTTON(unit->checkbox));
+ stpui_table_attach_aligned(GTK_TABLE(table), i / 2, i % 2, NULL, 0.5,
+ 0.5, unit->checkbox, 1, TRUE);
+ stpui_set_help_data(unit->checkbox, _(unit->help));
+ gtk_signal_connect(GTK_OBJECT(unit->checkbox), "toggled",
+ GTK_SIGNAL_FUNC(unit_callback), (gpointer) i);
+ }
+}
+
+/*
+ * create_main_window()
+ */
+static void
+create_main_window (void)
+{
+
+ set_current_printer();
+ manufacturer = stp_printer_get_manufacturer(stp_get_printer(pv->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.
+ */
+
+ stpui_help_init();
+
+ create_top_level_structure ();
+
+ create_preview ();
+ create_printer_settings_frame ();
+ create_units_frame();
+ create_paper_size_frame();
+ create_copy_number_frame();
+ create_positioning_frame ();
+ create_scaling_frame ();
+ create_image_settings_frame ();
+
+ /*
+ * Now actually set up the correct values in the dialog
+ */
+
+ do_update_thumbnail = 1;
+ build_printer_combo ();
+ plist_callback (NULL, (gpointer) stpui_plist_current);
+ update_adjusted_thumbnail ();
+
+ gtk_widget_show (print_dialog);
+}
+
+static void
+set_entry_value(GtkWidget *entry, double value, int block)
+{
+ gchar s[255];
+ gdouble unit_scaler = units[pv->unit].scale;
+ const gchar *format = units[pv->unit].format;
+
+ g_snprintf(s, sizeof(s), format, value / unit_scaler);
+ 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
+reset_preview(void)
+{
+ if (!suppress_preview_reset)
+ {
+ stpui_enable_help();
+ buttons_pressed = preview_active = 0;
+ }
+}
+
+static void
+invalidate_preview_thumbnail (void)
+{
+ preview_valid = FALSE;
+}
+
+static void
+invalidate_frame (void)
+{
+ frame_valid = FALSE;
+}
+
+static void
+compute_scaling_limits(gdouble *min_ppi_scaling, gdouble *max_ppi_scaling)
+{
+ if (auto_paper_size)
+ {
+ *min_ppi_scaling =
+ FINCH * (gdouble) image_width / (gdouble) printable_width;
+ }
+ else
+ {
+ gdouble min_ppi_scaling1 =
+ FINCH * (gdouble) image_width / (gdouble) printable_width;
+ gdouble min_ppi_scaling2 =
+ FINCH * (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 / minimum_image_percent;
+}
+
+/*
+ * scaling_update() - Update the scaling scale using the slider.
+ */
+static void
+scaling_update (GtkAdjustment *adjustment)
+{
+ reset_preview ();
+
+ if (pv->scaling != adjustment->value)
+ {
+ invalidate_preview_thumbnail ();
+ if (GTK_TOGGLE_BUTTON (scaling_ppi)->active)
+ pv->scaling = -adjustment->value;
+ else
+ pv->scaling = adjustment->value;
+
+ suppress_scaling_adjustment = TRUE;
+ preview_update ();
+ suppress_scaling_adjustment = FALSE;
+ }
+}
+
+/*
+ * scaling_callback() - Update the scaling scale using radio buttons.
+ */
+static void
+scaling_callback (GtkWidget *widget)
+{
+ gdouble max_ppi_scaling;
+ gdouble min_ppi_scaling;
+ gdouble current_scale;
+
+ reset_preview ();
+
+ if (suppress_scaling_callback)
+ return;
+
+ compute_scaling_limits(&min_ppi_scaling, &max_ppi_scaling);
+
+ 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);
+ pv->scaling = 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 = minimum_image_percent;
+ 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 < minimum_image_percent)
+ new_percent = minimum_image_percent;
+
+ GTK_ADJUSTMENT (scaling_adjustment)->value = new_percent;
+ pv->scaling = 0.0;
+ }
+ else if (widget == scaling_image)
+ {
+ gdouble yres = image_yres;
+
+ invalidate_preview_thumbnail ();
+
+ 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;
+ pv->scaling = 0.0;
+ }
+
+ if (widget == scaling_ppi || widget == scaling_percent)
+ suppress_preview_update++;
+ gtk_adjustment_changed (GTK_ADJUSTMENT (scaling_adjustment));
+ gtk_adjustment_value_changed (GTK_ADJUSTMENT (scaling_adjustment));
+ if (auto_paper_size)
+ set_media_size(stp_get_string_parameter(pv->v, "PageSize"));
+ if (widget == scaling_ppi || widget == scaling_percent)
+ suppress_preview_update--;
+}
+
+/****************************************************************************
+ *
+ * plist_build_combo
+ *
+ ****************************************************************************/
+static void
+plist_build_combo (GtkWidget *combo, /* I - Combo widget */
+ GtkWidget *label,
+ stp_string_list_t *items, /* I - Menu items */
+ int active,
+ 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) */
+ int (*check_func)(const char *string),
+ gpointer data)
+{
+ gint i; /* Looping var */
+ GList *list = 0;
+ gint num_items = 0;
+ GtkEntry *entry = GTK_ENTRY (GTK_COMBO (combo)->entry);
+
+ if (check_func && items)
+ {
+ stp_string_list_t *new_items = stp_string_list_create();
+ num_items = stp_string_list_count(items);
+ for (i = 0; i < num_items; i++)
+ {
+ stp_param_string_t *param = stp_string_list_param(items, i);
+ if ((*check_func)(param->name))
+ stp_string_list_add_string(new_items, param->name, param->text);
+ }
+ items = new_items;
+ }
+
+ if (items)
+ num_items = stp_string_list_count(items);
+
+ if (*callback_id != -1)
+ gtk_signal_disconnect (GTK_OBJECT (entry), *callback_id);
+ gtk_entry_set_editable (entry, FALSE);
+
+ if (!active || 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_hide (combo);
+ if (label)
+ gtk_widget_hide(label);
+ if (check_func && items)
+ stp_string_list_destroy(items);
+ return;
+ }
+
+ for (i = 0; i < num_items; i ++)
+ list = g_list_append(list, g_strdup(stp_string_list_param(items, i)->text));
+
+ gtk_combo_set_popdown_strings (GTK_COMBO (combo), list);
+
+ for (i = 0; i < num_items; i ++)
+ if (strcmp(stp_string_list_param(items, i)->name, cur_item) == 0)
+ break;
+
+ if (i >= num_items && def_value)
+ for (i = 0; i < num_items; i ++)
+ if (strcmp(stp_string_list_param(items, i)->name, def_value) == 0)
+ break;
+
+ if (i >= num_items)
+ i = 0;
+
+ gtk_entry_set_text (entry, stp_string_list_param(items, i)->text);
+
+ gtk_combo_set_value_in_list (GTK_COMBO (combo), TRUE, FALSE);
+ gtk_widget_set_sensitive (combo, TRUE);
+ gtk_widget_show (combo);
+ if (label)
+ gtk_widget_show(label);
+
+ *callback_id = gtk_signal_connect (GTK_OBJECT (entry), "changed", callback,
+ data);
+ if (check_func && items)
+ stp_string_list_destroy(items);
+}
+
+void
+stpui_set_image_dimensions(gint width, gint height)
+{
+ image_true_width = width;
+ image_true_height = height;
+}
+
+void
+stpui_set_image_resolution(gdouble xres, gdouble yres)
+{
+ image_xres = xres;
+ image_yres = yres;
+}
+
+gint
+stpui_compute_orientation(void)
+{
+ if (auto_paper_size ||
+ (printable_width >= printable_height &&
+ image_true_width >= image_true_height) ||
+ (printable_height >= printable_width &&
+ image_true_height >= image_true_width))
+ return ORIENT_PORTRAIT;
+ else
+ return ORIENT_LANDSCAPE;
+}
+
+static void
+set_orientation(int orientation)
+{
+ pv->orientation = orientation;
+ if (orientation == ORIENT_AUTO)
+ orientation = stpui_compute_orientation();
+ physical_orientation = orientation;
+ switch (orientation)
+ {
+ case ORIENT_PORTRAIT:
+ case ORIENT_UPSIDEDOWN:
+ image_height = image_true_height;
+ image_width = image_true_width;
+ preview_thumbnail_h = thumbnail_h;
+ preview_thumbnail_w = thumbnail_w;
+ break;
+ case ORIENT_LANDSCAPE:
+ case ORIENT_SEASCAPE:
+ image_height = image_true_width;
+ image_width = image_true_height;
+ preview_thumbnail_h = thumbnail_w;
+ preview_thumbnail_w = thumbnail_h;
+ break;
+ }
+ update_adjusted_thumbnail();
+}
+
+static void
+position_button_callback(GtkWidget *widget, gpointer data)
+{
+ reset_preview();
+ pv->invalid_mask |= (gint) data;
+ preview_update ();
+}
+
+/*
+ * position_callback() - callback for position entry widgets
+ */
+static void
+position_callback (GtkWidget *widget)
+{
+ gdouble new_printed_value = atof (gtk_entry_get_text (GTK_ENTRY (widget)));
+ gint new_value = SCALE(new_printed_value, units[pv->unit].scale);
+
+ reset_preview ();
+ suppress_preview_update++;
+
+ if (widget == top_entry)
+ stp_set_top(pv->v, new_value);
+/*
+ else if (widget == bottom_entry)
+ stp_set_top(pv->v, new_value - print_height);
+*/
+ else if (widget == bottom_border_entry)
+ stp_set_top (pv->v, paper_height - print_height - new_value);
+ else if (widget == left_entry)
+ stp_set_left (pv->v, new_value);
+/*
+ else if (widget == right_entry)
+ stp_set_left(pv->v, new_value - print_width);
+*/
+ else if (widget == right_border_entry)
+ stp_set_left (pv->v, paper_width - print_width - new_value);
+ else if (widget == width_entry || widget == height_entry)
+ {
+ gboolean was_percent = (pv->scaling >= 0);
+ if (pv->scaling >= 0)
+ {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scaling_ppi), TRUE);
+ scaling_callback (scaling_ppi);
+ }
+ if (widget == width_entry)
+ GTK_ADJUSTMENT (scaling_adjustment)->value =
+ ((gdouble) image_width) / (new_value / FINCH);
+ else
+ GTK_ADJUSTMENT (scaling_adjustment)->value =
+ ((gdouble) image_height) / (new_value / FINCH);
+ 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));
+ }
+ }
+
+ suppress_preview_update--;
+ preview_update ();
+}
+
+static void
+set_adjustment_active(option_t *opt, gboolean active, gboolean do_toggle)
+{
+ GtkObject *adj = opt->info.flt.adjustment;
+ if (do_toggle)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(opt->checkbox), active);
+ gtk_widget_set_sensitive
+ (GTK_WIDGET (SCALE_ENTRY_LABEL (adj)), active);
+ gtk_widget_set_sensitive
+ (GTK_WIDGET (SCALE_ENTRY_SCALE (adj)), active);
+ gtk_widget_set_sensitive
+ (GTK_WIDGET (SCALE_ENTRY_SPINBUTTON (adj)), active);
+}
+
+static void
+set_combo_active(option_t *opt, gboolean active, gboolean do_toggle)
+{
+ if (do_toggle)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(opt->checkbox), active);
+ gtk_widget_set_sensitive(GTK_WIDGET(opt->info.list.combo), active);
+ gtk_widget_set_sensitive(GTK_WIDGET(opt->info.list.label), active);
+}
+
+static void
+set_curve_active(option_t *opt, gboolean active, gboolean do_toggle)
+{
+ if (do_toggle)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(opt->checkbox), active);
+ gtk_widget_set_sensitive(GTK_WIDGET(opt->info.curve.button), active);
+ gtk_widget_set_sensitive(GTK_WIDGET(opt->info.curve.label), active);
+ if (active)
+ {
+ if (opt->info.curve.is_visible)
+ gtk_widget_show(GTK_WIDGET(opt->info.curve.dialog));
+ }
+ else
+ gtk_widget_hide(GTK_WIDGET(opt->info.curve.dialog));
+}
+
+static void
+set_bool_active(option_t *opt, gboolean active, gboolean do_toggle)
+{
+ if (do_toggle)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(opt->checkbox), active);
+ gtk_widget_set_sensitive(GTK_WIDGET(opt->info.bool.checkbox), active);
+}
+
+static void
+do_color_updates (void)
+{
+ int i;
+ for (i = 0; i < current_option_count; i++)
+ {
+ option_t *opt = &(current_options[i]);
+ if (opt->fast_desc->p_level <= MAXIMUM_PARAMETER_LEVEL)
+ {
+ switch (opt->fast_desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_DOUBLE:
+ if (stp_check_float_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE))
+ gtk_adjustment_set_value
+ (GTK_ADJUSTMENT(opt->info.flt.adjustment),
+ stp_get_float_parameter(pv->v, opt->fast_desc->name));
+ if (stp_check_float_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE) ||
+ opt->fast_desc->is_mandatory)
+ set_adjustment_active(opt, TRUE, TRUE);
+ else
+ set_adjustment_active(opt, FALSE, TRUE);
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ if (stp_check_dimension_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE))
+ {
+ gdouble unit_scaler = units[pv->unit].scale;
+ gtk_adjustment_set_value
+ (GTK_ADJUSTMENT(opt->info.flt.adjustment),
+ (stp_get_dimension_parameter(pv->v, opt->fast_desc->name) /
+ unit_scaler));
+ }
+ if (stp_check_dimension_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE) ||
+ opt->fast_desc->is_mandatory)
+ set_adjustment_active(opt, TRUE, TRUE);
+ else
+ set_adjustment_active(opt, FALSE, TRUE);
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ if (stp_check_curve_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE) ||
+ opt->fast_desc->is_mandatory)
+ set_curve_active(opt, TRUE, TRUE);
+ else
+ set_curve_active(opt, FALSE, TRUE);
+ break;
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ if (strcmp(opt->fast_desc->name, "PageSize") == 0)
+ build_page_size_combo(opt);
+ else if (stp_check_string_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE))
+ plist_build_combo(opt->info.list.combo, opt->info.list.label,
+ opt->info.list.params, opt->is_active,
+ (stp_get_string_parameter
+ (pv->v, opt->fast_desc->name)),
+ opt->info.list.default_val, combo_callback,
+ &(opt->info.list.callback_id),
+ NULL, opt);
+ if (stp_check_string_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE) ||
+ opt->fast_desc->is_mandatory)
+ set_combo_active(opt, TRUE, TRUE);
+ else
+ set_combo_active(opt, FALSE, TRUE);
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ if (stp_check_boolean_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE))
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON(opt->info.bool.checkbox),
+ stp_get_boolean_parameter(pv->v, opt->fast_desc->name));
+ if (stp_check_boolean_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE) ||
+ opt->fast_desc->is_mandatory)
+ set_bool_active(opt, TRUE, TRUE);
+ else
+ set_bool_active(opt, FALSE, TRUE);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ update_adjusted_thumbnail ();
+}
+
+static void
+update_options(void)
+{
+ gtk_widget_hide(page_size_table);
+ gtk_widget_hide(printer_features_table);
+ gtk_widget_hide(color_adjustment_table);
+ populate_options(pv->v);
+ populate_option_table(page_size_table, STP_PARAMETER_CLASS_CORE);
+ populate_option_table(printer_features_table, STP_PARAMETER_CLASS_FEATURE);
+ populate_option_table(color_adjustment_table, STP_PARAMETER_CLASS_OUTPUT);
+ gtk_widget_show(page_size_table);
+ gtk_widget_show(printer_features_table);
+ gtk_widget_show(color_adjustment_table);
+ set_options_active(NULL);
+}
+
+static void
+update_standard_print_command(void)
+{
+ char *label_text =
+ stpui_build_standard_print_command(pv, stp_get_printer(pv->v));
+ gtk_entry_set_text(GTK_ENTRY(standard_cmd_entry), label_text);
+ g_free(label_text);
+}
+
+static void
+do_all_updates(void)
+{
+ gint i;
+ suppress_preview_update++;
+ set_orientation(pv->orientation);
+ invalidate_preview_thumbnail ();
+ preview_update ();
+ update_standard_print_command();
+
+ if (pv->scaling < 0)
+ {
+ gdouble tmp = -pv->scaling;
+ gdouble max_ppi_scaling;
+ gdouble min_ppi_scaling;
+
+ compute_scaling_limits(&min_ppi_scaling, &max_ppi_scaling);
+
+ 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 = pv->scaling;
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scaling_percent), TRUE);
+ GTK_ADJUSTMENT (scaling_adjustment)->lower = minimum_image_percent;
+ 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");
+ }
+
+ for (i = 0; i < output_type_count; i++)
+ {
+ if (stp_get_string_parameter(pv->v, "PrintingMode") &&
+ strcmp(output_types[i].value,
+ stp_get_string_parameter(pv->v, "PrintingMode")) == 0)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(output_types[i].button),
+ TRUE);
+ }
+
+ /*
+ * Now get option parameters.
+ */
+
+ update_options();
+ do_color_updates ();
+
+ gtk_option_menu_set_history (GTK_OPTION_MENU (orientation_menu),
+ pv->orientation + 1);
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(units[pv->unit].checkbox),
+ TRUE);
+ gtk_label_set_text(GTK_LABEL(units_label), units[pv->unit].name);
+ suppress_preview_update--;
+ preview_update ();
+}
+
+static void
+copy_count_callback(GtkAdjustment *adjustment, gpointer data)
+{
+ gint copy_count = (gint) adjustment->value;
+ stpui_plist_set_copy_count(pv, copy_count);
+ update_standard_print_command();
+}
+
+static void
+auto_paper_size_callback(GtkWidget *widget, gpointer data)
+{
+ auto_paper_size =
+ gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auto_paper_size_button));
+ pv->auto_size_roll_feed_paper = auto_paper_size;
+ set_orientation(pv->orientation);
+ do_all_updates();
+}
+
+static void
+setup_auto_paper_size(void)
+{
+ const stp_papersize_t *ps =
+ stp_get_papersize_by_name(stp_get_string_parameter(pv->v, "PageSize"));
+ if (ps->height == 0 && ps->width != 0) /* Implies roll feed */
+ {
+ gtk_signal_handler_block_by_data(GTK_OBJECT(auto_paper_size_button),
+ NULL);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auto_paper_size_button),
+ pv->auto_size_roll_feed_paper);
+ gtk_widget_show(auto_paper_size_button);
+ gtk_signal_handler_unblock_by_data(GTK_OBJECT(auto_paper_size_button),
+ NULL);
+ }
+ else
+ {
+ gtk_widget_hide(auto_paper_size_button);
+ auto_paper_size = 0;
+ }
+}
+
+static void
+queue_callback (GtkWidget *widget,
+ gpointer data)
+{
+ int i;
+ int count = stp_string_list_count(stpui_system_print_queues);
+ const gchar *result =
+ gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(queue_combo)->entry));
+ for (i = 0; i < count; i++)
+ {
+ const stp_param_string_t *s =
+ stp_string_list_param(stpui_system_print_queues, i);
+ if (!strcmp(result, s->text))
+ {
+ stpui_plist_set_queue_name(pv, s->name);
+ do_all_updates();
+ return;
+ }
+ }
+}
+
+static void
+setup_callback (GtkWidget *widget)
+{
+ gchar *new_value = gtk_entry_get_text (GTK_ENTRY (widget));
+
+ if (widget == custom_command_entry)
+ stpui_plist_set_custom_command(pv, new_value);
+ else if (widget == file_entry)
+ {
+ stpui_plist_set_output_filename(pv, new_value);
+ gtk_file_selection_set_filename
+ (GTK_FILE_SELECTION (file_browser),
+ gtk_entry_get_text (GTK_ENTRY (file_entry)));
+ }
+}
+
+/*
+ * plist_callback() - Update the current system printer.
+ */
+static void
+plist_callback (GtkWidget *widget,
+ gpointer data)
+{
+ gint i;
+ char *tmp;
+ stp_parameter_t desc;
+
+ suppress_preview_update++;
+ invalidate_frame ();
+ invalidate_preview_thumbnail ();
+ reset_preview ();
+
+ if (widget)
+ {
+ const gchar *result =
+ gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(printer_combo)->entry));
+
+ for (i = 0; i < stpui_plist_count; i++)
+ {
+ if (! strcmp (result, stp_string_list_param(printer_list, i)->text))
+ {
+ stpui_plist_current = i;
+ break;
+ }
+ }
+ }
+ else
+ {
+ stpui_plist_current = (gint) data;
+ }
+
+ set_current_printer();
+ build_queue_combo();
+ manufacturer = stp_printer_get_manufacturer(stp_get_printer(pv->v));
+ build_printer_driver_clist();
+
+ if (strcmp(stp_get_driver(pv->v), "") != 0)
+ tmp_printer = stp_get_printer(pv->v);
+
+ stp_describe_parameter(pv->v, "PrintingMode", &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_STRING_LIST)
+ {
+ if (!stp_string_list_is_present(desc.bounds.str, "Color"))
+ {
+ gtk_widget_set_sensitive (output_types[1].button, TRUE);
+ if (gtk_toggle_button_get_active
+ (GTK_TOGGLE_BUTTON (output_types[0].button)) == TRUE)
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON (output_types[1].button), TRUE);
+ gtk_widget_set_sensitive (output_types[0].button, FALSE);
+ }
+ else if (!stp_string_list_is_present(desc.bounds.str, "BW"))
+ {
+ gtk_widget_set_sensitive (output_types[0].button, TRUE);
+ if (gtk_toggle_button_get_active
+ (GTK_TOGGLE_BUTTON (output_types[1].button)) == TRUE)
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON (output_types[0].button), TRUE);
+ gtk_widget_set_sensitive (output_types[1].button, FALSE);
+ }
+ else
+ {
+ gtk_widget_set_sensitive (output_types[0].button, TRUE);
+ gtk_widget_set_sensitive (output_types[1].button, TRUE);
+ }
+ }
+ stp_parameter_description_destroy(&desc);
+ gtk_entry_set_text(GTK_ENTRY(file_entry),
+ stpui_plist_get_output_filename(pv));
+ tmp = stpui_build_standard_print_command(pv, stp_get_printer(pv->v));
+ gtk_entry_set_text(GTK_ENTRY(standard_cmd_entry), tmp);
+ stp_free(tmp);
+ gtk_entry_set_text(GTK_ENTRY(custom_command_entry),
+ stpui_plist_get_custom_command(pv));
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(copy_count_spin_button),
+ (gfloat) stpui_plist_get_copy_count(pv));
+ do_all_updates();
+
+ setup_update ();
+ do_all_updates();
+ suppress_preview_update--;
+ update_adjusted_thumbnail();
+ preview_update ();
+}
+
+static void
+show_all_paper_sizes_callback(GtkWidget *widget, gpointer data)
+{
+ int i;
+ stpui_show_all_paper_sizes =
+ gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+ for (i = 0; i < current_option_count; i++)
+ {
+ option_t *option = &(current_options[i]);
+ if (option->fast_desc &&
+ strcmp(option->fast_desc->name, "PageSize") == 0)
+ {
+ build_a_combo(option);
+ break;
+ }
+ }
+}
+
+static void
+custom_media_size_callback(GtkWidget *widget,
+ gpointer data)
+{
+ gint width_limit, height_limit;
+ gint min_width_limit, min_height_limit;
+ gdouble new_printed_value = atof(gtk_entry_get_text(GTK_ENTRY(widget)));
+ gint new_value = SCALE(new_printed_value, units[pv->unit].scale);
+ invalidate_frame ();
+ invalidate_preview_thumbnail ();
+ reset_preview ();
+
+ stp_get_size_limit(pv->v, &width_limit, &height_limit,
+ &min_width_limit, &min_height_limit);
+ if (widget == custom_size_width)
+ {
+ 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->v, new_value);
+ }
+ else
+ {
+ 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->v, new_value);
+ }
+ set_entry_value (widget, new_value, 0);
+ preview_update ();
+}
+
+
+/*
+ * media_size_callback() - Update the current media size.
+ */
+static void
+set_media_size(const gchar *new_media_size)
+{
+ static int setting_media_size = 0;
+ const stp_papersize_t *pap = stp_get_papersize_by_name (new_media_size);
+
+ if (setting_media_size)
+ return;
+ setting_media_size++;
+
+ if (pap)
+ {
+ gint size;
+ int old_width = stp_get_page_width(pv->v);
+ int old_height = stp_get_page_height(pv->v);
+ int need_preview_update = 0;
+
+ if (! stpui_show_all_paper_sizes &&
+ (pap->paper_unit == PAPERSIZE_METRIC_EXTENDED ||
+ pap->paper_unit == PAPERSIZE_ENGLISH_EXTENDED))
+ {
+ int i;
+ stp_parameter_t desc;
+ stp_describe_parameter(pv->v, "PageSize", &desc);
+ stp_set_string_parameter(pv->v, "PageSize", desc.deflt.str);
+ pap = stp_get_papersize_by_name(desc.deflt.str);
+ stp_parameter_description_destroy(&desc);
+ for (i = 0; i < current_option_count; i++)
+ {
+ option_t *option = &(current_options[i]);
+ if (option->fast_desc &&
+ strcmp(option->fast_desc->name, "PageSize") == 0)
+ {
+ build_a_combo(option);
+ break;
+ }
+ }
+ }
+
+ if (pap->width == 0)
+ {
+ int max_w, max_h, min_w, min_h;
+ stp_get_size_limit(pv->v, &max_w, &max_h, &min_w, &min_h);
+ size = old_width;
+ if (size < min_w)
+ size = min_w;
+ else if (size > max_w)
+ size = max_w;
+ gtk_widget_set_sensitive (GTK_WIDGET (custom_size_width), TRUE);
+ gtk_entry_set_editable (GTK_ENTRY (custom_size_width), TRUE);
+ }
+ else
+ {
+ size = pap->width;
+ gtk_widget_set_sensitive (GTK_WIDGET (custom_size_width), FALSE);
+ gtk_entry_set_editable (GTK_ENTRY (custom_size_width), FALSE);
+ }
+ if (size != old_width)
+ {
+ need_preview_update = 1;
+ set_entry_value (custom_size_width, size, 0);
+ stp_set_page_width (pv->v, size);
+ }
+
+ setup_auto_paper_size();
+ if (pap->height == 0)
+ {
+ int max_w, max_h, min_w, min_h;
+ stp_get_size_limit(pv->v, &max_w, &max_h, &min_w, &min_h);
+ if (auto_paper_size)
+ {
+ int l, r, b, t;
+ stp_set_page_height(pv->v, 0);
+ old_height = 0;
+ stp_get_imageable_area(pv->v, &l, &r, &b, &t);
+ gtk_widget_set_sensitive(GTK_WIDGET(custom_size_height), FALSE);
+ gtk_entry_set_editable(GTK_ENTRY(custom_size_height), FALSE);
+ size = print_height;
+ }
+ else
+ {
+ gtk_widget_set_sensitive (GTK_WIDGET (custom_size_height), TRUE);
+ gtk_entry_set_editable (GTK_ENTRY (custom_size_height), TRUE);
+ size = old_height;
+ }
+ if (size < min_h)
+ size = min_h;
+ else if (size > max_h)
+ size = max_h;
+ }
+ else
+ {
+ size = pap->height;
+ gtk_widget_set_sensitive(GTK_WIDGET (custom_size_height), FALSE);
+ gtk_entry_set_editable (GTK_ENTRY (custom_size_height), FALSE);
+ }
+ if (size != old_height)
+ {
+ need_preview_update = 1;
+ set_entry_value (custom_size_height, size, 0);
+ stp_set_page_height (pv->v, size);
+ }
+ if (need_preview_update)
+ {
+ invalidate_preview_thumbnail();
+ invalidate_frame();
+ preview_update();
+ }
+ }
+ setting_media_size--;
+}
+
+static gboolean
+refresh_all_options(gpointer data)
+{
+ do_all_updates();
+ do_all_updates(); /* Update twice to pick up cascading changes */
+ return FALSE;
+}
+
+static void
+combo_callback(GtkWidget *widget, gpointer data)
+{
+ option_t *option = (option_t *)data;
+ const gchar *new_value =
+ stpui_combo_get_name(option->info.list.combo, option->info.list.params);
+ const gchar *value =
+ stp_get_string_parameter(pv->v, option->fast_desc->name);
+ reset_preview();
+ if (!value || strcmp(value, new_value) != 0)
+ {
+ invalidate_frame();
+ invalidate_preview_thumbnail();
+ stp_set_string_parameter(pv->v, option->fast_desc->name, new_value);
+ if (strcmp(option->fast_desc->name, "PageSize") == 0)
+ set_media_size(new_value);
+ g_idle_add(refresh_all_options, NULL);
+ if (option->fast_desc->p_class == STP_PARAMETER_CLASS_OUTPUT)
+ update_adjusted_thumbnail();
+ preview_update();
+ }
+}
+
+/*
+ * orientation_callback() - Update the current media size.
+ */
+static void
+orientation_callback (GtkWidget *widget,
+ gpointer data)
+{
+ reset_preview ();
+
+ if (pv->orientation != (gint) data)
+ {
+ invalidate_preview_thumbnail ();
+ set_orientation((gint) data);
+ preview_update ();
+ }
+}
+
+/*
+ * output_type_callback() - Update the current output type.
+ */
+static void
+output_type_callback (GtkWidget *widget,
+ gpointer data)
+{
+ reset_preview ();
+
+ if (GTK_TOGGLE_BUTTON (widget)->active)
+ {
+ if (strcmp((const char *) data, "BW") == 0)
+ gtk_widget_hide(output_color_vbox);
+ else
+ gtk_widget_show(output_color_vbox);
+ stp_set_string_parameter(pv->v, "PrintingMode", (const char *) data);
+ invalidate_preview_thumbnail ();
+ update_adjusted_thumbnail ();
+ set_options_active(NULL);
+ preview_update ();
+ do_all_updates();
+ }
+}
+
+static void
+command_type_callback(GtkWidget *widget, gpointer data)
+{
+ if (strcmp((const char *) data, "Standard") == 0)
+ {
+ gtk_widget_set_sensitive(standard_cmd_entry, TRUE);
+ gtk_widget_set_sensitive(queue_combo, TRUE);
+ gtk_widget_set_sensitive(file_entry, FALSE);
+ gtk_entry_set_editable(GTK_ENTRY(file_entry), FALSE);
+ gtk_widget_set_sensitive(custom_command_entry, FALSE);
+ gtk_entry_set_editable(GTK_ENTRY(custom_command_entry), FALSE);
+ gtk_widget_hide(GTK_WIDGET(file_browser));
+ gtk_widget_set_sensitive(file_button, FALSE);
+ gtk_widget_set_sensitive(copy_count_spin_button, TRUE);
+ stpui_plist_set_command_type(pv, COMMAND_TYPE_DEFAULT);
+ }
+ else if (strcmp((const char *) data, "Custom") == 0)
+ {
+ gtk_widget_set_sensitive(standard_cmd_entry, FALSE);
+ gtk_widget_set_sensitive(queue_combo, FALSE);
+ gtk_widget_set_sensitive(file_entry, FALSE);
+ gtk_entry_set_editable(GTK_ENTRY(file_entry), FALSE);
+ gtk_widget_set_sensitive(custom_command_entry, TRUE);
+ gtk_entry_set_editable(GTK_ENTRY(custom_command_entry), TRUE);
+ gtk_widget_hide(GTK_WIDGET(file_browser));
+ gtk_widget_set_sensitive(file_button, FALSE);
+ gtk_widget_set_sensitive(copy_count_spin_button, FALSE);
+ stpui_plist_set_command_type(pv, COMMAND_TYPE_CUSTOM);
+ }
+ else if (strcmp((const char *) data, "File") == 0)
+ {
+ gtk_widget_set_sensitive(standard_cmd_entry, FALSE);
+ gtk_widget_set_sensitive(queue_combo, FALSE);
+ gtk_widget_set_sensitive(file_entry, TRUE);
+ gtk_entry_set_editable(GTK_ENTRY(file_entry), TRUE);
+ gtk_widget_set_sensitive(custom_command_entry, FALSE);
+ gtk_entry_set_editable(GTK_ENTRY(custom_command_entry), FALSE);
+ gtk_widget_set_sensitive(file_button, TRUE);
+ gtk_widget_set_sensitive(copy_count_spin_button, FALSE);
+ stpui_plist_set_command_type(pv, COMMAND_TYPE_FILE);
+ }
+}
+
+static void
+set_all_entry_values(void)
+{
+ set_entry_value (top_entry, (stp_get_top (pv->v)), 1);
+ set_entry_value (left_entry, (stp_get_left (pv->v)), 1);
+/*
+ set_entry_value (bottom_entry, (top + stp_get_top(pv->v) + print_height), 1);
+*/
+ set_entry_value (bottom_border_entry,
+ (paper_height - (stp_get_top (pv->v) + print_height)), 1);
+/*
+ set_entry_value (right_entry, (stp_get_left(pv->v) + print_width), 1);
+*/
+ set_entry_value (right_border_entry,
+ (paper_width - (stp_get_left (pv->v) + print_width)), 1);
+ set_entry_value (width_entry, print_width, 1);
+ set_entry_value (height_entry, print_height, 1);
+ set_entry_value (custom_size_width, stp_get_page_width (pv->v), 1);
+ set_entry_value (custom_size_height, stp_get_page_height (pv->v), 1);
+}
+
+/*
+ * unit_callback() - Update the current unit.
+ */
+static void
+unit_callback (GtkWidget *widget,
+ gpointer data)
+{
+ reset_preview ();
+
+ if (GTK_TOGGLE_BUTTON (widget)->active)
+ {
+ pv->unit = (gint) data;
+ gtk_label_set_text(GTK_LABEL(units_label), units[pv->unit].name);
+ set_all_entry_values();
+ update_options();
+ do_color_updates();
+ }
+}
+
+static void
+destroy_dialogs (void)
+{
+ int i;
+ gtk_widget_destroy (color_adjust_dialog);
+ gtk_widget_destroy (setup_dialog);
+ gtk_widget_destroy (print_dialog);
+ gtk_widget_destroy (new_printer_dialog);
+ gtk_widget_destroy (about_dialog);
+ for (i = 0; i < current_option_count; i++)
+ {
+ if (current_options[i].fast_desc->p_type == STP_PARAMETER_TYPE_CURVE &&
+ current_options[i].info.curve.dialog)
+ gtk_widget_destroy(current_options[i].info.curve.dialog);
+ }
+}
+
+static void
+dialogs_set_sensitive (gboolean sensitive)
+{
+ int i;
+ gtk_widget_set_sensitive (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);
+ for (i = 0; i < current_option_count; i++)
+ {
+ if (current_options[i].fast_desc->p_type == STP_PARAMETER_TYPE_CURVE &&
+ current_options[i].info.curve.dialog)
+ gtk_widget_set_sensitive(current_options[i].info.curve.dialog,
+ sensitive);
+ }
+}
+
+/*
+ * 'print_callback()' - Start the print.
+ */
+static void
+print_callback (void)
+{
+ if (stpui_plist_get_command_type(pv) == COMMAND_TYPE_FILE &&
+ strlen(stpui_plist_get_output_filename(pv)) == 0)
+ {
+ dialogs_set_sensitive (FALSE);
+ exit_after_file_ok = 1;
+ gtk_widget_show (file_browser);
+ }
+ else
+ {
+ runme = TRUE;
+ destroy_dialogs ();
+ }
+}
+
+/*
+ * printandsave_callback() -
+ */
+static void
+printandsave_callback (void)
+{
+ saveme = TRUE;
+ print_callback();
+}
+
+static void
+about_callback (void)
+{
+ gtk_widget_show (about_dialog);
+}
+
+/*
+ * save_callback() - save settings, don't destroy dialog
+ */
+static void
+save_callback (void)
+{
+ reset_preview ();
+ stpui_printrc_save ();
+}
+
+/*
+ * setup_update() - update widgets in the setup dialog
+ */
+static void
+setup_update (void)
+{
+ GtkAdjustment *adjustment;
+ gint idx = 0;
+ gint i;
+ gchar *tmp;
+ const char *ppd_file_name = stp_get_file_parameter(pv->v, "PPDFile");
+
+ for (i = 0; i < GTK_CLIST(manufacturer_clist)->rows; i++)
+ {
+ (void) gtk_clist_get_text(GTK_CLIST(manufacturer_clist), i, 0, &tmp);
+ if (tmp && strcmp(manufacturer, tmp) == 0)
+ {
+ idx = i;
+ break;
+ }
+ }
+ gtk_clist_select_row(GTK_CLIST(manufacturer_clist), idx, 0);
+
+ idx = stp_get_printer_index_by_driver (stp_get_driver (pv->v));
+
+ idx = gtk_clist_find_row_from_data(GTK_CLIST(printer_driver),
+ (gpointer) idx);
+/*
+ if (idx >= 0)
+ idx = 0;
+*/
+ gtk_clist_select_row (GTK_CLIST (printer_driver), idx, 0);
+ gtk_label_set_text (GTK_LABEL (printer_model_label),
+ gettext (stp_printer_get_long_name (tmp_printer)));
+
+ if (ppd_file_name)
+ gtk_entry_set_text (GTK_ENTRY (ppd_file), ppd_file_name);
+ else
+ gtk_entry_set_text (GTK_ENTRY (ppd_file), "");
+
+ if (stp_parameter_find_in_settings(pv->v, "PPDFile"))
+ {
+ gtk_widget_show (ppd_box);
+ gtk_widget_show (ppd_label);
+ }
+ else
+ {
+ gtk_widget_hide (ppd_box);
+ gtk_widget_hide (ppd_label);
+ }
+ gtk_entry_set_text (GTK_ENTRY (custom_command_entry),
+ stpui_plist_get_custom_command (pv));
+
+ adjustment = GTK_CLIST (printer_driver)->vadjustment;
+ gtk_adjustment_set_value
+ (adjustment,
+ adjustment->lower + idx * (adjustment->upper - adjustment->lower) /
+ GTK_CLIST (printer_driver)->rows);
+
+ i = stpui_plist_get_command_type(pv);
+ if (i >= 0 && i < command_options_count)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(command_options[i].button),
+ TRUE);
+}
+
+/*
+ * setup_open_callback() -
+ */
+static void
+setup_open_callback (void)
+{
+ static gboolean first_time = TRUE;
+ manufacturer = stp_printer_get_manufacturer(stp_get_printer(pv->v));
+ build_printer_driver_clist();
+
+ reset_preview ();
+ setup_update ();
+
+/* gtk_widget_set_sensitive(GTK_DIALOG(print_dialog)->action_area, FALSE); */
+ gtk_widget_show (setup_dialog);
+
+ if (first_time)
+ {
+ /* Make sure the driver scroller gets positioned correctly. */
+ setup_update ();
+ first_time = FALSE;
+ }
+}
+
+/*
+ * new_printer_open_callback() -
+ */
+static void
+new_printer_open_callback (void)
+{
+ reset_preview ();
+ gtk_entry_set_text (GTK_ENTRY (new_printer_entry), "");
+ gtk_widget_show (new_printer_dialog);
+}
+
+static void
+set_printer(void)
+{
+ manufacturer = stp_printer_get_manufacturer(tmp_printer);
+ build_printer_driver_clist();
+ build_queue_combo();
+ stp_set_driver (pv->v, stp_printer_get_driver (tmp_printer));
+ stpui_plist_set_custom_command
+ (pv, gtk_entry_get_text (GTK_ENTRY (custom_command_entry)));
+ stpui_plist_set_output_filename
+ (pv, gtk_entry_get_text (GTK_ENTRY (file_entry)));
+ stp_set_file_parameter (pv->v, "PPDFile",
+ gtk_entry_get_text (GTK_ENTRY (ppd_file)));
+ gtk_label_set_text (GTK_LABEL (printer_model_label),
+ gettext (stp_printer_get_long_name (tmp_printer)));
+
+ plist_callback (NULL, (gpointer) stpui_plist_current);
+}
+
+/*
+ * setup_ok_callback() -
+ */
+static void
+setup_ok_callback (void)
+{
+ gtk_widget_hide(ppd_browser);
+ gtk_widget_hide(file_browser);
+ gtk_widget_hide(setup_dialog);
+ set_printer();
+ gtk_widget_set_sensitive(GTK_DIALOG(print_dialog)->action_area, TRUE);
+}
+
+/*
+ * setup_cancel_callback() -
+ */
+static void
+setup_cancel_callback (void)
+{
+ gtk_widget_hide(ppd_browser);
+ gtk_widget_hide(file_browser);
+ gtk_widget_hide(setup_dialog);
+ manufacturer = stp_printer_get_manufacturer(stp_get_printer(pv->v));
+ build_printer_driver_clist();
+ setup_update();
+ gtk_widget_set_sensitive(GTK_DIALOG(print_dialog)->action_area, TRUE);
+}
+
+/*
+ * setup_ok_callback() -
+ */
+static void
+new_printer_ok_callback (void)
+{
+ const gchar *data = gtk_entry_get_text (GTK_ENTRY (new_printer_entry));
+ stpui_plist_t key;
+
+ if (strlen(data))
+ {
+ memset(&key, 0, sizeof(key));
+ stpui_printer_initialize (&key);
+ stpui_plist_copy(&key, pv);
+ stpui_plist_set_name(&key, data);
+
+ if (stpui_plist_add (&key, 1))
+ {
+ stp_vars_destroy(key.v);
+ g_free(key.name);
+ stpui_plist_current = stpui_plist_count - 1;
+ set_current_printer();
+ build_printer_combo ();
+ set_printer();
+ }
+ }
+
+ gtk_widget_hide (new_printer_dialog);
+}
+
+static void
+pop_ppd_box(void)
+{
+ const stp_vars_t *v = stp_printer_get_defaults(tmp_printer);
+ if (stp_parameter_find_in_settings(v, "PPDFile"))
+ {
+ gtk_widget_show (ppd_label);
+ gtk_widget_show (ppd_box);
+ }
+ else
+ {
+ gtk_widget_hide (ppd_label);
+ gtk_widget_hide (ppd_box);
+ }
+}
+
+static void
+build_printer_driver_clist(void)
+{
+ int i;
+ int current_idx = 0;
+ gtk_clist_clear(GTK_CLIST(printer_driver));
+ for (i = 0; i < stp_printer_model_count (); i ++)
+ {
+ const stp_printer_t *the_printer = stp_get_printer_by_index (i);
+
+ if (strcmp(manufacturer, stp_printer_get_manufacturer(the_printer)) == 0)
+ {
+ gchar *tmp=g_strdup(gettext(stp_printer_get_long_name(the_printer)));
+ /*
+ * FIXME Somehow if the raw printer comes before any of the
+ * "real" printers in the list of printers created in module.c,
+ * this code barfs on any of those printers added later. For
+ * example, try listing olympus_LTX_stpi_module_data after
+ * raw_LTX_stpi_module_data.
+ */
+
+ gtk_clist_insert (GTK_CLIST (printer_driver), current_idx, &tmp);
+ gtk_clist_set_row_data (GTK_CLIST (printer_driver), current_idx,
+ (gpointer) i);
+ g_free(tmp);
+ current_idx++;
+ }
+ }
+}
+
+static void
+manufacturer_callback(GtkWidget *widget, /* I - Driver list */
+ gint row,
+ gint column,
+ GdkEventButton *event,
+ gpointer data)
+{
+ static int calling_manufacturer_callback = 0;
+ gchar *text;
+ if (calling_manufacturer_callback)
+ return;
+ calling_manufacturer_callback++;
+ if (gtk_clist_get_text(GTK_CLIST(widget), row, column, &text))
+ manufacturer = text;
+ build_printer_driver_clist();
+ setup_update();
+ calling_manufacturer_callback--;
+}
+
+/*
+ * print_driver_callback() - Update the current printer driver.
+ */
+static void
+print_driver_callback (GtkWidget *widget, /* I - Driver list */
+ gint row,
+ gint column,
+ GdkEventButton *event,
+ gpointer data) /* I - Data */
+{
+ char *tmp;
+ static int calling_print_driver_callback = 0;
+ if (calling_print_driver_callback)
+ return;
+ calling_print_driver_callback++;
+ invalidate_frame ();
+ invalidate_preview_thumbnail ();
+ reset_preview ();
+ data = gtk_clist_get_row_data (GTK_CLIST (widget), row);
+ tmp_printer = stp_get_printer_by_index ((gint) data);
+ tmp = stpui_build_standard_print_command(pv, tmp_printer);
+ gtk_entry_set_text(GTK_ENTRY(standard_cmd_entry), tmp);
+ g_free(tmp);
+
+ pop_ppd_box();
+ calling_print_driver_callback--;
+}
+
+/*
+ * ppd_browse_callback() -
+ */
+static void
+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);
+}
+
+/*
+ * ppd_ok_callback() -
+ */
+static void
+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)));
+}
+
+/*
+ * ppd_browse_callback() -
+ */
+static void
+file_browse_callback (void)
+{
+ reset_preview ();
+ gtk_file_selection_set_filename (GTK_FILE_SELECTION (file_browser),
+ gtk_entry_get_text (GTK_ENTRY (file_entry)));
+ gtk_widget_show (file_browser);
+}
+
+/*
+ * file_ok_callback() - print to file and go away
+ */
+static void
+file_ok_callback (void)
+{
+ const char *filename =
+ gtk_file_selection_get_filename(GTK_FILE_SELECTION(file_browser));
+ gtk_widget_hide (file_browser);
+ gtk_entry_set_text(GTK_ENTRY(file_entry), filename);
+ stpui_plist_set_output_filename(pv, filename);
+ if (exit_after_file_ok)
+ {
+ runme = TRUE;
+ destroy_dialogs ();
+ }
+}
+
+/*
+ * file_cancel_callback() -
+ */
+static void
+file_cancel_callback (void)
+{
+ exit_after_file_ok = 0;
+ gtk_widget_hide (file_browser);
+ dialogs_set_sensitive (TRUE);
+}
+
+static void
+fill_buffer_writefunc(void *priv, const char *buffer, size_t bytes)
+{
+ int mask = 0;
+ int i;
+ int pixels = bytes / 4;
+ priv_t *p = (priv_t *) priv;
+ unsigned char *where = p->base_addr + p->offset;
+ const unsigned char *xbuffer = (const unsigned char *)buffer;
+
+ if (p->bpp == 1)
+ {
+ memcpy(where, buffer, bytes);
+ p->offset += bytes;
+ }
+ else
+ {
+ if (bytes + p->offset > p->limit)
+ bytes = p->limit - p->offset;
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cyan_button)))
+ mask |= 1;
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(magenta_button)))
+ mask |= 2;
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(yellow_button)))
+ mask |= 4;
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(black_button)))
+ mask |= 8;
+
+ memset(where, 0xff, pixels * 3);
+ for (i = 0; i < pixels; i++)
+ {
+ if (mask & 8)
+ {
+ where[0] -= xbuffer[3];
+ where[1] -= xbuffer[3];
+ where[2] -= xbuffer[3];
+ }
+ if (mask & 1)
+ {
+ if (where[0] < xbuffer[0])
+ where[0] = 0;
+ else
+ where[0] -= xbuffer[0];
+ }
+ if (mask & 2)
+ {
+ if (where[1] < xbuffer[1])
+ where[1] = 0;
+ else
+ where[1] -= xbuffer[1];
+ }
+ if (mask & 4)
+ {
+ if (where[2] < xbuffer[2])
+ where[2] = 0;
+ else
+ where[2] -= xbuffer[2];
+ }
+ where += 3;
+ xbuffer += 4;
+ }
+ p->offset += pixels * 3;
+ }
+}
+
+/*
+ * update_adjusted_thumbnail()
+ */
+
+static void
+redraw_color_swatch (void)
+{
+ static GdkGC *gc = NULL;
+ static GdkColormap *cmap;
+
+ if (adjusted_thumbnail_data && swatch && swatch->widget.window)
+ {
+ if (gc == NULL)
+ {
+ gc = gdk_gc_new (swatch->widget.window);
+ cmap = gtk_widget_get_colormap (GTK_WIDGET(swatch));
+ }
+
+ if (!print_mode_is_color(pv->v))
+ gdk_draw_gray_image(swatch->widget.window, gc, 0, 0,
+ thumbnail_w, thumbnail_h, GDK_RGB_DITHER_NORMAL,
+ adjusted_thumbnail_data, thumbnail_w);
+ else
+ gdk_draw_rgb_image(swatch->widget.window, gc, 0, 0,
+ thumbnail_w, thumbnail_h, GDK_RGB_DITHER_NORMAL,
+ adjusted_thumbnail_data, 3 * thumbnail_w);
+ }
+}
+
+static void
+initialize_thumbnail(void)
+{
+ int i;
+ if (stpui_get_thumbnail_func())
+ {
+ const guchar *internal_thumbnail_data;
+ /*
+ * Fetch a thumbnail of the image we're to print from the Gimp.
+ */
+
+ thumbnail_w = thumbnail_hintw;
+ thumbnail_h = thumbnail_hinth;
+ internal_thumbnail_data =
+ (stpui_get_thumbnail_func()) (stpui_get_thumbnail_data(), &thumbnail_w,
+ &thumbnail_h, &thumbnail_bpp, 0);
+ if (adjusted_thumbnail_data)
+ g_free(adjusted_thumbnail_data);
+ if (preview_thumbnail_data)
+ g_free(preview_thumbnail_data);
+ if (thumbnail_data)
+ g_free(thumbnail_data);
+
+ if (internal_thumbnail_data)
+ {
+ /*
+ * 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);
+ preview_thumbnail_data = g_malloc (3 * thumbnail_w * thumbnail_h);
+ thumbnail_data = g_malloc (3 * thumbnail_w * thumbnail_h);
+
+ switch (thumbnail_bpp)
+ {
+ case 1:
+ for (i = 0; i < thumbnail_w * thumbnail_h; i++)
+ {
+ gint val = internal_thumbnail_data[i];
+ thumbnail_data[(3 * i) + 0] = val;
+ thumbnail_data[(3 * i) + 1] = val;
+ thumbnail_data[(3 * i) + 2] = val;
+ }
+ break;
+ case 3:
+ memcpy(thumbnail_data, internal_thumbnail_data,
+ 3 * thumbnail_w * thumbnail_h);
+ break;
+ case 2:
+ for (i = 0; i < thumbnail_w * thumbnail_h; i++)
+ {
+ gint val = internal_thumbnail_data[2 * i];
+ gint alpha = internal_thumbnail_data[(2 * i) + 1];
+ thumbnail_data[(3 * i) +0] = val * alpha / 255 + 255 - alpha;
+ thumbnail_data[(3 * i) +1] = val * alpha / 255 + 255 - alpha;
+ thumbnail_data[(3 * i) +2] = val * alpha / 255 + 255 - alpha;
+ }
+ break;
+ case 4:
+ for (i = 0; i < thumbnail_w * thumbnail_h; i++)
+ {
+ gint r = internal_thumbnail_data[(4 * i)];
+ gint g = internal_thumbnail_data[(4 * i) + 1];
+ gint b = internal_thumbnail_data[(4 * i) + 2];
+ gint alpha = internal_thumbnail_data[(4 * i) + 3];
+ thumbnail_data[(3 * i) + 0] = r * alpha / 255 + 255 - alpha;
+ thumbnail_data[(3 * i) + 1] = g * alpha / 255 + 255 - alpha;
+ thumbnail_data[(3 * i) + 2] = b * alpha / 255 + 255 - alpha;
+ }
+ break;
+ default:
+ break;
+ /* Whatever */
+ }
+ thumbnail_bpp = 3;
+ }
+ else
+ {
+ thumbnail_h = 0;
+ thumbnail_w = 0;
+ }
+ }
+ else
+ {
+ thumbnail_h = 0;
+ thumbnail_w = 0;
+ }
+}
+
+static int
+compute_thumbnail(const stp_vars_t *v)
+{
+ priv_t priv;
+ int answer = 1;
+ stp_image_t *im = stpui_image_thumbnail_new(thumbnail_data, thumbnail_w,
+ thumbnail_h, thumbnail_bpp);
+ stp_vars_t *nv = stp_vars_create_copy(v);
+ stp_set_driver(nv, "raw-data-8");
+ stp_set_top(nv, 0);
+ stp_set_left(nv, 0);
+ stp_set_width(nv, thumbnail_w);
+ stp_set_height(nv, thumbnail_h);
+ stp_set_outfunc(nv, fill_buffer_writefunc);
+ stp_set_outdata(nv, &priv);
+ stp_set_errfunc(nv, stpui_get_errfunc());
+ stp_set_errdata(nv, stpui_get_errdata());
+ if (!print_mode_is_color(nv))
+ {
+ priv.bpp = 1;
+ stp_set_string_parameter(nv, "InkType", "RGBGray");
+ }
+ else
+ {
+ priv.bpp = 4;
+ stp_set_string_parameter(nv, "InkType", "CMYK");
+ }
+ stp_set_page_height(nv, thumbnail_h);
+ stp_set_page_width(nv, thumbnail_w);
+ stp_set_float_parameter(nv, "Density", 1.0);
+ stp_set_float_parameter(nv, "InkLimit", 0);
+ stp_set_string_parameter(nv, "InputImageType", "RGB");
+
+ priv.base_addr = adjusted_thumbnail_data;
+ priv.offset = 0;
+ priv.limit = thumbnail_bpp * thumbnail_h * thumbnail_w;
+
+ if (stp_verify(nv) != 1 || stp_print(nv, im) != 1)
+ {
+ answer = 0;
+ fprintf(stderr, "Could not print thumbnail!\n");
+ }
+ stp_vars_destroy(nv);
+ return answer;
+}
+
+static void
+set_thumbnail_orientation(void)
+{
+ gint x, y;
+ gint preview_limit = (thumbnail_h * thumbnail_w) - 1;
+ gint bpp;
+ if (!print_mode_is_color(pv->v))
+ bpp = 1;
+ else
+ bpp = 3;
+ switch (physical_orientation)
+ {
+ case ORIENT_PORTRAIT:
+ memcpy(preview_thumbnail_data, adjusted_thumbnail_data,
+ bpp * thumbnail_h * thumbnail_w);
+ break;
+ case ORIENT_SEASCAPE:
+ for (x = 0; x < thumbnail_w; x++)
+ for (y = 0; y < thumbnail_h; y++)
+ memcpy((preview_thumbnail_data +
+ bpp * (preview_limit - (x * thumbnail_h + y))),
+ (adjusted_thumbnail_data +
+ bpp * ((thumbnail_h - y - 1) * thumbnail_w + x)), bpp);
+ break;
+
+ case ORIENT_UPSIDEDOWN:
+ for (x = 0; x < thumbnail_h * thumbnail_w; x++)
+ memcpy((preview_thumbnail_data + bpp * (preview_limit - x)),
+ adjusted_thumbnail_data + bpp * x, bpp);
+ break;
+ case ORIENT_LANDSCAPE:
+ for (x = 0; x < thumbnail_w; x++)
+ for (y = 0; y < thumbnail_h; y++)
+ memcpy((preview_thumbnail_data + bpp * (x * thumbnail_h + y)),
+ (adjusted_thumbnail_data +
+ bpp * ((thumbnail_h - y - 1) * thumbnail_w + x)), bpp);
+ break;
+ }
+}
+
+static void
+update_adjusted_thumbnail (void)
+{
+ if (thumbnail_data && adjusted_thumbnail_data && do_update_thumbnail &&
+ suppress_preview_update == 0)
+ {
+ if (compute_thumbnail(pv->v))
+ {
+ set_thumbnail_orientation();
+ redraw_color_swatch ();
+ preview_update ();
+ }
+ }
+}
+
+static void
+draw_arrow (GdkWindow *w,
+ GdkGC *gc,
+ gint paper_left,
+ gint paper_top)
+{
+ gint u = preview_ppi/2;
+ gint ox = paper_left + preview_ppi * paper_width / INCH / 2;
+ gint oy = paper_top + preview_ppi * paper_height / INCH / 2;
+
+ oy -= preview_ppi * paper_height / INCH / 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);
+}
+
+static void
+create_valid_preview(guchar **preview_data)
+{
+ if (adjusted_thumbnail_data)
+ {
+ gint bpp = (print_mode_is_color(pv->v)) ? 3 : 1;
+ gint v_denominator = preview_h > 1 ? preview_h - 1 : 1;
+ gint v_numerator = (preview_thumbnail_h - 1) % v_denominator;
+ gint v_whole = (preview_thumbnail_h - 1) / v_denominator;
+ gint h_denominator = preview_w > 1 ? preview_w - 1 : 1;
+ gint h_numerator = (preview_thumbnail_w - 1) % h_denominator;
+ gint h_whole = (preview_thumbnail_w - 1) / h_denominator;
+ gint adjusted_preview_width = bpp * preview_w;
+ gint adjusted_thumbnail_width = bpp * preview_thumbnail_w;
+ gint v_cur = 0;
+ gint v_last = -1;
+ gint v_error = v_denominator / 2;
+ gint y;
+ gint i;
+
+ if (*preview_data)
+ g_free (*preview_data);
+ *preview_data = g_malloc (bpp * 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 = preview_thumbnail_data - 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 < bpp; i++)
+ outbuf[i] = outbuf[i - bpp];
+ }
+ else
+ {
+ inbuf += bpp * (h_cur - h_last);
+ h_last = h_cur;
+ for (i = 0; i < bpp; i++)
+ outbuf[i] = inbuf[i];
+ }
+ outbuf += 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 = TRUE;
+ }
+}
+
+/*
+ * preview_update_callback() -
+ */
+static void
+do_preview_thumbnail (void)
+{
+ static GdkGC *gc = NULL;
+ static GdkGC *gcinv = NULL;
+ static GdkGC *gcset = NULL;
+ static guchar *preview_data = NULL;
+ gint opx = preview_x;
+ gint opy = preview_y;
+ gint oph = preview_h;
+ gint opw = preview_w;
+ gint paper_display_left, paper_display_top;
+ gint printable_display_left, printable_display_top;
+ gint paper_display_width, paper_display_height;
+ gint printable_display_width, printable_display_height;
+ int l_bottom = stp_get_top(pv->v) + stp_get_height(pv->v);
+ int l_right = stp_get_left(pv->v) + stp_get_width(pv->v);
+
+ preview_ppi = preview_size_horiz * FINCH / (gdouble) paper_width;
+
+ if (preview_ppi > preview_size_vert * FINCH / (gdouble) paper_height)
+ preview_ppi = preview_size_vert * FINCH / (gdouble) paper_height;
+ if (preview_ppi > MAX_PREVIEW_PPI)
+ preview_ppi = MAX_PREVIEW_PPI;
+
+ if (preview == NULL || preview->widget.window == NULL)
+ return;
+ /*
+ * Center the page on the preview
+ */
+ paper_display_width = MAX(3, ROUNDUP(preview_ppi * paper_width, INCH));
+ paper_display_height = MAX(3, ROUNDUP(preview_ppi * paper_height, INCH));
+
+ paper_display_left = (preview_size_horiz - paper_display_width) / 2;
+ paper_display_top = (preview_size_vert - paper_display_height) / 2;
+
+ printable_display_width =
+ MAX(3, ROUNDUP(preview_ppi * printable_width, INCH));
+ printable_display_height =
+ MAX(3, ROUNDUP(preview_ppi * printable_height, INCH));
+
+ printable_display_left = paper_display_left + preview_ppi * left / INCH;
+ printable_display_top = paper_display_top + preview_ppi * top / INCH ;
+
+ preview_x =
+ 1 + paper_display_left + preview_ppi * stp_get_left (pv->v) / INCH;
+ preview_y =
+ 1 + paper_display_top + preview_ppi * stp_get_top (pv->v) / INCH;
+
+ if (!preview_valid)
+ {
+ gint preview_r = 1 + paper_display_left + preview_ppi * l_right / INCH;
+ gint preview_b = 1 + paper_display_top + preview_ppi * l_bottom / INCH;
+ preview_w = preview_r - preview_x;
+ preview_h = preview_b - preview_y;
+ if (preview_w >= printable_display_width)
+ preview_w = printable_display_width - 1;
+ if (preview_h >= printable_display_height)
+ preview_h = printable_display_height - 1;
+ }
+
+ if (preview_w + preview_x > printable_display_left + printable_display_width)
+ preview_x--;
+ if (preview_h + preview_y > printable_display_top + printable_display_height)
+ preview_y--;
+
+ 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)
+ create_valid_preview(&preview_data);
+
+ if (printable_display_left < paper_display_left)
+ printable_display_left = paper_display_left;
+ if (printable_display_top < paper_display_top)
+ printable_display_top = paper_display_top;
+ if (printable_display_left + printable_display_width >
+ paper_display_left + paper_display_width)
+ printable_display_width =
+ paper_display_width - (paper_display_left - printable_display_left);
+ if (printable_display_top + printable_display_height >
+ paper_display_top + paper_display_height)
+ printable_display_height =
+ paper_display_height - (paper_display_top - printable_display_top);
+ if (need_exposure)
+ {
+ if (!frame_valid)
+ {
+ gdk_window_clear (preview->widget.window);
+ frame_valid = TRUE;
+ }
+ /* draw paper frame */
+ gdk_draw_rectangle (preview->widget.window, gc, 0,
+ paper_display_left, paper_display_top,
+ paper_display_width, paper_display_height);
+
+ /* draw printable frame */
+ gdk_draw_rectangle (preview->widget.window, gc, 0,
+ printable_display_left, printable_display_top,
+ printable_display_width, printable_display_height);
+ need_exposure = FALSE;
+ }
+ else if (!frame_valid)
+ {
+ gdk_window_clear (preview->widget.window);
+ /* draw paper frame */
+ gdk_draw_rectangle (preview->widget.window, gc, 0,
+ paper_display_left, paper_display_top,
+ paper_display_width, paper_display_height);
+
+ /* draw printable frame */
+ gdk_draw_rectangle (preview->widget.window, gc, 0,
+ printable_display_left, printable_display_top,
+ printable_display_width, printable_display_height);
+ frame_valid = TRUE;
+ }
+ 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_display_left,
+ paper_display_top);
+
+ if (!preview_valid)
+ gdk_draw_rectangle (preview->widget.window, gc, 1,
+ preview_x, preview_y, preview_w, preview_h);
+ else if (!print_mode_is_color(pv->v))
+ 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);
+
+ /* If we're printing full bleed, redisplay the paper frame */
+ if (preview_x <= paper_display_left || opx <= paper_display_left ||
+ preview_y <= paper_display_top || opy <= paper_display_top ||
+ preview_x + preview_w >= paper_display_left + paper_display_width ||
+ opx + opw >= paper_display_left + paper_display_width ||
+ preview_y + preview_h >= paper_display_top + paper_display_height ||
+ opy + oph >= paper_display_top + paper_display_height)
+ gdk_draw_rectangle (preview->widget.window, gc, 0,
+ paper_display_left, paper_display_top,
+ paper_display_width, paper_display_height);
+
+
+ /* draw orientation arrow pointing to top-of-paper */
+ draw_arrow (preview->widget.window, gcinv, paper_display_left,
+ paper_display_top);
+ gdk_flush();
+}
+
+static gboolean
+idle_preview_thumbnail(gpointer data)
+{
+ set_orientation(pv->orientation);
+ do_preview_thumbnail();
+ thumbnail_update_pending = FALSE;
+ return FALSE;
+}
+
+static void
+preview_expose (void)
+{
+ need_exposure = TRUE;
+ preview_update ();
+}
+
+static void
+preview_update (void)
+{
+ gdouble max_ppi_scaling; /* Maximum PPI for current page size */
+ gdouble min_ppi_scaling; /* Minimum PPI for current page size */
+
+ suppress_preview_update++;
+ stp_get_media_size(pv->v, &paper_width, &paper_height);
+
+ stp_get_imageable_area(pv->v, &left, &right, &bottom, &top);
+
+ printable_width = right - left;
+ printable_height = bottom - top;
+
+ if (pv->scaling < 0)
+ {
+ gdouble twidth;
+
+ compute_scaling_limits(&min_ppi_scaling, &max_ppi_scaling);
+
+ if (pv->scaling < 0 && pv->scaling > -min_ppi_scaling)
+ pv->scaling = -min_ppi_scaling;
+
+ twidth = (FINCH * (gdouble) image_width / -pv->scaling);
+ 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 = -pv->scaling;
+
+ 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 if (auto_paper_size)
+ {
+ gdouble twidth = printable_width * pv->scaling / 100;
+
+ print_width = twidth + .5;
+ print_height =
+ (twidth * (gdouble) image_height / (gdouble) image_width) + .5;
+ }
+ else
+ {
+ /* we do pv->scaling % 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 = printable_width * pv->scaling / 100;
+
+ print_width = twidth + .5;
+ print_height =
+ (twidth * (gdouble) image_height / (gdouble) image_width) + .5;
+ }
+ else
+ {
+ gdouble theight = printable_height * pv->scaling /100;
+
+ print_height = theight + .5;
+ print_width =
+ (theight * (gdouble) image_width / (gdouble) image_height) + .5;
+ }
+ }
+
+ if (auto_paper_size)
+ set_media_size(stp_get_string_parameter(pv->v, "PageSize"));
+
+ stp_set_width(pv->v, print_width);
+ stp_set_height(pv->v, print_height);
+
+ if (pv->invalid_mask & INVALID_LEFT)
+ stp_set_left (pv->v, (paper_width - print_width) / 2);
+
+ if (stp_get_left(pv->v) < left)
+ stp_set_left(pv->v, left);
+
+ if (stp_get_left (pv->v) > right - print_width)
+ stp_set_left (pv->v, right - print_width);
+
+ if (pv->invalid_mask & INVALID_TOP)
+ stp_set_top (pv->v, ((paper_height - print_height) / 2));
+ if (stp_get_top(pv->v) < top)
+ stp_set_top(pv->v, top);
+
+ if (stp_get_top (pv->v) > bottom - print_height)
+ stp_set_top (pv->v, bottom - print_height);
+
+ pv->invalid_mask = 0;
+
+ set_all_entry_values();
+ suppress_preview_update--;
+
+ /* draw image */
+ if (! suppress_preview_update && !thumbnail_update_pending)
+ {
+ thumbnail_update_pending = TRUE;
+ g_idle_add(idle_preview_thumbnail, NULL);
+ }
+}
+
+/*
+ * preview_button_callback() -
+ */
+static void
+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;
+ orig_left = stp_get_left (pv->v);
+ orig_top = stp_get_top (pv->v);
+ mouse_button = event->button;
+ buttons_mask = 1 << event->button;
+ buttons_pressed++;
+ preview_active = 1;
+ stpui_disable_help();
+ move_constraint =
+ (event->state & GDK_SHIFT_MASK) ? MOVE_CONSTRAIN : MOVE_ANY;
+ if (event->state & GDK_CONTROL_MASK)
+ move_constraint |= MOVE_GRID;
+ }
+ else if ((buttons_mask & (1 << event->button)) == 0)
+ {
+ if (preview_active == 1)
+ {
+ stpui_enable_help();
+ preview_active = -1;
+ stp_set_left (pv->v, orig_left);
+ stp_set_top (pv->v, orig_top);
+ preview_update ();
+ }
+ 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)
+ {
+ stpui_enable_help ();
+ preview_active = 0;
+ }
+ }
+}
+
+/*
+ * preview_motion_callback() -
+ */
+static void
+preview_motion_callback (GtkWidget *widget,
+ GdkEventMotion *event,
+ gpointer data)
+{
+
+ gint old_top = stp_get_top (pv->v);
+ gint old_left = stp_get_left (pv->v);
+ gint new_top = old_top;
+ gint new_left = old_left;
+ gint steps;
+ if (preview_active != 1 || event->type != GDK_MOTION_NOTIFY)
+ return;
+ 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;
+ }
+
+ switch (mouse_button)
+ {
+ case 1:
+ if (move_constraint & MOVE_VERTICAL)
+ new_top = orig_top + INCH * (event->y - mouse_y) / preview_ppi;
+ if (move_constraint & MOVE_HORIZONTAL)
+ new_left = orig_left + INCH * (event->x - mouse_x) / preview_ppi;
+ break;
+ case 3:
+ if (move_constraint & MOVE_VERTICAL)
+ new_top = orig_top + event->y - mouse_y;
+ if (move_constraint & MOVE_HORIZONTAL)
+ new_left = orig_left + event->x - mouse_x;
+ break;
+ case 2:
+ if (move_constraint & MOVE_HORIZONTAL)
+ {
+ gint increment_width =
+ ((move_constraint & MOVE_GRID) && pv->scaling > 0) ?
+ printable_width * pv->scaling / 100 : print_width;
+ gint x_threshold = MAX (1, (preview_ppi * increment_width) / INCH);
+ if (event->x > mouse_x)
+ steps = MIN((event->x - mouse_x) / x_threshold,
+ ((right - orig_left) / increment_width) - 1);
+ else
+ steps = -(MIN((mouse_x - event->x) / x_threshold,
+ (orig_left - left) / increment_width));
+ new_left = orig_left + steps * increment_width;
+ }
+ if (move_constraint & MOVE_VERTICAL)
+ {
+ gint increment_height =
+ ((move_constraint & MOVE_GRID) && pv->scaling > 0) ?
+ printable_height * pv->scaling / 100 : print_height;
+ gint y_threshold = MAX (1, (preview_ppi * increment_height) / INCH);
+ if (event->y > mouse_y)
+ steps = MIN((event->y - mouse_y) / y_threshold,
+ ((bottom - orig_top) / increment_height) - 1);
+ else
+ steps = -(MIN((mouse_y - event->y) / y_threshold,
+ (orig_top - top) / increment_height));
+ new_top = orig_top + steps * increment_height;
+ }
+ break;
+ }
+
+ if (new_top < top)
+ new_top = top;
+ if (new_top > bottom - print_height)
+ new_top = bottom - print_height;
+ if (new_left < left)
+ new_left = left;
+ if (new_left > right - print_width)
+ new_left = right - print_width;
+
+ if (new_top != old_top || new_left != old_left)
+ {
+ stp_set_top (pv->v, new_top);
+ stp_set_left (pv->v, new_left);
+ preview_update ();
+ }
+}
+
+static void
+color_update (GtkAdjustment *adjustment)
+{
+ int i;
+ for (i = 0; i < current_option_count; i++)
+ {
+ option_t *opt = &(current_options[i]);
+ if (opt->fast_desc->p_type == STP_PARAMETER_TYPE_DOUBLE &&
+ opt->fast_desc->p_level <= MAXIMUM_PARAMETER_LEVEL &&
+ opt->info.flt.adjustment &&
+ adjustment == GTK_ADJUSTMENT(opt->info.flt.adjustment))
+ {
+ invalidate_preview_thumbnail ();
+ if (stp_get_float_parameter(pv->v, opt->fast_desc->name) !=
+ adjustment->value)
+ {
+ stp_set_float_parameter(pv->v, opt->fast_desc->name,
+ adjustment->value);
+ update_adjusted_thumbnail();
+ }
+ }
+ }
+}
+
+static void
+dimension_update (GtkAdjustment *adjustment)
+{
+ int i;
+ gdouble unit_scaler = units[pv->unit].scale;
+ for (i = 0; i < current_option_count; i++)
+ {
+ option_t *opt = &(current_options[i]);
+ if (opt->fast_desc->p_type == STP_PARAMETER_TYPE_DIMENSION &&
+ opt->fast_desc->p_level <= MAXIMUM_PARAMETER_LEVEL &&
+ opt->info.flt.adjustment &&
+ adjustment == GTK_ADJUSTMENT(opt->info.flt.adjustment))
+ {
+ invalidate_preview_thumbnail ();
+ if (stp_get_dimension_parameter(pv->v, opt->fast_desc->name) !=
+ adjustment->value * unit_scaler)
+ {
+ stp_set_dimension_parameter(pv->v, opt->fast_desc->name,
+ adjustment->value * unit_scaler);
+ update_adjusted_thumbnail();
+ }
+ }
+ }
+}
+
+static void
+set_controls_active (GtkObject *checkbutton, gpointer xopt)
+{
+ option_t *opt = (option_t *) xopt;
+ stp_parameter_t desc;
+ gboolean setting =
+ gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton));
+ if (setting && opt->fast_desc->p_level <= MAXIMUM_PARAMETER_LEVEL)
+ {
+ switch (opt->fast_desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_DOUBLE:
+ set_adjustment_active(opt, TRUE, FALSE);
+ if (! stp_check_float_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE))
+ {
+ stp_describe_parameter(pv->v, opt->fast_desc->name, &desc);
+ stp_set_float_parameter(pv->v, opt->fast_desc->name,
+ desc.deflt.dbl);
+ stp_parameter_description_destroy(&desc);
+ }
+ stp_set_float_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ set_adjustment_active(opt, TRUE, FALSE);
+ if (! stp_check_dimension_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE))
+ {
+ stp_describe_parameter(pv->v, opt->fast_desc->name, &desc);
+ stp_set_dimension_parameter(pv->v, opt->fast_desc->name,
+ desc.deflt.dimension);
+ stp_parameter_description_destroy(&desc);
+ }
+ stp_set_dimension_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ set_curve_active(opt, TRUE, FALSE);
+ if (! stp_check_curve_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE))
+ {
+ stp_describe_parameter(pv->v, opt->fast_desc->name, &desc);
+ stp_set_curve_parameter(pv->v, opt->fast_desc->name,
+ desc.deflt.curve);
+ stp_parameter_description_destroy(&desc);
+ }
+ stp_set_curve_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ set_combo_active(opt, TRUE, FALSE);
+ if (! stp_check_string_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE))
+ {
+ stp_describe_parameter(pv->v, opt->fast_desc->name, &desc);
+ stp_set_string_parameter(pv->v, opt->fast_desc->name,
+ desc.deflt.str);
+ stp_parameter_description_destroy(&desc);
+ }
+ stp_set_string_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ set_bool_active(opt, TRUE, FALSE);
+ if (! stp_check_boolean_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE))
+ {
+ stp_describe_parameter(pv->v, opt->fast_desc->name, &desc);
+ stp_set_boolean_parameter(pv->v, opt->fast_desc->name,
+ desc.deflt.boolean);
+ stp_parameter_description_destroy(&desc);
+ }
+ stp_set_boolean_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE);
+ break;
+ default:
+ break;
+ }
+ }
+ else
+ {
+ switch (opt->fast_desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_DOUBLE:
+ set_adjustment_active(opt, FALSE, FALSE);
+ stp_set_float_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ set_adjustment_active(opt, FALSE, FALSE);
+ stp_set_dimension_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ set_curve_active(opt, FALSE, FALSE);
+ stp_set_curve_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ set_combo_active(opt, FALSE, FALSE);
+ stp_set_string_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN: /* ??? */
+ set_bool_active(opt, FALSE, FALSE);
+ stp_set_boolean_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ default:
+ break;
+ }
+ }
+ invalidate_preview_thumbnail();
+ update_adjusted_thumbnail();
+}
+
+static void
+set_color_defaults (void)
+{
+ int i;
+ for (i = 0; i < current_option_count; i++)
+ {
+ option_t *opt = &(current_options[i]);
+ if (opt->fast_desc->p_level <= MAXIMUM_PARAMETER_LEVEL &&
+ opt->fast_desc->p_class == STP_PARAMETER_CLASS_OUTPUT &&
+ opt->is_active && !opt->fast_desc->read_only)
+ {
+ stp_parameter_activity_t active;
+ gdouble unit_scaler;
+ switch (opt->fast_desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_DOUBLE:
+ active =
+ stp_get_float_parameter_active(pv->v, opt->fast_desc->name);
+ stp_set_float_parameter(pv->v, opt->fast_desc->name,
+ opt->info.flt.deflt);
+ stp_set_float_parameter_active(pv->v, opt->fast_desc->name,
+ active);
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ unit_scaler = units[pv->unit].scale;
+ active =
+ stp_get_dimension_parameter_active(pv->v,
+ opt->fast_desc->name);
+ stp_set_dimension_parameter(pv->v, opt->fast_desc->name,
+ opt->info.flt.deflt * unit_scaler);
+ stp_set_dimension_parameter_active(pv->v, opt->fast_desc->name,
+ active);
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ active =
+ stp_get_boolean_parameter_active(pv->v, opt->fast_desc->name);
+ stp_set_boolean_parameter(pv->v, opt->fast_desc->name,
+ opt->info.bool.deflt);
+ stp_set_boolean_parameter_active(pv->v, opt->fast_desc->name,
+ active);
+ break;
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ active =
+ stp_get_string_parameter_active(pv->v, opt->fast_desc->name);
+ stp_set_string_parameter(pv->v, opt->fast_desc->name,
+ opt->info.list.default_val);
+ stp_set_string_parameter_active(pv->v, opt->fast_desc->name,
+ active);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ do_color_updates ();
+}
+
+gint
+stpui_do_print_dialog(void)
+{
+ /*
+ * Get printrc options...
+ */
+ stpui_printrc_load ();
+
+ /*
+ * Print dialog window...
+ */
+ create_main_window();
+
+ gtk_main ();
+ gdk_flush ();
+
+ /*
+ * Set printrc options...
+ */
+ if (saveme)
+ stpui_printrc_save ();
+
+ /*
+ * Return ok/cancel...
+ */
+ return (runme);
+}
diff --git a/src/gutenprintui/plist.c b/src/gutenprintui/plist.c
new file mode 100644
index 0000000..90ab312
--- /dev/null
+++ b/src/gutenprintui/plist.c
@@ -0,0 +1,1755 @@
+/*
+ * "$Id: plist.c,v 1.2 2005/01/28 03:02:18 rlk 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 <config.h>
+#endif
+
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <gutenprint/gutenprint.h>
+#include <gutenprintui/gutenprintui.h>
+#include "gutenprintui-internal.h"
+
+#include <unistd.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <locale.h>
+
+#include <sys/types.h>
+#include <signal.h>
+#include <sys/wait.h>
+
+
+typedef enum
+{
+ PRINTERS_NONE,
+ PRINTERS_LPC,
+ PRINTERS_LPSTAT
+} printer_system_t;
+
+static int compare_printers (stpui_plist_t *p1, stpui_plist_t *p2);
+
+int stpui_plist_current = 0, /* Current system printer */
+ stpui_plist_count = 0; /* Number of system printers */
+stpui_plist_t *stpui_plist; /* System printers */
+int stpui_show_all_paper_sizes = 0;
+static char *printrc_name = NULL;
+static char *image_type;
+static gint image_raw_channels = 0;
+static gint image_channel_depth = 8;
+static stp_string_list_t *default_parameters = NULL;
+stp_string_list_t *stpui_system_print_queues;
+static const char *copy_count_name = "STPUICopyCount";
+
+#define SAFE_FREE(x) \
+do \
+{ \
+ if ((x)) \
+ g_free((char *)(x)); \
+ ((x)) = NULL; \
+} while (0)
+
+typedef struct
+{
+ const char *printing_system_name;
+ const char *printing_system_text;
+ const char *print_command;
+ const char *queue_select;
+ const char *raw_flag;
+ const char *key_file;
+ const char *scan_command;
+ const char *copy_count_command;
+} print_system_t;
+
+/*
+ * Generic printing system, based on SysV lp
+ */
+static const print_system_t default_printing_system =
+ { "SysV", N_("System V lp"), "lp -s", "-d", "-oraw", "/usr/bin/lp",
+ "/usr/bin/lpstat -v | grep -i '^device for ' | awk '{print $3}' | sed 's/://'",
+ "-n" };
+
+static print_system_t known_printing_systems[] =
+{
+ { "CUPS", N_("CUPS"), "lp -s", "-d", "-oraw", "/usr/sbin/cupsd",
+ "/usr/bin/lpstat -v | grep -i '^device for ' | awk '{print $3}' | sed 's/://'",
+ "-n" },
+ { "SysV", N_("System V lp"), "lp -s", "-d", "-oraw", "/usr/bin/lp",
+ "/usr/bin/lpstat -v | grep -i '^device for ' | awk '{print $3}' | sed 's/://'",
+ "-n" },
+ { "lpd", N_("Berkeley lpd (/etc/lpc)"), "lpr", "-P", "-l", "/etc/lpc",
+ "/etc/lpc status | grep '^...*:' | sed 's/:.*//'",
+ "-#" },
+ { "lpd", N_("Berkeley lpd (/usr/bsd/lpc)"), "lpr", "-P", "-l", "/usr/bsd/lpc",
+ "/usr/bsd/lpc status | grep '^...*:' | sed 's/:.*//'",
+ "-#" },
+ { "lpd", N_("Berkeley lpd (/usr/etc/lpc"), "lpr", "-P", "-l", "/usr/etc/lpc",
+ "/usr/etc/lpc status | grep '^...*:' | sed 's/:.*//'",
+ "-#" },
+ { "lpd", N_("Berkeley lpd (/usr/libexec/lpc)"), "lpr", "-P", "-l", "/usr/libexec/lpc",
+ "/usr/libexec/lpc status | grep '^...*:' | sed 's/:.*//'",
+ "-#" },
+ { "lpd", N_("Berkeley lpd (/usr/sbin/lpc)"), "lpr", "-P", "-l", "/usr/sbin/lpc",
+ "/usr/sbin/lpc status | grep '^...*:' | sed 's/:.*//'",
+ "-#" },
+};
+
+static unsigned print_system_count = sizeof(known_printing_systems) / sizeof(print_system_t);
+
+static const print_system_t *global_printing_system = NULL;
+
+static void
+initialize_default_parameters(void)
+{
+ default_parameters = stp_string_list_create();
+ stp_string_list_add_string(default_parameters, "PrintingSystem", "Autodetect");
+ stp_string_list_add_string(default_parameters, "PrintCommand", "");
+ stp_string_list_add_string(default_parameters, "QueueSelect", "");
+ stp_string_list_add_string(default_parameters, "RawOutputFlag", "");
+ stp_string_list_add_string(default_parameters, "ScanOnStartup", "False");
+ stp_string_list_add_string(default_parameters, "ScanPrintersCommand", "");
+}
+
+void
+stpui_set_global_parameter(const char *param, const char *value)
+{
+ stp_string_list_remove_string(default_parameters, param);
+ stp_string_list_add_string(default_parameters, param, value);
+}
+
+const char *
+stpui_get_global_parameter(const char *param)
+{
+ stp_param_string_t *ps = stp_string_list_find(default_parameters, param);
+ if (ps)
+ return ps->text;
+ else
+ return NULL;
+}
+
+static const print_system_t *
+identify_print_system(void)
+{
+ int i;
+ if (!global_printing_system)
+ {
+ for (i = 0; i < print_system_count; i++)
+ {
+ if (!access(known_printing_systems[i].key_file, R_OK))
+ {
+ global_printing_system = &(known_printing_systems[i]);
+ break;
+ }
+ }
+ if (!global_printing_system)
+ global_printing_system = &default_printing_system;
+ }
+ return global_printing_system;
+}
+
+char *
+stpui_build_standard_print_command(const stpui_plist_t *plist,
+ const stp_printer_t *printer)
+{
+ const char *queue_name = stpui_plist_get_queue_name(plist);
+ const char *extra_options = stpui_plist_get_extra_printer_options(plist);
+ const char *family = stp_printer_get_family(printer);
+ int copy_count = stpui_plist_get_copy_count(plist);
+ int raw = 0;
+ char *print_cmd;
+ char *count_string = NULL;
+ if (!queue_name)
+ queue_name = "";
+ identify_print_system();
+ if (strcmp(family, "ps") == 0)
+ raw = 0;
+ else
+ raw = 1;
+
+ if (copy_count > 1)
+ stp_asprintf(&count_string, "%s %d ",
+ global_printing_system->copy_count_command, copy_count);
+
+ stp_asprintf(&print_cmd, "%s %s %s %s %s%s%s",
+ global_printing_system->print_command,
+ queue_name[0] ? global_printing_system->queue_select : "",
+ queue_name[0] ? queue_name : "",
+ count_string ? count_string : "",
+ raw ? global_printing_system->raw_flag : "",
+ extra_options ? " " : "",
+ extra_options ? extra_options : "");
+ SAFE_FREE(count_string);
+ return print_cmd;
+}
+
+void
+stpui_set_printrc_file(const char *name)
+{
+ if (name && name == printrc_name)
+ return;
+ SAFE_FREE(printrc_name);
+ if (name)
+ printrc_name = g_strdup(name);
+ else
+ {
+ const char *where = getenv("HOME");
+ if (where)
+ printrc_name = g_strconcat(where, "/.gimpprintrc");
+ }
+}
+
+const char *
+stpui_get_printrc_file(void)
+{
+ if (!printrc_name)
+ stpui_set_printrc_file(NULL);
+ return printrc_name;
+}
+
+#define PLIST_ACCESSORS(name) \
+void \
+stpui_plist_set_##name(stpui_plist_t *p, const char *val) \
+{ \
+ if (p->name == val) \
+ return; \
+ SAFE_FREE(p->name); \
+ p->name = g_strdup(val); \
+} \
+ \
+void \
+stpui_plist_set_##name##_n(stpui_plist_t *p, const char *val, int n) \
+{ \
+ if (p->name == val) \
+ return; \
+ SAFE_FREE(p->name); \
+ p->name = g_strndup(val, n); \
+} \
+ \
+const char * \
+stpui_plist_get_##name(const stpui_plist_t *p) \
+{ \
+ return p->name; \
+}
+
+PLIST_ACCESSORS(output_filename)
+PLIST_ACCESSORS(name)
+PLIST_ACCESSORS(queue_name)
+PLIST_ACCESSORS(extra_printer_options)
+PLIST_ACCESSORS(custom_command)
+PLIST_ACCESSORS(current_standard_command)
+
+void
+stpui_plist_set_command_type(stpui_plist_t *p, command_t val)
+{
+ switch (val)
+ {
+ case COMMAND_TYPE_DEFAULT:
+ case COMMAND_TYPE_CUSTOM:
+ case COMMAND_TYPE_FILE:
+ p->command_type = val;
+ break;
+ default:
+ p->command_type = COMMAND_TYPE_DEFAULT;
+ }
+}
+
+command_t
+stpui_plist_get_command_type(const stpui_plist_t *p)
+{
+ return p->command_type;
+}
+
+void
+stpui_plist_set_copy_count(stpui_plist_t *p, gint copy_count)
+{
+ if (copy_count > 0)
+ stp_set_int_parameter(p->v, copy_count_name, copy_count);
+}
+
+gint
+stpui_plist_get_copy_count(const stpui_plist_t *p)
+{
+ if (stp_check_int_parameter(p->v, copy_count_name, STP_PARAMETER_ACTIVE))
+ return stp_get_int_parameter(p->v, copy_count_name);
+ else
+ return 1;
+}
+
+void
+stpui_set_image_type(const char *itype)
+{
+ image_type = g_strdup(itype);
+}
+
+void
+stpui_set_image_raw_channels(gint channels)
+{
+ image_raw_channels = channels;
+}
+
+void
+stpui_set_image_channel_depth(gint depth)
+{
+ image_channel_depth = depth;
+}
+
+void
+stpui_printer_initialize(stpui_plist_t *printer)
+{
+ char tmp[32];
+ stpui_plist_set_name(printer, "");
+ stpui_plist_set_output_filename(printer, "");
+ stpui_plist_set_queue_name(printer, "");
+ stpui_plist_set_extra_printer_options(printer, "");
+ stpui_plist_set_custom_command(printer, "");
+ stpui_plist_set_current_standard_command(printer, "");
+ printer->command_type = COMMAND_TYPE_DEFAULT;
+ printer->scaling = 100.0;
+ printer->orientation = ORIENT_AUTO;
+ printer->auto_size_roll_feed_paper = 0;
+ printer->unit = 0;
+ printer->v = stp_vars_create();
+ stpui_plist_set_copy_count(printer, 1);
+ stp_set_string_parameter(printer->v, "InputImageType", image_type);
+ if (image_raw_channels)
+ {
+ (void) sprintf(tmp, "%d", image_raw_channels);
+ stp_set_string_parameter(printer->v, "RawChannels", tmp);
+ }
+ if (image_channel_depth)
+ {
+ (void) sprintf(tmp, "%d", image_channel_depth);
+ stp_set_string_parameter(printer->v, "ChannelBitDepth", tmp);
+ }
+ printer->invalid_mask = INVALID_TOP | INVALID_LEFT;
+}
+
+static void
+stpui_plist_destroy(stpui_plist_t *printer)
+{
+ SAFE_FREE(printer->name);
+ SAFE_FREE(printer->queue_name);
+ SAFE_FREE(printer->extra_printer_options);
+ SAFE_FREE(printer->custom_command);
+ SAFE_FREE(printer->current_standard_command);
+ SAFE_FREE(printer->output_filename);
+ stp_vars_destroy(printer->v);
+}
+
+void
+stpui_plist_copy(stpui_plist_t *vd, const stpui_plist_t *vs)
+{
+ if (vs == vd)
+ return;
+ stp_vars_copy(vd->v, vs->v);
+ vd->scaling = vs->scaling;
+ vd->orientation = vs->orientation;
+ vd->auto_size_roll_feed_paper = vs->auto_size_roll_feed_paper;
+ vd->unit = vs->unit;
+ vd->invalid_mask = vs->invalid_mask;
+ vd->command_type = vs->command_type;
+ stpui_plist_set_name(vd, stpui_plist_get_name(vs));
+ stpui_plist_set_queue_name(vd, stpui_plist_get_queue_name(vs));
+ stpui_plist_set_extra_printer_options(vd, stpui_plist_get_extra_printer_options(vs));
+ stpui_plist_set_custom_command(vd, stpui_plist_get_custom_command(vs));
+ stpui_plist_set_current_standard_command(vd, stpui_plist_get_current_standard_command(vs));
+ stpui_plist_set_output_filename(vd, stpui_plist_get_output_filename(vs));
+ stpui_plist_set_copy_count(vd, stpui_plist_get_copy_count(vs));
+}
+
+static stpui_plist_t *
+allocate_stpui_plist_copy(const stpui_plist_t *vs)
+{
+ stpui_plist_t *rep = g_malloc(sizeof(stpui_plist_t));
+ memset(rep, 0, sizeof(stpui_plist_t));
+ rep->v = stp_vars_create();
+ stpui_plist_copy(rep, vs);
+ return rep;
+}
+
+static void
+check_plist(int count)
+{
+ static int current_plist_size = 0;
+ int i;
+ if (count <= current_plist_size)
+ return;
+ else if (current_plist_size == 0)
+ {
+ current_plist_size = count;
+ stpui_plist = g_malloc(current_plist_size * sizeof(stpui_plist_t));
+ for (i = 0; i < current_plist_size; i++)
+ {
+ memset(&(stpui_plist[i]), 0, sizeof(stpui_plist_t));
+ stpui_printer_initialize(&(stpui_plist[i]));
+ }
+ }
+ else
+ {
+ int old_plist_size = current_plist_size;
+ current_plist_size *= 2;
+ if (current_plist_size < count)
+ current_plist_size = count;
+ stpui_plist = g_realloc(stpui_plist, current_plist_size * sizeof(stpui_plist_t));
+ for (i = old_plist_size; i < current_plist_size; i++)
+ {
+ memset(&(stpui_plist[i]), 0, sizeof(stpui_plist_t));
+ stpui_printer_initialize(&(stpui_plist[i]));
+ }
+ }
+}
+
+#define GET_MANDATORY_INTERNAL_STRING_PARAM(param) \
+do { \
+ if ((commaptr = strchr(lineptr, ',')) == NULL) \
+ continue; \
+ stpui_plist_set_##param##_n(&key, lineptr, commaptr - line); \
+ 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)
+
+static int
+get_mandatory_string_param(stp_vars_t *v, const char *param, char **lineptr)
+{
+ char *commaptr = strchr(*lineptr, ',');
+ if (commaptr == NULL)
+ return 0;
+ stp_set_string_parameter_n(v, param, *lineptr, commaptr - *lineptr);
+ *lineptr = commaptr + 1;
+ return 1;
+}
+
+static int
+get_mandatory_file_param(stp_vars_t *v, const char *param, char **lineptr)
+{
+ char *commaptr = strchr(*lineptr, ',');
+ if (commaptr == NULL)
+ return 0;
+ stp_set_file_parameter_n(v, param, *lineptr, commaptr - *lineptr);
+ *lineptr = commaptr + 1;
+ return 1;
+}
+
+#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_MANDATORY_INTERNAL_INT_PARAM(param) \
+do { \
+ if ((commaptr = strchr(lineptr, ',')) == NULL) \
+ continue; \
+ key.param = atoi(lineptr); \
+ lineptr = commaptr + 1; \
+} while (0)
+
+static void
+get_optional_string_param(stp_vars_t *v, const char *param,
+ char **lineptr, int *keepgoing)
+{
+ if (*keepgoing)
+ {
+ char *commaptr = strchr(*lineptr, ',');
+ if (commaptr == NULL)
+ {
+ stp_set_string_parameter(v, param, *lineptr);
+ *keepgoing = 0;
+ }
+ else
+ {
+ stp_set_string_parameter_n(v, param, *lineptr, commaptr - *lineptr);
+ *lineptr = commaptr + 1;
+ }
+ }
+}
+
+#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 GET_OPTIONAL_INTERNAL_INT_PARAM(param) \
+do { \
+ if ((keepgoing == 0) || ((commaptr = strchr(lineptr, ',')) == NULL)) \
+ { \
+ keepgoing = 0; \
+ } \
+ else \
+ { \
+ key.param = 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)
+
+static void
+get_optional_float_param(stp_vars_t *v, const char *param,
+ char **lineptr, int *keepgoing)
+{
+ if (*keepgoing)
+ {
+ char *commaptr = strchr(*lineptr, ',');
+ if (commaptr == NULL)
+ {
+ stp_set_float_parameter(v, param, atof(*lineptr));
+ *keepgoing = 0;
+ }
+ else
+ {
+ stp_set_float_parameter(v, param, atof(*lineptr));
+ *lineptr = commaptr + 1;
+ }
+ }
+}
+
+#define GET_OPTIONAL_INTERNAL_FLOAT_PARAM(param) \
+do { \
+ if ((keepgoing == 0) || ((commaptr = strchr(lineptr, ',')) == NULL)) \
+ { \
+ keepgoing = 0; \
+ } \
+ else \
+ { \
+ key.param = atof(lineptr); \
+ } \
+} 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;
+}
+
+stpui_plist_t *
+stpui_plist_create(const char *name, const char *driver)
+{
+ stpui_plist_t key;
+ stpui_plist_t *answer = NULL;
+ memset(&key, 0, sizeof(key));
+ stpui_printer_initialize(&key);
+ key.invalid_mask = 0;
+ stpui_plist_set_name(&key, name);
+ stp_set_driver(key.v, driver);
+ if (stpui_plist_add(&key, 0))
+ answer = psearch(&key, stpui_plist, stpui_plist_count,
+ sizeof(stpui_plist_t),
+ (int (*)(const void *, const void *)) compare_printers);
+ SAFE_FREE(key.name);
+ SAFE_FREE(key.queue_name);
+ SAFE_FREE(key.extra_printer_options);
+ SAFE_FREE(key.custom_command);
+ SAFE_FREE(key.current_standard_command);
+ SAFE_FREE(key.output_filename);
+ stp_vars_destroy(key.v);
+ return answer;
+}
+
+int
+stpui_plist_add(const stpui_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.
+ */
+ stpui_plist_t *p;
+ if (stp_get_printer(key->v))
+ {
+ p = psearch(key, stpui_plist, stpui_plist_count,
+ sizeof(stpui_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(stpui_plist_count + 1);
+ p = stpui_plist + stpui_plist_count;
+ stpui_plist_count++;
+ stpui_plist_copy(p, key);
+ if (strlen(stpui_plist_get_queue_name(p)) == 0 &&
+ stp_string_list_is_present(stpui_system_print_queues,
+ stpui_plist_get_name(p)))
+ stpui_plist_set_queue_name(p, stpui_plist_get_name(p));
+ }
+ else
+ {
+ if (add_only)
+ return 0;
+#ifdef DEBUG
+ fprintf(stderr, "Updating printer %s.\n", key->name);
+#endif
+ stpui_plist_copy(p, key);
+ }
+ }
+ return 1;
+}
+
+static void
+stpui_printrc_load_v0(FILE *fp)
+{
+ char line[1024]; /* Line in printrc file */
+ char *lineptr; /* Pointer in line */
+ char *commaptr; /* Pointer to next comma */
+ stpui_plist_t key; /* Search key */
+ int keepgoing = 1;
+ (void) memset(line, 0, 1024);
+ (void) memset(&key, 0, sizeof(stpui_plist_t));
+ stpui_printer_initialize(&key);
+ key.name = g_strdup(_("File"));
+ while (fgets(line, sizeof(line), fp) != NULL)
+ {
+ /*
+ * Read old format printrc lines...
+ */
+
+ stpui_printer_initialize(&key);
+ key.invalid_mask = 0;
+ 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_INTERNAL_STRING_PARAM(custom_command);
+ GET_MANDATORY_STRING_PARAM(driver);
+
+ if (! stp_get_printer(key.v))
+ continue;
+
+ if (!get_mandatory_file_param(key.v, "PPDFile", &lineptr))
+ continue;
+ if ((commaptr = strchr(lineptr, ',')) != NULL)
+ {
+ switch (atoi(lineptr))
+ {
+ case 1:
+ stp_set_string_parameter(key.v, "PrintingMode", "Color");
+ break;
+ case 0:
+ default:
+ stp_set_string_parameter(key.v, "PrintingMode", "BW");
+ break;
+ }
+ }
+ else
+ continue;
+
+ if (!get_mandatory_string_param(key.v, "Resolution", &lineptr))
+ continue;
+ if (!get_mandatory_string_param(key.v, "PageSize", &lineptr))
+ continue;
+ if (!get_mandatory_string_param(key.v, "MediaType", &lineptr))
+ continue;
+
+ get_optional_string_param(key.v, "InputSlot", &lineptr, &keepgoing);
+ get_optional_float_param(key.v, "Brightness", &lineptr, &keepgoing);
+
+ GET_OPTIONAL_INTERNAL_FLOAT_PARAM(scaling);
+ GET_OPTIONAL_INTERNAL_INT_PARAM(orientation);
+ GET_OPTIONAL_INT_PARAM(left);
+ GET_OPTIONAL_INT_PARAM(top);
+ get_optional_float_param(key.v, "Gamma", &lineptr, &keepgoing);
+ get_optional_float_param(key.v, "Contrast", &lineptr, &keepgoing);
+ get_optional_float_param(key.v, "Cyan", &lineptr, &keepgoing);
+ get_optional_float_param(key.v, "Magenta", &lineptr, &keepgoing);
+ get_optional_float_param(key.v, "Yellow", &lineptr, &keepgoing);
+ IGNORE_OPTIONAL_PARAM(linear);
+ IGNORE_OPTIONAL_PARAM(image_type);
+ get_optional_float_param(key.v, "Saturation", &lineptr, &keepgoing);
+ get_optional_float_param(key.v, "Density", &lineptr, &keepgoing);
+ get_optional_string_param(key.v, "InkType", &lineptr, &keepgoing);
+ get_optional_string_param(key.v,"DitherAlgorithm",&lineptr,&keepgoing);
+ GET_OPTIONAL_INTERNAL_INT_PARAM(unit);
+ stpui_plist_add(&key, 0);
+ g_free(key.name);
+ stp_vars_destroy(key.v);
+ }
+ stpui_plist_current = 0;
+}
+
+static void
+stpui_printrc_load_v1(FILE *fp)
+{
+ char line[1024]; /* Line in printrc file */
+ stpui_plist_t key; /* Search key */
+ char * current_printer = 0; /* printer to select */
+ (void) memset(line, 0, 1024);
+ (void) memset(&key, 0, sizeof(stpui_plist_t));
+ stpui_printer_initialize(&key);
+ key.name = g_strdup(_("File"));
+ while (fgets(line, sizeof(line), fp) != NULL)
+ {
+ /*
+ * 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
+ fprintf(stderr, "Keyword = `%s', value = `%s'\n", keyword, value);
+#endif
+ if (strcasecmp("current-printer", keyword) == 0)
+ {
+ if (current_printer)
+ g_free (current_printer);
+ current_printer = g_strdup(value);
+ }
+ else if (strcasecmp("printer", keyword) == 0)
+ {
+ /* Switch to printer named VALUE */
+ stpui_plist_add(&key, 0);
+#ifdef DEBUG
+ fprintf(stderr,
+ "output_to is now %s\n", stpui_plist_get_output_to(&key));
+#endif
+
+ stp_vars_destroy(key.v);
+ stpui_printer_initialize(&key);
+ key.invalid_mask = 0;
+ stpui_plist_set_name(&key, value);
+ }
+ else if (strcasecmp("destination", keyword) == 0)
+ stpui_plist_set_custom_command(&key, value);
+ else if (strcasecmp("driver", keyword) == 0)
+ stp_set_driver(key.v, value);
+ else if (strcasecmp("ppd-file", keyword) == 0)
+ stp_set_file_parameter(key.v, "PPDFile", value);
+ else if (strcasecmp("output-type", keyword) == 0)
+ {
+ switch (atoi(value))
+ {
+ case 1:
+ stp_set_string_parameter(key.v, "PrintingMode", "Color");
+ break;
+ case 0:
+ default:
+ stp_set_string_parameter(key.v, "PrintingMode", "BW");
+ break;
+ }
+ }
+ else if (strcasecmp("media-size", keyword) == 0)
+ stp_set_string_parameter(key.v, "PageSize", value);
+ else if (strcasecmp("media-type", keyword) == 0)
+ stp_set_string_parameter(key.v, "MediaType", value);
+ else if (strcasecmp("media-source", keyword) == 0)
+ stp_set_float_parameter(key.v, "Brightness", atof(value));
+ else if (strcasecmp("scaling", keyword) == 0)
+ key.scaling = atof(value);
+ else if (strcasecmp("orientation", keyword) == 0)
+ key.orientation = 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("linear", keyword) == 0)
+ /* Ignore linear */
+ ;
+ else if (strcasecmp("image-type", keyword) == 0)
+ /* Ignore image type */
+ ;
+ else if (strcasecmp("unit", keyword) == 0)
+ key.unit = 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));
+ /* Special case Ink-Type and Dither-Algorithm */
+ else if (strcasecmp("ink-type", keyword) == 0)
+ stp_set_string_parameter(key.v, "InkType", value);
+ else if (strcasecmp("dither-algorithm", keyword) == 0)
+ stp_set_string_parameter(key.v, "DitherAlgorithm", value);
+ else
+ {
+ stp_parameter_t desc;
+ stp_curve_t *curve;
+ stp_describe_parameter(key.v, keyword, &desc);
+ switch (desc.p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ stp_set_string_parameter(key.v, keyword, value);
+ break;
+ case STP_PARAMETER_TYPE_FILE:
+ stp_set_file_parameter(key.v, keyword, value);
+ break;
+ case STP_PARAMETER_TYPE_DOUBLE:
+ stp_set_float_parameter(key.v, keyword, atof(value));
+ break;
+ case STP_PARAMETER_TYPE_INT:
+ stp_set_int_parameter(key.v, keyword, atoi(value));
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ stp_set_boolean_parameter(key.v, keyword, atoi(value));
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ curve = stp_curve_create_from_string(value);
+ if (curve)
+ {
+ stp_set_curve_parameter(key.v, keyword, curve);
+ stp_curve_destroy(curve);
+ }
+ break;
+ default:
+ if (strlen(value))
+ {
+ char buf[1024];
+ snprintf(buf, sizeof(buf),
+ "Unrecognized keyword `%s' in printrc; value `%s' (%d)\n",
+ keyword, value, desc.p_type);
+ }
+ }
+ stp_parameter_description_destroy(&desc);
+ }
+ }
+ if (strlen(key.name) > 0)
+ {
+ stpui_plist_add(&key, 0);
+ stp_vars_destroy(key.v);
+ g_free(key.name);
+ }
+ if (current_printer)
+ {
+ int i;
+ for (i = 0; i < stpui_plist_count; i ++)
+ if (strcmp(current_printer, stpui_plist[i].name) == 0)
+ stpui_plist_current = i;
+ }
+}
+
+const char *stpui_printrc_current_printer = NULL;
+extern FILE *yyin;
+extern int yyparse(void);
+
+static void
+stpui_printrc_load_v2(FILE *fp)
+{
+ int retval;
+ yyin = fp;
+
+ stpui_printrc_current_printer = NULL;
+ retval = yyparse();
+ if (stpui_printrc_current_printer)
+ {
+ int i;
+ for (i = 0; i < stpui_plist_count; i ++)
+ {
+ if (strcmp(stpui_printrc_current_printer, stpui_plist[i].name) == 0)
+ stpui_plist_current = i;
+ if (!stp_check_boolean_parameter(stpui_plist[i].v,
+ "PageSizeExtended",
+ STP_PARAMETER_ACTIVE))
+ stp_set_boolean_parameter(stpui_plist[i].v, "PageSizeExtended", 0);
+ }
+ SAFE_FREE(stpui_printrc_current_printer);
+ }
+}
+
+/*
+ * 'stpui_printrc_load()' - Load the printer resource configuration file.
+ */
+void
+stpui_printrc_load(void)
+{
+ FILE *fp; /* Printrc file */
+ char line[1024]; /* Line in printrc file */
+ int format = 0; /* rc file format version */
+ const char *filename = stpui_get_printrc_file();
+
+ initialize_default_parameters();
+ check_plist(1);
+
+ /*
+ * Get the printer list...
+ */
+
+ stpui_get_system_printers();
+
+ if ((fp = fopen(filename, "r")) != NULL)
+ {
+ (void) memset(line, 0, 1024);
+ if (fgets(line, sizeof(line), fp) != NULL)
+ {
+ /* Force locale to "C", so that numbers scan correctly */
+ setlocale(LC_ALL, "C");
+ if (strncmp("#PRINTRCv", line, 9) == 0)
+ {
+#ifdef DEBUG
+ fprintf(stderr, "Found printrc version tag: `%s'\n", line);
+ fprintf(stderr, "Version number: `%s'\n", &(line[9]));
+#endif
+ (void) sscanf(&(line[9]), "%d", &format);
+ }
+ setlocale(LC_ALL, "");
+ }
+ rewind(fp);
+ switch (format)
+ {
+ case 0:
+ stpui_printrc_load_v0(fp);
+ break;
+ case 1:
+ stpui_printrc_load_v1(fp);
+ break;
+ case 2:
+ case 3:
+ case 4:
+ stpui_printrc_load_v2(fp);
+ break;
+ }
+ (void) fclose(fp);
+ }
+ if (stpui_plist_count == 0)
+ stpui_plist_create(_("Printer"), "ps2");
+}
+
+/*
+ * 'stpui_printrc_save()' - Save the current printer resource configuration.
+ */
+void
+stpui_printrc_save(void)
+{
+ FILE *fp; /* Printrc file */
+ int i; /* Looping var */
+ size_t global_settings_count = stp_string_list_count(default_parameters);
+ stpui_plist_t *p; /* Current printer */
+ const char *filename = stpui_get_printrc_file();
+
+
+ if ((fp = fopen(filename, "w")) != NULL)
+ {
+ /*
+ * Write the contents of the printer list...
+ */
+
+ /* Force locale to "C", so that numbers print correctly */
+ setlocale(LC_ALL, "C");
+#ifdef DEBUG
+ fprintf(stderr, "Number of printers: %d\n", stpui_plist_count);
+#endif
+
+ fputs("#PRINTRCv4 written by Gutenprint " PLUG_IN_VERSION "\n\n", fp);
+
+ fprintf(fp, "Global-Settings:\n");
+ fprintf(fp, " Current-Printer: \"%s\"\n",
+ stpui_plist[stpui_plist_current].name);
+ fprintf(fp, " Show-All-Paper-Sizes: %s\n",
+ stpui_show_all_paper_sizes ? "True" : "False");
+ for (i = 0; i < global_settings_count; i++)
+ {
+ stp_param_string_t *ps = stp_string_list_param(default_parameters, i);
+ fprintf(fp, " %s \"%s\"\n", ps->name, ps->text);
+ }
+ fprintf(fp, "End-Global-Settings:\n");
+
+ for (i = 0, p = stpui_plist; i < stpui_plist_count; i ++, p ++)
+ {
+ int count;
+ int j;
+ stp_parameter_list_t *params = stp_get_parameter_list(p->v);
+ count = stp_parameter_list_count(params);
+ fprintf(fp, "\nPrinter: \"%s\" \"%s\"\n",
+ p->name, stp_get_driver(p->v));
+ fprintf(fp, " Command-Type: %d\n", p->command_type);
+ fprintf(fp, " Queue-Name: \"%s\"\n", p->queue_name);
+ fprintf(fp, " Output-Filename: \"%s\"\n", p->output_filename);
+ fprintf(fp, " Extra-Printer-Options: \"%s\"\n", p->extra_printer_options);
+ fprintf(fp, " Custom-Command: \"%s\"\n", p->custom_command);
+ fprintf(fp, " Scaling: %.3f\n", p->scaling);
+ fprintf(fp, " Orientation: %d\n", p->orientation);
+ fprintf(fp, " Autosize-Roll-Paper: %d\n", p->auto_size_roll_feed_paper);
+ fprintf(fp, " Unit: %d\n", p->unit);
+
+ fprintf(fp, " Left: %d\n", stp_get_left(p->v));
+ fprintf(fp, " Top: %d\n", stp_get_top(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));
+ fprintf(fp, " Parameter %s Int True %d\n", copy_count_name,
+ stpui_plist_get_copy_count(p));
+
+ for (j = 0; j < count; j++)
+ {
+ const stp_parameter_t *param = stp_parameter_list_param(params, j);
+ if (strcmp(param->name, "AppGamma") == 0)
+ continue;
+ switch (param->p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ if (stp_check_string_parameter(p->v, param->name,
+ STP_PARAMETER_INACTIVE))
+ fprintf(fp, " Parameter %s String %s \"%s\"\n",
+ param->name,
+ ((stp_get_string_parameter_active
+ (p->v, param->name) == STP_PARAMETER_ACTIVE) ?
+ "True" : "False"),
+ stp_get_string_parameter(p->v, param->name));
+ break;
+ case STP_PARAMETER_TYPE_FILE:
+ if (stp_check_file_parameter(p->v, param->name,
+ STP_PARAMETER_INACTIVE))
+ fprintf(fp, " Parameter %s File %s \"%s\"\n", param->name,
+ ((stp_get_file_parameter_active
+ (p->v, param->name) == STP_PARAMETER_ACTIVE) ?
+ "True" : "False"),
+ stp_get_file_parameter(p->v, param->name));
+ break;
+ case STP_PARAMETER_TYPE_DOUBLE:
+ if (stp_check_float_parameter(p->v, param->name,
+ STP_PARAMETER_INACTIVE))
+ fprintf(fp, " Parameter %s Double %s %f\n", param->name,
+ ((stp_get_float_parameter_active
+ (p->v, param->name) == STP_PARAMETER_ACTIVE) ?
+ "True" : "False"),
+ stp_get_float_parameter(p->v, param->name));
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ if (stp_check_dimension_parameter(p->v, param->name,
+ STP_PARAMETER_INACTIVE))
+ fprintf(fp, " Parameter %s Dimension %s %d\n", param->name,
+ ((stp_get_dimension_parameter_active
+ (p->v, param->name) == STP_PARAMETER_ACTIVE) ?
+ "True" : "False"),
+ stp_get_dimension_parameter(p->v, param->name));
+ break;
+ case STP_PARAMETER_TYPE_INT:
+ if (stp_check_int_parameter(p->v, param->name,
+ STP_PARAMETER_INACTIVE))
+ fprintf(fp, " Parameter %s Int %s %d\n", param->name,
+ ((stp_get_int_parameter_active
+ (p->v, param->name) == STP_PARAMETER_ACTIVE) ?
+ "True" : "False"),
+ stp_get_int_parameter(p->v, param->name));
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ if (stp_check_boolean_parameter(p->v, param->name,
+ STP_PARAMETER_INACTIVE))
+ fprintf(fp, " Parameter %s Boolean %s %s\n", param->name,
+ ((stp_get_boolean_parameter_active
+ (p->v, param->name) == STP_PARAMETER_ACTIVE) ?
+ "True" : "False"),
+ (stp_get_boolean_parameter(p->v, param->name) ?
+ "True" : "False"));
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ if (stp_check_curve_parameter(p->v, param->name,
+ STP_PARAMETER_INACTIVE))
+ {
+ const stp_curve_t *curve =
+ stp_get_curve_parameter(p->v, param->name);
+ if (curve)
+ {
+ fprintf(fp, " Parameter %s Curve %s '",
+ param->name,
+ ((stp_get_curve_parameter_active
+ (p->v, param->name) ==
+ STP_PARAMETER_ACTIVE) ?
+ "True" : "False"));
+ stp_curve_write(fp, curve);
+ fprintf(fp, "'\n");
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ stp_parameter_list_destroy(params);
+#ifdef DEBUG
+ fprintf(stderr, "Wrote printer %d: %s\n", i, p->name);
+#endif
+ }
+ setlocale(LC_ALL, "");
+ fclose(fp);
+ }
+ else
+ fprintf(stderr, "could not open printrc file \"%s\"\n",filename);
+}
+
+/*
+ * 'compare_printers()' - Compare system printer names for qsort().
+ */
+
+static int
+compare_printers(stpui_plist_t *p1, stpui_plist_t *p2)
+{
+ return (strcmp(p1->name, p2->name));
+}
+
+/*
+ * 'stpui_get_system_printers()' - Get a complete list of printers from the spooler.
+ */
+
+void
+stpui_get_system_printers(void)
+{
+ FILE *pfile; /* Pipe to status command */
+ char line[1025]; /* Line from status command */
+
+ stpui_system_print_queues = stp_string_list_create();
+ stp_string_list_add_string(stpui_system_print_queues, "",
+ _("(Default Printer)"));
+
+ /*
+ * Run the command, if any, to get the available printers...
+ */
+
+ identify_print_system();
+ if (global_printing_system)
+ {
+ if ((pfile = popen(global_printing_system->scan_command, "r")) != NULL)
+ {
+ /*
+ * Read input as needed...
+ */
+
+ while (fgets(line, sizeof(line), pfile) != NULL)
+ {
+ char *tmp_ptr;
+ if ((tmp_ptr = strchr(line, '\n')))
+ tmp_ptr[0] = '\0';
+ if ((tmp_ptr = strchr(line, '\r')))
+ tmp_ptr[0] = '\0';
+ if (strlen(line) > 0)
+ {
+ if (!stp_string_list_is_present(stpui_system_print_queues, line))
+ stp_string_list_add_string(stpui_system_print_queues,
+ line, line);
+ }
+ }
+ pclose(pfile);
+ }
+ }
+}
+
+const stpui_plist_t *
+stpui_get_current_printer(void)
+{
+ return &(stpui_plist[stpui_plist_current]);
+}
+
+/*
+ * 'usr1_handler()' - Make a note when we receive SIGUSR1.
+ */
+
+static volatile int usr1_interrupt;
+
+static void
+usr1_handler (int sig)
+{
+ usr1_interrupt = 1;
+}
+
+static void
+writefunc(void *file, const char *buf, size_t bytes)
+{
+ FILE *prn = (FILE *)file;
+ fwrite(buf, 1, bytes, prn);
+}
+
+static void
+stpui_errfunc(void *file, const char *buf, size_t bytes)
+{
+ g_message(buf);
+}
+
+/*
+ *
+ * Process control for actually printing. Documented 20040821
+ * by Robert Krawitz.
+ *
+ * In addition to the print command itself and the output generator,
+ * we spawn two additional processes to monitor the print job and clean
+ * up. We do this because the GIMP is very unfriendly about how it
+ * terminates plugins when the user cancels an operation: it sends a
+ * SIGKILL, which prevents the plugin from cleaning up. Since the
+ * plugin is sending data to an lpr process, this SIGKILL closes off
+ * the input to lpr. lpr doesn't know that its parent has died
+ * inappropriately, and happily proceeds to print the partial job.
+ *
+ * (The child may not actually be lpr, of course, but we'll just use
+ * that nomenclature for convenience.)
+ *
+ * The first such process is the "lpr monitor". Its job is to
+ * watch the parent (the actual data generator). If its parent dies,
+ * it kills the print command. Notice that it must keep the file
+ * descriptor used to write to the lpr process open, since as soon as
+ * the last writer to this pipe is closed, the lpr process sees its
+ * input close. Therefore, it first kills the child with SIGTERM and
+ * then closes the pipe. Perhaps a more robust method would be to
+ * send a SIGTERM followed by a SIGKILL, but we can worry about that
+ * later. The lpr monitor process is killed with SIGUSR1 by the
+ * master upon successful completion, at which point it exits. The lpr
+ * monitor itself detects that the master has finished by periodically
+ * sending it a kill 0 (a null signal). When the parent exits, this
+ * attempt to signal will return failure. This has a potential race
+ * condition if another process is created with the same PID between
+ * checks. A more robust (but more complicated) solution would involve
+ * IPC of some kind.
+ *
+ * The second such process (the "error monitor") monitors the stderr
+ * (and stdout) of the lpr process, to send any error messages back
+ * to the user. Since the GIMP is normally not launched from a
+ * terminal window, any errors would get lost. The error monitor
+ * captures this output and reports it back. It stays around until
+ * its input is closed (normally by the lpr process exiting), at
+ * which point it reports to the master that it has finished, and the
+ * master can clean up and return.
+ *
+ * The actual master process spawns the lpr monitor, which spawns
+ * the process that will later run the lpr command, which itself
+ * spawns the error monitor.
+ *
+ * This architecture is perhaps unnecessarily complex; the lpr monitor
+ * and error monitor could perhaps be combined into a single process
+ * that watches both for the parent to go away and for the error messages.
+ *
+ * The following diagrams illustrate the control flow during the normal
+ * case and also when the print job is cancelled. The notation for file
+ * descriptors is a number prefixed with < for an input file descriptor
+ * and suffixed > for an output file descriptor. For example, <0 means
+ * input file descriptor 0 and 1> means output file descriptor 1. The
+ * key to the file descriptors is given below. A file descriptor named
+ * x,y refers to file descriptor y duplicated onto file descriptor x.
+ * So "<0,3" means input file descriptor 3 (pipefd[0]) dup2'ed onto
+ * file descriptor 0.
+ *
+ * fd0 = fd 0
+ * fd1 = fd 1
+ * fd2 = fd 2
+ * fd3 = pipefd[0]
+ * fd4 = pipefd[1]
+ * fd5 = syncfd[0]
+ * fd6 = syncfd[1]
+ * fd7 = errfd[0]
+ * fd8 = errfd[1]
+ *
+ *
+ * NORMAL CASE
+ *
+ * PARENT CHILD 1 CHILD 2 CHILD 3
+ * (print generator) (lpr monitor) (print command) (error monitor)
+ * |
+ * stpui_print
+ * |
+ * | <0 1> 2>
+ * |
+ * | pipe(syncfd)
+ * |
+ * | <0 1> 2> <5 6>
+ * |
+ * | pipe(pipefd)
+ * |
+ * | <0 1> 2> <3 4>
+ * | <5 6>
+ * |
+ * | fork =============|
+ * | |
+ * | close(63) | close(syncfd[0])
+ * | | <0 1> 2> <3 4>
+ * | <0 1> 2> 4> <5 | 6>
+ * | |
+ * | | fork =============|
+ * | | |
+ * | | close(01263) | dup2(pipefd[0], 0)
+ * | | | close(pipefd[0]
+ * | | 4> | close(pipefd[1]
+ * | | |
+ * | | | 1> 2> <0,3 6>
+ * | | |
+ * | | | pipe(errfd)
+ * | | | 1> 2> <0,3 6>
+ * | | | <7 8>
+ * | | |
+ * | | | fork =============|
+ * | | | | close(012348)
+ * | | | close(12) | 6> <7
+ * | | | |
+ * | | | <0,3 6> <7 8> |
+ * | | | |
+ * | | | dup2(errfd[1],1) |
+ * | | | dup2(errfd[1],2) |
+ * | | | close(errfd[1]) |
+ * | | | close(pipefd[0]) |
+ * | | | close(pipefd[1]) |
+ * | | | close(syncfd[1]) |
+ * |<<<<<<<<<<<<<<<<<<<|kill(0,0) * EXEC lpr |
+ * |>>>>>>>>>>>>>>>>>>>|OK | <0,3 1,8> 2,8> |
+ * | | | |
+ * | write>>>>>>>>>>>>>+>>>>>>>>>>>>>>>>>>>| |
+ * | | | write(2,8)??>>>>>>|read(<7)->warn
+ * | | | |
+ * | close(4)>>>>>>>>>>+>>>>>>>>>>>>>>>>>>>| |
+ * | <0 1> 2> <5 | | |
+ * | kill>>>>>>>>>>>>>>| | |
+ * | | close(4)>>>>>>>>>>| eof(<0,3) |
+ * | | | |
+ * | | *no open fd* | 1,8> 2,8> |
+ * | | exit | |
+ * | | | exit>>>>>>>>>>>>>>| eof(<7)
+ * | wait<<<<<<<<<<<<<<X X | 6>
+ * | |
+ * | read(<5)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<| write(6>)
+ * | |
+ * | close(5) | exit
+ * | X
+ * | 0< 1> 2>
+ * |
+ * | return
+ * X
+ *
+ *
+ * ERROR CASE (job cancelled)
+ *
+ * PARENT CHILD 1 CHILD 2 CHILD 3
+ * (print generator) (lpr monitor) (print command) (error monitor)
+ * |
+ * stpui_print
+ * |
+ * | <0 1> 2>
+ * |
+ * | pipe(syncfd)
+ * |
+ * | <0 1> 2> <5 6>
+ * |
+ * | pipe(pipefd)
+ * |
+ * | <0 1> 2> <3 4>
+ * | <5 6>
+ * |
+ * | fork =============|
+ * | |
+ * | close(63) | close(syncfd[0]
+ * | | <0 1> 2> <3 4>
+ * | <0 1> 2> 4> <5 | 6>
+ * | |
+ * | | fork =============|
+ * | | |
+ * | | close(01263) | dup2(pipefd[0], 0)
+ * | | | close(pipefd[0]
+ * | | 4> | close(pipefd[1]
+ * | | |
+ * | | | 1> 2> <3,0 6>
+ * | | |
+ * | | | pipe(errfd)
+ * | | | 1> 2> <3,0 6>
+ * | | | <7 8>
+ * | | |
+ * | | | fork =============|
+ * | | | | close(012348)
+ * | | | close(12) | 6> <7
+ * | | | |
+ * | | | <3,0 6> <7 8> |
+ * | | | |
+ * | | | dup2(errfd[1],1) |
+ * | | | dup2(errfd[1],2) |
+ * | | | close(3468) |
+ * |<<<<<<<<<<<<<<<<<<<|kill(0,0) * EXEC lpr |
+ * |>>>>>>>>>>>>>>>>>>>|OK | <0,3 1,8> 2,8> |
+ * | | | |
+ * | write>>>>>>>>>>>>>+>>>>>>>>>>>>>>>>>>>| |
+ * | | | write(2,8)??>>>>>>|read(<7)->warn
+ * | KILLED | | |
+ * | close(01245)>>>>>>+>>>>>>>>>>>>>>>>>>>| |
+ * X | | |
+ * <<<<<<<<<<<<<<<<<<<|kill(0,0) | |
+ * >>>>>>>>>>>>>>>>>>>|DEAD! | |
+ * |kill(2)>>>>>>>>>>>>|Terminated |
+ * |close(4>)>>>>>>>>>>|eof(0,3) |
+ * | | 1,8> 2,8> |
+ * | *no open fd* |exit>>>>>>>>>>>>>>>|eof(7)
+ * | exit X |
+ * X | 6>
+ * <| write(6)
+ * | exit/SIGPIPE
+ * X
+ */
+
+int
+stpui_print(const stpui_plist_t *printer, stpui_image_t *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 */
+ errfd[2], /* Message logger from lp command */
+ syncfd[2]; /* Sync the logger */
+ FILE *prn = NULL; /* Print file/command */
+ int do_sync = 0;
+ int print_status = 0;
+ int dummy;
+
+ /*
+ * Open the file/execute the print command...
+ */
+
+ if (stpui_plist_get_command_type(printer) == COMMAND_TYPE_DEFAULT ||
+ stpui_plist_get_command_type(printer) == COMMAND_TYPE_CUSTOM)
+ {
+ /*
+ * 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.
+ */
+ do_sync = 1;
+ usr1_interrupt = 0;
+ signal (SIGUSR1, usr1_handler);
+ if (pipe (syncfd) != 0)
+ {
+ do_sync = 0;
+ }
+ if (pipe (pipefd) != 0)
+ {
+ prn = NULL;
+ }
+ else
+ {
+ cpid = fork ();
+ if (cpid < 0) /* Error */
+ {
+ do_sync = 0;
+ prn = NULL;
+ }
+ else if (cpid == 0) /* Child 1 (lpr monitor and printer command) */
+ {
+ /* LPR monitor process. Printer output is piped to us. */
+ close(syncfd[0]);
+ opid = fork ();
+ if (opid < 0)
+ {
+ /* Errors will cause the plugin to get a SIGPIPE. */
+ exit (1);
+ }
+ else if (opid == 0) /* Child 2 (printer command) */
+ {
+ dup2 (pipefd[0], 0);
+ close (pipefd[0]);
+ close (pipefd[1]);
+ if (pipe(errfd) == 0)
+ {
+ opid = fork();
+ if (opid < 0)
+ _exit(1);
+ else if (opid == 0) /* Child 3 (monitors stderr) */
+ {
+ stp_outfunc_t errfunc = stpui_get_errfunc();
+ void *errdata = stpui_get_errdata();
+ /* calls g_message on anything it sees */
+ char buf[4096];
+
+ close (pipefd[0]);
+ close (pipefd[1]);
+ close (0);
+ close (1);
+ close (2);
+ close (errfd[1]);
+ while (1)
+ {
+ ssize_t bytes = read(errfd[0], buf, 4095);
+ if (bytes > 0)
+ {
+ buf[bytes] = '\0';
+ (*errfunc)(errdata, buf, bytes);
+ }
+ else
+ {
+ if (bytes < 0)
+ {
+ snprintf(buf, 4095,
+ "Read messages failed: %s\n",
+ strerror(errno));
+ (*errfunc)(errdata, buf, strlen(buf));
+ }
+ write(syncfd[1], "Done", 5);
+ _exit(0);
+ }
+ }
+ /* NOTREACHED */
+ write(syncfd[1], "Done", 5);
+ _exit(0);
+ }
+ else /* Child 2 (printer command) */
+ {
+ const char *command;
+ if (stpui_plist_get_command_type(printer) ==
+ COMMAND_TYPE_DEFAULT)
+ command =
+ stpui_build_standard_print_command
+ (printer, stp_get_printer(printer->v));
+ else
+ command = stpui_plist_get_custom_command(printer);
+ (void) close(2);
+ (void) close(1);
+ dup2 (errfd[1], 2);
+ dup2 (errfd[1], 1);
+ close(errfd[1]);
+ close (pipefd[0]);
+ close (pipefd[1]);
+ close(syncfd[1]);
+ execl("/bin/sh", "/bin/sh", "-c", command, NULL);
+ /* NOTREACHED */
+ _exit (1);
+ }
+ /* NOTREACHED */
+ _exit(1);
+ }
+ else /* pipe() failed! */
+ {
+ _exit(1);
+ }
+ }
+ else /* Child 1 (lpr monitor) */
+ {
+ /*
+ * 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.
+ *
+ * Note that we keep pipefd[1] -- which is the pipe from
+ * the print plugin to the lpr process -- open during this.
+ * If we don't, and the parent gets killed, lpr will notice
+ * its stdin getting closed off and start printing.
+ * This way its stdin stays open until we kill it.
+ */
+ close (0);
+ close (1);
+ close (2);
+ close (syncfd[1]);
+ close (pipefd[0]);
+ while (usr1_interrupt == 0)
+ {
+ /*
+ * Note potential race condition, if some other process
+ * happens to get the same pid!
+ */
+ if (kill (ppid, 0) < 0)
+ {
+ /*
+ * The print plugin has been killed!
+ * Note that there is no possibility of the print
+ * job sending us a SIGUSR1 and then exiting;
+ * the parent (print plugin) stays around after
+ * sending us the SIGUSR1, and then waits
+ * for us to die.
+ */
+ 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 /* Parent (actually generates the output) */
+ {
+ close (syncfd[1]);
+ close (pipefd[0]);
+ /* Parent process. We generate the printer output. */
+ prn = fdopen (pipefd[1], "w");
+ /* and fall through... */
+ }
+ }
+ }
+ else
+ prn = fopen (stpui_plist_get_output_filename(printer), "wb");
+
+ if (prn != NULL)
+ {
+ char tmp[32];
+ stpui_plist_t *np = allocate_stpui_plist_copy(printer);
+ const stp_vars_t *current_vars =
+ stp_printer_get_defaults(stp_get_printer(np->v));
+ int orientation;
+ stp_merge_printvars(np->v, current_vars);
+ stp_set_string_parameter(np->v, "InputImageType", image_type);
+ if (image_raw_channels)
+ {
+ sprintf(tmp, "%d", image_raw_channels);
+ stp_set_string_parameter(np->v, "RawChannels", tmp);
+ }
+ sprintf(tmp, "%d", image_channel_depth);
+ stp_set_string_parameter(np->v, "ChannelBitDepth", tmp);
+
+ /*
+ * Set up the orientation
+ */
+ orientation = np->orientation;
+ if (orientation == ORIENT_AUTO)
+ orientation = stpui_compute_orientation();
+ switch (orientation)
+ {
+ case ORIENT_PORTRAIT:
+ break;
+ case ORIENT_LANDSCAPE:
+ if (image->rotate_cw)
+ (image->rotate_cw)(image);
+ break;
+ case ORIENT_UPSIDEDOWN:
+ if (image->rotate_180)
+ (image->rotate_180)(image);
+ break;
+ case ORIENT_SEASCAPE:
+ if (image->rotate_ccw)
+ (image->rotate_ccw)(image);
+ break;
+ }
+
+ /*
+ * Finally, call the print driver to send the image to the printer
+ * and close the output file/command...
+ */
+
+ stp_set_outfunc(np->v, writefunc);
+ stp_set_errfunc(np->v, stpui_get_errfunc());
+ stp_set_outdata(np->v, prn);
+ stp_set_errdata(np->v, stpui_get_errdata());
+ print_status = stp_print(np->v, &(image->im));
+
+ /*
+ * Note that we do not use popen() to create the output, therefore
+ * we do not use pclose() to close it. See bug 1013565.
+ */
+ (void) fclose(prn);
+ if (stpui_plist_get_command_type(printer) == COMMAND_TYPE_DEFAULT ||
+ stpui_plist_get_command_type(printer) == COMMAND_TYPE_CUSTOM)
+ {
+ /*
+ * It is important for us to first close off the lpr process,
+ * then kill the lpr monitor (child 1), and then wait for it
+ * to die before exiting.
+ */
+ kill (cpid, SIGUSR1);
+ waitpid (cpid, &dummy, 0);
+ }
+
+ /*
+ * Make sure that any errors have been reported back to the user
+ * prior to completion. In addition, explicitly close off the
+ * synchronization file descriptor since we're merely returning,
+ * not exiting, and don't want to leave any pollution around.
+ */
+ if (do_sync)
+ {
+ char buf[8];
+ (void) read(syncfd[0], buf, 8);
+ (void) close(syncfd[0]);
+ }
+ stpui_plist_destroy(np);
+ g_free(np);
+ return 1;
+ }
+ return 0;
+}
+
+/*
+ * End of "$Id: plist.c,v 1.2 2005/01/28 03:02:18 rlk Exp $".
+ */
diff --git a/src/gutenprintui/print-image-thumbnail.c b/src/gutenprintui/print-image-thumbnail.c
new file mode 100644
index 0000000..e692d55
--- /dev/null
+++ b/src/gutenprintui/print-image-thumbnail.c
@@ -0,0 +1,130 @@
+/*
+ * "$Id: print-image-thumbnail.c,v 1.1 2004/09/17 18:38:14 rleigh 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 <cpbs@debian.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 <config.h>
+#endif
+#include <sys/types.h>
+#include <string.h>
+
+#include <gutenprintui/gutenprintui.h>
+#include "gutenprintui-internal.h"
+
+/* Concrete type to represent image */
+typedef struct
+{
+ const guchar *data;
+ gint w, h, bpp;
+ gint32 real_bpp;
+} thumbnail_image_t;
+
+static const char *Thumbnail_get_appname(stp_image_t *image);
+static void Thumbnail_conclude(stp_image_t *image);
+static stp_image_status_t Thumbnail_get_row(stp_image_t *image,
+ unsigned char *data,
+ size_t byte_limit, int row);
+static int Thumbnail_height(stp_image_t *image);
+static int Thumbnail_width(stp_image_t *image);
+static void Thumbnail_reset(stp_image_t *image);
+static void Thumbnail_init(stp_image_t *image);
+
+static stp_image_t theImage =
+{
+ Thumbnail_init,
+ Thumbnail_reset,
+ Thumbnail_width,
+ Thumbnail_height,
+ Thumbnail_get_row,
+ Thumbnail_get_appname,
+ Thumbnail_conclude,
+ NULL
+};
+
+stp_image_t *
+stpui_image_thumbnail_new(const guchar *data, gint w, gint h, gint bpp)
+{
+ thumbnail_image_t *im;
+ if (! theImage.rep)
+ theImage.rep = stp_malloc(sizeof(thumbnail_image_t));
+ im = (thumbnail_image_t *) (theImage.rep);
+ memset(im, 0, sizeof(thumbnail_image_t));
+ im->data = data;
+ im->w = w;
+ im->h = h;
+ im->bpp = bpp;
+
+ theImage.reset(&theImage);
+ return &theImage;
+}
+
+static int
+Thumbnail_width(stp_image_t *image)
+{
+ thumbnail_image_t *im = (thumbnail_image_t *) (image->rep);
+ return im->w;
+}
+
+static int
+Thumbnail_height(stp_image_t *image)
+{
+ thumbnail_image_t *im = (thumbnail_image_t *) (image->rep);
+ return im->h;
+}
+
+static stp_image_status_t
+Thumbnail_get_row(stp_image_t *image, unsigned char *data,
+ size_t byte_limit, int row)
+{
+ thumbnail_image_t *im = (thumbnail_image_t *) (image->rep);
+ const guchar *where = im->data + (row * im->w * im->bpp);
+ memcpy(data, where, im->w * im->bpp);
+ return STP_IMAGE_STATUS_OK;
+}
+
+static void
+Thumbnail_init(stp_image_t *image)
+{
+ /* Nothing to do. */
+}
+
+static void
+Thumbnail_reset(stp_image_t *image)
+{
+}
+
+static void
+Thumbnail_conclude(stp_image_t *image)
+{
+}
+
+static const char *
+Thumbnail_get_appname(stp_image_t *image)
+{
+ static char pluginname[] = "Thumbnail V" VERSION " - " RELEASE_DATE;
+ return pluginname;
+}
+
+/*
+ * End of "$Id: print-image-thumbnail.c,v 1.1 2004/09/17 18:38:14 rleigh Exp $".
+ */
diff --git a/src/gutenprintui/printrc.h b/src/gutenprintui/printrc.h
new file mode 100644
index 0000000..9cf2ada
--- /dev/null
+++ b/src/gutenprintui/printrc.h
@@ -0,0 +1,44 @@
+/*
+ * "$Id: printrc.h,v 1.1 2004/09/17 18:38:14 rleigh 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 __GIMP_PRINT_PRINTRC_H__
+#define __GIMP_PRINT_PRINTRC_H__
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+typedef union yylv {
+ int ival;
+ double dval;
+ char *sval;
+} YYSTYPE;
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+#include "printrcy.h"
+
+#endif /* __GIMP_PRINT_PRINTRC_H__ */
diff --git a/src/gutenprintui/printrcl.c b/src/gutenprintui/printrcl.c
new file mode 100644
index 0000000..341c76d
--- /dev/null
+++ b/src/gutenprintui/printrcl.c
@@ -0,0 +1,2106 @@
+
+#line 3 "printrcl.c"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 31
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart(yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 16384
+#endif
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+extern int yyleng;
+
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef unsigned int yy_size_t;
+#endif
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via yyrestart()), so that the user can continue scanning by
+ * just pointing yyin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+static int yy_n_chars; /* number of characters read into yy_ch_buf */
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart (FILE *input_file );
+void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE yy_create_buffer (FILE *file,int size );
+void yy_delete_buffer (YY_BUFFER_STATE b );
+void yy_flush_buffer (YY_BUFFER_STATE b );
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer );
+void yypop_buffer_state (void );
+
+static void yyensure_buffer_stack (void );
+static void yy_load_buffer_state (void );
+static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len );
+
+void *yyalloc (yy_size_t );
+void *yyrealloc (void *,yy_size_t );
+void yyfree (void * );
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ yyensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer(yyin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ yyensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer(yyin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+#define yywrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int yylineno;
+
+int yylineno = 1;
+
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ yyleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 40
+#define YY_END_OF_BUFFER 41
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_accept[335] =
+ { 0,
+ 0, 0, 41, 40, 37, 39, 40, 38, 40, 40,
+ 31, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 37, 0, 33,
+ 38, 38, 0, 31, 0, 0, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 38, 32, 0, 32, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 24, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 38, 35, 35, 35, 35, 35,
+
+ 35, 35, 35, 35, 35, 0, 35, 35, 26, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 11,
+ 34, 35, 38, 35, 35, 35, 35, 30, 35, 35,
+ 35, 35, 35, 0, 35, 35, 10, 35, 35, 35,
+ 35, 35, 35, 0, 35, 8, 38, 35, 35, 35,
+ 35, 35, 35, 35, 27, 35, 0, 0, 35, 35,
+ 35, 35, 35, 0, 35, 0, 25, 38, 35, 29,
+ 35, 35, 0, 35, 35, 35, 9, 0, 0, 0,
+ 23, 35, 0, 35, 35, 35, 0, 35, 0, 38,
+ 35, 0, 0, 0, 35, 35, 35, 0, 0, 0,
+
+ 35, 0, 35, 35, 3, 0, 5, 0, 38, 0,
+ 0, 0, 0, 35, 35, 28, 0, 0, 0, 35,
+ 0, 35, 15, 0, 0, 38, 0, 0, 0, 0,
+ 35, 35, 0, 0, 0, 35, 0, 35, 0, 0,
+ 38, 36, 0, 0, 0, 0, 35, 35, 0, 0,
+ 0, 35, 0, 35, 16, 0, 0, 0, 0, 0,
+ 35, 4, 0, 0, 0, 6, 0, 14, 0, 0,
+ 20, 0, 0, 35, 35, 0, 0, 0, 0, 0,
+ 0, 0, 0, 35, 35, 0, 0, 0, 0, 0,
+ 0, 0, 19, 35, 35, 0, 0, 0, 0, 0,
+
+ 0, 1, 35, 35, 0, 0, 21, 17, 0, 0,
+ 35, 35, 0, 0, 0, 0, 35, 12, 0, 0,
+ 0, 0, 13, 0, 0, 0, 7, 22, 0, 0,
+ 0, 2, 18, 0
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 1, 4, 5, 1, 1, 1, 6, 1,
+ 1, 1, 7, 1, 8, 9, 1, 10, 10, 11,
+ 11, 11, 10, 10, 10, 10, 10, 12, 1, 1,
+ 1, 1, 1, 1, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 23, 24, 25, 26, 27, 28,
+ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
+ 1, 1, 1, 1, 13, 1, 14, 15, 16, 17,
+
+ 18, 19, 20, 21, 22, 23, 23, 24, 25, 26,
+ 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
+ 37, 38, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static yyconst flex_int32_t yy_meta[39] =
+ { 0,
+ 1, 1, 2, 1, 1, 1, 1, 1, 1, 3,
+ 3, 1, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3
+ } ;
+
+static yyconst flex_int16_t yy_base[340] =
+ { 0,
+ 0, 0, 374, 375, 371, 375, 368, 343, 364, 29,
+ 32, 336, 341, 18, 26, 21, 32, 343, 0, 340,
+ 347, 19, 41, 331, 42, 32, 337, 360, 357, 375,
+ 0, 330, 353, 55, 50, 68, 0, 326, 330, 331,
+ 37, 324, 329, 320, 330, 334, 318, 325, 324, 320,
+ 314, 326, 322, 311, 312, 319, 322, 325, 311, 307,
+ 308, 302, 312, 311, 59, 70, 72, 305, 307, 305,
+ 54, 297, 296, 309, 311, 291, 316, 293, 291, 303,
+ 305, 0, 287, 300, 289, 302, 289, 281, 289, 277,
+ 289, 298, 291, 276, 281, 275, 287, 290, 285, 284,
+
+ 274, 278, 273, 274, 279, 276, 281, 276, 0, 279,
+ 280, 265, 257, 264, 256, 269, 264, 277, 258, 375,
+ 0, 271, 250, 259, 266, 253, 252, 0, 252, 250,
+ 244, 256, 243, 248, 263, 246, 375, 237, 236, 249,
+ 248, 257, 238, 249, 242, 375, 231, 222, 233, 241,
+ 225, 77, 242, 233, 0, 242, 226, 224, 79, 237,
+ 81, 218, 219, 222, 227, 222, 0, 229, 226, 0,
+ 235, 234, 225, 212, 207, 211, 375, 222, 206, 204,
+ 375, 202, 214, 200, 213, 218, 215, 216, 203, 192,
+ 217, 192, 195, 195, 207, 198, 193, 204, 195, 198,
+
+ 193, 192, 176, 182, 375, 186, 375, 202, 198, 178,
+ 170, 176, 180, 184, 176, 0, 178, 175, 168, 172,
+ 174, 169, 0, 178, 167, 191, 166, 164, 169, 165,
+ 171, 162, 179, 154, 153, 158, 165, 164, 169, 166,
+ 176, 375, 154, 159, 150, 161, 161, 161, 141, 153,
+ 148, 157, 142, 155, 375, 138, 141, 152, 131, 136,
+ 51, 375, 143, 130, 133, 375, 144, 375, 139, 148,
+ 375, 137, 137, 135, 130, 119, 142, 129, 123, 117,
+ 118, 115, 132, 121, 125, 109, 113, 108, 120, 129,
+ 122, 123, 375, 114, 101, 110, 103, 118, 117, 97,
+
+ 99, 375, 105, 104, 98, 91, 375, 375, 100, 103,
+ 88, 107, 98, 95, 78, 85, 102, 375, 82, 85,
+ 93, 98, 375, 97, 82, 76, 375, 375, 68, 84,
+ 81, 375, 375, 375, 94, 97, 100, 89, 103
+ } ;
+
+static yyconst flex_int16_t yy_def[340] =
+ { 0,
+ 334, 1, 334, 334, 334, 334, 335, 336, 337, 334,
+ 334, 338, 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 334, 335, 334,
+ 336, 336, 337, 334, 334, 334, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 336, 334, 334, 334, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 336, 338, 338, 338, 338, 338,
+
+ 338, 338, 338, 338, 338, 334, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338, 338, 334,
+ 338, 338, 336, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 334, 338, 338, 334, 338, 338, 338,
+ 338, 338, 338, 334, 338, 334, 336, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 334, 334, 338, 338,
+ 338, 338, 338, 334, 338, 334, 338, 336, 338, 338,
+ 338, 338, 334, 338, 338, 338, 334, 334, 334, 334,
+ 334, 338, 334, 338, 338, 338, 334, 338, 334, 336,
+ 338, 334, 334, 334, 338, 338, 338, 334, 334, 334,
+
+ 338, 334, 338, 338, 334, 334, 334, 334, 336, 334,
+ 334, 334, 334, 338, 338, 338, 334, 334, 334, 338,
+ 334, 338, 338, 334, 334, 339, 334, 334, 334, 334,
+ 338, 338, 334, 334, 334, 338, 334, 338, 334, 334,
+ 339, 334, 334, 334, 334, 334, 338, 338, 334, 334,
+ 334, 338, 334, 338, 334, 334, 334, 334, 334, 334,
+ 338, 334, 334, 334, 334, 334, 334, 334, 334, 334,
+ 334, 334, 334, 338, 338, 334, 334, 334, 334, 334,
+ 334, 334, 334, 338, 338, 334, 334, 334, 334, 334,
+ 334, 334, 334, 338, 338, 334, 334, 334, 334, 334,
+
+ 334, 334, 338, 338, 334, 334, 334, 334, 334, 334,
+ 338, 338, 334, 334, 334, 334, 338, 334, 334, 334,
+ 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
+ 334, 334, 334, 0, 334, 334, 334, 334, 334
+ } ;
+
+static yyconst flex_int16_t yy_nxt[414] =
+ { 0,
+ 4, 5, 6, 7, 8, 9, 10, 10, 4, 11,
+ 11, 4, 4, 12, 13, 14, 15, 16, 17, 18,
+ 19, 20, 19, 21, 19, 19, 22, 23, 24, 19,
+ 25, 26, 27, 19, 19, 19, 19, 19, 34, 34,
+ 35, 34, 34, 42, 40, 48, 46, 43, 53, 36,
+ 41, 54, 44, 49, 55, 45, 47, 58, 61, 65,
+ 65, 62, 59, 35, 34, 34, 71, 72, 65, 65,
+ 56, 274, 36, 60, 66, 66, 36, 67, 67, 67,
+ 67, 67, 67, 99, 173, 275, 180, 100, 183, 174,
+ 181, 37, 333, 184, 29, 332, 29, 31, 331, 31,
+
+ 33, 33, 33, 241, 241, 241, 330, 329, 328, 327,
+ 326, 325, 324, 323, 322, 321, 320, 319, 318, 317,
+ 316, 315, 314, 313, 312, 311, 310, 309, 308, 307,
+ 306, 305, 304, 303, 302, 301, 300, 299, 298, 297,
+ 296, 295, 294, 293, 292, 291, 290, 289, 288, 287,
+ 286, 285, 284, 283, 282, 281, 280, 279, 278, 277,
+ 276, 273, 272, 271, 270, 269, 268, 267, 266, 265,
+ 264, 263, 262, 261, 260, 259, 258, 257, 242, 256,
+ 255, 254, 253, 252, 251, 250, 249, 248, 247, 246,
+ 245, 244, 243, 242, 240, 239, 238, 237, 236, 235,
+
+ 234, 233, 232, 231, 230, 229, 228, 227, 226, 225,
+ 224, 223, 222, 221, 220, 219, 218, 217, 216, 215,
+ 214, 213, 212, 211, 210, 209, 208, 207, 206, 205,
+ 204, 203, 202, 201, 200, 199, 198, 197, 196, 195,
+ 194, 193, 192, 191, 190, 189, 188, 187, 186, 185,
+ 182, 179, 178, 177, 176, 175, 172, 171, 170, 169,
+ 168, 167, 166, 165, 164, 163, 162, 161, 160, 159,
+ 158, 157, 156, 155, 154, 153, 152, 151, 150, 149,
+ 148, 147, 146, 145, 144, 143, 142, 141, 140, 139,
+ 138, 137, 136, 121, 135, 134, 133, 132, 131, 130,
+
+ 129, 128, 127, 126, 125, 124, 123, 122, 121, 120,
+ 119, 118, 117, 116, 115, 114, 113, 112, 111, 110,
+ 109, 108, 107, 106, 105, 104, 103, 102, 101, 98,
+ 97, 96, 95, 94, 93, 92, 91, 90, 89, 88,
+ 87, 86, 85, 84, 83, 82, 81, 80, 79, 78,
+ 77, 76, 75, 74, 73, 70, 69, 68, 30, 64,
+ 30, 28, 63, 57, 52, 51, 50, 39, 38, 30,
+ 32, 30, 28, 334, 3, 334, 334, 334, 334, 334,
+ 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
+ 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
+
+ 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
+ 334, 334, 334
+ } ;
+
+static yyconst flex_int16_t yy_chk[414] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 10, 10,
+ 11, 11, 11, 15, 14, 17, 16, 15, 22, 11,
+ 14, 22, 15, 17, 23, 15, 16, 25, 26, 35,
+ 35, 26, 25, 34, 34, 34, 41, 41, 65, 65,
+ 23, 261, 34, 25, 36, 36, 65, 36, 36, 66,
+ 66, 67, 67, 71, 152, 261, 159, 71, 161, 152,
+ 159, 338, 331, 161, 335, 330, 335, 336, 329, 336,
+
+ 337, 337, 337, 339, 339, 339, 326, 325, 324, 322,
+ 321, 320, 319, 317, 316, 315, 314, 313, 312, 311,
+ 310, 309, 306, 305, 304, 303, 301, 300, 299, 298,
+ 297, 296, 295, 294, 292, 291, 290, 289, 288, 287,
+ 286, 285, 284, 283, 282, 281, 280, 279, 278, 277,
+ 276, 275, 274, 273, 272, 270, 269, 267, 265, 264,
+ 263, 260, 259, 258, 257, 256, 254, 253, 252, 251,
+ 250, 249, 248, 247, 246, 245, 244, 243, 241, 240,
+ 239, 238, 237, 236, 235, 234, 233, 232, 231, 230,
+ 229, 228, 227, 226, 225, 224, 222, 221, 220, 219,
+
+ 218, 217, 215, 214, 213, 212, 211, 210, 209, 208,
+ 206, 204, 203, 202, 201, 200, 199, 198, 197, 196,
+ 195, 194, 193, 192, 191, 190, 189, 188, 187, 186,
+ 185, 184, 183, 182, 180, 179, 178, 176, 175, 174,
+ 173, 172, 171, 169, 168, 166, 165, 164, 163, 162,
+ 160, 158, 157, 156, 154, 153, 151, 150, 149, 148,
+ 147, 145, 144, 143, 142, 141, 140, 139, 138, 136,
+ 135, 134, 133, 132, 131, 130, 129, 127, 126, 125,
+ 124, 123, 122, 119, 118, 117, 116, 115, 114, 113,
+ 112, 111, 110, 108, 107, 106, 105, 104, 103, 102,
+
+ 101, 100, 99, 98, 97, 96, 95, 94, 93, 92,
+ 91, 90, 89, 88, 87, 86, 85, 84, 83, 81,
+ 80, 79, 78, 77, 76, 75, 74, 73, 72, 70,
+ 69, 68, 64, 63, 62, 61, 60, 59, 58, 57,
+ 56, 55, 54, 53, 52, 51, 50, 49, 48, 47,
+ 46, 45, 44, 43, 42, 40, 39, 38, 33, 32,
+ 29, 28, 27, 24, 21, 20, 18, 13, 12, 9,
+ 8, 7, 5, 3, 334, 334, 334, 334, 334, 334,
+ 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
+ 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
+
+ 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
+ 334, 334, 334
+ } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+extern int yy_flex_debug;
+int yy_flex_debug = 0;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "printrcl.l"
+/* -*-Mode: C-*-
+ * "$Id: printrcl.l,v 1.1 2004/09/17 18:38:14 rleigh Exp $"
+ *
+ * printrc parser
+ *
+ * Copyright 2003 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.
+ */
+#line 24 "printrcl.l"
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <gutenprintui/gutenprintui.h>
+#include "gutenprintui-internal.h"
+#include "printrc.h"
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define YY_NO_UNPUT
+
+int mylineno = 1;
+
+#define DBG(x) \
+do \
+ { \
+ if (getenv("STP_DEBUG_PRINTRC")) \
+ fprintf(stderr, "'%s' => %s\n", yytext, #x); \
+ } \
+ while (0)
+
+static char *
+q_strdup(const char *s)
+{
+ /* Strip the leading and trailing quote */
+ if (strlen(s) <= 2)
+ return NULL;
+ else
+ return g_strndup(s + 1, strlen(s) - 2);
+}
+
+#line 701 "printrcl.c"
+
+#define INITIAL 0
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap (void );
+#else
+extern int yywrap (void );
+#endif
+#endif
+
+ static void yyunput (int c,char *buf_ptr );
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(yyin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int yylex (void);
+
+#define YY_DECL int yylex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 73 "printrcl.l"
+
+
+#line 855 "printrcl.c"
+
+ if ( (yy_init) )
+ {
+ (yy_init) = 0;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! yyin )
+ yyin = stdin;
+
+ if ( ! yyout )
+ yyout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ yyensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer(yyin,YY_BUF_SIZE );
+ }
+
+ yy_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of yytext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 335 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 375 );
+
+yy_find_action:
+ yy_act = yy_accept[yy_current_state];
+ if ( yy_act == 0 )
+ { /* have to back up */
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ yy_act = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+ case 0: /* must back up */
+ /* undo the effects of YY_DO_BEFORE_ACTION */
+ *yy_cp = (yy_hold_char);
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 75 "printrcl.l"
+DBG(CURRENT_PRINTER); return CURRENT_PRINTER;
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 76 "printrcl.l"
+DBG(SHOW_ALL_PAPER_SIZES); return SHOW_ALL_PAPER_SIZES;
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 77 "printrcl.l"
+DBG(PRINTER); return PRINTER;
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 78 "printrcl.l"
+DBG(DESTINATION); return DESTINATION;
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 79 "printrcl.l"
+DBG(SCALING); return SCALING;
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 80 "printrcl.l"
+DBG(ORIENTATION); return ORIENTATION;
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 81 "printrcl.l"
+DBG(AUTOSIZE_ROLL_PAPER); return AUTOSIZE_ROLL_PAPER;
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 82 "printrcl.l"
+DBG(UNIT); return UNIT;
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 83 "printrcl.l"
+DBG(DRIVER); return DRIVER;
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 84 "printrcl.l"
+DBG(LEFT); return LEFT;
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 85 "printrcl.l"
+DBG(TOP); return TOP;
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 86 "printrcl.l"
+DBG(CUSTOM_PAGE_WIDTH); return CUSTOM_PAGE_WIDTH;
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 87 "printrcl.l"
+DBG(CUSTOM_PAGE_HEIGHT); return CUSTOM_PAGE_HEIGHT;
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 88 "printrcl.l"
+DBG(OUTPUT_TYPE); return OUTPUT_TYPE;
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 89 "printrcl.l"
+DBG(PARAMETER); return PARAMETER;
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 90 "printrcl.l"
+DBG(QUEUE_NAME); return QUEUE_NAME;
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 91 "printrcl.l"
+DBG(OUTPUT_FILENAME); return OUTPUT_FILENAME;
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 92 "printrcl.l"
+DBG(EXTRA_PRINTER_OPTIONS); return EXTRA_PRINTER_OPTIONS;
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 93 "printrcl.l"
+DBG(CUSTOM_COMMAND); return CUSTOM_COMMAND;
+ YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 94 "printrcl.l"
+DBG(COMMAND_TYPE); return COMMAND_TYPE;
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 95 "printrcl.l"
+DBG(GLOBAL_SETTINGS); return GLOBAL_SETTINGS;
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 96 "printrcl.l"
+DBG(END_GLOBAL_SETTINGS); return END_GLOBAL_SETTINGS;
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 97 "printrcl.l"
+DBG(GLOBAL); return GLOBAL;
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 99 "printrcl.l"
+DBG(pINT); return pINT;
+ YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 100 "printrcl.l"
+DBG(pSTRING_LIST); return pSTRING_LIST;
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 101 "printrcl.l"
+DBG(pFILE); return pFILE;
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 102 "printrcl.l"
+DBG(pDOUBLE); return pDOUBLE;
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 103 "printrcl.l"
+DBG(pDIMENSION); return pDIMENSION;
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 104 "printrcl.l"
+DBG(pBOOLEAN); return pBOOLEAN;
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 105 "printrcl.l"
+DBG(pCURVE); return pCURVE;
+ YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 107 "printrcl.l"
+yylval.ival = atoi(yytext); DBG(tINT); return tINT;
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 108 "printrcl.l"
+yylval.dval = strtod(yytext, NULL); DBG(tDOUBLE); return tDOUBLE;
+ YY_BREAK
+case 33:
+/* rule 33 can match eol */
+YY_RULE_SETUP
+#line 109 "printrcl.l"
+yylval.sval = q_strdup(yytext); DBG(tSTRING); return tSTRING;
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 110 "printrcl.l"
+yylval.sval = g_strdup(yytext); DBG(tBOOLEAN); return tBOOLEAN;
+ YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 111 "printrcl.l"
+yylval.sval = g_strdup(yytext); DBG(tWORD); return tWORD;
+ YY_BREAK
+case 36:
+/* rule 36 can match eol */
+YY_RULE_SETUP
+#line 112 "printrcl.l"
+DBG(PRINTRC_HDR); return PRINTRC_HDR;
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 113 "printrcl.l"
+DBG(whitespace1); /* Skip blanks/tabs */
+ YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 114 "printrcl.l"
+DBG(comment1); /* Skip comments */
+ YY_BREAK
+case 39:
+/* rule 39 can match eol */
+YY_RULE_SETUP
+#line 115 "printrcl.l"
+DBG(newline); mylineno++;
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 116 "printrcl.l"
+ECHO;
+ YY_BREAK
+#line 1141 "printrcl.c"
+case YY_STATE_EOF(INITIAL):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed yyin at a new source and called
+ * yylex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( yywrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * yytext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of yylex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+
+ int yy_c_buf_p_offset =
+ (int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ int new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = 0;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+ number_to_move - 1;
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ yyrestart(yyin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 335 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+ register char *yy_cp = (yy_c_buf_p);
+
+ register YY_CHAR yy_c = 1;
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 335 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 334);
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+ static void yyunput (int c, register char * yy_bp )
+{
+ register char *yy_cp;
+
+ yy_cp = (yy_c_buf_p);
+
+ /* undo effects of setting up yytext */
+ *yy_cp = (yy_hold_char);
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register int number_to_move = (yy_n_chars) + 2;
+ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+ register char *source =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+ (yytext_ptr) = yy_bp;
+ (yy_hold_char) = *yy_cp;
+ (yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ int offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ yyrestart(yyin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( yywrap( ) )
+ return EOF;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve yytext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void yyrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ yyensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer(yyin,YY_BUF_SIZE );
+ }
+
+ yy_init_buffer(YY_CURRENT_BUFFER,input_file );
+ yy_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * yypop_buffer_state();
+ * yypush_buffer_state(new_buffer);
+ */
+ yyensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ yy_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (yywrap()) processing, but the only time this flag
+ * is looked at is after yywrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void yy_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ yy_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with yy_create_buffer()
+ *
+ */
+ void yy_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ yyfree((void *) b->yy_ch_buf );
+
+ yyfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a yyrestart() or at EOF.
+ */
+ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ yy_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then yy_init_buffer was _probably_
+ * called from yyrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void yy_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ yy_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ yyensure_buffer_stack();
+
+ /* This block is copied from yy_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from yy_switch_to_buffer. */
+ yy_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void yypop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ yy_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ yy_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void yyensure_buffer_stack (void)
+{
+ int num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ yy_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to yylex() will
+ * scan from a @e copy of @a str.
+ * @param str a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * yy_scan_bytes() instead.
+ */
+YY_BUFFER_STATE yy_scan_string (yyconst char * yy_str )
+{
+
+ return yy_scan_bytes(yy_str,strlen(yy_str) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_bytes (yyconst char * bytes, int len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = len + 2;
+ buf = (char *) yyalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+ for ( i = 0; i < len; ++i )
+ buf[i] = bytes[i];
+
+ buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = yy_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ yytext[yyleng] = (yy_hold_char); \
+ (yy_c_buf_p) = yytext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ yyleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int yyget_lineno (void)
+{
+
+ return yylineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *yyget_in (void)
+{
+ return yyin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *yyget_out (void)
+{
+ return yyout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+int yyget_leng (void)
+{
+ return yyleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *yyget_text (void)
+{
+ return yytext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void yyset_lineno (int line_number )
+{
+
+ yylineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see yy_switch_to_buffer
+ */
+void yyset_in (FILE * in_str )
+{
+ yyin = in_str ;
+}
+
+void yyset_out (FILE * out_str )
+{
+ yyout = out_str ;
+}
+
+int yyget_debug (void)
+{
+ return yy_flex_debug;
+}
+
+void yyset_debug (int bdebug )
+{
+ yy_flex_debug = bdebug ;
+}
+
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ yy_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ yypop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ yyfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *yyalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *yyrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void yyfree (void * ptr )
+{
+ free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#undef YY_NEW_FILE
+#undef YY_FLUSH_BUFFER
+#undef yy_set_bol
+#undef yy_new_buffer
+#undef yy_set_interactive
+#undef yytext_ptr
+#undef YY_DO_BEFORE_ACTION
+
+#ifdef YY_DECL_IS_OURS
+#undef YY_DECL_IS_OURS
+#undef YY_DECL
+#endif
+#line 116 "printrcl.l"
diff --git a/src/gutenprintui/printrcl.l b/src/gutenprintui/printrcl.l
new file mode 100644
index 0000000..cf4933e
--- /dev/null
+++ b/src/gutenprintui/printrcl.l
@@ -0,0 +1,115 @@
+/* -*-Mode: C-*-
+ * "$Id: printrcl.l,v 1.1 2004/09/17 18:38:14 rleigh Exp $"
+ *
+ * printrc parser
+ *
+ * Copyright 2003 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 <config.h>
+#endif
+
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <gutenprintui/gutenprintui.h>
+#include "gutenprintui-internal.h"
+#include "printrc.h"
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define YY_NO_UNPUT
+
+int mylineno = 1;
+
+#define DBG(x) \
+do \
+ { \
+ if (getenv("STP_DEBUG_PRINTRC")) \
+ fprintf(stderr, "'%s' => %s\n", yytext, #x); \
+ } \
+ while (0)
+
+static char *
+q_strdup(const char *s)
+{
+ /* Strip the leading and trailing quote */
+ if (strlen(s) <= 2)
+ return NULL;
+ else
+ return g_strndup(s + 1, strlen(s) - 2);
+}
+
+%}
+
+%option noyywrap
+
+digit [0-9]
+boolean (True)|(False)
+integer [-+]?{digit}+
+float [-+]?{digit}+(\.{digit}+)?([eE][-+]?{digit}+)?
+string ([\"][^\"\n]*[\"])|([\'][^\']*[\'])
+ws [ \t]+
+printrc_hdr #PRINTRCv[234].*\n
+word [a-zA-Z][a-zA-Z0-9_]*
+
+%%
+
+Current-Printer: DBG(CURRENT_PRINTER); return CURRENT_PRINTER;
+Show-All-Paper-Sizes: DBG(SHOW_ALL_PAPER_SIZES); return SHOW_ALL_PAPER_SIZES;
+Printer: DBG(PRINTER); return PRINTER;
+Destination: DBG(DESTINATION); return DESTINATION;
+Scaling: DBG(SCALING); return SCALING;
+Orientation: DBG(ORIENTATION); return ORIENTATION;
+Autosize-Roll-Paper: DBG(AUTOSIZE_ROLL_PAPER); return AUTOSIZE_ROLL_PAPER;
+Unit: DBG(UNIT); return UNIT;
+Driver: DBG(DRIVER); return DRIVER;
+Left: DBG(LEFT); return LEFT;
+Top: DBG(TOP); return TOP;
+Custom_Page_Width: DBG(CUSTOM_PAGE_WIDTH); return CUSTOM_PAGE_WIDTH;
+Custom_Page_Height: DBG(CUSTOM_PAGE_HEIGHT); return CUSTOM_PAGE_HEIGHT;
+Output_Type: DBG(OUTPUT_TYPE); return OUTPUT_TYPE;
+Parameter DBG(PARAMETER); return PARAMETER;
+Queue-Name: DBG(QUEUE_NAME); return QUEUE_NAME;
+Output-Filename: DBG(OUTPUT_FILENAME); return OUTPUT_FILENAME;
+Extra-Printer-Options: DBG(EXTRA_PRINTER_OPTIONS); return EXTRA_PRINTER_OPTIONS;
+Custom-Command: DBG(CUSTOM_COMMAND); return CUSTOM_COMMAND;
+Command-Type: DBG(COMMAND_TYPE); return COMMAND_TYPE;
+Global-Settings: DBG(GLOBAL_SETTINGS); return GLOBAL_SETTINGS;
+End-Global-Settings: DBG(END_GLOBAL_SETTINGS); return END_GLOBAL_SETTINGS;
+Global: DBG(GLOBAL); return GLOBAL;
+
+Int DBG(pINT); return pINT;
+String DBG(pSTRING_LIST); return pSTRING_LIST;
+File DBG(pFILE); return pFILE;
+Double DBG(pDOUBLE); return pDOUBLE;
+Dimension DBG(pDIMENSION); return pDIMENSION;
+Boolean DBG(pBOOLEAN); return pBOOLEAN;
+Curve DBG(pCURVE); return pCURVE;
+
+{integer} yylval.ival = atoi(yytext); DBG(tINT); return tINT;
+{float} yylval.dval = strtod(yytext, NULL); DBG(tDOUBLE); return tDOUBLE;
+{string} yylval.sval = q_strdup(yytext); DBG(tSTRING); return tSTRING;
+{boolean} yylval.sval = g_strdup(yytext); DBG(tBOOLEAN); return tBOOLEAN;
+{word} yylval.sval = g_strdup(yytext); DBG(tWORD); return tWORD;
+{printrc_hdr} DBG(PRINTRC_HDR); return PRINTRC_HDR;
+{ws} DBG(whitespace1); /* Skip blanks/tabs */
+#[^\n]* DBG(comment1); /* Skip comments */
+\n DBG(newline); mylineno++;
diff --git a/src/gutenprintui/printrcy.c b/src/gutenprintui/printrcy.c
new file mode 100644
index 0000000..95f3d4c
--- /dev/null
+++ b/src/gutenprintui/printrcy.c
@@ -0,0 +1,1694 @@
+/* A Bison parser, made by GNU Bison 1.875d. */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+ 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. */
+
+/* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+/* Written by Richard Stallman by simplifying the original so called
+ ``semantic'' parser. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output. */
+#define YYBISON 1
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 0
+
+/* Using locations. */
+#define YYLSP_NEEDED 0
+
+
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ tINT = 258,
+ tDOUBLE = 259,
+ tDIMENSION = 260,
+ tBOOLEAN = 261,
+ tSTRING = 262,
+ tWORD = 263,
+ tGSWORD = 264,
+ CURRENT_PRINTER = 265,
+ SHOW_ALL_PAPER_SIZES = 266,
+ PRINTER = 267,
+ DESTINATION = 268,
+ SCALING = 269,
+ ORIENTATION = 270,
+ AUTOSIZE_ROLL_PAPER = 271,
+ UNIT = 272,
+ DRIVER = 273,
+ LEFT = 274,
+ TOP = 275,
+ CUSTOM_PAGE_WIDTH = 276,
+ CUSTOM_PAGE_HEIGHT = 277,
+ OUTPUT_TYPE = 278,
+ PRINTRC_HDR = 279,
+ PARAMETER = 280,
+ QUEUE_NAME = 281,
+ OUTPUT_FILENAME = 282,
+ EXTRA_PRINTER_OPTIONS = 283,
+ CUSTOM_COMMAND = 284,
+ COMMAND_TYPE = 285,
+ GLOBAL_SETTINGS = 286,
+ GLOBAL = 287,
+ END_GLOBAL_SETTINGS = 288,
+ pINT = 289,
+ pSTRING_LIST = 290,
+ pFILE = 291,
+ pDOUBLE = 292,
+ pDIMENSION = 293,
+ pBOOLEAN = 294,
+ pCURVE = 295
+ };
+#endif
+#define tINT 258
+#define tDOUBLE 259
+#define tDIMENSION 260
+#define tBOOLEAN 261
+#define tSTRING 262
+#define tWORD 263
+#define tGSWORD 264
+#define CURRENT_PRINTER 265
+#define SHOW_ALL_PAPER_SIZES 266
+#define PRINTER 267
+#define DESTINATION 268
+#define SCALING 269
+#define ORIENTATION 270
+#define AUTOSIZE_ROLL_PAPER 271
+#define UNIT 272
+#define DRIVER 273
+#define LEFT 274
+#define TOP 275
+#define CUSTOM_PAGE_WIDTH 276
+#define CUSTOM_PAGE_HEIGHT 277
+#define OUTPUT_TYPE 278
+#define PRINTRC_HDR 279
+#define PARAMETER 280
+#define QUEUE_NAME 281
+#define OUTPUT_FILENAME 282
+#define EXTRA_PRINTER_OPTIONS 283
+#define CUSTOM_COMMAND 284
+#define COMMAND_TYPE 285
+#define GLOBAL_SETTINGS 286
+#define GLOBAL 287
+#define END_GLOBAL_SETTINGS 288
+#define pINT 289
+#define pSTRING_LIST 290
+#define pFILE 291
+#define pDOUBLE 292
+#define pDIMENSION 293
+#define pBOOLEAN 294
+#define pCURVE 295
+
+
+
+
+/* Copy the first part of user declarations. */
+#line 23 "printrcy.y"
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <gutenprintui/gutenprintui.h>
+#include "gutenprintui-internal.h"
+#include "printrc.h"
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+extern int mylineno;
+
+extern int yylex(void);
+char *quotestrip(const char *i);
+char *endstrip(const char *i);
+
+extern char* yytext;
+
+static int yyerror( const char *s )
+{
+ fprintf(stderr,"stdin:%d: %s before '%s'\n", mylineno, s, yytext);
+ return 0;
+}
+
+static stpui_plist_t *current_printer = NULL;
+
+
+
+/* Enabling traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages. */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+typedef int YYSTYPE;
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+
+
+/* Copy the second part of user declarations. */
+
+
+/* Line 214 of yacc.c. */
+#line 200 "printrcy.c"
+
+#if ! defined (yyoverflow) || YYERROR_VERBOSE
+
+# ifndef YYFREE
+# define YYFREE free
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# endif
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# define YYSTACK_ALLOC alloca
+# endif
+# else
+# if defined (alloca) || defined (_ALLOCA_H)
+# define YYSTACK_ALLOC alloca
+# else
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's `empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+# if defined (__STDC__) || defined (__cplusplus)
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# endif
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# endif
+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+
+
+#if (! defined (yyoverflow) \
+ && (! defined (__cplusplus) \
+ || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ short int yyss;
+ YYSTYPE yyvs;
+ };
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined (__GNUC__) && 1 < __GNUC__
+# define YYCOPY(To, From, Count) \
+ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+# else
+# define YYCOPY(To, From, Count) \
+ do \
+ { \
+ register YYSIZE_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (To)[yyi] = (From)[yyi]; \
+ } \
+ while (0)
+# endif
+# endif
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack) \
+ do \
+ { \
+ YYSIZE_T yynewbytes; \
+ YYCOPY (&yyptr->Stack, Stack, yysize); \
+ Stack = &yyptr->Stack; \
+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / sizeof (*yyptr); \
+ } \
+ while (0)
+
+#endif
+
+#if defined (__STDC__) || defined (__cplusplus)
+ typedef signed char yysigned_char;
+#else
+ typedef short int yysigned_char;
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 10
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 75
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 41
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 42
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 70
+/* YYNRULES -- Number of states. */
+#define YYNSTATES 114
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
+#define YYUNDEFTOK 2
+#define YYMAXUTOK 295
+
+#define YYTRANSLATE(YYX) \
+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
+static const unsigned char yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+ 35, 36, 37, 38, 39, 40
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+ YYRHS. */
+static const unsigned char yyprhs[] =
+{
+ 0, 0, 3, 7, 10, 13, 16, 19, 22, 25,
+ 28, 31, 34, 37, 40, 43, 46, 49, 52, 53,
+ 58, 63, 68, 73, 78, 83, 88, 90, 92, 94,
+ 96, 98, 100, 102, 105, 108, 110, 112, 114, 116,
+ 118, 120, 122, 124, 126, 128, 130, 132, 134, 136,
+ 138, 140, 143, 145, 149, 152, 154, 157, 160, 162,
+ 164, 167, 170, 172, 174, 177, 179, 183, 185, 187,
+ 189
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yysigned_char yyrhs[] =
+{
+ 82, 0, -1, 12, 7, 7, -1, 13, 7, -1,
+ 26, 7, -1, 27, 7, -1, 28, 7, -1, 29,
+ 7, -1, 30, 3, -1, 14, 4, -1, 15, 3,
+ -1, 16, 3, -1, 17, 3, -1, 19, 3, -1,
+ 20, 3, -1, 23, 3, -1, 21, 3, -1, 22,
+ 3, -1, -1, 8, 34, 6, 3, -1, 8, 35,
+ 6, 7, -1, 8, 36, 6, 7, -1, 8, 37,
+ 6, 4, -1, 8, 38, 6, 3, -1, 8, 39,
+ 6, 6, -1, 8, 40, 6, 7, -1, 59, -1,
+ 60, -1, 61, -1, 62, -1, 64, -1, 65, -1,
+ 63, -1, 25, 66, -1, 68, 67, -1, 58, -1,
+ 43, -1, 49, -1, 50, -1, 51, -1, 52, -1,
+ 53, -1, 54, -1, 56, -1, 57, -1, 55, -1,
+ 44, -1, 45, -1, 46, -1, 47, -1, 48, -1,
+ 70, 69, -1, 58, -1, 42, 70, 68, -1, 72,
+ 71, -1, 58, -1, 10, 7, -1, 11, 6, -1,
+ 73, -1, 74, -1, 73, 74, -1, 8, 7, -1,
+ 75, -1, 77, -1, 79, 78, -1, 58, -1, 31,
+ 79, 33, -1, 80, -1, 76, -1, 58, -1, 24,
+ 81, 72, -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const unsigned short int yyrline[] =
+{
+ 0, 100, 100, 111, 118, 128, 138, 148, 158, 164,
+ 168, 172, 176, 180, 184, 188, 206, 210, 214, 217,
+ 231, 246, 261, 275, 289, 307, 327, 327, 327, 327,
+ 328, 328, 328, 331, 334, 334, 337, 337, 337, 337,
+ 338, 338, 338, 338, 338, 339, 339, 339, 339, 340,
+ 340, 343, 343, 346, 349, 349, 352, 356, 366, 366,
+ 369, 372, 383, 383, 386, 386, 389, 392, 392, 392,
+ 395
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE
+/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "$end", "error", "$undefined", "tINT", "tDOUBLE", "tDIMENSION",
+ "tBOOLEAN", "tSTRING", "tWORD", "tGSWORD", "CURRENT_PRINTER",
+ "SHOW_ALL_PAPER_SIZES", "PRINTER", "DESTINATION", "SCALING",
+ "ORIENTATION", "AUTOSIZE_ROLL_PAPER", "UNIT", "DRIVER", "LEFT", "TOP",
+ "CUSTOM_PAGE_WIDTH", "CUSTOM_PAGE_HEIGHT", "OUTPUT_TYPE", "PRINTRC_HDR",
+ "PARAMETER", "QUEUE_NAME", "OUTPUT_FILENAME", "EXTRA_PRINTER_OPTIONS",
+ "CUSTOM_COMMAND", "COMMAND_TYPE", "GLOBAL_SETTINGS", "GLOBAL",
+ "END_GLOBAL_SETTINGS", "pINT", "pSTRING_LIST", "pFILE", "pDOUBLE",
+ "pDIMENSION", "pBOOLEAN", "pCURVE", "$accept", "Printer", "Destination",
+ "Queue_Name", "Output_Filename", "Extra_Printer_Options",
+ "Custom_Command", "Command_Type", "Scaling", "Orientation",
+ "Autosize_Roll_Paper", "Unit", "Left", "Top", "Output_Type",
+ "Custom_Page_Width", "Custom_Page_Height", "Empty", "Int_Param",
+ "String_List_Param", "File_Param", "Double_Param", "Dimension_Param",
+ "Boolean_Param", "Curve_Param", "Typed_Param", "Parameter", "Parameters",
+ "Standard_Value", "Standard_Values", "A_Printer", "Printers",
+ "Current_Printer", "Show_All_Paper_Sizes", "Global", "Old_Globals",
+ "New_Global_Setting", "Global_Setting", "Global_Settings",
+ "Global_Subblock", "Global_Block", "Thing", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+ token YYLEX-NUM. */
+static const unsigned short int yytoknum[] =
+{
+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
+ 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
+ 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
+ 295
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const unsigned char yyr1[] =
+{
+ 0, 41, 42, 43, 44, 45, 46, 47, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 66, 66, 66,
+ 66, 66, 66, 67, 68, 68, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 70, 70, 71, 72, 72, 73, 74, 75, 75,
+ 76, 77, 78, 78, 79, 79, 80, 81, 81, 81,
+ 82
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const unsigned char yyr2[] =
+{
+ 0, 2, 3, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 0, 4,
+ 4, 4, 4, 4, 4, 4, 1, 1, 1, 1,
+ 1, 1, 1, 2, 2, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 1, 3, 2, 1, 2, 2, 1, 1,
+ 2, 2, 1, 1, 2, 1, 3, 1, 1, 1,
+ 3
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+ STATE-NUM when YYTABLE doesn't specify something else to do. Zero
+ means the default is an error. */
+static const unsigned char yydefact[] =
+{
+ 0, 18, 0, 0, 18, 69, 0, 68, 67, 18,
+ 1, 56, 65, 0, 0, 60, 55, 70, 0, 66,
+ 58, 59, 62, 63, 64, 57, 0, 18, 54, 61,
+ 0, 52, 18, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 36,
+ 46, 47, 48, 49, 50, 37, 38, 39, 40, 41,
+ 42, 45, 43, 44, 35, 53, 51, 3, 9, 10,
+ 11, 12, 13, 14, 16, 17, 15, 4, 5, 6,
+ 7, 8, 0, 34, 0, 26, 27, 28, 29, 32,
+ 30, 31, 33, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 19, 20, 21,
+ 22, 23, 24, 25
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yysigned_char yydefgoto[] =
+{
+ -1, 27, 49, 50, 51, 52, 53, 54, 55, 56,
+ 57, 58, 59, 60, 61, 62, 63, 5, 85, 86,
+ 87, 88, 89, 90, 91, 92, 83, 65, 66, 32,
+ 28, 17, 6, 15, 22, 7, 23, 24, 13, 8,
+ 9, 2
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+#define YYPACT_NINF -26
+static const yysigned_char yypact[] =
+{
+ -22, -2, 6, 0, -26, -26, 5, -26, -26, -26,
+ -26, -26, -26, -7, 11, -26, -26, 7, 13, -26,
+ -26, -26, -26, -26, -26, -26, 14, -26, -26, -26,
+ 15, -26, 17, -26, 18, 20, 24, 32, 38, 39,
+ 45, 46, 47, 48, 49, 50, 51, 52, 57, -26,
+ -26, -26, -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, -26, -26, -26, 27, -26, -26, -26, -26,
+ -26, -26, -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, 10, -26, -25, -26, -26, -26, -26, -26,
+ -26, -26, -26, 55, 56, 58, 59, 60, 61, 62,
+ 66, 63, 64, 68, 70, 69, 67, -26, -26, -26,
+ -26, -26, -26, -26
+};
+
+/* YYPGOTO[NTERM-NUM]. */
+static const yysigned_char yypgoto[] =
+{
+ -26, -26, -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, -26, -26, -26, -26, -26, -4, -26, -26,
+ -26, -26, -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, 40, 41, -26, -26, -26, -26, -26, -26,
+ -26, -26
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule which
+ number is the opposite. If zero, do what YYDEFACT says.
+ If YYTABLE_NINF, syntax error. */
+#define YYTABLE_NINF -1
+static const unsigned char yytable[] =
+{
+ 12, 18, 1, 3, 14, 16, 10, 11, 3, 93,
+ 94, 95, 96, 97, 98, 99, 14, 25, 84, 26,
+ 29, 30, 33, 31, 68, 67, 19, 69, 64, 4,
+ 34, 35, 36, 37, 38, 70, 39, 40, 41, 42,
+ 43, 71, 72, 44, 45, 46, 47, 48, 73, 74,
+ 75, 76, 82, 20, 21, 0, 77, 78, 79, 80,
+ 81, 100, 101, 0, 102, 103, 104, 105, 106, 107,
+ 108, 109, 110, 111, 113, 112
+};
+
+static const yysigned_char yycheck[] =
+{
+ 4, 8, 24, 10, 11, 9, 0, 7, 10, 34,
+ 35, 36, 37, 38, 39, 40, 11, 6, 8, 12,
+ 7, 7, 7, 27, 4, 7, 33, 3, 32, 31,
+ 13, 14, 15, 16, 17, 3, 19, 20, 21, 22,
+ 23, 3, 3, 26, 27, 28, 29, 30, 3, 3,
+ 3, 3, 25, 13, 13, -1, 7, 7, 7, 7,
+ 3, 6, 6, -1, 6, 6, 6, 6, 6, 3,
+ 7, 7, 4, 3, 7, 6
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
+static const unsigned char yystos[] =
+{
+ 0, 24, 82, 10, 31, 58, 73, 76, 80, 81,
+ 0, 7, 58, 79, 11, 74, 58, 72, 8, 33,
+ 73, 74, 75, 77, 78, 6, 12, 42, 71, 7,
+ 7, 58, 70, 7, 13, 14, 15, 16, 17, 19,
+ 20, 21, 22, 23, 26, 27, 28, 29, 30, 43,
+ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, 57, 58, 68, 69, 7, 4, 3,
+ 3, 3, 3, 3, 3, 3, 3, 7, 7, 7,
+ 7, 3, 25, 67, 8, 59, 60, 61, 62, 63,
+ 64, 65, 66, 34, 35, 36, 37, 38, 39, 40,
+ 6, 6, 6, 6, 6, 6, 6, 3, 7, 7,
+ 4, 3, 6, 7
+};
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# if defined (__STDC__) || defined (__cplusplus)
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY (-2)
+#define YYEOF 0
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror. This remains here temporarily
+ to ease the transition to the new meaning of YYERROR, for GCC.
+ Once GCC version 2 has supplanted version 1, this can go. */
+
+#define YYFAIL goto yyerrlab
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+do \
+ if (yychar == YYEMPTY && yylen == 1) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ yytoken = YYTRANSLATE (yychar); \
+ YYPOPSTACK; \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror ("syntax error: cannot back up");\
+ YYERROR; \
+ } \
+while (0)
+
+#define YYTERROR 1
+#define YYERRCODE 256
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+ are run). */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N) \
+ ((Current).first_line = (Rhs)[1].first_line, \
+ (Current).first_column = (Rhs)[1].first_column, \
+ (Current).last_line = (Rhs)[N].last_line, \
+ (Current).last_column = (Rhs)[N].last_column)
+#endif
+
+/* YYLEX -- calling `yylex' with the right arguments. */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+
+# define YYDSYMPRINT(Args) \
+do { \
+ if (yydebug) \
+ yysymprint Args; \
+} while (0)
+
+# define YYDSYMPRINTF(Title, Token, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yysymprint (stderr, \
+ Token, Value); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (0)
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_stack_print (short int *bottom, short int *top)
+#else
+static void
+yy_stack_print (bottom, top)
+ short int *bottom;
+ short int *top;
+#endif
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (/* Nothing. */; bottom <= top; ++bottom)
+ YYFPRINTF (stderr, " %d", *bottom);
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_reduce_print (int yyrule)
+#else
+static void
+yy_reduce_print (yyrule)
+ int yyrule;
+#endif
+{
+ int yyi;
+ unsigned int yylno = yyrline[yyrule];
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
+ yyrule - 1, yylno);
+ /* Print the symbols being reduced, and their result. */
+ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+ YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
+ YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (Rule); \
+} while (0)
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YYDSYMPRINT(Args)
+# define YYDSYMPRINTF(Title, Token, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#if defined (YYMAXDEPTH) && YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+# if defined (__GLIBC__) && defined (_STRING_H)
+# define yystrlen strlen
+# else
+/* Return the length of YYSTR. */
+static YYSIZE_T
+# if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+# else
+yystrlen (yystr)
+ const char *yystr;
+# endif
+{
+ register const char *yys = yystr;
+
+ while (*yys++ != '\0')
+ continue;
+
+ return yys - yystr - 1;
+}
+# endif
+# endif
+
+# ifndef yystpcpy
+# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+# define yystpcpy stpcpy
+# else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+ YYDEST. */
+static char *
+# if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+# else
+yystpcpy (yydest, yysrc)
+ char *yydest;
+ const char *yysrc;
+# endif
+{
+ register char *yyd = yydest;
+ register const char *yys = yysrc;
+
+ while ((*yyd++ = *yys++) != '\0')
+ continue;
+
+ return yyd - 1;
+}
+# endif
+# endif
+
+#endif /* !YYERROR_VERBOSE */
+
+
+
+#if YYDEBUG
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yysymprint (yyoutput, yytype, yyvaluep)
+ FILE *yyoutput;
+ int yytype;
+ YYSTYPE *yyvaluep;
+#endif
+{
+ /* Pacify ``unused variable'' warnings. */
+ (void) yyvaluep;
+
+ if (yytype < YYNTOKENS)
+ {
+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+# ifdef YYPRINT
+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# endif
+ }
+ else
+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+ switch (yytype)
+ {
+ default:
+ break;
+ }
+ YYFPRINTF (yyoutput, ")");
+}
+
+#endif /* ! YYDEBUG */
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yydestruct (int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yytype, yyvaluep)
+ int yytype;
+ YYSTYPE *yyvaluep;
+#endif
+{
+ /* Pacify ``unused variable'' warnings. */
+ (void) yyvaluep;
+
+ switch (yytype)
+ {
+
+ default:
+ break;
+ }
+}
+
+
+/* Prevent warnings from -Wmissing-prototypes. */
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM);
+# else
+int yyparse ();
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+
+/* The lookahead symbol. */
+int yychar;
+
+/* The semantic value of the lookahead symbol. */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far. */
+int yynerrs;
+
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM)
+# else
+int yyparse (YYPARSE_PARAM)
+ void *YYPARSE_PARAM;
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
+{
+
+ register int yystate;
+ register int yyn;
+ int yyresult;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
+ /* Lookahead token as an internal (translated) token number. */
+ int yytoken = 0;
+
+ /* Three stacks and their tools:
+ `yyss': related to states,
+ `yyvs': related to semantic values,
+ `yyls': related to locations.
+
+ Refer to the stacks thru separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* The state stack. */
+ short int yyssa[YYINITDEPTH];
+ short int *yyss = yyssa;
+ register short int *yyssp;
+
+ /* The semantic value stack. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ register YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK (yyvsp--, yyssp--)
+
+ YYSIZE_T yystacksize = YYINITDEPTH;
+
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+
+ /* When reducing, the number of symbols on the RHS of the reduced
+ rule. */
+ int yylen;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+
+ yyssp = yyss;
+ yyvsp = yyvs;
+
+
+ goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+ yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. so pushing a state here evens the stacks.
+ */
+ yyssp++;
+
+ yysetstate:
+ *yyssp = yystate;
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ short int *yyss1 = yyss;
+
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow ("parser stack overflow",
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+
+ &yystacksize);
+
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+ goto yyoverflowlab;
+# else
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ goto yyoverflowlab;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ short int *yyss1 = yyss;
+ union yyalloc *yyptr =
+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+ if (! yyptr)
+ goto yyoverflowlab;
+ YYSTACK_RELOCATE (yyss);
+ YYSTACK_RELOCATE (yyvs);
+
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+#endif /* no yyoverflow */
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+
+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+ (unsigned long int) yystacksize));
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+ goto yybackup;
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state. */
+/* Read a lookahead token if we need one and don't already have one. */
+/* yyresume: */
+
+ /* First try to decide what to do without reference to lookahead token. */
+
+ yyn = yypact[yystate];
+ if (yyn == YYPACT_NINF)
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+ yychar = YYLEX;
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = yytoken = YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yyn == 0 || yyn == YYTABLE_NINF)
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ /* Shift the lookahead token. */
+ YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
+
+ /* Discard the token being shifted unless it is eof. */
+ if (yychar != YYEOF)
+ yychar = YYEMPTY;
+
+ *++yyvsp = yylval;
+
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ `$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 2:
+#line 101 "printrcy.y"
+ {
+ current_printer = stpui_plist_create(yyvsp[-1].sval, yyvsp[0].sval);
+ g_free(yyvsp[-1].sval);
+ g_free(yyvsp[0].sval);
+ }
+ break;
+
+ case 3:
+#line 112 "printrcy.y"
+ {
+ if (yyvsp[0].sval)
+ g_free(yyvsp[0].sval);
+ }
+ break;
+
+ case 4:
+#line 119 "printrcy.y"
+ {
+ if (yyvsp[0].sval)
+ {
+ stpui_plist_set_queue_name(current_printer, yyvsp[0].sval);
+ g_free(yyvsp[0].sval);
+ }
+ }
+ break;
+
+ case 5:
+#line 129 "printrcy.y"
+ {
+ if (yyvsp[0].sval)
+ {
+ stpui_plist_set_output_filename(current_printer, yyvsp[0].sval);
+ g_free(yyvsp[0].sval);
+ }
+ }
+ break;
+
+ case 6:
+#line 139 "printrcy.y"
+ {
+ if (yyvsp[0].sval)
+ {
+ stpui_plist_set_extra_printer_options(current_printer, yyvsp[0].sval);
+ g_free(yyvsp[0].sval);
+ }
+ }
+ break;
+
+ case 7:
+#line 149 "printrcy.y"
+ {
+ if (yyvsp[0].sval)
+ {
+ stpui_plist_set_custom_command(current_printer, yyvsp[0].sval);
+ g_free(yyvsp[0].sval);
+ }
+ }
+ break;
+
+ case 8:
+#line 159 "printrcy.y"
+ {
+ stpui_plist_set_command_type(current_printer, yyvsp[0].ival);
+ }
+ break;
+
+ case 9:
+#line 165 "printrcy.y"
+ { current_printer->scaling = yyvsp[0].dval; }
+ break;
+
+ case 10:
+#line 169 "printrcy.y"
+ { current_printer->orientation = yyvsp[0].ival; }
+ break;
+
+ case 11:
+#line 173 "printrcy.y"
+ { current_printer->auto_size_roll_feed_paper = yyvsp[0].ival; }
+ break;
+
+ case 12:
+#line 177 "printrcy.y"
+ { current_printer->unit = yyvsp[0].ival; }
+ break;
+
+ case 13:
+#line 181 "printrcy.y"
+ { stp_set_left(current_printer->v, yyvsp[0].ival); }
+ break;
+
+ case 14:
+#line 185 "printrcy.y"
+ { stp_set_top(current_printer->v, yyvsp[0].ival); }
+ break;
+
+ case 15:
+#line 189 "printrcy.y"
+ {
+ switch (yyvsp[0].ival)
+ {
+ case 0:
+ stp_set_string_parameter
+ (current_printer->v, "PrintingMode", "BW");
+ break;
+ case 1:
+ case 2:
+ default:
+ stp_set_string_parameter
+ (current_printer->v, "PrintingMode", "Color");
+ break;
+ }
+ }
+ break;
+
+ case 16:
+#line 207 "printrcy.y"
+ { stp_set_page_width(current_printer->v, yyvsp[0].ival); }
+ break;
+
+ case 17:
+#line 211 "printrcy.y"
+ { stp_set_page_height(current_printer->v, yyvsp[0].ival); }
+ break;
+
+ case 19:
+#line 218 "printrcy.y"
+ {
+ stp_set_int_parameter(current_printer->v, yyvsp[-3].sval, yyvsp[0].ival);
+ if (strcmp(yyvsp[-1].sval, "False") == 0)
+ stp_set_int_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_int_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_ACTIVE);
+ g_free(yyvsp[-3].sval);
+ g_free(yyvsp[-1].sval);
+ }
+ break;
+
+ case 20:
+#line 232 "printrcy.y"
+ {
+ stp_set_string_parameter(current_printer->v, yyvsp[-3].sval, yyvsp[0].sval);
+ if (strcmp(yyvsp[-1].sval, "False") == 0)
+ stp_set_string_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_string_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_ACTIVE);
+ g_free(yyvsp[-3].sval);
+ g_free(yyvsp[-1].sval);
+ g_free(yyvsp[0].sval);
+ }
+ break;
+
+ case 21:
+#line 247 "printrcy.y"
+ {
+ stp_set_file_parameter(current_printer->v, yyvsp[-3].sval, yyvsp[0].sval);
+ if (strcmp(yyvsp[-1].sval, "False") == 0)
+ stp_set_file_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_file_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_ACTIVE);
+ g_free(yyvsp[-3].sval);
+ g_free(yyvsp[-1].sval);
+ g_free(yyvsp[0].sval);
+ }
+ break;
+
+ case 22:
+#line 262 "printrcy.y"
+ {
+ stp_set_float_parameter(current_printer->v, yyvsp[-3].sval, yyvsp[0].dval);
+ if (strcmp(yyvsp[-1].sval, "False") == 0)
+ stp_set_float_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_float_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_ACTIVE);
+ g_free(yyvsp[-3].sval);
+ g_free(yyvsp[-1].sval);
+ }
+ break;
+
+ case 23:
+#line 276 "printrcy.y"
+ {
+ stp_set_dimension_parameter(current_printer->v, yyvsp[-3].sval, yyvsp[0].ival);
+ if (strcmp(yyvsp[-1].sval, "False") == 0)
+ stp_set_dimension_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_dimension_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_ACTIVE);
+ g_free(yyvsp[-3].sval);
+ g_free(yyvsp[-1].sval);
+ }
+ break;
+
+ case 24:
+#line 290 "printrcy.y"
+ {
+ if (strcmp(yyvsp[0].sval, "False") == 0)
+ stp_set_boolean_parameter(current_printer->v, yyvsp[-3].sval, 0);
+ else
+ stp_set_boolean_parameter(current_printer->v, yyvsp[-3].sval, 1);
+ if (strcmp(yyvsp[-1].sval, "False") == 0)
+ stp_set_boolean_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_boolean_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_ACTIVE);
+ g_free(yyvsp[-3].sval);
+ g_free(yyvsp[-1].sval);
+ g_free(yyvsp[0].sval);
+ }
+ break;
+
+ case 25:
+#line 308 "printrcy.y"
+ {
+ stp_curve_t *curve = stp_curve_create_from_string(yyvsp[0].sval);
+ if (curve)
+ {
+ stp_set_curve_parameter(current_printer->v, yyvsp[-3].sval, curve);
+ if (strcmp(yyvsp[-1].sval, "False") == 0)
+ stp_set_curve_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_curve_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_ACTIVE);
+ stp_curve_destroy(curve);
+ }
+ g_free(yyvsp[-3].sval);
+ g_free(yyvsp[-1].sval);
+ g_free(yyvsp[0].sval);
+ }
+ break;
+
+ case 56:
+#line 353 "printrcy.y"
+ { stpui_printrc_current_printer = yyvsp[0].sval; }
+ break;
+
+ case 57:
+#line 357 "printrcy.y"
+ {
+ if (strcmp(yyvsp[0].sval, "True") == 0)
+ stpui_show_all_paper_sizes = 1;
+ else
+ stpui_show_all_paper_sizes = 0;
+ g_free(yyvsp[0].sval);
+ }
+ break;
+
+ case 61:
+#line 373 "printrcy.y"
+ {
+ if (yyvsp[0].sval)
+ {
+ stpui_set_global_parameter(yyvsp[-1].sval, yyvsp[0].sval);
+ g_free(yyvsp[0].sval);
+ }
+ g_free(yyvsp[-1].sval);
+ }
+ break;
+
+
+ }
+
+/* Line 1010 of yacc.c. */
+#line 1468 "printrcy.c"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+
+
+ YY_STACK_PRINT (yyss, yyssp);
+
+ *++yyvsp = yyval;
+
+
+ /* Now `shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTOKENS];
+
+ goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+#if YYERROR_VERBOSE
+ yyn = yypact[yystate];
+
+ if (YYPACT_NINF < yyn && yyn < YYLAST)
+ {
+ YYSIZE_T yysize = 0;
+ int yytype = YYTRANSLATE (yychar);
+ const char* yyprefix;
+ char *yymsg;
+ int yyx;
+
+ /* Start YYX at -YYN if negative to avoid negative indexes in
+ YYCHECK. */
+ int yyxbegin = yyn < 0 ? -yyn : 0;
+
+ /* Stay within bounds of both yycheck and yytname. */
+ int yychecklim = YYLAST - yyn;
+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+ int yycount = 0;
+
+ yyprefix = ", expecting ";
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+ {
+ yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]);
+ yycount += 1;
+ if (yycount == 5)
+ {
+ yysize = 0;
+ break;
+ }
+ }
+ yysize += (sizeof ("syntax error, unexpected ")
+ + yystrlen (yytname[yytype]));
+ yymsg = (char *) YYSTACK_ALLOC (yysize);
+ if (yymsg != 0)
+ {
+ char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
+ yyp = yystpcpy (yyp, yytname[yytype]);
+
+ if (yycount < 5)
+ {
+ yyprefix = ", expecting ";
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+ {
+ yyp = yystpcpy (yyp, yyprefix);
+ yyp = yystpcpy (yyp, yytname[yyx]);
+ yyprefix = " or ";
+ }
+ }
+ yyerror (yymsg);
+ YYSTACK_FREE (yymsg);
+ }
+ else
+ yyerror ("syntax error; also virtual memory exhausted");
+ }
+ else
+#endif /* YYERROR_VERBOSE */
+ yyerror ("syntax error");
+ }
+
+
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* If at end of input, pop the error token,
+ then the rest of the stack, then return failure. */
+ if (yychar == YYEOF)
+ for (;;)
+ {
+ YYPOPSTACK;
+ if (yyssp == yyss)
+ YYABORT;
+ YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+ yydestruct (yystos[*yyssp], yyvsp);
+ }
+ }
+ else
+ {
+ YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
+ yydestruct (yytoken, &yylval);
+ yychar = YYEMPTY;
+
+ }
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+
+#ifdef __GNUC__
+ /* Pacify GCC when the user code never invokes YYERROR and the label
+ yyerrorlab therefore never appears in user code. */
+ if (0)
+ goto yyerrorlab;
+#endif
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (yyn != YYPACT_NINF)
+ {
+ yyn += YYTERROR;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+ YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+ yydestruct (yystos[yystate], yyvsp);
+ YYPOPSTACK;
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ YYDPRINTF ((stderr, "Shifting error token, "));
+
+ *++yyvsp = yylval;
+
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+#ifndef yyoverflow
+/*----------------------------------------------.
+| yyoverflowlab -- parser overflow comes here. |
+`----------------------------------------------*/
+yyoverflowlab:
+ yyerror ("parser stack overflow");
+ yyresult = 2;
+ /* Fall through. */
+#endif
+
+yyreturn:
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+ return yyresult;
+}
+
+
+#line 398 "printrcy.y"
+
+
diff --git a/src/gutenprintui/printrcy.h b/src/gutenprintui/printrcy.h
new file mode 100644
index 0000000..2273fb7
--- /dev/null
+++ b/src/gutenprintui/printrcy.h
@@ -0,0 +1,124 @@
+/* A Bison parser, made by GNU Bison 1.875d. */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+ 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. */
+
+/* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ tINT = 258,
+ tDOUBLE = 259,
+ tDIMENSION = 260,
+ tBOOLEAN = 261,
+ tSTRING = 262,
+ tWORD = 263,
+ tGSWORD = 264,
+ CURRENT_PRINTER = 265,
+ SHOW_ALL_PAPER_SIZES = 266,
+ PRINTER = 267,
+ DESTINATION = 268,
+ SCALING = 269,
+ ORIENTATION = 270,
+ AUTOSIZE_ROLL_PAPER = 271,
+ UNIT = 272,
+ DRIVER = 273,
+ LEFT = 274,
+ TOP = 275,
+ CUSTOM_PAGE_WIDTH = 276,
+ CUSTOM_PAGE_HEIGHT = 277,
+ OUTPUT_TYPE = 278,
+ PRINTRC_HDR = 279,
+ PARAMETER = 280,
+ QUEUE_NAME = 281,
+ OUTPUT_FILENAME = 282,
+ EXTRA_PRINTER_OPTIONS = 283,
+ CUSTOM_COMMAND = 284,
+ COMMAND_TYPE = 285,
+ GLOBAL_SETTINGS = 286,
+ GLOBAL = 287,
+ END_GLOBAL_SETTINGS = 288,
+ pINT = 289,
+ pSTRING_LIST = 290,
+ pFILE = 291,
+ pDOUBLE = 292,
+ pDIMENSION = 293,
+ pBOOLEAN = 294,
+ pCURVE = 295
+ };
+#endif
+#define tINT 258
+#define tDOUBLE 259
+#define tDIMENSION 260
+#define tBOOLEAN 261
+#define tSTRING 262
+#define tWORD 263
+#define tGSWORD 264
+#define CURRENT_PRINTER 265
+#define SHOW_ALL_PAPER_SIZES 266
+#define PRINTER 267
+#define DESTINATION 268
+#define SCALING 269
+#define ORIENTATION 270
+#define AUTOSIZE_ROLL_PAPER 271
+#define UNIT 272
+#define DRIVER 273
+#define LEFT 274
+#define TOP 275
+#define CUSTOM_PAGE_WIDTH 276
+#define CUSTOM_PAGE_HEIGHT 277
+#define OUTPUT_TYPE 278
+#define PRINTRC_HDR 279
+#define PARAMETER 280
+#define QUEUE_NAME 281
+#define OUTPUT_FILENAME 282
+#define EXTRA_PRINTER_OPTIONS 283
+#define CUSTOM_COMMAND 284
+#define COMMAND_TYPE 285
+#define GLOBAL_SETTINGS 286
+#define GLOBAL 287
+#define END_GLOBAL_SETTINGS 288
+#define pINT 289
+#define pSTRING_LIST 290
+#define pFILE 291
+#define pDOUBLE 292
+#define pDIMENSION 293
+#define pBOOLEAN 294
+#define pCURVE 295
+
+
+
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+typedef int YYSTYPE;
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+extern YYSTYPE yylval;
+
+
+
diff --git a/src/gutenprintui/printrcy.y b/src/gutenprintui/printrcy.y
new file mode 100644
index 0000000..99cfaeb
--- /dev/null
+++ b/src/gutenprintui/printrcy.y
@@ -0,0 +1,398 @@
+/*
+ * "$Id: printrcy.y,v 1.1 2004/09/17 18:38:14 rleigh Exp $"
+ *
+ * Test pattern generator for Gutenprint
+ *
+ * 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.
+ */
+
+%{
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <gutenprintui/gutenprintui.h>
+#include "gutenprintui-internal.h"
+#include "printrc.h"
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+extern int mylineno;
+
+extern int yylex(void);
+char *quotestrip(const char *i);
+char *endstrip(const char *i);
+
+extern char* yytext;
+
+static int yyerror( const char *s )
+{
+ fprintf(stderr,"stdin:%d: %s before '%s'\n", mylineno, s, yytext);
+ return 0;
+}
+
+static stpui_plist_t *current_printer = NULL;
+
+%}
+
+%token <ival> tINT
+%token <dval> tDOUBLE
+%token <ival> tDIMENSION
+%token <sval> tBOOLEAN
+%token <sval> tSTRING
+%token <sval> tWORD
+%token <sval> tGSWORD
+
+%token CURRENT_PRINTER
+%token SHOW_ALL_PAPER_SIZES
+%token PRINTER
+%token DESTINATION
+%token SCALING
+%token ORIENTATION
+%token AUTOSIZE_ROLL_PAPER
+%token UNIT
+%token DRIVER
+%token LEFT
+%token TOP
+%token CUSTOM_PAGE_WIDTH
+%token CUSTOM_PAGE_HEIGHT
+%token OUTPUT_TYPE
+%token PRINTRC_HDR
+%token PARAMETER
+%token QUEUE_NAME
+%token OUTPUT_FILENAME
+%token EXTRA_PRINTER_OPTIONS
+%token CUSTOM_COMMAND
+%token COMMAND_TYPE
+%token GLOBAL_SETTINGS
+%token GLOBAL
+%token END_GLOBAL_SETTINGS
+%token pINT
+%token pSTRING_LIST
+%token pFILE
+%token pDOUBLE
+%token pDIMENSION
+%token pBOOLEAN
+%token pCURVE
+
+%start Thing
+
+%%
+
+Printer: PRINTER tSTRING tSTRING
+ {
+ current_printer = stpui_plist_create($2, $3);
+ g_free($2);
+ g_free($3);
+ }
+;
+
+/*
+ * Destination is obsolete; ignore it.
+ */
+Destination: DESTINATION tSTRING
+ {
+ if ($2)
+ g_free($2);
+ }
+;
+
+Queue_Name: QUEUE_NAME tSTRING
+ {
+ if ($2)
+ {
+ stpui_plist_set_queue_name(current_printer, $2);
+ g_free($2);
+ }
+ }
+;
+
+Output_Filename: OUTPUT_FILENAME tSTRING
+ {
+ if ($2)
+ {
+ stpui_plist_set_output_filename(current_printer, $2);
+ g_free($2);
+ }
+ }
+;
+
+Extra_Printer_Options: EXTRA_PRINTER_OPTIONS tSTRING
+ {
+ if ($2)
+ {
+ stpui_plist_set_extra_printer_options(current_printer, $2);
+ g_free($2);
+ }
+ }
+;
+
+Custom_Command: CUSTOM_COMMAND tSTRING
+ {
+ if ($2)
+ {
+ stpui_plist_set_custom_command(current_printer, $2);
+ g_free($2);
+ }
+ }
+;
+
+Command_Type: COMMAND_TYPE tINT
+ {
+ stpui_plist_set_command_type(current_printer, $2);
+ }
+;
+
+Scaling: SCALING tDOUBLE
+ { current_printer->scaling = $2; }
+;
+
+Orientation: ORIENTATION tINT
+ { current_printer->orientation = $2; }
+;
+
+Autosize_Roll_Paper: AUTOSIZE_ROLL_PAPER tINT
+ { current_printer->auto_size_roll_feed_paper = $2; }
+;
+
+Unit: UNIT tINT
+ { current_printer->unit = $2; }
+;
+
+Left: LEFT tINT
+ { stp_set_left(current_printer->v, $2); }
+;
+
+Top: TOP tINT
+ { stp_set_top(current_printer->v, $2); }
+;
+
+Output_Type: OUTPUT_TYPE tINT
+ {
+ switch ($2)
+ {
+ case 0:
+ stp_set_string_parameter
+ (current_printer->v, "PrintingMode", "BW");
+ break;
+ case 1:
+ case 2:
+ default:
+ stp_set_string_parameter
+ (current_printer->v, "PrintingMode", "Color");
+ break;
+ }
+ }
+;
+
+Custom_Page_Width: CUSTOM_PAGE_WIDTH tINT
+ { stp_set_page_width(current_printer->v, $2); }
+;
+
+Custom_Page_Height: CUSTOM_PAGE_HEIGHT tINT
+ { stp_set_page_height(current_printer->v, $2); }
+;
+
+Empty:
+;
+
+Int_Param: tWORD pINT tBOOLEAN tINT
+ {
+ stp_set_int_parameter(current_printer->v, $1, $4);
+ if (strcmp($3, "False") == 0)
+ stp_set_int_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_int_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_ACTIVE);
+ g_free($1);
+ g_free($3);
+ }
+;
+
+String_List_Param: tWORD pSTRING_LIST tBOOLEAN tSTRING
+ {
+ stp_set_string_parameter(current_printer->v, $1, $4);
+ if (strcmp($3, "False") == 0)
+ stp_set_string_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_string_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_ACTIVE);
+ g_free($1);
+ g_free($3);
+ g_free($4);
+ }
+;
+
+File_Param: tWORD pFILE tBOOLEAN tSTRING
+ {
+ stp_set_file_parameter(current_printer->v, $1, $4);
+ if (strcmp($3, "False") == 0)
+ stp_set_file_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_file_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_ACTIVE);
+ g_free($1);
+ g_free($3);
+ g_free($4);
+ }
+;
+
+Double_Param: tWORD pDOUBLE tBOOLEAN tDOUBLE
+ {
+ stp_set_float_parameter(current_printer->v, $1, $4);
+ if (strcmp($3, "False") == 0)
+ stp_set_float_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_float_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_ACTIVE);
+ g_free($1);
+ g_free($3);
+ }
+;
+
+Dimension_Param: tWORD pDIMENSION tBOOLEAN tINT
+ {
+ stp_set_dimension_parameter(current_printer->v, $1, $4);
+ if (strcmp($3, "False") == 0)
+ stp_set_dimension_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_dimension_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_ACTIVE);
+ g_free($1);
+ g_free($3);
+ }
+;
+
+Boolean_Param: tWORD pBOOLEAN tBOOLEAN tBOOLEAN
+ {
+ if (strcmp($4, "False") == 0)
+ stp_set_boolean_parameter(current_printer->v, $1, 0);
+ else
+ stp_set_boolean_parameter(current_printer->v, $1, 1);
+ if (strcmp($3, "False") == 0)
+ stp_set_boolean_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_boolean_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_ACTIVE);
+ g_free($1);
+ g_free($3);
+ g_free($4);
+ }
+;
+
+Curve_Param: tWORD pCURVE tBOOLEAN tSTRING
+ {
+ stp_curve_t *curve = stp_curve_create_from_string($4);
+ if (curve)
+ {
+ stp_set_curve_parameter(current_printer->v, $1, curve);
+ if (strcmp($3, "False") == 0)
+ stp_set_curve_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_curve_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_ACTIVE);
+ stp_curve_destroy(curve);
+ }
+ g_free($1);
+ g_free($3);
+ g_free($4);
+ }
+;
+
+Typed_Param: Int_Param | String_List_Param | File_Param | Double_Param
+ | Boolean_Param | Curve_Param | Dimension_Param
+;
+
+Parameter: PARAMETER Typed_Param
+;
+
+Parameters: Parameters Parameter | Empty
+;
+
+Standard_Value: Destination | Scaling | Orientation | Autosize_Roll_Paper |
+ Unit | Left | Top | Custom_Page_Width | Custom_Page_Height |
+ Output_Type | Queue_Name | Output_Filename | Extra_Printer_Options |
+ Custom_Command | Command_Type
+;
+
+Standard_Values: Standard_Values Standard_Value | Empty
+;
+
+A_Printer: Printer Standard_Values Parameters
+;
+
+Printers: Printers A_Printer | Empty
+;
+
+Current_Printer: CURRENT_PRINTER tSTRING
+ { stpui_printrc_current_printer = $2; }
+;
+
+Show_All_Paper_Sizes: SHOW_ALL_PAPER_SIZES tBOOLEAN
+ {
+ if (strcmp($2, "True") == 0)
+ stpui_show_all_paper_sizes = 1;
+ else
+ stpui_show_all_paper_sizes = 0;
+ g_free($2);
+ }
+;
+
+Global: Current_Printer | Show_All_Paper_Sizes
+;
+
+Old_Globals: Current_Printer Show_All_Paper_Sizes
+;
+
+New_Global_Setting: tWORD tSTRING
+ {
+ if ($2)
+ {
+ stpui_set_global_parameter($1, $2);
+ g_free($2);
+ }
+ g_free($1);
+ }
+;
+
+Global_Setting: Global | New_Global_Setting
+;
+
+Global_Settings: Global_Settings Global_Setting | Empty
+;
+
+Global_Subblock: GLOBAL_SETTINGS Global_Settings END_GLOBAL_SETTINGS
+;
+
+Global_Block: Global_Subblock | Old_Globals | Empty
+;
+
+Thing: PRINTRC_HDR Global_Block Printers
+;
+
+%%
diff --git a/src/gutenprintui/ui-utils.c b/src/gutenprintui/ui-utils.c
new file mode 100644
index 0000000..7c1a791
--- /dev/null
+++ b/src/gutenprintui/ui-utils.c
@@ -0,0 +1,870 @@
+/*
+ * "$Id: ui-utils.c,v 1.1 2004/09/17 18:38:14 rleigh 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 <config.h>
+#endif
+
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <gutenprintui/gutenprintui.h>
+#include "gutenprintui-internal.h"
+
+#include <stdio.h>
+#include <string.h>
+
+static void default_errfunc(void *data, const char *buffer, size_t bytes);
+static gchar *image_filename;
+static stp_outfunc_t the_errfunc = default_errfunc;
+static void *the_errdata = NULL;
+static get_thumbnail_func_t thumbnail_func;
+static void *thumbnail_private_data;
+
+/*****************************************************************\
+* *
+* The following from libgimp/gimpdialog.c *
+* *
+\*****************************************************************/
+
+/* local callbacks of dialog_new () */
+static gint
+dialog_delete_callback (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer data)
+{
+ GtkSignalFunc cancel_callback;
+ GtkWidget *cancel_widget;
+
+ cancel_callback =
+ (GtkSignalFunc) gtk_object_get_data (GTK_OBJECT (widget),
+ "dialog_cancel_callback");
+ cancel_widget =
+ (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget),
+ "dialog_cancel_widget");
+
+ /* the cancel callback has to destroy the dialog */
+ if (cancel_callback)
+ (* cancel_callback) (cancel_widget, data);
+
+ return TRUE;
+}
+
+/**
+ * dialog_create_action_areav:
+ * @dialog: The #GtkDialog you want to create the action_area for.
+ * @args: A @va_list as obtained with va_start() describing the action_area
+ * buttons.
+ *
+ */
+static void
+dialog_create_action_areav (GtkDialog *dialog,
+ va_list args)
+{
+ GtkWidget *hbbox = NULL;
+ GtkWidget *button;
+
+ /* action area variables */
+ const gchar *label;
+ GtkSignalFunc callback;
+ gpointer data;
+ GtkObject *slot_object;
+ GtkWidget **widget_ptr;
+ gboolean default_action;
+ gboolean connect_delete;
+
+ gboolean delete_connected = FALSE;
+
+ g_return_if_fail (dialog != NULL);
+ g_return_if_fail (GTK_IS_DIALOG (dialog));
+
+ /* prepare the action_area */
+ label = va_arg (args, const gchar *);
+
+ if (label)
+ {
+ gtk_container_set_border_width (GTK_CONTAINER (dialog->action_area), 2);
+ gtk_box_set_homogeneous (GTK_BOX (dialog->action_area), FALSE);
+
+ hbbox = gtk_hbutton_box_new ();
+ gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbbox), 4);
+ gtk_box_pack_end (GTK_BOX (dialog->action_area), hbbox, FALSE, FALSE, 0);
+ gtk_widget_show (hbbox);
+ }
+
+ /* the action_area buttons */
+ while (label)
+ {
+ callback = va_arg (args, GtkSignalFunc);
+ data = va_arg (args, gpointer);
+ slot_object = va_arg (args, GtkObject *);
+ widget_ptr = va_arg (args, GtkWidget **);
+ default_action = va_arg (args, gboolean);
+ connect_delete = va_arg (args, gboolean);
+
+ button = gtk_button_new_with_label (label);
+ GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+ gtk_box_pack_start (GTK_BOX (hbbox), button, FALSE, FALSE, 0);
+
+ if (slot_object == (GtkObject *) 1)
+ slot_object = GTK_OBJECT (dialog);
+
+ if (data == NULL)
+ data = dialog;
+
+ if (callback)
+ {
+ if (slot_object)
+ gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (callback),
+ slot_object);
+ else
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (callback),
+ data);
+ }
+
+ if (widget_ptr)
+ *widget_ptr = button;
+
+ if (connect_delete && callback && !delete_connected)
+ {
+ gtk_object_set_data (GTK_OBJECT (dialog),
+ "dialog_cancel_callback",
+ (gpointer) callback);
+ gtk_object_set_data (GTK_OBJECT (dialog),
+ "dialog_cancel_widget",
+ slot_object ? slot_object : GTK_OBJECT (button));
+
+ /* catch the WM delete event */
+ gtk_signal_connect (GTK_OBJECT (dialog), "delete_event",
+ GTK_SIGNAL_FUNC (dialog_delete_callback),
+ data);
+
+ delete_connected = TRUE;
+ }
+
+ if (default_action)
+ gtk_widget_grab_default (button);
+ gtk_widget_show (button);
+
+ label = va_arg (args, gchar *);
+ }
+}
+
+/**
+ * dialog_new:
+ * @title: The dialog's title which will be set with gtk_window_set_title().
+ * @wmclass_name: The dialog's @wmclass_name which will be set with
+ * gtk_window_set_wmclass(). The @wmclass_class will be
+ * automatically set to "Gimp".
+ * @position: The dialog's initial position which will be set with
+ * gtk_window_set_position().
+ * @allow_shrink: The dialog's @allow_shrink flag, ...
+ * @allow_grow: ... it't @allow_grow flag and ...
+ * @auto_shrink: ... it's @auto_shrink flag which will all be set with
+ * gtk_window_set_policy().
+ * @...: A #NULL terminated @va_list destribing the action_area buttons.
+ *
+ * This function simply packs the action_area arguments passed in "..."
+ * into a @va_list variable and passes everything to dialog_newv().
+ *
+ * For a description of the format of the @va_list describing the
+ * action_area buttons see dialog_create_action_areav().
+ *
+ * Returns: A #GtkDialog.
+ *
+ */
+GtkWidget *
+stpui_dialog_new (const gchar *title,
+ const gchar *wmclass_name,
+ GtkWindowPosition position,
+ gint allow_shrink,
+ gint allow_grow,
+ gint auto_shrink,
+
+ /* specify action area buttons as va_list:
+ * const gchar *label,
+ * GtkSignalFunc callback,
+ * gpointer data,
+ * GtkObject *slot_object,
+ * GtkWidget **widget_ptr,
+ * gboolean default_action,
+ * gboolean connect_delete,
+ */
+
+ ...)
+{
+ GtkWidget *dialog;
+ va_list args;
+
+ va_start (args, auto_shrink);
+
+ g_return_val_if_fail (title != NULL, NULL);
+ g_return_val_if_fail (wmclass_name != NULL, NULL);
+
+ dialog = gtk_dialog_new ();
+ gtk_window_set_title (GTK_WINDOW (dialog), title);
+ gtk_window_set_wmclass (GTK_WINDOW (dialog), wmclass_name, "Gimp");
+ gtk_window_set_position (GTK_WINDOW (dialog), position);
+ gtk_window_set_policy (GTK_WINDOW (dialog),
+ allow_shrink, allow_grow, auto_shrink);
+
+ /* prepare the action_area */
+ dialog_create_action_areav (GTK_DIALOG (dialog), args);
+
+ va_end (args);
+
+ return dialog;
+}
+
+/*****************************************************************\
+* *
+* The following from libgimp/gimpwidgets.c *
+* *
+\*****************************************************************/
+
+/**
+ * option_menu_new:
+ * @menu_only: #TRUE if the function should return a #GtkMenu only.
+ * @...: A #NULL terminated @va_list describing the menu items.
+ *
+ * Returns: A #GtkOptionMenu or a #GtkMenu (depending on @menu_only).
+ **/
+GtkWidget *
+stpui_option_menu_new(gboolean menu_only,
+
+ /* specify menu items as va_list:
+ * const gchar *label,
+ * GtkSignalFunc callback,
+ * gpointer data,
+ * gpointer user_data,
+ * GtkWidget **widget_ptr,
+ * gboolean active
+ */
+
+ ...)
+{
+ GtkWidget *menu;
+ GtkWidget *menuitem;
+
+ /* menu item variables */
+ const gchar *label;
+ GtkSignalFunc callback;
+ gpointer data;
+ gpointer user_data;
+ GtkWidget **widget_ptr;
+ gboolean active;
+
+ va_list args;
+ gint i;
+ gint initial_index;
+
+ menu = gtk_menu_new ();
+
+ /* create the menu items */
+ initial_index = 0;
+
+ va_start (args, menu_only);
+ label = va_arg (args, const gchar *);
+
+ for (i = 0; label; i++)
+ {
+ callback = va_arg (args, GtkSignalFunc);
+ data = va_arg (args, gpointer);
+ user_data = va_arg (args, gpointer);
+ widget_ptr = va_arg (args, GtkWidget **);
+ active = va_arg (args, gboolean);
+
+ if (strcmp (label, "---"))
+ {
+ menuitem = gtk_menu_item_new_with_label (label);
+
+ gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
+ callback,
+ data);
+
+ if (user_data)
+ gtk_object_set_user_data (GTK_OBJECT (menuitem), user_data);
+ }
+ else
+ {
+ menuitem = gtk_menu_item_new ();
+
+ gtk_widget_set_sensitive (menuitem, FALSE);
+ }
+
+ gtk_menu_append (GTK_MENU (menu), menuitem);
+
+ if (widget_ptr)
+ *widget_ptr = menuitem;
+
+ gtk_widget_show (menuitem);
+
+ /* remember the initial menu item */
+ if (active)
+ initial_index = i;
+
+ label = va_arg (args, const gchar *);
+ }
+ va_end (args);
+
+ if (! menu_only)
+ {
+ GtkWidget *optionmenu;
+
+ optionmenu = gtk_option_menu_new ();
+ gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu);
+
+ /* select the initial menu item */
+ gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), initial_index);
+
+ return optionmenu;
+ }
+
+ return menu;
+}
+
+/*****************************************************************\
+* *
+* The following from libgimp/gimpwidgets.c *
+* *
+\*****************************************************************/
+
+/**
+ * spin_button_new:
+ * @adjustment: Returns the spinbutton's #GtkAdjustment.
+ * @value: The initial value of the spinbutton.
+ * @lower: The lower boundary.
+ * @upper: The uppper boundary.
+ * @step_increment: The spinbutton's step increment.
+ * @page_increment: The spinbutton's page increment (mouse button 2).
+ * @page_size: The spinbutton's page size.
+ * @climb_rate: The spinbutton's climb rate.
+ * @digits: The spinbutton's number of decimal digits.
+ *
+ * This function is a shortcut for gtk_adjustment_new() and a subsequent
+ * gtk_spin_button_new() and does some more initialisation stuff like
+ * setting a standard minimun horizontal size.
+ *
+ * Returns: A #GtkSpinbutton and it's #GtkAdjustment.
+ **/
+static GtkWidget *
+spin_button_new (GtkObject **adjustment, /* return value */
+ gfloat value,
+ gfloat lower,
+ gfloat upper,
+ gfloat step_increment,
+ gfloat page_increment,
+ gfloat page_size,
+ gfloat climb_rate,
+ guint digits)
+{
+ GtkWidget *spinbutton;
+
+ *adjustment = gtk_adjustment_new (value, lower, upper,
+ step_increment, page_increment, page_size);
+
+ spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (*adjustment),
+ climb_rate, digits);
+ gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinbutton),
+ GTK_SHADOW_NONE);
+ gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
+ gtk_widget_set_usize (spinbutton, 75, -1);
+
+ return spinbutton;
+}
+
+static void
+scale_entry_unconstrained_adjustment_callback (GtkAdjustment *adjustment,
+ GtkAdjustment *other_adj)
+{
+ gtk_signal_handler_block_by_data (GTK_OBJECT (other_adj), adjustment);
+
+ gtk_adjustment_set_value (other_adj, adjustment->value);
+
+ gtk_signal_handler_unblock_by_data (GTK_OBJECT (other_adj), adjustment);
+}
+
+/**
+ * scale_entry_new:
+ * @table: The #GtkTable the widgets will be attached to.
+ * @column: The column to start with.
+ * @row: The row to attach the widgets.
+ * @text: The text for the #GtkLabel which will appear
+ * left of the #GtkHScale.
+ * @scale_usize: The minimum horizontal size of the #GtkHScale.
+ * @spinbutton_usize: The minimum horizontal size of the #GtkSpinButton.
+ * @value: The initial value.
+ * @lower: The lower boundary.
+ * @upper: The upper boundary.
+ * @step_increment: The step increment.
+ * @page_increment: The page increment.
+ * @digits: The number of decimal digits.
+ * @constrain: #TRUE if the range of possible values of the
+ * #GtkSpinButton should be the same as of the #GtkHScale.
+ * @unconstrained_lower: The spinbutton's lower boundary
+ * if @constrain == #FALSE.
+ * @unconstrained_upper: The spinbutton's upper boundary
+ * if @constrain == #FALSE.
+ * @tooltip: A tooltip message for the scale and the spinbutton.
+ *
+ * This function creates a #GtkLabel, a #GtkHScale and a #GtkSpinButton and
+ * attaches them to a 3-column #GtkTable.
+ *
+ * Returns: The #GtkSpinButton's #GtkAdjustment.
+ **/
+GtkObject *
+stpui_scale_entry_new(GtkTable *table,
+ gint column,
+ gint row,
+ const gchar *text,
+ gint scale_usize,
+ gint spinbutton_usize,
+ gfloat value,
+ gfloat lower,
+ gfloat upper,
+ gfloat step_increment,
+ gfloat page_increment,
+ guint digits,
+ gboolean constrain,
+ gfloat unconstrained_lower,
+ gfloat unconstrained_upper,
+ const gchar *tooltip)
+{
+ GtkWidget *label;
+ GtkWidget *scale;
+ GtkWidget *spinbutton;
+ GtkObject *adjustment;
+ GtkObject *return_adj;
+
+ label = gtk_label_new (text);
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_table_attach (GTK_TABLE (table), label,
+ column + 1, column + 2, row, row + 1,
+ GTK_FILL, GTK_FILL, 0, 0);
+ gtk_widget_show (label);
+
+ if (! constrain &&
+ unconstrained_lower <= lower &&
+ unconstrained_upper >= upper)
+ {
+ GtkObject *constrained_adj;
+
+ constrained_adj = gtk_adjustment_new (value, lower, upper,
+ step_increment, page_increment,
+ 0.0);
+
+ spinbutton = spin_button_new (&adjustment, value,
+ unconstrained_lower,
+ unconstrained_upper,
+ step_increment, page_increment, 0.0,
+ 1.0, digits);
+
+ gtk_signal_connect
+ (GTK_OBJECT (constrained_adj), "value_changed",
+ GTK_SIGNAL_FUNC (scale_entry_unconstrained_adjustment_callback),
+ adjustment);
+
+ gtk_signal_connect
+ (GTK_OBJECT (adjustment), "value_changed",
+ GTK_SIGNAL_FUNC (scale_entry_unconstrained_adjustment_callback),
+ constrained_adj);
+
+ return_adj = adjustment;
+
+ adjustment = constrained_adj;
+ }
+ else
+ {
+ spinbutton = spin_button_new (&adjustment, value, lower, upper,
+ step_increment, page_increment, 0.0,
+ 1.0, digits);
+
+ return_adj = adjustment;
+ }
+
+ if (spinbutton_usize > 0)
+ gtk_widget_set_usize (spinbutton, spinbutton_usize, -1);
+
+ scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
+ if (scale_usize > 0)
+ gtk_widget_set_usize (scale, scale_usize, -1);
+ gtk_scale_set_digits (GTK_SCALE (scale), digits);
+ gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE);
+ gtk_table_attach (GTK_TABLE (table), scale,
+ column + 2, column + 3, row, row + 1,
+ GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
+ gtk_widget_show (scale);
+
+ gtk_table_attach (GTK_TABLE (table), spinbutton,
+ column + 3, column + 4, row, row + 1,
+ GTK_SHRINK, GTK_SHRINK, 0, 0);
+ gtk_widget_show (spinbutton);
+
+ if (tooltip)
+ {
+ stpui_set_help_data (scale, tooltip);
+ stpui_set_help_data (spinbutton, tooltip);
+ }
+
+ gtk_object_set_data (GTK_OBJECT (return_adj), "label", label);
+ gtk_object_set_data (GTK_OBJECT (return_adj), "scale", scale);
+ gtk_object_set_data (GTK_OBJECT (return_adj), "spinbutton", spinbutton);
+
+ return return_adj;
+}
+
+/**
+ * table_attach_aligned:
+ * @table: The #GtkTable the widgets will be attached to.
+ * @column: The column to start with.
+ * @row: The row to attach the eidgets.
+ * @label_text: The text for the #GtkLabel which will be attached left of the
+ * widget.
+ * @xalign: The horizontal alignment of the #GtkLabel.
+ * @yalign: The vertival alignment of the #GtkLabel.
+ * @widget: The #GtkWidget to attach right of the label.
+ * @colspan: The number of columns the widget will use.
+ * @left_align: #TRUE if the widget should be left-aligned.
+ *
+ * Note that the @label_text can be #NULL and that the widget will be attached
+ * starting at (@column + 1) in this case, too.
+ **/
+void
+stpui_table_attach_aligned (GtkTable *table,
+ gint column,
+ gint row,
+ const gchar *label_text,
+ gfloat xalign,
+ gfloat yalign,
+ GtkWidget *widget,
+ gint colspan,
+ gboolean left_align)
+{
+ if (label_text)
+ {
+ GtkWidget *label;
+
+ label = gtk_label_new (label_text);
+ gtk_misc_set_alignment (GTK_MISC (label), xalign, yalign);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+ gtk_table_attach (table, label, column, column + 1, row, row + 1,
+ GTK_FILL, GTK_FILL, 0, 0);
+ gtk_widget_show (label);
+ }
+
+ gtk_widget_show (widget);
+ if (left_align)
+ {
+ GtkWidget *alignment;
+
+ alignment = gtk_alignment_new (0.0, 0.5, 0.0, 0.0);
+ gtk_container_add (GTK_CONTAINER (alignment), widget);
+
+ widget = alignment;
+ }
+
+ gtk_table_attach (table, widget, column + 1, column + 1 + colspan,
+ row, row + 1,
+ GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
+
+ gtk_widget_show (widget);
+}
+
+/*****************************************************************\
+* *
+* The following borrowed from libgimp/gimphelpui.c *
+* *
+\*****************************************************************/
+
+static GtkTooltips * tool_tips = NULL;
+
+/**
+ * stpui_help_init:
+ *
+ * This function initializes GIMP's help system.
+ *
+ * Currently it only creates a #GtkTooltips object with gtk_tooltips_new()
+ * which will be used by help_stpui_set_help_data().
+ **/
+void
+stpui_help_init (void)
+{
+ tool_tips = gtk_tooltips_new ();
+}
+
+/**
+ * stpui_help_free:
+ *
+ * This function frees the memory used by the #GtkTooltips created by
+ * stpui_help_init().
+ **/
+void
+stpui_help_free (void)
+{
+ gtk_object_destroy (GTK_OBJECT (tool_tips));
+ gtk_object_unref (GTK_OBJECT (tool_tips));
+}
+
+/**
+ * help_enable_tooltips:
+ *
+ * This function calls gtk_tooltips_enable().
+ **/
+void
+stpui_enable_help (void)
+{
+ gtk_tooltips_enable (tool_tips);
+}
+
+/**
+ * help_disable_tooltips:
+ *
+ * This function calls gtk_tooltips_disable().
+ **/
+
+void
+stpui_disable_help (void)
+{
+ gtk_tooltips_disable (tool_tips);
+}
+
+void
+stpui_set_help_data (GtkWidget *widget, const gchar *tooltip)
+{
+ g_return_if_fail (widget != NULL);
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+
+ if (tooltip)
+ {
+ gtk_tooltips_set_tip (tool_tips, widget, tooltip, NULL);
+ }
+}
+
+/*****************************************************************\
+* *
+* The below is new code *
+* *
+\*****************************************************************/
+
+
+void
+stpui_set_image_filename(const char *name)
+{
+ if (name && name == image_filename)
+ return;
+ if (image_filename)
+ g_free(image_filename);
+ if (name)
+ image_filename = g_strdup(name);
+ else
+ image_filename = g_strdup("");
+}
+
+const char *
+stpui_get_image_filename(void)
+{
+ stpui_set_image_filename(image_filename);
+ return(image_filename);
+}
+
+static void
+default_errfunc(void *data, const char *buffer, size_t bytes)
+{
+ fwrite(buffer, 1, bytes, data ? data : stderr);
+}
+
+void
+stpui_set_errfunc(stp_outfunc_t wfunc)
+{
+ the_errfunc = wfunc;
+}
+
+stp_outfunc_t
+stpui_get_errfunc(void)
+{
+ return the_errfunc;
+}
+
+void
+stpui_set_errdata(void *errdata)
+{
+ the_errdata = errdata;
+}
+
+void *
+stpui_get_errdata(void)
+{
+ return the_errdata;
+}
+
+void
+stpui_set_thumbnail_func(get_thumbnail_func_t func)
+{
+ thumbnail_func = func;
+}
+
+get_thumbnail_func_t
+stpui_get_thumbnail_func(void)
+{
+ return thumbnail_func;
+}
+
+void
+stpui_set_thumbnail_data(void *data)
+{
+ thumbnail_private_data = data;
+}
+
+void *
+stpui_get_thumbnail_data(void)
+{
+ return thumbnail_private_data;
+}
+
+GtkWidget *
+stpui_create_entry(GtkWidget *table, int hpos, int vpos, const char *text,
+ const char *help, GtkSignalFunc callback)
+{
+ GtkWidget *entry = gtk_entry_new();
+ gtk_widget_set_usize(entry, 60, 0);
+ stpui_table_attach_aligned(GTK_TABLE(table), hpos, vpos, text,
+ 0.0, 0.5, entry, 1, TRUE);
+ stpui_set_help_data(entry, help);
+ gtk_signal_connect(GTK_OBJECT(entry), "activate",
+ GTK_SIGNAL_FUNC(callback), NULL);
+ return entry;
+}
+
+GSList *
+stpui_create_radio_button(radio_group_t *radio, GSList *group,
+ GtkWidget *table, int hpos, int vpos,
+ GtkSignalFunc callback)
+{
+ radio->button = gtk_radio_button_new_with_label(group, _(radio->name));
+ group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio->button));
+ stpui_table_attach_aligned(GTK_TABLE(table), hpos, vpos, NULL, 0.5, 0.5,
+ radio->button, 1, FALSE);
+ stpui_set_help_data(radio->button, _(radio->help));
+ gtk_signal_connect(GTK_OBJECT(radio->button), "toggled",
+ GTK_SIGNAL_FUNC(callback), (gpointer) radio->value);
+ return group;
+}
+
+void
+stpui_set_adjustment_tooltip (GtkObject *adj, const gchar *tip)
+{
+ stpui_set_help_data (GTK_WIDGET (SCALE_ENTRY_SCALE (adj)), tip);
+ stpui_set_help_data (GTK_WIDGET (SCALE_ENTRY_SPINBUTTON (adj)), tip);
+}
+
+static GtkWidget *
+table_label(GtkTable *table, gint column, gint row)
+{
+ GList *children = table->children;;
+ while (children)
+ {
+ GtkTableChild *child = (GtkTableChild *)children->data;
+ if (child->left_attach == column + 1 && child->top_attach == row)
+ return child->widget;
+ children = children->next;
+ }
+ return NULL;
+}
+
+void
+stpui_create_new_combo(option_t *option, GtkWidget *table,
+ int hpos, int vpos, gboolean is_optional)
+{
+ GtkWidget *event_box = gtk_event_box_new();
+ GtkWidget *combo = gtk_combo_new();
+
+ option->checkbox = gtk_check_button_new();
+ gtk_table_attach(GTK_TABLE(table), option->checkbox,
+ hpos, hpos + 1, vpos, vpos + 1,
+ GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
+
+ option->info.list.combo = combo;
+ gtk_container_add(GTK_CONTAINER(event_box), combo);
+ gtk_widget_show(combo);
+ gtk_widget_show(event_box);
+ stpui_set_help_data(event_box, _(option->fast_desc->help));
+ stpui_table_attach_aligned
+ (GTK_TABLE(table), hpos + 1, vpos, _(option->fast_desc->text),
+ 0.0, 0.5, event_box, 2, TRUE);
+ option->info.list.label = table_label(GTK_TABLE(table), hpos, vpos);
+}
+
+const char *
+stpui_combo_get_name(GtkWidget *combo,
+ const stp_string_list_t *options)
+{
+ if (options)
+ {
+ gint i;
+ gint num_options = stp_string_list_count(options);
+ gchar *text = (gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry)));
+
+ if (text == NULL)
+ return (NULL);
+
+ if (num_options == 0)
+ return ((const char *)text);
+
+ for (i = 0; i < num_options; i ++)
+ if (strcmp(stp_string_list_param(options, i)->text, text) == 0)
+ return (stp_string_list_param(options, i)->name);
+ }
+ return (NULL);
+}
+
+void
+stpui_create_scale_entry(option_t *opt,
+ GtkTable *table,
+ gint column,
+ gint row,
+ const gchar *text,
+ gint scale_usize,
+ gint spinbutton_usize,
+ gfloat value,
+ gfloat lower,
+ gfloat upper,
+ gfloat step_increment,
+ gfloat page_increment,
+ guint digits,
+ gboolean constrain,
+ gfloat unconstrained_lower,
+ gfloat unconstrained_upper,
+ const gchar *tooltip,
+ gboolean is_optional)
+{
+ opt->checkbox = gtk_check_button_new();
+ gtk_table_attach(GTK_TABLE(table), opt->checkbox,
+ column, column + 1, row, row + 1,
+ GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
+ opt->info.flt.adjustment =
+ stpui_scale_entry_new(table, column, row, text, scale_usize,
+ spinbutton_usize, value, lower, upper,
+ step_increment, page_increment, digits, constrain,
+ unconstrained_lower, unconstrained_upper, tooltip);
+}
diff --git a/src/gutenprintui2/Makefile.am b/src/gutenprintui2/Makefile.am
new file mode 100644
index 0000000..6b93566
--- /dev/null
+++ b/src/gutenprintui2/Makefile.am
@@ -0,0 +1,101 @@
+## $Id: Makefile.am,v 1.5 2005/06/26 10:56:51 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
+
+include $(top_srcdir)/scripts/global.mk
+
+
+## Variables
+
+m4datadir = $(datadir)/aclocal
+pkgconfigdatadir = $(libdir)/pkgconfig
+
+
+## Programs
+
+if BUILD_LIBGUTENPRINTUI2
+lib_LTLIBRARIES = libgutenprintui2.la
+endif
+
+libgutenprintui2_la_SOURCES = \
+ printrcy.y \
+ printrcl.l \
+ printrc.h \
+ panel.c \
+ plist.c \
+ ui-utils.c \
+ print-image-thumbnail.c \
+ curve.c \
+ gammacurve.c \
+ typebuiltins.c \
+ gutenprintui-internal.h
+
+libgutenprintui2_la_LIBADD = $(GUTENPRINTUI2_LIBDEPS)
+# Uncommment to build an unversioned library (version in soname)
+libgutenprintui2_la_CFLAGS = $(AM_CFLAGS) $(CFLAGS) $(GUTENPRINT_CFLAGS) $(GTK2_CFLAGS)
+#libgutenprintui2_la_LDFLAGS = -release $(GUTENPRINT_VERSION) \
+# -rpath $(libdir) -no-undefined
+# Uncomment to build a versioned library
+libgutenprintui2_la_LDFLAGS = \
+ -version-info $(GUTENPRINTUI2_CURRENT_INTERFACE):$(GUTENPRINTUI2_INTERFACE_AGE):$(GUTENPRINTUI2_BINARY_AGE) \
+ -rpath $(libdir) -no-undefined
+
+AM_LFLAGS = -i
+AM_YFLAGS = -d
+
+printrcl.o: printrcy.o
+plist.o: printrcy.o
+
+## Data
+
+pkgconfigdata_DATA = gutenprintui2.pc
+
+
+## Rules
+
+# Copied from include/gutenprintui2/Makefile.am
+# This duplication needs fixing somehow
+stpui_public_h_sources = \
+ ../../include/gutenprintui2/gutenprintui.h \
+ ../../include/gutenprintui2/curve.h \
+ ../../include/gutenprintui2/gammacurve.h
+
+if MAINTAINER_MODE
+typebuiltins_extra_deps = Makefile
+endif
+
+# Really need to depend upon $(stpui_public_h_sources) here...
+$(srcdir)/typebuiltins.c: $(typebuiltins_extra_deps)
+ ( cd $(srcdir) && $(GLIB_MKENUMS) \
+ --fhead "#include <gutenprintui2/gutenprintui.h>" \
+ --fprod "\n/* enumerations from \"@filename@\" */" \
+ --vhead "GType\n@enum_name@_get_type (void)\n{\n static GType etype = 0;\n if (etype == 0) {\n static const G@Type@Value values[] = {" \
+ --vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \
+ --vtail " { 0, NULL, NULL }\n };\n etype = g_@type@_register_static (\"@EnumName@\", values);\n }\n return etype;\n}\n" \
+ $(stpui_public_h_sources) ) > $@
+
+
+## Clean
+
+MAINTAINERCLEANFILES = Makefile.in typebuiltins.c printrcl.c printrcy.c printrcy.h
diff --git a/src/gutenprintui2/Makefile.in b/src/gutenprintui2/Makefile.in
new file mode 100644
index 0000000..8c3e85c
--- /dev/null
+++ b/src/gutenprintui2/Makefile.in
@@ -0,0 +1,830 @@
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Variables
+
+
+SOURCES = $(libgutenprintui2_la_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(srcdir)/gutenprintui2.pc.in $(top_srcdir)/scripts/global.mk \
+ printrcl.c printrcy.c printrcy.h
+subdir = src/gutenprintui2
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gimp.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/stp.m4 $(top_srcdir)/m4/stp_cups.m4 \
+ $(top_srcdir)/m4/stp_gimp.m4 $(top_srcdir)/m4/stp_option.m4 \
+ $(top_srcdir)/m4/stp_release.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = gutenprintui2.pc
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(libdir)" \
+ "$(DESTDIR)$(pkgconfigdatadir)"
+libLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgutenprintui2_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_libgutenprintui2_la_OBJECTS = libgutenprintui2_la-printrcy.lo \
+ libgutenprintui2_la-printrcl.lo libgutenprintui2_la-panel.lo \
+ libgutenprintui2_la-plist.lo libgutenprintui2_la-ui-utils.lo \
+ libgutenprintui2_la-print-image-thumbnail.lo \
+ libgutenprintui2_la-curve.lo libgutenprintui2_la-gammacurve.lo \
+ libgutenprintui2_la-typebuiltins.lo
+libgutenprintui2_la_OBJECTS = $(am_libgutenprintui2_la_OBJECTS)
+@BUILD_LIBGUTENPRINTUI2_TRUE@am_libgutenprintui2_la_rpath = -rpath \
+@BUILD_LIBGUTENPRINTUI2_TRUE@ $(libdir)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS)
+LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS)
+YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS)
+LTYACCCOMPILE = $(LIBTOOL) --mode=compile $(YACC) $(YFLAGS) \
+ $(AM_YFLAGS)
+SOURCES = $(libgutenprintui2_la_SOURCES)
+DIST_SOURCES = $(libgutenprintui2_la_SOURCES)
+pkgconfigdataDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkgconfigdata_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALL_LINGUAS = @ALL_LINGUAS@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CUPS_FALSE = @BUILD_CUPS_FALSE@
+BUILD_CUPS_PPDS_FALSE = @BUILD_CUPS_PPDS_FALSE@
+BUILD_CUPS_PPDS_TRUE = @BUILD_CUPS_PPDS_TRUE@
+BUILD_CUPS_TRUE = @BUILD_CUPS_TRUE@
+BUILD_ESCPUTIL_FALSE = @BUILD_ESCPUTIL_FALSE@
+BUILD_ESCPUTIL_TRUE = @BUILD_ESCPUTIL_TRUE@
+BUILD_FOOMATIC_3_FALSE = @BUILD_FOOMATIC_3_FALSE@
+BUILD_FOOMATIC_3_TRUE = @BUILD_FOOMATIC_3_TRUE@
+BUILD_FOOMATIC_FALSE = @BUILD_FOOMATIC_FALSE@
+BUILD_FOOMATIC_TRUE = @BUILD_FOOMATIC_TRUE@
+BUILD_GENPPD_STATIC_FALSE = @BUILD_GENPPD_STATIC_FALSE@
+BUILD_GENPPD_STATIC_TRUE = @BUILD_GENPPD_STATIC_TRUE@
+BUILD_GHOSTSCRIPT_FALSE = @BUILD_GHOSTSCRIPT_FALSE@
+BUILD_GHOSTSCRIPT_TRUE = @BUILD_GHOSTSCRIPT_TRUE@
+BUILD_GIMP2_FALSE = @BUILD_GIMP2_FALSE@
+BUILD_GIMP2_TRUE = @BUILD_GIMP2_TRUE@
+BUILD_GIMP_FALSE = @BUILD_GIMP_FALSE@
+BUILD_GIMP_TRUE = @BUILD_GIMP_TRUE@
+BUILD_LIBGUTENPRINTUI2_FALSE = @BUILD_LIBGUTENPRINTUI2_FALSE@
+BUILD_LIBGUTENPRINTUI2_TRUE = @BUILD_LIBGUTENPRINTUI2_TRUE@
+BUILD_LIBGUTENPRINTUI_FALSE = @BUILD_LIBGUTENPRINTUI_FALSE@
+BUILD_LIBGUTENPRINTUI_TRUE = @BUILD_LIBGUTENPRINTUI_TRUE@
+BUILD_MODULES_FALSE = @BUILD_MODULES_FALSE@
+BUILD_MODULES_TRUE = @BUILD_MODULES_TRUE@
+BUILD_TESTPATTERN_FALSE = @BUILD_TESTPATTERN_FALSE@
+BUILD_TESTPATTERN_TRUE = @BUILD_TESTPATTERN_TRUE@
+BUILD_TEST_FALSE = @BUILD_TEST_FALSE@
+BUILD_TEST_TRUE = @BUILD_TEST_TRUE@
+BUILD_TRANSLATED_CUPS_PPDS_FALSE = @BUILD_TRANSLATED_CUPS_PPDS_FALSE@
+BUILD_TRANSLATED_CUPS_PPDS_TRUE = @BUILD_TRANSLATED_CUPS_PPDS_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CONVERT = @CONVERT@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CUPS_CFLAGS = @CUPS_CFLAGS@
+CUPS_CONFIG = @CUPS_CONFIG@
+CUPS_LIBS = @CUPS_LIBS@
+CUPS_PPDS_AT_TOP_LEVEL_FALSE = @CUPS_PPDS_AT_TOP_LEVEL_FALSE@
+CUPS_PPDS_AT_TOP_LEVEL_TRUE = @CUPS_PPDS_AT_TOP_LEVEL_TRUE@
+CUPS_PPD_PS_LEVEL = @CUPS_PPD_PS_LEVEL@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DB2HTML = @DB2HTML@
+DB2PDF = @DB2PDF@
+DB2PS = @DB2PS@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIALOG = @DIALOG@
+DOXYGEN = @DOXYGEN@
+DVIPDF = @DVIPDF@
+DVIPS = @DVIPS@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+FIND = @FIND@
+FOOMATIC_CONFIGURE = @FOOMATIC_CONFIGURE@
+FOOMATIC_KITLOAD = @FOOMATIC_KITLOAD@
+FOOMATIC_PPDFILE = @FOOMATIC_PPDFILE@
+GENPPD_LIBS = @GENPPD_LIBS@
+GIMP2_CFLAGS = @GIMP2_CFLAGS@
+GIMP2_LIBS = @GIMP2_LIBS@
+GIMPTOOL = @GIMPTOOL@
+GIMPTOOL2_CHECK = @GIMPTOOL2_CHECK@
+GIMPTOOL_CHECK = @GIMPTOOL_CHECK@
+GIMP_CFLAGS = @GIMP_CFLAGS@
+GIMP_CFLAGS_NOUI = @GIMP_CFLAGS_NOUI@
+GIMP_DATA_DIR = @GIMP_DATA_DIR@
+GIMP_LIBS = @GIMP_LIBS@
+GIMP_LIBS_NOUI = @GIMP_LIBS_NOUI@
+GIMP_PLUGIN_DIR = @GIMP_PLUGIN_DIR@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_CONFIG = @GLIB_CONFIG@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GMSGFMT = @GMSGFMT@
+GNUCFLAGS = @GNUCFLAGS@
+GTK2_CFLAGS = @GTK2_CFLAGS@
+GTK2_LIBS = @GTK2_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+GUTENPRINTUI2_BINARY_AGE = @GUTENPRINTUI2_BINARY_AGE@
+GUTENPRINTUI2_CFLAGS = @GUTENPRINTUI2_CFLAGS@
+GUTENPRINTUI2_CURRENT_INTERFACE = @GUTENPRINTUI2_CURRENT_INTERFACE@
+GUTENPRINTUI2_INTERFACE_AGE = @GUTENPRINTUI2_INTERFACE_AGE@
+GUTENPRINTUI2_LIBDEPS = @GUTENPRINTUI2_LIBDEPS@
+GUTENPRINTUI2_LIBS = $(top_builddir)/src/gutenprintui2/libgutenprintui2.la
+GUTENPRINTUI2_VERSION = @GUTENPRINTUI2_VERSION@
+GUTENPRINTUI_BINARY_AGE = @GUTENPRINTUI_BINARY_AGE@
+GUTENPRINTUI_CFLAGS = @GUTENPRINTUI_CFLAGS@
+GUTENPRINTUI_CURRENT_INTERFACE = @GUTENPRINTUI_CURRENT_INTERFACE@
+GUTENPRINTUI_INTERFACE_AGE = @GUTENPRINTUI_INTERFACE_AGE@
+GUTENPRINTUI_LIBDEPS = @GUTENPRINTUI_LIBDEPS@
+GUTENPRINTUI_LIBS = $(top_builddir)/src/gutenprintui/libgutenprintui.la
+GUTENPRINTUI_VERSION = @GUTENPRINTUI_VERSION@
+GUTENPRINT_BINARY_AGE = @GUTENPRINT_BINARY_AGE@
+GUTENPRINT_CFLAGS = @GUTENPRINT_CFLAGS@
+GUTENPRINT_CURRENT_INTERFACE = @GUTENPRINT_CURRENT_INTERFACE@
+GUTENPRINT_INTERFACE_AGE = @GUTENPRINT_INTERFACE_AGE@
+GUTENPRINT_LIBDEPS = @GUTENPRINT_LIBDEPS@
+
+# Libraries
+GUTENPRINT_LIBS = $(top_builddir)/src/main/libgutenprint.la
+GUTENPRINT_MAJOR_VERSION = @GUTENPRINT_MAJOR_VERSION@
+GUTENPRINT_MICRO_VERSION = @GUTENPRINT_MICRO_VERSION@
+GUTENPRINT_MINOR_VERSION = @GUTENPRINT_MINOR_VERSION@
+GUTENPRINT_VERSION = @GUTENPRINT_VERSION@
+IJS_CFLAGS = @IJS_CFLAGS@
+IJS_CONFIG = @IJS_CONFIG@
+IJS_LIBS = @IJS_LIBS@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SAMPLES_FALSE = @INSTALL_SAMPLES_FALSE@
+INSTALL_SAMPLES_TRUE = @INSTALL_SAMPLES_TRUE@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_USER_GUIDE_FALSE = @INSTALL_USER_GUIDE_FALSE@
+INSTALL_USER_GUIDE_TRUE = @INSTALL_USER_GUIDE_TRUE@
+INTLLIBS = @INTLLIBS@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE_DEPS = @LIBREADLINE_DEPS@
+LIBS = $(INTLLIBS) @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBTOOL_DEPS = @LIBTOOL_DEPS@
+LN_S = @LN_S@
+LTALLOCA = @LTALLOCA@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_CFLAGS = @MAINTAINER_CFLAGS@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
+PLUG_IN_PATH = @PLUG_IN_PATH@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+RELEASE_DATE = @RELEASE_DATE@
+RM = @RM@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEXI2HTML = @TEXI2HTML@
+USE_LEVEL3_PS_FALSE = @USE_LEVEL3_PS_FALSE@
+USE_LEVEL3_PS_TRUE = @USE_LEVEL3_PS_TRUE@
+USE_NLS = @USE_NLS@
+USE_NLS_FALSE = @USE_NLS_FALSE@
+USE_NLS_TRUE = @USE_NLS_TRUE@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+YACC = @YACC@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+cups_bindir = @cups_bindir@
+cups_conf_datadir = @cups_conf_datadir@
+cups_conf_serverbin = @cups_conf_serverbin@
+cups_conf_serverroot = @cups_conf_serverroot@
+cups_exec_prefix = @cups_exec_prefix@
+cups_prefix = @cups_prefix@
+cups_sbindir = @cups_sbindir@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+gimp2_plug_indir = @gimp2_plug_indir@
+gimp_plug_indir = @gimp_plug_indir@
+gutenprint_cflags = @gutenprint_cflags@
+gutenprint_libs = @gutenprint_libs@
+gutenprintui2_cflags = @gutenprintui2_cflags@
+gutenprintui2_libs = @gutenprintui2_libs@
+gutenprintui_cflags = @gutenprintui_cflags@
+gutenprintui_libs = @gutenprintui_libs@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AUTOMAKE_OPTIONS = 1.4 gnu
+MAINT_CHARSET = latin1
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(LOCAL_CPPFLAGS) $(GNUCFLAGS)
+m4datadir = $(datadir)/aclocal
+pkgconfigdatadir = $(libdir)/pkgconfig
+@BUILD_LIBGUTENPRINTUI2_TRUE@lib_LTLIBRARIES = libgutenprintui2.la
+libgutenprintui2_la_SOURCES = \
+ printrcy.y \
+ printrcl.l \
+ printrc.h \
+ panel.c \
+ plist.c \
+ ui-utils.c \
+ print-image-thumbnail.c \
+ curve.c \
+ gammacurve.c \
+ typebuiltins.c \
+ gutenprintui-internal.h
+
+libgutenprintui2_la_LIBADD = $(GUTENPRINTUI2_LIBDEPS)
+# Uncommment to build an unversioned library (version in soname)
+libgutenprintui2_la_CFLAGS = $(AM_CFLAGS) $(CFLAGS) $(GUTENPRINT_CFLAGS) $(GTK2_CFLAGS)
+#libgutenprintui2_la_LDFLAGS = -release $(GUTENPRINT_VERSION) \
+# -rpath $(libdir) -no-undefined
+# Uncomment to build a versioned library
+libgutenprintui2_la_LDFLAGS = \
+ -version-info $(GUTENPRINTUI2_CURRENT_INTERFACE):$(GUTENPRINTUI2_INTERFACE_AGE):$(GUTENPRINTUI2_BINARY_AGE) \
+ -rpath $(libdir) -no-undefined
+
+AM_LFLAGS = -i
+AM_YFLAGS = -d
+pkgconfigdata_DATA = gutenprintui2.pc
+
+# Copied from include/gutenprintui2/Makefile.am
+# This duplication needs fixing somehow
+stpui_public_h_sources = \
+ ../../include/gutenprintui2/gutenprintui.h \
+ ../../include/gutenprintui2/curve.h \
+ ../../include/gutenprintui2/gammacurve.h
+
+@MAINTAINER_MODE_TRUE@typebuiltins_extra_deps = Makefile
+MAINTAINERCLEANFILES = Makefile.in typebuiltins.c printrcl.c printrcy.c printrcy.h
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .l .lo .o .obj .y
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/scripts/global.mk $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/gutenprintui2/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/gutenprintui2/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+gutenprintui2.pc: $(top_builddir)/config.status $(srcdir)/gutenprintui2.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ p=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
+ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+printrcy.h: printrcy.c
+ @if test ! -f $@; then \
+ rm -f printrcy.c; \
+ $(MAKE) printrcy.c; \
+ else :; fi
+libgutenprintui2.la: $(libgutenprintui2_la_OBJECTS) $(libgutenprintui2_la_DEPENDENCIES)
+ $(LINK) $(am_libgutenprintui2_la_rpath) $(libgutenprintui2_la_LDFLAGS) $(libgutenprintui2_la_OBJECTS) $(libgutenprintui2_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgutenprintui2_la-curve.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgutenprintui2_la-gammacurve.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgutenprintui2_la-panel.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgutenprintui2_la-plist.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgutenprintui2_la-print-image-thumbnail.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgutenprintui2_la-printrcl.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgutenprintui2_la-printrcy.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgutenprintui2_la-typebuiltins.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgutenprintui2_la-ui-utils.Plo@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libgutenprintui2_la-printrcy.lo: printrcy.c
+@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui2_la_CFLAGS) $(CFLAGS) -MT libgutenprintui2_la-printrcy.lo -MD -MP -MF "$(DEPDIR)/libgutenprintui2_la-printrcy.Tpo" -c -o libgutenprintui2_la-printrcy.lo `test -f 'printrcy.c' || echo '$(srcdir)/'`printrcy.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgutenprintui2_la-printrcy.Tpo" "$(DEPDIR)/libgutenprintui2_la-printrcy.Plo"; else rm -f "$(DEPDIR)/libgutenprintui2_la-printrcy.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='printrcy.c' object='libgutenprintui2_la-printrcy.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui2_la_CFLAGS) $(CFLAGS) -c -o libgutenprintui2_la-printrcy.lo `test -f 'printrcy.c' || echo '$(srcdir)/'`printrcy.c
+
+libgutenprintui2_la-printrcl.lo: printrcl.c
+@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui2_la_CFLAGS) $(CFLAGS) -MT libgutenprintui2_la-printrcl.lo -MD -MP -MF "$(DEPDIR)/libgutenprintui2_la-printrcl.Tpo" -c -o libgutenprintui2_la-printrcl.lo `test -f 'printrcl.c' || echo '$(srcdir)/'`printrcl.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgutenprintui2_la-printrcl.Tpo" "$(DEPDIR)/libgutenprintui2_la-printrcl.Plo"; else rm -f "$(DEPDIR)/libgutenprintui2_la-printrcl.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='printrcl.c' object='libgutenprintui2_la-printrcl.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui2_la_CFLAGS) $(CFLAGS) -c -o libgutenprintui2_la-printrcl.lo `test -f 'printrcl.c' || echo '$(srcdir)/'`printrcl.c
+
+libgutenprintui2_la-panel.lo: panel.c
+@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui2_la_CFLAGS) $(CFLAGS) -MT libgutenprintui2_la-panel.lo -MD -MP -MF "$(DEPDIR)/libgutenprintui2_la-panel.Tpo" -c -o libgutenprintui2_la-panel.lo `test -f 'panel.c' || echo '$(srcdir)/'`panel.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgutenprintui2_la-panel.Tpo" "$(DEPDIR)/libgutenprintui2_la-panel.Plo"; else rm -f "$(DEPDIR)/libgutenprintui2_la-panel.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='panel.c' object='libgutenprintui2_la-panel.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui2_la_CFLAGS) $(CFLAGS) -c -o libgutenprintui2_la-panel.lo `test -f 'panel.c' || echo '$(srcdir)/'`panel.c
+
+libgutenprintui2_la-plist.lo: plist.c
+@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui2_la_CFLAGS) $(CFLAGS) -MT libgutenprintui2_la-plist.lo -MD -MP -MF "$(DEPDIR)/libgutenprintui2_la-plist.Tpo" -c -o libgutenprintui2_la-plist.lo `test -f 'plist.c' || echo '$(srcdir)/'`plist.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgutenprintui2_la-plist.Tpo" "$(DEPDIR)/libgutenprintui2_la-plist.Plo"; else rm -f "$(DEPDIR)/libgutenprintui2_la-plist.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='plist.c' object='libgutenprintui2_la-plist.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui2_la_CFLAGS) $(CFLAGS) -c -o libgutenprintui2_la-plist.lo `test -f 'plist.c' || echo '$(srcdir)/'`plist.c
+
+libgutenprintui2_la-ui-utils.lo: ui-utils.c
+@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui2_la_CFLAGS) $(CFLAGS) -MT libgutenprintui2_la-ui-utils.lo -MD -MP -MF "$(DEPDIR)/libgutenprintui2_la-ui-utils.Tpo" -c -o libgutenprintui2_la-ui-utils.lo `test -f 'ui-utils.c' || echo '$(srcdir)/'`ui-utils.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgutenprintui2_la-ui-utils.Tpo" "$(DEPDIR)/libgutenprintui2_la-ui-utils.Plo"; else rm -f "$(DEPDIR)/libgutenprintui2_la-ui-utils.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ui-utils.c' object='libgutenprintui2_la-ui-utils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui2_la_CFLAGS) $(CFLAGS) -c -o libgutenprintui2_la-ui-utils.lo `test -f 'ui-utils.c' || echo '$(srcdir)/'`ui-utils.c
+
+libgutenprintui2_la-print-image-thumbnail.lo: print-image-thumbnail.c
+@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui2_la_CFLAGS) $(CFLAGS) -MT libgutenprintui2_la-print-image-thumbnail.lo -MD -MP -MF "$(DEPDIR)/libgutenprintui2_la-print-image-thumbnail.Tpo" -c -o libgutenprintui2_la-print-image-thumbnail.lo `test -f 'print-image-thumbnail.c' || echo '$(srcdir)/'`print-image-thumbnail.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgutenprintui2_la-print-image-thumbnail.Tpo" "$(DEPDIR)/libgutenprintui2_la-print-image-thumbnail.Plo"; else rm -f "$(DEPDIR)/libgutenprintui2_la-print-image-thumbnail.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='print-image-thumbnail.c' object='libgutenprintui2_la-print-image-thumbnail.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui2_la_CFLAGS) $(CFLAGS) -c -o libgutenprintui2_la-print-image-thumbnail.lo `test -f 'print-image-thumbnail.c' || echo '$(srcdir)/'`print-image-thumbnail.c
+
+libgutenprintui2_la-curve.lo: curve.c
+@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui2_la_CFLAGS) $(CFLAGS) -MT libgutenprintui2_la-curve.lo -MD -MP -MF "$(DEPDIR)/libgutenprintui2_la-curve.Tpo" -c -o libgutenprintui2_la-curve.lo `test -f 'curve.c' || echo '$(srcdir)/'`curve.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgutenprintui2_la-curve.Tpo" "$(DEPDIR)/libgutenprintui2_la-curve.Plo"; else rm -f "$(DEPDIR)/libgutenprintui2_la-curve.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='curve.c' object='libgutenprintui2_la-curve.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui2_la_CFLAGS) $(CFLAGS) -c -o libgutenprintui2_la-curve.lo `test -f 'curve.c' || echo '$(srcdir)/'`curve.c
+
+libgutenprintui2_la-gammacurve.lo: gammacurve.c
+@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui2_la_CFLAGS) $(CFLAGS) -MT libgutenprintui2_la-gammacurve.lo -MD -MP -MF "$(DEPDIR)/libgutenprintui2_la-gammacurve.Tpo" -c -o libgutenprintui2_la-gammacurve.lo `test -f 'gammacurve.c' || echo '$(srcdir)/'`gammacurve.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgutenprintui2_la-gammacurve.Tpo" "$(DEPDIR)/libgutenprintui2_la-gammacurve.Plo"; else rm -f "$(DEPDIR)/libgutenprintui2_la-gammacurve.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gammacurve.c' object='libgutenprintui2_la-gammacurve.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui2_la_CFLAGS) $(CFLAGS) -c -o libgutenprintui2_la-gammacurve.lo `test -f 'gammacurve.c' || echo '$(srcdir)/'`gammacurve.c
+
+libgutenprintui2_la-typebuiltins.lo: typebuiltins.c
+@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui2_la_CFLAGS) $(CFLAGS) -MT libgutenprintui2_la-typebuiltins.lo -MD -MP -MF "$(DEPDIR)/libgutenprintui2_la-typebuiltins.Tpo" -c -o libgutenprintui2_la-typebuiltins.lo `test -f 'typebuiltins.c' || echo '$(srcdir)/'`typebuiltins.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgutenprintui2_la-typebuiltins.Tpo" "$(DEPDIR)/libgutenprintui2_la-typebuiltins.Plo"; else rm -f "$(DEPDIR)/libgutenprintui2_la-typebuiltins.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='typebuiltins.c' object='libgutenprintui2_la-typebuiltins.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgutenprintui2_la_CFLAGS) $(CFLAGS) -c -o libgutenprintui2_la-typebuiltins.lo `test -f 'typebuiltins.c' || echo '$(srcdir)/'`typebuiltins.c
+
+.l.c:
+ $(LEXCOMPILE) $<
+ sed '/^#/ s|$(LEX_OUTPUT_ROOT)\.c|$@|' $(LEX_OUTPUT_ROOT).c >$@
+ rm -f $(LEX_OUTPUT_ROOT).c
+
+.y.c:
+ $(YACCCOMPILE) $<
+ if test -f y.tab.h; then \
+ to=`echo "$*_H" | sed \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
+ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`; \
+ sed -e "/^#/!b" -e "s/Y_TAB_H/$$to/g" -e "s|y\.tab\.h|$*.h|" \
+ y.tab.h >$*.ht; \
+ rm -f y.tab.h; \
+ if cmp -s $*.ht $*.h; then \
+ rm -f $*.ht ;\
+ else \
+ mv $*.ht $*.h; \
+ fi; \
+ fi
+ if test -f y.output; then \
+ mv y.output $*.output; \
+ fi
+ sed '/^#/ s|y\.tab\.c|$@|' y.tab.c >$@t && mv $@t $@
+ rm -f y.tab.c
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkgconfigdataDATA: $(pkgconfigdata_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgconfigdatadir)" || $(mkdir_p) "$(DESTDIR)$(pkgconfigdatadir)"
+ @list='$(pkgconfigdata_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgconfigdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgconfigdatadir)/$$f'"; \
+ $(pkgconfigdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgconfigdatadir)/$$f"; \
+ done
+
+uninstall-pkgconfigdataDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkgconfigdata_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgconfigdatadir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgconfigdatadir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(mkdir_p) $(distdir)/../../scripts
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdatadir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -rm -f printrcl.c
+ -rm -f printrcy.c
+ -rm -f printrcy.h
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgconfigdataDATA
+
+install-exec-am: install-libLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES \
+ uninstall-pkgconfigdataDATA
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am \
+ install-libLTLIBRARIES install-man install-pkgconfigdataDATA \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags uninstall uninstall-am \
+ uninstall-info-am uninstall-libLTLIBRARIES \
+ uninstall-pkgconfigdataDATA
+
+
+@SET_MAKE@
+
+export STP_MODULE_PATH = $(top_builddir)/src/main/.libs:$(top_builddir)/src/main
+export STP_DATA_PATH = $(top_srcdir)/src/main
+
+# Rules
+
+$(top_builddir)/src/main/libgutenprint.la:
+ cd $(top_builddir)/src/main; \
+ $(MAKE)
+
+$(top_builddir)/src/gutenprintui/libgutenprintui.la:
+ cd $(top_builddir)/src/gutenprintui; \
+ $(MAKE)
+
+$(top_builddir)/src/gutenprintui2/libgutenprintui2.la:
+ cd $(top_builddir)/src/gutenprintui2; \
+ $(MAKE)
+
+printrcl.o: printrcy.o
+plist.o: printrcy.o
+
+# Really need to depend upon $(stpui_public_h_sources) here...
+$(srcdir)/typebuiltins.c: $(typebuiltins_extra_deps)
+ ( cd $(srcdir) && $(GLIB_MKENUMS) \
+ --fhead "#include <gutenprintui2/gutenprintui.h>" \
+ --fprod "\n/* enumerations from \"@filename@\" */" \
+ --vhead "GType\n@enum_name@_get_type (void)\n{\n static GType etype = 0;\n if (etype == 0) {\n static const G@Type@Value values[] = {" \
+ --vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \
+ --vtail " { 0, NULL, NULL }\n };\n etype = g_@type@_register_static (\"@EnumName@\", values);\n }\n return etype;\n}\n" \
+ $(stpui_public_h_sources) ) > $@
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/gutenprintui2/curve.c b/src/gutenprintui2/curve.c
new file mode 100644
index 0000000..6f89a53
--- /dev/null
+++ b/src/gutenprintui2/curve.c
@@ -0,0 +1,1055 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 1997 David Mosberger
+ * 2004 Roger Leigh
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
+ * file for a list of people on the GTK+ Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
+/*
+ * Incorporated into Gutenprint by Roger Leigh in 2004. Subsequent
+ * changes are by the Gutenprint team.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include <gtk/gtkmain.h>
+#include <gtk/gtkradiobutton.h>
+#include <gtk/gtktable.h>
+
+#include <gutenprint/gutenprint-intl-internal.h>
+
+#include <gutenprintui2/curve.h>
+#include <gutenprintui2/typebuiltins.h>
+
+#define RADIUS 3 /* radius of the control points */
+#define MIN_DISTANCE 8 /* min distance between control points */
+
+#define GRAPH_MASK (GDK_EXPOSURE_MASK | \
+ GDK_POINTER_MOTION_MASK | \
+ GDK_POINTER_MOTION_HINT_MASK | \
+ GDK_ENTER_NOTIFY_MASK | \
+ GDK_BUTTON_PRESS_MASK | \
+ GDK_BUTTON_RELEASE_MASK | \
+ GDK_BUTTON1_MOTION_MASK)
+
+enum {
+ PROP_0,
+ PROP_CURVE_TYPE,
+ PROP_MIN_X,
+ PROP_MAX_X,
+ PROP_MIN_Y,
+ PROP_MAX_Y
+};
+
+static GtkDrawingAreaClass *parent_class = NULL;
+static guint curve_type_changed_signal = 0;
+
+
+/* forward declarations: */
+static void stpui_curve_class_init (StpuiCurveClass *class);
+static void stpui_curve_init (StpuiCurve *curve);
+static void stpui_curve_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void stpui_curve_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static void stpui_curve_finalize (GObject *object);
+static gint stpui_curve_graph_events (GtkWidget *widget,
+ GdkEvent *event,
+ StpuiCurve *c);
+static void stpui_curve_size_graph (StpuiCurve *curve);
+
+GType
+stpui_curve_get_type (void)
+{
+ static GType curve_type = 0;
+
+ if (!curve_type)
+ {
+ static const GTypeInfo curve_info =
+ {
+ sizeof (StpuiCurveClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) stpui_curve_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (StpuiCurve),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) stpui_curve_init,
+ };
+
+ curve_type = g_type_register_static (GTK_TYPE_DRAWING_AREA,
+ "StpuiCurve",
+ &curve_info, 0);
+ }
+ return curve_type;
+}
+
+static void
+stpui_curve_class_init (StpuiCurveClass *class)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+
+ parent_class = g_type_class_peek_parent (class);
+
+ gobject_class->finalize = stpui_curve_finalize;
+
+ gobject_class->set_property = stpui_curve_set_property;
+ gobject_class->get_property = stpui_curve_get_property;
+
+ g_object_class_install_property (gobject_class,
+ PROP_CURVE_TYPE,
+ g_param_spec_enum ("curve_type",
+ _("Curve type"),
+ _("Is this curve linear, spline interpolated, or free-form"),
+ STPUI_TYPE_CURVE_TYPE,
+ STPUI_CURVE_TYPE_LINEAR,
+ G_PARAM_READABLE |
+ G_PARAM_WRITABLE));
+ g_object_class_install_property (gobject_class,
+ PROP_MIN_X,
+ g_param_spec_float ("min_x",
+ _("Minimum X"),
+ _("Minimum possible value for X"),
+ -G_MAXFLOAT,
+ G_MAXFLOAT,
+ 0.0,
+ G_PARAM_READABLE |
+ G_PARAM_WRITABLE));
+ g_object_class_install_property (gobject_class,
+ PROP_MAX_X,
+ g_param_spec_float ("max_x",
+ _("Maximum X"),
+ _("Maximum possible X value"),
+ -G_MAXFLOAT,
+ G_MAXFLOAT,
+ 1.0,
+ G_PARAM_READABLE |
+ G_PARAM_WRITABLE));
+ g_object_class_install_property (gobject_class,
+ PROP_MIN_Y,
+ g_param_spec_float ("min_y",
+ _("Minimum Y"),
+ _("Minimum possible value for Y"),
+ -G_MAXFLOAT,
+ G_MAXFLOAT,
+ 0.0,
+ G_PARAM_READABLE |
+ G_PARAM_WRITABLE));
+ g_object_class_install_property (gobject_class,
+ PROP_MAX_Y,
+ g_param_spec_float ("max_y",
+ _("Maximum Y"),
+ _("Maximum possible value for Y"),
+ -G_MAXFLOAT,
+ G_MAXFLOAT,
+ 1.0,
+ G_PARAM_READABLE |
+ G_PARAM_WRITABLE));
+
+ curve_type_changed_signal =
+ g_signal_new ("curve_type_changed",
+ G_OBJECT_CLASS_TYPE (gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (StpuiCurveClass, curve_type_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+}
+
+static void
+stpui_curve_init (StpuiCurve *curve)
+{
+ gint old_mask;
+
+ curve->cursor_type = GDK_TOP_LEFT_ARROW;
+ curve->pixmap = NULL;
+ curve->curve_type = STPUI_CURVE_TYPE_SPLINE;
+ curve->height = 0;
+ curve->grab_point = -1;
+
+ curve->num_points = 0;
+ curve->point = 0;
+
+ curve->num_ctlpoints = 0;
+ curve->ctlpoint = NULL;
+
+ curve->min_x = 0.0;
+ curve->max_x = 1.0;
+ curve->min_y = 0.0;
+ curve->max_y = 1.0;
+
+ old_mask = gtk_widget_get_events (GTK_WIDGET (curve));
+ gtk_widget_set_events (GTK_WIDGET (curve), old_mask | GRAPH_MASK);
+ g_signal_connect (curve, "event",
+ G_CALLBACK (stpui_curve_graph_events), curve);
+ stpui_curve_size_graph (curve);
+}
+
+static void
+stpui_curve_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ StpuiCurve *curve = STPUI_CURVE (object);
+
+ switch (prop_id)
+ {
+ case PROP_CURVE_TYPE:
+ stpui_curve_set_curve_type (curve, g_value_get_enum (value));
+ break;
+ case PROP_MIN_X:
+ stpui_curve_set_range (curve, g_value_get_float (value), curve->max_x,
+ curve->min_y, curve->max_y);
+ break;
+ case PROP_MAX_X:
+ stpui_curve_set_range (curve, curve->min_x, g_value_get_float (value),
+ curve->min_y, curve->max_y);
+ break;
+ case PROP_MIN_Y:
+ stpui_curve_set_range (curve, curve->min_x, curve->max_x,
+ g_value_get_float (value), curve->max_y);
+ break;
+ case PROP_MAX_Y:
+ stpui_curve_set_range (curve, curve->min_x, curve->max_x,
+ curve->min_y, g_value_get_float (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+stpui_curve_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ StpuiCurve *curve = STPUI_CURVE (object);
+
+ switch (prop_id)
+ {
+ case PROP_CURVE_TYPE:
+ g_value_set_enum (value, curve->curve_type);
+ break;
+ case PROP_MIN_X:
+ g_value_set_float (value, curve->min_x);
+ break;
+ case PROP_MAX_X:
+ g_value_set_float (value, curve->max_x);
+ break;
+ case PROP_MIN_Y:
+ g_value_set_float (value, curve->min_y);
+ break;
+ case PROP_MAX_Y:
+ g_value_set_float (value, curve->max_y);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static int
+project (gfloat value, gfloat min, gfloat max, int norm)
+{
+ return (norm - 1) * ((value - min) / (max - min)) + 0.5;
+}
+
+static gfloat
+unproject (gint value, gfloat min, gfloat max, int norm)
+{
+ return value / (gfloat) (norm - 1) * (max - min) + min;
+}
+
+/* Solve the tridiagonal equation system that determines the second
+ derivatives for the interpolation points. (Based on Numerical
+ Recipies 2nd Edition.) */
+static void
+spline_solve (int n, gfloat x[], gfloat y[], gfloat y2[])
+{
+ gfloat p, sig, *u;
+ gint i, k;
+
+ u = g_malloc ((n - 1) * sizeof (u[0]));
+
+ y2[0] = u[0] = 0.0; /* set lower boundary condition to "natural" */
+
+ for (i = 1; i < n - 1; ++i)
+ {
+ sig = (x[i] - x[i - 1]) / (x[i + 1] - x[i - 1]);
+ p = sig * y2[i - 1] + 2.0;
+ y2[i] = (sig - 1.0) / p;
+ u[i] = ((y[i + 1] - y[i])
+ / (x[i + 1] - x[i]) - (y[i] - y[i - 1]) / (x[i] - x[i - 1]));
+ u[i] = (6.0 * u[i] / (x[i + 1] - x[i - 1]) - sig * u[i - 1]) / p;
+ }
+
+ y2[n - 1] = 0.0;
+ for (k = n - 2; k >= 0; --k)
+ y2[k] = y2[k] * y2[k + 1] + u[k];
+
+ g_free (u);
+}
+
+static gfloat
+spline_eval (int n, gfloat x[], gfloat y[], gfloat y2[], gfloat val)
+{
+ gint k_lo, k_hi, k;
+ gfloat h, b, a;
+
+ /* do a binary search for the right interval: */
+ k_lo = 0; k_hi = n - 1;
+ while (k_hi - k_lo > 1)
+ {
+ k = (k_hi + k_lo) / 2;
+ if (x[k] > val)
+ k_hi = k;
+ else
+ k_lo = k;
+ }
+
+ h = x[k_hi] - x[k_lo];
+ g_assert (h > 0.0);
+
+ a = (x[k_hi] - val) / h;
+ b = (val - x[k_lo]) / h;
+ return a*y[k_lo] + b*y[k_hi] +
+ ((a*a*a - a)*y2[k_lo] + (b*b*b - b)*y2[k_hi]) * (h*h)/6.0;
+}
+
+static void
+stpui_curve_interpolate (StpuiCurve *c, gint width, gint height)
+{
+ gfloat *vector;
+ int i;
+
+ vector = g_malloc (width * sizeof (vector[0]));
+
+ stpui_curve_get_vector (c, width, vector);
+
+ c->height = height;
+ if (c->num_points != width)
+ {
+ c->num_points = width;
+ if (c->point)
+ g_free (c->point);
+ c->point = g_malloc (c->num_points * sizeof (c->point[0]));
+ }
+
+ for (i = 0; i < width; ++i)
+ {
+ c->point[i].x = RADIUS + i;
+ c->point[i].y = RADIUS + height
+ - project (vector[i], c->min_y, c->max_y, height);
+ }
+
+ g_free (vector);
+}
+
+static void
+stpui_curve_draw (StpuiCurve *c, gint width, gint height)
+{
+ GtkStateType state;
+ GtkStyle *style;
+ gint i;
+
+ if (!c->pixmap)
+ return;
+
+ if (c->height != height || c->num_points != width)
+ stpui_curve_interpolate (c, width, height);
+
+ state = GTK_STATE_NORMAL;
+ if (!GTK_WIDGET_IS_SENSITIVE (GTK_WIDGET (c)))
+ state = GTK_STATE_INSENSITIVE;
+
+ style = GTK_WIDGET (c)->style;
+
+ /* clear the pixmap: */
+ gtk_paint_flat_box (style, c->pixmap, GTK_STATE_NORMAL, GTK_SHADOW_NONE,
+ NULL, GTK_WIDGET (c), "curve_bg",
+ 0, 0, width + RADIUS * 2, height + RADIUS * 2);
+ /* draw the grid lines: (XXX make more meaningful) */
+ for (i = 0; i < 5; i++)
+ {
+ gdk_draw_line (c->pixmap, style->dark_gc[state],
+ RADIUS, i * (height / 4.0) + RADIUS,
+ width + RADIUS, i * (height / 4.0) + RADIUS);
+ gdk_draw_line (c->pixmap, style->dark_gc[state],
+ i * (width / 4.0) + RADIUS, RADIUS,
+ i * (width / 4.0) + RADIUS, height + RADIUS);
+ }
+
+ gdk_draw_points (c->pixmap, style->fg_gc[state], c->point, c->num_points);
+ if (c->curve_type != STPUI_CURVE_TYPE_FREE)
+ for (i = 0; i < c->num_ctlpoints; ++i)
+ {
+ gint x, y;
+
+ if (c->ctlpoint[i][0] < c->min_x)
+ continue;
+
+ x = project (c->ctlpoint[i][0], c->min_x, c->max_x,
+ width);
+ y = height -
+ project (c->ctlpoint[i][1], c->min_y, c->max_y,
+ height);
+
+ /* draw a bullet: */
+ gdk_draw_arc (c->pixmap, style->fg_gc[state], TRUE, x, y,
+ RADIUS * 2, RADIUS*2, 0, 360*64);
+ }
+ gdk_draw_drawable (GTK_WIDGET (c)->window, style->fg_gc[state], c->pixmap,
+ 0, 0, 0, 0, width + RADIUS * 2, height + RADIUS * 2);
+}
+
+static gint
+stpui_curve_graph_events (GtkWidget *widget,
+ GdkEvent *event,
+ StpuiCurve *c)
+{
+ GdkCursorType new_type = c->cursor_type;
+ gint i, src, dst, leftbound, rightbound;
+ GdkEventButton *bevent;
+ GdkEventMotion *mevent;
+ GtkWidget *w;
+ gint tx, ty;
+ gint cx, x, y, width, height;
+ gint closest_point = 0;
+ gfloat rx, ry, min_x;
+ guint distance;
+ gint x1, x2, y1, y2;
+ gint retval = FALSE;
+
+ w = GTK_WIDGET (c);
+ width = w->allocation.width - RADIUS * 2;
+ height = w->allocation.height - RADIUS * 2;
+
+ if ((width < 0) || (height < 0))
+ return FALSE;
+
+ /* get the pointer position */
+ gdk_window_get_pointer (w->window, &tx, &ty, NULL);
+ x = CLAMP ((tx - RADIUS), 0, width-1);
+ y = CLAMP ((ty - RADIUS), 0, height-1);
+
+ min_x = c->min_x;
+
+ distance = ~0U;
+ for (i = 0; i < c->num_ctlpoints; ++i)
+ {
+ cx = project (c->ctlpoint[i][0], min_x, c->max_x, width);
+ if ((guint) abs (x - cx) < distance)
+ {
+ distance = abs (x - cx);
+ closest_point = i;
+ }
+ }
+
+ switch (event->type)
+ {
+ case GDK_CONFIGURE:
+ if (c->pixmap)
+ g_object_unref (c->pixmap);
+ c->pixmap = NULL;
+ /* fall through */
+ case GDK_EXPOSE:
+ if (!c->pixmap)
+ c->pixmap = gdk_pixmap_new (w->window,
+ w->allocation.width,
+ w->allocation.height, -1);
+ stpui_curve_draw (c, width, height);
+ break;
+
+ case GDK_BUTTON_PRESS:
+ gtk_grab_add (widget);
+
+ bevent = (GdkEventButton *) event;
+ new_type = GDK_TCROSS;
+
+ switch (c->curve_type)
+ {
+ case STPUI_CURVE_TYPE_LINEAR:
+ case STPUI_CURVE_TYPE_SPLINE:
+ if (distance > MIN_DISTANCE)
+ {
+ /* insert a new control point */
+ if (c->num_ctlpoints > 0)
+ {
+ cx = project (c->ctlpoint[closest_point][0], min_x,
+ c->max_x, width);
+ if (x > cx)
+ ++closest_point;
+ }
+ ++c->num_ctlpoints;
+ c->ctlpoint =
+ g_realloc (c->ctlpoint,
+ c->num_ctlpoints * sizeof (*c->ctlpoint));
+ for (i = c->num_ctlpoints - 1; i > closest_point; --i)
+ memcpy (c->ctlpoint + i, c->ctlpoint + i - 1,
+ sizeof (*c->ctlpoint));
+ }
+ c->grab_point = closest_point;
+ c->ctlpoint[c->grab_point][0] =
+ unproject (x, min_x, c->max_x, width);
+ c->ctlpoint[c->grab_point][1] =
+ unproject (height - y, c->min_y, c->max_y, height);
+
+ stpui_curve_interpolate (c, width, height);
+ break;
+
+ case STPUI_CURVE_TYPE_FREE:
+ c->point[x].x = RADIUS + x;
+ c->point[x].y = RADIUS + y;
+ c->grab_point = x;
+ c->last = y;
+ break;
+ }
+ stpui_curve_draw (c, width, height);
+ retval = TRUE;
+ break;
+
+ case GDK_BUTTON_RELEASE:
+ gtk_grab_remove (widget);
+
+ /* delete inactive points: */
+ if (c->curve_type != STPUI_CURVE_TYPE_FREE)
+ {
+ for (src = dst = 0; src < c->num_ctlpoints; ++src)
+ {
+ if (c->ctlpoint[src][0] >= min_x)
+ {
+ memcpy (c->ctlpoint + dst, c->ctlpoint + src,
+ sizeof (*c->ctlpoint));
+ ++dst;
+ }
+ }
+ if (dst < src)
+ {
+ c->num_ctlpoints -= (src - dst);
+ if (c->num_ctlpoints <= 0)
+ {
+ c->num_ctlpoints = 1;
+ c->ctlpoint[0][0] = min_x;
+ c->ctlpoint[0][1] = c->min_y;
+ stpui_curve_interpolate (c, width, height);
+ stpui_curve_draw (c, width, height);
+ }
+ c->ctlpoint =
+ g_realloc (c->ctlpoint,
+ c->num_ctlpoints * sizeof (*c->ctlpoint));
+ }
+ }
+ new_type = GDK_FLEUR;
+ c->grab_point = -1;
+ retval = TRUE;
+ break;
+
+ case GDK_MOTION_NOTIFY:
+ mevent = (GdkEventMotion *) event;
+
+ switch (c->curve_type)
+ {
+ case STPUI_CURVE_TYPE_LINEAR:
+ case STPUI_CURVE_TYPE_SPLINE:
+ if (c->grab_point == -1)
+ {
+ /* if no point is grabbed... */
+ if (distance <= MIN_DISTANCE)
+ new_type = GDK_FLEUR;
+ else
+ new_type = GDK_TCROSS;
+ }
+ else
+ {
+ /* drag the grabbed point */
+ new_type = GDK_TCROSS;
+
+ leftbound = -MIN_DISTANCE;
+ if (c->grab_point > 0)
+ leftbound = project (c->ctlpoint[c->grab_point - 1][0],
+ min_x, c->max_x, width);
+
+ rightbound = width + RADIUS * 2 + MIN_DISTANCE;
+ if (c->grab_point + 1 < c->num_ctlpoints)
+ rightbound = project (c->ctlpoint[c->grab_point + 1][0],
+ min_x, c->max_x, width);
+
+ if (tx <= leftbound || tx >= rightbound
+ || ty > height + RADIUS * 2 + MIN_DISTANCE
+ || ty < -MIN_DISTANCE)
+ c->ctlpoint[c->grab_point][0] = min_x - 1.0;
+ else
+ {
+ rx = unproject (x, min_x, c->max_x, width);
+ ry = unproject (height - y, c->min_y, c->max_y, height);
+ c->ctlpoint[c->grab_point][0] = rx;
+ c->ctlpoint[c->grab_point][1] = ry;
+ }
+ stpui_curve_interpolate (c, width, height);
+ stpui_curve_draw (c, width, height);
+ }
+ break;
+
+ case STPUI_CURVE_TYPE_FREE:
+ if (c->grab_point != -1)
+ {
+ if (c->grab_point > x)
+ {
+ x1 = x;
+ x2 = c->grab_point;
+ y1 = y;
+ y2 = c->last;
+ }
+ else
+ {
+ x1 = c->grab_point;
+ x2 = x;
+ y1 = c->last;
+ y2 = y;
+ }
+
+ if (x2 != x1)
+ for (i = x1; i <= x2; i++)
+ {
+ c->point[i].x = RADIUS + i;
+ c->point[i].y = RADIUS +
+ (y1 + ((y2 - y1) * (i - x1)) / (x2 - x1));
+ }
+ else
+ {
+ c->point[x].x = RADIUS + x;
+ c->point[x].y = RADIUS + y;
+ }
+ c->grab_point = x;
+ c->last = y;
+ stpui_curve_draw (c, width, height);
+ }
+ if (mevent->state & GDK_BUTTON1_MASK)
+ new_type = GDK_TCROSS;
+ else
+ new_type = GDK_PENCIL;
+ break;
+ }
+ if (new_type != (GdkCursorType) c->cursor_type)
+ {
+ GdkCursor *cursor;
+
+ c->cursor_type = new_type;
+
+ cursor = gdk_cursor_new_for_display (gtk_widget_get_display (w),
+ c->cursor_type);
+ gdk_window_set_cursor (w->window, cursor);
+ gdk_cursor_unref (cursor);
+ }
+ retval = TRUE;
+ break;
+
+ default:
+ break;
+ }
+
+ return retval;
+}
+
+void
+stpui_curve_set_curve_type (StpuiCurve *c, StpuiCurveType new_type)
+{
+ gfloat rx, dx;
+ gint x, i;
+
+ if (new_type != c->curve_type)
+ {
+ gint width, height;
+
+ width = GTK_WIDGET (c)->allocation.width - RADIUS * 2;
+ height = GTK_WIDGET (c)->allocation.height - RADIUS * 2;
+
+ if (new_type == STPUI_CURVE_TYPE_FREE)
+ {
+ stpui_curve_interpolate (c, width, height);
+ c->curve_type = new_type;
+ }
+ else if (c->curve_type == STPUI_CURVE_TYPE_FREE)
+ {
+ if (c->ctlpoint)
+ g_free (c->ctlpoint);
+ c->num_ctlpoints = 9;
+ c->ctlpoint = g_malloc (c->num_ctlpoints * sizeof (*c->ctlpoint));
+
+ rx = 0.0;
+ dx = (width - 1) / (gfloat) (c->num_ctlpoints - 1);
+
+ for (i = 0; i < c->num_ctlpoints; ++i, rx += dx)
+ {
+ x = (int) (rx + 0.5);
+ c->ctlpoint[i][0] =
+ unproject (x, c->min_x, c->max_x, width);
+ c->ctlpoint[i][1] =
+ unproject (RADIUS + height - c->point[x].y,
+ c->min_y, c->max_y, height);
+ }
+ c->curve_type = new_type;
+ stpui_curve_interpolate (c, width, height);
+ }
+ else
+ {
+ c->curve_type = new_type;
+ stpui_curve_interpolate (c, width, height);
+ }
+ g_signal_emit (c, curve_type_changed_signal, 0);
+ g_object_notify (G_OBJECT (c), "curve_type");
+ stpui_curve_draw (c, width, height);
+ }
+}
+
+static void
+stpui_curve_size_graph (StpuiCurve *curve)
+{
+ gint width, height;
+ gfloat aspect;
+ GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (curve));
+
+ width = (curve->max_x - curve->min_x) + 1;
+ height = (curve->max_y - curve->min_y) + 1;
+ aspect = width / (gfloat) height;
+ if (width > gdk_screen_get_width (screen) / 4)
+ width = gdk_screen_get_width (screen) / 4;
+ if (height > gdk_screen_get_height (screen) / 4)
+ height = gdk_screen_get_height (screen) / 4;
+
+ if (aspect < 1.0)
+ width = height * aspect;
+ else
+ height = width / aspect;
+
+ gtk_widget_set_size_request (GTK_WIDGET (curve),
+ width + RADIUS * 2,
+ height + RADIUS * 2);
+}
+
+static void
+stpui_curve_reset_vector (StpuiCurve *curve)
+{
+ if (curve->ctlpoint)
+ g_free (curve->ctlpoint);
+
+ curve->num_ctlpoints = 2;
+ curve->ctlpoint = g_malloc (2 * sizeof (curve->ctlpoint[0]));
+ curve->ctlpoint[0][0] = curve->min_x;
+ curve->ctlpoint[0][1] = curve->min_y;
+ curve->ctlpoint[1][0] = curve->max_x;
+ curve->ctlpoint[1][1] = curve->max_y;
+
+ if (curve->pixmap)
+ {
+ gint width, height;
+
+ width = GTK_WIDGET (curve)->allocation.width - RADIUS * 2;
+ height = GTK_WIDGET (curve)->allocation.height - RADIUS * 2;
+
+ if (curve->curve_type == STPUI_CURVE_TYPE_FREE)
+ {
+ curve->curve_type = STPUI_CURVE_TYPE_LINEAR;
+ stpui_curve_interpolate (curve, width, height);
+ curve->curve_type = STPUI_CURVE_TYPE_FREE;
+ }
+ else
+ stpui_curve_interpolate (curve, width, height);
+ stpui_curve_draw (curve, width, height);
+ }
+}
+
+void
+stpui_curve_reset (StpuiCurve *c)
+{
+ StpuiCurveType old_type;
+
+ old_type = c->curve_type;
+ c->curve_type = STPUI_CURVE_TYPE_SPLINE;
+ stpui_curve_reset_vector (c);
+
+ if (old_type != STPUI_CURVE_TYPE_SPLINE)
+ {
+ g_signal_emit (c, curve_type_changed_signal, 0);
+ g_object_notify (G_OBJECT (c), "curve_type");
+ }
+}
+
+void
+stpui_curve_set_gamma (StpuiCurve *c, gfloat gamma)
+{
+ gfloat x, one_over_gamma, height, one_over_width;
+ StpuiCurveType old_type;
+ gint i;
+
+ if (c->num_points < 2)
+ return;
+
+ old_type = c->curve_type;
+ c->curve_type = STPUI_CURVE_TYPE_FREE;
+
+ if (gamma <= 0)
+ one_over_gamma = 1.0;
+ else
+ one_over_gamma = 1.0 / gamma;
+ one_over_width = 1.0 / (c->num_points - 1);
+ height = c->height;
+ for (i = 0; i < c->num_points; ++i)
+ {
+ x = (gfloat) i / (c->num_points - 1);
+ c->point[i].x = RADIUS + i;
+ c->point[i].y =
+ RADIUS + (height * (1.0 - pow (x, one_over_gamma)) + 0.5);
+ }
+
+ if (old_type != STPUI_CURVE_TYPE_FREE)
+ g_signal_emit (c, curve_type_changed_signal, 0);
+
+ stpui_curve_draw (c, c->num_points, c->height);
+}
+
+void
+stpui_curve_set_range (StpuiCurve *curve,
+ gfloat min_x,
+ gfloat max_x,
+ gfloat min_y,
+ gfloat max_y)
+{
+ g_object_freeze_notify (G_OBJECT (curve));
+ if (curve->min_x != min_x) {
+ curve->min_x = min_x;
+ g_object_notify (G_OBJECT (curve), "min_x");
+ }
+ if (curve->max_x != max_x) {
+ curve->max_x = max_x;
+ g_object_notify (G_OBJECT (curve), "max_x");
+ }
+ if (curve->min_y != min_y) {
+ curve->min_y = min_y;
+ g_object_notify (G_OBJECT (curve), "min_y");
+ }
+ if (curve->max_y != max_y) {
+ curve->max_y = max_y;
+ g_object_notify (G_OBJECT (curve), "max_y");
+ }
+ g_object_thaw_notify (G_OBJECT (curve));
+
+ stpui_curve_size_graph (curve);
+ stpui_curve_reset_vector (curve);
+}
+
+void
+stpui_curve_set_vector (StpuiCurve *c, int veclen, const gfloat vector[])
+{
+ StpuiCurveType old_type;
+ gfloat rx, dx, ry;
+ gint i, height;
+ GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (c));
+
+ old_type = c->curve_type;
+ c->curve_type = STPUI_CURVE_TYPE_FREE;
+
+ if (c->point)
+ height = GTK_WIDGET (c)->allocation.height - RADIUS * 2;
+ else
+ {
+ height = (c->max_y - c->min_y);
+ if (height > gdk_screen_get_height (screen) / 4)
+ height = gdk_screen_get_height (screen) / 4;
+
+ c->height = height;
+ c->num_points = veclen;
+ c->point = g_malloc (c->num_points * sizeof (c->point[0]));
+ }
+ rx = 0;
+ dx = (veclen - 1.0) / (c->num_points - 1.0);
+
+ for (i = 0; i < c->num_points; ++i, rx += dx)
+ {
+ ry = vector[(int) (rx + 0.5)];
+ if (ry > c->max_y) ry = c->max_y;
+ if (ry < c->min_y) ry = c->min_y;
+ c->point[i].x = RADIUS + i;
+ c->point[i].y =
+ RADIUS + height - project (ry, c->min_y, c->max_y, height);
+ }
+ if (old_type != STPUI_CURVE_TYPE_FREE)
+ {
+ g_signal_emit (c, curve_type_changed_signal, 0);
+ g_object_notify (G_OBJECT (c), "curve_type");
+ }
+
+ stpui_curve_draw (c, c->num_points, height);
+}
+
+void
+stpui_curve_get_vector (StpuiCurve *c, int veclen, gfloat vector[])
+{
+ gfloat rx, ry, dx, dy, min_x, delta_x, *mem, *xv, *yv, *y2v, prev;
+ gint dst, i, x, next, num_active_ctlpoints = 0, first_active = -1;
+
+ min_x = c->min_x;
+
+ if (c->curve_type != STPUI_CURVE_TYPE_FREE)
+ {
+ /* count active points: */
+ prev = min_x - 1.0;
+ for (i = num_active_ctlpoints = 0; i < c->num_ctlpoints; ++i)
+ if (c->ctlpoint[i][0] > prev)
+ {
+ if (first_active < 0)
+ first_active = i;
+ prev = c->ctlpoint[i][0];
+ ++num_active_ctlpoints;
+ }
+
+ /* handle degenerate case: */
+ if (num_active_ctlpoints < 2)
+ {
+ if (num_active_ctlpoints > 0)
+ ry = c->ctlpoint[first_active][1];
+ else
+ ry = c->min_y;
+ if (ry < c->min_y) ry = c->min_y;
+ if (ry > c->max_y) ry = c->max_y;
+ for (x = 0; x < veclen; ++x)
+ vector[x] = ry;
+ return;
+ }
+ }
+
+ switch (c->curve_type)
+ {
+ case STPUI_CURVE_TYPE_SPLINE:
+ mem = g_malloc (3 * num_active_ctlpoints * sizeof (gfloat));
+ xv = mem;
+ yv = mem + num_active_ctlpoints;
+ y2v = mem + 2*num_active_ctlpoints;
+
+ prev = min_x - 1.0;
+ for (i = dst = 0; i < c->num_ctlpoints; ++i)
+ if (c->ctlpoint[i][0] > prev)
+ {
+ prev = c->ctlpoint[i][0];
+ xv[dst] = c->ctlpoint[i][0];
+ yv[dst] = c->ctlpoint[i][1];
+ ++dst;
+ }
+
+ spline_solve (num_active_ctlpoints, xv, yv, y2v);
+
+ rx = min_x;
+ dx = (c->max_x - min_x) / (veclen - 1);
+ for (x = 0; x < veclen; ++x, rx += dx)
+ {
+ ry = spline_eval (num_active_ctlpoints, xv, yv, y2v, rx);
+ if (ry < c->min_y) ry = c->min_y;
+ if (ry > c->max_y) ry = c->max_y;
+ vector[x] = ry;
+ }
+
+ g_free (mem);
+ break;
+
+ case STPUI_CURVE_TYPE_LINEAR:
+ dx = (c->max_x - min_x) / (veclen - 1);
+ rx = min_x;
+ ry = c->min_y;
+ dy = 0.0;
+ i = first_active;
+ for (x = 0; x < veclen; ++x, rx += dx)
+ {
+ if (rx >= c->ctlpoint[i][0])
+ {
+ if (rx > c->ctlpoint[i][0])
+ ry = c->min_y;
+ dy = 0.0;
+ next = i + 1;
+ while (next < c->num_ctlpoints
+ && c->ctlpoint[next][0] <= c->ctlpoint[i][0])
+ ++next;
+ if (next < c->num_ctlpoints)
+ {
+ delta_x = c->ctlpoint[next][0] - c->ctlpoint[i][0];
+ dy = ((c->ctlpoint[next][1] - c->ctlpoint[i][1])
+ / delta_x);
+ dy *= dx;
+ ry = c->ctlpoint[i][1];
+ i = next;
+ }
+ }
+ vector[x] = ry;
+ ry += dy;
+ }
+ break;
+
+ case STPUI_CURVE_TYPE_FREE:
+ if (c->point)
+ {
+ rx = 0.0;
+ dx = c->num_points / (double) veclen;
+ for (x = 0; x < veclen; ++x, rx += dx)
+ vector[x] = unproject (RADIUS + c->height - c->point[(int) rx].y,
+ c->min_y, c->max_y,
+ c->height);
+ }
+ else
+ memset (vector, 0, veclen * sizeof (vector[0]));
+ break;
+ }
+}
+
+GtkWidget*
+stpui_curve_new (void)
+{
+ return g_object_new (STPUI_TYPE_CURVE, NULL);
+}
+
+static void
+stpui_curve_finalize (GObject *object)
+{
+ StpuiCurve *curve;
+
+ g_return_if_fail (STPUI_IS_CURVE (object));
+
+ curve = STPUI_CURVE (object);
+ if (curve->pixmap)
+ g_object_unref (curve->pixmap);
+ if (curve->point)
+ g_free (curve->point);
+ if (curve->ctlpoint)
+ g_free (curve->ctlpoint);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
diff --git a/src/gutenprintui2/gammacurve.c b/src/gutenprintui2/gammacurve.c
new file mode 100644
index 0000000..c195b7d
--- /dev/null
+++ b/src/gutenprintui2/gammacurve.c
@@ -0,0 +1,495 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 1997 David Mosberger
+ * 2004 Roger Leigh
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
+ * file for a list of people on the GTK+ Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
+/*
+ * Incorporated into Gutenprint by Roger Leigh in 2004. Subsequent
+ * changes are by the Gutenprint team.
+ */
+
+#include <config.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <gtk/gtkdialog.h>
+#include <gtk/gtkdrawingarea.h>
+#include <gtk/gtkentry.h>
+#include <gtk/gtkhbox.h>
+#include <gtk/gtkimage.h>
+#include <gtk/gtklabel.h>
+#include <gtk/gtkmain.h>
+#include <gtk/gtkradiobutton.h>
+#include <gtk/gtkstock.h>
+#include <gtk/gtktable.h>
+#include <gtk/gtkvbox.h>
+#include <gtk/gtkwindow.h>
+
+#include <gutenprint/gutenprint-intl-internal.h>
+
+#include <gutenprintui2/curve.h>
+#include <gutenprintui2/gammacurve.h>
+
+static GtkVBoxClass *parent_class = NULL;
+
+
+/* forward declarations: */
+static void stpui_gamma_curve_class_init (StpuiGammaCurveClass *class);
+static void stpui_gamma_curve_init (StpuiGammaCurve *curve);
+static void stpui_gamma_curve_destroy (GtkObject *object);
+
+static void curve_type_changed_callback (GtkWidget *w, gpointer data);
+static void button_realize_callback (GtkWidget *w);
+static void button_toggled_callback (GtkWidget *w, gpointer data);
+static void button_clicked_callback (GtkWidget *w, gpointer data);
+
+enum
+ {
+ LINEAR = 0,
+ SPLINE,
+ FREE,
+ GAMMA,
+ RESET,
+ NUM_XPMS
+ };
+
+static const char *xpm[][27] =
+ {
+ /* spline: */
+ {
+ /* width height ncolors chars_per_pixel */
+ "16 16 4 1",
+ /* colors */
+ ". c None",
+ "B c #000000",
+ "+ c #BC2D2D",
+ "r c #FF0000",
+ /* pixels */
+ "..............BB",
+ ".........rrrrrrB",
+ ".......rr.......",
+ ".....B+.........",
+ "....BBB.........",
+ "....+B..........",
+ "....r...........",
+ "...r............",
+ "...r............",
+ "..r.............",
+ "..r.............",
+ ".r..............",
+ ".r..............",
+ ".r..............",
+ "B+..............",
+ "BB.............."
+ },
+ /* linear: */
+ {
+ /* width height ncolors chars_per_pixel */
+ "16 16 5 1",
+ /* colors */
+ ". c None", /* transparent */
+ "B c #000000",
+ "' c #7F7F7F",
+ "+ c #824141",
+ "r c #FF0000",
+ /* pixels */
+ "..............BB",
+ "..............+B",
+ "..............r.",
+ ".............r..",
+ ".............r..",
+ "....'B'.....r...",
+ "....BBB.....r...",
+ "....+B+....r....",
+ "....r.r....r....",
+ "...r...r..r.....",
+ "...r...r..r.....",
+ "..r.....rB+.....",
+ "..r.....BBB.....",
+ ".r......'B'.....",
+ "B+..............",
+ "BB.............."
+ },
+ /* free: */
+ {
+ /* width height ncolors chars_per_pixel */
+ "16 16 2 1",
+ /* colors */
+ ". c None",
+ "r c #FF0000",
+ /* pixels */
+ "................",
+ "................",
+ "......r.........",
+ "......r.........",
+ ".......r........",
+ ".......r........",
+ ".......r........",
+ "........r.......",
+ "........r.......",
+ "........r.......",
+ ".....r...r.rrrrr",
+ "....r....r......",
+ "...r.....r......",
+ "..r.......r.....",
+ ".r........r.....",
+ "r..............."
+ },
+ /* gamma: */
+ {
+ /* width height ncolors chars_per_pixel */
+ "16 16 10 1",
+ /* colors */
+ ". c None",
+ "B c #000000",
+ "& c #171717",
+ "# c #2F2F2F",
+ "X c #464646",
+ "= c #5E5E5E",
+ "/ c #757575",
+ "+ c #8C8C8C",
+ "- c #A4A4A4",
+ "` c #BBBBBB",
+ /* pixels */
+ "................",
+ "................",
+ "................",
+ "....B=..+B+.....",
+ "....X&`./&-.....",
+ "...../+.XX......",
+ "......B.B+......",
+ "......X.X.......",
+ "......X&+.......",
+ "......-B........",
+ "....../=........",
+ "......#B........",
+ "......BB........",
+ "......B#........",
+ "................",
+ "................"
+ },
+ /* reset: */
+ {
+ /* width height ncolors chars_per_pixel */
+ "16 16 4 1",
+ /* colors */
+ ". c None",
+ "B c #000000",
+ "+ c #824141",
+ "r c #FF0000",
+ /* pixels */
+ "..............BB",
+ "..............+B",
+ ".............r..",
+ "............r...",
+ "...........r....",
+ "..........r.....",
+ ".........r......",
+ "........r.......",
+ ".......r........",
+ "......r.........",
+ ".....r..........",
+ "....r...........",
+ "...r............",
+ "..r.............",
+ "B+..............",
+ "BB.............."
+ }
+ };
+
+GType
+stpui_gamma_curve_get_type (void)
+{
+ static GType gamma_curve_type = 0;
+
+ if (!gamma_curve_type)
+ {
+ static const GTypeInfo gamma_curve_info =
+ {
+ sizeof (StpuiGammaCurveClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) stpui_gamma_curve_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (StpuiGammaCurve),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) stpui_gamma_curve_init,
+ };
+
+ gamma_curve_type = g_type_register_static (GTK_TYPE_VBOX, "StpuiGammaCurve",
+ &gamma_curve_info, 0);
+ }
+ return gamma_curve_type;
+}
+
+static void
+stpui_gamma_curve_class_init (StpuiGammaCurveClass *class)
+{
+ GtkObjectClass *object_class;
+
+ parent_class = g_type_class_peek_parent (class);
+
+ object_class = (GtkObjectClass *) class;
+ object_class->destroy = stpui_gamma_curve_destroy;
+}
+
+static void
+stpui_gamma_curve_init (StpuiGammaCurve *curve)
+{
+ GtkWidget *vbox;
+ int i;
+
+ curve->gamma = 1.0;
+
+ curve->table = gtk_table_new (1, 2, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (curve->table), 3);
+ gtk_container_add (GTK_CONTAINER (curve), curve->table);
+
+ curve->curve = stpui_curve_new ();
+ g_signal_connect (curve->curve, "curve_type_changed",
+ G_CALLBACK (curve_type_changed_callback), curve);
+ gtk_table_attach_defaults (GTK_TABLE (curve->table), curve->curve, 0, 1, 0, 1);
+
+ vbox = gtk_vbox_new (/* homogeneous */ FALSE, /* spacing */ 3);
+ gtk_table_attach (GTK_TABLE (curve->table), vbox, 1, 2, 0, 1, 0, 0, 0, 0);
+
+ /* toggle buttons: */
+ for (i = 0; i < 3; ++i)
+ {
+ curve->button[i] = gtk_toggle_button_new ();
+ g_object_set_data (G_OBJECT (curve->button[i]), "_StpuiGammaCurveIndex",
+ GINT_TO_POINTER (i));
+ gtk_container_add (GTK_CONTAINER (vbox), curve->button[i]);
+ g_signal_connect (curve->button[i], "realize",
+ G_CALLBACK (button_realize_callback), NULL);
+ g_signal_connect (curve->button[i], "toggled",
+ G_CALLBACK (button_toggled_callback), curve);
+ gtk_widget_show (curve->button[i]);
+ }
+
+ /* push buttons: */
+ for (i = 3; i < 5; ++i)
+ {
+ curve->button[i] = gtk_button_new ();
+ g_object_set_data (G_OBJECT (curve->button[i]), "_StpuiGammaCurveIndex",
+ GINT_TO_POINTER (i));
+ gtk_container_add (GTK_CONTAINER (vbox), curve->button[i]);
+ g_signal_connect (curve->button[i], "realize",
+ G_CALLBACK (button_realize_callback), NULL);
+ g_signal_connect (curve->button[i], "clicked",
+ G_CALLBACK (button_clicked_callback), curve);
+ gtk_widget_show (curve->button[i]);
+ }
+
+ gtk_widget_show (vbox);
+ gtk_widget_show (curve->table);
+ gtk_widget_show (curve->curve);
+}
+
+static void
+button_realize_callback (GtkWidget *w)
+{
+ GtkWidget *pixmap;
+ GdkBitmap *mask;
+ GdkPixmap *pm;
+ int i;
+
+ i = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), "_StpuiGammaCurveIndex"));
+ pm = gdk_pixmap_create_from_xpm_d (w->window, &mask,
+ &w->style->bg[GTK_STATE_NORMAL], (gchar **)xpm[i]);
+
+ pixmap = gtk_image_new_from_pixmap (pm, mask);
+ gtk_container_add (GTK_CONTAINER (w), pixmap);
+ gtk_widget_show (pixmap);
+
+ g_object_unref (pm);
+ g_object_unref (mask);
+}
+
+static void
+button_toggled_callback (GtkWidget *w, gpointer data)
+{
+ StpuiGammaCurve *c = data;
+ StpuiCurveType type;
+ int active, i;
+
+ if (!GTK_TOGGLE_BUTTON (w)->active)
+ return;
+
+ active = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), "_StpuiGammaCurveIndex"));
+
+ for (i = 0; i < 3; ++i)
+ if ((i != active) && GTK_TOGGLE_BUTTON (c->button[i])->active)
+ break;
+
+ if (i < 3)
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (c->button[i]), FALSE);
+
+ switch (active)
+ {
+ case 0: type = STPUI_CURVE_TYPE_SPLINE; break;
+ case 1: type = STPUI_CURVE_TYPE_LINEAR; break;
+ default: type = STPUI_CURVE_TYPE_FREE; break;
+ }
+ stpui_curve_set_curve_type (STPUI_CURVE (c->curve), type);
+}
+
+static void
+gamma_cancel_callback (GtkWidget *w, gpointer data)
+{
+ StpuiGammaCurve *c = data;
+
+ gtk_widget_destroy (c->gamma_dialog);
+}
+
+static void
+gamma_ok_callback (GtkWidget *w, gpointer data)
+{
+ StpuiGammaCurve *c = data;
+ const gchar *start;
+ gchar *end;
+ gfloat v;
+
+ start = gtk_entry_get_text (GTK_ENTRY (c->gamma_text));
+ if (start)
+ {
+ v = g_strtod (start, &end);
+ if (end > start && v > 0.0)
+ c->gamma = v;
+ }
+ stpui_curve_set_gamma (STPUI_CURVE (c->curve), c->gamma);
+ gamma_cancel_callback (w, data);
+}
+
+static void
+button_clicked_callback (GtkWidget *w, gpointer data)
+{
+ StpuiGammaCurve *c = data;
+ int active;
+
+ active = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), "_StpuiGammaCurveIndex"));
+ if (active == 3)
+ {
+ /* set gamma */
+ if (c->gamma_dialog)
+ return;
+ else
+ {
+ GtkWidget *vbox, *hbox, *label, *button;
+ gchar buf[64];
+
+ c->gamma_dialog = gtk_dialog_new ();
+ gtk_window_set_screen (GTK_WINDOW (c->gamma_dialog),
+ gtk_widget_get_screen (w));
+ gtk_window_set_title (GTK_WINDOW (c->gamma_dialog), _("Gamma"));
+ g_object_add_weak_pointer (G_OBJECT (c->gamma_dialog),
+ (gpointer *)&c->gamma_dialog);
+
+ vbox = GTK_DIALOG (c->gamma_dialog)->vbox;
+
+ hbox = gtk_hbox_new (/* homogeneous */ FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 2);
+ gtk_widget_show (hbox);
+
+ label = gtk_label_new_with_mnemonic (_("_Gamma value"));
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2);
+ gtk_widget_show (label);
+
+ sprintf (buf, "%g", c->gamma);
+ c->gamma_text = gtk_entry_new ();
+ gtk_label_set_mnemonic_widget (GTK_LABEL (label), c->gamma_text);
+ gtk_entry_set_text (GTK_ENTRY (c->gamma_text), buf);
+ gtk_box_pack_start (GTK_BOX (hbox), c->gamma_text, TRUE, TRUE, 2);
+ gtk_widget_show (c->gamma_text);
+
+ /* fill in action area: */
+ hbox = GTK_DIALOG (c->gamma_dialog)->action_area;
+
+ button = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (gamma_cancel_callback), c);
+ gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show (button);
+
+ button = gtk_button_new_from_stock (GTK_STOCK_OK);
+ GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (gamma_ok_callback), c);
+ gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
+ gtk_widget_grab_default (button);
+ gtk_widget_show (button);
+
+ gtk_widget_show (c->gamma_dialog);
+ }
+ }
+ else
+ {
+ /* reset */
+ stpui_curve_reset (STPUI_CURVE (c->curve));
+ }
+}
+
+static void
+curve_type_changed_callback (GtkWidget *w, gpointer data)
+{
+ StpuiGammaCurve *c = data;
+ StpuiCurveType new_type;
+ int active;
+
+ new_type = STPUI_CURVE (w)->curve_type;
+ switch (new_type)
+ {
+ case STPUI_CURVE_TYPE_SPLINE: active = 0; break;
+ case STPUI_CURVE_TYPE_LINEAR: active = 1; break;
+ default: active = 2; break;
+ }
+ if (!GTK_TOGGLE_BUTTON (c->button[active])->active)
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (c->button[active]), TRUE);
+}
+
+GtkWidget*
+stpui_gamma_curve_new (void)
+{
+ return g_object_new (STPUI_TYPE_GAMMA_CURVE, NULL);
+}
+
+static void
+stpui_gamma_curve_destroy (GtkObject *object)
+{
+ StpuiGammaCurve *c;
+
+ g_return_if_fail (STPUI_IS_GAMMA_CURVE (object));
+
+ c = STPUI_GAMMA_CURVE (object);
+
+ if (c->gamma_dialog)
+ gtk_widget_destroy (c->gamma_dialog);
+
+ if (GTK_OBJECT_CLASS (parent_class)->destroy)
+ (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
diff --git a/src/gutenprintui2/gutenprintui-internal.h b/src/gutenprintui2/gutenprintui-internal.h
new file mode 100644
index 0000000..1ff37de
--- /dev/null
+++ b/src/gutenprintui2/gutenprintui-internal.h
@@ -0,0 +1,240 @@
+/*
+ * "$Id: gutenprintui-internal.h,v 1.2 2005/04/09 14:52:34 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 GUTENPRINTUI_INTERNAL_H
+#define GUTENPRINTUI_INTERNAL_H
+
+#ifdef __GNUC__
+#define inline __inline__
+#endif
+
+#include <sys/types.h>
+#include <gtk/gtk.h>
+
+#include <gutenprint/gutenprint.h>
+
+typedef struct
+{
+ GtkWidget *checkbox;
+ int current;
+ int deflt;
+} boolean_option_t;
+
+typedef struct
+{
+ gint callback_id;
+ char *default_val;
+ stp_string_list_t *params;
+ GtkWidget *combo;
+ GtkWidget *label;
+} list_option_t;
+
+typedef struct
+{
+ GtkObject *adjustment;
+ gfloat upper;
+ gfloat lower;
+ gfloat deflt;
+ gfloat scale;
+} float_option_t;
+
+typedef struct
+{
+ GtkWidget *label;
+ GtkWidget *button;
+ GtkWidget *dialog;
+ GtkWidget *gamma_curve;
+ const char *help_text;
+ stp_curve_t *current;
+ const stp_curve_t *deflt;
+ gboolean is_visible;
+} curve_option_t;
+
+typedef struct
+{
+ const stp_parameter_t *fast_desc;
+ int is_active;
+ int is_enabled;
+ GtkWidget *checkbox;
+ union {
+ list_option_t list;
+ float_option_t flt;
+ curve_option_t curve;
+ boolean_option_t bool;
+ } info;
+} option_t;
+
+typedef struct
+{
+ const char *name;
+ const char *help;
+ gdouble scale;
+ GtkWidget *checkbox;
+ const char *format;
+} unit_t;
+
+typedef struct
+{
+ const char *name;
+ const char *help;
+ const char *value;
+ GtkWidget *button;
+} radio_group_t;
+
+typedef struct
+{
+ unsigned char *base_addr;
+ int bpp;
+ off_t offset;
+ off_t limit;
+} priv_t;
+
+#define PLUG_IN_VERSION VERSION " - " RELEASE_DATE
+#define PLUG_IN_NAME "Print"
+
+#define INVALID_TOP 1
+#define INVALID_LEFT 2
+
+#define SCALE_ENTRY_LABEL(adj) \
+ GTK_LABEL (gtk_object_get_data (GTK_OBJECT(adj), "label"))
+
+#define SCALE_ENTRY_SCALE(adj) \
+ GTK_HSCALE (gtk_object_get_data (GTK_OBJECT(adj), "scale"))
+#define SCALE_ENTRY_SCALE_ADJ(adj) \
+ gtk_range_get_adjustment \
+ (GTK_RANGE (gtk_object_get_data (GTK_OBJECT (adj), "scale")))
+
+#define SCALE_ENTRY_SPINBUTTON(adj) \
+ GTK_SPIN_BUTTON (gtk_object_get_data (GTK_OBJECT (adj), "spinbutton"))
+#define SCALE_ENTRY_SPINBUTTON_ADJ(adj) \
+ gtk_spin_button_get_adjustment \
+ (GTK_SPIN_BUTTON (gtk_object_get_data (GTK_OBJECT (adj), "spinbutton")))
+
+extern gint stpui_plist_count; /* Number of system printers */
+extern gint stpui_plist_current; /* Current system printer */
+extern stpui_plist_t *stpui_plist; /* System printers */
+extern char *stpui_printrc_current_printer;
+extern int stpui_show_all_paper_sizes;
+extern stp_string_list_t *stpui_system_print_queues;
+
+/*
+ * Function prototypes
+ */
+
+extern stpui_plist_t *stpui_plist_create(const char *name, const char *driver);
+extern const char *stpui_combo_get_name(GtkWidget *combo,
+ const stp_string_list_t *options);
+extern void stpui_table_attach_aligned(GtkTable *table, gint column,
+ gint row, const gchar *label_text,
+ gfloat xalign, gfloat yalign,
+ GtkWidget *widget, gint colspan,
+ gboolean left_align);
+
+extern GtkWidget *stpui_create_entry(GtkWidget *table, int hpos, int vpos,
+ const char *text, const char *help,
+ GCallback callback);
+extern GSList *stpui_create_radio_button(radio_group_t *radio, GSList *group,
+ GtkWidget *table, int hpos, int vpos,
+ GCallback callback);
+extern void stpui_set_adjustment_tooltip (GtkObject *adj, const gchar *tip);
+extern void stpui_create_new_combo(option_t *option, GtkWidget *table,
+ int hpos, int vpos, gboolean is_optional);
+extern void stpui_help_init (void);
+extern void stpui_help_free (void);
+extern void stpui_enable_help (void);
+extern void stpui_disable_help (void);
+extern void stpui_set_help_data (GtkWidget *widget, const gchar *tooltip);
+
+extern GtkWidget *stpui_dialog_new(const gchar *title,
+ GtkWindowPosition position,
+ gboolean resizable,
+ /* specify action area buttons as va_list:
+ * const gchar *label,
+ * GtkSignalFunc callback,
+ * gpointer data,
+ * GtkObject *slot_object,
+ * GtkWidget **widget_ptr,
+ * gboolean default_action,
+ * gboolean connect_delete,
+ */
+ ...);
+
+extern GtkWidget *stpui_option_menu_new(gboolean menu_only,
+ /* specify menu items as va_list:
+ * const gchar *label,
+ * GtkSignalFunc callback,
+ * gpointer data,
+ * gpointer user_data,
+ * GtkWidget **widget_ptr,
+ * gboolean active
+ */
+ ...);
+
+extern GtkObject *stpui_scale_entry_new(GtkTable *table,
+ gint column,
+ gint row,
+ const gchar *text,
+ gint scale_usize,
+ gint spinbutton_usize,
+ gfloat value,
+ gfloat lower,
+ gfloat upper,
+ gfloat step_increment,
+ gfloat page_increment,
+ guint digits,
+ gboolean constrain,
+ gfloat unconstrained_lower,
+ gfloat unconstrained_upper,
+ const gchar *tooltip);
+
+extern void stpui_create_scale_entry(option_t *option,
+ GtkTable *table,
+ gint column,
+ gint row,
+ const gchar *text,
+ gint scale_usize,
+ gint spinbutton_usize,
+ gfloat value,
+ gfloat lower,
+ gfloat upper,
+ gfloat step_increment,
+ gfloat page_increment,
+ guint digits,
+ gboolean constrain,
+ gfloat unconstrained_lower,
+ gfloat unconstrained_upper,
+ const gchar *tooltip,
+ gboolean is_optional);
+
+
+/* Thumbnails -- keep it simple! */
+
+stp_image_t *stpui_image_thumbnail_new(const guchar *data, gint w, gint h,
+ gint bpp);
+
+#endif /* GUTENPRINTUI_INTERNAL_H */
diff --git a/src/gutenprintui2/gutenprintui2.pc.in b/src/gutenprintui2/gutenprintui2.pc.in
new file mode 100644
index 0000000..803aaae
--- /dev/null
+++ b/src/gutenprintui2/gutenprintui2.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: Gutenprint UI (GTK+-2.0 version)
+Description: Gutenprint Top Quality Printer Drivers - GTK+-2.0 User Interface
+Requires: gutenprint gtk+-2.0
+Version: @VERSION@
+Libs: -L${libdir} @gutenprintui2_libs@
+Cflags: -I${includedir} @gutenprintui2_cflags@
diff --git a/src/gutenprintui2/panel.c b/src/gutenprintui2/panel.c
new file mode 100644
index 0000000..c8a2ab9
--- /dev/null
+++ b/src/gutenprintui2/panel.c
@@ -0,0 +1,4962 @@
+/*
+ * "$Id: panel.c,v 1.4 2005/06/30 01:42:56 rlk Exp $"
+ *
+ * Main window code for Print plug-in for the GIMP.
+ *
+ * Copyright 1997-2003 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 <config.h>
+#endif
+
+#define MAX_PREVIEW_PPI (400)
+#define INCH 72
+#define FINCH ((gdouble) INCH)
+#define ROUNDUP(x, y) (((x) + ((y) - 1)) / (y))
+#define SCALE(x, y) (((x) + (1.0 / (2.0 * (y)))) * (y))
+
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <gutenprintui2/gutenprintui.h>
+#include "gutenprintui-internal.h"
+
+#include <string.h>
+#include <stdio.h>
+
+#define MAXIMUM_PARAMETER_LEVEL STP_PARAMETER_LEVEL_ADVANCED4
+
+/*
+ * Constants for GUI.
+ */
+static int preview_size_vert = 360;
+static int preview_size_horiz = 300;
+static const int minimum_image_percent = 5.0;
+static const int thumbnail_hintw = 128;
+static const int thumbnail_hinth = 128;
+
+#define MOVE_CONSTRAIN 0
+#define MOVE_HORIZONTAL 1
+#define MOVE_VERTICAL 2
+#define MOVE_ANY (MOVE_HORIZONTAL | MOVE_VERTICAL)
+#define MOVE_GRID 4
+
+/*
+ * Main window widgets
+ */
+
+static GtkWidget *main_vbox;
+static GtkWidget *main_hbox;
+static GtkWidget *right_vbox;
+static GtkWidget *notebook;
+
+static GtkWidget *output_color_vbox;
+static GtkWidget *cyan_button;
+static GtkWidget *magenta_button;
+static GtkWidget *yellow_button;
+static GtkWidget *black_button;
+
+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 *top_entry;
+/*
+static GtkWidget *bottom_entry;
+*/
+static GtkWidget *bottom_border_entry;
+static GtkWidget *width_entry;
+static GtkWidget *height_entry;
+static GtkWidget *units_hbox;
+static GtkWidget *units_label;
+
+static GtkWidget *custom_size_width;
+static GtkWidget *custom_size_height;
+static GtkWidget *show_all_paper_sizes_button;
+static GtkWidget *auto_paper_size_button;
+
+static GtkWidget *orientation_menu; /* 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 GtkObject *scaling_adjustment; /* Adjustment object for scaling */
+
+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 GtkWidget *manufacturer_clist; /* Manufacturer widget */
+static GtkWidget *manufacturer_crawler; /* Scrolled Window for menu */
+static gint plist_callback_id = -1;
+static GtkWidget *ppd_file; /* PPD file entry */
+static GtkWidget *ppd_box;
+static GtkWidget *ppd_label; /* PPD file entry */
+static GtkWidget *ppd_button; /* PPD file browse button */
+static GtkWidget *ppd_browser; /* File selection dialog for PPDs */
+static GtkWidget *new_printer_dialog; /* New printer dialog window */
+static GtkWidget *new_printer_entry; /* New printer text entry */
+static GtkWidget *file_button; /* PPD file browse button */
+static GtkWidget *file_entry; /* FSD for print files */
+static GtkWidget *file_browser; /* FSD for print files */
+static GtkWidget *standard_cmd_entry; /* FSD for print files */
+static GtkWidget *custom_command_entry; /* FSD for print files */
+static GtkWidget *queue_combo; /* FSD for print files */
+static gint queue_callback_id = -1;
+
+static GtkWidget *adjust_color_button;
+static GtkWidget *about_dialog;
+
+static GtkWidget *page_size_table;
+static GtkWidget *printer_features_table;
+static GtkWidget *color_adjustment_table;
+
+static GtkWidget *copy_count_spin_button;
+
+static gboolean preview_valid = FALSE;
+static gboolean frame_valid = FALSE;
+static gboolean need_exposure = FALSE;
+static gboolean suppress_scaling_adjustment = FALSE;
+static gboolean suppress_scaling_callback = FALSE;
+static gboolean thumbnail_update_pending = FALSE;
+/*
+ * These are semaphores, not true booleans.
+ */
+static gint suppress_preview_update = 0;
+static gint suppress_preview_reset = 0;
+
+static GtkDrawingArea *preview = NULL; /* Preview drawing area widget */
+static GtkDrawingArea *swatch = NULL;
+static gint mouse_x, mouse_y; /* Last mouse position */
+static gint orig_top, orig_left; /* Original mouse position at start */
+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 preview_thumbnail_w, preview_thumbnail_h;
+static gint preview_x, preview_y, preview_w, preview_h;
+
+static gint physical_orientation = -2; /* Actual orientation */
+
+static gint paper_width, paper_height; /* Physical width */
+static gint printable_width, printable_height; /* Size of printable area */
+static gint print_width, print_height; /* Printed area of image */
+static gint left, right, top, bottom; /* Imageable region */
+static gint image_width, image_height; /* Image size (possibly rotated) */
+static gint image_true_width, image_true_height; /* Original image */
+static gdouble image_xres, image_yres; /* Original image resolution */
+static gint do_update_thumbnail = 0;
+static gint saveme = 0; /* True if printrc should be saved */
+static gint runme = 0; /* True if print should proceed */
+static gint exit_after_file_ok = 0; /* True if we should exit after file browser complete */
+static gint auto_paper_size = 0; /* True if we're using auto paper size now */
+
+
+
+static void scaling_update (GtkAdjustment *adjustment);
+static void scaling_callback (GtkWidget *widget);
+static void plist_callback (GtkWidget *widget, gpointer data);
+static void queue_callback (GtkWidget *widget, gpointer data);
+static void custom_media_size_callback(GtkWidget *widget, gpointer data);
+static void show_all_paper_sizes_callback(GtkWidget *widget, gpointer data);
+static void auto_paper_size_callback(GtkWidget *widget, gpointer data);
+static void combo_callback (GtkWidget *widget, gpointer data);
+static void output_type_callback (GtkWidget *widget, gpointer data);
+static void unit_callback (GtkWidget *widget, gpointer data);
+static void orientation_callback (GtkWidget *widget, gpointer data);
+static void printandsave_callback (void);
+static void about_callback (void);
+static void print_callback (void);
+static void save_callback (void);
+static void setup_callback (GtkWidget *widget);
+
+static void setup_update (void);
+static void setup_open_callback (void);
+static void setup_ok_callback (void);
+static void setup_cancel_callback (void);
+static void new_printer_open_callback (void);
+static void new_printer_ok_callback (void);
+static void ppd_browse_callback (void);
+static void ppd_ok_callback (void);
+static void file_browse_callback (void);
+static void file_ok_callback (void);
+static void file_cancel_callback (void);
+static void build_printer_driver_clist(void);
+static void print_driver_callback (GtkWidget *widget,
+ gint row,
+ gint column,
+ GdkEventButton *event,
+ gpointer data);
+static void manufacturer_callback (GtkWidget *widget,
+ gint row,
+ gint column,
+ GdkEventButton *event,
+ gpointer data);
+static void command_type_callback (GtkWidget *widget, gpointer data);
+
+static void do_preview_thumbnail (void);
+static void invalidate_preview_thumbnail (void);
+static void invalidate_frame (void);
+
+static GtkWidget *color_adjust_dialog;
+
+static void preview_update (void);
+static void preview_expose (void);
+static void preview_button_callback (GtkWidget *widget,
+ GdkEventButton *bevent,
+ gpointer data);
+static void preview_motion_callback (GtkWidget *widget,
+ GdkEventMotion *mevent,
+ gpointer data);
+static void position_callback (GtkWidget *widget);
+static void position_button_callback (GtkWidget *widget,
+ gpointer data);
+static void copy_count_callback (GtkAdjustment *widget,
+ gpointer data);
+static void plist_build_combo(GtkWidget *combo,
+ GtkWidget *label,
+ stp_string_list_t *items,
+ int active,
+ const gchar *cur_item,
+ const gchar *def_value,
+ GCallback callback,
+ gint *callback_id,
+ int (*check_func)(const char *string),
+ gpointer data);
+static void initialize_thumbnail(void);
+static void set_color_defaults (void);
+static void redraw_color_swatch (void);
+static void color_update (GtkAdjustment *adjustment);
+static void dimension_update (GtkAdjustment *adjustment);
+static void set_controls_active (GtkObject *checkbutton, gpointer optno);
+static void update_adjusted_thumbnail (void);
+
+static void set_media_size(const gchar *new_media_size);
+static const stp_printer_t *tmp_printer = NULL;
+
+static option_t *current_options = NULL;
+static int current_option_count = 0;
+
+static unit_t units[] =
+ {
+ { N_("Inch"), N_("Set the base unit of measurement to inches"),
+ 72.0, NULL, "%.2f" },
+ { N_("cm"), N_("Set the base unit of measurement to centimetres"),
+ 72.0 / 2.54, NULL, "%.2f" },
+ { N_("Points"), N_("Set the base unit of measurement to points (1/72\")"),
+ 1.0, NULL, "%.0f" },
+ { N_("mm"), N_("Set the base unit of measurement to millimetres"),
+ 72.0 / 25.4, NULL, "%.1f" },
+ { N_("Pica"), N_("Set the base unit of measurement to picas (1/12\")"),
+ 72.0 / 12.0, NULL, "%.1f" },
+ };
+static const gint unit_count = sizeof(units) / sizeof(unit_t);
+
+static radio_group_t output_types[] =
+ {
+ { N_("Color"), N_("Color output"), "Color", NULL },
+ { N_("Grayscale"),
+ N_("Print in shades of gray using black ink"), "BW", NULL }
+ };
+
+static const gint output_type_count = (sizeof(output_types) /
+ sizeof(radio_group_t));
+
+/*
+ * The order of these entries must match the order in command_t in
+ * gutenprintui.h
+ */
+static radio_group_t command_options[] =
+ {
+ { N_("Standard Command"), N_("Use standard print command"), "Standard", NULL },
+ { N_("Custom Command"), N_("Use custom print command"), "Custom", NULL },
+ { N_("File"), N_("Print to a file"), "File", NULL }
+ };
+
+static const gint command_options_count = (sizeof(command_options) /
+ sizeof(radio_group_t));
+
+static gdouble preview_ppi = 10;
+
+static stp_string_list_t *printer_list = 0;
+static stpui_plist_t *pv;
+static const char *manufacturer = 0;
+
+static gint thumbnail_w, thumbnail_h, thumbnail_bpp;
+static guchar *thumbnail_data;
+static guchar *adjusted_thumbnail_data;
+static guchar *preview_thumbnail_data;
+
+static void
+set_stpui_curve_values(GtkWidget *gcurve, const stp_curve_t *seed)
+{
+ if (stp_curve_get_gamma(seed))
+ {
+ stpui_curve_set_gamma(STPUI_CURVE(gcurve), stp_curve_get_gamma(seed));
+ }
+ else
+ {
+ stp_curve_t *copy = stp_curve_create_copy(seed);
+ const float *fdata;
+ size_t count;
+ stp_curve_resample(copy, 256);
+ fdata = stp_curve_get_float_data(copy, &count);
+ stpui_curve_set_vector(STPUI_CURVE(gcurve), count, fdata);
+ stp_curve_destroy(copy);
+ }
+}
+
+static void
+set_stp_curve_values(GtkWidget *widget, option_t *opt)
+{
+ int i;
+ double lo, hi;
+ gfloat vector[256];
+ GtkWidget *gcurve = GTK_WIDGET(widget);
+ stp_curve_t *curve = stp_curve_create_copy(opt->info.curve.deflt);
+ stpui_curve_get_vector(STPUI_CURVE(gcurve), 256, vector);
+ stp_curve_get_bounds(opt->info.curve.deflt, &lo, &hi);
+ for (i = 0; i < 256; i++)
+ {
+ if (vector[i] > hi)
+ vector[i] = hi;
+ else if (vector[i] < lo)
+ vector[i] = lo;
+ }
+ switch (STPUI_CURVE(gcurve)->curve_type)
+ {
+ case STPUI_CURVE_TYPE_SPLINE:
+ stp_curve_set_interpolation_type(curve, STP_CURVE_TYPE_SPLINE);
+ break;
+ default:
+ stp_curve_set_interpolation_type(curve, STP_CURVE_TYPE_LINEAR);
+ break;
+ }
+ stp_curve_set_float_data(curve, 256, vector);
+ stp_set_curve_parameter(pv->v, opt->fast_desc->name, curve);
+ stp_curve_destroy(curve);
+}
+
+static int
+open_curve_editor(GtkObject *button, gpointer xopt)
+{
+ option_t *opt = (option_t *)xopt;
+ if (opt->info.curve.is_visible == FALSE)
+ {
+ GtkWidget *gcurve =
+ GTK_WIDGET(STPUI_GAMMA_CURVE(opt->info.curve.gamma_curve)->curve);
+ const stp_curve_t *seed =
+ stp_get_curve_parameter(pv->v, opt->fast_desc->name);
+ stp_curve_t *nseed = NULL;
+ if (!seed)
+ seed = opt->info.curve.deflt;
+ if (seed)
+ nseed = stp_curve_create_copy(seed);
+ gtk_widget_set_sensitive(GTK_WIDGET(opt->checkbox), FALSE);
+ gtk_widget_show(GTK_WIDGET(opt->info.curve.dialog));
+ set_stpui_curve_values(gcurve, seed);
+ opt->info.curve.is_visible = TRUE;
+ if (opt->info.curve.current)
+ stp_curve_destroy(opt->info.curve.current);
+ opt->info.curve.current = nseed;
+ invalidate_preview_thumbnail();
+ update_adjusted_thumbnail();
+ }
+/* gtk_window_activate_focus(GTK_WINDOW(opt->info.curve.dialog)); */
+ return 1;
+}
+
+static int
+set_default_curve_callback(GtkObject *button, gpointer xopt)
+{
+ option_t *opt = (option_t *)xopt;
+ GtkWidget *gcurve =
+ GTK_WIDGET(STPUI_GAMMA_CURVE(opt->info.curve.gamma_curve)->curve);
+ const stp_curve_t *seed = opt->info.curve.deflt;
+ set_stpui_curve_values(gcurve, seed);
+ set_stp_curve_values(gcurve, opt);
+ invalidate_preview_thumbnail();
+ update_adjusted_thumbnail();
+ return 1;
+}
+
+static int
+set_previous_curve_callback(GtkObject *button, gpointer xopt)
+{
+ option_t *opt = (option_t *)xopt;
+ GtkWidget *gcurve =
+ GTK_WIDGET(STPUI_GAMMA_CURVE(opt->info.curve.gamma_curve)->curve);
+ const stp_curve_t *seed = opt->info.curve.current;
+ if (!seed)
+ seed = opt->info.curve.deflt;
+ set_stpui_curve_values(gcurve, seed);
+ set_stp_curve_values(gcurve, opt);
+ invalidate_preview_thumbnail();
+ update_adjusted_thumbnail();
+ return 1;
+}
+
+static int
+set_curve_callback(GtkObject *button, gpointer xopt)
+{
+ option_t *opt = (option_t *)xopt;
+ GtkWidget *gcurve =
+ GTK_WIDGET(STPUI_GAMMA_CURVE(opt->info.curve.gamma_curve)->curve);
+ gtk_widget_hide(opt->info.curve.dialog);
+ gtk_widget_set_sensitive(GTK_WIDGET(opt->checkbox), TRUE);
+ opt->info.curve.is_visible = FALSE;
+ set_stp_curve_values(gcurve, opt);
+ if (opt->info.curve.current)
+ stp_curve_destroy(opt->info.curve.current);
+ opt->info.curve.current = NULL;
+ invalidate_preview_thumbnail();
+ update_adjusted_thumbnail();
+ return 1;
+}
+
+static gint
+curve_draw_callback(GtkWidget *widget, GdkEvent *event, gpointer xopt)
+{
+ option_t *opt = (option_t *)xopt;
+ switch (event->type)
+ {
+ case GDK_BUTTON_RELEASE:
+ set_stp_curve_values(widget, opt);
+ invalidate_preview_thumbnail();
+ update_adjusted_thumbnail();
+ break;
+ default:
+ break;
+ }
+ return 1;
+}
+
+static gint
+curve_type_changed(GtkWidget *widget, gpointer xopt)
+{
+ option_t *opt = (option_t *)xopt;
+ set_stp_curve_values(widget, opt);
+ invalidate_preview_thumbnail();
+ update_adjusted_thumbnail();
+ return 1;
+}
+
+static int
+cancel_curve_callback(GtkObject *button, gpointer xopt)
+{
+ option_t *opt = (option_t *)xopt;
+ if (opt->info.curve.is_visible)
+ {
+ stp_set_curve_parameter(pv->v, opt->fast_desc->name,
+ opt->info.curve.current);
+ stp_curve_destroy(opt->info.curve.current);
+ opt->info.curve.current = NULL;
+ gtk_widget_hide(opt->info.curve.dialog);
+ gtk_widget_set_sensitive(GTK_WIDGET(opt->checkbox), TRUE);
+ opt->info.curve.is_visible = FALSE;
+ invalidate_preview_thumbnail();
+ update_adjusted_thumbnail();
+ }
+ return 1;
+}
+
+static void
+stpui_create_curve(option_t *opt,
+ GtkTable *table,
+ gint column,
+ gint row,
+ const gchar *text,
+ const stp_curve_t *deflt,
+ gboolean is_optional)
+{
+ double lower, upper;
+ opt->checkbox = gtk_check_button_new();
+ gtk_table_attach(GTK_TABLE(table), opt->checkbox,
+ column, column + 1, row, row + 1,
+ GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 0);
+ if (is_optional)
+ gtk_widget_show(opt->checkbox);
+ else
+ gtk_widget_hide(opt->checkbox);
+
+ opt->info.curve.label = gtk_label_new(text);
+ gtk_misc_set_alignment (GTK_MISC (opt->info.curve.label), 0.0, 0.5);
+ gtk_table_attach (GTK_TABLE (table), opt->info.curve.label,
+ column + 1, column + 2, row, row + 1,
+ GTK_FILL, GTK_FILL, 0, 0);
+ gtk_widget_show (opt->info.curve.label);
+
+ opt->info.curve.button = gtk_button_new_with_label(_("Edit Curve..."));
+ g_signal_connect(G_OBJECT(opt->info.curve.button), "clicked",
+ G_CALLBACK(open_curve_editor), opt);
+ gtk_table_attach (GTK_TABLE (table), opt->info.curve.button,
+ column + 2, column + 3, row, row + 1,
+ GTK_FILL, GTK_FILL, 0, 0);
+ gtk_widget_show(opt->info.curve.button);
+
+ opt->info.curve.dialog =
+ stpui_dialog_new(_(opt->fast_desc->text),
+ GTK_WIN_POS_MOUSE, TRUE,
+ _("Set Default"), set_default_curve_callback,
+ opt, NULL, NULL, FALSE, FALSE,
+ _("Restore Previous"), set_previous_curve_callback,
+ opt, NULL, NULL, FALSE, FALSE,
+ _("OK"), set_curve_callback,
+ opt, NULL, NULL, FALSE, FALSE,
+ _("Cancel"), cancel_curve_callback,
+ opt, NULL, NULL, FALSE, FALSE,
+ NULL);
+ opt->info.curve.gamma_curve = stpui_gamma_curve_new();
+ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(opt->info.curve.dialog)->vbox),
+ opt->info.curve.gamma_curve, TRUE, TRUE, 0);
+ stp_curve_get_bounds(opt->info.curve.deflt, &lower, &upper);
+ stpui_curve_set_range
+ (STPUI_CURVE (STPUI_GAMMA_CURVE(opt->info.curve.gamma_curve)->curve),
+ 0.0, 1.0, lower, upper);
+ gtk_widget_set_usize
+ (GTK_WIDGET(STPUI_GAMMA_CURVE(opt->info.curve.gamma_curve)->curve), 256, 256);
+ gtk_widget_show(opt->info.curve.gamma_curve);
+
+ g_signal_connect
+ (G_OBJECT(STPUI_GAMMA_CURVE(opt->info.curve.gamma_curve)->curve),
+ "curve-type-changed", G_CALLBACK(curve_type_changed), opt);
+ g_signal_connect
+ (G_OBJECT(STPUI_GAMMA_CURVE(opt->info.curve.gamma_curve)->curve),
+ "event", G_CALLBACK(curve_draw_callback), opt);
+
+ if (opt->fast_desc->help)
+ {
+ stpui_set_help_data (opt->info.curve.label, opt->fast_desc->help);
+ stpui_set_help_data (opt->info.curve.button, opt->fast_desc->help);
+ stpui_set_help_data (opt->info.curve.gamma_curve, opt->fast_desc->help);
+ }
+}
+
+static int
+checkbox_callback(GtkObject *button, gpointer xopt)
+{
+ option_t *opt = (option_t *)xopt;
+ GtkWidget *checkbox = GTK_WIDGET(opt->info.bool.checkbox);
+ opt->info.bool.current =
+ gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbox));
+ stp_set_boolean_parameter(pv->v, opt->fast_desc->name,
+ opt->info.bool.current);
+ invalidate_frame();
+ invalidate_preview_thumbnail();
+ if (opt->fast_desc->p_class == STP_PARAMETER_CLASS_OUTPUT)
+ update_adjusted_thumbnail();
+ preview_update();
+ return 1;
+}
+
+static int
+print_mode_is_color(const stp_vars_t *v)
+{
+ const char *printing_mode = stp_get_string_parameter(v, "PrintingMode");
+ if (!printing_mode)
+ {
+ int answer = 1;
+ stp_parameter_t desc;
+ stp_describe_parameter(v, "PrintingMode", &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_STRING_LIST &&
+ strcmp(desc.deflt.str, "BW") == 0)
+ answer = 0;
+ stp_parameter_description_destroy(&desc);
+ return answer;
+ }
+ if (strcmp(printing_mode, "BW") == 0)
+ return 0;
+ else
+ return 1;
+}
+
+static void
+set_current_printer(void)
+{
+ pv = &(stpui_plist[stpui_plist_current]);
+ if (print_mode_is_color(pv->v))
+ stp_set_string_parameter(pv->v, "PrintingMode", "Color");
+ else
+ stp_set_string_parameter(pv->v, "PrintingMode", "BW");
+}
+
+
+static void
+stpui_create_boolean(option_t *opt,
+ GtkTable *table,
+ gint column,
+ gint row,
+ const gchar *text,
+ int deflt,
+ gboolean is_optional)
+{
+ opt->checkbox = gtk_check_button_new();
+ gtk_table_attach(GTK_TABLE(table), opt->checkbox,
+ column, column + 1, row, row + 1,
+ GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 0);
+ if (is_optional)
+ gtk_widget_show(opt->checkbox);
+ else
+ gtk_widget_hide(opt->checkbox);
+
+ opt->info.bool.checkbox =
+ gtk_toggle_button_new_with_label(_(opt->fast_desc->text));
+ gtk_table_attach(GTK_TABLE(table), opt->info.bool.checkbox,
+ column + 1, column + 3, row, row + 1,
+ GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 0);
+ gtk_widget_show(opt->info.bool.checkbox);
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON(opt->info.bool.checkbox),
+ stp_get_boolean_parameter(pv->v, opt->fast_desc->name));
+ g_signal_connect(G_OBJECT(opt->info.bool.checkbox), "toggled",
+ G_CALLBACK(checkbox_callback), opt);
+}
+
+static void
+build_queue_combo(void)
+{
+ plist_build_combo(queue_combo,
+ NULL,
+ stpui_system_print_queues,
+ 1,
+ stpui_plist_get_queue_name(pv),
+ NULL,
+ G_CALLBACK(queue_callback),
+ &queue_callback_id,
+ NULL,
+ NULL);
+}
+
+static void
+build_printer_combo(void)
+{
+ int i;
+ if (printer_list)
+ stp_string_list_destroy(printer_list);
+ printer_list = stp_string_list_create();
+ for (i = 0; i < stpui_plist_count; i++)
+ stp_string_list_add_string(printer_list,
+ stpui_plist[i].name, stpui_plist[i].name);
+ plist_build_combo(printer_combo,
+ NULL,
+ printer_list,
+ 1,
+ stp_string_list_param(printer_list, stpui_plist_current)->name,
+ NULL,
+ G_CALLBACK(plist_callback),
+ &plist_callback_id,
+ NULL,
+ NULL);
+}
+
+static int
+check_page_size(const char *paper_size)
+{
+ const stp_papersize_t *ps = stp_get_papersize_by_name(paper_size);
+ if (ps && (ps->paper_unit == PAPERSIZE_ENGLISH_STANDARD ||
+ ps->paper_unit == PAPERSIZE_METRIC_STANDARD))
+ return 1;
+ else
+ return 0;
+}
+
+static void
+build_page_size_combo(option_t *option)
+{
+ /*
+ * Some printers don't support any "standard" page sizes. If the number
+ * of page sizes is small, just display all of them.
+ */
+ if (stpui_show_all_paper_sizes ||
+ stp_string_list_count(option->info.list.params) < 10)
+ plist_build_combo(option->info.list.combo, option->info.list.label,
+ option->info.list.params, option->is_active,
+ stp_get_string_parameter(pv->v, option->fast_desc->name),
+ option->info.list.default_val,G_CALLBACK(combo_callback),
+ &(option->info.list.callback_id), NULL, option);
+ else
+ plist_build_combo(option->info.list.combo, option->info.list.label,
+ option->info.list.params, option->is_active,
+ stp_get_string_parameter(pv->v, option->fast_desc->name),
+ option->info.list.default_val,G_CALLBACK(combo_callback),
+ &(option->info.list.callback_id),
+ check_page_size, option);
+}
+
+static void
+build_a_combo(option_t *option)
+{
+ const gchar *new_value;
+ stp_parameter_activity_t active;
+ if (option->fast_desc &&
+ option->fast_desc->p_type == STP_PARAMETER_TYPE_STRING_LIST)
+ {
+ const gchar *val = stp_get_string_parameter(pv->v,
+ option->fast_desc->name);
+ if (option->info.list.params == NULL || ! option->is_active ||
+ stp_string_list_count(option->info.list.params) == 0)
+ stp_set_string_parameter(pv->v, option->fast_desc->name, NULL);
+ else if (!val || strlen(val) == 0 ||
+ ! stp_string_list_is_present(option->info.list.params, val))
+ stp_set_string_parameter(pv->v, option->fast_desc->name,
+ option->info.list.default_val);
+ if (strcmp(option->fast_desc->name, "PageSize") == 0)
+ build_page_size_combo(option);
+ else
+ plist_build_combo(option->info.list.combo, option->info.list.label,
+ option->info.list.params,
+ option->is_active,
+ stp_get_string_parameter(pv->v,
+ option->fast_desc->name),
+ option->info.list.default_val, G_CALLBACK(combo_callback),
+ &(option->info.list.callback_id), NULL, option);
+ if (strcmp(option->fast_desc->name, "PageSize") == 0)
+ set_media_size
+ (stp_get_string_parameter(pv->v, option->fast_desc->name));
+ }
+ else
+ plist_build_combo(option->info.list.combo, option->info.list.label,
+ NULL, 0, "", "", G_CALLBACK(combo_callback),
+ &(option->info.list.callback_id), NULL, option);
+ new_value =
+ stpui_combo_get_name(option->info.list.combo, option->info.list.params);
+ active = stp_get_string_parameter_active(pv->v, option->fast_desc->name);
+ stp_set_string_parameter(pv->v, option->fast_desc->name, new_value);
+ stp_set_string_parameter_active(pv->v, option->fast_desc->name, active);
+}
+
+static void
+populate_options(const stp_vars_t *v)
+{
+ stp_parameter_list_t params = stp_get_parameter_list(v);
+ int i;
+ int idx;
+ if (current_options)
+ {
+ for (i = 0; i < current_option_count; i++)
+ {
+ option_t *opt = &(current_options[i]);
+ switch (opt->fast_desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ if (opt->info.list.combo)
+ {
+ gtk_widget_destroy(opt->info.list.combo);
+ gtk_widget_destroy(opt->info.list.label);
+ if (opt->info.list.params)
+ stp_string_list_destroy(opt->info.list.params);
+ g_free(opt->info.list.default_val);
+ }
+ break;
+ case STP_PARAMETER_TYPE_DOUBLE:
+ case STP_PARAMETER_TYPE_DIMENSION:
+ if (opt->info.flt.adjustment)
+ {
+ gtk_widget_destroy
+ (GTK_WIDGET
+ (SCALE_ENTRY_SCALE(opt->info.flt.adjustment)));
+ gtk_widget_destroy
+ (GTK_WIDGET
+ (SCALE_ENTRY_LABEL(opt->info.flt.adjustment)));
+ gtk_widget_destroy
+ (GTK_WIDGET
+ (SCALE_ENTRY_SPINBUTTON(opt->info.flt.adjustment)));
+ }
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ gtk_widget_destroy(GTK_WIDGET(opt->info.curve.label));
+ gtk_widget_destroy(GTK_WIDGET(opt->info.curve.button));
+ gtk_widget_destroy(GTK_WIDGET(opt->info.curve.dialog));
+ if (opt->info.curve.current)
+ stp_curve_destroy(opt->info.curve.current);
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ gtk_widget_destroy(GTK_WIDGET(opt->info.bool.checkbox));
+ break;
+ default:
+ break;
+ }
+ if (opt->checkbox)
+ gtk_widget_destroy(GTK_WIDGET(opt->checkbox));
+ }
+ g_free(current_options);
+ }
+ current_option_count = stp_parameter_list_count(params);
+ current_options = g_malloc(sizeof(option_t) * current_option_count);
+
+ for (idx = 0, i = 0; i < current_option_count; i++)
+ {
+ stp_parameter_t desc;
+ const stp_parameter_t *param = stp_parameter_list_param(params, i);
+ if (!param->read_only &&
+ (param->p_class == STP_PARAMETER_CLASS_OUTPUT ||
+ param->p_class == STP_PARAMETER_CLASS_FEATURE ||
+ (param->p_class == STP_PARAMETER_CLASS_CORE &&
+ strcmp(param->name, "PageSize") == 0)))
+ {
+ option_t *opt = &(current_options[idx]);
+ opt->fast_desc = stp_parameter_list_param(params, i);
+ stp_describe_parameter(v, opt->fast_desc->name, &desc);
+ opt->checkbox = NULL;
+ opt->is_active = 0;
+ opt->is_enabled = 0;
+ switch (opt->fast_desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ opt->info.list.callback_id = -1;
+ opt->info.list.default_val = g_strdup(desc.deflt.str);
+ if (desc.bounds.str)
+ opt->info.list.params =
+ stp_string_list_create_copy(desc.bounds.str);
+ else
+ opt->info.list.params = NULL;
+ opt->info.list.combo = NULL;
+ opt->info.list.label = NULL;
+ opt->is_active = desc.is_active;
+ break;
+ case STP_PARAMETER_TYPE_DOUBLE:
+ opt->info.flt.adjustment = NULL;
+ opt->info.flt.upper = desc.bounds.dbl.upper;
+ opt->info.flt.lower = desc.bounds.dbl.lower;
+ opt->info.flt.deflt = desc.deflt.dbl;
+ opt->info.flt.scale = 1.0;
+ opt->is_active = desc.is_active;
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ opt->info.flt.adjustment = NULL;
+ opt->info.flt.upper = desc.bounds.dimension.upper;
+ opt->info.flt.lower = desc.bounds.dimension.lower;
+ opt->info.flt.deflt = desc.deflt.dimension;
+ opt->info.flt.scale = 1.0;
+ opt->is_active = desc.is_active;
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ opt->info.curve.label = NULL;
+ opt->info.curve.button = NULL;
+ opt->info.curve.dialog = NULL;
+ opt->info.curve.gamma_curve = NULL;
+ opt->info.curve.current = NULL;
+ opt->info.curve.deflt = desc.deflt.curve;
+ opt->info.curve.is_visible = FALSE;
+ opt->is_active = desc.is_active;
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ opt->info.bool.checkbox = NULL;
+ opt->info.bool.current = 0;
+ opt->info.bool.deflt = desc.deflt.boolean;
+ opt->is_active = desc.is_active;
+ default:
+ break;
+ }
+ idx++;
+ stp_parameter_description_destroy(&desc);
+ }
+ }
+ current_option_count = idx;
+ stp_parameter_list_destroy(params);
+}
+
+static void
+populate_option_table(GtkWidget *table, int p_class)
+{
+ int i, j;
+ int current_pos = 0;
+ int counts[STP_PARAMETER_LEVEL_INVALID][STP_PARAMETER_TYPE_INVALID];
+ int vpos[STP_PARAMETER_LEVEL_INVALID][STP_PARAMETER_TYPE_INVALID];
+ for (i = 0; i < STP_PARAMETER_LEVEL_INVALID; i++)
+ for (j = 0; j < STP_PARAMETER_TYPE_INVALID; j++)
+ {
+ vpos[i][j] = 0;
+ counts[i][j] = 0;
+ }
+
+
+ /* First scan the options to figure out where to start */
+ for (i = 0; i < current_option_count; i++)
+ {
+ const stp_parameter_t *desc = current_options[i].fast_desc;
+ /*
+ * Specialize the core parameters (page size is the only one we want)
+ * Yuck.
+ */
+ if (!desc->read_only && desc->p_class == p_class &&
+ (desc->p_class != STP_PARAMETER_CLASS_CORE ||
+ strcmp(desc->name, "PageSize") == 0))
+ {
+ switch (desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ case STP_PARAMETER_TYPE_DIMENSION:
+ case STP_PARAMETER_TYPE_DOUBLE:
+ case STP_PARAMETER_TYPE_CURVE:
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ counts[desc->p_level][desc->p_type]++;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ /* Now, figure out where we're going to put the options */
+ for (i = 0; i < STP_PARAMETER_LEVEL_INVALID; i++)
+ {
+ int level_count = 0;
+ for (j = 0; j < STP_PARAMETER_TYPE_INVALID; j++)
+ level_count += counts[i][j];
+ if (level_count > 0 && current_pos > 0)
+ {
+ GtkWidget *sep = gtk_hseparator_new();
+ gtk_table_attach (GTK_TABLE(table), sep, 0, 4,
+ current_pos, current_pos + 1,
+ GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 0);
+ if (i <= MAXIMUM_PARAMETER_LEVEL)
+ gtk_widget_show(sep);
+ current_pos++;
+ }
+ for (j = 0; j < STP_PARAMETER_TYPE_INVALID; j++)
+ {
+ vpos[i][j] = current_pos;
+ current_pos += counts[i][j];
+ }
+ }
+
+ for (i = 0; i < current_option_count; i++)
+ {
+ option_t *opt = &(current_options[i]);
+ const stp_curve_t *xcurve;
+ const stp_parameter_t *desc = opt->fast_desc;
+ if (!desc->read_only && desc->p_class == p_class &&
+ (desc->p_class != STP_PARAMETER_CLASS_CORE ||
+ strcmp(desc->name, "PageSize") == 0))
+ {
+ gdouble unit_scaler;
+ gdouble minor_increment;
+ gint digits;
+ switch (desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ stpui_create_new_combo(opt, table, 0,
+ vpos[desc->p_level][desc->p_type]++,
+ !(desc->is_mandatory));
+ if (desc->p_level > MAXIMUM_PARAMETER_LEVEL)
+ stp_set_string_parameter_active(pv->v, desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_DOUBLE:
+ stpui_create_scale_entry(opt, GTK_TABLE(table), 0,
+ vpos[desc->p_level][desc->p_type]++,
+ _(desc->text), 200, 0,
+ opt->info.flt.deflt,
+ opt->info.flt.lower,
+ opt->info.flt.upper,
+ .001, .01, 3, TRUE, 0, 0, NULL,
+ !(desc->is_mandatory));
+ stpui_set_adjustment_tooltip(opt->info.flt.adjustment,
+ _(desc->help));
+ g_signal_connect(G_OBJECT(opt->info.flt.adjustment),
+ "value_changed",
+ G_CALLBACK(color_update), opt);
+ if (desc->p_level > MAXIMUM_PARAMETER_LEVEL)
+ stp_set_float_parameter_active(pv->v, desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ unit_scaler = units[pv->unit].scale;
+ if (unit_scaler > 100)
+ {
+ digits = 3;
+ minor_increment = .001;
+ }
+ else if (unit_scaler > 10)
+ {
+ digits = 2;
+ minor_increment = .01;
+ }
+ else if (unit_scaler > 1)
+ {
+ digits = 1;
+ minor_increment = .1;
+ }
+ else
+ {
+ digits = 0;
+ minor_increment = 1;
+ }
+ stpui_create_scale_entry(opt, GTK_TABLE(table), 0,
+ vpos[desc->p_level][desc->p_type]++,
+ _(desc->text), 200, 0,
+ opt->info.flt.deflt / unit_scaler,
+ opt->info.flt.lower / unit_scaler,
+ opt->info.flt.upper / unit_scaler,
+ minor_increment, minor_increment * 10,
+ digits, TRUE, 0, 0, NULL,
+ !(desc->is_mandatory));
+ stpui_set_adjustment_tooltip(opt->info.flt.adjustment,
+ _(desc->help));
+ g_signal_connect(G_OBJECT(opt->info.flt.adjustment),
+ "value_changed",
+ G_CALLBACK(dimension_update), opt);
+ if (desc->p_level > MAXIMUM_PARAMETER_LEVEL)
+ stp_set_dimension_parameter_active(pv->v, desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ xcurve = stp_get_curve_parameter(pv->v, opt->fast_desc->name);
+ if (xcurve)
+ opt->info.curve.current = stp_curve_create_copy(xcurve);
+ else
+ opt->info.curve.current = NULL;
+ stpui_create_curve(opt, GTK_TABLE(table), 0,
+ vpos[desc->p_level][desc->p_type]++,
+ _(desc->text), opt->info.curve.deflt,
+ !(desc->is_mandatory));
+ if (desc->p_level > MAXIMUM_PARAMETER_LEVEL)
+ stp_set_curve_parameter_active(pv->v, desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ opt->info.bool.current =
+ stp_get_boolean_parameter(pv->v, opt->fast_desc->name);
+ stpui_create_boolean(opt, GTK_TABLE(table), 0,
+ vpos[desc->p_level][desc->p_type]++,
+ _(desc->text), opt->info.bool.deflt,
+ !(desc->is_mandatory));
+ if (desc->p_level > MAXIMUM_PARAMETER_LEVEL)
+ stp_set_boolean_parameter_active(pv->v, desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_INT:
+ stp_set_int_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_RAW:
+ stp_set_raw_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_FILE:
+ if (strcmp(opt->fast_desc->name, "PPDFile") != 0)
+ stp_set_file_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ default:
+ break;
+ }
+ if (opt->checkbox)
+ g_signal_connect
+ (G_OBJECT(opt->checkbox), "toggled",
+ G_CALLBACK(set_controls_active), opt);
+ }
+ }
+}
+
+static void
+set_options_active(const char *omit)
+{
+ int i;
+ for (i = 0; i < current_option_count; i++)
+ {
+ option_t *opt = &(current_options[i]);
+ const stp_parameter_t *desc = opt->fast_desc;
+ GtkObject *adj;
+ if (omit && strcmp(omit, opt->fast_desc->name) == 0)
+ continue;
+ switch (desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ build_a_combo(opt);
+ break;
+ case STP_PARAMETER_TYPE_DOUBLE:
+ case STP_PARAMETER_TYPE_DIMENSION:
+ adj = opt->info.flt.adjustment;
+ if (adj)
+ {
+ if (opt->is_active && desc->p_level <= MAXIMUM_PARAMETER_LEVEL)
+ {
+ gtk_widget_show(GTK_WIDGET(SCALE_ENTRY_LABEL(adj)));
+ gtk_widget_show(GTK_WIDGET(SCALE_ENTRY_SCALE(adj)));
+ gtk_widget_show(GTK_WIDGET(SCALE_ENTRY_SPINBUTTON(adj)));
+ }
+ else
+ {
+ gtk_widget_hide(GTK_WIDGET(SCALE_ENTRY_LABEL(adj)));
+ gtk_widget_hide(GTK_WIDGET(SCALE_ENTRY_SCALE(adj)));
+ gtk_widget_hide(GTK_WIDGET(SCALE_ENTRY_SPINBUTTON(adj)));
+ }
+ }
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ if (opt->is_active && desc->p_level <= MAXIMUM_PARAMETER_LEVEL)
+ {
+ gtk_widget_show(GTK_WIDGET(opt->info.curve.label));
+ gtk_widget_show(GTK_WIDGET(opt->info.curve.button));
+ }
+ else
+ {
+ gtk_widget_hide(GTK_WIDGET(opt->info.curve.label));
+ gtk_widget_hide(GTK_WIDGET(opt->info.curve.button));
+ gtk_widget_hide(GTK_WIDGET(opt->info.curve.dialog));
+ }
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ if (opt->is_active && desc->p_level <= MAXIMUM_PARAMETER_LEVEL)
+ {
+ gtk_widget_show(GTK_WIDGET(opt->info.bool.checkbox));
+ }
+ else
+ {
+ gtk_widget_hide(GTK_WIDGET(opt->info.bool.checkbox));
+ }
+ break;
+ default:
+ break;
+ }
+ if (opt->checkbox)
+ {
+ if (!(opt->is_active) || desc->p_level > MAXIMUM_PARAMETER_LEVEL)
+ gtk_widget_hide(GTK_WIDGET(opt->checkbox));
+ else if (!(desc->is_mandatory))
+ gtk_widget_show(GTK_WIDGET(opt->checkbox));
+ }
+ }
+}
+
+static void
+color_button_callback(GtkWidget *widget, gpointer data)
+{
+ invalidate_preview_thumbnail();
+ update_adjusted_thumbnail();
+}
+
+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"),
+ stpui_get_image_filename(),
+ VERSION " - " RELEASE_DATE);
+
+ print_dialog =
+ stpui_dialog_new (plug_in_name,
+ GTK_WIN_POS_MOUSE,
+ TRUE,
+
+ _("About"), about_callback,
+ NULL, NULL, NULL, FALSE, FALSE,
+ _("Print and\nSave Settings"), printandsave_callback,
+ NULL, NULL, NULL, FALSE, FALSE,
+ _("Save\nSettings"), save_callback,
+ NULL, NULL, NULL, FALSE, FALSE,
+ _("Print"), print_callback,
+ NULL, NULL, NULL, FALSE, FALSE,
+ _("Cancel"), gtk_widget_destroy,
+ NULL, (GObject *) 1, NULL, FALSE, TRUE,
+
+ NULL);
+
+ g_free (plug_in_name);
+
+ g_signal_connect (G_OBJECT (print_dialog), "destroy",
+ G_CALLBACK (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,
+ TRUE, TRUE, 0);
+ gtk_widget_show (main_vbox);
+
+ main_hbox = gtk_hbox_new (FALSE, 4);
+ gtk_box_pack_start (GTK_BOX (main_vbox), main_hbox, TRUE, TRUE, 0);
+ gtk_widget_show (main_hbox);
+
+ right_vbox = gtk_vbox_new (FALSE, 2);
+ gtk_box_pack_end (GTK_BOX (main_hbox), right_vbox, FALSE, FALSE, 0);
+ gtk_widget_show (right_vbox);
+
+ notebook = gtk_notebook_new ();
+ gtk_box_pack_start (GTK_BOX (right_vbox), notebook, TRUE, TRUE, 0);
+ gtk_widget_show (notebook);
+}
+
+static gint
+drawing_area_resize_callback(GtkWidget *widget, GdkEventConfigure *event)
+{
+ preview_size_vert = event->height - 1;
+ preview_size_horiz = event->width - 1;
+ invalidate_preview_thumbnail();
+ invalidate_frame();
+ preview_update();
+ return 1;
+}
+
+static void
+create_preview (void)
+{
+ GtkWidget *frame;
+ GtkWidget *event_box;
+
+ frame = gtk_frame_new (_("Preview"));
+ gtk_box_pack_start (GTK_BOX (main_hbox), frame, TRUE, TRUE, 0);
+ gtk_widget_show (frame);
+
+ preview = (GtkDrawingArea *) gtk_drawing_area_new ();
+ gtk_drawing_area_size(preview, preview_size_horiz + 1, preview_size_vert +1);
+ g_signal_connect(G_OBJECT(preview), "configure_event",
+ G_CALLBACK(drawing_area_resize_callback), NULL);
+ 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);
+
+ g_signal_connect (G_OBJECT (preview), "expose_event",
+ G_CALLBACK (preview_expose), NULL);
+ g_signal_connect (G_OBJECT (preview), "button_press_event",
+ G_CALLBACK (preview_button_callback), NULL);
+ g_signal_connect (G_OBJECT (preview), "button_release_event",
+ G_CALLBACK (preview_button_callback), NULL);
+ g_signal_connect (G_OBJECT (preview), "motion_notify_event",
+ G_CALLBACK (preview_motion_callback), NULL);
+ gtk_widget_show (GTK_WIDGET (preview));
+
+ stpui_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."));
+
+ gtk_widget_set_events (GTK_WIDGET (preview),
+ GDK_EXPOSURE_MASK | GDK_BUTTON_MOTION_MASK |
+ GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
+}
+
+static GtkWidget *
+create_positioning_entry(GtkWidget *table, int hpos, int vpos,
+ const char *text, const char *help)
+{
+ return stpui_create_entry
+ (table, hpos, vpos, text, help, G_CALLBACK(position_callback));
+}
+
+static GtkWidget *
+create_positioning_button(GtkWidget *box, int invalid,
+ const char *text, const char *help)
+{
+ GtkWidget *button = gtk_button_new_with_label(_(text));
+ gtk_box_pack_start(GTK_BOX(box), button, FALSE, TRUE, 0);
+ gtk_widget_show(button);
+ stpui_set_help_data(button, help);
+ g_signal_connect(G_OBJECT(button), "clicked",
+ G_CALLBACK(position_button_callback),
+ (gpointer) invalid);
+ return button;
+}
+
+static void
+create_paper_size_frame(void)
+{
+ GtkWidget *frame;
+ GtkWidget *vbox;
+ GtkWidget *media_size_table;
+ GtkWidget *table;
+ int vpos = 0;
+
+ frame = gtk_frame_new (_("Paper Size"));
+ gtk_box_pack_start (GTK_BOX (right_vbox), frame, FALSE, TRUE, 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, 1, FALSE);
+ gtk_container_add (GTK_CONTAINER (vbox), table);
+ gtk_widget_show (table);
+
+ /*
+ * Media size combo box.
+ */
+
+ page_size_table = gtk_table_new(1, 1, FALSE);
+ gtk_widget_show (page_size_table);
+ gtk_table_attach_defaults(GTK_TABLE(table), page_size_table,
+ 0, 2, vpos, vpos + 1);
+ vpos++;
+ show_all_paper_sizes_button =
+ gtk_check_button_new_with_label(_("Show All Paper Sizes"));
+ gtk_table_attach_defaults
+ (GTK_TABLE(table), show_all_paper_sizes_button, 0, 2, vpos, vpos + 1);
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON(show_all_paper_sizes_button),
+ stpui_show_all_paper_sizes);
+ g_signal_connect(G_OBJECT(show_all_paper_sizes_button), "toggled",
+ G_CALLBACK(show_all_paper_sizes_callback), NULL);
+ gtk_widget_show(show_all_paper_sizes_button);
+ vpos++;
+
+ /*
+ * Custom media size entries
+ */
+
+ media_size_table = gtk_table_new (1, 1, FALSE);
+ stpui_table_attach_aligned(GTK_TABLE (table), 0, vpos++, _("Dimensions:"),
+ 0.0, 0.5, media_size_table, 1, TRUE);
+ gtk_table_set_col_spacings (GTK_TABLE (media_size_table), 4);
+
+ custom_size_width = stpui_create_entry
+ (media_size_table, 0, 3, _("Width:"),
+ _("Width of the paper that you wish to print to"),
+ G_CALLBACK(custom_media_size_callback));
+
+ custom_size_height = stpui_create_entry
+ (media_size_table, 2, 3, _("Height:"),
+ _("Height of the paper that you wish to print to"),
+ G_CALLBACK(custom_media_size_callback));
+
+ vpos++;
+ auto_paper_size_button =
+ gtk_check_button_new_with_label(_("Automatic Paper Size"));
+ gtk_table_attach_defaults
+ (GTK_TABLE(table), auto_paper_size_button, 0, 2, vpos, vpos + 1);
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON(auto_paper_size_button), FALSE);
+ g_signal_connect(G_OBJECT(auto_paper_size_button), "toggled",
+ G_CALLBACK(auto_paper_size_callback), NULL);
+}
+
+static void
+create_copy_number_frame(void)
+{
+ GtkWidget *frame;
+ GtkWidget *vbox;
+ GtkWidget *event_box;
+ GtkAdjustment *adj;
+
+ frame = gtk_frame_new (_("Number of Copies"));
+ gtk_box_pack_start (GTK_BOX (right_vbox), frame, FALSE, TRUE, 0);
+ gtk_widget_show (frame);
+
+ vbox = gtk_hbox_new (FALSE, 2);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
+ gtk_container_add (GTK_CONTAINER (frame), vbox);
+ gtk_widget_show (vbox);
+
+ event_box = gtk_event_box_new ();
+ gtk_container_add (GTK_CONTAINER (vbox), event_box);
+ stpui_set_help_data(event_box,
+ _("Select the number of copies to print; "
+ "a value between 1 and 100"));
+ gtk_widget_show (event_box);
+
+ /*
+ * Number of Copies Spin Button
+ */
+
+ adj = (GtkAdjustment *) gtk_adjustment_new (1.0f, 1.0f, 100.0f,
+ 1.0f, 5.0f, 0.0f);
+ copy_count_spin_button = gtk_spin_button_new (adj, 0, 0);
+ gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (copy_count_spin_button), FALSE);
+ gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (copy_count_spin_button), TRUE);
+ gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (copy_count_spin_button),
+ GTK_UPDATE_IF_VALID);
+
+ g_signal_connect(G_OBJECT (adj), "value_changed",
+ G_CALLBACK (copy_count_callback),
+ NULL);
+
+ gtk_container_add (GTK_CONTAINER (event_box), copy_count_spin_button);
+ gtk_widget_show(copy_count_spin_button);
+}
+
+static void
+create_positioning_frame (void)
+{
+ GtkWidget *frame;
+ GtkWidget *table;
+ GtkWidget *box;
+ GtkWidget *sep;
+
+ frame = gtk_frame_new (_("Image Position"));
+ gtk_box_pack_start (GTK_BOX (right_vbox), frame, FALSE, TRUE, 0);
+ gtk_widget_show (frame);
+
+ table = gtk_table_new (1, 1, 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_container_add (GTK_CONTAINER (frame), table);
+ gtk_widget_show (table);
+
+ /*
+ * Orientation option menu.
+ */
+
+ orientation_menu =
+ stpui_option_menu_new (FALSE,
+ _("Auto"), orientation_callback,
+ (gpointer) ORIENT_AUTO, NULL, NULL, 0,
+ _("Portrait"), orientation_callback,
+ (gpointer) ORIENT_PORTRAIT, NULL, NULL, 0,
+ _("Landscape"), orientation_callback,
+ (gpointer) ORIENT_LANDSCAPE, NULL, NULL, 0,
+ _("Upside down"), orientation_callback,
+ (gpointer) ORIENT_UPSIDEDOWN, NULL, NULL, 0,
+ _("Seascape"), orientation_callback,
+ (gpointer) ORIENT_SEASCAPE, NULL, NULL, 0,
+ NULL);
+ stpui_set_help_data (orientation_menu,
+ _("Select the orientation: portrait, landscape, "
+ "upside down, or seascape (upside down landscape)"));
+ stpui_table_attach_aligned (GTK_TABLE (table), 0, 0, _("Orientation:"),
+ 1.0, 0.5, orientation_menu, 4, TRUE);
+ sep = gtk_hseparator_new ();
+ gtk_table_attach_defaults (GTK_TABLE (table), sep, 0, 6, 1, 2);
+ gtk_widget_show (sep);
+
+ /*
+ * Position entries
+ */
+
+ left_entry = create_positioning_entry
+ (table, 0, 2, _("Left:"),
+ _("Distance from the left of the paper to the image"));
+#if 0
+ right_entry = create_positioning_entry
+ (table, 0, 3, _("Right:"),
+ _("Distance from the left of the paper to the right of the image"));
+#endif
+ right_border_entry = create_positioning_entry
+ (table, 0, 4, _("Right:"),
+ _("Distance from the right of the paper to the image"));
+ top_entry = create_positioning_entry
+ (table, 3, 2, _("Top:"),
+ _("Distance from the top of the paper to the image"));
+#if 0
+ bottom_entry = create_positioning_entry
+ (table, 3, 3, _("Bottom:"),
+ _("Distance from the top of the paper to bottom of the image"));
+#endif
+ bottom_border_entry = create_positioning_entry
+ (table, 3, 4, _("Bottom:"),
+ _("Distance from the bottom of the paper to the image"));
+ /*
+ * Center options
+ */
+
+ sep = gtk_hseparator_new ();
+ gtk_table_attach_defaults (GTK_TABLE (table), sep, 0, 6, 5, 6);
+ gtk_widget_show (sep);
+
+ box = gtk_hbox_new (TRUE, 4);
+ stpui_table_attach_aligned (GTK_TABLE (table), 0, 7, _("Center:"), 0.5, 0.5,
+ box, 5, TRUE);
+ recenter_horizontal_button = create_positioning_button
+ (box, INVALID_LEFT, _("Horizontal"),
+ _("Center the image horizontally on the paper"));
+ recenter_button = create_positioning_button
+ (box, INVALID_LEFT | INVALID_TOP, _("Both"),
+ _("Center the image on the paper"));
+ recenter_vertical_button = create_positioning_button
+ (box, INVALID_TOP, _("Vertical"),
+ _("Center the image vertically on the paper"));
+}
+
+static void
+create_printer_dialog (void)
+{
+ GtkWidget *table;
+ GtkWidget *label;
+ GtkWidget *event_box;
+ GSList *group;
+ gint i;
+ stp_string_list_t *manufacturer_list = stp_string_list_create();
+
+ setup_dialog = stpui_dialog_new(_("Setup Printer"),
+ GTK_WIN_POS_MOUSE, TRUE,
+ _("OK"), setup_ok_callback,
+ NULL, NULL, NULL, TRUE, FALSE,
+ _("Cancel"), setup_cancel_callback,
+ NULL, (GObject *) 1, NULL, FALSE, TRUE,
+ NULL);
+
+ /*
+ * Top-level table for dialog.
+ */
+
+ table = gtk_table_new (4, 4, FALSE);
+ gtk_container_set_border_width (GTK_CONTAINER (table), 6);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 4);
+ gtk_table_set_row_spacing (GTK_TABLE (table), 0, 150);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (setup_dialog)->vbox), table,
+ TRUE, TRUE, 0);
+ gtk_widget_show (table);
+
+ /*
+ * Printer driver option menu.
+ */
+
+ label = gtk_label_new (_("Printer Make:"));
+ gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+ gtk_table_attach (GTK_TABLE (table), label, 1, 2, 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, 2, 4, 0, 2,
+ GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0);
+ gtk_widget_show (event_box);
+
+ stpui_set_help_data (event_box, _("Select the make of your printer"));
+
+ manufacturer_crawler = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (manufacturer_crawler),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_container_add (GTK_CONTAINER (event_box), manufacturer_crawler);
+ gtk_widget_show (manufacturer_crawler);
+
+ manufacturer_clist = gtk_clist_new (1);
+ gtk_widget_set_usize (manufacturer_clist, 200, 0);
+ gtk_clist_set_selection_mode(GTK_CLIST(manufacturer_clist),GTK_SELECTION_SINGLE);
+ gtk_container_add (GTK_CONTAINER (manufacturer_crawler), manufacturer_clist);
+ gtk_widget_show (manufacturer_clist);
+
+ g_signal_connect (G_OBJECT (manufacturer_clist), "select_row",
+ G_CALLBACK (manufacturer_callback), NULL);
+
+
+ label = gtk_label_new (_("Printer Model:"));
+ gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
+ gtk_table_attach (GTK_TABLE (table), label, 4, 5, 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, 5, 7, 0, 2,
+ GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0);
+ gtk_widget_show (event_box);
+
+ stpui_set_help_data (event_box, _("Select your printer model"));
+
+ 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);
+
+ g_signal_connect (G_OBJECT (printer_driver), "select_row",
+ G_CALLBACK (print_driver_callback), NULL);
+
+
+ for (i = 0; i < stp_printer_model_count (); i ++)
+ {
+ const stp_printer_t *the_printer = stp_get_printer_by_index (i);
+
+ if (strcmp(stp_printer_get_long_name (the_printer), "") != 0 &&
+ strcmp(stp_printer_get_family(the_printer), "raw") != 0)
+ {
+ const gchar *make = stp_printer_get_manufacturer(the_printer);
+ if (! stp_string_list_is_present(manufacturer_list, make))
+ stp_string_list_add_string(manufacturer_list, make, make);
+ }
+ }
+
+ for (i = 0; i < stp_string_list_count(manufacturer_list); i++)
+ {
+ const stp_param_string_t *param =
+ stp_string_list_param(manufacturer_list, i);
+ gchar *xname = g_strdup(param->name);
+ gtk_clist_insert(GTK_CLIST(manufacturer_clist), i, &xname);
+ gtk_clist_set_row_data_full(GTK_CLIST(manufacturer_clist), i, xname,
+ g_free);
+ }
+ stp_string_list_destroy(manufacturer_list);
+ gtk_clist_sort(GTK_CLIST(manufacturer_clist));
+ build_printer_driver_clist();
+
+ /*
+ * 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, 1, 2, 3, 4,
+ GTK_FILL, GTK_FILL, 0, 0);
+ gtk_widget_show (ppd_label);
+
+ ppd_box = gtk_hbox_new (FALSE, 8);
+ gtk_table_attach (GTK_TABLE (table), ppd_box, 2, 7, 3, 4,
+ GTK_FILL, GTK_FILL, 0, 0);
+
+ ppd_file = gtk_entry_new ();
+ gtk_box_pack_start (GTK_BOX (ppd_box), ppd_file, TRUE, TRUE, 0);
+ gtk_widget_show (ppd_file);
+
+ stpui_set_help_data(ppd_file,_("Enter the correct PPD filename for your printer"));
+
+ 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 (ppd_box), ppd_button, FALSE, FALSE, 0);
+ gtk_widget_show (ppd_button);
+ gtk_widget_show (ppd_box);
+
+ stpui_set_help_data(ppd_button,
+ _("Choose the correct PPD filename for your printer"));
+ g_signal_connect (G_OBJECT (ppd_button), "clicked",
+ G_CALLBACK (ppd_browse_callback), NULL);
+
+ /*
+ * Print command.
+ */
+
+ group = NULL;
+ for (i = 0; i < command_options_count; i++)
+ group = stpui_create_radio_button(&(command_options[i]), group, table,
+ 0, i > 0 ? i + 5 : i + 4,
+ G_CALLBACK(command_type_callback));
+
+ standard_cmd_entry = gtk_entry_new();
+ gtk_table_attach (GTK_TABLE (table), standard_cmd_entry, 2, 7, 5, 6,
+ GTK_FILL, GTK_FILL, 0, 0);
+ gtk_entry_set_editable(GTK_ENTRY(standard_cmd_entry), FALSE);
+ gtk_widget_set_sensitive(standard_cmd_entry, FALSE);
+ gtk_widget_show (standard_cmd_entry);
+
+ queue_combo = gtk_combo_new ();
+ event_box = gtk_event_box_new ();
+ gtk_container_add (GTK_CONTAINER (event_box), queue_combo);
+ gtk_widget_show (queue_combo);
+ gtk_widget_show (event_box);
+ build_queue_combo();
+
+ stpui_set_help_data(event_box,
+ _("Select the name of the output queue (not the type, "
+ "or model, of printer) that you wish to print to"));
+ label = gtk_label_new(_("Printer Queue:"));
+ gtk_widget_show(label);
+ gtk_table_attach (GTK_TABLE (table), label, 2, 3, 4, 5,
+ GTK_FILL, GTK_FILL, 0, 0);
+ gtk_table_attach (GTK_TABLE (table), event_box, 3, 7, 4, 5,
+ GTK_FILL, GTK_FILL, 0, 0);
+
+ custom_command_entry = gtk_entry_new ();
+ gtk_table_attach (GTK_TABLE (table), custom_command_entry, 2, 7, 6, 7,
+ GTK_FILL, GTK_FILL, 0, 0);
+ g_signal_connect(G_OBJECT(custom_command_entry), "activate",
+ G_CALLBACK(setup_callback), NULL);
+ gtk_widget_set_sensitive(custom_command_entry, FALSE);
+ gtk_widget_show (custom_command_entry);
+
+ stpui_set_help_data
+ (custom_command_entry, _("Enter the correct command to print to your printer. "));
+
+ file_entry = gtk_entry_new ();
+ gtk_table_attach (GTK_TABLE (table), file_entry, 2, 6, 7, 8,
+ GTK_FILL, GTK_FILL, 0, 0);
+ g_signal_connect(G_OBJECT(file_entry), "activate",
+ G_CALLBACK(setup_callback), NULL);
+ gtk_widget_show (file_entry);
+
+ gtk_widget_set_sensitive(file_entry, FALSE);
+ stpui_set_help_data
+ (file_entry, _("Enter the file to print to. "));
+
+ file_button = gtk_button_new_with_label (_("Browse"));
+
+ gtk_table_attach (GTK_TABLE (table), file_button, 6, 7, 7, 8,
+ GTK_FILL, GTK_FILL, 0, 0);
+ gtk_widget_show (file_button);
+
+ stpui_set_help_data(file_button, _("File to print to"));
+ g_signal_connect (G_OBJECT (file_button), "clicked",
+ G_CALLBACK (file_browse_callback), NULL);
+
+ /*
+ * Output file selection dialog.
+ */
+
+ file_browser = gtk_file_selection_new (_("Print To File"));
+
+ g_signal_connect
+ (G_OBJECT (GTK_FILE_SELECTION (file_browser)->ok_button), "clicked",
+ G_CALLBACK (file_ok_callback), NULL);
+ g_signal_connect
+ (G_OBJECT (GTK_FILE_SELECTION (file_browser)->cancel_button), "clicked",
+ G_CALLBACK (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));
+
+ g_signal_connect
+ (G_OBJECT (GTK_FILE_SELECTION (ppd_browser)->ok_button), "clicked",
+ G_CALLBACK (ppd_ok_callback), NULL);
+ g_signal_connect_object
+ (G_OBJECT (GTK_FILE_SELECTION (ppd_browser)->cancel_button), "clicked",
+ G_CALLBACK (gtk_widget_hide), G_OBJECT (ppd_browser), G_CONNECT_SWAPPED);
+}
+
+static void
+create_new_printer_dialog (void)
+{
+ GtkWidget *table;
+
+ new_printer_dialog =
+ stpui_dialog_new (_("Define New Printer"),
+ GTK_WIN_POS_MOUSE, FALSE,
+ _("OK"), new_printer_ok_callback,
+ NULL, NULL, NULL, TRUE, FALSE,
+ _("Cancel"), gtk_widget_hide,
+ NULL, (GObject *) 1, NULL, FALSE, TRUE,
+ NULL);
+
+ table = gtk_table_new (1, 1, 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);
+ stpui_table_attach_aligned(GTK_TABLE (table), 0, 0, _("Printer Name:"), 1.0,
+ 0.5, new_printer_entry, 1, TRUE);
+
+ stpui_set_help_data(new_printer_entry,
+ _("Enter the name you wish to give this logical printer"));
+ g_signal_connect (G_OBJECT (new_printer_entry), "activate",
+ G_CALLBACK (new_printer_ok_callback), NULL);
+}
+
+static void
+create_about_dialog (void)
+{
+ GtkWidget *label;
+ about_dialog =
+ stpui_dialog_new (_("About Gutenprint " PLUG_IN_VERSION),
+ GTK_WIN_POS_MOUSE, FALSE,
+ _("OK"), gtk_widget_hide,
+ NULL, (GObject *) 1, NULL, TRUE, TRUE,
+ NULL);
+
+ label = gtk_label_new
+ (_("Gutenprint Version " PLUG_IN_VERSION "\n"
+ "\n"
+ "Copyright (C) 1997-2003 Michael Sweet, Robert Krawitz,\n"
+ "and the rest of the Gutenprint 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 *sep;
+ GtkWidget *printer_hbox;
+ GtkWidget *button;
+ GtkWidget *event_box;
+ GtkWidget *scrolled_window;
+ gint vpos = 0;
+
+ create_printer_dialog ();
+ create_about_dialog ();
+ create_new_printer_dialog ();
+
+ table = gtk_table_new (1, 1, 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);
+
+ stpui_set_help_data(event_box,
+ _("Select the name of the printer (not the type, "
+ "or model, of printer) that you wish to print to"));
+ stpui_table_attach_aligned(GTK_TABLE (table), 0, vpos++, _("Printer Name:"),
+ 0.0, 0.5, event_box, 1, TRUE);
+ printer_model_label = gtk_label_new ("");
+ stpui_table_attach_aligned(GTK_TABLE (table), 0, vpos++, _("Printer Model:"),
+ 0.0, 0.0, printer_model_label, 1, TRUE);
+ printer_hbox = gtk_hbox_new (TRUE, 4);
+ gtk_table_attach (GTK_TABLE (table), printer_hbox,
+ 1, 4, vpos, vpos + 1, GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 0);
+ vpos += 2;
+ gtk_widget_show (printer_hbox);
+
+ /*
+ * Setup printer button
+ */
+
+ button = gtk_button_new_with_label (_("Setup Printer..."));
+ stpui_set_help_data(button,
+ _("Choose the printer model, PPD file, and command "
+ "that is used to print to this printer"));
+ 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);
+
+ g_signal_connect (G_OBJECT (button), "clicked",
+ G_CALLBACK (setup_open_callback), NULL);
+
+ /*
+ * New printer button
+ */
+
+ button = gtk_button_new_with_label (_("New Printer..."));
+ stpui_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."));
+ gtk_box_pack_start (GTK_BOX (printer_hbox), button, FALSE, TRUE, 0);
+ gtk_widget_show (button);
+
+ g_signal_connect (G_OBJECT (button), "clicked",
+ G_CALLBACK (new_printer_open_callback), NULL);
+
+ sep = gtk_hseparator_new ();
+ gtk_table_attach (GTK_TABLE (table), sep, 0, 5, vpos, vpos + 1,
+ GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 0);
+ gtk_widget_show (sep);
+ vpos++;
+
+ printer_features_table = gtk_table_new(1, 1, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (printer_features_table), 2);
+ gtk_table_set_row_spacings (GTK_TABLE (printer_features_table), 0);
+ gtk_widget_show (printer_features_table);
+
+ scrolled_window = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window),
+ printer_features_table);
+ gtk_table_attach_defaults(GTK_TABLE(table), scrolled_window,
+ 0, 6, vpos, vpos + 1);
+ gtk_widget_show(scrolled_window);
+}
+
+static void
+create_scaling_frame (void)
+{
+ GtkWidget *frame;
+ GtkWidget *vbox;
+ GtkWidget *hbox;
+ GtkWidget *table;
+ GtkWidget *box;
+ GtkWidget *label;
+ GtkWidget *event_box;
+ GtkWidget *sep;
+ GSList *group;
+
+ frame = gtk_frame_new (_("Image Size"));
+ gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
+
+ hbox = gtk_hbox_new (FALSE, 2);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 4);
+ gtk_container_add (GTK_CONTAINER (frame), hbox);
+ gtk_widget_show (hbox);
+
+ vbox = gtk_vbox_new (FALSE, 2);
+/* gtk_container_set_border_width (GTK_CONTAINER (vbox), 4); */
+ gtk_container_add (GTK_CONTAINER (hbox), vbox);
+ gtk_widget_show (vbox);
+
+ table = gtk_table_new (1, 1, 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 plist_callback at the end of initialization
+ * everything will be put right.
+ */
+ scaling_adjustment =
+ stpui_scale_entry_new (GTK_TABLE (table), 0, 0, _("Scaling:"), 100, 75,
+ 100.0, minimum_image_percent, 100.0,
+ 1.0, 10.0, 1, TRUE, 0, 0, NULL);
+ stpui_set_adjustment_tooltip(scaling_adjustment,
+ _("Set the scale (size) of the image"));
+ g_signal_connect (G_OBJECT (scaling_adjustment), "value_changed",
+ G_CALLBACK (scaling_update), NULL);
+
+ box = gtk_hbox_new (FALSE, 4);
+ gtk_box_pack_start (GTK_BOX (vbox), box, TRUE, TRUE, 0);
+ gtk_widget_show (box);
+
+ /*
+ * The scale by percent/ppi toggles
+ */
+
+ table = gtk_table_new (1, 1, 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_FILL, 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);
+
+ stpui_set_help_data(event_box,
+ _("Select whether scaling is measured as percent of "
+ "available page size or number of output dots per inch"));
+
+ scaling_percent = gtk_radio_button_new_with_label (NULL, _("Percent"));
+ group = gtk_radio_button_group (GTK_RADIO_BUTTON (scaling_percent));
+ stpui_table_attach_aligned(GTK_TABLE (table), 0, 0, NULL, 0.5, 0.5,
+ scaling_percent, 2, TRUE);
+
+ stpui_set_help_data(scaling_percent, _("Scale the print to the size of the page"));
+ g_signal_connect (G_OBJECT (scaling_percent), "toggled",
+ G_CALLBACK (scaling_callback), NULL);
+
+ scaling_ppi = gtk_radio_button_new_with_label (group, _("PPI"));
+ stpui_table_attach_aligned(GTK_TABLE (table), 2, 0, NULL, 0.5, 0.5,
+ scaling_ppi, 1, TRUE);
+
+ stpui_set_help_data(scaling_ppi,
+ _("Scale the print to the number of dots per inch"));
+ g_signal_connect (G_OBJECT (scaling_ppi), "toggled",
+ G_CALLBACK (scaling_callback), NULL);
+
+ sep = gtk_vseparator_new ();
+ gtk_box_pack_start (GTK_BOX (hbox), sep, FALSE, FALSE, 8);
+ gtk_widget_show (sep);
+
+ /*
+ * The width/height enries
+ */
+
+ table = gtk_table_new (1, 1, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 2);
+ gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, FALSE, 0);
+ gtk_widget_show (table);
+
+ width_entry = create_positioning_entry
+ (table, 0, 0, _("Width:"), _("Set the width of the print"));
+ height_entry = create_positioning_entry
+ (table, 0, 1, _("Height:"), _("Set the height of the print"));
+
+ /*
+ * 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), 2, 2);
+ gtk_box_pack_end (GTK_BOX (hbox), scaling_image, FALSE, FALSE, 0);
+ gtk_widget_show (scaling_image);
+
+ stpui_set_help_data(scaling_image,
+ _("Set the print size to the size of the image"));
+ g_signal_connect (G_OBJECT (scaling_image), "clicked",
+ G_CALLBACK (scaling_callback), NULL);
+}
+
+/*
+ * create_color_adjust_window (void)
+ *
+ * NOTES:
+ * creates the color adjuster popup, allowing the user to adjust brightness,
+ * contrast, saturation, etc.
+ */
+static void
+create_color_adjust_window (void)
+{
+ GtkWidget *table;
+ GtkWidget *label;
+ GtkWidget *event_box;
+ GtkWidget *scrolled_window;
+ gint x, y; /* Window dimensions */
+
+ initialize_thumbnail();
+
+ color_adjust_dialog =
+ stpui_dialog_new(_("Print Color Adjust"),
+ GTK_WIN_POS_MOUSE, TRUE,
+
+ _("Set Defaults"), set_color_defaults,
+ NULL, NULL, NULL, FALSE, FALSE,
+ _("Close"), gtk_widget_hide,
+ NULL, (GObject *) 1, NULL, TRUE, TRUE,
+ NULL);
+
+ table = gtk_table_new (1, 1, 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), 0);
+/* gtk_table_set_row_spacing (GTK_TABLE (table), 8, 6); */
+
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (color_adjust_dialog)->vbox),
+ table, TRUE, TRUE, 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, 1, 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, thumbnail_w, thumbnail_h);
+ gtk_container_add (GTK_CONTAINER (event_box), GTK_WIDGET (swatch));
+ gtk_widget_show (GTK_WIDGET (swatch));
+
+ stpui_set_help_data (GTK_WIDGET (event_box), _("Image preview"));
+ g_signal_connect (G_OBJECT (swatch), "expose_event",
+ G_CALLBACK (redraw_color_swatch),
+ NULL);
+
+ event_box = gtk_event_box_new ();
+ gtk_widget_show (GTK_WIDGET (event_box));
+ gtk_table_attach (GTK_TABLE (table), GTK_WIDGET (event_box),
+ 1, 2, 0, 1, 0, 0, 0, 0);
+
+ output_color_vbox = gtk_vbox_new(TRUE, 0);
+ gtk_container_add(GTK_CONTAINER(event_box), output_color_vbox);
+ gtk_widget_show(GTK_WIDGET(output_color_vbox));
+
+ label = gtk_label_new(_("View Output Channels:"));
+ gtk_box_pack_start(GTK_BOX(output_color_vbox), label, TRUE, TRUE, 0);
+ gtk_widget_show(GTK_WIDGET(label));
+
+ cyan_button = gtk_toggle_button_new_with_label(_("Cyan"));
+ gtk_box_pack_start(GTK_BOX(output_color_vbox), cyan_button, TRUE, TRUE, 0);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cyan_button), TRUE);
+ gtk_widget_show(GTK_WIDGET(cyan_button));
+ g_signal_connect (G_OBJECT (cyan_button), "toggled",
+ G_CALLBACK (color_button_callback), NULL);
+
+ magenta_button = gtk_toggle_button_new_with_label(_("Magenta"));
+ gtk_box_pack_start(GTK_BOX(output_color_vbox), magenta_button, TRUE, TRUE,0);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(magenta_button), TRUE);
+ gtk_widget_show(GTK_WIDGET(magenta_button));
+ g_signal_connect (G_OBJECT (magenta_button), "toggled",
+ G_CALLBACK (color_button_callback), NULL);
+
+ yellow_button = gtk_toggle_button_new_with_label(_("Yellow"));
+ gtk_box_pack_start(GTK_BOX(output_color_vbox), yellow_button, TRUE, TRUE, 0);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(yellow_button), TRUE);
+ gtk_widget_show(GTK_WIDGET(yellow_button));
+ g_signal_connect (G_OBJECT (yellow_button), "toggled",
+ G_CALLBACK (color_button_callback), NULL);
+
+ black_button = gtk_toggle_button_new_with_label(_("Black"));
+ gtk_box_pack_start(GTK_BOX(output_color_vbox), black_button, TRUE, TRUE, 0);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(black_button), TRUE);
+ gtk_widget_show(GTK_WIDGET(black_button));
+ g_signal_connect (G_OBJECT (black_button), "toggled",
+ G_CALLBACK (color_button_callback), NULL);
+
+ color_adjustment_table = gtk_table_new(1, 1, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (color_adjustment_table), 2);
+ gtk_table_set_row_spacings (GTK_TABLE (color_adjustment_table), 0);
+ gtk_container_set_border_width (GTK_CONTAINER (color_adjustment_table), 4);
+ gtk_widget_show (color_adjustment_table);
+
+ scrolled_window = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window),
+ color_adjustment_table);
+ gtk_table_attach_defaults(GTK_TABLE(table), scrolled_window,
+ 0, 2, 1, 2);
+ gtk_widget_show(scrolled_window);
+
+ /* The initial size request does not account for the
+ GtkScrolledWindow. */
+ gtk_window_get_size(GTK_WINDOW(color_adjust_dialog), &x, &y);
+ gtk_window_set_default_size(GTK_WINDOW(color_adjust_dialog), x, y+300);
+}
+
+static void
+create_image_settings_frame (void)
+{
+ GtkWidget *vbox;
+ GtkWidget *hbox;
+ GtkWidget *table;
+ GtkWidget *label;
+ GtkWidget *event_box;
+ GtkWidget *sep;
+ GSList *group;
+ gint i;
+
+ 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 (_("Output")));
+ gtk_widget_show (vbox);
+
+ table = gtk_table_new (1, 1, 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_FILL, GTK_FILL, 0, 0);
+ gtk_widget_show (event_box);
+
+ /*
+ * Output type toggles.
+ */
+
+ table = gtk_table_new (1, 1, 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_FILL, 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);
+
+ stpui_set_help_data(event_box, _("Select the desired output type"));
+
+ group = NULL;
+ for (i = 0; i < output_type_count; i++)
+ group = stpui_create_radio_button(&(output_types[i]), group, table, 0, i,
+ G_CALLBACK(output_type_callback));
+
+ sep = gtk_hseparator_new ();
+ gtk_box_pack_start (GTK_BOX (vbox), sep, FALSE, FALSE, 0);
+ gtk_widget_show (sep);
+
+ /*
+ * Color adjust button
+ */
+ hbox = gtk_hbox_new (FALSE, 4);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
+ gtk_widget_show(hbox);
+ label = gtk_label_new("");
+ gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
+ gtk_widget_show(label);
+
+ adjust_color_button = gtk_button_new_with_label (_("Adjust Output..."));
+ gtk_misc_set_padding (GTK_MISC (GTK_BIN (adjust_color_button)->child), 4, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), adjust_color_button, FALSE, FALSE, 0);
+ gtk_widget_show(adjust_color_button);
+ label = gtk_label_new("");
+ gtk_box_pack_end(GTK_BOX(hbox), label, TRUE, TRUE, 0);
+ gtk_widget_show(label);
+
+ stpui_set_help_data(adjust_color_button,
+ _("Adjust color balance, brightness, contrast, "
+ "saturation, and dither algorithm"));
+ g_signal_connect_object (G_OBJECT (adjust_color_button), "clicked",
+ G_CALLBACK (gtk_widget_show),
+ G_OBJECT (color_adjust_dialog),
+ G_CONNECT_SWAPPED);
+}
+
+static void
+create_units_frame (void)
+{
+ GtkWidget *vbox;
+ GtkWidget *table;
+ GtkWidget *label;
+ GtkWidget *event_box;
+ GSList *group;
+ gint i;
+
+ units_hbox = gtk_hbox_new(FALSE, 0);
+ label = gtk_label_new(_("Size Units:"));
+ gtk_widget_show(label);
+ gtk_box_pack_start(GTK_BOX(units_hbox), label, TRUE, TRUE, 0);
+ units_label = gtk_label_new(_(" "));
+ gtk_widget_show(units_label);
+ gtk_box_pack_start(GTK_BOX(units_hbox), units_label, TRUE, TRUE, 0);
+ gtk_widget_show(units_hbox);
+
+ vbox = gtk_vbox_new (FALSE, 4);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
+ gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, units_hbox);
+ gtk_widget_show (vbox);
+
+ /*
+ * The units toggles
+ */
+
+ table = gtk_table_new (1, 1, 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 (_("Units:"));
+ gtk_container_add (GTK_CONTAINER (event_box), label);
+ gtk_widget_show (label);
+
+ stpui_set_help_data(event_box,
+ _("Select the base unit of measurement for printing"));
+
+ group = NULL;
+ for (i = 0; i < unit_count; i++)
+ {
+ unit_t *unit = &(units[i]);
+ unit->checkbox = gtk_radio_button_new_with_label(group, _(unit->name));
+ group = gtk_radio_button_group(GTK_RADIO_BUTTON(unit->checkbox));
+ stpui_table_attach_aligned(GTK_TABLE(table), i / 2, i % 2, NULL, 0.5,
+ 0.5, unit->checkbox, 1, TRUE);
+ stpui_set_help_data(unit->checkbox, _(unit->help));
+ g_signal_connect(G_OBJECT(unit->checkbox), "toggled",
+ G_CALLBACK(unit_callback), (gpointer) i);
+ }
+}
+
+/*
+ * create_main_window()
+ */
+static void
+create_main_window (void)
+{
+ gint x, y; /* Window dimensions */
+
+ set_current_printer();
+ manufacturer = stp_printer_get_manufacturer(stp_get_printer(pv->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.
+ */
+
+ stpui_help_init();
+
+ create_top_level_structure ();
+
+ create_preview ();
+ create_printer_settings_frame ();
+ create_units_frame();
+ create_paper_size_frame();
+ create_copy_number_frame();
+ create_positioning_frame ();
+ create_scaling_frame ();
+ create_image_settings_frame ();
+
+ /*
+ * Now actually set up the correct values in the dialog
+ */
+
+ do_update_thumbnail = 1;
+ build_printer_combo ();
+ plist_callback (NULL, (gpointer) stpui_plist_current);
+ update_adjusted_thumbnail ();
+
+ /* The initial size request does not account for the
+ GtkScrolledWindow. */
+ gtk_window_get_size(GTK_WINDOW(print_dialog), &x, &y);
+ gtk_window_set_default_size(GTK_WINDOW(print_dialog), x, y+80);
+
+ gtk_widget_show (print_dialog);
+}
+
+static void
+set_entry_value(GtkWidget *entry, double value, int block)
+{
+ gchar s[255];
+ gdouble unit_scaler = units[pv->unit].scale;
+ const gchar *format = units[pv->unit].format;
+
+ g_snprintf(s, sizeof(s), format, value / unit_scaler);
+ if (block)
+ g_signal_handlers_block_matched (G_OBJECT (entry),
+ G_SIGNAL_MATCH_DATA,
+ 0,
+ 0,
+ NULL,
+ NULL,
+ NULL);
+
+ gtk_entry_set_text (GTK_ENTRY (entry), s);
+ if (block)
+ g_signal_handlers_unblock_matched (G_OBJECT (entry),
+ G_SIGNAL_MATCH_DATA,
+ 0,
+ 0,
+ NULL,
+ NULL,
+ NULL);
+}
+
+static void
+reset_preview(void)
+{
+ if (!suppress_preview_reset)
+ {
+ stpui_enable_help();
+ buttons_pressed = preview_active = 0;
+ }
+}
+
+static void
+invalidate_preview_thumbnail (void)
+{
+ preview_valid = FALSE;
+}
+
+static void
+invalidate_frame (void)
+{
+ frame_valid = FALSE;
+}
+
+static void
+compute_scaling_limits(gdouble *min_ppi_scaling, gdouble *max_ppi_scaling)
+{
+ if (auto_paper_size)
+ {
+ *min_ppi_scaling =
+ FINCH * (gdouble) image_width / (gdouble) printable_width;
+ }
+ else
+ {
+ gdouble min_ppi_scaling1 =
+ FINCH * (gdouble) image_width / (gdouble) printable_width;
+ gdouble min_ppi_scaling2 =
+ FINCH * (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 / minimum_image_percent;
+}
+
+/*
+ * scaling_update() - Update the scaling scale using the slider.
+ */
+static void
+scaling_update (GtkAdjustment *adjustment)
+{
+ reset_preview ();
+
+ if (pv->scaling != adjustment->value)
+ {
+ invalidate_preview_thumbnail ();
+ if (GTK_TOGGLE_BUTTON (scaling_ppi)->active)
+ pv->scaling = -adjustment->value;
+ else
+ pv->scaling = adjustment->value;
+
+ suppress_scaling_adjustment = TRUE;
+ preview_update ();
+ suppress_scaling_adjustment = FALSE;
+ }
+}
+
+/*
+ * scaling_callback() - Update the scaling scale using radio buttons.
+ */
+static void
+scaling_callback (GtkWidget *widget)
+{
+ gdouble max_ppi_scaling;
+ gdouble min_ppi_scaling;
+ gdouble current_scale;
+
+ reset_preview ();
+
+ if (suppress_scaling_callback)
+ return;
+
+ compute_scaling_limits(&min_ppi_scaling, &max_ppi_scaling);
+
+ 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);
+ pv->scaling = 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 = minimum_image_percent;
+ 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 < minimum_image_percent)
+ new_percent = minimum_image_percent;
+
+ GTK_ADJUSTMENT (scaling_adjustment)->value = new_percent;
+ pv->scaling = 0.0;
+ }
+ else if (widget == scaling_image)
+ {
+ gdouble yres = image_yres;
+
+ invalidate_preview_thumbnail ();
+
+ 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;
+ pv->scaling = 0.0;
+ }
+
+ if (widget == scaling_ppi || widget == scaling_percent)
+ suppress_preview_update++;
+ gtk_adjustment_changed (GTK_ADJUSTMENT (scaling_adjustment));
+ gtk_adjustment_value_changed (GTK_ADJUSTMENT (scaling_adjustment));
+ if (auto_paper_size)
+ set_media_size(stp_get_string_parameter(pv->v, "PageSize"));
+ if (widget == scaling_ppi || widget == scaling_percent)
+ suppress_preview_update--;
+}
+
+/****************************************************************************
+ *
+ * plist_build_combo
+ *
+ ****************************************************************************/
+static void
+plist_build_combo (GtkWidget *combo, /* I - Combo widget */
+ GtkWidget *label,
+ stp_string_list_t *items, /* I - Menu items */
+ int active,
+ const gchar *cur_item, /* I - Current item */
+ const gchar *def_value, /* I - default item */
+ GCallback callback, /* I - Callback */
+ gint *callback_id, /* IO - Callback ID (init to -1) */
+ int (*check_func)(const char *string),
+ gpointer data)
+{
+ gint i; /* Looping var */
+ GList *list = 0;
+ gint num_items = 0;
+ GtkEntry *entry = GTK_ENTRY (GTK_COMBO (combo)->entry);
+
+ if (check_func && items)
+ {
+ stp_string_list_t *new_items = stp_string_list_create();
+ num_items = stp_string_list_count(items);
+ for (i = 0; i < num_items; i++)
+ {
+ stp_param_string_t *param = stp_string_list_param(items, i);
+ if ((*check_func)(param->name))
+ stp_string_list_add_string(new_items, param->name, param->text);
+ }
+ items = new_items;
+ }
+
+ if (items)
+ num_items = stp_string_list_count(items);
+
+ if (*callback_id != -1)
+ g_signal_handler_disconnect (G_OBJECT (entry), *callback_id);
+ gtk_entry_set_editable (entry, FALSE);
+
+ if (!active || 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_hide (combo);
+ if (label)
+ gtk_widget_hide(label);
+ if (check_func && items)
+ stp_string_list_destroy(items);
+ return;
+ }
+
+ for (i = 0; i < num_items; i ++)
+ list = g_list_append(list, g_strdup(stp_string_list_param(items, i)->text));
+
+ gtk_combo_set_popdown_strings (GTK_COMBO (combo), list);
+
+ for (i = 0; i < num_items; i ++)
+ if (strcmp(stp_string_list_param(items, i)->name, cur_item) == 0)
+ break;
+
+ if (i >= num_items && def_value)
+ for (i = 0; i < num_items; i ++)
+ if (strcmp(stp_string_list_param(items, i)->name, def_value) == 0)
+ break;
+
+ if (i >= num_items)
+ i = 0;
+
+ gtk_entry_set_text (entry, stp_string_list_param(items, i)->text);
+
+ gtk_combo_set_value_in_list (GTK_COMBO (combo), TRUE, FALSE);
+ gtk_widget_set_sensitive (combo, TRUE);
+ gtk_widget_show (combo);
+ if (label)
+ gtk_widget_show(label);
+
+ *callback_id = g_signal_connect (G_OBJECT (entry), "changed", callback,
+ data);
+ if (check_func && items)
+ stp_string_list_destroy(items);
+}
+
+void
+stpui_set_image_dimensions(gint width, gint height)
+{
+ image_true_width = width;
+ image_true_height = height;
+}
+
+void
+stpui_set_image_resolution(gdouble xres, gdouble yres)
+{
+ image_xres = xres;
+ image_yres = yres;
+}
+
+gint
+stpui_compute_orientation(void)
+{
+ if (auto_paper_size ||
+ (printable_width >= printable_height &&
+ image_true_width >= image_true_height) ||
+ (printable_height >= printable_width &&
+ image_true_height >= image_true_width))
+ return ORIENT_PORTRAIT;
+ else
+ return ORIENT_LANDSCAPE;
+}
+
+static void
+set_orientation(int orientation)
+{
+ pv->orientation = orientation;
+ if (orientation == ORIENT_AUTO)
+ orientation = stpui_compute_orientation();
+ physical_orientation = orientation;
+ switch (orientation)
+ {
+ case ORIENT_PORTRAIT:
+ case ORIENT_UPSIDEDOWN:
+ image_height = image_true_height;
+ image_width = image_true_width;
+ preview_thumbnail_h = thumbnail_h;
+ preview_thumbnail_w = thumbnail_w;
+ break;
+ case ORIENT_LANDSCAPE:
+ case ORIENT_SEASCAPE:
+ image_height = image_true_width;
+ image_width = image_true_height;
+ preview_thumbnail_h = thumbnail_w;
+ preview_thumbnail_w = thumbnail_h;
+ break;
+ }
+ update_adjusted_thumbnail();
+}
+
+static void
+position_button_callback(GtkWidget *widget, gpointer data)
+{
+ reset_preview();
+ pv->invalid_mask |= (gint) data;
+ preview_update ();
+}
+
+/*
+ * position_callback() - callback for position entry widgets
+ */
+static void
+position_callback (GtkWidget *widget)
+{
+ gdouble new_printed_value = atof (gtk_entry_get_text (GTK_ENTRY (widget)));
+ gint new_value = SCALE(new_printed_value, units[pv->unit].scale);
+
+ reset_preview ();
+ suppress_preview_update++;
+
+ if (widget == top_entry)
+ stp_set_top(pv->v, new_value);
+/*
+ else if (widget == bottom_entry)
+ stp_set_top(pv->v, new_value - print_height);
+*/
+ else if (widget == bottom_border_entry)
+ stp_set_top (pv->v, paper_height - print_height - new_value);
+ else if (widget == left_entry)
+ stp_set_left (pv->v, new_value);
+/*
+ else if (widget == right_entry)
+ stp_set_left(pv->v, new_value - print_width);
+*/
+ else if (widget == right_border_entry)
+ stp_set_left (pv->v, paper_width - print_width - new_value);
+ else if (widget == width_entry || widget == height_entry)
+ {
+ gboolean was_percent = (pv->scaling >= 0);
+ if (pv->scaling >= 0)
+ {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scaling_ppi), TRUE);
+ scaling_callback (scaling_ppi);
+ }
+ if (widget == width_entry)
+ GTK_ADJUSTMENT (scaling_adjustment)->value =
+ ((gdouble) image_width) / (new_value / FINCH);
+ else
+ GTK_ADJUSTMENT (scaling_adjustment)->value =
+ ((gdouble) image_height) / (new_value / FINCH);
+ 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));
+ }
+ }
+
+ suppress_preview_update--;
+ preview_update ();
+}
+
+static void
+set_adjustment_active(option_t *opt, gboolean active, gboolean do_toggle)
+{
+ GtkObject *adj = opt->info.flt.adjustment;
+ if (do_toggle)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(opt->checkbox), active);
+ gtk_widget_set_sensitive
+ (GTK_WIDGET (SCALE_ENTRY_LABEL (adj)), active);
+ gtk_widget_set_sensitive
+ (GTK_WIDGET (SCALE_ENTRY_SCALE (adj)), active);
+ gtk_widget_set_sensitive
+ (GTK_WIDGET (SCALE_ENTRY_SPINBUTTON (adj)), active);
+}
+
+static void
+set_combo_active(option_t *opt, gboolean active, gboolean do_toggle)
+{
+ if (do_toggle)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(opt->checkbox), active);
+ gtk_widget_set_sensitive(GTK_WIDGET(opt->info.list.combo), active);
+ gtk_widget_set_sensitive(GTK_WIDGET(opt->info.list.label), active);
+}
+
+static void
+set_curve_active(option_t *opt, gboolean active, gboolean do_toggle)
+{
+ if (do_toggle)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(opt->checkbox), active);
+ gtk_widget_set_sensitive(GTK_WIDGET(opt->info.curve.button), active);
+ gtk_widget_set_sensitive(GTK_WIDGET(opt->info.curve.label), active);
+ if (active)
+ {
+ if (opt->info.curve.is_visible)
+ gtk_widget_show(GTK_WIDGET(opt->info.curve.dialog));
+ }
+ else
+ gtk_widget_hide(GTK_WIDGET(opt->info.curve.dialog));
+}
+
+static void
+set_bool_active(option_t *opt, gboolean active, gboolean do_toggle)
+{
+ if (do_toggle)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(opt->checkbox), active);
+ gtk_widget_set_sensitive(GTK_WIDGET(opt->info.bool.checkbox), active);
+}
+
+static void
+do_color_updates (void)
+{
+ int i;
+ for (i = 0; i < current_option_count; i++)
+ {
+ option_t *opt = &(current_options[i]);
+ if (opt->fast_desc->p_level <= MAXIMUM_PARAMETER_LEVEL)
+ {
+ switch (opt->fast_desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_DOUBLE:
+ if (stp_check_float_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE))
+ gtk_adjustment_set_value
+ (GTK_ADJUSTMENT(opt->info.flt.adjustment),
+ stp_get_float_parameter(pv->v, opt->fast_desc->name));
+ if (stp_check_float_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE) ||
+ opt->fast_desc->is_mandatory)
+ set_adjustment_active(opt, TRUE, TRUE);
+ else
+ set_adjustment_active(opt, FALSE, TRUE);
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ if (stp_check_dimension_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE))
+ {
+ gdouble unit_scaler = units[pv->unit].scale;
+ gtk_adjustment_set_value
+ (GTK_ADJUSTMENT(opt->info.flt.adjustment),
+ (stp_get_dimension_parameter(pv->v, opt->fast_desc->name) /
+ unit_scaler));
+ }
+ if (stp_check_dimension_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE) ||
+ opt->fast_desc->is_mandatory)
+ set_adjustment_active(opt, TRUE, TRUE);
+ else
+ set_adjustment_active(opt, FALSE, TRUE);
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ if (stp_check_curve_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE) ||
+ opt->fast_desc->is_mandatory)
+ set_curve_active(opt, TRUE, TRUE);
+ else
+ set_curve_active(opt, FALSE, TRUE);
+ break;
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ if (strcmp(opt->fast_desc->name, "PageSize") == 0)
+ build_page_size_combo(opt);
+ else if (stp_check_string_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE))
+ plist_build_combo(opt->info.list.combo, opt->info.list.label,
+ opt->info.list.params, opt->is_active,
+ (stp_get_string_parameter
+ (pv->v, opt->fast_desc->name)),
+ opt->info.list.default_val,
+ G_CALLBACK(combo_callback),
+ &(opt->info.list.callback_id),
+ NULL, opt);
+ if (stp_check_string_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE) ||
+ opt->fast_desc->is_mandatory)
+ set_combo_active(opt, TRUE, TRUE);
+ else
+ set_combo_active(opt, FALSE, TRUE);
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ if (stp_check_boolean_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE))
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON(opt->info.bool.checkbox),
+ stp_get_boolean_parameter(pv->v, opt->fast_desc->name));
+ if (stp_check_boolean_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE) ||
+ opt->fast_desc->is_mandatory)
+ set_bool_active(opt, TRUE, TRUE);
+ else
+ set_bool_active(opt, FALSE, TRUE);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ update_adjusted_thumbnail ();
+}
+
+static void
+update_options(void)
+{
+ gtk_widget_hide(page_size_table);
+ gtk_widget_hide(printer_features_table);
+ gtk_widget_hide(color_adjustment_table);
+ populate_options(pv->v);
+ populate_option_table(page_size_table, STP_PARAMETER_CLASS_CORE);
+ populate_option_table(printer_features_table, STP_PARAMETER_CLASS_FEATURE);
+ populate_option_table(color_adjustment_table, STP_PARAMETER_CLASS_OUTPUT);
+ gtk_widget_show(page_size_table);
+ gtk_widget_show(printer_features_table);
+ gtk_widget_show(color_adjustment_table);
+ set_options_active(NULL);
+}
+
+static void
+update_standard_print_command(void)
+{
+ char *label_text =
+ stpui_build_standard_print_command(pv, stp_get_printer(pv->v));
+ gtk_entry_set_text(GTK_ENTRY(standard_cmd_entry), label_text);
+ g_free(label_text);
+}
+
+static void
+do_all_updates(void)
+{
+ gint i;
+ suppress_preview_update++;
+ set_orientation(pv->orientation);
+ invalidate_preview_thumbnail ();
+ preview_update ();
+ update_standard_print_command();
+
+ if (pv->scaling < 0)
+ {
+ gdouble tmp = -pv->scaling;
+ gdouble max_ppi_scaling;
+ gdouble min_ppi_scaling;
+
+ compute_scaling_limits(&min_ppi_scaling, &max_ppi_scaling);
+
+ 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 = pv->scaling;
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scaling_percent), TRUE);
+ GTK_ADJUSTMENT (scaling_adjustment)->lower = minimum_image_percent;
+ GTK_ADJUSTMENT (scaling_adjustment)->upper = 100.0;
+ GTK_ADJUSTMENT (scaling_adjustment)->value = tmp;
+ g_signal_emit_by_name (G_OBJECT(scaling_adjustment), "changed");
+ g_signal_emit_by_name (G_OBJECT(scaling_adjustment), "value_changed");
+ }
+
+ for (i = 0; i < output_type_count; i++)
+ {
+ if (stp_get_string_parameter(pv->v, "PrintingMode") &&
+ strcmp(output_types[i].value,
+ stp_get_string_parameter(pv->v, "PrintingMode")) == 0)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(output_types[i].button),
+ TRUE);
+ }
+
+ /*
+ * Now get option parameters.
+ */
+
+ update_options();
+ do_color_updates ();
+
+ gtk_option_menu_set_history (GTK_OPTION_MENU (orientation_menu),
+ pv->orientation + 1);
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(units[pv->unit].checkbox),
+ TRUE);
+ gtk_label_set_text(GTK_LABEL(units_label), units[pv->unit].name);
+ suppress_preview_update--;
+ preview_update ();
+}
+
+static void
+copy_count_callback(GtkAdjustment *adjustment, gpointer data)
+{
+ gint copy_count = (gint) adjustment->value;
+ stpui_plist_set_copy_count(pv, copy_count);
+ update_standard_print_command();
+}
+
+static void
+auto_paper_size_callback(GtkWidget *widget, gpointer data)
+{
+ auto_paper_size =
+ gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(auto_paper_size_button));
+ pv->auto_size_roll_feed_paper = auto_paper_size;
+ set_orientation(pv->orientation);
+ do_all_updates();
+}
+
+static void
+setup_auto_paper_size(void)
+{
+ const stp_papersize_t *ps =
+ stp_get_papersize_by_name(stp_get_string_parameter(pv->v, "PageSize"));
+ if (ps->height == 0 && ps->width != 0) /* Implies roll feed */
+ {
+ g_signal_handlers_block_matched (G_OBJECT(auto_paper_size_button),
+ G_SIGNAL_MATCH_DATA,
+ 0,
+ 0,
+ NULL,
+ NULL,
+ NULL);
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auto_paper_size_button),
+ pv->auto_size_roll_feed_paper);
+ gtk_widget_show(auto_paper_size_button);
+ g_signal_handlers_unblock_matched (G_OBJECT(auto_paper_size_button),
+ G_SIGNAL_MATCH_DATA,
+ 0,
+ 0,
+ NULL,
+ NULL,
+ NULL);
+ }
+ else
+ {
+ gtk_widget_hide(auto_paper_size_button);
+ auto_paper_size = 0;
+ }
+}
+
+static void
+queue_callback (GtkWidget *widget,
+ gpointer data)
+{
+ int i;
+ int count = stp_string_list_count(stpui_system_print_queues);
+ const gchar *result =
+ gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(queue_combo)->entry));
+ for (i = 0; i < count; i++)
+ {
+ const stp_param_string_t *s =
+ stp_string_list_param(stpui_system_print_queues, i);
+ if (!strcmp(result, s->text))
+ {
+ stpui_plist_set_queue_name(pv, s->name);
+ do_all_updates();
+ return;
+ }
+ }
+}
+
+static void
+setup_callback (GtkWidget *widget)
+{
+ const gchar *new_value = gtk_entry_get_text (GTK_ENTRY (widget));
+
+ if (widget == custom_command_entry)
+ stpui_plist_set_custom_command(pv, new_value);
+ else if (widget == file_entry)
+ {
+ stpui_plist_set_output_filename(pv, new_value);
+ gtk_file_selection_set_filename
+ (GTK_FILE_SELECTION (file_browser),
+ gtk_entry_get_text (GTK_ENTRY (file_entry)));
+ }
+}
+
+/*
+ * plist_callback() - Update the current system printer.
+ */
+static void
+plist_callback (GtkWidget *widget,
+ gpointer data)
+{
+ gint i;
+ char *tmp;
+ stp_parameter_t desc;
+
+ suppress_preview_update++;
+ invalidate_frame ();
+ invalidate_preview_thumbnail ();
+ reset_preview ();
+
+ if (widget)
+ {
+ const gchar *result =
+ gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(printer_combo)->entry));
+
+ for (i = 0; i < stpui_plist_count; i++)
+ {
+ if (! strcmp (result, stp_string_list_param(printer_list, i)->text))
+ {
+ stpui_plist_current = i;
+ break;
+ }
+ }
+ }
+ else
+ {
+ stpui_plist_current = (gint) data;
+ }
+
+ set_current_printer();
+ build_queue_combo();
+ manufacturer = stp_printer_get_manufacturer(stp_get_printer(pv->v));
+ build_printer_driver_clist();
+
+ if (strcmp(stp_get_driver(pv->v), "") != 0)
+ tmp_printer = stp_get_printer(pv->v);
+
+ stp_describe_parameter(pv->v, "PrintingMode", &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_STRING_LIST)
+ {
+ if (!stp_string_list_is_present(desc.bounds.str, "Color"))
+ {
+ gtk_widget_set_sensitive (output_types[1].button, TRUE);
+ if (gtk_toggle_button_get_active
+ (GTK_TOGGLE_BUTTON (output_types[0].button)) == TRUE)
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON (output_types[1].button), TRUE);
+ gtk_widget_set_sensitive (output_types[0].button, FALSE);
+ }
+ else if (!stp_string_list_is_present(desc.bounds.str, "BW"))
+ {
+ gtk_widget_set_sensitive (output_types[0].button, TRUE);
+ if (gtk_toggle_button_get_active
+ (GTK_TOGGLE_BUTTON (output_types[1].button)) == TRUE)
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON (output_types[0].button), TRUE);
+ gtk_widget_set_sensitive (output_types[1].button, FALSE);
+ }
+ else
+ {
+ gtk_widget_set_sensitive (output_types[0].button, TRUE);
+ gtk_widget_set_sensitive (output_types[1].button, TRUE);
+ }
+ }
+ stp_parameter_description_destroy(&desc);
+ gtk_entry_set_text(GTK_ENTRY(file_entry),
+ stpui_plist_get_output_filename(pv));
+ tmp = stpui_build_standard_print_command(pv, stp_get_printer(pv->v));
+ gtk_entry_set_text(GTK_ENTRY(standard_cmd_entry), tmp);
+ stp_free(tmp);
+ gtk_entry_set_text(GTK_ENTRY(custom_command_entry),
+ stpui_plist_get_custom_command(pv));
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(copy_count_spin_button),
+ (gfloat) stpui_plist_get_copy_count(pv));
+ do_all_updates();
+
+ setup_update ();
+ do_all_updates();
+ suppress_preview_update--;
+ update_adjusted_thumbnail();
+ preview_update ();
+}
+
+static void
+show_all_paper_sizes_callback(GtkWidget *widget, gpointer data)
+{
+ int i;
+ stpui_show_all_paper_sizes =
+ gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+ for (i = 0; i < current_option_count; i++)
+ {
+ option_t *option = &(current_options[i]);
+ if (option->fast_desc &&
+ strcmp(option->fast_desc->name, "PageSize") == 0)
+ {
+ build_a_combo(option);
+ break;
+ }
+ }
+}
+
+static void
+custom_media_size_callback(GtkWidget *widget,
+ gpointer data)
+{
+ gint width_limit, height_limit;
+ gint min_width_limit, min_height_limit;
+ gdouble new_printed_value = atof(gtk_entry_get_text(GTK_ENTRY(widget)));
+ gint new_value = SCALE(new_printed_value, units[pv->unit].scale);
+ invalidate_frame ();
+ invalidate_preview_thumbnail ();
+ reset_preview ();
+
+ stp_get_size_limit(pv->v, &width_limit, &height_limit,
+ &min_width_limit, &min_height_limit);
+ if (widget == custom_size_width)
+ {
+ 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->v, new_value);
+ }
+ else
+ {
+ 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->v, new_value);
+ }
+ set_entry_value (widget, new_value, 0);
+ preview_update ();
+}
+
+
+/*
+ * media_size_callback() - Update the current media size.
+ */
+static void
+set_media_size(const gchar *new_media_size)
+{
+ static int setting_media_size = 0;
+ const stp_papersize_t *pap = stp_get_papersize_by_name (new_media_size);
+
+ if (setting_media_size)
+ return;
+ setting_media_size++;
+
+ if (pap)
+ {
+ gint size;
+ int old_width = stp_get_page_width(pv->v);
+ int old_height = stp_get_page_height(pv->v);
+ int need_preview_update = 0;
+
+ if (! stpui_show_all_paper_sizes &&
+ (pap->paper_unit == PAPERSIZE_METRIC_EXTENDED ||
+ pap->paper_unit == PAPERSIZE_ENGLISH_EXTENDED))
+ {
+ int i;
+ stp_parameter_t desc;
+ stp_describe_parameter(pv->v, "PageSize", &desc);
+ stp_set_string_parameter(pv->v, "PageSize", desc.deflt.str);
+ pap = stp_get_papersize_by_name(desc.deflt.str);
+ stp_parameter_description_destroy(&desc);
+ for (i = 0; i < current_option_count; i++)
+ {
+ option_t *option = &(current_options[i]);
+ if (option->fast_desc &&
+ strcmp(option->fast_desc->name, "PageSize") == 0)
+ {
+ build_a_combo(option);
+ break;
+ }
+ }
+ }
+
+ if (pap->width == 0)
+ {
+ int max_w, max_h, min_w, min_h;
+ stp_get_size_limit(pv->v, &max_w, &max_h, &min_w, &min_h);
+ size = old_width;
+ if (size < min_w)
+ size = min_w;
+ else if (size > max_w)
+ size = max_w;
+ gtk_widget_set_sensitive (GTK_WIDGET (custom_size_width), TRUE);
+ gtk_entry_set_editable (GTK_ENTRY (custom_size_width), TRUE);
+ }
+ else
+ {
+ size = pap->width;
+ gtk_widget_set_sensitive (GTK_WIDGET (custom_size_width), FALSE);
+ gtk_entry_set_editable (GTK_ENTRY (custom_size_width), FALSE);
+ }
+ if (size != old_width)
+ {
+ need_preview_update = 1;
+ set_entry_value (custom_size_width, size, 0);
+ stp_set_page_width (pv->v, size);
+ }
+
+ setup_auto_paper_size();
+ if (pap->height == 0)
+ {
+ int max_w, max_h, min_w, min_h;
+ stp_get_size_limit(pv->v, &max_w, &max_h, &min_w, &min_h);
+ if (auto_paper_size)
+ {
+ int l, r, b, t;
+ stp_set_page_height(pv->v, 0);
+ old_height = 0;
+ stp_get_imageable_area(pv->v, &l, &r, &b, &t);
+ gtk_widget_set_sensitive(GTK_WIDGET(custom_size_height), FALSE);
+ gtk_entry_set_editable(GTK_ENTRY(custom_size_height), FALSE);
+ size = print_height;
+ }
+ else
+ {
+ gtk_widget_set_sensitive (GTK_WIDGET (custom_size_height), TRUE);
+ gtk_entry_set_editable (GTK_ENTRY (custom_size_height), TRUE);
+ size = old_height;
+ }
+ if (size < min_h)
+ size = min_h;
+ else if (size > max_h)
+ size = max_h;
+ }
+ else
+ {
+ size = pap->height;
+ gtk_widget_set_sensitive(GTK_WIDGET (custom_size_height), FALSE);
+ gtk_entry_set_editable (GTK_ENTRY (custom_size_height), FALSE);
+ }
+ if (size != old_height)
+ {
+ need_preview_update = 1;
+ set_entry_value (custom_size_height, size, 0);
+ stp_set_page_height (pv->v, size);
+ }
+ if (need_preview_update)
+ {
+ invalidate_preview_thumbnail();
+ invalidate_frame();
+ preview_update();
+ }
+ }
+ setting_media_size--;
+}
+
+static gboolean
+refresh_all_options(gpointer data)
+{
+ do_all_updates();
+ do_all_updates(); /* Update twice to pick up cascading changes */
+ return FALSE;
+}
+
+static void
+combo_callback(GtkWidget *widget, gpointer data)
+{
+ option_t *option = (option_t *)data;
+ const gchar *new_value =
+ stpui_combo_get_name(option->info.list.combo, option->info.list.params);
+ const gchar *value =
+ stp_get_string_parameter(pv->v, option->fast_desc->name);
+ if (value && new_value)
+ {
+ reset_preview();
+ if (!value || strcmp(value, new_value) != 0)
+ {
+ invalidate_frame();
+ invalidate_preview_thumbnail();
+ stp_set_string_parameter(pv->v, option->fast_desc->name, new_value);
+ if (strcmp(option->fast_desc->name, "PageSize") == 0)
+ set_media_size(new_value);
+ g_idle_add(refresh_all_options, NULL);
+ if (option->fast_desc->p_class == STP_PARAMETER_CLASS_OUTPUT)
+ update_adjusted_thumbnail();
+ preview_update();
+ }
+ }
+}
+
+/*
+ * orientation_callback() - Update the current media size.
+ */
+static void
+orientation_callback (GtkWidget *widget,
+ gpointer data)
+{
+ reset_preview ();
+
+ if (pv->orientation != (gint) data)
+ {
+ invalidate_preview_thumbnail ();
+ set_orientation((gint) data);
+ preview_update ();
+ }
+}
+
+/*
+ * output_type_callback() - Update the current output type.
+ */
+static void
+output_type_callback (GtkWidget *widget,
+ gpointer data)
+{
+ reset_preview ();
+
+ if (GTK_TOGGLE_BUTTON (widget)->active)
+ {
+ if (strcmp((const char *) data, "BW") == 0)
+ gtk_widget_hide(output_color_vbox);
+ else
+ gtk_widget_show(output_color_vbox);
+ stp_set_string_parameter(pv->v, "PrintingMode", (const char *) data);
+ invalidate_preview_thumbnail ();
+ update_adjusted_thumbnail ();
+ set_options_active(NULL);
+ preview_update ();
+ do_all_updates();
+ }
+}
+
+static void
+command_type_callback(GtkWidget *widget, gpointer data)
+{
+ if (strcmp((const char *) data, "Standard") == 0)
+ {
+ gtk_widget_set_sensitive(standard_cmd_entry, TRUE);
+ gtk_widget_set_sensitive(queue_combo, TRUE);
+ gtk_widget_set_sensitive(file_entry, FALSE);
+ gtk_entry_set_editable(GTK_ENTRY(file_entry), FALSE);
+ gtk_widget_set_sensitive(custom_command_entry, FALSE);
+ gtk_entry_set_editable(GTK_ENTRY(custom_command_entry), FALSE);
+ gtk_widget_hide(GTK_WIDGET(file_browser));
+ gtk_widget_set_sensitive(file_button, FALSE);
+ gtk_widget_set_sensitive(copy_count_spin_button, TRUE);
+ stpui_plist_set_command_type(pv, COMMAND_TYPE_DEFAULT);
+ }
+ else if (strcmp((const char *) data, "Custom") == 0)
+ {
+ gtk_widget_set_sensitive(standard_cmd_entry, FALSE);
+ gtk_widget_set_sensitive(queue_combo, FALSE);
+ gtk_widget_set_sensitive(file_entry, FALSE);
+ gtk_entry_set_editable(GTK_ENTRY(file_entry), FALSE);
+ gtk_widget_set_sensitive(custom_command_entry, TRUE);
+ gtk_entry_set_editable(GTK_ENTRY(custom_command_entry), TRUE);
+ gtk_widget_hide(GTK_WIDGET(file_browser));
+ gtk_widget_set_sensitive(file_button, FALSE);
+ gtk_widget_set_sensitive(copy_count_spin_button, FALSE);
+ stpui_plist_set_command_type(pv, COMMAND_TYPE_CUSTOM);
+ }
+ else if (strcmp((const char *) data, "File") == 0)
+ {
+ gtk_widget_set_sensitive(standard_cmd_entry, FALSE);
+ gtk_widget_set_sensitive(queue_combo, FALSE);
+ gtk_widget_set_sensitive(file_entry, TRUE);
+ gtk_entry_set_editable(GTK_ENTRY(file_entry), TRUE);
+ gtk_widget_set_sensitive(custom_command_entry, FALSE);
+ gtk_entry_set_editable(GTK_ENTRY(custom_command_entry), FALSE);
+ gtk_widget_set_sensitive(file_button, TRUE);
+ gtk_widget_set_sensitive(copy_count_spin_button, FALSE);
+ stpui_plist_set_command_type(pv, COMMAND_TYPE_FILE);
+ }
+}
+
+static void
+set_all_entry_values(void)
+{
+ set_entry_value (top_entry, (stp_get_top (pv->v)), 1);
+ set_entry_value (left_entry, (stp_get_left (pv->v)), 1);
+/*
+ set_entry_value (bottom_entry, (top + stp_get_top(pv->v) + print_height), 1);
+*/
+ set_entry_value (bottom_border_entry,
+ (paper_height - (stp_get_top (pv->v) + print_height)), 1);
+/*
+ set_entry_value (right_entry, (stp_get_left(pv->v) + print_width), 1);
+*/
+ set_entry_value (right_border_entry,
+ (paper_width - (stp_get_left (pv->v) + print_width)), 1);
+ set_entry_value (width_entry, print_width, 1);
+ set_entry_value (height_entry, print_height, 1);
+ set_entry_value (custom_size_width, stp_get_page_width (pv->v), 1);
+ set_entry_value (custom_size_height, stp_get_page_height (pv->v), 1);
+}
+
+/*
+ * unit_callback() - Update the current unit.
+ */
+static void
+unit_callback (GtkWidget *widget,
+ gpointer data)
+{
+ reset_preview ();
+
+ if (GTK_TOGGLE_BUTTON (widget)->active)
+ {
+ pv->unit = (gint) data;
+ gtk_label_set_text(GTK_LABEL(units_label), units[pv->unit].name);
+ set_all_entry_values();
+ update_options();
+ do_color_updates();
+ }
+}
+
+static void
+destroy_dialogs (void)
+{
+ int i;
+ gtk_widget_destroy (color_adjust_dialog);
+ gtk_widget_destroy (setup_dialog);
+ gtk_widget_destroy (print_dialog);
+ gtk_widget_destroy (new_printer_dialog);
+ gtk_widget_destroy (about_dialog);
+ for (i = 0; i < current_option_count; i++)
+ {
+ if (current_options[i].fast_desc->p_type == STP_PARAMETER_TYPE_CURVE &&
+ current_options[i].info.curve.dialog)
+ gtk_widget_destroy(current_options[i].info.curve.dialog);
+ }
+}
+
+static void
+dialogs_set_sensitive (gboolean sensitive)
+{
+ int i;
+ gtk_widget_set_sensitive (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);
+ for (i = 0; i < current_option_count; i++)
+ {
+ if (current_options[i].fast_desc->p_type == STP_PARAMETER_TYPE_CURVE &&
+ current_options[i].info.curve.dialog)
+ gtk_widget_set_sensitive(current_options[i].info.curve.dialog,
+ sensitive);
+ }
+}
+
+/*
+ * 'print_callback()' - Start the print.
+ */
+static void
+print_callback (void)
+{
+ if (stpui_plist_get_command_type(pv) == COMMAND_TYPE_FILE &&
+ strlen(stpui_plist_get_output_filename(pv)) == 0)
+ {
+ dialogs_set_sensitive (FALSE);
+ exit_after_file_ok = 1;
+ gtk_widget_show (file_browser);
+ }
+ else
+ {
+ runme = TRUE;
+ destroy_dialogs ();
+ }
+}
+
+/*
+ * printandsave_callback() -
+ */
+static void
+printandsave_callback (void)
+{
+ saveme = TRUE;
+ print_callback();
+}
+
+static void
+about_callback (void)
+{
+ gtk_widget_show (about_dialog);
+}
+
+/*
+ * save_callback() - save settings, don't destroy dialog
+ */
+static void
+save_callback (void)
+{
+ reset_preview ();
+ stpui_printrc_save ();
+}
+
+/*
+ * setup_update() - update widgets in the setup dialog
+ */
+static void
+setup_update (void)
+{
+ GtkAdjustment *adjustment;
+ gint idx = 0;
+ gint i;
+ gchar *tmp;
+ const char *ppd_file_name = stp_get_file_parameter(pv->v, "PPDFile");
+
+ for (i = 0; i < GTK_CLIST(manufacturer_clist)->rows; i++)
+ {
+ (void) gtk_clist_get_text(GTK_CLIST(manufacturer_clist), i, 0, &tmp);
+ if (tmp && strcmp(manufacturer, tmp) == 0)
+ {
+ idx = i;
+ break;
+ }
+ }
+ gtk_clist_select_row(GTK_CLIST(manufacturer_clist), idx, 0);
+
+ idx = stp_get_printer_index_by_driver (stp_get_driver (pv->v));
+
+ idx = gtk_clist_find_row_from_data(GTK_CLIST(printer_driver),
+ (gpointer) idx);
+/*
+ if (idx >= 0)
+ idx = 0;
+*/
+ gtk_clist_select_row (GTK_CLIST (printer_driver), idx, 0);
+ gtk_label_set_text (GTK_LABEL (printer_model_label),
+ gettext (stp_printer_get_long_name (tmp_printer)));
+
+ if (ppd_file_name)
+ gtk_entry_set_text (GTK_ENTRY (ppd_file), ppd_file_name);
+ else
+ gtk_entry_set_text (GTK_ENTRY (ppd_file), "");
+
+ if (stp_parameter_find_in_settings(pv->v, "PPDFile"))
+ {
+ gtk_widget_show (ppd_box);
+ gtk_widget_show (ppd_label);
+ }
+ else
+ {
+ gtk_widget_hide (ppd_box);
+ gtk_widget_hide (ppd_label);
+ }
+ gtk_entry_set_text (GTK_ENTRY (custom_command_entry),
+ stpui_plist_get_custom_command (pv));
+
+ adjustment = GTK_CLIST (printer_driver)->vadjustment;
+ gtk_adjustment_set_value
+ (adjustment,
+ adjustment->lower + idx * (adjustment->upper - adjustment->lower) /
+ GTK_CLIST (printer_driver)->rows);
+
+ i = stpui_plist_get_command_type(pv);
+ if (i >= 0 && i < command_options_count)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(command_options[i].button),
+ TRUE);
+}
+
+/*
+ * setup_open_callback() -
+ */
+static void
+setup_open_callback (void)
+{
+ static gboolean first_time = TRUE;
+ manufacturer = stp_printer_get_manufacturer(stp_get_printer(pv->v));
+ build_printer_driver_clist();
+
+ reset_preview ();
+ setup_update ();
+
+/* gtk_widget_set_sensitive(GTK_DIALOG(print_dialog)->action_area, FALSE); */
+ gtk_widget_show (setup_dialog);
+
+ if (first_time)
+ {
+ /* Make sure the driver scroller gets positioned correctly. */
+ setup_update ();
+ first_time = FALSE;
+ }
+}
+
+/*
+ * new_printer_open_callback() -
+ */
+static void
+new_printer_open_callback (void)
+{
+ reset_preview ();
+ gtk_entry_set_text (GTK_ENTRY (new_printer_entry), "");
+ gtk_widget_show (new_printer_dialog);
+}
+
+static void
+set_printer(void)
+{
+ manufacturer = stp_printer_get_manufacturer(tmp_printer);
+ build_printer_driver_clist();
+ build_queue_combo();
+ stp_set_driver (pv->v, stp_printer_get_driver (tmp_printer));
+ stpui_plist_set_custom_command
+ (pv, gtk_entry_get_text (GTK_ENTRY (custom_command_entry)));
+ stpui_plist_set_output_filename
+ (pv, gtk_entry_get_text (GTK_ENTRY (file_entry)));
+ stp_set_file_parameter (pv->v, "PPDFile",
+ gtk_entry_get_text (GTK_ENTRY (ppd_file)));
+ gtk_label_set_text (GTK_LABEL (printer_model_label),
+ gettext (stp_printer_get_long_name (tmp_printer)));
+
+ plist_callback (NULL, (gpointer) stpui_plist_current);
+}
+
+/*
+ * setup_ok_callback() -
+ */
+static void
+setup_ok_callback (void)
+{
+ gtk_widget_hide(ppd_browser);
+ gtk_widget_hide(file_browser);
+ gtk_widget_hide(setup_dialog);
+ set_printer();
+ gtk_widget_set_sensitive(GTK_DIALOG(print_dialog)->action_area, TRUE);
+}
+
+/*
+ * setup_cancel_callback() -
+ */
+static void
+setup_cancel_callback (void)
+{
+ gtk_widget_hide(ppd_browser);
+ gtk_widget_hide(file_browser);
+ gtk_widget_hide(setup_dialog);
+ manufacturer = stp_printer_get_manufacturer(stp_get_printer(pv->v));
+ build_printer_driver_clist();
+ setup_update();
+ gtk_widget_set_sensitive(GTK_DIALOG(print_dialog)->action_area, TRUE);
+}
+
+/*
+ * setup_ok_callback() -
+ */
+static void
+new_printer_ok_callback (void)
+{
+ const gchar *data = gtk_entry_get_text (GTK_ENTRY (new_printer_entry));
+ stpui_plist_t key;
+
+ if (strlen(data))
+ {
+ memset(&key, 0, sizeof(key));
+ stpui_printer_initialize (&key);
+ stpui_plist_copy(&key, pv);
+ stpui_plist_set_name(&key, data);
+
+ if (stpui_plist_add (&key, 1))
+ {
+ stp_vars_destroy(key.v);
+ g_free(key.name);
+ stpui_plist_current = stpui_plist_count - 1;
+ set_current_printer();
+ build_printer_combo ();
+ set_printer();
+ }
+ }
+
+ gtk_widget_hide (new_printer_dialog);
+}
+
+static void
+pop_ppd_box(void)
+{
+ const stp_vars_t *v = stp_printer_get_defaults(tmp_printer);
+ if (stp_parameter_find_in_settings(v, "PPDFile"))
+ {
+ gtk_widget_show (ppd_label);
+ gtk_widget_show (ppd_box);
+ }
+ else
+ {
+ gtk_widget_hide (ppd_label);
+ gtk_widget_hide (ppd_box);
+ }
+}
+
+static void
+build_printer_driver_clist(void)
+{
+ int i;
+ int current_idx = 0;
+ gtk_clist_clear(GTK_CLIST(printer_driver));
+ for (i = 0; i < stp_printer_model_count (); i ++)
+ {
+ const stp_printer_t *the_printer = stp_get_printer_by_index (i);
+
+ if (strcmp(manufacturer, stp_printer_get_manufacturer(the_printer)) == 0)
+ {
+ gchar *tmp=g_strdup(gettext(stp_printer_get_long_name(the_printer)));
+ /*
+ * FIXME Somehow if the raw printer comes before any of the
+ * "real" printers in the list of printers created in module.c,
+ * this code barfs on any of those printers added later. For
+ * example, try listing olympus_LTX_stpi_module_data after
+ * raw_LTX_stpi_module_data.
+ */
+
+ gtk_clist_insert (GTK_CLIST (printer_driver), current_idx, &tmp);
+ gtk_clist_set_row_data (GTK_CLIST (printer_driver), current_idx,
+ (gpointer) i);
+ g_free(tmp);
+ current_idx++;
+ }
+ }
+}
+
+static void
+manufacturer_callback(GtkWidget *widget, /* I - Driver list */
+ gint row,
+ gint column,
+ GdkEventButton *event,
+ gpointer data)
+{
+ static int calling_manufacturer_callback = 0;
+ gchar *text;
+ if (calling_manufacturer_callback)
+ return;
+ calling_manufacturer_callback++;
+ if (gtk_clist_get_text(GTK_CLIST(widget), row, column, &text))
+ manufacturer = text;
+ build_printer_driver_clist();
+ setup_update();
+ calling_manufacturer_callback--;
+}
+
+/*
+ * print_driver_callback() - Update the current printer driver.
+ */
+static void
+print_driver_callback (GtkWidget *widget, /* I - Driver list */
+ gint row,
+ gint column,
+ GdkEventButton *event,
+ gpointer data) /* I - Data */
+{
+ char *tmp;
+ static int calling_print_driver_callback = 0;
+ if (calling_print_driver_callback)
+ return;
+ calling_print_driver_callback++;
+ invalidate_frame ();
+ invalidate_preview_thumbnail ();
+ reset_preview ();
+ data = gtk_clist_get_row_data (GTK_CLIST (widget), row);
+ tmp_printer = stp_get_printer_by_index ((gint) data);
+ tmp = stpui_build_standard_print_command(pv, tmp_printer);
+ gtk_entry_set_text(GTK_ENTRY(standard_cmd_entry), tmp);
+ g_free(tmp);
+
+ pop_ppd_box();
+ calling_print_driver_callback--;
+}
+
+/*
+ * ppd_browse_callback() -
+ */
+static void
+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);
+}
+
+/*
+ * ppd_ok_callback() -
+ */
+static void
+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)));
+}
+
+/*
+ * ppd_browse_callback() -
+ */
+static void
+file_browse_callback (void)
+{
+ reset_preview ();
+ gtk_file_selection_set_filename (GTK_FILE_SELECTION (file_browser),
+ gtk_entry_get_text (GTK_ENTRY (file_entry)));
+ gtk_widget_show (file_browser);
+}
+
+/*
+ * file_ok_callback() - print to file and go away
+ */
+static void
+file_ok_callback (void)
+{
+ const char *filename =
+ gtk_file_selection_get_filename(GTK_FILE_SELECTION(file_browser));
+ gtk_widget_hide (file_browser);
+ gtk_entry_set_text(GTK_ENTRY(file_entry), filename);
+ stpui_plist_set_output_filename(pv, filename);
+ if (exit_after_file_ok)
+ {
+ runme = TRUE;
+ destroy_dialogs ();
+ }
+}
+
+/*
+ * file_cancel_callback() -
+ */
+static void
+file_cancel_callback (void)
+{
+ exit_after_file_ok = 0;
+ gtk_widget_hide (file_browser);
+ dialogs_set_sensitive (TRUE);
+}
+
+static void
+fill_buffer_writefunc(void *priv, const char *buffer, size_t bytes)
+{
+ int mask = 0;
+ int i;
+ int pixels = bytes / 4;
+ priv_t *p = (priv_t *) priv;
+ unsigned char *where = p->base_addr + p->offset;
+ const unsigned char *xbuffer = (const unsigned char *)buffer;
+
+ if (p->bpp == 1)
+ {
+ memcpy(where, buffer, bytes);
+ p->offset += bytes;
+ }
+ else
+ {
+ if (bytes + p->offset > p->limit)
+ bytes = p->limit - p->offset;
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cyan_button)))
+ mask |= 1;
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(magenta_button)))
+ mask |= 2;
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(yellow_button)))
+ mask |= 4;
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(black_button)))
+ mask |= 8;
+
+ memset(where, 0xff, pixels * 3);
+ for (i = 0; i < pixels; i++)
+ {
+ if (mask & 8)
+ {
+ where[0] -= xbuffer[3];
+ where[1] -= xbuffer[3];
+ where[2] -= xbuffer[3];
+ }
+ if (mask & 1)
+ {
+ if (where[0] < xbuffer[0])
+ where[0] = 0;
+ else
+ where[0] -= xbuffer[0];
+ }
+ if (mask & 2)
+ {
+ if (where[1] < xbuffer[1])
+ where[1] = 0;
+ else
+ where[1] -= xbuffer[1];
+ }
+ if (mask & 4)
+ {
+ if (where[2] < xbuffer[2])
+ where[2] = 0;
+ else
+ where[2] -= xbuffer[2];
+ }
+ where += 3;
+ xbuffer += 4;
+ }
+ p->offset += pixels * 3;
+ }
+}
+
+/*
+ * update_adjusted_thumbnail()
+ */
+
+static void
+redraw_color_swatch (void)
+{
+ static GdkGC *gc = NULL;
+ static GdkColormap *cmap;
+
+ if (adjusted_thumbnail_data && swatch && swatch->widget.window)
+ {
+ if (gc == NULL)
+ {
+ gc = gdk_gc_new (swatch->widget.window);
+ cmap = gtk_widget_get_colormap (GTK_WIDGET(swatch));
+ }
+
+ if (!print_mode_is_color(pv->v))
+ gdk_draw_gray_image(swatch->widget.window, gc, 0, 0,
+ thumbnail_w, thumbnail_h, GDK_RGB_DITHER_NORMAL,
+ adjusted_thumbnail_data, thumbnail_w);
+ else
+ gdk_draw_rgb_image(swatch->widget.window, gc, 0, 0,
+ thumbnail_w, thumbnail_h, GDK_RGB_DITHER_NORMAL,
+ adjusted_thumbnail_data, 3 * thumbnail_w);
+ }
+}
+
+static void
+initialize_thumbnail(void)
+{
+ int i;
+ if (stpui_get_thumbnail_func())
+ {
+ const guchar *internal_thumbnail_data;
+ /*
+ * Fetch a thumbnail of the image we're to print from the Gimp.
+ */
+
+ thumbnail_w = thumbnail_hintw;
+ thumbnail_h = thumbnail_hinth;
+ internal_thumbnail_data =
+ (stpui_get_thumbnail_func()) (stpui_get_thumbnail_data(), &thumbnail_w,
+ &thumbnail_h, &thumbnail_bpp, 0);
+ if (adjusted_thumbnail_data)
+ g_free(adjusted_thumbnail_data);
+ if (preview_thumbnail_data)
+ g_free(preview_thumbnail_data);
+ if (thumbnail_data)
+ g_free(thumbnail_data);
+
+ if (internal_thumbnail_data)
+ {
+ /*
+ * 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);
+ preview_thumbnail_data = g_malloc (3 * thumbnail_w * thumbnail_h);
+ thumbnail_data = g_malloc (3 * thumbnail_w * thumbnail_h);
+
+ switch (thumbnail_bpp)
+ {
+ case 1:
+ for (i = 0; i < thumbnail_w * thumbnail_h; i++)
+ {
+ gint val = internal_thumbnail_data[i];
+ thumbnail_data[(3 * i) + 0] = val;
+ thumbnail_data[(3 * i) + 1] = val;
+ thumbnail_data[(3 * i) + 2] = val;
+ }
+ break;
+ case 3:
+ memcpy(thumbnail_data, internal_thumbnail_data,
+ 3 * thumbnail_w * thumbnail_h);
+ break;
+ case 2:
+ for (i = 0; i < thumbnail_w * thumbnail_h; i++)
+ {
+ gint val = internal_thumbnail_data[2 * i];
+ gint alpha = internal_thumbnail_data[(2 * i) + 1];
+ thumbnail_data[(3 * i) +0] = val * alpha / 255 + 255 - alpha;
+ thumbnail_data[(3 * i) +1] = val * alpha / 255 + 255 - alpha;
+ thumbnail_data[(3 * i) +2] = val * alpha / 255 + 255 - alpha;
+ }
+ break;
+ case 4:
+ for (i = 0; i < thumbnail_w * thumbnail_h; i++)
+ {
+ gint r = internal_thumbnail_data[(4 * i)];
+ gint g = internal_thumbnail_data[(4 * i) + 1];
+ gint b = internal_thumbnail_data[(4 * i) + 2];
+ gint alpha = internal_thumbnail_data[(4 * i) + 3];
+ thumbnail_data[(3 * i) + 0] = r * alpha / 255 + 255 - alpha;
+ thumbnail_data[(3 * i) + 1] = g * alpha / 255 + 255 - alpha;
+ thumbnail_data[(3 * i) + 2] = b * alpha / 255 + 255 - alpha;
+ }
+ break;
+ default:
+ break;
+ /* Whatever */
+ }
+ thumbnail_bpp = 3;
+ }
+ else
+ {
+ thumbnail_h = 0;
+ thumbnail_w = 0;
+ }
+ }
+ else
+ {
+ thumbnail_h = 0;
+ thumbnail_w = 0;
+ }
+}
+
+static int
+compute_thumbnail(const stp_vars_t *v)
+{
+ priv_t priv;
+ int answer = 1;
+ stp_image_t *im = stpui_image_thumbnail_new(thumbnail_data, thumbnail_w,
+ thumbnail_h, thumbnail_bpp);
+ stp_vars_t *nv = stp_vars_create_copy(v);
+ stp_set_driver(nv, "raw-data-8");
+ stp_set_top(nv, 0);
+ stp_set_left(nv, 0);
+ stp_set_width(nv, thumbnail_w);
+ stp_set_height(nv, thumbnail_h);
+ stp_set_outfunc(nv, fill_buffer_writefunc);
+ stp_set_outdata(nv, &priv);
+ stp_set_errfunc(nv, stpui_get_errfunc());
+ stp_set_errdata(nv, stpui_get_errdata());
+ if (!print_mode_is_color(nv))
+ {
+ priv.bpp = 1;
+ stp_set_string_parameter(nv, "InkType", "RGBGray");
+ }
+ else
+ {
+ priv.bpp = 4;
+ stp_set_string_parameter(nv, "InkType", "CMYK");
+ }
+ stp_set_page_height(nv, thumbnail_h);
+ stp_set_page_width(nv, thumbnail_w);
+ stp_set_float_parameter(nv, "Density", 1.0);
+ stp_set_float_parameter(nv, "InkLimit", 0);
+ stp_set_string_parameter(nv, "InputImageType", "RGB");
+
+ priv.base_addr = adjusted_thumbnail_data;
+ priv.offset = 0;
+ priv.limit = thumbnail_bpp * thumbnail_h * thumbnail_w;
+
+ if (stp_verify(nv) != 1 || stp_print(nv, im) != 1)
+ {
+ answer = 0;
+ fprintf(stderr, "Could not print thumbnail!\n");
+ }
+ stp_vars_destroy(nv);
+ return answer;
+}
+
+static void
+set_thumbnail_orientation(void)
+{
+ gint x, y;
+ gint preview_limit = (thumbnail_h * thumbnail_w) - 1;
+ gint bpp;
+ if (!print_mode_is_color(pv->v))
+ bpp = 1;
+ else
+ bpp = 3;
+ switch (physical_orientation)
+ {
+ case ORIENT_PORTRAIT:
+ memcpy(preview_thumbnail_data, adjusted_thumbnail_data,
+ bpp * thumbnail_h * thumbnail_w);
+ break;
+ case ORIENT_SEASCAPE:
+ for (x = 0; x < thumbnail_w; x++)
+ for (y = 0; y < thumbnail_h; y++)
+ memcpy((preview_thumbnail_data +
+ bpp * (preview_limit - (x * thumbnail_h + y))),
+ (adjusted_thumbnail_data +
+ bpp * ((thumbnail_h - y - 1) * thumbnail_w + x)), bpp);
+ break;
+
+ case ORIENT_UPSIDEDOWN:
+ for (x = 0; x < thumbnail_h * thumbnail_w; x++)
+ memcpy((preview_thumbnail_data + bpp * (preview_limit - x)),
+ adjusted_thumbnail_data + bpp * x, bpp);
+ break;
+ case ORIENT_LANDSCAPE:
+ for (x = 0; x < thumbnail_w; x++)
+ for (y = 0; y < thumbnail_h; y++)
+ memcpy((preview_thumbnail_data + bpp * (x * thumbnail_h + y)),
+ (adjusted_thumbnail_data +
+ bpp * ((thumbnail_h - y - 1) * thumbnail_w + x)), bpp);
+ break;
+ }
+}
+
+static void
+update_adjusted_thumbnail (void)
+{
+ if (thumbnail_data && adjusted_thumbnail_data && do_update_thumbnail &&
+ suppress_preview_update == 0)
+ {
+ if (compute_thumbnail(pv->v))
+ {
+ set_thumbnail_orientation();
+ redraw_color_swatch ();
+ preview_update ();
+ }
+ }
+}
+
+static void
+draw_arrow (GdkWindow *w,
+ GdkGC *gc,
+ gint paper_left,
+ gint paper_top)
+{
+ gint u = preview_ppi/2;
+ gint ox = paper_left + preview_ppi * paper_width / INCH / 2;
+ gint oy = paper_top + preview_ppi * paper_height / INCH / 2;
+
+ oy -= preview_ppi * paper_height / INCH / 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);
+}
+
+static void
+create_valid_preview(guchar **preview_data)
+{
+ if (adjusted_thumbnail_data)
+ {
+ gint bpp = (print_mode_is_color(pv->v)) ? 3 : 1;
+ gint v_denominator = preview_h > 1 ? preview_h - 1 : 1;
+ gint v_numerator = (preview_thumbnail_h - 1) % v_denominator;
+ gint v_whole = (preview_thumbnail_h - 1) / v_denominator;
+ gint h_denominator = preview_w > 1 ? preview_w - 1 : 1;
+ gint h_numerator = (preview_thumbnail_w - 1) % h_denominator;
+ gint h_whole = (preview_thumbnail_w - 1) / h_denominator;
+ gint adjusted_preview_width = bpp * preview_w;
+ gint adjusted_thumbnail_width = bpp * preview_thumbnail_w;
+ gint v_cur = 0;
+ gint v_last = -1;
+ gint v_error = v_denominator / 2;
+ gint y;
+ gint i;
+
+ if (*preview_data)
+ g_free (*preview_data);
+ *preview_data = g_malloc (bpp * 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 = preview_thumbnail_data - 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 < bpp; i++)
+ outbuf[i] = outbuf[i - bpp];
+ }
+ else
+ {
+ inbuf += bpp * (h_cur - h_last);
+ h_last = h_cur;
+ for (i = 0; i < bpp; i++)
+ outbuf[i] = inbuf[i];
+ }
+ outbuf += 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 = TRUE;
+ }
+}
+
+/*
+ * preview_update_callback() -
+ */
+static void
+do_preview_thumbnail (void)
+{
+ static GdkGC *gc = NULL;
+ static GdkGC *gcinv = NULL;
+ static GdkGC *gcset = NULL;
+ static guchar *preview_data = NULL;
+ gint opx = preview_x;
+ gint opy = preview_y;
+ gint oph = preview_h;
+ gint opw = preview_w;
+ gint paper_display_left, paper_display_top;
+ gint printable_display_left, printable_display_top;
+ gint paper_display_width, paper_display_height;
+ gint printable_display_width, printable_display_height;
+ int l_bottom = stp_get_top(pv->v) + stp_get_height(pv->v);
+ int l_right = stp_get_left(pv->v) + stp_get_width(pv->v);
+
+ preview_ppi = preview_size_horiz * FINCH / (gdouble) paper_width;
+
+ if (preview_ppi > preview_size_vert * FINCH / (gdouble) paper_height)
+ preview_ppi = preview_size_vert * FINCH / (gdouble) paper_height;
+ if (preview_ppi > MAX_PREVIEW_PPI)
+ preview_ppi = MAX_PREVIEW_PPI;
+
+ if (preview == NULL || preview->widget.window == NULL)
+ return;
+ /*
+ * Center the page on the preview
+ */
+ paper_display_width = MAX(3, ROUNDUP(preview_ppi * paper_width, INCH));
+ paper_display_height = MAX(3, ROUNDUP(preview_ppi * paper_height, INCH));
+
+ paper_display_left = (preview_size_horiz - paper_display_width) / 2;
+ paper_display_top = (preview_size_vert - paper_display_height) / 2;
+
+ printable_display_width =
+ MAX(3, ROUNDUP(preview_ppi * printable_width, INCH));
+ printable_display_height =
+ MAX(3, ROUNDUP(preview_ppi * printable_height, INCH));
+
+ printable_display_left = paper_display_left + preview_ppi * left / INCH;
+ printable_display_top = paper_display_top + preview_ppi * top / INCH ;
+
+ preview_x =
+ 1 + paper_display_left + preview_ppi * stp_get_left (pv->v) / INCH;
+ preview_y =
+ 1 + paper_display_top + preview_ppi * stp_get_top (pv->v) / INCH;
+
+ if (!preview_valid)
+ {
+ gint preview_r = 1 + paper_display_left + preview_ppi * l_right / INCH;
+ gint preview_b = 1 + paper_display_top + preview_ppi * l_bottom / INCH;
+ preview_w = preview_r - preview_x;
+ preview_h = preview_b - preview_y;
+ if (preview_w >= printable_display_width)
+ preview_w = printable_display_width - 1;
+ if (preview_h >= printable_display_height)
+ preview_h = printable_display_height - 1;
+ }
+
+ if (preview_w + preview_x > printable_display_left + printable_display_width)
+ preview_x--;
+ if (preview_h + preview_y > printable_display_top + printable_display_height)
+ preview_y--;
+
+ 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)
+ create_valid_preview(&preview_data);
+
+ if (printable_display_left < paper_display_left)
+ printable_display_left = paper_display_left;
+ if (printable_display_top < paper_display_top)
+ printable_display_top = paper_display_top;
+ if (printable_display_left + printable_display_width >
+ paper_display_left + paper_display_width)
+ printable_display_width =
+ paper_display_width - (paper_display_left - printable_display_left);
+ if (printable_display_top + printable_display_height >
+ paper_display_top + paper_display_height)
+ printable_display_height =
+ paper_display_height - (paper_display_top - printable_display_top);
+ if (need_exposure)
+ {
+ if (!frame_valid)
+ {
+ gdk_window_clear (preview->widget.window);
+ frame_valid = TRUE;
+ }
+ /* draw paper frame */
+ gdk_draw_rectangle (preview->widget.window, gc, 0,
+ paper_display_left, paper_display_top,
+ paper_display_width, paper_display_height);
+
+ /* draw printable frame */
+ gdk_draw_rectangle (preview->widget.window, gc, 0,
+ printable_display_left, printable_display_top,
+ printable_display_width, printable_display_height);
+ need_exposure = FALSE;
+ }
+ else if (!frame_valid)
+ {
+ gdk_window_clear (preview->widget.window);
+ /* draw paper frame */
+ gdk_draw_rectangle (preview->widget.window, gc, 0,
+ paper_display_left, paper_display_top,
+ paper_display_width, paper_display_height);
+
+ /* draw printable frame */
+ gdk_draw_rectangle (preview->widget.window, gc, 0,
+ printable_display_left, printable_display_top,
+ printable_display_width, printable_display_height);
+ frame_valid = TRUE;
+ }
+ 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_display_left,
+ paper_display_top);
+
+ if (!preview_valid)
+ gdk_draw_rectangle (preview->widget.window, gc, 1,
+ preview_x, preview_y, preview_w, preview_h);
+ else if (!print_mode_is_color(pv->v))
+ 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);
+
+ /* If we're printing full bleed, redisplay the paper frame */
+ if (preview_x <= paper_display_left || opx <= paper_display_left ||
+ preview_y <= paper_display_top || opy <= paper_display_top ||
+ preview_x + preview_w >= paper_display_left + paper_display_width ||
+ opx + opw >= paper_display_left + paper_display_width ||
+ preview_y + preview_h >= paper_display_top + paper_display_height ||
+ opy + oph >= paper_display_top + paper_display_height)
+ gdk_draw_rectangle (preview->widget.window, gc, 0,
+ paper_display_left, paper_display_top,
+ paper_display_width, paper_display_height);
+
+
+ /* draw orientation arrow pointing to top-of-paper */
+ draw_arrow (preview->widget.window, gcinv, paper_display_left,
+ paper_display_top);
+ gdk_flush();
+}
+
+static gboolean
+idle_preview_thumbnail(gpointer data)
+{
+ set_orientation(pv->orientation);
+ do_preview_thumbnail();
+ thumbnail_update_pending = FALSE;
+ return FALSE;
+}
+
+static void
+preview_expose (void)
+{
+ need_exposure = TRUE;
+ preview_update ();
+}
+
+static void
+preview_update (void)
+{
+ gdouble max_ppi_scaling; /* Maximum PPI for current page size */
+ gdouble min_ppi_scaling; /* Minimum PPI for current page size */
+
+ suppress_preview_update++;
+ stp_get_media_size(pv->v, &paper_width, &paper_height);
+
+ stp_get_imageable_area(pv->v, &left, &right, &bottom, &top);
+
+ printable_width = right - left;
+ printable_height = bottom - top;
+
+ if (pv->scaling < 0)
+ {
+ gdouble twidth;
+
+ compute_scaling_limits(&min_ppi_scaling, &max_ppi_scaling);
+
+ if (pv->scaling < 0 && pv->scaling > -min_ppi_scaling)
+ pv->scaling = -min_ppi_scaling;
+
+ twidth = (FINCH * (gdouble) image_width / -pv->scaling);
+ 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 = -pv->scaling;
+
+ 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 if (auto_paper_size)
+ {
+ gdouble twidth = printable_width * pv->scaling / 100;
+
+ print_width = twidth + .5;
+ print_height =
+ (twidth * (gdouble) image_height / (gdouble) image_width) + .5;
+ }
+ else
+ {
+ /* we do pv->scaling % 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 = printable_width * pv->scaling / 100;
+
+ print_width = twidth + .5;
+ print_height =
+ (twidth * (gdouble) image_height / (gdouble) image_width) + .5;
+ }
+ else
+ {
+ gdouble theight = printable_height * pv->scaling /100;
+
+ print_height = theight + .5;
+ print_width =
+ (theight * (gdouble) image_width / (gdouble) image_height) + .5;
+ }
+ }
+
+ if (auto_paper_size)
+ set_media_size(stp_get_string_parameter(pv->v, "PageSize"));
+
+ stp_set_width(pv->v, print_width);
+ stp_set_height(pv->v, print_height);
+
+ if (pv->invalid_mask & INVALID_LEFT)
+ stp_set_left (pv->v, (paper_width - print_width) / 2);
+
+ if (stp_get_left(pv->v) < left)
+ stp_set_left(pv->v, left);
+
+ if (stp_get_left (pv->v) > right - print_width)
+ stp_set_left (pv->v, right - print_width);
+
+ if (pv->invalid_mask & INVALID_TOP)
+ stp_set_top (pv->v, ((paper_height - print_height) / 2));
+ if (stp_get_top(pv->v) < top)
+ stp_set_top(pv->v, top);
+
+ if (stp_get_top (pv->v) > bottom - print_height)
+ stp_set_top (pv->v, bottom - print_height);
+
+ pv->invalid_mask = 0;
+
+ set_all_entry_values();
+ suppress_preview_update--;
+
+ /* draw image */
+ if (! suppress_preview_update && !thumbnail_update_pending)
+ {
+ thumbnail_update_pending = TRUE;
+ g_idle_add(idle_preview_thumbnail, NULL);
+ }
+}
+
+/*
+ * preview_button_callback() -
+ */
+static void
+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;
+ orig_left = stp_get_left (pv->v);
+ orig_top = stp_get_top (pv->v);
+ mouse_button = event->button;
+ buttons_mask = 1 << event->button;
+ buttons_pressed++;
+ preview_active = 1;
+ stpui_disable_help();
+ move_constraint =
+ (event->state & GDK_SHIFT_MASK) ? MOVE_CONSTRAIN : MOVE_ANY;
+ if (event->state & GDK_CONTROL_MASK)
+ move_constraint |= MOVE_GRID;
+ }
+ else if ((buttons_mask & (1 << event->button)) == 0)
+ {
+ if (preview_active == 1)
+ {
+ stpui_enable_help();
+ preview_active = -1;
+ stp_set_left (pv->v, orig_left);
+ stp_set_top (pv->v, orig_top);
+ preview_update ();
+ }
+ 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)
+ {
+ stpui_enable_help ();
+ preview_active = 0;
+ }
+ }
+}
+
+/*
+ * preview_motion_callback() -
+ */
+static void
+preview_motion_callback (GtkWidget *widget,
+ GdkEventMotion *event,
+ gpointer data)
+{
+
+ gint old_top = stp_get_top (pv->v);
+ gint old_left = stp_get_left (pv->v);
+ gint new_top = old_top;
+ gint new_left = old_left;
+ gint steps;
+ if (preview_active != 1 || event->type != GDK_MOTION_NOTIFY)
+ return;
+ 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;
+ }
+
+ switch (mouse_button)
+ {
+ case 1:
+ if (move_constraint & MOVE_VERTICAL)
+ new_top = orig_top + INCH * (event->y - mouse_y) / preview_ppi;
+ if (move_constraint & MOVE_HORIZONTAL)
+ new_left = orig_left + INCH * (event->x - mouse_x) / preview_ppi;
+ break;
+ case 3:
+ if (move_constraint & MOVE_VERTICAL)
+ new_top = orig_top + event->y - mouse_y;
+ if (move_constraint & MOVE_HORIZONTAL)
+ new_left = orig_left + event->x - mouse_x;
+ break;
+ case 2:
+ if (move_constraint & MOVE_HORIZONTAL)
+ {
+ gint increment_width =
+ ((move_constraint & MOVE_GRID) && pv->scaling > 0) ?
+ printable_width * pv->scaling / 100 : print_width;
+ gint x_threshold = MAX (1, (preview_ppi * increment_width) / INCH);
+ if (event->x > mouse_x)
+ steps = MIN((event->x - mouse_x) / x_threshold,
+ ((right - orig_left) / increment_width) - 1);
+ else
+ steps = -(MIN((mouse_x - event->x) / x_threshold,
+ (orig_left - left) / increment_width));
+ new_left = orig_left + steps * increment_width;
+ }
+ if (move_constraint & MOVE_VERTICAL)
+ {
+ gint increment_height =
+ ((move_constraint & MOVE_GRID) && pv->scaling > 0) ?
+ printable_height * pv->scaling / 100 : print_height;
+ gint y_threshold = MAX (1, (preview_ppi * increment_height) / INCH);
+ if (event->y > mouse_y)
+ steps = MIN((event->y - mouse_y) / y_threshold,
+ ((bottom - orig_top) / increment_height) - 1);
+ else
+ steps = -(MIN((mouse_y - event->y) / y_threshold,
+ (orig_top - top) / increment_height));
+ new_top = orig_top + steps * increment_height;
+ }
+ break;
+ }
+
+ if (new_top < top)
+ new_top = top;
+ if (new_top > bottom - print_height)
+ new_top = bottom - print_height;
+ if (new_left < left)
+ new_left = left;
+ if (new_left > right - print_width)
+ new_left = right - print_width;
+
+ if (new_top != old_top || new_left != old_left)
+ {
+ stp_set_top (pv->v, new_top);
+ stp_set_left (pv->v, new_left);
+ preview_update ();
+ }
+}
+
+static void
+color_update (GtkAdjustment *adjustment)
+{
+ int i;
+ for (i = 0; i < current_option_count; i++)
+ {
+ option_t *opt = &(current_options[i]);
+ if (opt->fast_desc->p_type == STP_PARAMETER_TYPE_DOUBLE &&
+ opt->fast_desc->p_level <= MAXIMUM_PARAMETER_LEVEL &&
+ opt->info.flt.adjustment &&
+ adjustment == GTK_ADJUSTMENT(opt->info.flt.adjustment))
+ {
+ invalidate_preview_thumbnail ();
+ if (stp_get_float_parameter(pv->v, opt->fast_desc->name) !=
+ adjustment->value)
+ {
+ stp_set_float_parameter(pv->v, opt->fast_desc->name,
+ adjustment->value);
+ update_adjusted_thumbnail();
+ }
+ }
+ }
+}
+
+static void
+dimension_update (GtkAdjustment *adjustment)
+{
+ int i;
+ gdouble unit_scaler = units[pv->unit].scale;
+ for (i = 0; i < current_option_count; i++)
+ {
+ option_t *opt = &(current_options[i]);
+ if (opt->fast_desc->p_type == STP_PARAMETER_TYPE_DIMENSION &&
+ opt->fast_desc->p_level <= MAXIMUM_PARAMETER_LEVEL &&
+ opt->info.flt.adjustment &&
+ adjustment == GTK_ADJUSTMENT(opt->info.flt.adjustment))
+ {
+ invalidate_preview_thumbnail ();
+ if (stp_get_dimension_parameter(pv->v, opt->fast_desc->name) !=
+ adjustment->value * unit_scaler)
+ {
+ stp_set_dimension_parameter(pv->v, opt->fast_desc->name,
+ adjustment->value * unit_scaler);
+ update_adjusted_thumbnail();
+ }
+ }
+ }
+}
+
+static void
+set_controls_active (GtkObject *checkbutton, gpointer xopt)
+{
+ option_t *opt = (option_t *) xopt;
+ stp_parameter_t desc;
+ gboolean setting =
+ gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton));
+ if (setting && opt->fast_desc->p_level <= MAXIMUM_PARAMETER_LEVEL)
+ {
+ switch (opt->fast_desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_DOUBLE:
+ set_adjustment_active(opt, TRUE, FALSE);
+ if (! stp_check_float_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE))
+ {
+ stp_describe_parameter(pv->v, opt->fast_desc->name, &desc);
+ stp_set_float_parameter(pv->v, opt->fast_desc->name,
+ desc.deflt.dbl);
+ stp_parameter_description_destroy(&desc);
+ }
+ stp_set_float_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ set_adjustment_active(opt, TRUE, FALSE);
+ if (! stp_check_dimension_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE))
+ {
+ stp_describe_parameter(pv->v, opt->fast_desc->name, &desc);
+ stp_set_dimension_parameter(pv->v, opt->fast_desc->name,
+ desc.deflt.dimension);
+ stp_parameter_description_destroy(&desc);
+ }
+ stp_set_dimension_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ set_curve_active(opt, TRUE, FALSE);
+ if (! stp_check_curve_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE))
+ {
+ stp_describe_parameter(pv->v, opt->fast_desc->name, &desc);
+ stp_set_curve_parameter(pv->v, opt->fast_desc->name,
+ desc.deflt.curve);
+ stp_parameter_description_destroy(&desc);
+ }
+ stp_set_curve_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ set_combo_active(opt, TRUE, FALSE);
+ if (! stp_check_string_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE))
+ {
+ stp_describe_parameter(pv->v, opt->fast_desc->name, &desc);
+ stp_set_string_parameter(pv->v, opt->fast_desc->name,
+ desc.deflt.str);
+ stp_parameter_description_destroy(&desc);
+ }
+ stp_set_string_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ set_bool_active(opt, TRUE, FALSE);
+ if (! stp_check_boolean_parameter(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE))
+ {
+ stp_describe_parameter(pv->v, opt->fast_desc->name, &desc);
+ stp_set_boolean_parameter(pv->v, opt->fast_desc->name,
+ desc.deflt.boolean);
+ stp_parameter_description_destroy(&desc);
+ }
+ stp_set_boolean_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_ACTIVE);
+ break;
+ default:
+ break;
+ }
+ }
+ else
+ {
+ switch (opt->fast_desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_DOUBLE:
+ set_adjustment_active(opt, FALSE, FALSE);
+ stp_set_float_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ set_adjustment_active(opt, FALSE, FALSE);
+ stp_set_dimension_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ set_curve_active(opt, FALSE, FALSE);
+ stp_set_curve_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ set_combo_active(opt, FALSE, FALSE);
+ stp_set_string_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN: /* ??? */
+ set_bool_active(opt, FALSE, FALSE);
+ stp_set_boolean_parameter_active(pv->v, opt->fast_desc->name,
+ STP_PARAMETER_INACTIVE);
+ break;
+ default:
+ break;
+ }
+ }
+ invalidate_preview_thumbnail();
+ update_adjusted_thumbnail();
+}
+
+static void
+set_color_defaults (void)
+{
+ int i;
+ for (i = 0; i < current_option_count; i++)
+ {
+ option_t *opt = &(current_options[i]);
+ if (opt->fast_desc->p_level <= MAXIMUM_PARAMETER_LEVEL &&
+ opt->fast_desc->p_class == STP_PARAMETER_CLASS_OUTPUT &&
+ opt->is_active && !opt->fast_desc->read_only)
+ {
+ stp_parameter_activity_t active;
+ gdouble unit_scaler;
+ switch (opt->fast_desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_DOUBLE:
+ active =
+ stp_get_float_parameter_active(pv->v, opt->fast_desc->name);
+ stp_set_float_parameter(pv->v, opt->fast_desc->name,
+ opt->info.flt.deflt);
+ stp_set_float_parameter_active(pv->v, opt->fast_desc->name,
+ active);
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ unit_scaler = units[pv->unit].scale;
+ active =
+ stp_get_dimension_parameter_active(pv->v,
+ opt->fast_desc->name);
+ stp_set_dimension_parameter(pv->v, opt->fast_desc->name,
+ opt->info.flt.deflt * unit_scaler);
+ stp_set_dimension_parameter_active(pv->v, opt->fast_desc->name,
+ active);
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ active =
+ stp_get_boolean_parameter_active(pv->v, opt->fast_desc->name);
+ stp_set_boolean_parameter(pv->v, opt->fast_desc->name,
+ opt->info.bool.deflt);
+ stp_set_boolean_parameter_active(pv->v, opt->fast_desc->name,
+ active);
+ break;
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ active =
+ stp_get_string_parameter_active(pv->v, opt->fast_desc->name);
+ stp_set_string_parameter(pv->v, opt->fast_desc->name,
+ opt->info.list.default_val);
+ stp_set_string_parameter_active(pv->v, opt->fast_desc->name,
+ active);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ do_color_updates ();
+}
+
+gint
+stpui_do_print_dialog(void)
+{
+ /*
+ * Get printrc options...
+ */
+ stpui_printrc_load ();
+
+ /*
+ * Print dialog window...
+ */
+ create_main_window();
+
+ gtk_main ();
+ gdk_flush ();
+
+ /*
+ * Set printrc options...
+ */
+ if (saveme)
+ stpui_printrc_save ();
+
+ /*
+ * Return ok/cancel...
+ */
+ return (runme);
+}
diff --git a/src/gutenprintui2/plist.c b/src/gutenprintui2/plist.c
new file mode 100644
index 0000000..f895580
--- /dev/null
+++ b/src/gutenprintui2/plist.c
@@ -0,0 +1,1751 @@
+/*
+ * "$Id: plist.c,v 1.5 2005/06/14 02:47:13 rlk 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 <config.h>
+#endif
+
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <gutenprint/gutenprint.h>
+#include <gutenprintui2/gutenprintui.h>
+#include "gutenprintui-internal.h"
+
+#include <unistd.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <locale.h>
+
+#include <sys/types.h>
+#include <signal.h>
+#include <sys/wait.h>
+
+
+typedef enum
+{
+ PRINTERS_NONE,
+ PRINTERS_LPC,
+ PRINTERS_LPSTAT
+} printer_system_t;
+
+static int compare_printers (stpui_plist_t *p1, stpui_plist_t *p2);
+
+int stpui_plist_current = 0, /* Current system printer */
+ stpui_plist_count = 0; /* Number of system printers */
+stpui_plist_t *stpui_plist; /* System printers */
+int stpui_show_all_paper_sizes = 0;
+static char *printrc_name = NULL;
+static char *image_type;
+static gint image_raw_channels = 0;
+static gint image_channel_depth = 8;
+static stp_string_list_t *default_parameters = NULL;
+stp_string_list_t *stpui_system_print_queues;
+static const char *copy_count_name = "STPUICopyCount";
+
+#define SAFE_FREE(x) \
+do \
+{ \
+ if ((x)) \
+ g_free((char *)(x)); \
+ ((x)) = NULL; \
+} while (0)
+
+typedef struct
+{
+ const char *printing_system_name;
+ const char *printing_system_text;
+ const char *print_command;
+ const char *queue_select;
+ const char *raw_flag;
+ const char *key_file;
+ const char *scan_command;
+ const char *copy_count_command;
+} print_system_t;
+
+/*
+ * Generic printing system, based on SysV lp
+ */
+static const print_system_t default_printing_system =
+ { "SysV", N_("System V lp"), "lp -s", "-d", "-oraw", "/usr/bin/lp",
+ "/usr/bin/lpstat -v | grep -i '^device for ' | awk '{print $3}' | sed 's/://'",
+ "-n" };
+
+static print_system_t known_printing_systems[] =
+{
+ { "CUPS", N_("CUPS"), "lp -s", "-d", "-oraw", "/usr/sbin/cupsd",
+ "/usr/bin/lpstat -v | grep -i '^device for ' | awk '{print $3}' | sed 's/://'",
+ "-n" },
+ { "SysV", N_("System V lp"), "lp -s", "-d", "-oraw", "/usr/bin/lp",
+ "/usr/bin/lpstat -v | grep -i '^device for ' | awk '{print $3}' | sed 's/://'",
+ "-n" },
+ { "lpd", N_("Berkeley lpd (/etc/lpc)"), "lpr", "-P", "-l", "/etc/lpc",
+ "/etc/lpc status | grep '^...*:' | sed 's/:.*//'",
+ "-#" },
+ { "lpd", N_("Berkeley lpd (/usr/bsd/lpc)"), "lpr", "-P", "-l", "/usr/bsd/lpc",
+ "/usr/bsd/lpc status | grep '^...*:' | sed 's/:.*//'",
+ "-#" },
+ { "lpd", N_("Berkeley lpd (/usr/etc/lpc"), "lpr", "-P", "-l", "/usr/etc/lpc",
+ "/usr/etc/lpc status | grep '^...*:' | sed 's/:.*//'",
+ "-#" },
+ { "lpd", N_("Berkeley lpd (/usr/libexec/lpc)"), "lpr", "-P", "-l", "/usr/libexec/lpc",
+ "/usr/libexec/lpc status | grep '^...*:' | sed 's/:.*//'",
+ "-#" },
+ { "lpd", N_("Berkeley lpd (/usr/sbin/lpc)"), "lpr", "-P", "-l", "/usr/sbin/lpc",
+ "/usr/sbin/lpc status | grep '^...*:' | sed 's/:.*//'",
+ "-#" },
+};
+
+static unsigned print_system_count = sizeof(known_printing_systems) / sizeof(print_system_t);
+
+static const print_system_t *global_printing_system = NULL;
+
+static void
+initialize_default_parameters(void)
+{
+ default_parameters = stp_string_list_create();
+ stp_string_list_add_string(default_parameters, "PrintingSystem", "Autodetect");
+ stp_string_list_add_string(default_parameters, "PrintCommand", "");
+ stp_string_list_add_string(default_parameters, "QueueSelect", "");
+ stp_string_list_add_string(default_parameters, "RawOutputFlag", "");
+ stp_string_list_add_string(default_parameters, "ScanOnStartup", "False");
+ stp_string_list_add_string(default_parameters, "ScanPrintersCommand", "");
+}
+
+void
+stpui_set_global_parameter(const char *param, const char *value)
+{
+ stp_string_list_remove_string(default_parameters, param);
+ stp_string_list_add_string(default_parameters, param, value);
+}
+
+const char *
+stpui_get_global_parameter(const char *param)
+{
+ stp_param_string_t *ps = stp_string_list_find(default_parameters, param);
+ if (ps)
+ return ps->text;
+ else
+ return NULL;
+}
+
+static const print_system_t *
+identify_print_system(void)
+{
+ int i;
+ if (!global_printing_system)
+ {
+ for (i = 0; i < print_system_count; i++)
+ {
+ if (!access(known_printing_systems[i].key_file, R_OK))
+ {
+ global_printing_system = &(known_printing_systems[i]);
+ break;
+ }
+ }
+ if (!global_printing_system)
+ global_printing_system = &default_printing_system;
+ }
+ return global_printing_system;
+}
+
+char *
+stpui_build_standard_print_command(const stpui_plist_t *plist,
+ const stp_printer_t *printer)
+{
+ const char *queue_name = stpui_plist_get_queue_name(plist);
+ const char *extra_options = stpui_plist_get_extra_printer_options(plist);
+ const char *family = stp_printer_get_family(printer);
+ int copy_count = stpui_plist_get_copy_count(plist);
+ int raw = 0;
+ char *print_cmd;
+ char *count_string = NULL;
+ if (!queue_name)
+ queue_name = "";
+ identify_print_system();
+ if (strcmp(family, "ps") == 0)
+ raw = 0;
+ else
+ raw = 1;
+
+ if (copy_count > 1)
+ stp_asprintf(&count_string, "%s %d ",
+ global_printing_system->copy_count_command, copy_count);
+
+ stp_asprintf(&print_cmd, "%s %s %s %s %s%s%s",
+ global_printing_system->print_command,
+ queue_name[0] ? global_printing_system->queue_select : "",
+ queue_name[0] ? g_shell_quote(queue_name) : "",
+ count_string ? count_string : "",
+ raw ? global_printing_system->raw_flag : "",
+ extra_options ? " " : "",
+ extra_options ? extra_options : "");
+ SAFE_FREE(count_string);
+ return print_cmd;
+}
+
+void
+stpui_set_printrc_file(const char *name)
+{
+ if (name && name == printrc_name)
+ return;
+ SAFE_FREE(printrc_name);
+ if (name)
+ printrc_name = g_strdup(name);
+ else
+ printrc_name = g_build_filename(g_get_home_dir(), ".gutenprintrc", NULL);
+}
+
+const char *
+stpui_get_printrc_file(void)
+{
+ if (!printrc_name)
+ stpui_set_printrc_file(NULL);
+ return printrc_name;
+}
+
+#define PLIST_ACCESSORS(name) \
+void \
+stpui_plist_set_##name(stpui_plist_t *p, const char *val) \
+{ \
+ if (p->name == val) \
+ return; \
+ SAFE_FREE(p->name); \
+ p->name = g_strdup(val); \
+} \
+ \
+void \
+stpui_plist_set_##name##_n(stpui_plist_t *p, const char *val, int n) \
+{ \
+ if (p->name == val) \
+ return; \
+ SAFE_FREE(p->name); \
+ p->name = g_strndup(val, n); \
+} \
+ \
+const char * \
+stpui_plist_get_##name(const stpui_plist_t *p) \
+{ \
+ return p->name; \
+}
+
+PLIST_ACCESSORS(output_filename)
+PLIST_ACCESSORS(name)
+PLIST_ACCESSORS(queue_name)
+PLIST_ACCESSORS(extra_printer_options)
+PLIST_ACCESSORS(custom_command)
+PLIST_ACCESSORS(current_standard_command)
+
+void
+stpui_plist_set_command_type(stpui_plist_t *p, command_t val)
+{
+ switch (val)
+ {
+ case COMMAND_TYPE_DEFAULT:
+ case COMMAND_TYPE_CUSTOM:
+ case COMMAND_TYPE_FILE:
+ p->command_type = val;
+ break;
+ default:
+ p->command_type = COMMAND_TYPE_DEFAULT;
+ }
+}
+
+command_t
+stpui_plist_get_command_type(const stpui_plist_t *p)
+{
+ return p->command_type;
+}
+
+void
+stpui_plist_set_copy_count(stpui_plist_t *p, gint copy_count)
+{
+ if (copy_count > 0)
+ stp_set_int_parameter(p->v, copy_count_name, copy_count);
+}
+
+gint
+stpui_plist_get_copy_count(const stpui_plist_t *p)
+{
+ if (stp_check_int_parameter(p->v, copy_count_name, STP_PARAMETER_ACTIVE))
+ return stp_get_int_parameter(p->v, copy_count_name);
+ else
+ return 1;
+}
+
+void
+stpui_set_image_type(const char *itype)
+{
+ image_type = g_strdup(itype);
+}
+
+void
+stpui_set_image_raw_channels(gint channels)
+{
+ image_raw_channels = channels;
+}
+
+void
+stpui_set_image_channel_depth(gint depth)
+{
+ image_channel_depth = depth;
+}
+
+void
+stpui_printer_initialize(stpui_plist_t *printer)
+{
+ char tmp[32];
+ stpui_plist_set_name(printer, "");
+ stpui_plist_set_output_filename(printer, "");
+ stpui_plist_set_queue_name(printer, "");
+ stpui_plist_set_extra_printer_options(printer, "");
+ stpui_plist_set_custom_command(printer, "");
+ stpui_plist_set_current_standard_command(printer, "");
+ printer->command_type = COMMAND_TYPE_DEFAULT;
+ printer->scaling = 100.0;
+ printer->orientation = ORIENT_AUTO;
+ printer->auto_size_roll_feed_paper = 0;
+ printer->unit = 0;
+ printer->v = stp_vars_create();
+ stpui_plist_set_copy_count(printer, 1);
+ stp_set_string_parameter(printer->v, "InputImageType", image_type);
+ if (image_raw_channels)
+ {
+ (void) sprintf(tmp, "%d", image_raw_channels);
+ stp_set_string_parameter(printer->v, "RawChannels", tmp);
+ }
+ if (image_channel_depth)
+ {
+ (void) sprintf(tmp, "%d", image_channel_depth);
+ stp_set_string_parameter(printer->v, "ChannelBitDepth", tmp);
+ }
+ printer->invalid_mask = INVALID_TOP | INVALID_LEFT;
+}
+
+static void
+stpui_plist_destroy(stpui_plist_t *printer)
+{
+ SAFE_FREE(printer->name);
+ SAFE_FREE(printer->queue_name);
+ SAFE_FREE(printer->extra_printer_options);
+ SAFE_FREE(printer->custom_command);
+ SAFE_FREE(printer->current_standard_command);
+ SAFE_FREE(printer->output_filename);
+ stp_vars_destroy(printer->v);
+}
+
+void
+stpui_plist_copy(stpui_plist_t *vd, const stpui_plist_t *vs)
+{
+ if (vs == vd)
+ return;
+ stp_vars_copy(vd->v, vs->v);
+ vd->scaling = vs->scaling;
+ vd->orientation = vs->orientation;
+ vd->auto_size_roll_feed_paper = vs->auto_size_roll_feed_paper;
+ vd->unit = vs->unit;
+ vd->invalid_mask = vs->invalid_mask;
+ vd->command_type = vs->command_type;
+ stpui_plist_set_name(vd, stpui_plist_get_name(vs));
+ stpui_plist_set_queue_name(vd, stpui_plist_get_queue_name(vs));
+ stpui_plist_set_extra_printer_options(vd, stpui_plist_get_extra_printer_options(vs));
+ stpui_plist_set_custom_command(vd, stpui_plist_get_custom_command(vs));
+ stpui_plist_set_current_standard_command(vd, stpui_plist_get_current_standard_command(vs));
+ stpui_plist_set_output_filename(vd, stpui_plist_get_output_filename(vs));
+ stpui_plist_set_copy_count(vd, stpui_plist_get_copy_count(vs));
+}
+
+static stpui_plist_t *
+allocate_stpui_plist_copy(const stpui_plist_t *vs)
+{
+ stpui_plist_t *rep = g_malloc(sizeof(stpui_plist_t));
+ memset(rep, 0, sizeof(stpui_plist_t));
+ rep->v = stp_vars_create();
+ stpui_plist_copy(rep, vs);
+ return rep;
+}
+
+static void
+check_plist(int count)
+{
+ static int current_plist_size = 0;
+ int i;
+ if (count <= current_plist_size)
+ return;
+ else if (current_plist_size == 0)
+ {
+ current_plist_size = count;
+ stpui_plist = g_malloc(current_plist_size * sizeof(stpui_plist_t));
+ for (i = 0; i < current_plist_size; i++)
+ {
+ memset(&(stpui_plist[i]), 0, sizeof(stpui_plist_t));
+ stpui_printer_initialize(&(stpui_plist[i]));
+ }
+ }
+ else
+ {
+ int old_plist_size = current_plist_size;
+ current_plist_size *= 2;
+ if (current_plist_size < count)
+ current_plist_size = count;
+ stpui_plist = g_realloc(stpui_plist, current_plist_size * sizeof(stpui_plist_t));
+ for (i = old_plist_size; i < current_plist_size; i++)
+ {
+ memset(&(stpui_plist[i]), 0, sizeof(stpui_plist_t));
+ stpui_printer_initialize(&(stpui_plist[i]));
+ }
+ }
+}
+
+#define GET_MANDATORY_INTERNAL_STRING_PARAM(param) \
+do { \
+ if ((commaptr = strchr(lineptr, ',')) == NULL) \
+ continue; \
+ stpui_plist_set_##param##_n(&key, lineptr, commaptr - line); \
+ 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)
+
+static int
+get_mandatory_string_param(stp_vars_t *v, const char *param, char **lineptr)
+{
+ char *commaptr = strchr(*lineptr, ',');
+ if (commaptr == NULL)
+ return 0;
+ stp_set_string_parameter_n(v, param, *lineptr, commaptr - *lineptr);
+ *lineptr = commaptr + 1;
+ return 1;
+}
+
+static int
+get_mandatory_file_param(stp_vars_t *v, const char *param, char **lineptr)
+{
+ char *commaptr = strchr(*lineptr, ',');
+ if (commaptr == NULL)
+ return 0;
+ stp_set_file_parameter_n(v, param, *lineptr, commaptr - *lineptr);
+ *lineptr = commaptr + 1;
+ return 1;
+}
+
+#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_MANDATORY_INTERNAL_INT_PARAM(param) \
+do { \
+ if ((commaptr = strchr(lineptr, ',')) == NULL) \
+ continue; \
+ key.param = atoi(lineptr); \
+ lineptr = commaptr + 1; \
+} while (0)
+
+static void
+get_optional_string_param(stp_vars_t *v, const char *param,
+ char **lineptr, int *keepgoing)
+{
+ if (*keepgoing)
+ {
+ char *commaptr = strchr(*lineptr, ',');
+ if (commaptr == NULL)
+ {
+ stp_set_string_parameter(v, param, *lineptr);
+ *keepgoing = 0;
+ }
+ else
+ {
+ stp_set_string_parameter_n(v, param, *lineptr, commaptr - *lineptr);
+ *lineptr = commaptr + 1;
+ }
+ }
+}
+
+#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 GET_OPTIONAL_INTERNAL_INT_PARAM(param) \
+do { \
+ if ((keepgoing == 0) || ((commaptr = strchr(lineptr, ',')) == NULL)) \
+ { \
+ keepgoing = 0; \
+ } \
+ else \
+ { \
+ key.param = 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)
+
+static void
+get_optional_float_param(stp_vars_t *v, const char *param,
+ char **lineptr, int *keepgoing)
+{
+ if (*keepgoing)
+ {
+ char *commaptr = strchr(*lineptr, ',');
+ if (commaptr == NULL)
+ {
+ stp_set_float_parameter(v, param, atof(*lineptr));
+ *keepgoing = 0;
+ }
+ else
+ {
+ stp_set_float_parameter(v, param, atof(*lineptr));
+ *lineptr = commaptr + 1;
+ }
+ }
+}
+
+#define GET_OPTIONAL_INTERNAL_FLOAT_PARAM(param) \
+do { \
+ if ((keepgoing == 0) || ((commaptr = strchr(lineptr, ',')) == NULL)) \
+ { \
+ keepgoing = 0; \
+ } \
+ else \
+ { \
+ key.param = atof(lineptr); \
+ } \
+} while (0)
+
+static void *
+psearch(const void *key, void *base, size_t nmemb, size_t size,
+ int (*compar)(const void *, const void *))
+{
+ int i;
+ char *cbase = (char *) base;
+ for (i = 0; i < nmemb; i++)
+ {
+ if ((*compar)(key, (const void *) cbase) == 0)
+ return (void *) cbase;
+ cbase += size;
+ }
+ return NULL;
+}
+
+stpui_plist_t *
+stpui_plist_create(const char *name, const char *driver)
+{
+ stpui_plist_t key;
+ stpui_plist_t *answer = NULL;
+ memset(&key, 0, sizeof(key));
+ stpui_printer_initialize(&key);
+ key.invalid_mask = 0;
+ stpui_plist_set_name(&key, name);
+ stp_set_driver(key.v, driver);
+ if (stpui_plist_add(&key, 0))
+ answer = psearch(&key, stpui_plist, stpui_plist_count,
+ sizeof(stpui_plist_t),
+ (int (*)(const void *, const void *)) compare_printers);
+ SAFE_FREE(key.name);
+ SAFE_FREE(key.queue_name);
+ SAFE_FREE(key.extra_printer_options);
+ SAFE_FREE(key.custom_command);
+ SAFE_FREE(key.current_standard_command);
+ SAFE_FREE(key.output_filename);
+ stp_vars_destroy(key.v);
+ return answer;
+}
+
+int
+stpui_plist_add(const stpui_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.
+ */
+ stpui_plist_t *p;
+ if (stp_get_printer(key->v))
+ {
+ p = psearch(key, stpui_plist, stpui_plist_count,
+ sizeof(stpui_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(stpui_plist_count + 1);
+ p = stpui_plist + stpui_plist_count;
+ stpui_plist_count++;
+ stpui_plist_copy(p, key);
+ if (strlen(stpui_plist_get_queue_name(p)) == 0 &&
+ stp_string_list_is_present(stpui_system_print_queues,
+ stpui_plist_get_name(p)))
+ stpui_plist_set_queue_name(p, stpui_plist_get_name(p));
+ }
+ else
+ {
+ if (add_only)
+ return 0;
+#ifdef DEBUG
+ fprintf(stderr, "Updating printer %s.\n", key->name);
+#endif
+ stpui_plist_copy(p, key);
+ }
+ }
+ return 1;
+}
+
+static void
+stpui_printrc_load_v0(FILE *fp)
+{
+ char line[1024]; /* Line in printrc file */
+ char *lineptr; /* Pointer in line */
+ char *commaptr; /* Pointer to next comma */
+ stpui_plist_t key; /* Search key */
+ int keepgoing = 1;
+ (void) memset(line, 0, 1024);
+ (void) memset(&key, 0, sizeof(stpui_plist_t));
+ stpui_printer_initialize(&key);
+ key.name = g_strdup(_("File"));
+ while (fgets(line, sizeof(line), fp) != NULL)
+ {
+ /*
+ * Read old format printrc lines...
+ */
+
+ stpui_printer_initialize(&key);
+ key.invalid_mask = 0;
+ 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_INTERNAL_STRING_PARAM(custom_command);
+ GET_MANDATORY_STRING_PARAM(driver);
+
+ if (! stp_get_printer(key.v))
+ continue;
+
+ if (!get_mandatory_file_param(key.v, "PPDFile", &lineptr))
+ continue;
+ if ((commaptr = strchr(lineptr, ',')) != NULL)
+ {
+ switch (atoi(lineptr))
+ {
+ case 1:
+ stp_set_string_parameter(key.v, "PrintingMode", "Color");
+ break;
+ case 0:
+ default:
+ stp_set_string_parameter(key.v, "PrintingMode", "BW");
+ break;
+ }
+ }
+ else
+ continue;
+
+ if (!get_mandatory_string_param(key.v, "Resolution", &lineptr))
+ continue;
+ if (!get_mandatory_string_param(key.v, "PageSize", &lineptr))
+ continue;
+ if (!get_mandatory_string_param(key.v, "MediaType", &lineptr))
+ continue;
+
+ get_optional_string_param(key.v, "InputSlot", &lineptr, &keepgoing);
+ get_optional_float_param(key.v, "Brightness", &lineptr, &keepgoing);
+
+ GET_OPTIONAL_INTERNAL_FLOAT_PARAM(scaling);
+ GET_OPTIONAL_INTERNAL_INT_PARAM(orientation);
+ GET_OPTIONAL_INT_PARAM(left);
+ GET_OPTIONAL_INT_PARAM(top);
+ get_optional_float_param(key.v, "Gamma", &lineptr, &keepgoing);
+ get_optional_float_param(key.v, "Contrast", &lineptr, &keepgoing);
+ get_optional_float_param(key.v, "Cyan", &lineptr, &keepgoing);
+ get_optional_float_param(key.v, "Magenta", &lineptr, &keepgoing);
+ get_optional_float_param(key.v, "Yellow", &lineptr, &keepgoing);
+ IGNORE_OPTIONAL_PARAM(linear);
+ IGNORE_OPTIONAL_PARAM(image_type);
+ get_optional_float_param(key.v, "Saturation", &lineptr, &keepgoing);
+ get_optional_float_param(key.v, "Density", &lineptr, &keepgoing);
+ get_optional_string_param(key.v, "InkType", &lineptr, &keepgoing);
+ get_optional_string_param(key.v,"DitherAlgorithm",&lineptr,&keepgoing);
+ GET_OPTIONAL_INTERNAL_INT_PARAM(unit);
+ stpui_plist_add(&key, 0);
+ g_free(key.name);
+ stp_vars_destroy(key.v);
+ }
+ stpui_plist_current = 0;
+}
+
+static void
+stpui_printrc_load_v1(FILE *fp)
+{
+ char line[1024]; /* Line in printrc file */
+ stpui_plist_t key; /* Search key */
+ char * current_printer = 0; /* printer to select */
+ (void) memset(line, 0, 1024);
+ (void) memset(&key, 0, sizeof(stpui_plist_t));
+ stpui_printer_initialize(&key);
+ key.name = g_strdup(_("File"));
+ while (fgets(line, sizeof(line), fp) != NULL)
+ {
+ /*
+ * Read new format printrc lines...
+ */
+
+ char *keyword, *end, *value;
+
+ keyword = line;
+ for (keyword = line; g_ascii_isspace(*keyword); keyword++)
+ {
+ /* skip initial spaces... */
+ }
+ if (!g_ascii_isalpha(*keyword))
+ continue;
+ for (end = keyword; g_ascii_isalnum(*end) || *end == '-'; end++)
+ {
+ /* find end of keyword... */
+ }
+ value = end;
+ while (g_ascii_isspace(*value))
+ {
+ /* skip over white space... */
+ value++;
+ }
+ if (*value != ':')
+ continue;
+ value++;
+ *end = '\0';
+ while (g_ascii_isspace(*value))
+ {
+ /* skip over white space... */
+ value++;
+ }
+ for (end = value; *end && *end != '\n'; end++)
+ {
+ /* find end of line... */
+ }
+ *end = '\0';
+#ifdef DEBUG
+ fprintf(stderr, "Keyword = `%s', value = `%s'\n", keyword, value);
+#endif
+ if (strcasecmp("current-printer", keyword) == 0)
+ {
+ if (current_printer)
+ g_free (current_printer);
+ current_printer = g_strdup(value);
+ }
+ else if (strcasecmp("printer", keyword) == 0)
+ {
+ /* Switch to printer named VALUE */
+ stpui_plist_add(&key, 0);
+#ifdef DEBUG
+ fprintf(stderr,
+ "output_to is now %s\n", stpui_plist_get_output_to(&key));
+#endif
+
+ stp_vars_destroy(key.v);
+ stpui_printer_initialize(&key);
+ key.invalid_mask = 0;
+ stpui_plist_set_name(&key, value);
+ }
+ else if (strcasecmp("destination", keyword) == 0)
+ stpui_plist_set_custom_command(&key, value);
+ else if (strcasecmp("driver", keyword) == 0)
+ stp_set_driver(key.v, value);
+ else if (strcasecmp("ppd-file", keyword) == 0)
+ stp_set_file_parameter(key.v, "PPDFile", value);
+ else if (strcasecmp("output-type", keyword) == 0)
+ {
+ switch (atoi(value))
+ {
+ case 1:
+ stp_set_string_parameter(key.v, "PrintingMode", "Color");
+ break;
+ case 0:
+ default:
+ stp_set_string_parameter(key.v, "PrintingMode", "BW");
+ break;
+ }
+ }
+ else if (strcasecmp("media-size", keyword) == 0)
+ stp_set_string_parameter(key.v, "PageSize", value);
+ else if (strcasecmp("media-type", keyword) == 0)
+ stp_set_string_parameter(key.v, "MediaType", value);
+ else if (strcasecmp("media-source", keyword) == 0)
+ stp_set_float_parameter(key.v, "Brightness", atof(value));
+ else if (strcasecmp("scaling", keyword) == 0)
+ key.scaling = atof(value);
+ else if (strcasecmp("orientation", keyword) == 0)
+ key.orientation = 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("linear", keyword) == 0)
+ /* Ignore linear */
+ ;
+ else if (strcasecmp("image-type", keyword) == 0)
+ /* Ignore image type */
+ ;
+ else if (strcasecmp("unit", keyword) == 0)
+ key.unit = 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));
+ /* Special case Ink-Type and Dither-Algorithm */
+ else if (strcasecmp("ink-type", keyword) == 0)
+ stp_set_string_parameter(key.v, "InkType", value);
+ else if (strcasecmp("dither-algorithm", keyword) == 0)
+ stp_set_string_parameter(key.v, "DitherAlgorithm", value);
+ else
+ {
+ stp_parameter_t desc;
+ stp_curve_t *curve;
+ stp_describe_parameter(key.v, keyword, &desc);
+ switch (desc.p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ stp_set_string_parameter(key.v, keyword, value);
+ break;
+ case STP_PARAMETER_TYPE_FILE:
+ stp_set_file_parameter(key.v, keyword, value);
+ break;
+ case STP_PARAMETER_TYPE_DOUBLE:
+ stp_set_float_parameter(key.v, keyword, atof(value));
+ break;
+ case STP_PARAMETER_TYPE_INT:
+ stp_set_int_parameter(key.v, keyword, atoi(value));
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ stp_set_boolean_parameter(key.v, keyword, atoi(value));
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ curve = stp_curve_create_from_string(value);
+ if (curve)
+ {
+ stp_set_curve_parameter(key.v, keyword, curve);
+ stp_curve_destroy(curve);
+ }
+ break;
+ default:
+ if (strlen(value))
+ {
+ char buf[1024];
+ snprintf(buf, sizeof(buf),
+ "Unrecognized keyword `%s' in printrc; value `%s' (%d)\n",
+ keyword, value, desc.p_type);
+ }
+ }
+ stp_parameter_description_destroy(&desc);
+ }
+ }
+ if (strlen(key.name) > 0)
+ {
+ stpui_plist_add(&key, 0);
+ stp_vars_destroy(key.v);
+ g_free(key.name);
+ }
+ if (current_printer)
+ {
+ int i;
+ for (i = 0; i < stpui_plist_count; i ++)
+ if (strcmp(current_printer, stpui_plist[i].name) == 0)
+ stpui_plist_current = i;
+ }
+}
+
+char *stpui_printrc_current_printer = NULL;
+extern FILE *yyin;
+extern int yyparse(void);
+
+static void
+stpui_printrc_load_v2(FILE *fp)
+{
+ int retval;
+ yyin = fp;
+
+ stpui_printrc_current_printer = NULL;
+ retval = yyparse();
+ if (stpui_printrc_current_printer)
+ {
+ int i;
+ for (i = 0; i < stpui_plist_count; i ++)
+ {
+ if (strcmp(stpui_printrc_current_printer, stpui_plist[i].name) == 0)
+ stpui_plist_current = i;
+ if (!stp_check_boolean_parameter(stpui_plist[i].v,
+ "PageSizeExtended",
+ STP_PARAMETER_ACTIVE))
+ stp_set_boolean_parameter(stpui_plist[i].v, "PageSizeExtended", 0);
+ }
+ SAFE_FREE(stpui_printrc_current_printer);
+ }
+}
+
+/*
+ * 'stpui_printrc_load()' - Load the printer resource configuration file.
+ */
+void
+stpui_printrc_load(void)
+{
+ FILE *fp; /* Printrc file */
+ char line[1024]; /* Line in printrc file */
+ int format = 0; /* rc file format version */
+ const char *filename = stpui_get_printrc_file();
+
+ initialize_default_parameters();
+ check_plist(1);
+
+ /*
+ * Get the printer list...
+ */
+
+ stpui_get_system_printers();
+
+ if ((fp = fopen(filename, "r")) != NULL)
+ {
+ (void) memset(line, 0, 1024);
+ if (fgets(line, sizeof(line), fp) != NULL)
+ {
+ /* Force locale to "C", so that numbers scan correctly */
+ setlocale(LC_ALL, "C");
+ if (strncmp("#PRINTRCv", line, 9) == 0)
+ {
+#ifdef DEBUG
+ fprintf(stderr, "Found printrc version tag: `%s'\n", line);
+ fprintf(stderr, "Version number: `%s'\n", &(line[9]));
+#endif
+ (void) sscanf(&(line[9]), "%d", &format);
+ }
+ setlocale(LC_ALL, "");
+ }
+ rewind(fp);
+ switch (format)
+ {
+ case 0:
+ stpui_printrc_load_v0(fp);
+ break;
+ case 1:
+ stpui_printrc_load_v1(fp);
+ break;
+ case 2:
+ case 3:
+ case 4:
+ stpui_printrc_load_v2(fp);
+ break;
+ }
+ (void) fclose(fp);
+ }
+ if (stpui_plist_count == 0)
+ stpui_plist_create(_("Printer"), "ps2");
+}
+
+/*
+ * 'stpui_printrc_save()' - Save the current printer resource configuration.
+ */
+void
+stpui_printrc_save(void)
+{
+ FILE *fp; /* Printrc file */
+ int i; /* Looping var */
+ size_t global_settings_count = stp_string_list_count(default_parameters);
+ stpui_plist_t *p; /* Current printer */
+ const char *filename = stpui_get_printrc_file();
+
+
+ if ((fp = fopen(filename, "w")) != NULL)
+ {
+ /*
+ * Write the contents of the printer list...
+ */
+
+ /* Force locale to "C", so that numbers print correctly */
+ setlocale(LC_ALL, "C");
+#ifdef DEBUG
+ fprintf(stderr, "Number of printers: %d\n", stpui_plist_count);
+#endif
+
+ fputs("#PRINTRCv4 written by Gutenprint " PLUG_IN_VERSION "\n\n", fp);
+
+ fprintf(fp, "Global-Settings:\n");
+ fprintf(fp, " Current-Printer: \"%s\"\n",
+ stpui_plist[stpui_plist_current].name);
+ fprintf(fp, " Show-All-Paper-Sizes: %s\n",
+ stpui_show_all_paper_sizes ? "True" : "False");
+ for (i = 0; i < global_settings_count; i++)
+ {
+ stp_param_string_t *ps = stp_string_list_param(default_parameters, i);
+ fprintf(fp, " %s \"%s\"\n", ps->name, ps->text);
+ }
+ fprintf(fp, "End-Global-Settings:\n");
+
+ for (i = 0, p = stpui_plist; i < stpui_plist_count; i ++, p ++)
+ {
+ int count;
+ int j;
+ stp_parameter_list_t *params = stp_get_parameter_list(p->v);
+ count = stp_parameter_list_count(params);
+ fprintf(fp, "\nPrinter: \"%s\" \"%s\"\n",
+ p->name, stp_get_driver(p->v));
+ fprintf(fp, " Command-Type: %d\n", p->command_type);
+ fprintf(fp, " Queue-Name: \"%s\"\n", p->queue_name);
+ fprintf(fp, " Output-Filename: \"%s\"\n", p->output_filename);
+ fprintf(fp, " Extra-Printer-Options: \"%s\"\n", p->extra_printer_options);
+ fprintf(fp, " Custom-Command: \"%s\"\n", p->custom_command);
+ fprintf(fp, " Scaling: %.3f\n", p->scaling);
+ fprintf(fp, " Orientation: %d\n", p->orientation);
+ fprintf(fp, " Autosize-Roll-Paper: %d\n", p->auto_size_roll_feed_paper);
+ fprintf(fp, " Unit: %d\n", p->unit);
+
+ fprintf(fp, " Left: %d\n", stp_get_left(p->v));
+ fprintf(fp, " Top: %d\n", stp_get_top(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));
+ fprintf(fp, " Parameter %s Int True %d\n", copy_count_name,
+ stpui_plist_get_copy_count(p));
+
+ for (j = 0; j < count; j++)
+ {
+ const stp_parameter_t *param = stp_parameter_list_param(params, j);
+ if (strcmp(param->name, "AppGamma") == 0)
+ continue;
+ switch (param->p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ if (stp_check_string_parameter(p->v, param->name,
+ STP_PARAMETER_INACTIVE))
+ fprintf(fp, " Parameter %s String %s \"%s\"\n",
+ param->name,
+ ((stp_get_string_parameter_active
+ (p->v, param->name) == STP_PARAMETER_ACTIVE) ?
+ "True" : "False"),
+ stp_get_string_parameter(p->v, param->name));
+ break;
+ case STP_PARAMETER_TYPE_FILE:
+ if (stp_check_file_parameter(p->v, param->name,
+ STP_PARAMETER_INACTIVE))
+ fprintf(fp, " Parameter %s File %s \"%s\"\n", param->name,
+ ((stp_get_file_parameter_active
+ (p->v, param->name) == STP_PARAMETER_ACTIVE) ?
+ "True" : "False"),
+ stp_get_file_parameter(p->v, param->name));
+ break;
+ case STP_PARAMETER_TYPE_DOUBLE:
+ if (stp_check_float_parameter(p->v, param->name,
+ STP_PARAMETER_INACTIVE))
+ fprintf(fp, " Parameter %s Double %s %f\n", param->name,
+ ((stp_get_float_parameter_active
+ (p->v, param->name) == STP_PARAMETER_ACTIVE) ?
+ "True" : "False"),
+ stp_get_float_parameter(p->v, param->name));
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ if (stp_check_dimension_parameter(p->v, param->name,
+ STP_PARAMETER_INACTIVE))
+ fprintf(fp, " Parameter %s Dimension %s %d\n", param->name,
+ ((stp_get_dimension_parameter_active
+ (p->v, param->name) == STP_PARAMETER_ACTIVE) ?
+ "True" : "False"),
+ stp_get_dimension_parameter(p->v, param->name));
+ break;
+ case STP_PARAMETER_TYPE_INT:
+ if (stp_check_int_parameter(p->v, param->name,
+ STP_PARAMETER_INACTIVE))
+ fprintf(fp, " Parameter %s Int %s %d\n", param->name,
+ ((stp_get_int_parameter_active
+ (p->v, param->name) == STP_PARAMETER_ACTIVE) ?
+ "True" : "False"),
+ stp_get_int_parameter(p->v, param->name));
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ if (stp_check_boolean_parameter(p->v, param->name,
+ STP_PARAMETER_INACTIVE))
+ fprintf(fp, " Parameter %s Boolean %s %s\n", param->name,
+ ((stp_get_boolean_parameter_active
+ (p->v, param->name) == STP_PARAMETER_ACTIVE) ?
+ "True" : "False"),
+ (stp_get_boolean_parameter(p->v, param->name) ?
+ "True" : "False"));
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ if (stp_check_curve_parameter(p->v, param->name,
+ STP_PARAMETER_INACTIVE))
+ {
+ const stp_curve_t *curve =
+ stp_get_curve_parameter(p->v, param->name);
+ if (curve)
+ {
+ fprintf(fp, " Parameter %s Curve %s '",
+ param->name,
+ ((stp_get_curve_parameter_active
+ (p->v, param->name) ==
+ STP_PARAMETER_ACTIVE) ?
+ "True" : "False"));
+ stp_curve_write(fp, curve);
+ fprintf(fp, "'\n");
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ stp_parameter_list_destroy(params);
+#ifdef DEBUG
+ fprintf(stderr, "Wrote printer %d: %s\n", i, p->name);
+#endif
+ }
+ setlocale(LC_ALL, "");
+ fclose(fp);
+ }
+ else
+ fprintf(stderr, "could not open printrc file \"%s\"\n",filename);
+}
+
+/*
+ * 'compare_printers()' - Compare system printer names for qsort().
+ */
+
+static int
+compare_printers(stpui_plist_t *p1, stpui_plist_t *p2)
+{
+ return (strcmp(p1->name, p2->name));
+}
+
+/*
+ * 'stpui_get_system_printers()' - Get a complete list of printers from the spooler.
+ */
+
+void
+stpui_get_system_printers(void)
+{
+ FILE *pfile; /* Pipe to status command */
+ char line[1025]; /* Line from status command */
+
+ stpui_system_print_queues = stp_string_list_create();
+ stp_string_list_add_string(stpui_system_print_queues, "",
+ _("(Default Printer)"));
+
+ /*
+ * Run the command, if any, to get the available printers...
+ */
+
+ identify_print_system();
+ if (global_printing_system)
+ {
+ if ((pfile = popen(global_printing_system->scan_command, "r")) != NULL)
+ {
+ /*
+ * Read input as needed...
+ */
+
+ while (fgets(line, sizeof(line), pfile) != NULL)
+ {
+ char *tmp_ptr;
+ if ((tmp_ptr = strchr(line, '\n')))
+ tmp_ptr[0] = '\0';
+ if ((tmp_ptr = strchr(line, '\r')))
+ tmp_ptr[0] = '\0';
+ if (strlen(line) > 0)
+ {
+ if (!stp_string_list_is_present(stpui_system_print_queues, line))
+ stp_string_list_add_string(stpui_system_print_queues,
+ line, line);
+ }
+ }
+ pclose(pfile);
+ }
+ }
+}
+
+const stpui_plist_t *
+stpui_get_current_printer(void)
+{
+ return &(stpui_plist[stpui_plist_current]);
+}
+
+/*
+ * 'usr1_handler()' - Make a note when we receive SIGUSR1.
+ */
+
+static volatile int usr1_interrupt;
+
+static void
+usr1_handler (int sig)
+{
+ usr1_interrupt = 1;
+}
+
+static void
+writefunc(void *file, const char *buf, size_t bytes)
+{
+ FILE *prn = (FILE *)file;
+ fwrite(buf, 1, bytes, prn);
+}
+
+static void
+stpui_errfunc(void *file, const char *buf, size_t bytes)
+{
+ g_message(buf);
+}
+
+/*
+ *
+ * Process control for actually printing. Documented 20040821
+ * by Robert Krawitz.
+ *
+ * In addition to the print command itself and the output generator,
+ * we spawn two additional processes to monitor the print job and clean
+ * up. We do this because the GIMP is very unfriendly about how it
+ * terminates plugins when the user cancels an operation: it sends a
+ * SIGKILL, which prevents the plugin from cleaning up. Since the
+ * plugin is sending data to an lpr process, this SIGKILL closes off
+ * the input to lpr. lpr doesn't know that its parent has died
+ * inappropriately, and happily proceeds to print the partial job.
+ *
+ * (The child may not actually be lpr, of course, but we'll just use
+ * that nomenclature for convenience.)
+ *
+ * The first such process is the "lpr monitor". Its job is to
+ * watch the parent (the actual data generator). If its parent dies,
+ * it kills the print command. Notice that it must keep the file
+ * descriptor used to write to the lpr process open, since as soon as
+ * the last writer to this pipe is closed, the lpr process sees its
+ * input close. Therefore, it first kills the child with SIGTERM and
+ * then closes the pipe. Perhaps a more robust method would be to
+ * send a SIGTERM followed by a SIGKILL, but we can worry about that
+ * later. The lpr monitor process is killed with SIGUSR1 by the
+ * master upon successful completion, at which point it exits. The lpr
+ * monitor itself detects that the master has finished by periodically
+ * sending it a kill 0 (a null signal). When the parent exits, this
+ * attempt to signal will return failure. This has a potential race
+ * condition if another process is created with the same PID between
+ * checks. A more robust (but more complicated) solution would involve
+ * IPC of some kind.
+ *
+ * The second such process (the "error monitor") monitors the stderr
+ * (and stdout) of the lpr process, to send any error messages back
+ * to the user. Since the GIMP is normally not launched from a
+ * terminal window, any errors would get lost. The error monitor
+ * captures this output and reports it back. It stays around until
+ * its input is closed (normally by the lpr process exiting), at
+ * which point it reports to the master that it has finished, and the
+ * master can clean up and return.
+ *
+ * The actual master process spawns the lpr monitor, which spawns
+ * the process that will later run the lpr command, which itself
+ * spawns the error monitor.
+ *
+ * This architecture is perhaps unnecessarily complex; the lpr monitor
+ * and error monitor could perhaps be combined into a single process
+ * that watches both for the parent to go away and for the error messages.
+ *
+ * The following diagrams illustrate the control flow during the normal
+ * case and also when the print job is cancelled. The notation for file
+ * descriptors is a number prefixed with < for an input file descriptor
+ * and suffixed > for an output file descriptor. For example, <0 means
+ * input file descriptor 0 and 1> means output file descriptor 1. The
+ * key to the file descriptors is given below. A file descriptor named
+ * x,y refers to file descriptor y duplicated onto file descriptor x.
+ * So "<0,3" means input file descriptor 3 (pipefd[0]) dup2'ed onto
+ * file descriptor 0.
+ *
+ * fd0 = fd 0
+ * fd1 = fd 1
+ * fd2 = fd 2
+ * fd3 = pipefd[0]
+ * fd4 = pipefd[1]
+ * fd5 = syncfd[0]
+ * fd6 = syncfd[1]
+ * fd7 = errfd[0]
+ * fd8 = errfd[1]
+ *
+ *
+ * NORMAL CASE
+ *
+ * PARENT CHILD 1 CHILD 2 CHILD 3
+ * (print generator) (lpr monitor) (print command) (error monitor)
+ * |
+ * stpui_print
+ * |
+ * | <0 1> 2>
+ * |
+ * | pipe(syncfd)
+ * |
+ * | <0 1> 2> <5 6>
+ * |
+ * | pipe(pipefd)
+ * |
+ * | <0 1> 2> <3 4>
+ * | <5 6>
+ * |
+ * | fork =============|
+ * | |
+ * | close(63) | close(syncfd[0])
+ * | | <0 1> 2> <3 4>
+ * | <0 1> 2> 4> <5 | 6>
+ * | |
+ * | | fork =============|
+ * | | |
+ * | | close(01263) | dup2(pipefd[0], 0)
+ * | | | close(pipefd[0]
+ * | | 4> | close(pipefd[1]
+ * | | |
+ * | | | 1> 2> <0,3 6>
+ * | | |
+ * | | | pipe(errfd)
+ * | | | 1> 2> <0,3 6>
+ * | | | <7 8>
+ * | | |
+ * | | | fork =============|
+ * | | | | close(012348)
+ * | | | close(12) | 6> <7
+ * | | | |
+ * | | | <0,3 6> <7 8> |
+ * | | | |
+ * | | | dup2(errfd[1],1) |
+ * | | | dup2(errfd[1],2) |
+ * | | | close(errfd[1]) |
+ * | | | close(pipefd[0]) |
+ * | | | close(pipefd[1]) |
+ * | | | close(syncfd[1]) |
+ * |<<<<<<<<<<<<<<<<<<<|kill(0,0) * EXEC lpr |
+ * |>>>>>>>>>>>>>>>>>>>|OK | <0,3 1,8> 2,8> |
+ * | | | |
+ * | write>>>>>>>>>>>>>+>>>>>>>>>>>>>>>>>>>| |
+ * | | | write(2,8)??>>>>>>|read(<7)->warn
+ * | | | |
+ * | close(4)>>>>>>>>>>+>>>>>>>>>>>>>>>>>>>| |
+ * | <0 1> 2> <5 | | |
+ * | kill>>>>>>>>>>>>>>| | |
+ * | | close(4)>>>>>>>>>>| eof(<0,3) |
+ * | | | |
+ * | | *no open fd* | 1,8> 2,8> |
+ * | | exit | |
+ * | | | exit>>>>>>>>>>>>>>| eof(<7)
+ * | wait<<<<<<<<<<<<<<X X | 6>
+ * | |
+ * | read(<5)<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<| write(6>)
+ * | |
+ * | close(5) | exit
+ * | X
+ * | 0< 1> 2>
+ * |
+ * | return
+ * X
+ *
+ *
+ * ERROR CASE (job cancelled)
+ *
+ * PARENT CHILD 1 CHILD 2 CHILD 3
+ * (print generator) (lpr monitor) (print command) (error monitor)
+ * |
+ * stpui_print
+ * |
+ * | <0 1> 2>
+ * |
+ * | pipe(syncfd)
+ * |
+ * | <0 1> 2> <5 6>
+ * |
+ * | pipe(pipefd)
+ * |
+ * | <0 1> 2> <3 4>
+ * | <5 6>
+ * |
+ * | fork =============|
+ * | |
+ * | close(63) | close(syncfd[0]
+ * | | <0 1> 2> <3 4>
+ * | <0 1> 2> 4> <5 | 6>
+ * | |
+ * | | fork =============|
+ * | | |
+ * | | close(01263) | dup2(pipefd[0], 0)
+ * | | | close(pipefd[0]
+ * | | 4> | close(pipefd[1]
+ * | | |
+ * | | | 1> 2> <3,0 6>
+ * | | |
+ * | | | pipe(errfd)
+ * | | | 1> 2> <3,0 6>
+ * | | | <7 8>
+ * | | |
+ * | | | fork =============|
+ * | | | | close(012348)
+ * | | | close(12) | 6> <7
+ * | | | |
+ * | | | <3,0 6> <7 8> |
+ * | | | |
+ * | | | dup2(errfd[1],1) |
+ * | | | dup2(errfd[1],2) |
+ * | | | close(3468) |
+ * |<<<<<<<<<<<<<<<<<<<|kill(0,0) * EXEC lpr |
+ * |>>>>>>>>>>>>>>>>>>>|OK | <0,3 1,8> 2,8> |
+ * | | | |
+ * | write>>>>>>>>>>>>>+>>>>>>>>>>>>>>>>>>>| |
+ * | | | write(2,8)??>>>>>>|read(<7)->warn
+ * | KILLED | | |
+ * | close(01245)>>>>>>+>>>>>>>>>>>>>>>>>>>| |
+ * X | | |
+ * <<<<<<<<<<<<<<<<<<<|kill(0,0) | |
+ * >>>>>>>>>>>>>>>>>>>|DEAD! | |
+ * |kill(2)>>>>>>>>>>>>|Terminated |
+ * |close(4>)>>>>>>>>>>|eof(0,3) |
+ * | | 1,8> 2,8> |
+ * | *no open fd* |exit>>>>>>>>>>>>>>>|eof(7)
+ * | exit X |
+ * X | 6>
+ * <| write(6)
+ * | exit/SIGPIPE
+ * X
+ */
+
+int
+stpui_print(const stpui_plist_t *printer, stpui_image_t *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 */
+ errfd[2], /* Message logger from lp command */
+ syncfd[2]; /* Sync the logger */
+ FILE *prn = NULL; /* Print file/command */
+ int do_sync = 0;
+ int print_status = 0;
+ int dummy;
+
+ /*
+ * Open the file/execute the print command...
+ */
+
+ if (stpui_plist_get_command_type(printer) == COMMAND_TYPE_DEFAULT ||
+ stpui_plist_get_command_type(printer) == COMMAND_TYPE_CUSTOM)
+ {
+ /*
+ * 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.
+ */
+ do_sync = 1;
+ usr1_interrupt = 0;
+ signal (SIGUSR1, usr1_handler);
+ if (pipe (syncfd) != 0)
+ {
+ do_sync = 0;
+ }
+ if (pipe (pipefd) != 0)
+ {
+ prn = NULL;
+ }
+ else
+ {
+ cpid = fork ();
+ if (cpid < 0) /* Error */
+ {
+ do_sync = 0;
+ prn = NULL;
+ }
+ else if (cpid == 0) /* Child 1 (lpr monitor and printer command) */
+ {
+ /* LPR monitor process. Printer output is piped to us. */
+ close(syncfd[0]);
+ opid = fork ();
+ if (opid < 0)
+ {
+ /* Errors will cause the plugin to get a SIGPIPE. */
+ exit (1);
+ }
+ else if (opid == 0) /* Child 2 (printer command) */
+ {
+ dup2 (pipefd[0], 0);
+ close (pipefd[0]);
+ close (pipefd[1]);
+ if (pipe(errfd) == 0)
+ {
+ opid = fork();
+ if (opid < 0)
+ _exit(1);
+ else if (opid == 0) /* Child 3 (monitors stderr) */
+ {
+ stp_outfunc_t errfunc = stpui_get_errfunc();
+ void *errdata = stpui_get_errdata();
+ /* calls g_message on anything it sees */
+ char buf[4096];
+
+ close (pipefd[0]);
+ close (pipefd[1]);
+ close (0);
+ close (1);
+ close (2);
+ close (errfd[1]);
+ while (1)
+ {
+ ssize_t bytes = read(errfd[0], buf, 4095);
+ if (bytes > 0)
+ {
+ buf[bytes] = '\0';
+ (*errfunc)(errdata, buf, bytes);
+ }
+ else
+ {
+ if (bytes < 0)
+ {
+ snprintf(buf, 4095,
+ "Read messages failed: %s\n",
+ strerror(errno));
+ (*errfunc)(errdata, buf, strlen(buf));
+ }
+ write(syncfd[1], "Done", 5);
+ _exit(0);
+ }
+ }
+ /* NOTREACHED */
+ write(syncfd[1], "Done", 5);
+ _exit(0);
+ }
+ else /* Child 2 (printer command) */
+ {
+ const char *command;
+ if (stpui_plist_get_command_type(printer) ==
+ COMMAND_TYPE_DEFAULT)
+ command =
+ stpui_build_standard_print_command
+ (printer, stp_get_printer(printer->v));
+ else
+ command = stpui_plist_get_custom_command(printer);
+ (void) close(2);
+ (void) close(1);
+ dup2 (errfd[1], 2);
+ dup2 (errfd[1], 1);
+ close(errfd[1]);
+ close (pipefd[0]);
+ close (pipefd[1]);
+ close(syncfd[1]);
+ execl("/bin/sh", "/bin/sh", "-c", command, NULL);
+ /* NOTREACHED */
+ _exit (1);
+ }
+ /* NOTREACHED */
+ _exit(1);
+ }
+ else /* pipe() failed! */
+ {
+ _exit(1);
+ }
+ }
+ else /* Child 1 (lpr monitor) */
+ {
+ /*
+ * 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.
+ *
+ * Note that we keep pipefd[1] -- which is the pipe from
+ * the print plugin to the lpr process -- open during this.
+ * If we don't, and the parent gets killed, lpr will notice
+ * its stdin getting closed off and start printing.
+ * This way its stdin stays open until we kill it.
+ */
+ close (0);
+ close (1);
+ close (2);
+ close (syncfd[1]);
+ close (pipefd[0]);
+ while (usr1_interrupt == 0)
+ {
+ /*
+ * Note potential race condition, if some other process
+ * happens to get the same pid!
+ */
+ if (kill (ppid, 0) < 0)
+ {
+ /*
+ * The print plugin has been killed!
+ * Note that there is no possibility of the print
+ * job sending us a SIGUSR1 and then exiting;
+ * the parent (print plugin) stays around after
+ * sending us the SIGUSR1, and then waits
+ * for us to die.
+ */
+ 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 /* Parent (actually generates the output) */
+ {
+ close (syncfd[1]);
+ close (pipefd[0]);
+ /* Parent process. We generate the printer output. */
+ prn = fdopen (pipefd[1], "w");
+ /* and fall through... */
+ }
+ }
+ }
+ else
+ prn = fopen (stpui_plist_get_output_filename(printer), "wb");
+
+ if (prn != NULL)
+ {
+ char tmp[32];
+ stpui_plist_t *np = allocate_stpui_plist_copy(printer);
+ const stp_vars_t *current_vars =
+ stp_printer_get_defaults(stp_get_printer(np->v));
+ int orientation;
+ stp_merge_printvars(np->v, current_vars);
+ stp_set_string_parameter(np->v, "InputImageType", image_type);
+ if (image_raw_channels)
+ {
+ sprintf(tmp, "%d", image_raw_channels);
+ stp_set_string_parameter(np->v, "RawChannels", tmp);
+ }
+ sprintf(tmp, "%d", image_channel_depth);
+ stp_set_string_parameter(np->v, "ChannelBitDepth", tmp);
+
+ /*
+ * Set up the orientation
+ */
+ orientation = np->orientation;
+ if (orientation == ORIENT_AUTO)
+ orientation = stpui_compute_orientation();
+ switch (orientation)
+ {
+ case ORIENT_PORTRAIT:
+ break;
+ case ORIENT_LANDSCAPE:
+ if (image->rotate_cw)
+ (image->rotate_cw)(image);
+ break;
+ case ORIENT_UPSIDEDOWN:
+ if (image->rotate_180)
+ (image->rotate_180)(image);
+ break;
+ case ORIENT_SEASCAPE:
+ if (image->rotate_ccw)
+ (image->rotate_ccw)(image);
+ break;
+ }
+
+ /*
+ * Finally, call the print driver to send the image to the printer
+ * and close the output file/command...
+ */
+
+ stp_set_outfunc(np->v, writefunc);
+ stp_set_errfunc(np->v, stpui_get_errfunc());
+ stp_set_outdata(np->v, prn);
+ stp_set_errdata(np->v, stpui_get_errdata());
+ print_status = stp_print(np->v, &(image->im));
+
+ /*
+ * Note that we do not use popen() to create the output, therefore
+ * we do not use pclose() to close it. See bug 1013565.
+ */
+ (void) fclose(prn);
+ if (stpui_plist_get_command_type(printer) == COMMAND_TYPE_DEFAULT ||
+ stpui_plist_get_command_type(printer) == COMMAND_TYPE_CUSTOM)
+ {
+ /*
+ * It is important for us to first close off the lpr process,
+ * then kill the lpr monitor (child 1), and then wait for it
+ * to die before exiting.
+ */
+ kill (cpid, SIGUSR1);
+ waitpid (cpid, &dummy, 0);
+ }
+
+ /*
+ * Make sure that any errors have been reported back to the user
+ * prior to completion. In addition, explicitly close off the
+ * synchronization file descriptor since we're merely returning,
+ * not exiting, and don't want to leave any pollution around.
+ */
+ if (do_sync)
+ {
+ char buf[8];
+ (void) read(syncfd[0], buf, 8);
+ (void) close(syncfd[0]);
+ }
+ stpui_plist_destroy(np);
+ g_free(np);
+ return 1;
+ }
+ return 0;
+}
+
+/*
+ * End of "$Id: plist.c,v 1.5 2005/06/14 02:47:13 rlk Exp $".
+ */
diff --git a/src/gutenprintui2/print-image-thumbnail.c b/src/gutenprintui2/print-image-thumbnail.c
new file mode 100644
index 0000000..51fd136
--- /dev/null
+++ b/src/gutenprintui2/print-image-thumbnail.c
@@ -0,0 +1,130 @@
+/*
+ * "$Id: print-image-thumbnail.c,v 1.1 2004/09/17 18:38:14 rleigh 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 <cpbs@debian.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 <config.h>
+#endif
+#include <sys/types.h>
+#include <string.h>
+
+#include <gutenprintui2/gutenprintui.h>
+#include "gutenprintui-internal.h"
+
+/* Concrete type to represent image */
+typedef struct
+{
+ const guchar *data;
+ gint w, h, bpp;
+ gint32 real_bpp;
+} thumbnail_image_t;
+
+static const char *Thumbnail_get_appname(stp_image_t *image);
+static void Thumbnail_conclude(stp_image_t *image);
+static stp_image_status_t Thumbnail_get_row(stp_image_t *image,
+ unsigned char *data,
+ size_t byte_limit, int row);
+static int Thumbnail_height(stp_image_t *image);
+static int Thumbnail_width(stp_image_t *image);
+static void Thumbnail_reset(stp_image_t *image);
+static void Thumbnail_init(stp_image_t *image);
+
+static stp_image_t theImage =
+{
+ Thumbnail_init,
+ Thumbnail_reset,
+ Thumbnail_width,
+ Thumbnail_height,
+ Thumbnail_get_row,
+ Thumbnail_get_appname,
+ Thumbnail_conclude,
+ NULL
+};
+
+stp_image_t *
+stpui_image_thumbnail_new(const guchar *data, gint w, gint h, gint bpp)
+{
+ thumbnail_image_t *im;
+ if (! theImage.rep)
+ theImage.rep = stp_malloc(sizeof(thumbnail_image_t));
+ im = (thumbnail_image_t *) (theImage.rep);
+ memset(im, 0, sizeof(thumbnail_image_t));
+ im->data = data;
+ im->w = w;
+ im->h = h;
+ im->bpp = bpp;
+
+ theImage.reset(&theImage);
+ return &theImage;
+}
+
+static int
+Thumbnail_width(stp_image_t *image)
+{
+ thumbnail_image_t *im = (thumbnail_image_t *) (image->rep);
+ return im->w;
+}
+
+static int
+Thumbnail_height(stp_image_t *image)
+{
+ thumbnail_image_t *im = (thumbnail_image_t *) (image->rep);
+ return im->h;
+}
+
+static stp_image_status_t
+Thumbnail_get_row(stp_image_t *image, unsigned char *data,
+ size_t byte_limit, int row)
+{
+ thumbnail_image_t *im = (thumbnail_image_t *) (image->rep);
+ const guchar *where = im->data + (row * im->w * im->bpp);
+ memcpy(data, where, im->w * im->bpp);
+ return STP_IMAGE_STATUS_OK;
+}
+
+static void
+Thumbnail_init(stp_image_t *image)
+{
+ /* Nothing to do. */
+}
+
+static void
+Thumbnail_reset(stp_image_t *image)
+{
+}
+
+static void
+Thumbnail_conclude(stp_image_t *image)
+{
+}
+
+static const char *
+Thumbnail_get_appname(stp_image_t *image)
+{
+ static char pluginname[] = "Thumbnail V" VERSION " - " RELEASE_DATE;
+ return pluginname;
+}
+
+/*
+ * End of "$Id: print-image-thumbnail.c,v 1.1 2004/09/17 18:38:14 rleigh Exp $".
+ */
diff --git a/src/gutenprintui2/printrc.h b/src/gutenprintui2/printrc.h
new file mode 100644
index 0000000..2ff4220
--- /dev/null
+++ b/src/gutenprintui2/printrc.h
@@ -0,0 +1,44 @@
+/*
+ * "$Id: printrc.h,v 1.1 2004/09/17 18:38:14 rleigh 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 GUTENPRINTUI_PRINTRC_H
+#define GUTENPRINTUI_PRINTRC_H
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+typedef union yylv {
+ int ival;
+ double dval;
+ char *sval;
+} YYSTYPE;
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+#include "printrcy.h"
+
+#endif /* GUTENPRINTUI_PRINTRC_H */
diff --git a/src/gutenprintui2/printrcl.c b/src/gutenprintui2/printrcl.c
new file mode 100644
index 0000000..6d6cd19
--- /dev/null
+++ b/src/gutenprintui2/printrcl.c
@@ -0,0 +1,2106 @@
+
+#line 3 "printrcl.c"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 31
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart(yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 16384
+#endif
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+extern int yyleng;
+
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+ } \
+ while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef unsigned int yy_size_t;
+#endif
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via yyrestart()), so that the user can continue scanning by
+ * just pointing yyin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+static int yy_n_chars; /* number of characters read into yy_ch_buf */
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart (FILE *input_file );
+void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE yy_create_buffer (FILE *file,int size );
+void yy_delete_buffer (YY_BUFFER_STATE b );
+void yy_flush_buffer (YY_BUFFER_STATE b );
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer );
+void yypop_buffer_state (void );
+
+static void yyensure_buffer_stack (void );
+static void yy_load_buffer_state (void );
+static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file );
+
+#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len );
+
+void *yyalloc (yy_size_t );
+void *yyrealloc (void *,yy_size_t );
+void yyfree (void * );
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ yyensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer(yyin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ yyensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer(yyin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+#define yywrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int yylineno;
+
+int yylineno = 1;
+
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ yyleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 40
+#define YY_END_OF_BUFFER 41
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_accept[335] =
+ { 0,
+ 0, 0, 41, 40, 37, 39, 40, 38, 40, 40,
+ 31, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 37, 0, 33,
+ 38, 38, 0, 31, 0, 0, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 38, 32, 0, 32, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 24, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 38, 35, 35, 35, 35, 35,
+
+ 35, 35, 35, 35, 35, 0, 35, 35, 26, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 11,
+ 34, 35, 38, 35, 35, 35, 35, 30, 35, 35,
+ 35, 35, 35, 0, 35, 35, 10, 35, 35, 35,
+ 35, 35, 35, 0, 35, 8, 38, 35, 35, 35,
+ 35, 35, 35, 35, 27, 35, 0, 0, 35, 35,
+ 35, 35, 35, 0, 35, 0, 25, 38, 35, 29,
+ 35, 35, 0, 35, 35, 35, 9, 0, 0, 0,
+ 23, 35, 0, 35, 35, 35, 0, 35, 0, 38,
+ 35, 0, 0, 0, 35, 35, 35, 0, 0, 0,
+
+ 35, 0, 35, 35, 3, 0, 5, 0, 38, 0,
+ 0, 0, 0, 35, 35, 28, 0, 0, 0, 35,
+ 0, 35, 15, 0, 0, 38, 0, 0, 0, 0,
+ 35, 35, 0, 0, 0, 35, 0, 35, 0, 0,
+ 38, 36, 0, 0, 0, 0, 35, 35, 0, 0,
+ 0, 35, 0, 35, 16, 0, 0, 0, 0, 0,
+ 35, 4, 0, 0, 0, 6, 0, 14, 0, 0,
+ 20, 0, 0, 35, 35, 0, 0, 0, 0, 0,
+ 0, 0, 0, 35, 35, 0, 0, 0, 0, 0,
+ 0, 0, 19, 35, 35, 0, 0, 0, 0, 0,
+
+ 0, 1, 35, 35, 0, 0, 21, 17, 0, 0,
+ 35, 35, 0, 0, 0, 0, 35, 12, 0, 0,
+ 0, 0, 13, 0, 0, 0, 7, 22, 0, 0,
+ 0, 2, 18, 0
+ } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 1, 4, 5, 1, 1, 1, 6, 1,
+ 1, 1, 7, 1, 8, 9, 1, 10, 10, 11,
+ 11, 11, 10, 10, 10, 10, 10, 12, 1, 1,
+ 1, 1, 1, 1, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 23, 24, 25, 26, 27, 28,
+ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
+ 1, 1, 1, 1, 13, 1, 14, 15, 16, 17,
+
+ 18, 19, 20, 21, 22, 23, 23, 24, 25, 26,
+ 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
+ 37, 38, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1
+ } ;
+
+static yyconst flex_int32_t yy_meta[39] =
+ { 0,
+ 1, 1, 2, 1, 1, 1, 1, 1, 1, 3,
+ 3, 1, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3
+ } ;
+
+static yyconst flex_int16_t yy_base[340] =
+ { 0,
+ 0, 0, 374, 375, 371, 375, 368, 343, 364, 29,
+ 32, 336, 341, 18, 26, 21, 32, 343, 0, 340,
+ 347, 19, 41, 331, 42, 32, 337, 360, 357, 375,
+ 0, 330, 353, 55, 50, 68, 0, 326, 330, 331,
+ 37, 324, 329, 320, 330, 334, 318, 325, 324, 320,
+ 314, 326, 322, 311, 312, 319, 322, 325, 311, 307,
+ 308, 302, 312, 311, 59, 70, 72, 305, 307, 305,
+ 54, 297, 296, 309, 311, 291, 316, 293, 291, 303,
+ 305, 0, 287, 300, 289, 302, 289, 281, 289, 277,
+ 289, 298, 291, 276, 281, 275, 287, 290, 285, 284,
+
+ 274, 278, 273, 274, 279, 276, 281, 276, 0, 279,
+ 280, 265, 257, 264, 256, 269, 264, 277, 258, 375,
+ 0, 271, 250, 259, 266, 253, 252, 0, 252, 250,
+ 244, 256, 243, 248, 263, 246, 375, 237, 236, 249,
+ 248, 257, 238, 249, 242, 375, 231, 222, 233, 241,
+ 225, 77, 242, 233, 0, 242, 226, 224, 79, 237,
+ 81, 218, 219, 222, 227, 222, 0, 229, 226, 0,
+ 235, 234, 225, 212, 207, 211, 375, 222, 206, 204,
+ 375, 202, 214, 200, 213, 218, 215, 216, 203, 192,
+ 217, 192, 195, 195, 207, 198, 193, 204, 195, 198,
+
+ 193, 192, 176, 182, 375, 186, 375, 202, 198, 178,
+ 170, 176, 180, 184, 176, 0, 178, 175, 168, 172,
+ 174, 169, 0, 178, 167, 191, 166, 164, 169, 165,
+ 171, 162, 179, 154, 153, 158, 165, 164, 169, 166,
+ 176, 375, 154, 159, 150, 161, 161, 161, 141, 153,
+ 148, 157, 142, 155, 375, 138, 141, 152, 131, 136,
+ 51, 375, 143, 130, 133, 375, 144, 375, 139, 148,
+ 375, 137, 137, 135, 130, 119, 142, 129, 123, 117,
+ 118, 115, 132, 121, 125, 109, 113, 108, 120, 129,
+ 122, 123, 375, 114, 101, 110, 103, 118, 117, 97,
+
+ 99, 375, 105, 104, 98, 91, 375, 375, 100, 103,
+ 88, 107, 98, 95, 78, 85, 102, 375, 82, 85,
+ 93, 98, 375, 97, 82, 76, 375, 375, 68, 84,
+ 81, 375, 375, 375, 94, 97, 100, 89, 103
+ } ;
+
+static yyconst flex_int16_t yy_def[340] =
+ { 0,
+ 334, 1, 334, 334, 334, 334, 335, 336, 337, 334,
+ 334, 338, 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 334, 335, 334,
+ 336, 336, 337, 334, 334, 334, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 336, 334, 334, 334, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 336, 338, 338, 338, 338, 338,
+
+ 338, 338, 338, 338, 338, 334, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338, 338, 334,
+ 338, 338, 336, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 334, 338, 338, 334, 338, 338, 338,
+ 338, 338, 338, 334, 338, 334, 336, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 334, 334, 338, 338,
+ 338, 338, 338, 334, 338, 334, 338, 336, 338, 338,
+ 338, 338, 334, 338, 338, 338, 334, 334, 334, 334,
+ 334, 338, 334, 338, 338, 338, 334, 338, 334, 336,
+ 338, 334, 334, 334, 338, 338, 338, 334, 334, 334,
+
+ 338, 334, 338, 338, 334, 334, 334, 334, 336, 334,
+ 334, 334, 334, 338, 338, 338, 334, 334, 334, 338,
+ 334, 338, 338, 334, 334, 339, 334, 334, 334, 334,
+ 338, 338, 334, 334, 334, 338, 334, 338, 334, 334,
+ 339, 334, 334, 334, 334, 334, 338, 338, 334, 334,
+ 334, 338, 334, 338, 334, 334, 334, 334, 334, 334,
+ 338, 334, 334, 334, 334, 334, 334, 334, 334, 334,
+ 334, 334, 334, 338, 338, 334, 334, 334, 334, 334,
+ 334, 334, 334, 338, 338, 334, 334, 334, 334, 334,
+ 334, 334, 334, 338, 338, 334, 334, 334, 334, 334,
+
+ 334, 334, 338, 338, 334, 334, 334, 334, 334, 334,
+ 338, 338, 334, 334, 334, 334, 338, 334, 334, 334,
+ 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
+ 334, 334, 334, 0, 334, 334, 334, 334, 334
+ } ;
+
+static yyconst flex_int16_t yy_nxt[414] =
+ { 0,
+ 4, 5, 6, 7, 8, 9, 10, 10, 4, 11,
+ 11, 4, 4, 12, 13, 14, 15, 16, 17, 18,
+ 19, 20, 19, 21, 19, 19, 22, 23, 24, 19,
+ 25, 26, 27, 19, 19, 19, 19, 19, 34, 34,
+ 35, 34, 34, 42, 40, 48, 46, 43, 53, 36,
+ 41, 54, 44, 49, 55, 45, 47, 58, 61, 65,
+ 65, 62, 59, 35, 34, 34, 71, 72, 65, 65,
+ 56, 274, 36, 60, 66, 66, 36, 67, 67, 67,
+ 67, 67, 67, 99, 173, 275, 180, 100, 183, 174,
+ 181, 37, 333, 184, 29, 332, 29, 31, 331, 31,
+
+ 33, 33, 33, 241, 241, 241, 330, 329, 328, 327,
+ 326, 325, 324, 323, 322, 321, 320, 319, 318, 317,
+ 316, 315, 314, 313, 312, 311, 310, 309, 308, 307,
+ 306, 305, 304, 303, 302, 301, 300, 299, 298, 297,
+ 296, 295, 294, 293, 292, 291, 290, 289, 288, 287,
+ 286, 285, 284, 283, 282, 281, 280, 279, 278, 277,
+ 276, 273, 272, 271, 270, 269, 268, 267, 266, 265,
+ 264, 263, 262, 261, 260, 259, 258, 257, 242, 256,
+ 255, 254, 253, 252, 251, 250, 249, 248, 247, 246,
+ 245, 244, 243, 242, 240, 239, 238, 237, 236, 235,
+
+ 234, 233, 232, 231, 230, 229, 228, 227, 226, 225,
+ 224, 223, 222, 221, 220, 219, 218, 217, 216, 215,
+ 214, 213, 212, 211, 210, 209, 208, 207, 206, 205,
+ 204, 203, 202, 201, 200, 199, 198, 197, 196, 195,
+ 194, 193, 192, 191, 190, 189, 188, 187, 186, 185,
+ 182, 179, 178, 177, 176, 175, 172, 171, 170, 169,
+ 168, 167, 166, 165, 164, 163, 162, 161, 160, 159,
+ 158, 157, 156, 155, 154, 153, 152, 151, 150, 149,
+ 148, 147, 146, 145, 144, 143, 142, 141, 140, 139,
+ 138, 137, 136, 121, 135, 134, 133, 132, 131, 130,
+
+ 129, 128, 127, 126, 125, 124, 123, 122, 121, 120,
+ 119, 118, 117, 116, 115, 114, 113, 112, 111, 110,
+ 109, 108, 107, 106, 105, 104, 103, 102, 101, 98,
+ 97, 96, 95, 94, 93, 92, 91, 90, 89, 88,
+ 87, 86, 85, 84, 83, 82, 81, 80, 79, 78,
+ 77, 76, 75, 74, 73, 70, 69, 68, 30, 64,
+ 30, 28, 63, 57, 52, 51, 50, 39, 38, 30,
+ 32, 30, 28, 334, 3, 334, 334, 334, 334, 334,
+ 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
+ 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
+
+ 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
+ 334, 334, 334
+ } ;
+
+static yyconst flex_int16_t yy_chk[414] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 10, 10,
+ 11, 11, 11, 15, 14, 17, 16, 15, 22, 11,
+ 14, 22, 15, 17, 23, 15, 16, 25, 26, 35,
+ 35, 26, 25, 34, 34, 34, 41, 41, 65, 65,
+ 23, 261, 34, 25, 36, 36, 65, 36, 36, 66,
+ 66, 67, 67, 71, 152, 261, 159, 71, 161, 152,
+ 159, 338, 331, 161, 335, 330, 335, 336, 329, 336,
+
+ 337, 337, 337, 339, 339, 339, 326, 325, 324, 322,
+ 321, 320, 319, 317, 316, 315, 314, 313, 312, 311,
+ 310, 309, 306, 305, 304, 303, 301, 300, 299, 298,
+ 297, 296, 295, 294, 292, 291, 290, 289, 288, 287,
+ 286, 285, 284, 283, 282, 281, 280, 279, 278, 277,
+ 276, 275, 274, 273, 272, 270, 269, 267, 265, 264,
+ 263, 260, 259, 258, 257, 256, 254, 253, 252, 251,
+ 250, 249, 248, 247, 246, 245, 244, 243, 241, 240,
+ 239, 238, 237, 236, 235, 234, 233, 232, 231, 230,
+ 229, 228, 227, 226, 225, 224, 222, 221, 220, 219,
+
+ 218, 217, 215, 214, 213, 212, 211, 210, 209, 208,
+ 206, 204, 203, 202, 201, 200, 199, 198, 197, 196,
+ 195, 194, 193, 192, 191, 190, 189, 188, 187, 186,
+ 185, 184, 183, 182, 180, 179, 178, 176, 175, 174,
+ 173, 172, 171, 169, 168, 166, 165, 164, 163, 162,
+ 160, 158, 157, 156, 154, 153, 151, 150, 149, 148,
+ 147, 145, 144, 143, 142, 141, 140, 139, 138, 136,
+ 135, 134, 133, 132, 131, 130, 129, 127, 126, 125,
+ 124, 123, 122, 119, 118, 117, 116, 115, 114, 113,
+ 112, 111, 110, 108, 107, 106, 105, 104, 103, 102,
+
+ 101, 100, 99, 98, 97, 96, 95, 94, 93, 92,
+ 91, 90, 89, 88, 87, 86, 85, 84, 83, 81,
+ 80, 79, 78, 77, 76, 75, 74, 73, 72, 70,
+ 69, 68, 64, 63, 62, 61, 60, 59, 58, 57,
+ 56, 55, 54, 53, 52, 51, 50, 49, 48, 47,
+ 46, 45, 44, 43, 42, 40, 39, 38, 33, 32,
+ 29, 28, 27, 24, 21, 20, 18, 13, 12, 9,
+ 8, 7, 5, 3, 334, 334, 334, 334, 334, 334,
+ 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
+ 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
+
+ 334, 334, 334, 334, 334, 334, 334, 334, 334, 334,
+ 334, 334, 334
+ } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+extern int yy_flex_debug;
+int yy_flex_debug = 0;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "printrcl.l"
+/* -*-Mode: C-*-
+ * "$Id: printrcl.l,v 1.1 2004/09/17 18:38:14 rleigh Exp $"
+ *
+ * printrc parser
+ *
+ * Copyright 2003 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.
+ */
+#line 24 "printrcl.l"
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <gutenprintui2/gutenprintui.h>
+#include "gutenprintui-internal.h"
+#include "printrc.h"
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define YY_NO_UNPUT
+
+int mylineno = 1;
+
+#define DBG(x) \
+do \
+ { \
+ if (getenv("STP_DEBUG_PRINTRC")) \
+ fprintf(stderr, "'%s' => %s\n", yytext, #x); \
+ } \
+ while (0)
+
+static char *
+q_strdup(const char *s)
+{
+ /* Strip the leading and trailing quote */
+ if (strlen(s) <= 2)
+ return NULL;
+ else
+ return g_strndup(s + 1, strlen(s) - 2);
+}
+
+#line 701 "printrcl.c"
+
+#define INITIAL 0
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap (void );
+#else
+extern int yywrap (void );
+#endif
+#endif
+
+ static void yyunput (int c,char *buf_ptr );
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ size_t n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(yyin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int yylex (void);
+
+#define YY_DECL int yylex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 73 "printrcl.l"
+
+
+#line 855 "printrcl.c"
+
+ if ( (yy_init) )
+ {
+ (yy_init) = 0;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! yyin )
+ yyin = stdin;
+
+ if ( ! yyout )
+ yyout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ yyensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer(yyin,YY_BUF_SIZE );
+ }
+
+ yy_load_buffer_state( );
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of yytext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+yy_match:
+ do
+ {
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 335 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ ++yy_cp;
+ }
+ while ( yy_base[yy_current_state] != 375 );
+
+yy_find_action:
+ yy_act = yy_accept[yy_current_state];
+ if ( yy_act == 0 )
+ { /* have to back up */
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ yy_act = yy_accept[yy_current_state];
+ }
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+ case 0: /* must back up */
+ /* undo the effects of YY_DO_BEFORE_ACTION */
+ *yy_cp = (yy_hold_char);
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 75 "printrcl.l"
+DBG(CURRENT_PRINTER); return CURRENT_PRINTER;
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 76 "printrcl.l"
+DBG(SHOW_ALL_PAPER_SIZES); return SHOW_ALL_PAPER_SIZES;
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 77 "printrcl.l"
+DBG(PRINTER); return PRINTER;
+ YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 78 "printrcl.l"
+DBG(DESTINATION); return DESTINATION;
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 79 "printrcl.l"
+DBG(SCALING); return SCALING;
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 80 "printrcl.l"
+DBG(ORIENTATION); return ORIENTATION;
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 81 "printrcl.l"
+DBG(AUTOSIZE_ROLL_PAPER); return AUTOSIZE_ROLL_PAPER;
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 82 "printrcl.l"
+DBG(UNIT); return UNIT;
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 83 "printrcl.l"
+DBG(DRIVER); return DRIVER;
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 84 "printrcl.l"
+DBG(LEFT); return LEFT;
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 85 "printrcl.l"
+DBG(TOP); return TOP;
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 86 "printrcl.l"
+DBG(CUSTOM_PAGE_WIDTH); return CUSTOM_PAGE_WIDTH;
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 87 "printrcl.l"
+DBG(CUSTOM_PAGE_HEIGHT); return CUSTOM_PAGE_HEIGHT;
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 88 "printrcl.l"
+DBG(OUTPUT_TYPE); return OUTPUT_TYPE;
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 89 "printrcl.l"
+DBG(PARAMETER); return PARAMETER;
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 90 "printrcl.l"
+DBG(QUEUE_NAME); return QUEUE_NAME;
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 91 "printrcl.l"
+DBG(OUTPUT_FILENAME); return OUTPUT_FILENAME;
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 92 "printrcl.l"
+DBG(EXTRA_PRINTER_OPTIONS); return EXTRA_PRINTER_OPTIONS;
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 93 "printrcl.l"
+DBG(CUSTOM_COMMAND); return CUSTOM_COMMAND;
+ YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 94 "printrcl.l"
+DBG(COMMAND_TYPE); return COMMAND_TYPE;
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 95 "printrcl.l"
+DBG(GLOBAL_SETTINGS); return GLOBAL_SETTINGS;
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 96 "printrcl.l"
+DBG(END_GLOBAL_SETTINGS); return END_GLOBAL_SETTINGS;
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 97 "printrcl.l"
+DBG(GLOBAL); return GLOBAL;
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 99 "printrcl.l"
+DBG(pINT); return pINT;
+ YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 100 "printrcl.l"
+DBG(pSTRING_LIST); return pSTRING_LIST;
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 101 "printrcl.l"
+DBG(pFILE); return pFILE;
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 102 "printrcl.l"
+DBG(pDOUBLE); return pDOUBLE;
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 103 "printrcl.l"
+DBG(pDIMENSION); return pDIMENSION;
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 104 "printrcl.l"
+DBG(pBOOLEAN); return pBOOLEAN;
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 105 "printrcl.l"
+DBG(pCURVE); return pCURVE;
+ YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 107 "printrcl.l"
+yylval.ival = atoi(yytext); DBG(tINT); return tINT;
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 108 "printrcl.l"
+yylval.dval = strtod(yytext, NULL); DBG(tDOUBLE); return tDOUBLE;
+ YY_BREAK
+case 33:
+/* rule 33 can match eol */
+YY_RULE_SETUP
+#line 109 "printrcl.l"
+yylval.sval = q_strdup(yytext); DBG(tSTRING); return tSTRING;
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 110 "printrcl.l"
+yylval.sval = g_strdup(yytext); DBG(tBOOLEAN); return tBOOLEAN;
+ YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 111 "printrcl.l"
+yylval.sval = g_strdup(yytext); DBG(tWORD); return tWORD;
+ YY_BREAK
+case 36:
+/* rule 36 can match eol */
+YY_RULE_SETUP
+#line 112 "printrcl.l"
+DBG(PRINTRC_HDR); return PRINTRC_HDR;
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 113 "printrcl.l"
+DBG(whitespace1); /* Skip blanks/tabs */
+ YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 114 "printrcl.l"
+DBG(comment1); /* Skip comments */
+ YY_BREAK
+case 39:
+/* rule 39 can match eol */
+YY_RULE_SETUP
+#line 115 "printrcl.l"
+DBG(newline); mylineno++;
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 116 "printrcl.l"
+ECHO;
+ YY_BREAK
+#line 1141 "printrcl.c"
+case YY_STATE_EOF(INITIAL):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed yyin at a new source and called
+ * yylex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_c_buf_p);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( yywrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * yytext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+} /* end of yylex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+
+ int yy_c_buf_p_offset =
+ (int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ int new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = 0;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+ number_to_move - 1;
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ yyrestart(yyin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = (yy_start);
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 335 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ register int yy_is_jam;
+ register char *yy_cp = (yy_c_buf_p);
+
+ register YY_CHAR yy_c = 1;
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 335 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_is_jam = (yy_current_state == 334);
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+ static void yyunput (int c, register char * yy_bp )
+{
+ register char *yy_cp;
+
+ yy_cp = (yy_c_buf_p);
+
+ /* undo effects of setting up yytext */
+ *yy_cp = (yy_hold_char);
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ { /* need to shift things up to make room */
+ /* +2 for EOB chars. */
+ register int number_to_move = (yy_n_chars) + 2;
+ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+ register char *source =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ *--dest = *--source;
+
+ yy_cp += (int) (dest - source);
+ yy_bp += (int) (dest - source);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+ YY_FATAL_ERROR( "flex scanner push-back overflow" );
+ }
+
+ *--yy_cp = (char) c;
+
+ (yytext_ptr) = yy_bp;
+ (yy_hold_char) = *yy_cp;
+ (yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ int offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ yyrestart(yyin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( yywrap( ) )
+ return EOF;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve yytext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void yyrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ yyensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer(yyin,YY_BUF_SIZE );
+ }
+
+ yy_init_buffer(YY_CURRENT_BUFFER,input_file );
+ yy_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * yypop_buffer_state();
+ * yypush_buffer_state(new_buffer);
+ */
+ yyensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ yy_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (yywrap()) processing, but the only time this flag
+ * is looked at is after yywrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void yy_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ yy_init_buffer(b,file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with yy_create_buffer()
+ *
+ */
+ void yy_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ yyfree((void *) b->yy_ch_buf );
+
+ yyfree((void *) b );
+}
+
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a yyrestart() or at EOF.
+ */
+ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ yy_flush_buffer(b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then yy_init_buffer was _probably_
+ * called from yyrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void yy_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ yy_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ yyensure_buffer_stack();
+
+ /* This block is copied from yy_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from yy_switch_to_buffer. */
+ yy_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void yypop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ yy_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ yy_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void yyensure_buffer_stack (void)
+{
+ int num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = 0;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ yy_switch_to_buffer(b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to yylex() will
+ * scan from a @e copy of @a str.
+ * @param str a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * yy_scan_bytes() instead.
+ */
+YY_BUFFER_STATE yy_scan_string (yyconst char * yy_str )
+{
+
+ return yy_scan_bytes(yy_str,strlen(yy_str) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_bytes (yyconst char * bytes, int len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = len + 2;
+ buf = (char *) yyalloc(n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+ for ( i = 0; i < len; ++i )
+ buf[i] = bytes[i];
+
+ buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = yy_scan_buffer(buf,n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ yytext[yyleng] = (yy_hold_char); \
+ (yy_c_buf_p) = yytext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ yyleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int yyget_lineno (void)
+{
+
+ return yylineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *yyget_in (void)
+{
+ return yyin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *yyget_out (void)
+{
+ return yyout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+int yyget_leng (void)
+{
+ return yyleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *yyget_text (void)
+{
+ return yytext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void yyset_lineno (int line_number )
+{
+
+ yylineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see yy_switch_to_buffer
+ */
+void yyset_in (FILE * in_str )
+{
+ yyin = in_str ;
+}
+
+void yyset_out (FILE * out_str )
+{
+ yyout = out_str ;
+}
+
+int yyget_debug (void)
+{
+ return yy_flex_debug;
+}
+
+void yyset_debug (int bdebug )
+{
+ yy_flex_debug = bdebug ;
+}
+
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ yy_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ yypop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ yyfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+ register int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+ register int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *yyalloc (yy_size_t size )
+{
+ return (void *) malloc( size );
+}
+
+void *yyrealloc (void * ptr, yy_size_t size )
+{
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return (void *) realloc( (char *) ptr, size );
+}
+
+void yyfree (void * ptr )
+{
+ free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#undef YY_NEW_FILE
+#undef YY_FLUSH_BUFFER
+#undef yy_set_bol
+#undef yy_new_buffer
+#undef yy_set_interactive
+#undef yytext_ptr
+#undef YY_DO_BEFORE_ACTION
+
+#ifdef YY_DECL_IS_OURS
+#undef YY_DECL_IS_OURS
+#undef YY_DECL
+#endif
+#line 116 "printrcl.l"
diff --git a/src/gutenprintui2/printrcl.l b/src/gutenprintui2/printrcl.l
new file mode 100644
index 0000000..018adf0
--- /dev/null
+++ b/src/gutenprintui2/printrcl.l
@@ -0,0 +1,115 @@
+/* -*-Mode: C-*-
+ * "$Id: printrcl.l,v 1.1 2004/09/17 18:38:14 rleigh Exp $"
+ *
+ * printrc parser
+ *
+ * Copyright 2003 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 <config.h>
+#endif
+
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <gutenprintui2/gutenprintui.h>
+#include "gutenprintui-internal.h"
+#include "printrc.h"
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define YY_NO_UNPUT
+
+int mylineno = 1;
+
+#define DBG(x) \
+do \
+ { \
+ if (getenv("STP_DEBUG_PRINTRC")) \
+ fprintf(stderr, "'%s' => %s\n", yytext, #x); \
+ } \
+ while (0)
+
+static char *
+q_strdup(const char *s)
+{
+ /* Strip the leading and trailing quote */
+ if (strlen(s) <= 2)
+ return NULL;
+ else
+ return g_strndup(s + 1, strlen(s) - 2);
+}
+
+%}
+
+%option noyywrap
+
+digit [0-9]
+boolean (True)|(False)
+integer [-+]?{digit}+
+float [-+]?{digit}+(\.{digit}+)?([eE][-+]?{digit}+)?
+string ([\"][^\"\n]*[\"])|([\'][^\']*[\'])
+ws [ \t]+
+printrc_hdr #PRINTRCv[234].*\n
+word [a-zA-Z][a-zA-Z0-9_]*
+
+%%
+
+Current-Printer: DBG(CURRENT_PRINTER); return CURRENT_PRINTER;
+Show-All-Paper-Sizes: DBG(SHOW_ALL_PAPER_SIZES); return SHOW_ALL_PAPER_SIZES;
+Printer: DBG(PRINTER); return PRINTER;
+Destination: DBG(DESTINATION); return DESTINATION;
+Scaling: DBG(SCALING); return SCALING;
+Orientation: DBG(ORIENTATION); return ORIENTATION;
+Autosize-Roll-Paper: DBG(AUTOSIZE_ROLL_PAPER); return AUTOSIZE_ROLL_PAPER;
+Unit: DBG(UNIT); return UNIT;
+Driver: DBG(DRIVER); return DRIVER;
+Left: DBG(LEFT); return LEFT;
+Top: DBG(TOP); return TOP;
+Custom_Page_Width: DBG(CUSTOM_PAGE_WIDTH); return CUSTOM_PAGE_WIDTH;
+Custom_Page_Height: DBG(CUSTOM_PAGE_HEIGHT); return CUSTOM_PAGE_HEIGHT;
+Output_Type: DBG(OUTPUT_TYPE); return OUTPUT_TYPE;
+Parameter DBG(PARAMETER); return PARAMETER;
+Queue-Name: DBG(QUEUE_NAME); return QUEUE_NAME;
+Output-Filename: DBG(OUTPUT_FILENAME); return OUTPUT_FILENAME;
+Extra-Printer-Options: DBG(EXTRA_PRINTER_OPTIONS); return EXTRA_PRINTER_OPTIONS;
+Custom-Command: DBG(CUSTOM_COMMAND); return CUSTOM_COMMAND;
+Command-Type: DBG(COMMAND_TYPE); return COMMAND_TYPE;
+Global-Settings: DBG(GLOBAL_SETTINGS); return GLOBAL_SETTINGS;
+End-Global-Settings: DBG(END_GLOBAL_SETTINGS); return END_GLOBAL_SETTINGS;
+Global: DBG(GLOBAL); return GLOBAL;
+
+Int DBG(pINT); return pINT;
+String DBG(pSTRING_LIST); return pSTRING_LIST;
+File DBG(pFILE); return pFILE;
+Double DBG(pDOUBLE); return pDOUBLE;
+Dimension DBG(pDIMENSION); return pDIMENSION;
+Boolean DBG(pBOOLEAN); return pBOOLEAN;
+Curve DBG(pCURVE); return pCURVE;
+
+{integer} yylval.ival = atoi(yytext); DBG(tINT); return tINT;
+{float} yylval.dval = strtod(yytext, NULL); DBG(tDOUBLE); return tDOUBLE;
+{string} yylval.sval = q_strdup(yytext); DBG(tSTRING); return tSTRING;
+{boolean} yylval.sval = g_strdup(yytext); DBG(tBOOLEAN); return tBOOLEAN;
+{word} yylval.sval = g_strdup(yytext); DBG(tWORD); return tWORD;
+{printrc_hdr} DBG(PRINTRC_HDR); return PRINTRC_HDR;
+{ws} DBG(whitespace1); /* Skip blanks/tabs */
+#[^\n]* DBG(comment1); /* Skip comments */
+\n DBG(newline); mylineno++;
diff --git a/src/gutenprintui2/printrcy.c b/src/gutenprintui2/printrcy.c
new file mode 100644
index 0000000..4495ae6
--- /dev/null
+++ b/src/gutenprintui2/printrcy.c
@@ -0,0 +1,1694 @@
+/* A Bison parser, made by GNU Bison 1.875d. */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+ 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. */
+
+/* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+/* Written by Richard Stallman by simplifying the original so called
+ ``semantic'' parser. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output. */
+#define YYBISON 1
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 0
+
+/* Using locations. */
+#define YYLSP_NEEDED 0
+
+
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ tINT = 258,
+ tDOUBLE = 259,
+ tDIMENSION = 260,
+ tBOOLEAN = 261,
+ tSTRING = 262,
+ tWORD = 263,
+ tGSWORD = 264,
+ CURRENT_PRINTER = 265,
+ SHOW_ALL_PAPER_SIZES = 266,
+ PRINTER = 267,
+ DESTINATION = 268,
+ SCALING = 269,
+ ORIENTATION = 270,
+ AUTOSIZE_ROLL_PAPER = 271,
+ UNIT = 272,
+ DRIVER = 273,
+ LEFT = 274,
+ TOP = 275,
+ CUSTOM_PAGE_WIDTH = 276,
+ CUSTOM_PAGE_HEIGHT = 277,
+ OUTPUT_TYPE = 278,
+ PRINTRC_HDR = 279,
+ PARAMETER = 280,
+ QUEUE_NAME = 281,
+ OUTPUT_FILENAME = 282,
+ EXTRA_PRINTER_OPTIONS = 283,
+ CUSTOM_COMMAND = 284,
+ COMMAND_TYPE = 285,
+ GLOBAL_SETTINGS = 286,
+ GLOBAL = 287,
+ END_GLOBAL_SETTINGS = 288,
+ pINT = 289,
+ pSTRING_LIST = 290,
+ pFILE = 291,
+ pDOUBLE = 292,
+ pDIMENSION = 293,
+ pBOOLEAN = 294,
+ pCURVE = 295
+ };
+#endif
+#define tINT 258
+#define tDOUBLE 259
+#define tDIMENSION 260
+#define tBOOLEAN 261
+#define tSTRING 262
+#define tWORD 263
+#define tGSWORD 264
+#define CURRENT_PRINTER 265
+#define SHOW_ALL_PAPER_SIZES 266
+#define PRINTER 267
+#define DESTINATION 268
+#define SCALING 269
+#define ORIENTATION 270
+#define AUTOSIZE_ROLL_PAPER 271
+#define UNIT 272
+#define DRIVER 273
+#define LEFT 274
+#define TOP 275
+#define CUSTOM_PAGE_WIDTH 276
+#define CUSTOM_PAGE_HEIGHT 277
+#define OUTPUT_TYPE 278
+#define PRINTRC_HDR 279
+#define PARAMETER 280
+#define QUEUE_NAME 281
+#define OUTPUT_FILENAME 282
+#define EXTRA_PRINTER_OPTIONS 283
+#define CUSTOM_COMMAND 284
+#define COMMAND_TYPE 285
+#define GLOBAL_SETTINGS 286
+#define GLOBAL 287
+#define END_GLOBAL_SETTINGS 288
+#define pINT 289
+#define pSTRING_LIST 290
+#define pFILE 291
+#define pDOUBLE 292
+#define pDIMENSION 293
+#define pBOOLEAN 294
+#define pCURVE 295
+
+
+
+
+/* Copy the first part of user declarations. */
+#line 23 "printrcy.y"
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <gutenprintui2/gutenprintui.h>
+#include "gutenprintui-internal.h"
+#include "printrc.h"
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+extern int mylineno;
+
+extern int yylex(void);
+char *quotestrip(const char *i);
+char *endstrip(const char *i);
+
+extern char* yytext;
+
+static int yyerror( const char *s )
+{
+ fprintf(stderr,"stdin:%d: %s before '%s'\n", mylineno, s, yytext);
+ return 0;
+}
+
+static stpui_plist_t *current_printer = NULL;
+
+
+
+/* Enabling traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages. */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+typedef int YYSTYPE;
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+
+
+/* Copy the second part of user declarations. */
+
+
+/* Line 214 of yacc.c. */
+#line 200 "printrcy.c"
+
+#if ! defined (yyoverflow) || YYERROR_VERBOSE
+
+# ifndef YYFREE
+# define YYFREE free
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# endif
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# define YYSTACK_ALLOC alloca
+# endif
+# else
+# if defined (alloca) || defined (_ALLOCA_H)
+# define YYSTACK_ALLOC alloca
+# else
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's `empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+# if defined (__STDC__) || defined (__cplusplus)
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# endif
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# endif
+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+
+
+#if (! defined (yyoverflow) \
+ && (! defined (__cplusplus) \
+ || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ short int yyss;
+ YYSTYPE yyvs;
+ };
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined (__GNUC__) && 1 < __GNUC__
+# define YYCOPY(To, From, Count) \
+ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+# else
+# define YYCOPY(To, From, Count) \
+ do \
+ { \
+ register YYSIZE_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (To)[yyi] = (From)[yyi]; \
+ } \
+ while (0)
+# endif
+# endif
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack) \
+ do \
+ { \
+ YYSIZE_T yynewbytes; \
+ YYCOPY (&yyptr->Stack, Stack, yysize); \
+ Stack = &yyptr->Stack; \
+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / sizeof (*yyptr); \
+ } \
+ while (0)
+
+#endif
+
+#if defined (__STDC__) || defined (__cplusplus)
+ typedef signed char yysigned_char;
+#else
+ typedef short int yysigned_char;
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 10
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 75
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 41
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 42
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 70
+/* YYNRULES -- Number of states. */
+#define YYNSTATES 114
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
+#define YYUNDEFTOK 2
+#define YYMAXUTOK 295
+
+#define YYTRANSLATE(YYX) \
+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
+static const unsigned char yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+ 35, 36, 37, 38, 39, 40
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+ YYRHS. */
+static const unsigned char yyprhs[] =
+{
+ 0, 0, 3, 7, 10, 13, 16, 19, 22, 25,
+ 28, 31, 34, 37, 40, 43, 46, 49, 52, 53,
+ 58, 63, 68, 73, 78, 83, 88, 90, 92, 94,
+ 96, 98, 100, 102, 105, 108, 110, 112, 114, 116,
+ 118, 120, 122, 124, 126, 128, 130, 132, 134, 136,
+ 138, 140, 143, 145, 149, 152, 154, 157, 160, 162,
+ 164, 167, 170, 172, 174, 177, 179, 183, 185, 187,
+ 189
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yysigned_char yyrhs[] =
+{
+ 82, 0, -1, 12, 7, 7, -1, 13, 7, -1,
+ 26, 7, -1, 27, 7, -1, 28, 7, -1, 29,
+ 7, -1, 30, 3, -1, 14, 4, -1, 15, 3,
+ -1, 16, 3, -1, 17, 3, -1, 19, 3, -1,
+ 20, 3, -1, 23, 3, -1, 21, 3, -1, 22,
+ 3, -1, -1, 8, 34, 6, 3, -1, 8, 35,
+ 6, 7, -1, 8, 36, 6, 7, -1, 8, 37,
+ 6, 4, -1, 8, 38, 6, 3, -1, 8, 39,
+ 6, 6, -1, 8, 40, 6, 7, -1, 59, -1,
+ 60, -1, 61, -1, 62, -1, 64, -1, 65, -1,
+ 63, -1, 25, 66, -1, 68, 67, -1, 58, -1,
+ 43, -1, 49, -1, 50, -1, 51, -1, 52, -1,
+ 53, -1, 54, -1, 56, -1, 57, -1, 55, -1,
+ 44, -1, 45, -1, 46, -1, 47, -1, 48, -1,
+ 70, 69, -1, 58, -1, 42, 70, 68, -1, 72,
+ 71, -1, 58, -1, 10, 7, -1, 11, 6, -1,
+ 73, -1, 74, -1, 73, 74, -1, 8, 7, -1,
+ 75, -1, 77, -1, 79, 78, -1, 58, -1, 31,
+ 79, 33, -1, 80, -1, 76, -1, 58, -1, 24,
+ 81, 72, -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const unsigned short int yyrline[] =
+{
+ 0, 100, 100, 111, 118, 128, 138, 148, 158, 164,
+ 168, 172, 176, 180, 184, 188, 206, 210, 214, 217,
+ 231, 246, 261, 275, 289, 307, 327, 327, 327, 327,
+ 328, 328, 328, 331, 334, 334, 337, 337, 337, 337,
+ 338, 338, 338, 338, 338, 339, 339, 339, 339, 340,
+ 340, 343, 343, 346, 349, 349, 352, 356, 366, 366,
+ 369, 372, 383, 383, 386, 386, 389, 392, 392, 392,
+ 395
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE
+/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "$end", "error", "$undefined", "tINT", "tDOUBLE", "tDIMENSION",
+ "tBOOLEAN", "tSTRING", "tWORD", "tGSWORD", "CURRENT_PRINTER",
+ "SHOW_ALL_PAPER_SIZES", "PRINTER", "DESTINATION", "SCALING",
+ "ORIENTATION", "AUTOSIZE_ROLL_PAPER", "UNIT", "DRIVER", "LEFT", "TOP",
+ "CUSTOM_PAGE_WIDTH", "CUSTOM_PAGE_HEIGHT", "OUTPUT_TYPE", "PRINTRC_HDR",
+ "PARAMETER", "QUEUE_NAME", "OUTPUT_FILENAME", "EXTRA_PRINTER_OPTIONS",
+ "CUSTOM_COMMAND", "COMMAND_TYPE", "GLOBAL_SETTINGS", "GLOBAL",
+ "END_GLOBAL_SETTINGS", "pINT", "pSTRING_LIST", "pFILE", "pDOUBLE",
+ "pDIMENSION", "pBOOLEAN", "pCURVE", "$accept", "Printer", "Destination",
+ "Queue_Name", "Output_Filename", "Extra_Printer_Options",
+ "Custom_Command", "Command_Type", "Scaling", "Orientation",
+ "Autosize_Roll_Paper", "Unit", "Left", "Top", "Output_Type",
+ "Custom_Page_Width", "Custom_Page_Height", "Empty", "Int_Param",
+ "String_List_Param", "File_Param", "Double_Param", "Dimension_Param",
+ "Boolean_Param", "Curve_Param", "Typed_Param", "Parameter", "Parameters",
+ "Standard_Value", "Standard_Values", "A_Printer", "Printers",
+ "Current_Printer", "Show_All_Paper_Sizes", "Global", "Old_Globals",
+ "New_Global_Setting", "Global_Setting", "Global_Settings",
+ "Global_Subblock", "Global_Block", "Thing", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+ token YYLEX-NUM. */
+static const unsigned short int yytoknum[] =
+{
+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
+ 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
+ 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
+ 295
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const unsigned char yyr1[] =
+{
+ 0, 41, 42, 43, 44, 45, 46, 47, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 66, 66, 66,
+ 66, 66, 66, 67, 68, 68, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 70, 70, 71, 72, 72, 73, 74, 75, 75,
+ 76, 77, 78, 78, 79, 79, 80, 81, 81, 81,
+ 82
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const unsigned char yyr2[] =
+{
+ 0, 2, 3, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 0, 4,
+ 4, 4, 4, 4, 4, 4, 1, 1, 1, 1,
+ 1, 1, 1, 2, 2, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 1, 3, 2, 1, 2, 2, 1, 1,
+ 2, 2, 1, 1, 2, 1, 3, 1, 1, 1,
+ 3
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+ STATE-NUM when YYTABLE doesn't specify something else to do. Zero
+ means the default is an error. */
+static const unsigned char yydefact[] =
+{
+ 0, 18, 0, 0, 18, 69, 0, 68, 67, 18,
+ 1, 56, 65, 0, 0, 60, 55, 70, 0, 66,
+ 58, 59, 62, 63, 64, 57, 0, 18, 54, 61,
+ 0, 52, 18, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 36,
+ 46, 47, 48, 49, 50, 37, 38, 39, 40, 41,
+ 42, 45, 43, 44, 35, 53, 51, 3, 9, 10,
+ 11, 12, 13, 14, 16, 17, 15, 4, 5, 6,
+ 7, 8, 0, 34, 0, 26, 27, 28, 29, 32,
+ 30, 31, 33, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 19, 20, 21,
+ 22, 23, 24, 25
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yysigned_char yydefgoto[] =
+{
+ -1, 27, 49, 50, 51, 52, 53, 54, 55, 56,
+ 57, 58, 59, 60, 61, 62, 63, 5, 85, 86,
+ 87, 88, 89, 90, 91, 92, 83, 65, 66, 32,
+ 28, 17, 6, 15, 22, 7, 23, 24, 13, 8,
+ 9, 2
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+#define YYPACT_NINF -26
+static const yysigned_char yypact[] =
+{
+ -22, -2, 6, 0, -26, -26, 5, -26, -26, -26,
+ -26, -26, -26, -7, 11, -26, -26, 7, 13, -26,
+ -26, -26, -26, -26, -26, -26, 14, -26, -26, -26,
+ 15, -26, 17, -26, 18, 20, 24, 32, 38, 39,
+ 45, 46, 47, 48, 49, 50, 51, 52, 57, -26,
+ -26, -26, -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, -26, -26, -26, 27, -26, -26, -26, -26,
+ -26, -26, -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, 10, -26, -25, -26, -26, -26, -26, -26,
+ -26, -26, -26, 55, 56, 58, 59, 60, 61, 62,
+ 66, 63, 64, 68, 70, 69, 67, -26, -26, -26,
+ -26, -26, -26, -26
+};
+
+/* YYPGOTO[NTERM-NUM]. */
+static const yysigned_char yypgoto[] =
+{
+ -26, -26, -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, -26, -26, -26, -26, -26, -4, -26, -26,
+ -26, -26, -26, -26, -26, -26, -26, -26, -26, -26,
+ -26, -26, 40, 41, -26, -26, -26, -26, -26, -26,
+ -26, -26
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule which
+ number is the opposite. If zero, do what YYDEFACT says.
+ If YYTABLE_NINF, syntax error. */
+#define YYTABLE_NINF -1
+static const unsigned char yytable[] =
+{
+ 12, 18, 1, 3, 14, 16, 10, 11, 3, 93,
+ 94, 95, 96, 97, 98, 99, 14, 25, 84, 26,
+ 29, 30, 33, 31, 68, 67, 19, 69, 64, 4,
+ 34, 35, 36, 37, 38, 70, 39, 40, 41, 42,
+ 43, 71, 72, 44, 45, 46, 47, 48, 73, 74,
+ 75, 76, 82, 20, 21, 0, 77, 78, 79, 80,
+ 81, 100, 101, 0, 102, 103, 104, 105, 106, 107,
+ 108, 109, 110, 111, 113, 112
+};
+
+static const yysigned_char yycheck[] =
+{
+ 4, 8, 24, 10, 11, 9, 0, 7, 10, 34,
+ 35, 36, 37, 38, 39, 40, 11, 6, 8, 12,
+ 7, 7, 7, 27, 4, 7, 33, 3, 32, 31,
+ 13, 14, 15, 16, 17, 3, 19, 20, 21, 22,
+ 23, 3, 3, 26, 27, 28, 29, 30, 3, 3,
+ 3, 3, 25, 13, 13, -1, 7, 7, 7, 7,
+ 3, 6, 6, -1, 6, 6, 6, 6, 6, 3,
+ 7, 7, 4, 3, 7, 6
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
+static const unsigned char yystos[] =
+{
+ 0, 24, 82, 10, 31, 58, 73, 76, 80, 81,
+ 0, 7, 58, 79, 11, 74, 58, 72, 8, 33,
+ 73, 74, 75, 77, 78, 6, 12, 42, 71, 7,
+ 7, 58, 70, 7, 13, 14, 15, 16, 17, 19,
+ 20, 21, 22, 23, 26, 27, 28, 29, 30, 43,
+ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, 57, 58, 68, 69, 7, 4, 3,
+ 3, 3, 3, 3, 3, 3, 3, 7, 7, 7,
+ 7, 3, 25, 67, 8, 59, 60, 61, 62, 63,
+ 64, 65, 66, 34, 35, 36, 37, 38, 39, 40,
+ 6, 6, 6, 6, 6, 6, 6, 3, 7, 7,
+ 4, 3, 6, 7
+};
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# if defined (__STDC__) || defined (__cplusplus)
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY (-2)
+#define YYEOF 0
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror. This remains here temporarily
+ to ease the transition to the new meaning of YYERROR, for GCC.
+ Once GCC version 2 has supplanted version 1, this can go. */
+
+#define YYFAIL goto yyerrlab
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+do \
+ if (yychar == YYEMPTY && yylen == 1) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ yytoken = YYTRANSLATE (yychar); \
+ YYPOPSTACK; \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror ("syntax error: cannot back up");\
+ YYERROR; \
+ } \
+while (0)
+
+#define YYTERROR 1
+#define YYERRCODE 256
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+ are run). */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N) \
+ ((Current).first_line = (Rhs)[1].first_line, \
+ (Current).first_column = (Rhs)[1].first_column, \
+ (Current).last_line = (Rhs)[N].last_line, \
+ (Current).last_column = (Rhs)[N].last_column)
+#endif
+
+/* YYLEX -- calling `yylex' with the right arguments. */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+
+# define YYDSYMPRINT(Args) \
+do { \
+ if (yydebug) \
+ yysymprint Args; \
+} while (0)
+
+# define YYDSYMPRINTF(Title, Token, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yysymprint (stderr, \
+ Token, Value); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (0)
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_stack_print (short int *bottom, short int *top)
+#else
+static void
+yy_stack_print (bottom, top)
+ short int *bottom;
+ short int *top;
+#endif
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (/* Nothing. */; bottom <= top; ++bottom)
+ YYFPRINTF (stderr, " %d", *bottom);
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_reduce_print (int yyrule)
+#else
+static void
+yy_reduce_print (yyrule)
+ int yyrule;
+#endif
+{
+ int yyi;
+ unsigned int yylno = yyrline[yyrule];
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
+ yyrule - 1, yylno);
+ /* Print the symbols being reduced, and their result. */
+ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+ YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
+ YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (Rule); \
+} while (0)
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YYDSYMPRINT(Args)
+# define YYDSYMPRINTF(Title, Token, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#if defined (YYMAXDEPTH) && YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+# if defined (__GLIBC__) && defined (_STRING_H)
+# define yystrlen strlen
+# else
+/* Return the length of YYSTR. */
+static YYSIZE_T
+# if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+# else
+yystrlen (yystr)
+ const char *yystr;
+# endif
+{
+ register const char *yys = yystr;
+
+ while (*yys++ != '\0')
+ continue;
+
+ return yys - yystr - 1;
+}
+# endif
+# endif
+
+# ifndef yystpcpy
+# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+# define yystpcpy stpcpy
+# else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+ YYDEST. */
+static char *
+# if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+# else
+yystpcpy (yydest, yysrc)
+ char *yydest;
+ const char *yysrc;
+# endif
+{
+ register char *yyd = yydest;
+ register const char *yys = yysrc;
+
+ while ((*yyd++ = *yys++) != '\0')
+ continue;
+
+ return yyd - 1;
+}
+# endif
+# endif
+
+#endif /* !YYERROR_VERBOSE */
+
+
+
+#if YYDEBUG
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yysymprint (yyoutput, yytype, yyvaluep)
+ FILE *yyoutput;
+ int yytype;
+ YYSTYPE *yyvaluep;
+#endif
+{
+ /* Pacify ``unused variable'' warnings. */
+ (void) yyvaluep;
+
+ if (yytype < YYNTOKENS)
+ {
+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+# ifdef YYPRINT
+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# endif
+ }
+ else
+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+ switch (yytype)
+ {
+ default:
+ break;
+ }
+ YYFPRINTF (yyoutput, ")");
+}
+
+#endif /* ! YYDEBUG */
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yydestruct (int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yytype, yyvaluep)
+ int yytype;
+ YYSTYPE *yyvaluep;
+#endif
+{
+ /* Pacify ``unused variable'' warnings. */
+ (void) yyvaluep;
+
+ switch (yytype)
+ {
+
+ default:
+ break;
+ }
+}
+
+
+/* Prevent warnings from -Wmissing-prototypes. */
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM);
+# else
+int yyparse ();
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+
+/* The lookahead symbol. */
+int yychar;
+
+/* The semantic value of the lookahead symbol. */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far. */
+int yynerrs;
+
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM)
+# else
+int yyparse (YYPARSE_PARAM)
+ void *YYPARSE_PARAM;
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
+{
+
+ register int yystate;
+ register int yyn;
+ int yyresult;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
+ /* Lookahead token as an internal (translated) token number. */
+ int yytoken = 0;
+
+ /* Three stacks and their tools:
+ `yyss': related to states,
+ `yyvs': related to semantic values,
+ `yyls': related to locations.
+
+ Refer to the stacks thru separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* The state stack. */
+ short int yyssa[YYINITDEPTH];
+ short int *yyss = yyssa;
+ register short int *yyssp;
+
+ /* The semantic value stack. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ register YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK (yyvsp--, yyssp--)
+
+ YYSIZE_T yystacksize = YYINITDEPTH;
+
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+
+ /* When reducing, the number of symbols on the RHS of the reduced
+ rule. */
+ int yylen;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+
+ yyssp = yyss;
+ yyvsp = yyvs;
+
+
+ goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+ yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. so pushing a state here evens the stacks.
+ */
+ yyssp++;
+
+ yysetstate:
+ *yyssp = yystate;
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ short int *yyss1 = yyss;
+
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow ("parser stack overflow",
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+
+ &yystacksize);
+
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+ goto yyoverflowlab;
+# else
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ goto yyoverflowlab;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ short int *yyss1 = yyss;
+ union yyalloc *yyptr =
+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+ if (! yyptr)
+ goto yyoverflowlab;
+ YYSTACK_RELOCATE (yyss);
+ YYSTACK_RELOCATE (yyvs);
+
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+#endif /* no yyoverflow */
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+
+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+ (unsigned long int) yystacksize));
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+ goto yybackup;
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state. */
+/* Read a lookahead token if we need one and don't already have one. */
+/* yyresume: */
+
+ /* First try to decide what to do without reference to lookahead token. */
+
+ yyn = yypact[yystate];
+ if (yyn == YYPACT_NINF)
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+ yychar = YYLEX;
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = yytoken = YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yyn == 0 || yyn == YYTABLE_NINF)
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ /* Shift the lookahead token. */
+ YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
+
+ /* Discard the token being shifted unless it is eof. */
+ if (yychar != YYEOF)
+ yychar = YYEMPTY;
+
+ *++yyvsp = yylval;
+
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ `$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 2:
+#line 101 "printrcy.y"
+ {
+ current_printer = stpui_plist_create(yyvsp[-1].sval, yyvsp[0].sval);
+ g_free(yyvsp[-1].sval);
+ g_free(yyvsp[0].sval);
+ }
+ break;
+
+ case 3:
+#line 112 "printrcy.y"
+ {
+ if (yyvsp[0].sval)
+ g_free(yyvsp[0].sval);
+ }
+ break;
+
+ case 4:
+#line 119 "printrcy.y"
+ {
+ if (yyvsp[0].sval)
+ {
+ stpui_plist_set_queue_name(current_printer, yyvsp[0].sval);
+ g_free(yyvsp[0].sval);
+ }
+ }
+ break;
+
+ case 5:
+#line 129 "printrcy.y"
+ {
+ if (yyvsp[0].sval)
+ {
+ stpui_plist_set_output_filename(current_printer, yyvsp[0].sval);
+ g_free(yyvsp[0].sval);
+ }
+ }
+ break;
+
+ case 6:
+#line 139 "printrcy.y"
+ {
+ if (yyvsp[0].sval)
+ {
+ stpui_plist_set_extra_printer_options(current_printer, yyvsp[0].sval);
+ g_free(yyvsp[0].sval);
+ }
+ }
+ break;
+
+ case 7:
+#line 149 "printrcy.y"
+ {
+ if (yyvsp[0].sval)
+ {
+ stpui_plist_set_custom_command(current_printer, yyvsp[0].sval);
+ g_free(yyvsp[0].sval);
+ }
+ }
+ break;
+
+ case 8:
+#line 159 "printrcy.y"
+ {
+ stpui_plist_set_command_type(current_printer, yyvsp[0].ival);
+ }
+ break;
+
+ case 9:
+#line 165 "printrcy.y"
+ { current_printer->scaling = yyvsp[0].dval; }
+ break;
+
+ case 10:
+#line 169 "printrcy.y"
+ { current_printer->orientation = yyvsp[0].ival; }
+ break;
+
+ case 11:
+#line 173 "printrcy.y"
+ { current_printer->auto_size_roll_feed_paper = yyvsp[0].ival; }
+ break;
+
+ case 12:
+#line 177 "printrcy.y"
+ { current_printer->unit = yyvsp[0].ival; }
+ break;
+
+ case 13:
+#line 181 "printrcy.y"
+ { stp_set_left(current_printer->v, yyvsp[0].ival); }
+ break;
+
+ case 14:
+#line 185 "printrcy.y"
+ { stp_set_top(current_printer->v, yyvsp[0].ival); }
+ break;
+
+ case 15:
+#line 189 "printrcy.y"
+ {
+ switch (yyvsp[0].ival)
+ {
+ case 0:
+ stp_set_string_parameter
+ (current_printer->v, "PrintingMode", "BW");
+ break;
+ case 1:
+ case 2:
+ default:
+ stp_set_string_parameter
+ (current_printer->v, "PrintingMode", "Color");
+ break;
+ }
+ }
+ break;
+
+ case 16:
+#line 207 "printrcy.y"
+ { stp_set_page_width(current_printer->v, yyvsp[0].ival); }
+ break;
+
+ case 17:
+#line 211 "printrcy.y"
+ { stp_set_page_height(current_printer->v, yyvsp[0].ival); }
+ break;
+
+ case 19:
+#line 218 "printrcy.y"
+ {
+ stp_set_int_parameter(current_printer->v, yyvsp[-3].sval, yyvsp[0].ival);
+ if (strcmp(yyvsp[-1].sval, "False") == 0)
+ stp_set_int_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_int_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_ACTIVE);
+ g_free(yyvsp[-3].sval);
+ g_free(yyvsp[-1].sval);
+ }
+ break;
+
+ case 20:
+#line 232 "printrcy.y"
+ {
+ stp_set_string_parameter(current_printer->v, yyvsp[-3].sval, yyvsp[0].sval);
+ if (strcmp(yyvsp[-1].sval, "False") == 0)
+ stp_set_string_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_string_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_ACTIVE);
+ g_free(yyvsp[-3].sval);
+ g_free(yyvsp[-1].sval);
+ g_free(yyvsp[0].sval);
+ }
+ break;
+
+ case 21:
+#line 247 "printrcy.y"
+ {
+ stp_set_file_parameter(current_printer->v, yyvsp[-3].sval, yyvsp[0].sval);
+ if (strcmp(yyvsp[-1].sval, "False") == 0)
+ stp_set_file_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_file_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_ACTIVE);
+ g_free(yyvsp[-3].sval);
+ g_free(yyvsp[-1].sval);
+ g_free(yyvsp[0].sval);
+ }
+ break;
+
+ case 22:
+#line 262 "printrcy.y"
+ {
+ stp_set_float_parameter(current_printer->v, yyvsp[-3].sval, yyvsp[0].dval);
+ if (strcmp(yyvsp[-1].sval, "False") == 0)
+ stp_set_float_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_float_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_ACTIVE);
+ g_free(yyvsp[-3].sval);
+ g_free(yyvsp[-1].sval);
+ }
+ break;
+
+ case 23:
+#line 276 "printrcy.y"
+ {
+ stp_set_dimension_parameter(current_printer->v, yyvsp[-3].sval, yyvsp[0].ival);
+ if (strcmp(yyvsp[-1].sval, "False") == 0)
+ stp_set_dimension_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_dimension_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_ACTIVE);
+ g_free(yyvsp[-3].sval);
+ g_free(yyvsp[-1].sval);
+ }
+ break;
+
+ case 24:
+#line 290 "printrcy.y"
+ {
+ if (strcmp(yyvsp[0].sval, "False") == 0)
+ stp_set_boolean_parameter(current_printer->v, yyvsp[-3].sval, 0);
+ else
+ stp_set_boolean_parameter(current_printer->v, yyvsp[-3].sval, 1);
+ if (strcmp(yyvsp[-1].sval, "False") == 0)
+ stp_set_boolean_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_boolean_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_ACTIVE);
+ g_free(yyvsp[-3].sval);
+ g_free(yyvsp[-1].sval);
+ g_free(yyvsp[0].sval);
+ }
+ break;
+
+ case 25:
+#line 308 "printrcy.y"
+ {
+ stp_curve_t *curve = stp_curve_create_from_string(yyvsp[0].sval);
+ if (curve)
+ {
+ stp_set_curve_parameter(current_printer->v, yyvsp[-3].sval, curve);
+ if (strcmp(yyvsp[-1].sval, "False") == 0)
+ stp_set_curve_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_curve_parameter_active(current_printer->v, yyvsp[-3].sval,
+ STP_PARAMETER_ACTIVE);
+ stp_curve_destroy(curve);
+ }
+ g_free(yyvsp[-3].sval);
+ g_free(yyvsp[-1].sval);
+ g_free(yyvsp[0].sval);
+ }
+ break;
+
+ case 56:
+#line 353 "printrcy.y"
+ { stpui_printrc_current_printer = yyvsp[0].sval; }
+ break;
+
+ case 57:
+#line 357 "printrcy.y"
+ {
+ if (strcmp(yyvsp[0].sval, "True") == 0)
+ stpui_show_all_paper_sizes = 1;
+ else
+ stpui_show_all_paper_sizes = 0;
+ g_free(yyvsp[0].sval);
+ }
+ break;
+
+ case 61:
+#line 373 "printrcy.y"
+ {
+ if (yyvsp[0].sval)
+ {
+ stpui_set_global_parameter(yyvsp[-1].sval, yyvsp[0].sval);
+ g_free(yyvsp[0].sval);
+ }
+ g_free(yyvsp[-1].sval);
+ }
+ break;
+
+
+ }
+
+/* Line 1010 of yacc.c. */
+#line 1468 "printrcy.c"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+
+
+ YY_STACK_PRINT (yyss, yyssp);
+
+ *++yyvsp = yyval;
+
+
+ /* Now `shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTOKENS];
+
+ goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+#if YYERROR_VERBOSE
+ yyn = yypact[yystate];
+
+ if (YYPACT_NINF < yyn && yyn < YYLAST)
+ {
+ YYSIZE_T yysize = 0;
+ int yytype = YYTRANSLATE (yychar);
+ const char* yyprefix;
+ char *yymsg;
+ int yyx;
+
+ /* Start YYX at -YYN if negative to avoid negative indexes in
+ YYCHECK. */
+ int yyxbegin = yyn < 0 ? -yyn : 0;
+
+ /* Stay within bounds of both yycheck and yytname. */
+ int yychecklim = YYLAST - yyn;
+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+ int yycount = 0;
+
+ yyprefix = ", expecting ";
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+ {
+ yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]);
+ yycount += 1;
+ if (yycount == 5)
+ {
+ yysize = 0;
+ break;
+ }
+ }
+ yysize += (sizeof ("syntax error, unexpected ")
+ + yystrlen (yytname[yytype]));
+ yymsg = (char *) YYSTACK_ALLOC (yysize);
+ if (yymsg != 0)
+ {
+ char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
+ yyp = yystpcpy (yyp, yytname[yytype]);
+
+ if (yycount < 5)
+ {
+ yyprefix = ", expecting ";
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+ {
+ yyp = yystpcpy (yyp, yyprefix);
+ yyp = yystpcpy (yyp, yytname[yyx]);
+ yyprefix = " or ";
+ }
+ }
+ yyerror (yymsg);
+ YYSTACK_FREE (yymsg);
+ }
+ else
+ yyerror ("syntax error; also virtual memory exhausted");
+ }
+ else
+#endif /* YYERROR_VERBOSE */
+ yyerror ("syntax error");
+ }
+
+
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* If at end of input, pop the error token,
+ then the rest of the stack, then return failure. */
+ if (yychar == YYEOF)
+ for (;;)
+ {
+ YYPOPSTACK;
+ if (yyssp == yyss)
+ YYABORT;
+ YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+ yydestruct (yystos[*yyssp], yyvsp);
+ }
+ }
+ else
+ {
+ YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
+ yydestruct (yytoken, &yylval);
+ yychar = YYEMPTY;
+
+ }
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+
+#ifdef __GNUC__
+ /* Pacify GCC when the user code never invokes YYERROR and the label
+ yyerrorlab therefore never appears in user code. */
+ if (0)
+ goto yyerrorlab;
+#endif
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (yyn != YYPACT_NINF)
+ {
+ yyn += YYTERROR;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+ YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+ yydestruct (yystos[yystate], yyvsp);
+ YYPOPSTACK;
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ YYDPRINTF ((stderr, "Shifting error token, "));
+
+ *++yyvsp = yylval;
+
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+#ifndef yyoverflow
+/*----------------------------------------------.
+| yyoverflowlab -- parser overflow comes here. |
+`----------------------------------------------*/
+yyoverflowlab:
+ yyerror ("parser stack overflow");
+ yyresult = 2;
+ /* Fall through. */
+#endif
+
+yyreturn:
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+ return yyresult;
+}
+
+
+#line 398 "printrcy.y"
+
+
diff --git a/src/gutenprintui2/printrcy.h b/src/gutenprintui2/printrcy.h
new file mode 100644
index 0000000..2273fb7
--- /dev/null
+++ b/src/gutenprintui2/printrcy.h
@@ -0,0 +1,124 @@
+/* A Bison parser, made by GNU Bison 1.875d. */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+ 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. */
+
+/* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ tINT = 258,
+ tDOUBLE = 259,
+ tDIMENSION = 260,
+ tBOOLEAN = 261,
+ tSTRING = 262,
+ tWORD = 263,
+ tGSWORD = 264,
+ CURRENT_PRINTER = 265,
+ SHOW_ALL_PAPER_SIZES = 266,
+ PRINTER = 267,
+ DESTINATION = 268,
+ SCALING = 269,
+ ORIENTATION = 270,
+ AUTOSIZE_ROLL_PAPER = 271,
+ UNIT = 272,
+ DRIVER = 273,
+ LEFT = 274,
+ TOP = 275,
+ CUSTOM_PAGE_WIDTH = 276,
+ CUSTOM_PAGE_HEIGHT = 277,
+ OUTPUT_TYPE = 278,
+ PRINTRC_HDR = 279,
+ PARAMETER = 280,
+ QUEUE_NAME = 281,
+ OUTPUT_FILENAME = 282,
+ EXTRA_PRINTER_OPTIONS = 283,
+ CUSTOM_COMMAND = 284,
+ COMMAND_TYPE = 285,
+ GLOBAL_SETTINGS = 286,
+ GLOBAL = 287,
+ END_GLOBAL_SETTINGS = 288,
+ pINT = 289,
+ pSTRING_LIST = 290,
+ pFILE = 291,
+ pDOUBLE = 292,
+ pDIMENSION = 293,
+ pBOOLEAN = 294,
+ pCURVE = 295
+ };
+#endif
+#define tINT 258
+#define tDOUBLE 259
+#define tDIMENSION 260
+#define tBOOLEAN 261
+#define tSTRING 262
+#define tWORD 263
+#define tGSWORD 264
+#define CURRENT_PRINTER 265
+#define SHOW_ALL_PAPER_SIZES 266
+#define PRINTER 267
+#define DESTINATION 268
+#define SCALING 269
+#define ORIENTATION 270
+#define AUTOSIZE_ROLL_PAPER 271
+#define UNIT 272
+#define DRIVER 273
+#define LEFT 274
+#define TOP 275
+#define CUSTOM_PAGE_WIDTH 276
+#define CUSTOM_PAGE_HEIGHT 277
+#define OUTPUT_TYPE 278
+#define PRINTRC_HDR 279
+#define PARAMETER 280
+#define QUEUE_NAME 281
+#define OUTPUT_FILENAME 282
+#define EXTRA_PRINTER_OPTIONS 283
+#define CUSTOM_COMMAND 284
+#define COMMAND_TYPE 285
+#define GLOBAL_SETTINGS 286
+#define GLOBAL 287
+#define END_GLOBAL_SETTINGS 288
+#define pINT 289
+#define pSTRING_LIST 290
+#define pFILE 291
+#define pDOUBLE 292
+#define pDIMENSION 293
+#define pBOOLEAN 294
+#define pCURVE 295
+
+
+
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+typedef int YYSTYPE;
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+extern YYSTYPE yylval;
+
+
+
diff --git a/src/gutenprintui2/printrcy.y b/src/gutenprintui2/printrcy.y
new file mode 100644
index 0000000..58bd36e
--- /dev/null
+++ b/src/gutenprintui2/printrcy.y
@@ -0,0 +1,398 @@
+/*
+ * "$Id: printrcy.y,v 1.1 2004/09/17 18:38:14 rleigh Exp $"
+ *
+ * Test pattern generator for Gutenprint
+ *
+ * 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.
+ */
+
+%{
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <gutenprintui2/gutenprintui.h>
+#include "gutenprintui-internal.h"
+#include "printrc.h"
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+extern int mylineno;
+
+extern int yylex(void);
+char *quotestrip(const char *i);
+char *endstrip(const char *i);
+
+extern char* yytext;
+
+static int yyerror( const char *s )
+{
+ fprintf(stderr,"stdin:%d: %s before '%s'\n", mylineno, s, yytext);
+ return 0;
+}
+
+static stpui_plist_t *current_printer = NULL;
+
+%}
+
+%token <ival> tINT
+%token <dval> tDOUBLE
+%token <ival> tDIMENSION
+%token <sval> tBOOLEAN
+%token <sval> tSTRING
+%token <sval> tWORD
+%token <sval> tGSWORD
+
+%token CURRENT_PRINTER
+%token SHOW_ALL_PAPER_SIZES
+%token PRINTER
+%token DESTINATION
+%token SCALING
+%token ORIENTATION
+%token AUTOSIZE_ROLL_PAPER
+%token UNIT
+%token DRIVER
+%token LEFT
+%token TOP
+%token CUSTOM_PAGE_WIDTH
+%token CUSTOM_PAGE_HEIGHT
+%token OUTPUT_TYPE
+%token PRINTRC_HDR
+%token PARAMETER
+%token QUEUE_NAME
+%token OUTPUT_FILENAME
+%token EXTRA_PRINTER_OPTIONS
+%token CUSTOM_COMMAND
+%token COMMAND_TYPE
+%token GLOBAL_SETTINGS
+%token GLOBAL
+%token END_GLOBAL_SETTINGS
+%token pINT
+%token pSTRING_LIST
+%token pFILE
+%token pDOUBLE
+%token pDIMENSION
+%token pBOOLEAN
+%token pCURVE
+
+%start Thing
+
+%%
+
+Printer: PRINTER tSTRING tSTRING
+ {
+ current_printer = stpui_plist_create($2, $3);
+ g_free($2);
+ g_free($3);
+ }
+;
+
+/*
+ * Destination is obsolete; ignore it.
+ */
+Destination: DESTINATION tSTRING
+ {
+ if ($2)
+ g_free($2);
+ }
+;
+
+Queue_Name: QUEUE_NAME tSTRING
+ {
+ if ($2)
+ {
+ stpui_plist_set_queue_name(current_printer, $2);
+ g_free($2);
+ }
+ }
+;
+
+Output_Filename: OUTPUT_FILENAME tSTRING
+ {
+ if ($2)
+ {
+ stpui_plist_set_output_filename(current_printer, $2);
+ g_free($2);
+ }
+ }
+;
+
+Extra_Printer_Options: EXTRA_PRINTER_OPTIONS tSTRING
+ {
+ if ($2)
+ {
+ stpui_plist_set_extra_printer_options(current_printer, $2);
+ g_free($2);
+ }
+ }
+;
+
+Custom_Command: CUSTOM_COMMAND tSTRING
+ {
+ if ($2)
+ {
+ stpui_plist_set_custom_command(current_printer, $2);
+ g_free($2);
+ }
+ }
+;
+
+Command_Type: COMMAND_TYPE tINT
+ {
+ stpui_plist_set_command_type(current_printer, $2);
+ }
+;
+
+Scaling: SCALING tDOUBLE
+ { current_printer->scaling = $2; }
+;
+
+Orientation: ORIENTATION tINT
+ { current_printer->orientation = $2; }
+;
+
+Autosize_Roll_Paper: AUTOSIZE_ROLL_PAPER tINT
+ { current_printer->auto_size_roll_feed_paper = $2; }
+;
+
+Unit: UNIT tINT
+ { current_printer->unit = $2; }
+;
+
+Left: LEFT tINT
+ { stp_set_left(current_printer->v, $2); }
+;
+
+Top: TOP tINT
+ { stp_set_top(current_printer->v, $2); }
+;
+
+Output_Type: OUTPUT_TYPE tINT
+ {
+ switch ($2)
+ {
+ case 0:
+ stp_set_string_parameter
+ (current_printer->v, "PrintingMode", "BW");
+ break;
+ case 1:
+ case 2:
+ default:
+ stp_set_string_parameter
+ (current_printer->v, "PrintingMode", "Color");
+ break;
+ }
+ }
+;
+
+Custom_Page_Width: CUSTOM_PAGE_WIDTH tINT
+ { stp_set_page_width(current_printer->v, $2); }
+;
+
+Custom_Page_Height: CUSTOM_PAGE_HEIGHT tINT
+ { stp_set_page_height(current_printer->v, $2); }
+;
+
+Empty:
+;
+
+Int_Param: tWORD pINT tBOOLEAN tINT
+ {
+ stp_set_int_parameter(current_printer->v, $1, $4);
+ if (strcmp($3, "False") == 0)
+ stp_set_int_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_int_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_ACTIVE);
+ g_free($1);
+ g_free($3);
+ }
+;
+
+String_List_Param: tWORD pSTRING_LIST tBOOLEAN tSTRING
+ {
+ stp_set_string_parameter(current_printer->v, $1, $4);
+ if (strcmp($3, "False") == 0)
+ stp_set_string_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_string_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_ACTIVE);
+ g_free($1);
+ g_free($3);
+ g_free($4);
+ }
+;
+
+File_Param: tWORD pFILE tBOOLEAN tSTRING
+ {
+ stp_set_file_parameter(current_printer->v, $1, $4);
+ if (strcmp($3, "False") == 0)
+ stp_set_file_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_file_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_ACTIVE);
+ g_free($1);
+ g_free($3);
+ g_free($4);
+ }
+;
+
+Double_Param: tWORD pDOUBLE tBOOLEAN tDOUBLE
+ {
+ stp_set_float_parameter(current_printer->v, $1, $4);
+ if (strcmp($3, "False") == 0)
+ stp_set_float_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_float_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_ACTIVE);
+ g_free($1);
+ g_free($3);
+ }
+;
+
+Dimension_Param: tWORD pDIMENSION tBOOLEAN tINT
+ {
+ stp_set_dimension_parameter(current_printer->v, $1, $4);
+ if (strcmp($3, "False") == 0)
+ stp_set_dimension_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_dimension_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_ACTIVE);
+ g_free($1);
+ g_free($3);
+ }
+;
+
+Boolean_Param: tWORD pBOOLEAN tBOOLEAN tBOOLEAN
+ {
+ if (strcmp($4, "False") == 0)
+ stp_set_boolean_parameter(current_printer->v, $1, 0);
+ else
+ stp_set_boolean_parameter(current_printer->v, $1, 1);
+ if (strcmp($3, "False") == 0)
+ stp_set_boolean_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_boolean_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_ACTIVE);
+ g_free($1);
+ g_free($3);
+ g_free($4);
+ }
+;
+
+Curve_Param: tWORD pCURVE tBOOLEAN tSTRING
+ {
+ stp_curve_t *curve = stp_curve_create_from_string($4);
+ if (curve)
+ {
+ stp_set_curve_parameter(current_printer->v, $1, curve);
+ if (strcmp($3, "False") == 0)
+ stp_set_curve_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_INACTIVE);
+ else
+ stp_set_curve_parameter_active(current_printer->v, $1,
+ STP_PARAMETER_ACTIVE);
+ stp_curve_destroy(curve);
+ }
+ g_free($1);
+ g_free($3);
+ g_free($4);
+ }
+;
+
+Typed_Param: Int_Param | String_List_Param | File_Param | Double_Param
+ | Boolean_Param | Curve_Param | Dimension_Param
+;
+
+Parameter: PARAMETER Typed_Param
+;
+
+Parameters: Parameters Parameter | Empty
+;
+
+Standard_Value: Destination | Scaling | Orientation | Autosize_Roll_Paper |
+ Unit | Left | Top | Custom_Page_Width | Custom_Page_Height |
+ Output_Type | Queue_Name | Output_Filename | Extra_Printer_Options |
+ Custom_Command | Command_Type
+;
+
+Standard_Values: Standard_Values Standard_Value | Empty
+;
+
+A_Printer: Printer Standard_Values Parameters
+;
+
+Printers: Printers A_Printer | Empty
+;
+
+Current_Printer: CURRENT_PRINTER tSTRING
+ { stpui_printrc_current_printer = $2; }
+;
+
+Show_All_Paper_Sizes: SHOW_ALL_PAPER_SIZES tBOOLEAN
+ {
+ if (strcmp($2, "True") == 0)
+ stpui_show_all_paper_sizes = 1;
+ else
+ stpui_show_all_paper_sizes = 0;
+ g_free($2);
+ }
+;
+
+Global: Current_Printer | Show_All_Paper_Sizes
+;
+
+Old_Globals: Current_Printer Show_All_Paper_Sizes
+;
+
+New_Global_Setting: tWORD tSTRING
+ {
+ if ($2)
+ {
+ stpui_set_global_parameter($1, $2);
+ g_free($2);
+ }
+ g_free($1);
+ }
+;
+
+Global_Setting: Global | New_Global_Setting
+;
+
+Global_Settings: Global_Settings Global_Setting | Empty
+;
+
+Global_Subblock: GLOBAL_SETTINGS Global_Settings END_GLOBAL_SETTINGS
+;
+
+Global_Block: Global_Subblock | Old_Globals | Empty
+;
+
+Thing: PRINTRC_HDR Global_Block Printers
+;
+
+%%
diff --git a/src/gutenprintui2/typebuiltins.c b/src/gutenprintui2/typebuiltins.c
new file mode 100644
index 0000000..a44e5f7
--- /dev/null
+++ b/src/gutenprintui2/typebuiltins.c
@@ -0,0 +1,58 @@
+
+/* Generated data (by glib-mkenums) */
+
+#include <gutenprintui2/gutenprintui.h>
+
+/* enumerations from "../../include/gutenprintui2/gutenprintui.h" */
+GType
+orient_t_orient_t_get_type (void)
+{
+ static GType etype = 0;
+ if (etype == 0) {
+ static const GEnumValue values[] = {
+ { ORIENT_AUTO, "ORIENT_AUTO", "auto" },
+ { ORIENT_PORTRAIT, "ORIENT_PORTRAIT", "portrait" },
+ { ORIENT_LANDSCAPE, "ORIENT_LANDSCAPE", "landscape" },
+ { ORIENT_UPSIDEDOWN, "ORIENT_UPSIDEDOWN", "upsidedown" },
+ { ORIENT_SEASCAPE, "ORIENT_SEASCAPE", "seascape" },
+ { 0, NULL, NULL }
+ };
+ etype = g_enum_register_static ("orient_t", values);
+ }
+ return etype;
+}
+GType
+command_t_command_t_get_type (void)
+{
+ static GType etype = 0;
+ if (etype == 0) {
+ static const GEnumValue values[] = {
+ { COMMAND_TYPE_DEFAULT, "COMMAND_TYPE_DEFAULT", "default" },
+ { COMMAND_TYPE_CUSTOM, "COMMAND_TYPE_CUSTOM", "custom" },
+ { COMMAND_TYPE_FILE, "COMMAND_TYPE_FILE", "file" },
+ { 0, NULL, NULL }
+ };
+ etype = g_enum_register_static ("command_t", values);
+ }
+ return etype;
+}
+
+/* enumerations from "../../include/gutenprintui2/curve.h" */
+GType
+stpui_curve_type_get_type (void)
+{
+ static GType etype = 0;
+ if (etype == 0) {
+ static const GEnumValue values[] = {
+ { STPUI_CURVE_TYPE_LINEAR, "STPUI_CURVE_TYPE_LINEAR", "linear" },
+ { STPUI_CURVE_TYPE_SPLINE, "STPUI_CURVE_TYPE_SPLINE", "spline" },
+ { STPUI_CURVE_TYPE_FREE, "STPUI_CURVE_TYPE_FREE", "free" },
+ { 0, NULL, NULL }
+ };
+ etype = g_enum_register_static ("StpuiCurveType", values);
+ }
+ return etype;
+}
+
+/* Generated data ends here */
+
diff --git a/src/gutenprintui2/ui-utils.c b/src/gutenprintui2/ui-utils.c
new file mode 100644
index 0000000..b4ec44d
--- /dev/null
+++ b/src/gutenprintui2/ui-utils.c
@@ -0,0 +1,874 @@
+/*
+ * "$Id: ui-utils.c,v 1.2 2005/04/09 14:52:34 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 <config.h>
+#endif
+
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <gutenprintui2/gutenprintui.h>
+#include "gutenprintui-internal.h"
+
+#include <stdio.h>
+#include <string.h>
+
+static void default_errfunc(void *data, const char *buffer, size_t bytes);
+static gchar *image_filename;
+static stp_outfunc_t the_errfunc = default_errfunc;
+static void *the_errdata = NULL;
+static get_thumbnail_func_t thumbnail_func;
+static void *thumbnail_private_data;
+
+/*****************************************************************\
+* *
+* The following from libgimp/gimpdialog.c *
+* *
+\*****************************************************************/
+
+typedef void (*StpuiBasicCallback) (GObject *object,
+ gpointer user_data);
+
+/* local callbacks of dialog_new () */
+static gint
+dialog_delete_callback (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer data)
+{
+ StpuiBasicCallback cancel_callback;
+ GtkWidget *cancel_widget;
+
+ cancel_callback =
+ (StpuiBasicCallback) g_object_get_data (G_OBJECT (widget),
+ "dialog_cancel_callback");
+ cancel_widget =
+ (GtkWidget*) g_object_get_data (G_OBJECT (widget),
+ "dialog_cancel_widget");
+
+ /* the cancel callback has to destroy the dialog */
+ if (cancel_callback)
+ (* cancel_callback) (G_OBJECT(cancel_widget), data);
+
+ return TRUE;
+}
+
+/**
+ * dialog_create_action_areav:
+ * @dialog: The #GtkDialog you want to create the action_area for.
+ * @args: A @va_list as obtained with va_start() describing the action_area
+ * buttons.
+ *
+ */
+static void
+dialog_create_action_areav (GtkDialog *dialog,
+ va_list args)
+{
+ GtkWidget *hbbox = NULL;
+ GtkWidget *button;
+
+ /* action area variables */
+ const gchar *label;
+ GtkSignalFunc callback;
+ gpointer data;
+ GObject *slot_object;
+ GtkWidget **widget_ptr;
+ gboolean default_action;
+ gboolean connect_delete;
+
+ gboolean delete_connected = FALSE;
+
+ g_return_if_fail (dialog != NULL);
+ g_return_if_fail (GTK_IS_DIALOG (dialog));
+
+ /* prepare the action_area */
+ label = va_arg (args, const gchar *);
+
+ if (label)
+ {
+ gtk_container_set_border_width (GTK_CONTAINER (dialog->action_area), 2);
+ gtk_box_set_homogeneous (GTK_BOX (dialog->action_area), FALSE);
+
+ hbbox = gtk_hbutton_box_new ();
+ gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbbox), 4);
+ gtk_box_pack_end (GTK_BOX (dialog->action_area), hbbox, FALSE, FALSE, 0);
+ gtk_widget_show (hbbox);
+ }
+
+ /* the action_area buttons */
+ while (label)
+ {
+ callback = va_arg (args, GtkSignalFunc);
+ data = va_arg (args, gpointer);
+ slot_object = va_arg (args, GObject *);
+ widget_ptr = va_arg (args, GtkWidget **);
+ default_action = va_arg (args, gboolean);
+ connect_delete = va_arg (args, gboolean);
+
+ button = gtk_button_new_with_label (label);
+ GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+ gtk_box_pack_start (GTK_BOX (hbbox), button, FALSE, FALSE, 0);
+
+ if (slot_object == (GObject *) 1)
+ slot_object = G_OBJECT (dialog);
+
+ if (data == NULL)
+ data = dialog;
+
+ if (callback)
+ {
+ if (slot_object)
+ g_signal_connect_object (G_OBJECT (button), "clicked",
+ G_CALLBACK (callback),
+ slot_object, G_CONNECT_SWAPPED);
+ else
+ g_signal_connect (G_OBJECT (button), "clicked",
+ G_CALLBACK (callback),
+ data);
+ }
+
+ if (widget_ptr)
+ *widget_ptr = button;
+
+ if (connect_delete && callback && !delete_connected)
+ {
+ gtk_object_set_data (GTK_OBJECT (dialog),
+ "dialog_cancel_callback",
+ (gpointer) callback);
+ gtk_object_set_data (GTK_OBJECT (dialog),
+ "dialog_cancel_widget",
+ slot_object ? slot_object : G_OBJECT (button));
+
+ /* catch the WM delete event */
+ g_signal_connect (G_OBJECT (dialog), "delete_event",
+ G_CALLBACK (dialog_delete_callback),
+ data);
+
+ delete_connected = TRUE;
+ }
+
+ if (default_action)
+ gtk_widget_grab_default (button);
+ gtk_widget_show (button);
+
+ label = va_arg (args, gchar *);
+ }
+}
+
+/**
+ * dialog_new:
+ * @title: The dialog's title which will be set with gtk_window_set_title().
+ * @position: The dialog's initial position which will be set with
+ * gtk_window_set_position().
+ * @resizable: Is the dialog resizable?, ...
+ * @allow_grow: ... it't @allow_grow flag and ...
+ * @auto_shrink: ... it's @auto_shrink flag which will all be set with
+ * gtk_window_set_policy().
+ * @...: A #NULL terminated @va_list destribing the action_area buttons.
+ *
+ * This function simply packs the action_area arguments passed in "..."
+ * into a @va_list variable and passes everything to dialog_newv().
+ *
+ * For a description of the format of the @va_list describing the
+ * action_area buttons see dialog_create_action_areav().
+ *
+ * Returns: A #GtkDialog.
+ *
+ */
+GtkWidget *
+stpui_dialog_new (const gchar *title,
+ GtkWindowPosition position,
+ gboolean resizable,
+
+ /* specify action area buttons as va_list:
+ * const gchar *label,
+ * GtkSignalFunc callback,
+ * gpointer data,
+ * GObject *slot_object,
+ * GtkWidget **widget_ptr,
+ * gboolean default_action,
+ * gboolean connect_delete,
+ */
+
+ ...)
+{
+ GtkWidget *dialog;
+ va_list args;
+
+ va_start (args, resizable);
+
+ g_return_val_if_fail (title != NULL, NULL);
+
+ dialog = gtk_dialog_new ();
+ gtk_window_set_title (GTK_WINDOW (dialog), title);
+ gtk_window_set_position (GTK_WINDOW (dialog), position);
+ gtk_window_set_resizable (GTK_WINDOW (dialog), resizable);
+
+ /* prepare the action_area */
+ dialog_create_action_areav (GTK_DIALOG (dialog), args);
+
+ va_end (args);
+
+ return dialog;
+}
+
+/*****************************************************************\
+* *
+* The following from libgimp/gimpwidgets.c *
+* *
+\*****************************************************************/
+
+/**
+ * option_menu_new:
+ * @menu_only: #TRUE if the function should return a #GtkMenu only.
+ * @...: A #NULL terminated @va_list describing the menu items.
+ *
+ * Returns: A #GtkOptionMenu or a #GtkMenu (depending on @menu_only).
+ **/
+GtkWidget *
+stpui_option_menu_new(gboolean menu_only,
+
+ /* specify menu items as va_list:
+ * const gchar *label,
+ * GtkSignalFunc callback,
+ * gpointer data,
+ * gpointer user_data,
+ * GtkWidget **widget_ptr,
+ * gboolean active
+ */
+
+ ...)
+{
+ GtkWidget *menu;
+ GtkWidget *menuitem;
+
+ /* menu item variables */
+ const gchar *label;
+ GtkSignalFunc callback;
+ gpointer data;
+ gpointer user_data;
+ GtkWidget **widget_ptr;
+ gboolean active;
+
+ va_list args;
+ gint i;
+ gint initial_index;
+
+ menu = gtk_menu_new ();
+
+ /* create the menu items */
+ initial_index = 0;
+
+ va_start (args, menu_only);
+ label = va_arg (args, const gchar *);
+
+ for (i = 0; label; i++)
+ {
+ callback = va_arg (args, GtkSignalFunc);
+ data = va_arg (args, gpointer);
+ user_data = va_arg (args, gpointer);
+ widget_ptr = va_arg (args, GtkWidget **);
+ active = va_arg (args, gboolean);
+
+ if (strcmp (label, "---"))
+ {
+ menuitem = gtk_menu_item_new_with_label (label);
+
+ g_signal_connect (G_OBJECT (menuitem), "activate",
+ callback,
+ data);
+
+ if (user_data)
+ gtk_object_set_user_data (GTK_OBJECT (menuitem), user_data);
+ }
+ else
+ {
+ menuitem = gtk_menu_item_new ();
+
+ gtk_widget_set_sensitive (menuitem, FALSE);
+ }
+
+ gtk_menu_append (GTK_MENU (menu), menuitem);
+
+ if (widget_ptr)
+ *widget_ptr = menuitem;
+
+ gtk_widget_show (menuitem);
+
+ /* remember the initial menu item */
+ if (active)
+ initial_index = i;
+
+ label = va_arg (args, const gchar *);
+ }
+ va_end (args);
+
+ if (! menu_only)
+ {
+ GtkWidget *optionmenu;
+
+ optionmenu = gtk_option_menu_new ();
+ gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu);
+
+ /* select the initial menu item */
+ gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), initial_index);
+
+ return optionmenu;
+ }
+
+ return menu;
+}
+
+/*****************************************************************\
+* *
+* The following from libgimp/gimpwidgets.c *
+* *
+\*****************************************************************/
+
+/**
+ * spin_button_new:
+ * @adjustment: Returns the spinbutton's #GtkAdjustment.
+ * @value: The initial value of the spinbutton.
+ * @lower: The lower boundary.
+ * @upper: The uppper boundary.
+ * @step_increment: The spinbutton's step increment.
+ * @page_increment: The spinbutton's page increment (mouse button 2).
+ * @page_size: The spinbutton's page size.
+ * @climb_rate: The spinbutton's climb rate.
+ * @digits: The spinbutton's number of decimal digits.
+ *
+ * This function is a shortcut for gtk_adjustment_new() and a subsequent
+ * gtk_spin_button_new() and does some more initialisation stuff like
+ * setting a standard minimun horizontal size.
+ *
+ * Returns: A #GtkSpinbutton and it's #GtkAdjustment.
+ **/
+static GtkWidget *
+spin_button_new (GtkObject **adjustment, /* return value */
+ gfloat value,
+ gfloat lower,
+ gfloat upper,
+ gfloat step_increment,
+ gfloat page_increment,
+ gfloat page_size,
+ gfloat climb_rate,
+ guint digits)
+{
+ GtkWidget *spinbutton;
+
+ *adjustment = gtk_adjustment_new (value, lower, upper,
+ step_increment, page_increment, page_size);
+
+ spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (*adjustment),
+ climb_rate, digits);
+ gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
+ gtk_widget_set_usize (spinbutton, 75, -1);
+
+ return spinbutton;
+}
+
+static void
+scale_entry_unconstrained_adjustment_callback (GtkAdjustment *adjustment,
+ GtkAdjustment *other_adj)
+{
+ g_signal_handlers_block_matched (G_OBJECT (other_adj),
+ G_SIGNAL_MATCH_DATA,
+ 0,
+ 0,
+ NULL,
+ NULL,
+ adjustment);
+
+ gtk_adjustment_set_value (other_adj, adjustment->value);
+
+ g_signal_handlers_unblock_matched (G_OBJECT (other_adj),
+ G_SIGNAL_MATCH_DATA,
+ 0,
+ 0,
+ NULL,
+ NULL,
+ adjustment);
+}
+
+/**
+ * scale_entry_new:
+ * @table: The #GtkTable the widgets will be attached to.
+ * @column: The column to start with.
+ * @row: The row to attach the widgets.
+ * @text: The text for the #GtkLabel which will appear
+ * left of the #GtkHScale.
+ * @scale_usize: The minimum horizontal size of the #GtkHScale.
+ * @spinbutton_usize: The minimum horizontal size of the #GtkSpinButton.
+ * @value: The initial value.
+ * @lower: The lower boundary.
+ * @upper: The upper boundary.
+ * @step_increment: The step increment.
+ * @page_increment: The page increment.
+ * @digits: The number of decimal digits.
+ * @constrain: #TRUE if the range of possible values of the
+ * #GtkSpinButton should be the same as of the #GtkHScale.
+ * @unconstrained_lower: The spinbutton's lower boundary
+ * if @constrain == #FALSE.
+ * @unconstrained_upper: The spinbutton's upper boundary
+ * if @constrain == #FALSE.
+ * @tooltip: A tooltip message for the scale and the spinbutton.
+ *
+ * This function creates a #GtkLabel, a #GtkHScale and a #GtkSpinButton and
+ * attaches them to a 3-column #GtkTable.
+ *
+ * Returns: The #GtkSpinButton's #GtkAdjustment.
+ **/
+GtkObject *
+stpui_scale_entry_new(GtkTable *table,
+ gint column,
+ gint row,
+ const gchar *text,
+ gint scale_usize,
+ gint spinbutton_usize,
+ gfloat value,
+ gfloat lower,
+ gfloat upper,
+ gfloat step_increment,
+ gfloat page_increment,
+ guint digits,
+ gboolean constrain,
+ gfloat unconstrained_lower,
+ gfloat unconstrained_upper,
+ const gchar *tooltip)
+{
+ GtkWidget *label;
+ GtkWidget *scale;
+ GtkWidget *spinbutton;
+ GtkObject *adjustment;
+ GtkObject *return_adj;
+
+ label = gtk_label_new (text);
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_table_attach (GTK_TABLE (table), label,
+ column + 1, column + 2, row, row + 1,
+ GTK_FILL, GTK_FILL, 0, 0);
+ gtk_widget_show (label);
+
+ if (! constrain &&
+ unconstrained_lower <= lower &&
+ unconstrained_upper >= upper)
+ {
+ GtkObject *constrained_adj;
+
+ constrained_adj = gtk_adjustment_new (value, lower, upper,
+ step_increment, page_increment,
+ 0.0);
+
+ spinbutton = spin_button_new (&adjustment, value,
+ unconstrained_lower,
+ unconstrained_upper,
+ step_increment, page_increment, 0.0,
+ 1.0, digits);
+
+ g_signal_connect
+ (G_OBJECT (constrained_adj), "value_changed",
+ G_CALLBACK (scale_entry_unconstrained_adjustment_callback),
+ adjustment);
+
+ g_signal_connect
+ (G_OBJECT (adjustment), "value_changed",
+ G_CALLBACK (scale_entry_unconstrained_adjustment_callback),
+ constrained_adj);
+
+ return_adj = adjustment;
+
+ adjustment = constrained_adj;
+ }
+ else
+ {
+ spinbutton = spin_button_new (&adjustment, value, lower, upper,
+ step_increment, page_increment, 0.0,
+ 1.0, digits);
+
+ return_adj = adjustment;
+ }
+
+ if (spinbutton_usize > 0)
+ gtk_widget_set_usize (spinbutton, spinbutton_usize, -1);
+
+ scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
+ if (scale_usize > 0)
+ gtk_widget_set_usize (scale, scale_usize, -1);
+ gtk_scale_set_digits (GTK_SCALE (scale), digits);
+ gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE);
+ gtk_table_attach (GTK_TABLE (table), scale,
+ column + 2, column + 3, row, row + 1,
+ GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
+ gtk_widget_show (scale);
+
+ gtk_table_attach (GTK_TABLE (table), spinbutton,
+ column + 3, column + 4, row, row + 1,
+ GTK_SHRINK, GTK_SHRINK, 0, 0);
+ gtk_widget_show (spinbutton);
+
+ if (tooltip)
+ {
+ stpui_set_help_data (scale, tooltip);
+ stpui_set_help_data (spinbutton, tooltip);
+ }
+
+ gtk_object_set_data (GTK_OBJECT (return_adj), "label", label);
+ gtk_object_set_data (GTK_OBJECT (return_adj), "scale", scale);
+ gtk_object_set_data (GTK_OBJECT (return_adj), "spinbutton", spinbutton);
+
+ return return_adj;
+}
+
+/**
+ * table_attach_aligned:
+ * @table: The #GtkTable the widgets will be attached to.
+ * @column: The column to start with.
+ * @row: The row to attach the eidgets.
+ * @label_text: The text for the #GtkLabel which will be attached left of the
+ * widget.
+ * @xalign: The horizontal alignment of the #GtkLabel.
+ * @yalign: The vertival alignment of the #GtkLabel.
+ * @widget: The #GtkWidget to attach right of the label.
+ * @colspan: The number of columns the widget will use.
+ * @left_align: #TRUE if the widget should be left-aligned.
+ *
+ * Note that the @label_text can be #NULL and that the widget will be attached
+ * starting at (@column + 1) in this case, too.
+ **/
+void
+stpui_table_attach_aligned (GtkTable *table,
+ gint column,
+ gint row,
+ const gchar *label_text,
+ gfloat xalign,
+ gfloat yalign,
+ GtkWidget *widget,
+ gint colspan,
+ gboolean left_align)
+{
+ if (label_text)
+ {
+ GtkWidget *label;
+
+ label = gtk_label_new (label_text);
+ gtk_misc_set_alignment (GTK_MISC (label), xalign, yalign);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+ gtk_table_attach (table, label, column, column + 1, row, row + 1,
+ GTK_FILL, GTK_FILL, 0, 0);
+ gtk_widget_show (label);
+ }
+
+ gtk_widget_show (widget);
+ if (left_align)
+ {
+ GtkWidget *alignment;
+
+ alignment = gtk_alignment_new (0.0, 0.5, 0.0, 0.0);
+ gtk_container_add (GTK_CONTAINER (alignment), widget);
+
+ widget = alignment;
+ }
+
+ gtk_table_attach (table, widget, column + 1, column + 1 + colspan,
+ row, row + 1,
+ GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
+
+ gtk_widget_show (widget);
+}
+
+/*****************************************************************\
+* *
+* The following borrowed from libgimp/gimphelpui.c *
+* *
+\*****************************************************************/
+
+static GtkTooltips * tool_tips = NULL;
+
+/**
+ * stpui_help_init:
+ *
+ * This function initializes GIMP's help system.
+ *
+ * Currently it only creates a #GtkTooltips object with gtk_tooltips_new()
+ * which will be used by help_stpui_set_help_data().
+ **/
+void
+stpui_help_init (void)
+{
+ tool_tips = gtk_tooltips_new ();
+}
+
+/**
+ * stpui_help_free:
+ *
+ * This function frees the memory used by the #GtkTooltips created by
+ * stpui_help_init().
+ **/
+void
+stpui_help_free (void)
+{
+ gtk_object_destroy (GTK_OBJECT (tool_tips));
+ gtk_object_unref (GTK_OBJECT (tool_tips));
+}
+
+/**
+ * help_enable_tooltips:
+ *
+ * This function calls gtk_tooltips_enable().
+ **/
+void
+stpui_enable_help (void)
+{
+ gtk_tooltips_enable (tool_tips);
+}
+
+/**
+ * help_disable_tooltips:
+ *
+ * This function calls gtk_tooltips_disable().
+ **/
+
+void
+stpui_disable_help (void)
+{
+ gtk_tooltips_disable (tool_tips);
+}
+
+void
+stpui_set_help_data (GtkWidget *widget, const gchar *tooltip)
+{
+ g_return_if_fail (widget != NULL);
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+
+ if (tooltip)
+ {
+ gtk_tooltips_set_tip (tool_tips, widget, tooltip, NULL);
+ }
+}
+
+/*****************************************************************\
+* *
+* The below is new code *
+* *
+\*****************************************************************/
+
+
+void
+stpui_set_image_filename(const char *name)
+{
+ if (name && name == image_filename)
+ return;
+ if (image_filename)
+ g_free(image_filename);
+ if (name)
+ image_filename = g_strdup(name);
+ else
+ image_filename = g_strdup("");
+}
+
+const char *
+stpui_get_image_filename(void)
+{
+ stpui_set_image_filename(image_filename);
+ return(image_filename);
+}
+
+static void
+default_errfunc(void *data, const char *buffer, size_t bytes)
+{
+ fwrite(buffer, 1, bytes, data ? data : stderr);
+}
+
+void
+stpui_set_errfunc(stp_outfunc_t wfunc)
+{
+ the_errfunc = wfunc;
+}
+
+stp_outfunc_t
+stpui_get_errfunc(void)
+{
+ return the_errfunc;
+}
+
+void
+stpui_set_errdata(void *errdata)
+{
+ the_errdata = errdata;
+}
+
+void *
+stpui_get_errdata(void)
+{
+ return the_errdata;
+}
+
+void
+stpui_set_thumbnail_func(get_thumbnail_func_t func)
+{
+ thumbnail_func = func;
+}
+
+get_thumbnail_func_t
+stpui_get_thumbnail_func(void)
+{
+ return thumbnail_func;
+}
+
+void
+stpui_set_thumbnail_data(void *data)
+{
+ thumbnail_private_data = data;
+}
+
+void *
+stpui_get_thumbnail_data(void)
+{
+ return thumbnail_private_data;
+}
+
+GtkWidget *
+stpui_create_entry(GtkWidget *table, int hpos, int vpos, const char *text,
+ const char *help, GCallback callback)
+{
+ GtkWidget *entry = gtk_entry_new();
+ gtk_widget_set_usize(entry, 60, 0);
+ stpui_table_attach_aligned(GTK_TABLE(table), hpos, vpos, text,
+ 0.0, 0.5, entry, 1, TRUE);
+ stpui_set_help_data(entry, help);
+ g_signal_connect(G_OBJECT(entry), "activate",
+ G_CALLBACK(callback), NULL);
+ return entry;
+}
+
+GSList *
+stpui_create_radio_button(radio_group_t *radio, GSList *group,
+ GtkWidget *table, int hpos, int vpos,
+ GCallback callback)
+{
+ radio->button = gtk_radio_button_new_with_label(group, _(radio->name));
+ group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio->button));
+ stpui_table_attach_aligned(GTK_TABLE(table), hpos, vpos, NULL, 0.5, 0.5,
+ radio->button, 1, FALSE);
+ stpui_set_help_data(radio->button, _(radio->help));
+ g_signal_connect(G_OBJECT(radio->button), "toggled",
+ G_CALLBACK(callback), (gpointer) radio->value);
+ return group;
+}
+
+void
+stpui_set_adjustment_tooltip (GtkObject *adj, const gchar *tip)
+{
+ stpui_set_help_data (GTK_WIDGET (SCALE_ENTRY_SCALE (adj)), tip);
+ stpui_set_help_data (GTK_WIDGET (SCALE_ENTRY_SPINBUTTON (adj)), tip);
+}
+
+static GtkWidget *
+table_label(GtkTable *table, gint column, gint row)
+{
+ GList *children = table->children;;
+ while (children)
+ {
+ GtkTableChild *child = (GtkTableChild *)children->data;
+ if (child->left_attach == column + 1 && child->top_attach == row)
+ return child->widget;
+ children = children->next;
+ }
+ return NULL;
+}
+
+void
+stpui_create_new_combo(option_t *option, GtkWidget *table,
+ int hpos, int vpos, gboolean is_optional)
+{
+ GtkWidget *event_box = gtk_event_box_new();
+ GtkWidget *combo = gtk_combo_new();
+
+ option->checkbox = gtk_check_button_new();
+ gtk_table_attach(GTK_TABLE(table), option->checkbox,
+ hpos, hpos + 1, vpos, vpos + 1,
+ GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 0);
+
+ option->info.list.combo = combo;
+ gtk_container_add(GTK_CONTAINER(event_box), combo);
+ gtk_widget_show(combo);
+ gtk_widget_show(event_box);
+ stpui_set_help_data(event_box, _(option->fast_desc->help));
+ stpui_table_attach_aligned
+ (GTK_TABLE(table), hpos + 1, vpos, _(option->fast_desc->text),
+ 0.0, 0.5, event_box, 2, TRUE);
+ option->info.list.label = table_label(GTK_TABLE(table), hpos, vpos);
+}
+
+const char *
+stpui_combo_get_name(GtkWidget *combo,
+ const stp_string_list_t *options)
+{
+ if (options)
+ {
+ gint i;
+ gint num_options = stp_string_list_count(options);
+ const gchar *text = (gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry)));
+
+ if (text == NULL)
+ return (NULL);
+
+ if (num_options == 0)
+ return ((const char *)text);
+
+ for (i = 0; i < num_options; i ++)
+ if (strcmp(stp_string_list_param(options, i)->text, text) == 0)
+ return (stp_string_list_param(options, i)->name);
+ }
+ return (NULL);
+}
+
+void
+stpui_create_scale_entry(option_t *opt,
+ GtkTable *table,
+ gint column,
+ gint row,
+ const gchar *text,
+ gint scale_usize,
+ gint spinbutton_usize,
+ gfloat value,
+ gfloat lower,
+ gfloat upper,
+ gfloat step_increment,
+ gfloat page_increment,
+ guint digits,
+ gboolean constrain,
+ gfloat unconstrained_lower,
+ gfloat unconstrained_upper,
+ const gchar *tooltip,
+ gboolean is_optional)
+{
+ opt->checkbox = gtk_check_button_new();
+ gtk_table_attach(GTK_TABLE(table), opt->checkbox,
+ column, column + 1, row, row + 1,
+ GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 0);
+ opt->info.flt.adjustment =
+ stpui_scale_entry_new(table, column, row, text, scale_usize,
+ spinbutton_usize, value, lower, upper,
+ step_increment, page_increment, digits, constrain,
+ unconstrained_lower, unconstrained_upper, tooltip);
+}
diff --git a/src/main/Makefile.am b/src/main/Makefile.am
index dfdc551..3377183 100644
--- a/src/main/Makefile.am
+++ b/src/main/Makefile.am
@@ -1,4 +1,4 @@
-## $Id: Makefile.am,v 1.27.4.2 2003/07/12 20:47:44 rleigh Exp $
+## $Id: Makefile.am,v 1.91 2005/06/26 10:56:51 rleigh Exp $
## Copyright (C) 2000 Roger Leigh
##
## This program is free software; you can redistribute it and/or modify
@@ -23,71 +23,175 @@ AUTOMAKE_OPTIONS = 1.4 gnu
MAINT_CHARSET = latin1
+include $(top_srcdir)/scripts/global.mk
+
## Variables
-AM_CFLAGS = $(GNUCFLAGS)
-INCLUDES = @INCLUDES@
+pkgconfigdatadir = $(libdir)/pkgconfig
+pkgxmldatadir = $(pkgdatadir)/$(VERSION)/xml
+pkgmoduledir = $(pkglibdir)/$(VERSION)/modules
## Programs
-bin_SCRIPTS = gimpprint-config
+if BUILD_MODULES
+pkgmodule_LTLIBRARIES = \
+ color-traditional.la \
+ print-canon.la \
+ print-escp2.la \
+ print-lexmark.la \
+ print-pcl.la \
+ print-ps.la \
+ print-olympus.la \
+ print-raw.la
+endif
+
+color_traditional_la_SOURCES = \
+ print-color.c \
+ color-conversion.h \
+ color-conversions.c
+
+color_traditional_la_LDFLAGS = -module -avoid-version
-lib_LTLIBRARIES = libgimpprint.la
+print_canon_la_SOURCES = print-canon.c
+print_canon_la_LDFLAGS = -module -avoid-version
-libgimpprint_la_SOURCES = \
- gimp-print-internal.h \
- print-lexmark.c \
- print-canon.c \
- print-dither.c \
+print_escp2_la_SOURCES = \
print-escp2.c \
+ escp2-driver.c \
print-escp2.h \
print-escp2-data.c \
- print-pcl.c \
- print-ps.c \
- print-util.c \
- print-color.c \
- print-weave.c \
- print-version.c \
- print-dither-matrices.c \
- print-dither.h \
- quickmatrix257.h \
- ran.367.179.h \
- ran.509.131.h
-libgimpprint_la_LIBADD = $(GIMPPRINT_DEPLIBS)
+ escp2-channels.c \
+ escp2-inks.c \
+ escp2-papers.c \
+ escp2-resolutions.c
+print_escp2_la_LDFLAGS = -module -avoid-version
+
+print_lexmark_la_SOURCES = print-lexmark.c
+print_lexmark_la_LDFLAGS = -module -avoid-version
+
+print_pcl_la_SOURCES = print-pcl.c
+print_pcl_la_LDFLAGS = -module -avoid-version
+
+print_ps_la_SOURCES = print-ps.c
+print_ps_la_LDFLAGS = -module -avoid-version
+
+print_olympus_la_SOURCES = print-olympus.c
+print_olympus_la_LDFLAGS = -module -avoid-version
+
+print_raw_la_SOURCES = print-raw.c
+print_raw_la_LDFLAGS = -module -avoid-version
+
+lib_LTLIBRARIES = libgutenprint.la
+
+module_SOURCES = \
+ $(color_traditional_la_SOURCES) \
+ $(print_canon_la_SOURCES) \
+ $(print_escp2_la_SOURCES) \
+ $(print_lexmark_la_SOURCES) \
+ $(print_pcl_la_SOURCES) \
+ $(print_ps_la_SOURCES) \
+ $(print_olympus_la_SOURCES) \
+ $(print_raw_la_SOURCES)
+
+if !BUILD_MODULES
+libgutenprint_modules = $(module_SOURCES)
+endif
+
+mxml_SOURCES = \
+ mxml-attr.c \
+ mxml-file.c \
+ mxml-node.c \
+ mxml-search.c
+
+libgutenprint_headers = \
+ dither-impl.h \
+ dither-inlined-functions.h \
+ generic-options.h \
+ gutenprint-internal.h \
+ util.h
+
+libgutenprint_la_SOURCES = \
+ array.c \
+ bit-ops.c \
+ channel.c \
+ color.c \
+ curve.c \
+ curve-cache.c \
+ dither-ed.c \
+ dither-eventone.c \
+ dither-inks.c \
+ dither-main.c \
+ dither-ordered.c \
+ dither-very-fast.c \
+ dither-predithered.c \
+ generic-options.c \
+ image.c \
+ module.c \
+ path.c \
+ print-dither-matrices.c \
+ print-list.c \
+ print-papers.c \
+ print-util.c \
+ print-vars.c \
+ print-version.c \
+ print-weave.c \
+ printers.c \
+ sequence.c \
+ string-list.c \
+ xml.c \
+ $(mxml_SOURCES) \
+ $(libgutenprint_headers) \
+ $(libgutenprint_modules)
+
+libgutenprint_la_LIBADD = $(GUTENPRINT_LIBDEPS)
# Uncommment to build an unversioned library (version in soname)
-#libgimpprint_la_LDFLAGS = -release $(GIMPPRINT_VERSION) -rpath $(libdir)
+#libgutenprint_version = -release $(GUTENPRINT_VERSION)
# Uncomment to build a versioned library
-libgimpprint_la_LDFLAGS = \
- -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \
- -rpath $(libdir)
+libgutenprint_version = -version-info $(GUTENPRINT_CURRENT_INTERFACE):$(GUTENPRINT_INTERFACE_AGE):$(GUTENPRINT_BINARY_AGE)
+libgutenprint_la_LDFLAGS = $(libgutenprint_version) \
+ -rpath $(libdir) -no-undefined
+# libtool currently needs a patch for symbol export to work correctly
+# using a linker version script.
+# -export-symbols $(srcdir)/libgutenprint.sym
## Data
-m4datadir = $(datadir)/aclocal
-m4data_DATA = gimpprint.m4
+pkgconfigdata_DATA = gutenprint.pc
+
+pkgxmldata_DATA = \
+ dither-matrix-1x1.xml \
+ dither-matrix-2x1.xml \
+ dither-matrix-4x1.xml \
+ papers.xml \
+ printers.xml
+
## Rules
-print-util.lo: print-printers.c $(srcdir)/print-util.c
+all-local: xmli18n-tmp.h
-print-printers.c: ../printdef/printdef $(srcdir)/printers.xml
- ../printdef/printdef < $(srcdir)/printers.xml > print-printers.c
-printdefl.o: printdefy.o
+xmli18n-tmp.h: $(srcdir)/papers.xml $(srcdir)/printers.xml
+# Pull out translatable strings from XML files. This is crude, but
+# works for now.
+ sed -e '/description.*value/!d' \
+ -e 's/.*description.*value="\([^"]*\)".*/N_("\1");/' \
+ < $(srcdir)/papers.xml > $@;
+ sed -e '/printer.*name/!d' \
+ -e 's/.*printer.*name="\([^"]*\)".*/N_("\1");/' \
+ < $(srcdir)/printers.xml >> $@;
-../printdef/printdef: $(addprefix ../printdef/, printdefl.l printdefy.y printdef.h)
- cd ../printdef ; \
- $(MAKE)
+dist-hook: xmli18n-tmp.h
+# xmli18n-tmp.h is needed by po/POTFILES.in at dist time
## Clean
-CLEANFILES = print-printers.c
-DISTCLEANFILES = gimpprint-config
+CLEANFILES = xmli18n-tmp.h
MAINTAINERCLEANFILES = Makefile.in
-EXTRA_DIST = gimpprint.m4 gimpprint-config.in printers.xml
+EXTRA_DIST = $(pkgxmldata_DATA) libgutenprint.sym
diff --git a/src/main/Makefile.in b/src/main/Makefile.in
index 2660136..4eeda81 100644
--- a/src/main/Makefile.in
+++ b/src/main/Makefile.in
@@ -1,6 +1,8 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
-# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -10,316 +12,723 @@
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
+@SET_MAKE@
+
+# Variables
-SHELL = @SHELL@
+
+SOURCES = $(color_traditional_la_SOURCES) $(libgutenprint_la_SOURCES) $(print_canon_la_SOURCES) $(print_escp2_la_SOURCES) $(print_lexmark_la_SOURCES) $(print_olympus_la_SOURCES) $(print_pcl_la_SOURCES) $(print_ps_la_SOURCES) $(print_raw_la_SOURCES)
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-
-DESTDIR =
-
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
-
top_builddir = ../..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-transform = @program_transform_name@
-
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
-host_alias = @host_alias@
+build_triplet = @build@
host_triplet = @host@
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(srcdir)/gutenprint.pc.in $(top_srcdir)/scripts/global.mk
+subdir = src/main
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gimp.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/stp.m4 $(top_srcdir)/m4/stp_cups.m4 \
+ $(top_srcdir)/m4/stp_gimp.m4 $(top_srcdir)/m4/stp_option.m4 \
+ $(top_srcdir)/m4/stp_release.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = gutenprint.pc
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgmoduledir)" \
+ "$(DESTDIR)$(pkgconfigdatadir)" "$(DESTDIR)$(pkgxmldatadir)"
+libLTLIBRARIES_INSTALL = $(INSTALL)
+pkgmoduleLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(lib_LTLIBRARIES) $(pkgmodule_LTLIBRARIES)
+color_traditional_la_LIBADD =
+am_color_traditional_la_OBJECTS = print-color.lo color-conversions.lo
+color_traditional_la_OBJECTS = $(am_color_traditional_la_OBJECTS)
+@BUILD_MODULES_TRUE@am_color_traditional_la_rpath = -rpath \
+@BUILD_MODULES_TRUE@ $(pkgmoduledir)
+am__DEPENDENCIES_1 =
+libgutenprint_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am__libgutenprint_la_SOURCES_DIST = array.c bit-ops.c channel.c \
+ color.c curve.c curve-cache.c dither-ed.c dither-eventone.c \
+ dither-inks.c dither-main.c dither-ordered.c \
+ dither-very-fast.c dither-predithered.c generic-options.c \
+ image.c module.c path.c print-dither-matrices.c print-list.c \
+ print-papers.c print-util.c print-vars.c print-version.c \
+ print-weave.c printers.c sequence.c string-list.c xml.c \
+ mxml-attr.c mxml-file.c mxml-node.c mxml-search.c \
+ dither-impl.h dither-inlined-functions.h generic-options.h \
+ gutenprint-internal.h util.h print-color.c color-conversion.h \
+ color-conversions.c print-canon.c print-escp2.c escp2-driver.c \
+ print-escp2.h print-escp2-data.c escp2-channels.c escp2-inks.c \
+ escp2-papers.c escp2-resolutions.c print-lexmark.c print-pcl.c \
+ print-ps.c print-olympus.c print-raw.c
+am__objects_1 = mxml-attr.lo mxml-file.lo mxml-node.lo mxml-search.lo
+am__objects_2 =
+am__objects_3 = print-color.lo color-conversions.lo
+am__objects_4 = print-canon.lo
+am__objects_5 = print-escp2.lo escp2-driver.lo print-escp2-data.lo \
+ escp2-channels.lo escp2-inks.lo escp2-papers.lo \
+ escp2-resolutions.lo
+am__objects_6 = print-lexmark.lo
+am__objects_7 = print-pcl.lo
+am__objects_8 = print-ps.lo
+am__objects_9 = print-olympus.lo
+am__objects_10 = print-raw.lo
+am__objects_11 = $(am__objects_3) $(am__objects_4) $(am__objects_5) \
+ $(am__objects_6) $(am__objects_7) $(am__objects_8) \
+ $(am__objects_9) $(am__objects_10)
+@BUILD_MODULES_FALSE@am__objects_12 = $(am__objects_11)
+am_libgutenprint_la_OBJECTS = array.lo bit-ops.lo channel.lo color.lo \
+ curve.lo curve-cache.lo dither-ed.lo dither-eventone.lo \
+ dither-inks.lo dither-main.lo dither-ordered.lo \
+ dither-very-fast.lo dither-predithered.lo generic-options.lo \
+ image.lo module.lo path.lo print-dither-matrices.lo \
+ print-list.lo print-papers.lo print-util.lo print-vars.lo \
+ print-version.lo print-weave.lo printers.lo sequence.lo \
+ string-list.lo xml.lo $(am__objects_1) $(am__objects_2) \
+ $(am__objects_12)
+libgutenprint_la_OBJECTS = $(am_libgutenprint_la_OBJECTS)
+print_canon_la_LIBADD =
+am_print_canon_la_OBJECTS = print-canon.lo
+print_canon_la_OBJECTS = $(am_print_canon_la_OBJECTS)
+@BUILD_MODULES_TRUE@am_print_canon_la_rpath = -rpath $(pkgmoduledir)
+print_escp2_la_LIBADD =
+am_print_escp2_la_OBJECTS = print-escp2.lo escp2-driver.lo \
+ print-escp2-data.lo escp2-channels.lo escp2-inks.lo \
+ escp2-papers.lo escp2-resolutions.lo
+print_escp2_la_OBJECTS = $(am_print_escp2_la_OBJECTS)
+@BUILD_MODULES_TRUE@am_print_escp2_la_rpath = -rpath $(pkgmoduledir)
+print_lexmark_la_LIBADD =
+am_print_lexmark_la_OBJECTS = print-lexmark.lo
+print_lexmark_la_OBJECTS = $(am_print_lexmark_la_OBJECTS)
+@BUILD_MODULES_TRUE@am_print_lexmark_la_rpath = -rpath $(pkgmoduledir)
+print_olympus_la_LIBADD =
+am_print_olympus_la_OBJECTS = print-olympus.lo
+print_olympus_la_OBJECTS = $(am_print_olympus_la_OBJECTS)
+@BUILD_MODULES_TRUE@am_print_olympus_la_rpath = -rpath $(pkgmoduledir)
+print_pcl_la_LIBADD =
+am_print_pcl_la_OBJECTS = print-pcl.lo
+print_pcl_la_OBJECTS = $(am_print_pcl_la_OBJECTS)
+@BUILD_MODULES_TRUE@am_print_pcl_la_rpath = -rpath $(pkgmoduledir)
+print_ps_la_LIBADD =
+am_print_ps_la_OBJECTS = print-ps.lo
+print_ps_la_OBJECTS = $(am_print_ps_la_OBJECTS)
+@BUILD_MODULES_TRUE@am_print_ps_la_rpath = -rpath $(pkgmoduledir)
+print_raw_la_LIBADD =
+am_print_raw_la_OBJECTS = print-raw.lo
+print_raw_la_OBJECTS = $(am_print_raw_la_OBJECTS)
+@BUILD_MODULES_TRUE@am_print_raw_la_rpath = -rpath $(pkgmoduledir)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(color_traditional_la_SOURCES) $(libgutenprint_la_SOURCES) \
+ $(print_canon_la_SOURCES) $(print_escp2_la_SOURCES) \
+ $(print_lexmark_la_SOURCES) $(print_olympus_la_SOURCES) \
+ $(print_pcl_la_SOURCES) $(print_ps_la_SOURCES) \
+ $(print_raw_la_SOURCES)
+DIST_SOURCES = $(color_traditional_la_SOURCES) \
+ $(am__libgutenprint_la_SOURCES_DIST) $(print_canon_la_SOURCES) \
+ $(print_escp2_la_SOURCES) $(print_lexmark_la_SOURCES) \
+ $(print_olympus_la_SOURCES) $(print_pcl_la_SOURCES) \
+ $(print_ps_la_SOURCES) $(print_raw_la_SOURCES)
+pkgconfigdataDATA_INSTALL = $(INSTALL_DATA)
+pkgxmldataDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkgconfigdata_DATA) $(pkgxmldata_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
-AS = @AS@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
-BISON_PROG = @BISON_PROG@
-BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
-CATALOGS = @CATALOGS@
-CATOBJEXT = @CATOBJEXT@
+BUILD_CUPS_FALSE = @BUILD_CUPS_FALSE@
+BUILD_CUPS_PPDS_FALSE = @BUILD_CUPS_PPDS_FALSE@
+BUILD_CUPS_PPDS_TRUE = @BUILD_CUPS_PPDS_TRUE@
+BUILD_CUPS_TRUE = @BUILD_CUPS_TRUE@
+BUILD_ESCPUTIL_FALSE = @BUILD_ESCPUTIL_FALSE@
+BUILD_ESCPUTIL_TRUE = @BUILD_ESCPUTIL_TRUE@
+BUILD_FOOMATIC_3_FALSE = @BUILD_FOOMATIC_3_FALSE@
+BUILD_FOOMATIC_3_TRUE = @BUILD_FOOMATIC_3_TRUE@
+BUILD_FOOMATIC_FALSE = @BUILD_FOOMATIC_FALSE@
+BUILD_FOOMATIC_TRUE = @BUILD_FOOMATIC_TRUE@
+BUILD_GENPPD_STATIC_FALSE = @BUILD_GENPPD_STATIC_FALSE@
+BUILD_GENPPD_STATIC_TRUE = @BUILD_GENPPD_STATIC_TRUE@
+BUILD_GHOSTSCRIPT_FALSE = @BUILD_GHOSTSCRIPT_FALSE@
+BUILD_GHOSTSCRIPT_TRUE = @BUILD_GHOSTSCRIPT_TRUE@
+BUILD_GIMP2_FALSE = @BUILD_GIMP2_FALSE@
+BUILD_GIMP2_TRUE = @BUILD_GIMP2_TRUE@
+BUILD_GIMP_FALSE = @BUILD_GIMP_FALSE@
+BUILD_GIMP_TRUE = @BUILD_GIMP_TRUE@
+BUILD_LIBGUTENPRINTUI2_FALSE = @BUILD_LIBGUTENPRINTUI2_FALSE@
+BUILD_LIBGUTENPRINTUI2_TRUE = @BUILD_LIBGUTENPRINTUI2_TRUE@
+BUILD_LIBGUTENPRINTUI_FALSE = @BUILD_LIBGUTENPRINTUI_FALSE@
+BUILD_LIBGUTENPRINTUI_TRUE = @BUILD_LIBGUTENPRINTUI_TRUE@
+BUILD_MODULES_FALSE = @BUILD_MODULES_FALSE@
+BUILD_MODULES_TRUE = @BUILD_MODULES_TRUE@
+BUILD_TESTPATTERN_FALSE = @BUILD_TESTPATTERN_FALSE@
+BUILD_TESTPATTERN_TRUE = @BUILD_TESTPATTERN_TRUE@
+BUILD_TEST_FALSE = @BUILD_TEST_FALSE@
+BUILD_TEST_TRUE = @BUILD_TEST_TRUE@
+BUILD_TRANSLATED_CUPS_PPDS_FALSE = @BUILD_TRANSLATED_CUPS_PPDS_FALSE@
+BUILD_TRANSLATED_CUPS_PPDS_TRUE = @BUILD_TRANSLATED_CUPS_PPDS_TRUE@
CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
CONVERT = @CONVERT@
-CUPS_BACKEND_BIN = @CUPS_BACKEND_BIN@
-CUPS_BIN = @CUPS_BIN@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
CUPS_CFLAGS = @CUPS_CFLAGS@
-CUPS_CONF = @CUPS_CONF@
CUPS_CONFIG = @CUPS_CONFIG@
-CUPS_FILTER_BIN = @CUPS_FILTER_BIN@
-CUPS_INSTALL = @CUPS_INSTALL@
CUPS_LIBS = @CUPS_LIBS@
-CUPS_MAN = @CUPS_MAN@
-CUPS_NOINST_BIN = @CUPS_NOINST_BIN@
-CUPS_PKG = @CUPS_PKG@
+CUPS_PPDS_AT_TOP_LEVEL_FALSE = @CUPS_PPDS_AT_TOP_LEVEL_FALSE@
+CUPS_PPDS_AT_TOP_LEVEL_TRUE = @CUPS_PPDS_AT_TOP_LEVEL_TRUE@
CUPS_PPD_PS_LEVEL = @CUPS_PPD_PS_LEVEL@
-DATADIRNAME = @DATADIRNAME@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
DB2HTML = @DB2HTML@
DB2PDF = @DB2PDF@
DB2PS = @DB2PS@
-DLLTOOL = @DLLTOOL@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIALOG = @DIALOG@
+DOXYGEN = @DOXYGEN@
DVIPDF = @DVIPDF@
DVIPS = @DVIPS@
ECHO = @ECHO@
-ESCPUTIL_BIN = @ESCPUTIL_BIN@
-ESCPUTIL_MAN = @ESCPUTIL_MAN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
EXEEXT = @EXEEXT@
-FOOMATIC_3_NOINST_BIN = @FOOMATIC_3_NOINST_BIN@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+FIND = @FIND@
FOOMATIC_CONFIGURE = @FOOMATIC_CONFIGURE@
-FOOMATIC_INSTALL = @FOOMATIC_INSTALL@
FOOMATIC_KITLOAD = @FOOMATIC_KITLOAD@
-FOOMATIC_NOINST_BIN = @FOOMATIC_NOINST_BIN@
-FOOMATIC_OLDIDS_NOINST_BIN = @FOOMATIC_OLDIDS_NOINST_BIN@
FOOMATIC_PPDFILE = @FOOMATIC_PPDFILE@
-GENCAT = @GENCAT@
-GIMPPRINT_BINARY_AGE = @GIMPPRINT_BINARY_AGE@
-GIMPPRINT_CFLAGS = @GIMPPRINT_CFLAGS@
-GIMPPRINT_CURRENT_INTERFACE = @GIMPPRINT_CURRENT_INTERFACE@
-GIMPPRINT_DEPLIBS = @GIMPPRINT_DEPLIBS@
-GIMPPRINT_INTERFACE_AGE = @GIMPPRINT_INTERFACE_AGE@
-GIMPPRINT_LIBS = @GIMPPRINT_LIBS@
-GIMPPRINT_MAJOR_VERSION = @GIMPPRINT_MAJOR_VERSION@
-GIMPPRINT_MICRO_VERSION = @GIMPPRINT_MICRO_VERSION@
-GIMPPRINT_MINOR_VERSION = @GIMPPRINT_MINOR_VERSION@
-GIMPPRINT_VERSION = @GIMPPRINT_VERSION@
+GENPPD_LIBS = @GENPPD_LIBS@
+GIMP2_CFLAGS = @GIMP2_CFLAGS@
+GIMP2_LIBS = @GIMP2_LIBS@
GIMPTOOL = @GIMPTOOL@
+GIMPTOOL2_CHECK = @GIMPTOOL2_CHECK@
GIMPTOOL_CHECK = @GIMPTOOL_CHECK@
-GIMP_BIN = @GIMP_BIN@
GIMP_CFLAGS = @GIMP_CFLAGS@
GIMP_CFLAGS_NOUI = @GIMP_CFLAGS_NOUI@
GIMP_DATA_DIR = @GIMP_DATA_DIR@
GIMP_LIBS = @GIMP_LIBS@
GIMP_LIBS_NOUI = @GIMP_LIBS_NOUI@
GIMP_PLUGIN_DIR = @GIMP_PLUGIN_DIR@
-GLIBC21 = @GLIBC21@
-GMOFILES = @GMOFILES@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_CONFIG = @GLIB_CONFIG@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
GMSGFMT = @GMSGFMT@
GNUCFLAGS = @GNUCFLAGS@
-IJS_BIN = @IJS_BIN@
+GTK2_CFLAGS = @GTK2_CFLAGS@
+GTK2_LIBS = @GTK2_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+GUTENPRINTUI2_BINARY_AGE = @GUTENPRINTUI2_BINARY_AGE@
+GUTENPRINTUI2_CFLAGS = @GUTENPRINTUI2_CFLAGS@
+GUTENPRINTUI2_CURRENT_INTERFACE = @GUTENPRINTUI2_CURRENT_INTERFACE@
+GUTENPRINTUI2_INTERFACE_AGE = @GUTENPRINTUI2_INTERFACE_AGE@
+GUTENPRINTUI2_LIBDEPS = @GUTENPRINTUI2_LIBDEPS@
+GUTENPRINTUI2_LIBS = $(top_builddir)/src/gutenprintui2/libgutenprintui2.la
+GUTENPRINTUI2_VERSION = @GUTENPRINTUI2_VERSION@
+GUTENPRINTUI_BINARY_AGE = @GUTENPRINTUI_BINARY_AGE@
+GUTENPRINTUI_CFLAGS = @GUTENPRINTUI_CFLAGS@
+GUTENPRINTUI_CURRENT_INTERFACE = @GUTENPRINTUI_CURRENT_INTERFACE@
+GUTENPRINTUI_INTERFACE_AGE = @GUTENPRINTUI_INTERFACE_AGE@
+GUTENPRINTUI_LIBDEPS = @GUTENPRINTUI_LIBDEPS@
+GUTENPRINTUI_LIBS = $(top_builddir)/src/gutenprintui/libgutenprintui.la
+GUTENPRINTUI_VERSION = @GUTENPRINTUI_VERSION@
+GUTENPRINT_BINARY_AGE = @GUTENPRINT_BINARY_AGE@
+GUTENPRINT_CFLAGS = @GUTENPRINT_CFLAGS@
+GUTENPRINT_CURRENT_INTERFACE = @GUTENPRINT_CURRENT_INTERFACE@
+GUTENPRINT_INTERFACE_AGE = @GUTENPRINT_INTERFACE_AGE@
+GUTENPRINT_LIBDEPS = @GUTENPRINT_LIBDEPS@
+
+# Libraries
+GUTENPRINT_LIBS = $(top_builddir)/src/main/libgutenprint.la
+GUTENPRINT_MAJOR_VERSION = @GUTENPRINT_MAJOR_VERSION@
+GUTENPRINT_MICRO_VERSION = @GUTENPRINT_MICRO_VERSION@
+GUTENPRINT_MINOR_VERSION = @GUTENPRINT_MINOR_VERSION@
+GUTENPRINT_VERSION = @GUTENPRINT_VERSION@
IJS_CFLAGS = @IJS_CFLAGS@
IJS_CONFIG = @IJS_CONFIG@
-IJS_INSTALL = @IJS_INSTALL@
IJS_LIBS = @IJS_LIBS@
-INSTOBJEXT = @INSTOBJEXT@
-INTLBISON = @INTLBISON@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SAMPLES_FALSE = @INSTALL_SAMPLES_FALSE@
+INSTALL_SAMPLES_TRUE = @INSTALL_SAMPLES_TRUE@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_USER_GUIDE_FALSE = @INSTALL_USER_GUIDE_FALSE@
+INSTALL_USER_GUIDE_TRUE = @INSTALL_USER_GUIDE_TRUE@
INTLLIBS = @INTLLIBS@
-INTLOBJS = @INTLOBJS@
-INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDFLAGS = @LDFLAGS@
LEX = @LEX@
-LIBGIMPPRINT_LIBS = @LIBGIMPPRINT_LIBS@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
LIBICONV = @LIBICONV@
-LIBM = @LIBM@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
LIBREADLINE_DEPS = @LIBREADLINE_DEPS@
+LIBS = $(INTLLIBS) @LIBS@
LIBTOOL = @LIBTOOL@
LIBTOOL_DEPS = @LIBTOOL_DEPS@
LN_S = @LN_S@
LTALLOCA = @LTALLOCA@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
-LT_AGE = @LT_AGE@
-LT_CURRENT = @LT_CURRENT@
-LT_RELEASE = @LT_RELEASE@
-LT_REVISION = @LT_REVISION@
MAINT = @MAINT@
MAINTAINER_CFLAGS = @MAINTAINER_CFLAGS@
-MAIN_BIN = @MAIN_BIN@
-MAIN_DAT = @MAIN_DAT@
-MAIN_MAN = @MAIN_MAN@
-MAIN_SCR = @MAIN_SCR@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
MKINSTALLDIRS = @MKINSTALLDIRS@
MSGFMT = @MSGFMT@
-OBJDUMP = @OBJDUMP@
+MSGMERGE = @MSGMERGE@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
PLUG_IN_PATH = @PLUG_IN_PATH@
-POFILES = @POFILES@
POSUB = @POSUB@
-PRINT_VASPRINTF = @PRINT_VASPRINTF@
RANLIB = @RANLIB@
RELEASE_DATE = @RELEASE_DATE@
RM = @RM@
-SAMPLE_IMAGES = @SAMPLE_IMAGES@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
STRIP = @STRIP@
-TESTPATTERN_BIN = @TESTPATTERN_BIN@
-TEST_BIN = @TEST_BIN@
TEXI2HTML = @TEXI2HTML@
-USER_GUIDE = @USER_GUIDE@
-USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_LEVEL3_PS_FALSE = @USE_LEVEL3_PS_FALSE@
+USE_LEVEL3_PS_TRUE = @USE_LEVEL3_PS_TRUE@
USE_NLS = @USE_NLS@
+USE_NLS_FALSE = @USE_NLS_FALSE@
+USE_NLS_TRUE = @USE_NLS_TRUE@
VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
YACC = @YACC@
-YACC_PROG = @YACC_PROG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
cups_bindir = @cups_bindir@
cups_conf_datadir = @cups_conf_datadir@
cups_conf_serverbin = @cups_conf_serverbin@
cups_conf_serverroot = @cups_conf_serverroot@
cups_exec_prefix = @cups_exec_prefix@
cups_prefix = @cups_prefix@
+cups_sbindir = @cups_sbindir@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+gimp2_plug_indir = @gimp2_plug_indir@
gimp_plug_indir = @gimp_plug_indir@
-gimpprint_cflags = @gimpprint_cflags@
-gimpprint_libs = @gimpprint_libs@
-
+gutenprint_cflags = @gutenprint_cflags@
+gutenprint_libs = @gutenprint_libs@
+gutenprintui2_cflags = @gutenprintui2_cflags@
+gutenprintui2_libs = @gutenprintui2_libs@
+gutenprintui_cflags = @gutenprintui_cflags@
+gutenprintui_libs = @gutenprintui_libs@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
AUTOMAKE_OPTIONS = 1.4 gnu
-
MAINT_CHARSET = latin1
-
-AM_CFLAGS = $(GNUCFLAGS)
-INCLUDES = @INCLUDES@
-
-bin_SCRIPTS = gimpprint-config
-
-lib_LTLIBRARIES = libgimpprint.la
-
-libgimpprint_la_SOURCES = gimp-print-internal.h print-lexmark.c print-canon.c print-dither.c print-escp2.c print-escp2.h print-escp2-data.c print-pcl.c print-ps.c print-util.c print-color.c print-weave.c print-version.c print-dither-matrices.c print-dither.h quickmatrix257.h ran.367.179.h ran.509.131.h
-
-libgimpprint_la_LIBADD = $(GIMPPRINT_DEPLIBS)
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(LOCAL_CPPFLAGS) $(GNUCFLAGS)
+pkgconfigdatadir = $(libdir)/pkgconfig
+pkgxmldatadir = $(pkgdatadir)/$(VERSION)/xml
+pkgmoduledir = $(pkglibdir)/$(VERSION)/modules
+@BUILD_MODULES_TRUE@pkgmodule_LTLIBRARIES = \
+@BUILD_MODULES_TRUE@ color-traditional.la \
+@BUILD_MODULES_TRUE@ print-canon.la \
+@BUILD_MODULES_TRUE@ print-escp2.la \
+@BUILD_MODULES_TRUE@ print-lexmark.la \
+@BUILD_MODULES_TRUE@ print-pcl.la \
+@BUILD_MODULES_TRUE@ print-ps.la \
+@BUILD_MODULES_TRUE@ print-olympus.la \
+@BUILD_MODULES_TRUE@ print-raw.la
+
+color_traditional_la_SOURCES = \
+ print-color.c \
+ color-conversion.h \
+ color-conversions.c
+
+color_traditional_la_LDFLAGS = -module -avoid-version
+print_canon_la_SOURCES = print-canon.c
+print_canon_la_LDFLAGS = -module -avoid-version
+print_escp2_la_SOURCES = \
+ print-escp2.c \
+ escp2-driver.c \
+ print-escp2.h \
+ print-escp2-data.c \
+ escp2-channels.c \
+ escp2-inks.c \
+ escp2-papers.c \
+ escp2-resolutions.c
+
+print_escp2_la_LDFLAGS = -module -avoid-version
+print_lexmark_la_SOURCES = print-lexmark.c
+print_lexmark_la_LDFLAGS = -module -avoid-version
+print_pcl_la_SOURCES = print-pcl.c
+print_pcl_la_LDFLAGS = -module -avoid-version
+print_ps_la_SOURCES = print-ps.c
+print_ps_la_LDFLAGS = -module -avoid-version
+print_olympus_la_SOURCES = print-olympus.c
+print_olympus_la_LDFLAGS = -module -avoid-version
+print_raw_la_SOURCES = print-raw.c
+print_raw_la_LDFLAGS = -module -avoid-version
+lib_LTLIBRARIES = libgutenprint.la
+module_SOURCES = \
+ $(color_traditional_la_SOURCES) \
+ $(print_canon_la_SOURCES) \
+ $(print_escp2_la_SOURCES) \
+ $(print_lexmark_la_SOURCES) \
+ $(print_pcl_la_SOURCES) \
+ $(print_ps_la_SOURCES) \
+ $(print_olympus_la_SOURCES) \
+ $(print_raw_la_SOURCES)
+
+@BUILD_MODULES_FALSE@libgutenprint_modules = $(module_SOURCES)
+mxml_SOURCES = \
+ mxml-attr.c \
+ mxml-file.c \
+ mxml-node.c \
+ mxml-search.c
+
+libgutenprint_headers = \
+ dither-impl.h \
+ dither-inlined-functions.h \
+ generic-options.h \
+ gutenprint-internal.h \
+ util.h
+
+libgutenprint_la_SOURCES = \
+ array.c \
+ bit-ops.c \
+ channel.c \
+ color.c \
+ curve.c \
+ curve-cache.c \
+ dither-ed.c \
+ dither-eventone.c \
+ dither-inks.c \
+ dither-main.c \
+ dither-ordered.c \
+ dither-very-fast.c \
+ dither-predithered.c \
+ generic-options.c \
+ image.c \
+ module.c \
+ path.c \
+ print-dither-matrices.c \
+ print-list.c \
+ print-papers.c \
+ print-util.c \
+ print-vars.c \
+ print-version.c \
+ print-weave.c \
+ printers.c \
+ sequence.c \
+ string-list.c \
+ xml.c \
+ $(mxml_SOURCES) \
+ $(libgutenprint_headers) \
+ $(libgutenprint_modules)
+
+libgutenprint_la_LIBADD = $(GUTENPRINT_LIBDEPS)
# Uncommment to build an unversioned library (version in soname)
-#libgimpprint_la_LDFLAGS = -release $(GIMPPRINT_VERSION) -rpath $(libdir)
+#libgutenprint_version = -release $(GUTENPRINT_VERSION)
# Uncomment to build a versioned library
-libgimpprint_la_LDFLAGS = -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) -rpath $(libdir)
-
-
-m4datadir = $(datadir)/aclocal
-m4data_DATA = gimpprint.m4
-
-CLEANFILES = print-printers.c
-DISTCLEANFILES = gimpprint-config
+libgutenprint_version = -version-info $(GUTENPRINT_CURRENT_INTERFACE):$(GUTENPRINT_INTERFACE_AGE):$(GUTENPRINT_BINARY_AGE)
+libgutenprint_la_LDFLAGS = $(libgutenprint_version) \
+ -rpath $(libdir) -no-undefined
+
+# libtool currently needs a patch for symbol export to work correctly
+# using a linker version script.
+# -export-symbols $(srcdir)/libgutenprint.sym
+pkgconfigdata_DATA = gutenprint.pc
+pkgxmldata_DATA = \
+ dither-matrix-1x1.xml \
+ dither-matrix-2x1.xml \
+ dither-matrix-4x1.xml \
+ papers.xml \
+ printers.xml
+
+# xmli18n-tmp.h is needed by po/POTFILES.in at dist time
+CLEANFILES = xmli18n-tmp.h
MAINTAINERCLEANFILES = Makefile.in
+EXTRA_DIST = $(pkgxmldata_DATA) libgutenprint.sym
+all: all-am
-EXTRA_DIST = gimpprint.m4 gimpprint-config.in printers.xml
-mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
-CONFIG_HEADER = ../../config.h
-CONFIG_CLEAN_FILES = gimpprint-config
-LTLIBRARIES = $(lib_LTLIBRARIES)
-
-
-DEFS = @DEFS@ -I. -I$(srcdir) -I../..
-CPPFLAGS = @CPPFLAGS@
-LDFLAGS = @LDFLAGS@
-LIBS = @LIBS@
-libgimpprint_la_DEPENDENCIES =
-libgimpprint_la_OBJECTS = print-lexmark.lo print-canon.lo \
-print-dither.lo print-escp2.lo print-escp2-data.lo print-pcl.lo \
-print-ps.lo print-util.lo print-color.lo print-weave.lo \
-print-version.lo print-dither-matrices.lo
-SCRIPTS = $(bin_SCRIPTS)
-
-CFLAGS = @CFLAGS@
-COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-DATA = $(m4data_DATA)
-
-DIST_COMMON = Makefile.am Makefile.in gimpprint-config.in
-
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = tar
-GZIP_ENV = --best
-SOURCES = $(libgimpprint_la_SOURCES)
-OBJECTS = $(libgimpprint_la_OBJECTS)
-
-all: all-redirect
.SUFFIXES:
-.SUFFIXES: .S .c .lo .o .obj .s
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/main/Makefile
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-gimpprint-config: $(top_builddir)/config.status gimpprint-config.in
- cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-mostlyclean-libLTLIBRARIES:
-
-clean-libLTLIBRARIES:
- -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-
-distclean-libLTLIBRARIES:
-
-maintainer-clean-libLTLIBRARIES:
-
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/scripts/global.mk $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/main/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/main/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+gutenprint.pc: $(top_builddir)/config.status $(srcdir)/gutenprint.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
@$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(libdir)
+ test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
if test -f $$p; then \
- echo "$(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(libdir)/$$p"; \
- $(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(libdir)/$$p; \
+ f=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
else :; fi; \
done
uninstall-libLTLIBRARIES:
@$(NORMAL_UNINSTALL)
- list='$(lib_LTLIBRARIES)'; for p in $$list; do \
- $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p; \
+ @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ p=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
+ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
done
-.c.o:
- $(COMPILE) -c $<
-
-# FIXME: We should only use cygpath when building on Windows,
-# and only if it is available.
-.c.obj:
- $(COMPILE) -c `cygpath -w $<`
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+install-pkgmoduleLTLIBRARIES: $(pkgmodule_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgmoduledir)" || $(mkdir_p) "$(DESTDIR)$(pkgmoduledir)"
+ @list='$(pkgmodule_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=install $(pkgmoduleLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkgmoduledir)/$$f'"; \
+ $(LIBTOOL) --mode=install $(pkgmoduleLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkgmoduledir)/$$f"; \
+ else :; fi; \
+ done
-.s.o:
- $(COMPILE) -c $<
+uninstall-pkgmoduleLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @set -x; list='$(pkgmodule_LTLIBRARIES)'; for p in $$list; do \
+ p=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkgmoduledir)/$$p'"; \
+ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkgmoduledir)/$$p"; \
+ done
-.S.o:
- $(COMPILE) -c $<
+clean-pkgmoduleLTLIBRARIES:
+ -test -z "$(pkgmodule_LTLIBRARIES)" || rm -f $(pkgmodule_LTLIBRARIES)
+ @list='$(pkgmodule_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+color-traditional.la: $(color_traditional_la_OBJECTS) $(color_traditional_la_DEPENDENCIES)
+ $(LINK) $(am_color_traditional_la_rpath) $(color_traditional_la_LDFLAGS) $(color_traditional_la_OBJECTS) $(color_traditional_la_LIBADD) $(LIBS)
+libgutenprint.la: $(libgutenprint_la_OBJECTS) $(libgutenprint_la_DEPENDENCIES)
+ $(LINK) -rpath $(libdir) $(libgutenprint_la_LDFLAGS) $(libgutenprint_la_OBJECTS) $(libgutenprint_la_LIBADD) $(LIBS)
+print-canon.la: $(print_canon_la_OBJECTS) $(print_canon_la_DEPENDENCIES)
+ $(LINK) $(am_print_canon_la_rpath) $(print_canon_la_LDFLAGS) $(print_canon_la_OBJECTS) $(print_canon_la_LIBADD) $(LIBS)
+print-escp2.la: $(print_escp2_la_OBJECTS) $(print_escp2_la_DEPENDENCIES)
+ $(LINK) $(am_print_escp2_la_rpath) $(print_escp2_la_LDFLAGS) $(print_escp2_la_OBJECTS) $(print_escp2_la_LIBADD) $(LIBS)
+print-lexmark.la: $(print_lexmark_la_OBJECTS) $(print_lexmark_la_DEPENDENCIES)
+ $(LINK) $(am_print_lexmark_la_rpath) $(print_lexmark_la_LDFLAGS) $(print_lexmark_la_OBJECTS) $(print_lexmark_la_LIBADD) $(LIBS)
+print-olympus.la: $(print_olympus_la_OBJECTS) $(print_olympus_la_DEPENDENCIES)
+ $(LINK) $(am_print_olympus_la_rpath) $(print_olympus_la_LDFLAGS) $(print_olympus_la_OBJECTS) $(print_olympus_la_LIBADD) $(LIBS)
+print-pcl.la: $(print_pcl_la_OBJECTS) $(print_pcl_la_DEPENDENCIES)
+ $(LINK) $(am_print_pcl_la_rpath) $(print_pcl_la_LDFLAGS) $(print_pcl_la_OBJECTS) $(print_pcl_la_LIBADD) $(LIBS)
+print-ps.la: $(print_ps_la_OBJECTS) $(print_ps_la_DEPENDENCIES)
+ $(LINK) $(am_print_ps_la_rpath) $(print_ps_la_LDFLAGS) $(print_ps_la_OBJECTS) $(print_ps_la_LIBADD) $(LIBS)
+print-raw.la: $(print_raw_la_OBJECTS) $(print_raw_la_DEPENDENCIES)
+ $(LINK) $(am_print_raw_la_rpath) $(print_raw_la_LDFLAGS) $(print_raw_la_OBJECTS) $(print_raw_la_LIBADD) $(LIBS)
mostlyclean-compile:
- -rm -f *.o core *.core
-rm -f *.$(OBJEXT)
-clean-compile:
-
distclean-compile:
-rm -f *.tab.c
-maintainer-clean-compile:
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/array.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bit-ops.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/channel.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/color-conversions.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/color.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curve-cache.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curve.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dither-ed.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dither-eventone.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dither-inks.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dither-main.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dither-ordered.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dither-predithered.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dither-very-fast.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/escp2-channels.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/escp2-driver.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/escp2-inks.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/escp2-papers.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/escp2-resolutions.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generic-options.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/image.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mxml-attr.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mxml-file.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mxml-node.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mxml-search.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/path.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-canon.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-color.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-dither-matrices.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-escp2-data.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-escp2.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-lexmark.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-list.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-olympus.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-papers.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-pcl.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-ps.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-raw.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-util.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-vars.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-version.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-weave.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printers.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sequence.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string-list.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml.Plo@am__quote@
-.c.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
-.s.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
-.S.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.c.lo:
+@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
mostlyclean-libtool:
-rm -f *.lo
@@ -328,233 +737,259 @@ clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-
-maintainer-clean-libtool:
-
-libgimpprint.la: $(libgimpprint_la_OBJECTS) $(libgimpprint_la_DEPENDENCIES)
- $(LINK) -rpath $(libdir) $(libgimpprint_la_LDFLAGS) $(libgimpprint_la_OBJECTS) $(libgimpprint_la_LIBADD) $(LIBS)
-
-install-binSCRIPTS: $(bin_SCRIPTS)
+ -rm -f libtool
+uninstall-info-am:
+install-pkgconfigdataDATA: $(pkgconfigdata_DATA)
@$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(bindir)
- @list='$(bin_SCRIPTS)'; for p in $$list; do \
- if test -f $$p; then \
- echo " $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \
- $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
- else if test -f $(srcdir)/$$p; then \
- echo " $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \
- $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
- else :; fi; fi; \
+ test -z "$(pkgconfigdatadir)" || $(mkdir_p) "$(DESTDIR)$(pkgconfigdatadir)"
+ @list='$(pkgconfigdata_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgconfigdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgconfigdatadir)/$$f'"; \
+ $(pkgconfigdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgconfigdatadir)/$$f"; \
done
-uninstall-binSCRIPTS:
+uninstall-pkgconfigdataDATA:
@$(NORMAL_UNINSTALL)
- list='$(bin_SCRIPTS)'; for p in $$list; do \
- rm -f $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
+ @list='$(pkgconfigdata_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgconfigdatadir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgconfigdatadir)/$$f"; \
done
-
-install-m4dataDATA: $(m4data_DATA)
+install-pkgxmldataDATA: $(pkgxmldata_DATA)
@$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(m4datadir)
- @list='$(m4data_DATA)'; for p in $$list; do \
- if test -f $(srcdir)/$$p; then \
- echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(m4datadir)/$$p"; \
- $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(m4datadir)/$$p; \
- else if test -f $$p; then \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(m4datadir)/$$p"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(m4datadir)/$$p; \
- fi; fi; \
+ test -z "$(pkgxmldatadir)" || $(mkdir_p) "$(DESTDIR)$(pkgxmldatadir)"
+ @list='$(pkgxmldata_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgxmldataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgxmldatadir)/$$f'"; \
+ $(pkgxmldataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgxmldatadir)/$$f"; \
done
-uninstall-m4dataDATA:
+uninstall-pkgxmldataDATA:
@$(NORMAL_UNINSTALL)
- list='$(m4data_DATA)'; for p in $$list; do \
- rm -f $(DESTDIR)$(m4datadir)/$$p; \
+ @list='$(pkgxmldata_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgxmldatadir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgxmldatadir)/$$f"; \
done
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
tags: TAGS
-ID: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
- here=`pwd` && cd $(srcdir) \
- && mkid -f$$here/ID $$unique $(LISP)
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
- || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
-
-mostlyclean-tags:
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
-clean-tags:
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
- -rm -f TAGS ID
-
-maintainer-clean-tags:
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-
-subdir = src/main
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
- @for file in $(DISTFILES); do \
- d=$(srcdir); \
+ $(mkdir_p) $(distdir)/../../scripts
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
- || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $$d/$$file $(distdir)/$$file || :; \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
fi; \
done
-print-canon.lo print-canon.o : print-canon.c ../../config.h \
- ../../include/gimp-print/gimp-print.h gimp-print-internal.h \
- ../../include/gimp-print/gimp-print-intl-internal.h
-print-color.lo print-color.o : print-color.c ../../config.h \
- ../../include/gimp-print/gimp-print.h gimp-print-internal.h \
- ../../include/gimp-print/gimp-print-intl-internal.h
-print-dither-matrices.lo print-dither-matrices.o : \
- print-dither-matrices.c ../../config.h print-dither.h \
- ../../include/gimp-print/gimp-print.h gimp-print-internal.h \
- quickmatrix257.h ran.367.179.h ran.509.131.h
-print-dither.lo print-dither.o : print-dither.c ../../config.h \
- ../../include/gimp-print/gimp-print.h gimp-print-internal.h \
- print-dither.h \
- ../../include/gimp-print/gimp-print-intl-internal.h
-print-escp2-data.lo print-escp2-data.o : print-escp2-data.c \
- ../../config.h ../../include/gimp-print/gimp-print.h \
- gimp-print-internal.h \
- ../../include/gimp-print/gimp-print-intl-internal.h \
- print-escp2.h
-print-escp2.lo print-escp2.o : print-escp2.c ../../config.h \
- ../../include/gimp-print/gimp-print.h gimp-print-internal.h \
- ../../include/gimp-print/gimp-print-intl-internal.h \
- print-escp2.h
-print-lexmark.lo print-lexmark.o : print-lexmark.c ../../config.h \
- ../../include/gimp-print/gimp-print.h gimp-print-internal.h \
- ../../include/gimp-print/gimp-print-intl-internal.h
-print-pcl.lo print-pcl.o : print-pcl.c ../../config.h \
- ../../include/gimp-print/gimp-print.h gimp-print-internal.h \
- ../../include/gimp-print/gimp-print-intl-internal.h
-print-ps.lo print-ps.o : print-ps.c ../../config.h \
- ../../include/gimp-print/gimp-print.h gimp-print-internal.h \
- ../../include/gimp-print/gimp-print-intl-internal.h
-print-util.lo print-util.o : print-util.c ../../config.h \
- ../../include/gimp-print/gimp-print.h gimp-print-internal.h \
- ../../include/gimp-print/gimp-print-intl-internal.h \
- print-printers.c
-print-version.lo print-version.o : print-version.c ../../config.h \
- ../../include/gimp-print/gimp-print.h gimp-print-internal.h \
- ../../include/gimp-print/gimp-print-intl-internal.h
-print-weave.lo print-weave.o : print-weave.c ../../config.h \
- ../../include/gimp-print/gimp-print.h gimp-print-internal.h \
- ../../include/gimp-print/gimp-print-intl-internal.h
-
-info-am:
-info: info-am
-dvi-am:
-dvi: dvi-am
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-hook
check-am: all-am
check: check-am
-installcheck-am:
-installcheck: installcheck-am
-install-exec-am: install-libLTLIBRARIES install-binSCRIPTS
+all-am: Makefile $(LTLIBRARIES) $(DATA) all-local
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgmoduledir)" "$(DESTDIR)$(pkgconfigdatadir)" "$(DESTDIR)$(pkgxmldatadir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
install-exec: install-exec-am
-
-install-data-am: install-m4dataDATA
install-data: install-data-am
+uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-am
-uninstall-am: uninstall-libLTLIBRARIES uninstall-binSCRIPTS \
- uninstall-m4dataDATA
-uninstall: uninstall-am
-all-am: Makefile $(LTLIBRARIES) $(SCRIPTS) $(DATA)
-all-redirect: all-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs:
- $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(bindir) \
- $(DESTDIR)$(m4datadir)
-
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
- -rm -f config.cache config.log stamp-h stamp-h[0-9]*
- -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-mostlyclean-am: mostlyclean-libLTLIBRARIES mostlyclean-compile \
- mostlyclean-libtool mostlyclean-tags \
- mostlyclean-generic
+clean: clean-am
-mostlyclean: mostlyclean-am
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+ clean-pkgmoduleLTLIBRARIES mostlyclean-am
-clean-am: clean-libLTLIBRARIES clean-compile clean-libtool clean-tags \
- clean-generic mostlyclean-am
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
-clean: clean-am
+dvi: dvi-am
-distclean-am: distclean-libLTLIBRARIES distclean-compile \
- distclean-libtool distclean-tags distclean-generic \
- clean-am
- -rm -f libtool
+dvi-am:
-distclean: distclean-am
+html: html-am
-maintainer-clean-am: maintainer-clean-libLTLIBRARIES \
- maintainer-clean-compile maintainer-clean-libtool \
- maintainer-clean-tags maintainer-clean-generic \
- distclean-am
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgconfigdataDATA \
+ install-pkgmoduleLTLIBRARIES install-pkgxmldataDATA
+
+install-exec-am: install-libLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
-.PHONY: mostlyclean-libLTLIBRARIES distclean-libLTLIBRARIES \
-clean-libLTLIBRARIES maintainer-clean-libLTLIBRARIES \
-uninstall-libLTLIBRARIES install-libLTLIBRARIES mostlyclean-compile \
-distclean-compile clean-compile maintainer-clean-compile \
-mostlyclean-libtool distclean-libtool clean-libtool \
-maintainer-clean-libtool uninstall-binSCRIPTS install-binSCRIPTS \
-uninstall-m4dataDATA install-m4dataDATA tags mostlyclean-tags \
-distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
-dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
-install-exec install-data-am install-data install-am install \
-uninstall-am uninstall all-redirect all-am all installdirs \
-mostlyclean-generic distclean-generic clean-generic \
-maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES \
+ uninstall-pkgconfigdataDATA uninstall-pkgmoduleLTLIBRARIES \
+ uninstall-pkgxmldataDATA
+
+.PHONY: CTAGS GTAGS all all-am all-local check check-am clean \
+ clean-generic clean-libLTLIBRARIES clean-libtool \
+ clean-pkgmoduleLTLIBRARIES ctags dist-hook distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am \
+ install-libLTLIBRARIES install-man install-pkgconfigdataDATA \
+ install-pkgmoduleLTLIBRARIES install-pkgxmldataDATA \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags uninstall uninstall-am \
+ uninstall-info-am uninstall-libLTLIBRARIES \
+ uninstall-pkgconfigdataDATA uninstall-pkgmoduleLTLIBRARIES \
+ uninstall-pkgxmldataDATA
@SET_MAKE@
-print-util.lo: print-printers.c $(srcdir)/print-util.c
+export STP_MODULE_PATH = $(top_builddir)/src/main/.libs:$(top_builddir)/src/main
+export STP_DATA_PATH = $(top_srcdir)/src/main
-print-printers.c: ../printdef/printdef $(srcdir)/printers.xml
- ../printdef/printdef < $(srcdir)/printers.xml > print-printers.c
+# Rules
-printdefl.o: printdefy.o
+$(top_builddir)/src/main/libgutenprint.la:
+ cd $(top_builddir)/src/main; \
+ $(MAKE)
+
+$(top_builddir)/src/gutenprintui/libgutenprintui.la:
+ cd $(top_builddir)/src/gutenprintui; \
+ $(MAKE)
-../printdef/printdef: $(addprefix ../printdef/, printdefl.l printdefy.y printdef.h)
- cd ../printdef ; \
+$(top_builddir)/src/gutenprintui2/libgutenprintui2.la:
+ cd $(top_builddir)/src/gutenprintui2; \
$(MAKE)
+all-local: xmli18n-tmp.h
+
+xmli18n-tmp.h: $(srcdir)/papers.xml $(srcdir)/printers.xml
+# Pull out translatable strings from XML files. This is crude, but
+# works for now.
+ sed -e '/description.*value/!d' \
+ -e 's/.*description.*value="\([^"]*\)".*/N_("\1");/' \
+ < $(srcdir)/papers.xml > $@;
+ sed -e '/printer.*name/!d' \
+ -e 's/.*printer.*name="\([^"]*\)".*/N_("\1");/' \
+ < $(srcdir)/printers.xml >> $@;
+
+dist-hook: xmli18n-tmp.h
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
diff --git a/src/main/array.c b/src/main/array.c
new file mode 100644
index 0000000..c16348c
--- /dev/null
+++ b/src/main/array.c
@@ -0,0 +1,281 @@
+/*
+ * "$Id: array.c,v 1.16 2004/09/17 18:38:16 rleigh Exp $"
+ *
+ * Array data type. This type is designed to be derived from by
+ * the curve and dither matrix types.
+ *
+ * Copyright 2002-2003 Robert Krawitz (rlk@alum.mit.edu)
+ * Copyright 2003 Roger Leigh (rleigh@debian.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 <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include <limits.h>
+
+
+struct stp_array
+{
+ stp_sequence_t *data; /* First member, to allow typecasting to sequence. */
+ int x_size;
+ int y_size;
+};
+
+/*
+ * We could do more sanity checks here if we want.
+ */
+static inline void
+check_array(const stp_array_t *array)
+{
+ if (array == NULL)
+ {
+ stp_erprintf("Null stp_array_t! Please report this bug.\n");
+ stp_abort();
+ }
+}
+
+
+static void array_ctor(stp_array_t *array)
+{
+ array->data = stp_sequence_create();
+ stp_sequence_set_size(array->data, array->x_size * array->y_size);
+}
+
+stp_array_t *
+stp_array_create(int x_size, int y_size)
+{
+ stp_array_t *ret;
+ ret = stp_zalloc(sizeof(stp_array_t));
+ ret->x_size = x_size;
+ ret->y_size = y_size;
+ ret->data = NULL;
+ array_ctor(ret);
+ return ret;
+}
+
+
+static void
+array_dtor(stp_array_t *array)
+{
+ if (array->data)
+ stp_sequence_destroy(array->data);
+ memset(array, 0, sizeof(stp_array_t));
+}
+
+void
+stp_array_destroy(stp_array_t *array)
+{
+ check_array(array);
+ array_dtor(array);
+ stp_free(array);
+}
+
+void
+stp_array_copy(stp_array_t *dest, const stp_array_t *source)
+{
+ check_array(dest);
+ check_array(source);
+
+ dest->x_size = source->x_size;
+ dest->y_size = source->y_size;
+ if (dest->data)
+ stp_sequence_destroy(dest->data);
+ dest->data = stp_sequence_create_copy(source->data);
+}
+
+stp_array_t *
+stp_array_create_copy(const stp_array_t *array)
+{
+ stp_array_t *ret;
+ check_array(array);
+ ret = stp_array_create(0, 0); /* gets freed next */
+ stp_array_copy(ret, array);
+ return ret;
+}
+
+
+void
+stp_array_set_size(stp_array_t *array, int x_size, int y_size)
+{
+ check_array(array);
+ if (array->data) /* Free old data */
+ stp_sequence_destroy(array->data);
+ array->x_size = x_size;
+ array->y_size = y_size;
+ array->data = stp_sequence_create();
+ stp_sequence_set_size(array->data, array->x_size * array->y_size);
+}
+
+void
+stp_array_get_size(const stp_array_t *array, int *x_size, int *y_size)
+{
+ check_array(array);
+ *x_size = array->x_size;
+ *y_size = array->y_size;
+ return;
+}
+
+void
+stp_array_set_data(stp_array_t *array, const double *data)
+{
+ check_array(array);
+ stp_sequence_set_data(array->data, array->x_size * array->y_size,
+ data);
+}
+
+void
+stp_array_get_data(const stp_array_t *array, size_t *size, const double **data)
+{
+ check_array(array);
+ stp_sequence_get_data(array->data, size, data);
+}
+
+int
+stp_array_set_point(stp_array_t *array, int x, int y, double data)
+{
+ check_array(array);
+
+ if (((array->x_size * x) + y) >= (array->x_size * array->y_size))
+ return 0;
+
+ return stp_sequence_set_point(array->data, (array->x_size * x) + y, data);}
+
+int
+stp_array_get_point(const stp_array_t *array, int x, int y, double *data)
+{
+ check_array(array);
+
+ if (((array->x_size * x) + y) >= array->x_size * array->y_size)
+ return 0;
+ return stp_sequence_get_point(array->data,
+ (array->x_size * x) + y, data);
+}
+
+const stp_sequence_t *
+stp_array_get_sequence(const stp_array_t *array)
+{
+ check_array(array);
+
+ return array->data;
+}
+
+stp_array_t *
+stp_array_create_from_xmltree(stp_mxml_node_t *array) /* The array node */
+{
+ const char *stmp; /* Temporary string */
+ stp_mxml_node_t *child; /* Child sequence node */
+ int x_size, y_size;
+ size_t count;
+ stp_sequence_t *seq = NULL;
+ stp_array_t *ret = NULL;
+
+ stmp = stp_mxmlElementGetAttr(array, "x-size");
+ if (stmp)
+ {
+ x_size = (int) strtoul(stmp, NULL, 0);
+ }
+ else
+ {
+ stp_erprintf("stp_array_create_from_xmltree: \"x-size\" missing\n");
+ goto error;
+ }
+ /* Get y-size */
+ stmp = stp_mxmlElementGetAttr(array, "y-size");
+ if (stmp)
+ {
+ y_size = (int) strtoul(stmp, NULL, 0);
+ }
+ else
+ {
+ stp_erprintf("stp_array_create_from_xmltree: \"y-size\" missing\n");
+ goto error;
+ }
+
+ /* Get the sequence data */
+
+ child = stp_mxmlFindElement(array, array, "sequence", NULL, NULL, STP_MXML_DESCEND);
+ if (child)
+ seq = stp_sequence_create_from_xmltree(child);
+
+ if (seq == NULL)
+ goto error;
+
+ ret = stp_array_create(x_size, y_size);
+ if (ret->data)
+ stp_sequence_destroy(ret->data);
+ ret->data = seq;
+
+ count = stp_sequence_get_size(seq);
+ if (count != (x_size * y_size))
+ {
+ stp_erprintf("stp_array_create_from_xmltree: size mismatch between array and sequence\n");
+ goto error;
+ }
+
+ return ret;
+
+ error:
+ stp_erprintf("stp_array_create_from_xmltree: error during array read\n");
+ if (ret)
+ stp_array_destroy(ret);
+ return NULL;
+}
+
+stp_mxml_node_t *
+stp_xmltree_create_from_array(const stp_array_t *array) /* The array */
+{
+ int x_size, y_size;
+ char *xs, *ys;
+
+ stp_mxml_node_t *arraynode = NULL;
+ stp_mxml_node_t *child = NULL;
+
+ stp_xml_init();
+
+ /* Get array details */
+ stp_array_get_size(array, &x_size, &y_size);
+
+ /* Construct the allocated strings required */
+ stp_asprintf(&xs, "%d", x_size);
+ stp_asprintf(&ys, "%d", y_size);
+
+ arraynode = stp_mxmlNewElement(NULL, "array");
+ stp_mxmlElementSetAttr(arraynode, "x-size", xs);
+ stp_mxmlElementSetAttr(arraynode, "y-size", ys);
+ stp_free(xs);
+ stp_free(ys);
+
+ child = stp_xmltree_create_from_sequence(stp_array_get_sequence(array));
+
+ if (child)
+ stp_mxmlAdd(arraynode, STP_MXML_ADD_AFTER, NULL, child);
+ else
+ {
+ stp_mxmlDelete(arraynode);
+ arraynode = NULL;
+ }
+
+ stp_xml_exit();
+
+ return arraynode;
+}
diff --git a/src/main/bit-ops.c b/src/main/bit-ops.c
new file mode 100644
index 0000000..5cff81d
--- /dev/null
+++ b/src/main/bit-ops.c
@@ -0,0 +1,1199 @@
+/*
+ * "$Id: bit-ops.c,v 1.8 2005/06/29 01:42:34 rlk Exp $"
+ *
+ * Softweave calculator for Gutenprint.
+ *
+ * Copyright 2000 Charles Briscoe-Smith <cpbs@debian.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.
+ */
+
+/*
+ * 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 <config.h>
+#endif
+#include <string.h>
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+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
+stpi_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
+ stpi_split_2_1(length, in, outhi, outlo);
+}
+
+static void
+stpi_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
+stpi_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)
+ stpi_split_4_2(length, in, out0, out1, out2, out3);
+ else
+ stpi_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
+stpi_unpack_2_1(int length,
+ const unsigned char *in,
+ unsigned char *out0,
+ unsigned char *out1)
+{
+ unsigned char tempin, bit, temp0, temp1;
+
+ if (length <= 0)
+ return;
+ for (bit = 128, temp0 = 0, temp1 = 0;
+ length > 0;
+ length --)
+ {
+ tempin = *in++;
+
+ if (tempin & 128)
+ temp0 |= bit;
+ if (tempin & 64)
+ temp1 |= bit;
+ bit >>= 1;
+ if (tempin & 32)
+ temp0 |= bit;
+ if (tempin & 16)
+ temp1 |= bit;
+ bit >>= 1;
+ if (tempin & 8)
+ temp0 |= bit;
+ if (tempin & 4)
+ temp1 |= bit;
+ bit >>= 1;
+ if (tempin & 2)
+ temp0 |= bit;
+ if (tempin & 1)
+ temp1 |= bit;
+
+ if (bit > 1)
+ bit >>= 1;
+ else
+ {
+ bit = 128;
+ *out0++ = temp0;
+ *out1++ = temp1;
+
+ temp0 = 0;
+ temp1 = 0;
+ }
+ }
+
+ if (bit < 128)
+ {
+ *out0++ = temp0;
+ *out1++ = temp1;
+ }
+}
+
+static void
+stpi_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)
+ stpi_unpack_2_1(length, in, outlo, outhi);
+ else
+ stpi_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
+stpi_unpack_4_1(int length,
+ const unsigned char *in,
+ unsigned char *out0,
+ unsigned char *out1,
+ unsigned char *out2,
+ unsigned char *out3)
+{
+ unsigned char tempin, bit, temp0, temp1, temp2, temp3;
+
+ if (length <= 0)
+ return;
+ for (bit = 128, temp0 = 0, temp1 = 0, temp2 = 0, temp3 = 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;
+ bit >>= 1;
+ if (tempin & 8)
+ temp0 |= bit;
+ if (tempin & 4)
+ temp1 |= bit;
+ if (tempin & 2)
+ temp2 |= bit;
+ if (tempin & 1)
+ temp3 |= bit;
+
+ if (bit > 1)
+ bit >>= 1;
+ else
+ {
+ bit = 128;
+ *out0++ = temp0;
+ *out1++ = temp1;
+ *out2++ = temp2;
+ *out3++ = temp3;
+
+ temp0 = 0;
+ temp1 = 0;
+ temp2 = 0;
+ temp3 = 0;
+ }
+ }
+
+ if (bit < 128)
+ {
+ *out0++ = temp0;
+ *out1++ = temp1;
+ *out2++ = temp2;
+ *out3++ = temp3;
+ }
+}
+
+static void
+stpi_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)
+ stpi_unpack_4_1(length, in, out0, out1, out2, out3);
+ else
+ stpi_unpack_4_2(length, in, out0, out1, out2, out3);
+}
+
+static void
+stpi_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;
+
+ if (length <= 0)
+ return;
+
+ 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
+stpi_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)
+ stpi_unpack_8_1(length, in, out0, out1, out2, out3,
+ out4, out5, out6, out7);
+ else
+ stpi_unpack_8_2(length, in, out0, out1, out2, out3,
+ out4, out5, out6, out7);
+}
+
+
+static void
+stpi_unpack_16_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 *out8,
+ unsigned char *out9,
+ unsigned char *out10,
+ unsigned char *out11,
+ unsigned char *out12,
+ unsigned char *out13,
+ unsigned char *out14,
+ unsigned char *out15)
+{
+ unsigned char tempin, bit;
+ unsigned char temp[16];
+
+ if (length <= 0)
+ return;
+
+ memset(temp, 0, 16);
+
+ for (bit = 128; length > 0; length--)
+ {
+ tempin = *in++;
+
+ if (tempin & 128)
+ temp[0] |= bit;
+ if (tempin & 64)
+ temp[1] |= bit;
+ if (tempin & 32)
+ temp[2] |= bit;
+ if (tempin & 16)
+ temp[3] |= bit;
+ if (tempin & 8)
+ temp[4] |= bit;
+ if (tempin & 4)
+ temp[5] |= bit;
+ if (tempin & 2)
+ temp[6] |= bit;
+ if (tempin & 1)
+ temp[7] |= bit;
+
+ tempin = *in++;
+
+ if (tempin & 128)
+ temp[8] |= bit;
+ if (tempin & 64)
+ temp[9] |= bit;
+ if (tempin & 32)
+ temp[10] |= bit;
+ if (tempin & 16)
+ temp[11] |= bit;
+ if (tempin & 8)
+ temp[12] |= bit;
+ if (tempin & 4)
+ temp[13] |= bit;
+ if (tempin & 2)
+ temp[14] |= bit;
+ if (tempin & 1)
+ temp[15] |= bit;
+
+ if (bit > 1)
+ bit >>= 1;
+ else
+ {
+ bit = 128;
+ *out0++ = temp[0];
+ *out1++ = temp[1];
+ *out2++ = temp[2];
+ *out3++ = temp[3];
+ *out4++ = temp[4];
+ *out5++ = temp[5];
+ *out6++ = temp[6];
+ *out7++ = temp[7];
+ *out8++ = temp[8];
+ *out9++ = temp[9];
+ *out10++ = temp[10];
+ *out11++ = temp[11];
+ *out12++ = temp[12];
+ *out13++ = temp[13];
+ *out14++ = temp[14];
+ *out15++ = temp[15];
+
+ memset(temp, 0, 16);
+ }
+ }
+
+ if (bit < 128)
+ {
+ *out0++ = temp[0];
+ *out1++ = temp[1];
+ *out2++ = temp[2];
+ *out3++ = temp[3];
+ *out4++ = temp[4];
+ *out5++ = temp[5];
+ *out6++ = temp[6];
+ *out7++ = temp[7];
+ *out8++ = temp[8];
+ *out9++ = temp[9];
+ *out10++ = temp[10];
+ *out11++ = temp[11];
+ *out12++ = temp[12];
+ *out13++ = temp[13];
+ *out14++ = temp[14];
+ *out15++ = temp[15];
+ }
+}
+
+static void
+stpi_unpack_16_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 *out8,
+ unsigned char *out9,
+ unsigned char *out10,
+ unsigned char *out11,
+ unsigned char *out12,
+ unsigned char *out13,
+ unsigned char *out14,
+ unsigned char *out15)
+{
+ unsigned char tempin, shift;
+ unsigned char temp[16];
+
+ if (length <= 0)
+ return;
+
+ memset(temp, 0, 16);
+
+ for (shift = 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)
+ temp[0] |= (tempin & 192) >> shift;
+ if (tempin & 48)
+ temp[1] |= ((tempin & 48) << 2) >> shift;
+ if (tempin & 12)
+ temp[2] |= ((tempin & 12) << 4) >> shift;
+ if (tempin & 3)
+ temp[3] |= ((tempin & 3) << 6) >> shift;
+
+ tempin = *in++;
+
+ if (tempin & 192)
+ temp[4] |= (tempin & 192) >> shift;
+ if (tempin & 48)
+ temp[5] |= ((tempin & 48) << 2) >> shift;
+ if (tempin & 12)
+ temp[6] |= ((tempin & 12) << 4) >> shift;
+ if (tempin & 3)
+ temp[7] |= ((tempin & 3) << 6) >> shift;
+
+ tempin = *in++;
+
+ if (tempin & 192)
+ temp[8] |= (tempin & 192) >> shift;
+ if (tempin & 48)
+ temp[9] |= ((tempin & 48) << 2) >> shift;
+ if (tempin & 12)
+ temp[10] |= ((tempin & 12) << 4) >> shift;
+ if (tempin & 3)
+ temp[11] |= ((tempin & 3) << 6) >> shift;
+
+ tempin = *in++;
+
+ if (tempin & 192)
+ temp[12] |= (tempin & 192) >> shift;
+ if (tempin & 48)
+ temp[13] |= ((tempin & 48) << 2) >> shift;
+ if (tempin & 12)
+ temp[14] |= ((tempin & 12) << 4) >> shift;
+ if (tempin & 3)
+ temp[15] |= ((tempin & 3) << 6) >> shift;
+
+ if (shift < 6)
+ shift += 2;
+ else
+ {
+ shift = 0;
+ *out0++ = temp[0];
+ *out1++ = temp[1];
+ *out2++ = temp[2];
+ *out3++ = temp[3];
+ *out4++ = temp[4];
+ *out5++ = temp[5];
+ *out6++ = temp[6];
+ *out7++ = temp[7];
+ *out8++ = temp[8];
+ *out9++ = temp[9];
+ *out10++ = temp[10];
+ *out11++ = temp[11];
+ *out12++ = temp[12];
+ *out13++ = temp[13];
+ *out14++ = temp[14];
+ *out15++ = temp[15];
+
+ memset(temp, 0, 16);
+ }
+ }
+
+ if (shift)
+ {
+ *out0++ = temp[0];
+ *out1++ = temp[1];
+ *out2++ = temp[2];
+ *out3++ = temp[3];
+ *out4++ = temp[4];
+ *out5++ = temp[5];
+ *out6++ = temp[6];
+ *out7++ = temp[7];
+ *out8++ = temp[8];
+ *out9++ = temp[9];
+ *out10++ = temp[10];
+ *out11++ = temp[11];
+ *out12++ = temp[12];
+ *out13++ = temp[13];
+ *out14++ = temp[14];
+ *out15++ = temp[15];
+ }
+}
+
+void
+stp_unpack_16(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,
+ unsigned char *out8,
+ unsigned char *out9,
+ unsigned char *out10,
+ unsigned char *out11,
+ unsigned char *out12,
+ unsigned char *out13,
+ unsigned char *out14,
+ unsigned char *out15)
+{
+ if (bits == 1)
+ stpi_unpack_16_1(length, in,
+ out0, out1, out2, out3, out4, out5, out6, out7,
+ out8, out9, out10, out11, out12, out13, out14, out15);
+ else
+ stpi_unpack_16_2(length, in,
+ out0, out1, out2, out3, out4, out5, out6, out7,
+ out8, out9, out10, out11, out12, out13, out14, out15);
+}
+
+static void
+find_first_and_last(const unsigned char *line, int length,
+ int *first, int *last)
+{
+ int i;
+ int found_first = 0;
+ if (!first || !last)
+ return;
+ *first = 0;
+ *last = 0;
+ for (i = 0; i < length; i++)
+ {
+ if (line[i] == 0)
+ {
+ if (!found_first)
+ (*first)++;
+ }
+ else
+ {
+ *last = i;
+ found_first = 1;
+ }
+ }
+}
+
+int
+stp_pack_uncompressed(stp_vars_t *v,
+ const unsigned char *line,
+ int length,
+ unsigned char *comp_buf,
+ unsigned char **comp_ptr,
+ int *first,
+ int *last)
+{
+ find_first_and_last(line, length, first, last);
+ memcpy(comp_buf, line, length);
+ *comp_ptr = comp_buf + length;
+ if (first > last)
+ return 0;
+ else
+ return 1;
+}
+
+int
+stp_pack_tiff(stp_vars_t *v,
+ const unsigned char *line,
+ int length,
+ unsigned char *comp_buf,
+ unsigned char **comp_ptr,
+ int *first,
+ int *last)
+{
+ const unsigned char *start; /* Start of compressed data */
+ unsigned char repeat; /* Repeating char */
+ int count; /* Count of compressed bytes */
+ int tcount; /* Temporary count < 128 */
+ register const unsigned char *xline = line;
+ register int xlength = length;
+ find_first_and_last(line, length, first, last);
+
+ /*
+ * 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]))
+ {
+ 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];
+
+ 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;
+ }
+ }
+ if (first && last && *first > *last)
+ return 0;
+ else
+ return 1;
+}
diff --git a/src/main/channel.c b/src/main/channel.c
new file mode 100644
index 0000000..ca676bb
--- /dev/null
+++ b/src/main/channel.c
@@ -0,0 +1,1017 @@
+/*
+ * "$Id: channel.c,v 1.26 2005/06/14 02:49:09 rlk Exp $"
+ *
+ * Dither routine entrypoints
+ *
+ * Copyright 2003 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 <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#include <math.h>
+#include <string.h>
+
+#ifdef __GNUC__
+#define inline __inline__
+#endif
+
+#define FMAX(a, b) ((a) > (b) ? (a) : (b))
+#define FMIN(a, b) ((a) < (b) ? (a) : (b))
+
+typedef struct
+{
+ double value;
+ double lower;
+ double upper;
+ double cutoff;
+ unsigned short s_density;
+} stpi_subchannel_t;
+
+typedef struct
+{
+ unsigned subchannel_count;
+ stpi_subchannel_t *sc;
+ unsigned short *lut;
+ const double *hue_map;
+ size_t h_count;
+ stp_curve_t *curve;
+} stpi_channel_t;
+
+typedef struct
+{
+ unsigned channel_count;
+ unsigned total_channels;
+ unsigned input_channels;
+ size_t width;
+ int initialized;
+ unsigned ink_limit;
+ unsigned max_density;
+ stpi_channel_t *c;
+ unsigned curve_count;
+ unsigned gloss_limit;
+ unsigned short *input_data;
+ unsigned short *multi_tmp;
+ unsigned short *split_input;
+ unsigned short *output_data;
+ unsigned short *alloc_data_1;
+ unsigned short *alloc_data_2;
+ unsigned short *alloc_data_3;
+ int black_channel;
+ int gloss_channel;
+ int gloss_physical_channel;
+} stpi_channel_group_t;
+
+
+static void
+clear_a_channel(stpi_channel_group_t *cg, int channel)
+{
+ if (channel < cg->channel_count)
+ {
+ STP_SAFE_FREE(cg->c[channel].sc);
+ STP_SAFE_FREE(cg->c[channel].lut);
+ if (cg->c[channel].curve)
+ {
+ stp_curve_destroy(cg->c[channel].curve);
+ cg->c[channel].curve = NULL;
+ }
+ cg->c[channel].subchannel_count = 0;
+ }
+}
+
+static void
+stpi_channel_clear(void *vc)
+{
+ stpi_channel_group_t *cg = (stpi_channel_group_t *) vc;
+ int i;
+ if (cg->channel_count > 0)
+ for (i = 0; i < cg->channel_count; i++)
+ clear_a_channel(cg, i);
+
+ STP_SAFE_FREE(cg->alloc_data_1);
+ STP_SAFE_FREE(cg->alloc_data_2);
+ STP_SAFE_FREE(cg->alloc_data_3);
+ STP_SAFE_FREE(cg->c);
+ cg->channel_count = 0;
+ cg->curve_count = 0;
+ cg->total_channels = 0;
+ cg->input_channels = 0;
+ cg->initialized = 0;
+}
+
+void
+stp_channel_reset(stp_vars_t *v)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ if (cg)
+ stpi_channel_clear(cg);
+}
+
+void
+stp_channel_reset_channel(stp_vars_t *v, int channel)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ if (cg)
+ clear_a_channel(cg, channel);
+}
+
+static void
+stpi_channel_free(void *vc)
+{
+ stpi_channel_clear(vc);
+ stp_free(vc);
+}
+
+static stpi_subchannel_t *
+get_channel(stp_vars_t *v, unsigned channel, unsigned subchannel)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ if (!cg)
+ return NULL;
+ if (channel >= cg->channel_count)
+ return NULL;
+ if (subchannel >= cg->c[channel].subchannel_count)
+ return NULL;
+ return &(cg->c[channel].sc[subchannel]);
+}
+
+void
+stp_channel_add(stp_vars_t *v, unsigned channel, unsigned subchannel,
+ double value)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ stpi_channel_t *chan;
+ if (!cg)
+ {
+ cg = stp_zalloc(sizeof(stpi_channel_group_t));
+ cg->black_channel = -1;
+ cg->gloss_channel = -1;
+ stp_allocate_component_data(v, "Channel", NULL, stpi_channel_free, cg);
+ }
+ if (channel >= cg->channel_count)
+ {
+ unsigned oc = cg->channel_count;
+ cg->c = stp_realloc(cg->c, sizeof(stpi_channel_t) * (channel + 1));
+ memset(cg->c + oc, 0, sizeof(stpi_channel_t) * (channel + 1 - oc));
+ if (channel >= cg->channel_count)
+ cg->channel_count = channel + 1;
+ }
+ chan = cg->c + channel;
+ if (subchannel >= chan->subchannel_count)
+ {
+ unsigned oc = chan->subchannel_count;
+ chan->sc =
+ stp_realloc(chan->sc, sizeof(stpi_subchannel_t) * (subchannel + 1));
+ (void) memset
+ (chan->sc + oc, 0, sizeof(stpi_subchannel_t) * (subchannel + 1 - oc));
+ chan->sc[subchannel].value = value;
+ if (subchannel >= chan->subchannel_count)
+ chan->subchannel_count = subchannel + 1;
+ }
+ chan->sc[subchannel].value = value;
+ chan->sc[subchannel].s_density = 65535;
+ chan->sc[subchannel].cutoff = 0.75;
+}
+
+double
+stp_channel_get_value(stp_vars_t *v, unsigned color, unsigned subchannel)
+{
+ stpi_subchannel_t *sch = get_channel(v, color, subchannel);
+ if (sch)
+ return sch->value;
+ else
+ return -1;
+}
+
+void
+stp_channel_set_density_adjustment(stp_vars_t *v, int color, int subchannel,
+ double adjustment)
+{
+ stpi_subchannel_t *sch = get_channel(v, color, subchannel);
+ if ((strcmp(stp_get_string_parameter(v, "STPIOutputType"), "Raw") == 0 &&
+ strcmp(stp_get_string_parameter(v, "ColorCorrection"), "None") == 0) ||
+ strcmp(stp_get_string_parameter(v, "ColorCorrection"), "Raw") == 0 ||
+ strcmp(stp_get_string_parameter(v, "ColorCorrection"), "Predithered") == 0)
+ {
+ stp_dprintf(STP_DBG_INK, v,
+ "Ignoring channel_density channel %d subchannel %d adjustment %f\n",
+ color, subchannel, adjustment);
+ }
+ else
+ {
+ stp_dprintf(STP_DBG_INK, v,
+ "channel_density channel %d subchannel %d adjustment %f\n",
+ color, subchannel, adjustment);
+ if (sch && adjustment >= 0 && adjustment <= 1)
+ sch->s_density = adjustment * 65535;
+ }
+}
+
+double
+stp_channel_get_density_adjustment(stp_vars_t *v, int color, int subchannel)
+{
+ stpi_subchannel_t *sch = get_channel(v, color, subchannel);
+ if (sch)
+ return sch->s_density / 65535.0;
+ else
+ return -1;
+}
+
+void
+stp_channel_set_ink_limit(stp_vars_t *v, double limit)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ stp_dprintf(STP_DBG_INK, v, "ink_limit %f\n", limit);
+ if (limit > 0)
+ cg->ink_limit = 65535 * limit;
+}
+
+double
+stp_channel_get_ink_limit(stp_vars_t *v)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ return cg->ink_limit / 65535.0;
+}
+
+void
+stp_channel_set_black_channel(stp_vars_t *v, int channel)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ stp_dprintf(STP_DBG_INK, v, "black_channel %d\n", channel);
+ cg->black_channel = channel;
+}
+
+int
+stp_channel_get_black_channel(stp_vars_t *v)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ return cg->black_channel;
+}
+
+void
+stp_channel_set_gloss_channel(stp_vars_t *v, int channel)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ stp_dprintf(STP_DBG_INK, v, "gloss_channel %d\n", channel);
+ cg->gloss_channel = channel;
+}
+
+int
+stp_channel_get_gloss_channel(stp_vars_t *v)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ return cg->gloss_channel;
+}
+
+void
+stp_channel_set_gloss_limit(stp_vars_t *v, double limit)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ stp_dprintf(STP_DBG_INK, v, "gloss_limit %f\n", limit);
+ if (limit > 0)
+ cg->gloss_limit = 65535 * limit;
+}
+
+double
+stp_channel_get_gloss_limit(stp_vars_t *v)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ return cg->gloss_limit / 65535.0;
+}
+
+void
+stp_channel_set_cutoff_adjustment(stp_vars_t *v, int color, int subchannel,
+ double adjustment)
+{
+ stpi_subchannel_t *sch = get_channel(v, color, subchannel);
+ stp_dprintf(STP_DBG_INK, v,
+ "channel_cutoff channel %d subchannel %d adjustment %f\n",
+ color, subchannel, adjustment);
+ if (sch && adjustment >= 0)
+ sch->cutoff = adjustment;
+}
+
+double
+stp_channel_get_cutoff_adjustment(stp_vars_t *v, int color, int subchannel)
+{
+ stpi_subchannel_t *sch = get_channel(v, color, subchannel);
+ if (sch)
+ return sch->cutoff;
+ else
+ return -1.0;
+}
+
+void
+stp_channel_set_curve(stp_vars_t *v, int color, const stp_curve_t *curve)
+{
+ stpi_channel_t *ch;
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ if (!cg || color >= cg->channel_count)
+ return;
+ ch = &(cg->c[color]);
+ stp_dprintf(STP_DBG_INK, v, "set_curve channel %d set curve\n", color);
+ if (ch)
+ {
+ if (curve)
+ ch->curve = stp_curve_create_copy(curve);
+ else
+ ch->curve = NULL;
+ }
+}
+
+const stp_curve_t *
+stp_channel_get_curve(stp_vars_t *v, int color)
+{
+ stpi_channel_t *ch;
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ if (!cg || color >= cg->channel_count)
+ return NULL;
+ ch = &(cg->c[color]);
+ if (ch)
+ return ch->curve;
+ else
+ return NULL;
+}
+
+static int
+input_has_special_channels(const stp_vars_t *v)
+{
+ const stpi_channel_group_t *cg =
+ ((const stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ return (cg->curve_count > 0);
+}
+
+static int
+output_has_gloss(const stp_vars_t *v)
+{
+ const stpi_channel_group_t *cg =
+ ((const stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ return (cg->gloss_channel >= 0);
+}
+
+static int
+input_needs_splitting(const stp_vars_t *v)
+{
+ const stpi_channel_group_t *cg =
+ ((const stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+#if 0
+ return cg->total_channels != cg->input_channels;
+#else
+ int i;
+ if (!cg || cg->channel_count <= 0)
+ return 0;
+ for (i = 0; i < cg->channel_count; i++)
+ {
+ if (cg->c[i].subchannel_count > 1)
+ return 1;
+ }
+ return 0;
+#endif
+}
+
+
+void
+stp_channel_initialize(stp_vars_t *v, stp_image_t *image,
+ int input_channel_count)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ int width = stp_image_width(image);
+ int curve_count = 0;
+ int i, j, k;
+ if (!cg)
+ {
+ cg = stp_zalloc(sizeof(stpi_channel_group_t));
+ cg->black_channel = -1;
+ stp_allocate_component_data(v, "Channel", NULL, stpi_channel_free, cg);
+ }
+ if (cg->initialized)
+ return;
+ cg->initialized = 1;
+ cg->max_density = 0;
+ if (cg->black_channel < -1 || cg->black_channel >= cg->channel_count)
+ cg->black_channel = -1;
+ for (i = 0; i < cg->channel_count; i++)
+ {
+ stpi_channel_t *c = &(cg->c[i]);
+ int sc = c->subchannel_count;
+ if (c->curve)
+ {
+ curve_count++;
+ stp_curve_resample(c->curve, 4096);
+ c->hue_map = stp_curve_get_data(c->curve, &(c->h_count));
+ cg->curve_count++;
+ }
+ if (sc > 1)
+ {
+ int val = 0;
+ int next_breakpoint;
+ c->lut = stp_zalloc(sizeof(unsigned short) * sc * 65536);
+ next_breakpoint = c->sc[0].value * 65535 * c->sc[0].cutoff;
+ if (next_breakpoint > 65535)
+ next_breakpoint = 65535;
+ while (val <= next_breakpoint)
+ {
+ int value = (int) ((double) val / c->sc[0].value);
+ c->lut[val * sc + sc - 1] = value;
+ val++;
+ }
+
+ for (k = 0; k < sc - 1; k++)
+ {
+ double this_val = c->sc[k].value;
+ double next_val = c->sc[k + 1].value;
+ double this_cutoff = c->sc[k].cutoff;
+ double next_cutoff = c->sc[k + 1].cutoff;
+ int range;
+ int base = val;
+ double cutoff = sqrt(this_cutoff * next_cutoff);
+ next_breakpoint = next_val * 65535 * cutoff;
+ if (next_breakpoint > 65535)
+ next_breakpoint = 65535;
+ range = next_breakpoint - val;
+ while (val <= next_breakpoint)
+ {
+ double where = ((double) val - base) / (double) range;
+ double lower_val = base * (1.0 - where);
+ double lower_amount = lower_val / this_val;
+ double upper_amount = (val - lower_val) / next_val;
+ c->lut[val * sc + sc - k - 2] = upper_amount;
+ c->lut[val * sc + sc - k - 1] = lower_amount;
+ val++;
+ }
+ }
+ while (val <= 65535)
+ {
+ c->lut[val * sc] = val / c->sc[sc - 1].value;
+ val++;
+ }
+ }
+ cg->total_channels += c->subchannel_count;
+ for (j = 0; j < c->subchannel_count; j++)
+ cg->max_density += c->sc[j].s_density;
+ }
+ if (cg->gloss_channel >= 0)
+ {
+ for (i = 0; i < cg->channel_count; i++)
+ {
+ if (cg->gloss_channel == i)
+ break;
+ cg->gloss_physical_channel += cg->c[i].subchannel_count;
+ }
+ }
+
+ cg->input_channels = input_channel_count;
+ cg->width = width;
+ cg->alloc_data_1 =
+ stp_malloc(sizeof(unsigned short) * cg->total_channels * width);
+ cg->output_data = cg->alloc_data_1;
+ if (curve_count == 0)
+ {
+ if (input_needs_splitting(v))
+ {
+ cg->alloc_data_2 =
+ stp_malloc(sizeof(unsigned short) * cg->input_channels * width);
+ cg->input_data = cg->alloc_data_2;
+ cg->split_input = cg->input_data;
+ }
+ else if (cg->gloss_channel != -1)
+ {
+ cg->alloc_data_2 =
+ stp_malloc(sizeof(unsigned short) * cg->input_channels * width);
+ cg->input_data = cg->alloc_data_2;
+ }
+ else
+ cg->input_data = cg->output_data;
+ }
+ else
+ {
+ cg->alloc_data_2 =
+ stp_malloc(sizeof(unsigned short) * cg->input_channels * width);
+ cg->input_data = cg->alloc_data_2;
+ if (input_needs_splitting(v))
+ {
+ cg->alloc_data_3 =
+ stp_malloc(sizeof(unsigned short) * cg->channel_count * width);
+ cg->multi_tmp = cg->alloc_data_3;
+ cg->split_input = cg->multi_tmp;
+ }
+ else
+ {
+ cg->multi_tmp = cg->alloc_data_1;
+ }
+ }
+ stp_dprintf(STP_DBG_INK, v, "stp_channel_initialize:\n");
+ stp_dprintf(STP_DBG_INK, v, " channel_count %d\n", cg->channel_count);
+ stp_dprintf(STP_DBG_INK, v, " total_channels %d\n", cg->total_channels);
+ stp_dprintf(STP_DBG_INK, v, " input_channels %d\n", cg->input_channels);
+ stp_dprintf(STP_DBG_INK, v, " width %d\n", cg->width);
+ stp_dprintf(STP_DBG_INK, v, " ink_limit %d\n", cg->ink_limit);
+ stp_dprintf(STP_DBG_INK, v, " gloss_limit %d\n", cg->gloss_limit);
+ stp_dprintf(STP_DBG_INK, v, " max_density %d\n", cg->max_density);
+ stp_dprintf(STP_DBG_INK, v, " curve_count %d\n", cg->curve_count);
+ stp_dprintf(STP_DBG_INK, v, " black_channel %d\n", cg->black_channel);
+ stp_dprintf(STP_DBG_INK, v, " gloss_channel %d\n", cg->gloss_channel);
+ stp_dprintf(STP_DBG_INK, v, " input_data %p\n",
+ (void *) cg->input_data);
+ stp_dprintf(STP_DBG_INK, v, " multi_tmp %p\n",
+ (void *) cg->multi_tmp);
+ stp_dprintf(STP_DBG_INK, v, " split_input %p\n",
+ (void *) cg->split_input);
+ stp_dprintf(STP_DBG_INK, v, " output_data %p\n",
+ (void *) cg->output_data);
+ stp_dprintf(STP_DBG_INK, v, " alloc_data_1 %p\n",
+ (void *) cg->alloc_data_1);
+ stp_dprintf(STP_DBG_INK, v, " alloc_data_2 %p\n",
+ (void *) cg->alloc_data_2);
+ stp_dprintf(STP_DBG_INK, v, " alloc_data_3 %p\n",
+ (void *) cg->alloc_data_3);
+ for (i = 0; i < cg->channel_count; i++)
+ {
+ stp_dprintf(STP_DBG_INK, v, " Channel %d:\n", i);
+ for (j = 0; j < cg->c[i].subchannel_count; j++)
+ {
+ stpi_subchannel_t *sch = &(cg->c[i].sc[j]);
+ stp_dprintf(STP_DBG_INK, v, " Subchannel %d:\n", j);
+ stp_dprintf(STP_DBG_INK, v, " value %.3f:\n", sch->value);
+ stp_dprintf(STP_DBG_INK, v, " lower %.3f:\n", sch->lower);
+ stp_dprintf(STP_DBG_INK, v, " upper %.3f:\n", sch->upper);
+ stp_dprintf(STP_DBG_INK, v, " cutoff %.3f:\n", sch->cutoff);
+ stp_dprintf(STP_DBG_INK, v, " density %d:\n", sch->s_density);
+ }
+ }
+}
+
+static void
+clear_channel(unsigned short *data, unsigned width, unsigned depth)
+{
+ int i;
+ width *= depth;
+ for (i = 0; i < width; i += depth)
+ data[i] = 0;
+}
+
+static int
+scale_channel(unsigned short *data, unsigned width, unsigned depth,
+ unsigned short density)
+{
+ int i;
+ int retval = 0;
+ unsigned short previous_data = 0;
+ unsigned short previous_value = 0;
+ width *= depth;
+ for (i = 0; i < width; i += depth)
+ {
+ if (data[i] == previous_data)
+ data[i] = previous_value;
+ else if (data[i] == (unsigned short) 65535)
+ {
+ data[i] = density;
+ retval = 1;
+ }
+ else if (data[i] > 0)
+ {
+ unsigned short tval = (32767u + data[i] * density) / 65535u;
+ previous_data = data[i];
+ if (tval)
+ retval = 1;
+ previous_value = (unsigned short) tval;
+ data[i] = (unsigned short) tval;
+ }
+ }
+ return retval;
+}
+
+static int
+scan_channel(unsigned short *data, unsigned width, unsigned depth)
+{
+ int i;
+ width *= depth;
+ for (i = 0; i < width; i += depth)
+ {
+ if (data[i])
+ return 1;
+ }
+ return 0;
+}
+
+static inline unsigned
+ink_sum(const unsigned short *data, int total_channels)
+{
+ int j;
+ unsigned total_ink = 0;
+ for (j = 0; j < total_channels; j++)
+ total_ink += data[j];
+ return total_ink;
+}
+
+static int
+limit_ink(const stp_vars_t *v)
+{
+ int i;
+ int retval = 0;
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ unsigned short *ptr = cg->output_data;
+ if (cg->ink_limit == 0 || cg->ink_limit >= cg->max_density)
+ return 0;
+ for (i = 0; i < cg->width; i++)
+ {
+ int total_ink = ink_sum(ptr, cg->total_channels);
+ if (total_ink > cg->ink_limit) /* Need to limit ink? */
+ {
+ int j;
+ /*
+ * FIXME we probably should first try to convert light ink to dark
+ */
+ double ratio = (double) cg->ink_limit / (double) total_ink;
+ for (j = 0; j < cg->total_channels; j++)
+ ptr[j] *= ratio;
+ retval = 1;
+ }
+ ptr += cg->total_channels;
+ }
+ return retval;
+}
+
+static inline int
+mem_eq(const unsigned short *i1, const unsigned short *i2, int count)
+{
+ int i;
+ for (i = 0; i < count; i++)
+ if (i1[i] != i2[i])
+ return 0;
+ return 1;
+}
+
+static void
+copy_channels(const stp_vars_t *v)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ int i, j, k;
+ const unsigned short *input = cg->input_data;
+ unsigned short *output = cg->output_data;
+ for (i = 0; i < cg->width; i++)
+ {
+ for (j = 0; j < cg->channel_count; j++)
+ {
+ stpi_channel_t *ch = &(cg->c[j]);
+ for (k = 0; k < ch->subchannel_count; k++)
+ {
+ if (cg->gloss_channel != j)
+ {
+ *output = *input++;
+ }
+ output++;
+ }
+ }
+ }
+}
+
+static inline double
+compute_hue(int c, int m, int y, int max)
+{
+ double h;
+ if (max == c)
+ h = (m - y) / (double) max;
+ else if (max == m)
+ h = 2 + ((y - c) / (double) max);
+ else
+ h = 4 + ((c - m) / (double) max);
+ if (h < 0)
+ h += 6;
+ else if (h >= 6)
+ h -= 6;
+ return h;
+}
+
+static inline double
+interpolate_value(const double *vec, double val)
+{
+ double base = floor(val);
+ double frac = val - base;
+ int ibase = (int) base;
+ double lval = vec[ibase];
+ if (frac > 0)
+ lval += (vec[ibase + 1] - lval) * frac;
+ return lval;
+}
+
+static void
+generate_special_channels(const stp_vars_t *v)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ int i, j;
+ const unsigned short *input_cache = NULL;
+ const unsigned short *output_cache = NULL;
+ const unsigned short *input = cg->input_data;
+ unsigned short *output = cg->multi_tmp;
+ int outbytes = cg->channel_count * sizeof(unsigned short);
+ for (i = 0; i < cg->width;
+ input += cg->input_channels, output += cg->channel_count, i++)
+ {
+ if (input_cache && mem_eq(input_cache, input, cg->input_channels))
+ {
+ memcpy(output, output_cache, outbytes);
+ }
+ else
+ {
+ int c = input[STP_ECOLOR_C];
+ int m = input[STP_ECOLOR_M];
+ int y = input[STP_ECOLOR_Y];
+ int min = FMIN(c, FMIN(m, y));
+ int max = FMAX(c, FMAX(m, y));
+ if (max > min) /* Otherwise it's gray, and we don't care */
+ {
+ double hue;
+ /*
+ * We're only interested in converting color components
+ * to special inks. We want to compute the hue and
+ * luminosity to determine what we want to convert.
+ * Since we're eliminating all grayscale component, the
+ * computations become simpler.
+ */
+ c -= min;
+ m -= min;
+ y -= min;
+ max -= min;
+ output[STP_ECOLOR_K] = input[STP_ECOLOR_K];
+ hue = compute_hue(c, m, y, max);
+ for (j = 1; j < cg->channel_count; j++)
+ {
+ stpi_channel_t *ch = &(cg->c[j]);
+ output[j] =
+ max * interpolate_value(ch->hue_map,
+ hue * ch->h_count / 6.0);
+ }
+ output[STP_ECOLOR_C] += min;
+ output[STP_ECOLOR_M] += min;
+ output[STP_ECOLOR_Y] += min;
+ }
+ else
+ {
+ for (j = 0; j < 4; j++)
+ output[j] = input[j];
+ for (j = 4; j < cg->channel_count; j++)
+ output[j] = 0;
+ }
+ }
+ input_cache = input;
+ output_cache = output;
+ }
+}
+
+static void
+split_channels(const stp_vars_t *v, unsigned *zero_mask)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ int i, j, k;
+ int nz[STP_CHANNEL_LIMIT];
+ int outbytes = cg->total_channels * sizeof(unsigned short);
+ const unsigned short *input_cache = NULL;
+ const unsigned short *output_cache = NULL;
+ const unsigned short *input = cg->split_input;
+ unsigned short *output = cg->output_data;
+ for (i = 0; i < cg->total_channels; i++)
+ nz[i] = 0;
+ for (i = 0; i < cg->width; i++)
+ {
+ int zero_ptr = 0;
+ if (input_cache && mem_eq(input_cache, input, cg->input_channels))
+ {
+ memcpy(output, output_cache, outbytes);
+ input += cg->input_channels;
+ output += cg->total_channels;
+ }
+ else
+ {
+ unsigned black_value = 0;
+ unsigned virtual_black = 65535;
+ input_cache = input;
+ output_cache = output;
+ if (cg->black_channel >= 0)
+ black_value = input[cg->black_channel];
+ for (j = 0; j < cg->channel_count; j++)
+ {
+ if (input[j] < virtual_black && j != cg->black_channel)
+ virtual_black = input[j];
+ }
+ black_value += virtual_black / 4;
+ for (j = 0; j < cg->channel_count; j++)
+ {
+ stpi_channel_t *c = &(cg->c[j]);
+ int s_count = c->subchannel_count;
+ if (s_count >= 1)
+ {
+ unsigned i_val = *input++;
+ if (i_val == 0)
+ {
+ for (k = 0; k < s_count; k++)
+ *(output++) = 0;
+ }
+ else if (s_count == 1)
+ {
+ if (c->sc[0].s_density < 65535)
+ i_val = i_val * c->sc[0].s_density / 65535;
+ nz[zero_ptr++] |= *(output++) = i_val;
+ }
+ else
+ {
+ unsigned l_val = i_val;
+ unsigned offset;
+ if (i_val > 0 && black_value && j != cg->black_channel)
+ {
+ l_val += black_value;
+ if (l_val > 65535)
+ l_val = 65535;
+ }
+ offset = l_val * s_count;
+ for (k = 0; k < s_count; k++)
+ {
+ unsigned o_val;
+ if (c->sc[k].s_density > 0)
+ {
+ o_val = c->lut[offset + k];
+ if (i_val != l_val)
+ o_val = o_val * i_val / l_val;
+ if (c->sc[k].s_density < 65535)
+ o_val = o_val * c->sc[k].s_density / 65535;
+ }
+ else
+ o_val = 0;
+ *output++ = o_val;
+ nz[zero_ptr++] |= o_val;
+ }
+ }
+ }
+ }
+ }
+ }
+ if (zero_mask)
+ {
+ *zero_mask = 0;
+ for (i = 0; i < cg->total_channels; i++)
+ if (!nz[i])
+ *zero_mask |= 1 << i;
+ }
+}
+
+static void
+scale_channels(const stp_vars_t *v, unsigned *zero_mask)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ int i, j;
+ int physical_channel = 0;
+ if (zero_mask)
+ *zero_mask = 0;
+ for (i = 0; i < cg->channel_count; i++)
+ {
+ stpi_channel_t *ch = &(cg->c[i]);
+ if (ch->subchannel_count > 0)
+ for (j = 0; j < ch->subchannel_count; j++)
+ {
+ if (cg->gloss_channel != i)
+ {
+ stpi_subchannel_t *sch = &(ch->sc[j]);
+ unsigned density = sch->s_density;
+ unsigned short *output = cg->output_data + physical_channel;
+ if (density == 0)
+ {
+ clear_channel(output, cg->width, cg->total_channels);
+ if (zero_mask)
+ *zero_mask |= 1 << physical_channel;
+ }
+ else if (density != 65535)
+ {
+ if (scale_channel(output, cg->width, cg->total_channels,
+ density) == 0)
+ if (zero_mask)
+ *zero_mask |= 1 << physical_channel;
+ }
+ else if (zero_mask)
+ {
+ if (scan_channel(output, cg->width, cg->total_channels)==0)
+ *zero_mask |= 1 << physical_channel;
+ }
+ }
+ physical_channel++;
+ }
+ }
+}
+
+static void
+generate_gloss(const stp_vars_t *v, unsigned *zero_mask)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ unsigned short *output = cg->output_data;
+ unsigned gloss_mask;
+ int i, j, k;
+ if (cg->gloss_channel == -1 || cg->gloss_limit <= 0)
+ return;
+ gloss_mask = ~(1 << cg->gloss_physical_channel);
+ for (i = 0; i < cg->width; i++)
+ {
+ int physical_channel = 0;
+ unsigned channel_sum = 0;
+ output[cg->gloss_physical_channel] = 0;
+ for (j = 0; j < cg->channel_count; j++)
+ {
+ stpi_channel_t *ch = &(cg->c[j]);
+ for (k = 0; k < ch->subchannel_count; k++)
+ {
+ if (cg->gloss_channel != j)
+ {
+ channel_sum += (unsigned) output[physical_channel];
+ if (channel_sum >= cg->gloss_limit)
+ goto next;
+ }
+ physical_channel++;
+ }
+ }
+ if (channel_sum < cg->gloss_limit)
+ {
+ unsigned gloss_required = cg->gloss_limit - channel_sum;
+ if (gloss_required > 65535)
+ gloss_required = 65535;
+ output[cg->gloss_physical_channel] = gloss_required;
+ if (zero_mask)
+ *zero_mask &= gloss_mask;
+ }
+ next:
+ output += cg->total_channels;
+ }
+}
+
+void
+stp_channel_convert(const stp_vars_t *v, unsigned *zero_mask)
+{
+ if (input_has_special_channels(v))
+ generate_special_channels(v);
+ else if (output_has_gloss(v) && !input_needs_splitting(v))
+ copy_channels(v);
+ if (input_needs_splitting(v))
+ split_channels(v, zero_mask);
+ else
+ scale_channels(v, zero_mask);
+ (void) limit_ink(v);
+ (void) generate_gloss(v, zero_mask);
+}
+
+unsigned short *
+stp_channel_get_input(const stp_vars_t *v)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ return (unsigned short *) cg->input_data;
+}
+
+unsigned short *
+stp_channel_get_output(const stp_vars_t *v)
+{
+ stpi_channel_group_t *cg =
+ ((stpi_channel_group_t *) stp_get_component_data(v, "Channel"));
+ return cg->output_data;
+}
diff --git a/src/main/color-conversion.h b/src/main/color-conversion.h
new file mode 100644
index 0000000..ed87811
--- /dev/null
+++ b/src/main/color-conversion.h
@@ -0,0 +1,189 @@
+/*
+ * "$Id: color-conversion.h,v 1.9 2005/06/30 01:34:58 rlk Exp $"
+ *
+ * Gutenprint color management module - traditional Gimp-Print algorithm.
+ *
+ * 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.
+ */
+
+#ifndef GUTENPRINT_INTERNAL_COLOR_CONVERSION_H
+#define GUTENPRINT_INTERNAL_COLOR_CONVERSION_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include <gutenprint/curve-cache.h>
+
+typedef enum
+{
+ COLOR_CORRECTION_DEFAULT,
+ COLOR_CORRECTION_UNCORRECTED,
+ COLOR_CORRECTION_BRIGHT,
+ COLOR_CORRECTION_HUE,
+ COLOR_CORRECTION_ACCURATE,
+ COLOR_CORRECTION_THRESHOLD,
+ COLOR_CORRECTION_DESATURATED,
+ COLOR_CORRECTION_DENSITY,
+ COLOR_CORRECTION_RAW,
+ COLOR_CORRECTION_PREDITHERED
+} color_correction_enum_t;
+
+typedef struct
+{
+ const char *name;
+ const char *text;
+ color_correction_enum_t correction;
+ int correct_hsl;
+} color_correction_t;
+
+typedef enum
+{
+ COLOR_WHITE, /* RGB */
+ COLOR_BLACK, /* CMY */
+ COLOR_UNKNOWN /* Printer-specific uninterpreted */
+} color_model_t;
+
+#define CHANNEL_K 0
+#define CHANNEL_C 1
+#define CHANNEL_M 2
+#define CHANNEL_Y 3
+#define CHANNEL_W 4
+#define CHANNEL_R 5
+#define CHANNEL_G 6
+#define CHANNEL_B 7
+#define CHANNEL_MAX 8
+
+#define CMASK_K (1 << CHANNEL_K)
+#define CMASK_C (1 << CHANNEL_C)
+#define CMASK_M (1 << CHANNEL_M)
+#define CMASK_Y (1 << CHANNEL_Y)
+#define CMASK_W (1 << CHANNEL_W)
+#define CMASK_R (1 << CHANNEL_R)
+#define CMASK_G (1 << CHANNEL_G)
+#define CMASK_B (1 << CHANNEL_B)
+#define CMASK_RAW (1 << CHANNEL_MAX)
+
+typedef struct
+{
+ unsigned channel_id;
+ const char *gamma_name;
+ const char *curve_name;
+ const char *rgb_gamma_name;
+ const char *rgb_curve_name;
+} channel_param_t;
+
+/* Color conversion function */
+typedef unsigned (*stp_convert_t)(const stp_vars_t *vars,
+ const unsigned char *in,
+ unsigned short *out);
+
+#define CMASK_NONE (0)
+#define CMASK_RGB (CMASK_R | CMASK_G | CMASK_B)
+#define CMASK_CMY (CMASK_C | CMASK_M | CMASK_Y)
+#define CMASK_CMYK (CMASK_CMY | CMASK_K)
+#define CMASK_ALL (CMASK_CMYK | CMASK_RGB | CMASK_W)
+#define CMASK_EVERY (CMASK_ALL | CMASK_RAW)
+
+typedef enum
+{
+ COLOR_ID_GRAY,
+ COLOR_ID_WHITE,
+ COLOR_ID_RGB,
+ COLOR_ID_CMY,
+ COLOR_ID_CMYK,
+ COLOR_ID_KCMY,
+ COLOR_ID_RAW
+} color_id_t;
+
+typedef struct
+{
+ const char *name;
+ int input;
+ int output;
+ color_id_t color_id;
+ color_model_t color_model;
+ unsigned channels;
+ int channel_count;
+ color_correction_enum_t default_correction;
+ stp_convert_t conversion_function;
+} color_description_t;
+
+typedef struct
+{
+ const char *name;
+ size_t bits;
+} channel_depth_t;
+
+typedef struct
+{
+ unsigned steps;
+ int channel_depth;
+ int image_width;
+ int in_channels;
+ int out_channels;
+ int channels_are_initialized;
+ int invert_output;
+ const color_description_t *input_color_description;
+ const color_description_t *output_color_description;
+ const color_correction_t *color_correction;
+ stp_cached_curve_t brightness_correction;
+ stp_cached_curve_t contrast_correction;
+ stp_cached_curve_t user_color_correction;
+ stp_cached_curve_t channel_curves[STP_CHANNEL_LIMIT];
+ stp_cached_curve_t hue_angle;
+ double gamma_values[STP_CHANNEL_LIMIT];
+ double hue_angles[STP_CHANNEL_LIMIT];
+ double print_gamma;
+ double app_gamma;
+ double screen_gamma;
+ double contrast;
+ double brightness;
+ int linear_contrast_adjustment;
+ int printed_colorfunc;
+ stp_cached_curve_t hue_map;
+ stp_cached_curve_t lum_map;
+ stp_cached_curve_t sat_map;
+ stp_cached_curve_t gcr_curve;
+ unsigned short *gray_tmp; /* Color -> Gray */
+ unsigned short *cmy_tmp; /* CMY -> CMYK */
+ unsigned char *in_data;
+} lut_t;
+
+extern unsigned stpi_color_convert_to_gray(const stp_vars_t *v,
+ const unsigned char *,
+ unsigned short *);
+extern unsigned stpi_color_convert_to_color(const stp_vars_t *v,
+ const unsigned char *,
+ unsigned short *);
+extern unsigned stpi_color_convert_to_kcmy(const stp_vars_t *v,
+ const unsigned char *,
+ unsigned short *);
+extern unsigned stpi_color_convert_raw(const stp_vars_t *v,
+ const unsigned char *,
+ unsigned short *);
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* GUTENPRINT_INTERNAL_COLOR_CONVERSION_H */
diff --git a/src/main/color-conversions.c b/src/main/color-conversions.c
new file mode 100644
index 0000000..2b354c6
--- /dev/null
+++ b/src/main/color-conversions.c
@@ -0,0 +1,2207 @@
+/*
+ * "$Id: color-conversions.c,v 1.18 2005/07/01 01:40:08 rlk Exp $"
+ *
+ * Gimp-Print color management module - traditional Gimp-Print algorithm.
+ *
+ * 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 <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <gutenprint/curve-cache.h>
+#include <math.h>
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#include <string.h>
+#include "color-conversion.h"
+
+#ifdef __GNUC__
+#define inline __inline__
+#endif
+
+/*
+ * 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 <eugene@anikin.com> */
+ {
+ 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 double
+update_saturation(double sat, double adjust, double isat, int bright_colors)
+{
+ if (bright_colors || adjust < 1)
+ sat *= adjust;
+ else if (adjust > 1)
+ {
+ double s1 = sat * adjust;
+ double s2 = 1.0 - ((1.0 - sat) * isat);
+ sat = FMIN(s1, s2);
+ }
+ if (sat > 1)
+ sat = 1.0;
+ return sat;
+}
+
+static inline double
+interpolate_value(const double *vec, double val)
+{
+ double base = floor(val);
+ double frac = val - base;
+ int ibase = (int) base;
+ double lval = vec[ibase];
+ if (frac > 0)
+ lval += (vec[ibase + 1] - lval) * frac;
+ return lval;
+}
+
+static inline void
+update_saturation_from_rgb(unsigned short *rgb,
+ const unsigned short *brightness_lookup,
+ double adjust, double isat, int do_usermap)
+{
+ double h, s, l;
+ calc_rgb_to_hsl(rgb, &h, &s, &l);
+ if (do_usermap)
+ {
+ unsigned short ub = (unsigned short) (l * 65535);
+ unsigned short val = brightness_lookup[ub];
+ l = ((double) val) / 65535;
+ if (val < ub)
+ s = s * (65535 - ub) / (65535 - val);
+ }
+ s = update_saturation(s, adjust, isat, 0);
+ calc_hsl_to_rgb(rgb, h, s, l);
+}
+
+static inline double
+adjust_hue(const double *hue_map, double hue, size_t points)
+{
+ if (hue_map)
+ {
+ hue += interpolate_value(hue_map, hue * points / 6.0);
+ if (hue < 0.0)
+ hue += 6.0;
+ else if (hue >= 6.0)
+ hue -= 6.0;
+ }
+ return hue;
+}
+
+static inline void
+adjust_hsl(unsigned short *rgbout, lut_t *lut, double ssat, double isat,
+ int split_saturation, int adjust_hue_only, int bright_colors)
+{
+ const double *hue_map = CURVE_CACHE_FAST_DOUBLE(&(lut->hue_map));
+ const double *lum_map = CURVE_CACHE_FAST_DOUBLE(&(lut->lum_map));
+ const double *sat_map = CURVE_CACHE_FAST_DOUBLE(&(lut->sat_map));
+ if ((split_saturation || lum_map || hue_map || sat_map) &&
+ (rgbout[0] != rgbout[1] || rgbout[0] != rgbout[2]))
+ {
+ size_t hue_count = CURVE_CACHE_FAST_COUNT(&(lut->hue_map));
+ size_t lum_count = CURVE_CACHE_FAST_COUNT(&(lut->lum_map));
+ size_t sat_count = CURVE_CACHE_FAST_COUNT(&(lut->sat_map));
+ double h, s, l;
+ double oh;
+ rgbout[0] ^= 65535;
+ rgbout[1] ^= 65535;
+ rgbout[2] ^= 65535;
+ calc_rgb_to_hsl(rgbout, &h, &s, &l);
+ s = update_saturation(s, ssat, isat, 0);
+ if (!adjust_hue_only && lut->sat_map.d_cache)
+ {
+ double nh = h * sat_count / 6.0;
+ double tmp = interpolate_value(sat_map, nh);
+ if (tmp < .9999 || tmp > 1.0001)
+ {
+ s = update_saturation(s, tmp, tmp > 1.0 ? 1.0 / tmp : 1.0,
+ bright_colors);
+ }
+ }
+ oh = h;
+ h = adjust_hue(hue_map, h, hue_count);
+ calc_hsl_to_rgb(rgbout, h, s, l);
+
+ if (!adjust_hue_only && s > 0.00001)
+ {
+ /*
+ * Perform luminosity adjustment only on color component.
+ * This way the luminosity of the gray component won't be affected.
+ * We'll add the gray back at the end.
+ */
+
+ unsigned gray = FMIN(rgbout[0], FMIN(rgbout[1], rgbout[2]));
+ int i;
+ /*
+ * Scale the components by the amount of color left.
+ * This way the luminosity calculations will come out right.
+ */
+ if (gray > 0)
+ for (i = 0; i < 3; i++)
+ rgbout[i] = (rgbout[i] - gray) * 65535.0 / (65535 - gray);
+
+ calc_rgb_to_hsl(rgbout, &h, &s, &l);
+ if (lut->lum_map.d_cache && l > 0.00001 && l < .99999)
+ {
+ double nh = oh * lum_count / 6.0;
+ double oel = interpolate_value(lum_map,nh);
+ if (oel <= 1)
+ l *= oel;
+ else
+ {
+ double g1 = pow(l, 1.0 / oel);
+ double g2 = 1.0 - pow(1.0 - l, oel);
+ l = FMIN(g1, g2);
+ }
+ }
+ calc_hsl_to_rgb(rgbout, h, s, l);
+ if (gray > 0)
+ for (i = 0; i < 3; i++)
+ rgbout[i] = gray + (rgbout[i] * (65535 - gray) / 65535.0);
+ }
+
+ rgbout[0] ^= 65535;
+ rgbout[1] ^= 65535;
+ rgbout[2] ^= 65535;
+ }
+}
+
+static inline void
+lookup_rgb(lut_t *lut, unsigned short *rgbout,
+ const unsigned short *red, const unsigned short *green,
+ const unsigned short *blue, unsigned steps)
+{
+ if (steps == 65536)
+ {
+ rgbout[0] = red[rgbout[0]];
+ rgbout[1] = green[rgbout[1]];
+ rgbout[2] = blue[rgbout[2]];
+ }
+ else
+ {
+ rgbout[0] = red[rgbout[0] / 257];
+ rgbout[1] = green[rgbout[1] / 257];
+ rgbout[2] = blue[rgbout[2] / 257];
+ }
+}
+
+static inline int
+short_eq(const unsigned short *i1, const unsigned short *i2, size_t count)
+{
+#if 1
+ int i;
+ for (i = 0; i < count; i++)
+ if (i1[i] != i2[i])
+ return 0;
+ return 1;
+#else
+ return !memcmp(i1, i2, count * sizeof(unsigned short));
+#endif
+}
+
+static inline void
+short_copy(unsigned short *out, const unsigned short *in, size_t count)
+{
+#if 1
+ int i;
+ for (i = 0; i < count; i++)
+ out[i] = in[i];
+#else
+ (void) memcpy(out, in, count * sizeof(unsigned short));
+#endif
+}
+
+static unsigned
+generic_cmy_to_kcmy(const stp_vars_t *vars, const unsigned short *in,
+ unsigned short *out)
+{
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color"));
+ int width = lut->image_width;
+ int step = 65535 / (lut->steps - 1); /* 1 or 257 */
+
+ const unsigned short *gcr_lookup;
+ const unsigned short *black_lookup;
+ int i;
+ int i0 = -1;
+ int i1 = -1;
+ int i2 = -1;
+ unsigned short o0 = 0;
+ unsigned short o1 = 0;
+ unsigned short o2 = 0;
+ unsigned short o3 = 0;
+ unsigned short nz0 = 0;
+ unsigned short nz1 = 0;
+ unsigned short nz2 = 0;
+ unsigned short nz3 = 0;
+
+ stp_curve_resample(stp_curve_cache_get_curve(&(lut->gcr_curve)), lut->steps);
+ gcr_lookup = stp_curve_cache_get_ushort_data(&(lut->gcr_curve));
+ stp_curve_resample(stp_curve_cache_get_curve
+ (&(lut->channel_curves[CHANNEL_K])), lut->steps);
+ black_lookup =
+ stp_curve_cache_get_ushort_data(&(lut->channel_curves[CHANNEL_K]));
+
+ for (i = 0; i < width; i++, out += 4, in += 3)
+ {
+ if (i0 == in[0] && i1 == in[1] && i2 == in[2])
+ {
+ out[0] = o0;
+ out[1] = o1;
+ out[2] = o2;
+ out[3] = o3;
+ }
+ else
+ {
+ int k;
+ i0 = in[0];
+ i1 = in[1];
+ i2 = in[2];
+ k = FMIN(i0, FMIN(i1, i2));
+ out[0] = 0;
+ out[1] = i0;
+ out[2] = i1;
+ out[3] = i2;
+ if (k > 0)
+ {
+ int where, resid;
+ int kk;
+ if (lut->steps == 65536)
+ kk = gcr_lookup[k];
+ else
+ {
+ where = k / step;
+ resid = k % step;
+ kk = gcr_lookup[where];
+ if (resid > 0)
+ kk += (gcr_lookup[where + 1] - gcr_lookup[where]) * resid /
+ step;
+ }
+ if (kk > k)
+ kk = k;
+ if (kk > 0)
+ {
+ if (lut->steps == 65536)
+ out[0] = black_lookup[kk];
+ else
+ {
+ int k_out;
+ where = kk / step;
+ resid = kk % step;
+ k_out = black_lookup[where];
+ if (resid > 0)
+ k_out +=
+ (black_lookup[where + 1] - black_lookup[where]) *
+ resid / step;
+ out[0] = k_out;
+ }
+ out[1] -= kk;
+ out[2] -= kk;
+ out[3] -= kk;
+ }
+ }
+ o0 = out[0];
+ o1 = out[1];
+ o2 = out[2];
+ o3 = out[3];
+ nz0 |= o0;
+ nz1 |= o1;
+ nz2 |= o2;
+ nz3 |= o3;
+ }
+ }
+ return (nz0 ? 0 : 1) + (nz1 ? 0 : 2) + (nz2 ? 0 : 4) + (nz3 ? 0 : 8);
+}
+
+static unsigned
+raw_cmy_to_kcmy(const stp_vars_t *vars, const unsigned short *in,
+ unsigned short *out)
+{
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color"));
+ int width = lut->image_width;
+
+ int i;
+ int j;
+ unsigned short nz[4];
+ unsigned retval = 0;
+ const unsigned short *input_cache = NULL;
+ const unsigned short *output_cache = NULL;
+
+ memset(nz, 0, sizeof(nz));
+
+ for (i = 0; i < width; i++, out += 4, in += 3)
+ {
+ if (input_cache && short_eq(input_cache, in, 3))
+ short_copy(out, output_cache, 4);
+ else
+ {
+ int c = in[0];
+ int m = in[1];
+ int y = in[2];
+ int k = FMIN(c, FMIN(m, y));
+ input_cache = in;
+ out[0] = 0;
+ for (j = 0; j < 3; j++)
+ out[j + 1] = in[j];
+ if (k > 0)
+ {
+ out[0] = k;
+ out[1] -= k;
+ out[2] -= k;
+ out[3] -= k;
+ }
+ output_cache = out;
+ for (j = 0; j < 4; j++)
+ if (out[j])
+ nz[j] = 1;
+ }
+ }
+ for (j = 0; j < 4; j++)
+ if (nz[j] == 0)
+ retval |= (1 << j);
+ return retval;
+}
+
+#define GENERIC_COLOR_FUNC(fromname, toname) \
+static unsigned \
+fromname##_to_##toname(const stp_vars_t *vars, const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ if (!lut->printed_colorfunc) \
+ { \
+ lut->printed_colorfunc = 1; \
+ stp_dprintf(STP_DBG_COLORFUNC, vars, \
+ "Colorfunc is %s_%d_to_%s, %s, %s, %d, %d\n", \
+ #fromname, lut->channel_depth, #toname, \
+ lut->input_color_description->name, \
+ lut->output_color_description->name, \
+ lut->steps, lut->invert_output); \
+ } \
+ if (lut->channel_depth == 8) \
+ return fromname##_8_to_##toname(vars, in, out); \
+ else \
+ return fromname##_16_to_##toname(vars, in, out); \
+}
+
+#define COLOR_TO_COLOR_FUNC(T, bits) \
+static unsigned \
+color_##bits##_to_color(const stp_vars_t *vars, const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ double isat = 1.0; \
+ double ssat = stp_get_float_parameter(vars, "Saturation"); \
+ double sbright = stp_get_float_parameter(vars, "Brightness"); \
+ int i0 = -1; \
+ int i1 = -1; \
+ int i2 = -1; \
+ unsigned short o0 = 0; \
+ unsigned short o1 = 0; \
+ unsigned short o2 = 0; \
+ unsigned short nz0 = 0; \
+ unsigned short nz1 = 0; \
+ unsigned short nz2 = 0; \
+ const unsigned short *red; \
+ const unsigned short *green; \
+ const unsigned short *blue; \
+ const unsigned short *brightness; \
+ const unsigned short *contrast; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ int compute_saturation = ssat <= .99999 || ssat >= 1.00001; \
+ int split_saturation = ssat > 1.4; \
+ int bright_color_adjustment = 0; \
+ int hue_only_color_adjustment = 0; \
+ int do_user_adjustment = 0; \
+ if (lut->color_correction->correction == COLOR_CORRECTION_BRIGHT) \
+ bright_color_adjustment = 1; \
+ if (lut->color_correction->correction == COLOR_CORRECTION_HUE) \
+ hue_only_color_adjustment = 1; \
+ if (sbright != 1) \
+ do_user_adjustment = 1; \
+ compute_saturation |= do_user_adjustment; \
+ \
+ for (i = CHANNEL_C; i <= CHANNEL_Y; i++) \
+ stp_curve_resample(stp_curve_cache_get_curve(&(lut->channel_curves[i])), \
+ 1 << bits); \
+ stp_curve_resample \
+ (stp_curve_cache_get_curve(&(lut->brightness_correction)), 65536); \
+ stp_curve_resample \
+ (stp_curve_cache_get_curve(&(lut->contrast_correction)), 1 << bits); \
+ red = \
+ stp_curve_cache_get_ushort_data(&(lut->channel_curves[CHANNEL_C])); \
+ green = \
+ stp_curve_cache_get_ushort_data(&(lut->channel_curves[CHANNEL_M])); \
+ blue = \
+ stp_curve_cache_get_ushort_data(&(lut->channel_curves[CHANNEL_Y])); \
+ brightness= \
+ stp_curve_cache_get_ushort_data(&(lut->brightness_correction)); \
+ contrast = \
+ stp_curve_cache_get_ushort_data(&(lut->contrast_correction)); \
+ (void) stp_curve_cache_get_double_data(&(lut->hue_map)); \
+ (void) stp_curve_cache_get_double_data(&(lut->lum_map)); \
+ (void) stp_curve_cache_get_double_data(&(lut->sat_map)); \
+ \
+ if (split_saturation) \
+ ssat = sqrt(ssat); \
+ if (ssat > 1) \
+ isat = 1.0 / ssat; \
+ for (i = 0; i < lut->image_width; i++) \
+ { \
+ if (i0 == s_in[0] && i1 == s_in[1] && i2 == s_in[2]) \
+ { \
+ out[0] = o0; \
+ out[1] = o1; \
+ out[2] = o2; \
+ } \
+ else \
+ { \
+ i0 = s_in[0]; \
+ i1 = s_in[1]; \
+ i2 = s_in[2]; \
+ out[0] = i0 * (65535u / (unsigned) ((1 << bits) - 1)); \
+ out[1] = i1 * (65535u / (unsigned) ((1 << bits) - 1)); \
+ out[2] = i2 * (65535u / (unsigned) ((1 << bits) - 1)); \
+ lookup_rgb(lut, out, contrast, contrast, contrast, 1 << bits); \
+ if ((compute_saturation)) \
+ update_saturation_from_rgb(out, brightness, ssat, isat, \
+ do_user_adjustment); \
+ adjust_hsl(out, lut, ssat, isat, split_saturation, \
+ hue_only_color_adjustment, bright_color_adjustment); \
+ lookup_rgb(lut, out, red, green, blue, 1 << bits); \
+ o0 = out[0]; \
+ o1 = out[1]; \
+ o2 = out[2]; \
+ nz0 |= o0; \
+ nz1 |= o1; \
+ nz2 |= o2; \
+ } \
+ s_in += 3; \
+ out += 3; \
+ } \
+ return (nz0 ? 0 : 1) + (nz1 ? 0 : 2) + (nz2 ? 0 : 4); \
+}
+
+COLOR_TO_COLOR_FUNC(unsigned char, 8)
+COLOR_TO_COLOR_FUNC(unsigned short, 16)
+GENERIC_COLOR_FUNC(color, color)
+
+/*
+ * 'rgb_to_rgb()' - Convert rgb image data to RGB.
+ */
+
+#define FAST_COLOR_TO_COLOR_FUNC(T, bits) \
+static unsigned \
+color_##bits##_to_color_fast(const stp_vars_t *vars, const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int i0 = -1; \
+ int i1 = -1; \
+ int i2 = -1; \
+ int o0 = 0; \
+ int o1 = 0; \
+ int o2 = 0; \
+ int nz0 = 0; \
+ int nz1 = 0; \
+ int nz2 = 0; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ const unsigned short *red; \
+ const unsigned short *green; \
+ const unsigned short *blue; \
+ const unsigned short *brightness; \
+ const unsigned short *contrast; \
+ double isat = 1.0; \
+ double saturation = stp_get_float_parameter(vars, "Saturation"); \
+ double sbright = stp_get_float_parameter(vars, "Brightness"); \
+ int compute_saturation = saturation <= .99999 || saturation >= 1.00001; \
+ int do_user_adjustment = 0; \
+ if (sbright != 1) \
+ do_user_adjustment = 1; \
+ compute_saturation |= do_user_adjustment; \
+ \
+ for (i = CHANNEL_C; i <= CHANNEL_Y; i++) \
+ stp_curve_resample(lut->channel_curves[i].curve, 65536); \
+ stp_curve_resample \
+ (stp_curve_cache_get_curve(&(lut->brightness_correction)), 65536); \
+ stp_curve_resample \
+ (stp_curve_cache_get_curve(&(lut->contrast_correction)), 1 << bits); \
+ red = \
+ stp_curve_cache_get_ushort_data(&(lut->channel_curves[CHANNEL_C])); \
+ green = \
+ stp_curve_cache_get_ushort_data(&(lut->channel_curves[CHANNEL_M])); \
+ blue = \
+ stp_curve_cache_get_ushort_data(&(lut->channel_curves[CHANNEL_Y])); \
+ brightness= \
+ stp_curve_cache_get_ushort_data(&(lut->brightness_correction)); \
+ contrast = \
+ stp_curve_cache_get_ushort_data(&(lut->contrast_correction)); \
+ \
+ if (saturation > 1) \
+ isat = 1.0 / saturation; \
+ for (i = 0; i < lut->image_width; i++) \
+ { \
+ if (i0 == s_in[0] && i1 == s_in[1] && i2 == s_in[2]) \
+ { \
+ out[0] = o0; \
+ out[1] = o1; \
+ out[2] = o2; \
+ } \
+ else \
+ { \
+ i0 = s_in[0]; \
+ i1 = s_in[1]; \
+ i2 = s_in[2]; \
+ out[0] = contrast[s_in[0]]; \
+ out[1] = contrast[s_in[1]]; \
+ out[2] = contrast[s_in[2]]; \
+ if ((compute_saturation)) \
+ update_saturation_from_rgb(out, brightness, saturation, isat, 1); \
+ out[0] = red[out[0]]; \
+ out[1] = green[out[1]]; \
+ out[2] = blue[out[2]]; \
+ o0 = out[0]; \
+ o1 = out[1]; \
+ o2 = out[2]; \
+ nz0 |= o0; \
+ nz1 |= o1; \
+ nz2 |= o2; \
+ } \
+ s_in += 3; \
+ out += 3; \
+ } \
+ return (nz0 ? 0 : 1) + (nz1 ? 0 : 2) + (nz2 ? 0 : 4); \
+}
+
+FAST_COLOR_TO_COLOR_FUNC(unsigned char, 8)
+FAST_COLOR_TO_COLOR_FUNC(unsigned short, 16)
+GENERIC_COLOR_FUNC(color, color_fast)
+
+#define RAW_COLOR_TO_COLOR_FUNC(T, bits) \
+static unsigned \
+color_##bits##_to_color_raw(const stp_vars_t *vars, const unsigned char *in,\
+ unsigned short *out) \
+{ \
+ int i; \
+ int j; \
+ int nz = 0; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ unsigned mask = 0; \
+ if (lut->invert_output) \
+ mask = 0xffff; \
+ \
+ for (i = 0; i < lut->image_width; i++) \
+ { \
+ unsigned bit = 1; \
+ for (j = 0; j < 3; j++, bit += bit) \
+ { \
+ out[j] = (s_in[j] * (65535 / ((1 << bits) - 1))) ^ mask; \
+ if (out[j]) \
+ nz |= bit; \
+ } \
+ s_in += 3; \
+ out += 3; \
+ } \
+ return nz; \
+}
+
+RAW_COLOR_TO_COLOR_FUNC(unsigned char, 8)
+RAW_COLOR_TO_COLOR_FUNC(unsigned short, 16)
+GENERIC_COLOR_FUNC(color, color_raw)
+
+/*
+ * 'gray_to_rgb()' - Convert gray image data to RGB.
+ */
+
+#define GRAY_TO_COLOR_FUNC(T, bits) \
+static unsigned \
+gray_##bits##_to_color(const stp_vars_t *vars, const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int i0 = -1; \
+ int o0 = 0; \
+ int o1 = 0; \
+ int o2 = 0; \
+ int nz0 = 0; \
+ int nz1 = 0; \
+ int nz2 = 0; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ const unsigned short *red; \
+ const unsigned short *green; \
+ const unsigned short *blue; \
+ const unsigned short *user; \
+ \
+ for (i = CHANNEL_C; i <= CHANNEL_Y; i++) \
+ stp_curve_resample(lut->channel_curves[i].curve, 65536); \
+ stp_curve_resample \
+ (stp_curve_cache_get_curve(&(lut->user_color_correction)), 1 << bits); \
+ red = \
+ stp_curve_cache_get_ushort_data(&(lut->channel_curves[CHANNEL_C])); \
+ green = \
+ stp_curve_cache_get_ushort_data(&(lut->channel_curves[CHANNEL_M])); \
+ blue = \
+ stp_curve_cache_get_ushort_data(&(lut->channel_curves[CHANNEL_Y])); \
+ user = \
+ stp_curve_cache_get_ushort_data(&(lut->user_color_correction)); \
+ \
+ for (i = 0; i < lut->image_width; i++) \
+ { \
+ if (i0 == s_in[0]) \
+ { \
+ out[0] = o0; \
+ out[1] = o1; \
+ out[2] = o2; \
+ } \
+ else \
+ { \
+ i0 = s_in[0]; \
+ out[0] = red[user[s_in[0]]]; \
+ out[1] = green[user[s_in[0]]]; \
+ out[2] = blue[user[s_in[0]]]; \
+ o0 = out[0]; \
+ o1 = out[1]; \
+ o2 = out[2]; \
+ nz0 |= o0; \
+ nz1 |= o1; \
+ nz2 |= o2; \
+ } \
+ s_in += 1; \
+ out += 3; \
+ } \
+ return (nz0 ? 0 : 1) + (nz1 ? 0 : 2) + (nz2 ? 0 : 4); \
+}
+
+GRAY_TO_COLOR_FUNC(unsigned char, 8)
+GRAY_TO_COLOR_FUNC(unsigned short, 16)
+GENERIC_COLOR_FUNC(gray, color)
+
+#define GRAY_TO_COLOR_RAW_FUNC(T, bits) \
+static unsigned \
+gray_##bits##_to_color_raw(const stp_vars_t *vars, const unsigned char *in,\
+ unsigned short *out) \
+{ \
+ int i; \
+ int nz = 7; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ unsigned mask = 0; \
+ if (lut->invert_output) \
+ mask = 0xffff; \
+ \
+ for (i = 0; i < lut->image_width; i++) \
+ { \
+ unsigned outval = (s_in[0] * (65535 / (1 << bits))) ^ mask; \
+ out[0] = outval; \
+ out[1] = outval; \
+ out[2] = outval; \
+ if (outval) \
+ nz = 0; \
+ s_in++; \
+ out += 3; \
+ } \
+ return nz; \
+}
+
+GRAY_TO_COLOR_RAW_FUNC(unsigned char, 8)
+GRAY_TO_COLOR_RAW_FUNC(unsigned short, 16)
+GENERIC_COLOR_FUNC(gray, color_raw)
+
+#define COLOR_TO_KCMY_FUNC(name, name2, name3, name4, bits) \
+static unsigned \
+name##_##bits##_to_##name2(const stp_vars_t *vars, const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ size_t real_steps = lut->steps; \
+ unsigned status; \
+ if (!lut->cmy_tmp) \
+ lut->cmy_tmp = stp_malloc(4 * 2 * lut->image_width); \
+ name##_##bits##_to_##name3(vars, in, lut->cmy_tmp); \
+ lut->steps = 65536; \
+ status = name4##_cmy_to_kcmy(vars, lut->cmy_tmp, out); \
+ lut->steps = real_steps; \
+ return status; \
+}
+
+COLOR_TO_KCMY_FUNC(gray, kcmy, color, generic, 8)
+COLOR_TO_KCMY_FUNC(gray, kcmy, color, generic, 16)
+GENERIC_COLOR_FUNC(gray, kcmy)
+
+COLOR_TO_KCMY_FUNC(gray, kcmy_raw, color_raw, raw, 8)
+COLOR_TO_KCMY_FUNC(gray, kcmy_raw, color_raw, raw, 16)
+GENERIC_COLOR_FUNC(gray, kcmy_raw)
+
+COLOR_TO_KCMY_FUNC(color, kcmy, color, generic, 8)
+COLOR_TO_KCMY_FUNC(color, kcmy, color, generic, 16)
+GENERIC_COLOR_FUNC(color, kcmy)
+
+COLOR_TO_KCMY_FUNC(color, kcmy_fast, color_fast, generic, 8)
+COLOR_TO_KCMY_FUNC(color, kcmy_fast, color_fast, generic, 16)
+GENERIC_COLOR_FUNC(color, kcmy_fast)
+
+COLOR_TO_KCMY_FUNC(color, kcmy_raw, color_raw, raw, 8)
+COLOR_TO_KCMY_FUNC(color, kcmy_raw, color_raw, raw, 16)
+GENERIC_COLOR_FUNC(color, kcmy_raw)
+
+
+#define COLOR_TO_KCMY_THRESHOLD_FUNC(T, name) \
+static unsigned \
+name##_to_kcmy_threshold(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int z = 15; \
+ const T *s_in = (const T *) in; \
+ unsigned high_bit = ((1 << ((sizeof(T) * 8) - 1))); \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ int width = lut->image_width; \
+ unsigned mask = 0; \
+ memset(out, 0, width * 4 * sizeof(unsigned short)); \
+ if (lut->invert_output) \
+ mask = (1 << (sizeof(T) * 8)) - 1; \
+ \
+ for (i = 0; i < width; i++, out += 4, s_in += 3) \
+ { \
+ unsigned c = s_in[0] ^ mask; \
+ unsigned m = s_in[1] ^ mask; \
+ unsigned y = s_in[2] ^ mask; \
+ unsigned k = (c < m ? (c < y ? c : y) : (m < y ? m : y)); \
+ if (k >= high_bit) \
+ { \
+ c -= k; \
+ m -= k; \
+ y -= k; \
+ } \
+ if (k >= high_bit) \
+ { \
+ z &= 0xe; \
+ out[0] = 65535; \
+ } \
+ if (c >= high_bit) \
+ { \
+ z &= 0xd; \
+ out[1] = 65535; \
+ } \
+ if (m >= high_bit) \
+ { \
+ z &= 0xb; \
+ out[2] = 65535; \
+ } \
+ if (y >= high_bit) \
+ { \
+ z &= 0x7; \
+ out[3] = 65535; \
+ } \
+ } \
+ return z; \
+}
+
+COLOR_TO_KCMY_THRESHOLD_FUNC(unsigned char, color_8)
+COLOR_TO_KCMY_THRESHOLD_FUNC(unsigned short, color_16)
+GENERIC_COLOR_FUNC(color, kcmy_threshold)
+
+#define CMYK_TO_KCMY_THRESHOLD_FUNC(T, name) \
+static unsigned \
+name##_to_kcmy_threshold(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int z = 15; \
+ const T *s_in = (const T *) in; \
+ unsigned desired_high_bit = 0; \
+ unsigned high_bit = 1 << ((sizeof(T) * 8) - 1); \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ int width = lut->image_width; \
+ memset(out, 0, width * 4 * sizeof(unsigned short)); \
+ if (!lut->invert_output) \
+ desired_high_bit = high_bit; \
+ \
+ for (i = 0; i < width; i++, out += 4, s_in += 4) \
+ { \
+ if ((s_in[3] & high_bit) == desired_high_bit) \
+ { \
+ z &= 0xe; \
+ out[0] = 65535; \
+ } \
+ if ((s_in[0] & high_bit) == desired_high_bit) \
+ { \
+ z &= 0xd; \
+ out[1] = 65535; \
+ } \
+ if ((s_in[1] & high_bit) == desired_high_bit) \
+ { \
+ z &= 0xb; \
+ out[2] = 65535; \
+ } \
+ if ((s_in[2] & high_bit) == desired_high_bit) \
+ { \
+ z &= 0x7; \
+ out[3] = 65535; \
+ } \
+ } \
+ return z; \
+}
+
+CMYK_TO_KCMY_THRESHOLD_FUNC(unsigned char, cmyk_8)
+CMYK_TO_KCMY_THRESHOLD_FUNC(unsigned short, cmyk_16)
+GENERIC_COLOR_FUNC(cmyk, kcmy_threshold)
+
+#define KCMY_TO_KCMY_THRESHOLD_FUNC(T, name) \
+static unsigned \
+name##_to_kcmy_threshold(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int j; \
+ unsigned nz[4]; \
+ unsigned z = 0xf; \
+ const T *s_in = (const T *) in; \
+ unsigned desired_high_bit = 0; \
+ unsigned high_bit = 1 << ((sizeof(T) * 8) - 1); \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ int width = lut->image_width; \
+ memset(out, 0, width * 4 * sizeof(unsigned short)); \
+ if (!lut->invert_output) \
+ desired_high_bit = high_bit; \
+ for (i = 0; i < 4; i++) \
+ nz[i] = z & ~(1 << i); \
+ \
+ for (i = 0; i < width; i++) \
+ { \
+ for (j = 0; j < 4; j++) \
+ { \
+ if ((*s_in++ & high_bit) == desired_high_bit) \
+ { \
+ z &= nz[j]; \
+ *out = 65535; \
+ } \
+ out++; \
+ } \
+ } \
+ return z; \
+}
+
+KCMY_TO_KCMY_THRESHOLD_FUNC(unsigned char, kcmy_8)
+KCMY_TO_KCMY_THRESHOLD_FUNC(unsigned short, kcmy_16)
+GENERIC_COLOR_FUNC(kcmy, kcmy_threshold)
+
+#define GRAY_TO_COLOR_THRESHOLD_FUNC(T, name, bits, channels) \
+static unsigned \
+gray_##bits##_to_##name##_threshold(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int z = (1 << channels) - 1; \
+ int desired_high_bit = 0; \
+ unsigned high_bit = 1 << ((sizeof(T) * 8) - 1); \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ int width = lut->image_width; \
+ memset(out, 0, width * channels * sizeof(unsigned short)); \
+ if (!lut->invert_output) \
+ desired_high_bit = high_bit; \
+ \
+ for (i = 0; i < width; i++, out += channels, s_in++) \
+ { \
+ if ((s_in[0] & high_bit) == desired_high_bit) \
+ { \
+ int j; \
+ z = 0; \
+ for (j = 0; j < channels; j++) \
+ out[j] = 65535; \
+ } \
+ } \
+ return z; \
+}
+
+
+GRAY_TO_COLOR_THRESHOLD_FUNC(unsigned char, color, 8, 3)
+GRAY_TO_COLOR_THRESHOLD_FUNC(unsigned short, color, 16, 3)
+GENERIC_COLOR_FUNC(gray, color_threshold)
+
+GRAY_TO_COLOR_THRESHOLD_FUNC(unsigned char, kcmy, 8, 4)
+GRAY_TO_COLOR_THRESHOLD_FUNC(unsigned short, kcmy, 16, 4)
+GENERIC_COLOR_FUNC(gray, kcmy_threshold)
+
+#define COLOR_TO_COLOR_THRESHOLD_FUNC(T, name) \
+static unsigned \
+name##_to_color_threshold(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int z = 7; \
+ int desired_high_bit = 0; \
+ unsigned high_bit = ((1 << ((sizeof(T) * 8) - 1)) * 4); \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ int width = lut->image_width; \
+ memset(out, 0, width * 3 * sizeof(unsigned short)); \
+ if (!lut->invert_output) \
+ desired_high_bit = high_bit; \
+ \
+ for (i = 0; i < width; i++, out += 3, s_in += 3) \
+ { \
+ if ((s_in[0] & high_bit) == desired_high_bit) \
+ { \
+ z &= 6; \
+ out[0] = 65535; \
+ } \
+ if ((s_in[1] & high_bit) == desired_high_bit) \
+ { \
+ z &= 5; \
+ out[1] = 65535; \
+ } \
+ if ((s_in[1] & high_bit) == desired_high_bit) \
+ { \
+ z &= 3; \
+ out[2] = 65535; \
+ } \
+ } \
+ return z; \
+}
+
+COLOR_TO_COLOR_THRESHOLD_FUNC(unsigned char, color_8)
+COLOR_TO_COLOR_THRESHOLD_FUNC(unsigned short, color_16)
+GENERIC_COLOR_FUNC(color, color_threshold)
+
+#define COLOR_TO_GRAY_THRESHOLD_FUNC(T, name, channels, max_channels) \
+static unsigned \
+name##_to_gray_threshold(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int z = 1; \
+ int desired_high_bit = 0; \
+ unsigned high_bit = ((1 << ((sizeof(T) * 8) - 1))); \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ int width = lut->image_width; \
+ memset(out, 0, width * sizeof(unsigned short)); \
+ if (!lut->invert_output) \
+ desired_high_bit = high_bit; \
+ \
+ for (i = 0; i < width; i++, out++, s_in += channels) \
+ { \
+ unsigned gval = \
+ (max_channels - channels) * (1 << ((sizeof(T) * 8) - 1)); \
+ int j; \
+ for (j = 0; j < channels; j++) \
+ gval += s_in[j]; \
+ gval /= channels; \
+ if ((gval & high_bit) == desired_high_bit) \
+ { \
+ out[0] = 65535; \
+ z = 0; \
+ } \
+ } \
+ return z; \
+}
+
+COLOR_TO_GRAY_THRESHOLD_FUNC(unsigned char, cmyk_8, 4, 4)
+COLOR_TO_GRAY_THRESHOLD_FUNC(unsigned short, cmyk_16, 4, 4)
+GENERIC_COLOR_FUNC(cmyk, gray_threshold)
+
+COLOR_TO_GRAY_THRESHOLD_FUNC(unsigned char, kcmy_8, 4, 4)
+COLOR_TO_GRAY_THRESHOLD_FUNC(unsigned short, kcmy_16, 4, 4)
+GENERIC_COLOR_FUNC(kcmy, gray_threshold)
+
+COLOR_TO_GRAY_THRESHOLD_FUNC(unsigned char, color_8, 3, 3)
+COLOR_TO_GRAY_THRESHOLD_FUNC(unsigned short, color_16, 3, 3)
+GENERIC_COLOR_FUNC(color, gray_threshold)
+
+COLOR_TO_GRAY_THRESHOLD_FUNC(unsigned char, gray_8, 1, 1)
+COLOR_TO_GRAY_THRESHOLD_FUNC(unsigned short, gray_16, 1, 1)
+GENERIC_COLOR_FUNC(gray, gray_threshold)
+
+#define CMYK_TO_COLOR_FUNC(namein, name2, T, bits, offset) \
+static unsigned \
+namein##_##bits##_to_##name2(const stp_vars_t *vars, const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ unsigned status; \
+ size_t real_steps = lut->steps; \
+ const T *s_in = (const T *) in; \
+ unsigned short *tmp; \
+ int width = lut->image_width; \
+ unsigned mask = 0; \
+ \
+ if (!lut->cmy_tmp) \
+ lut->cmy_tmp = stp_malloc(3 * 2 * lut->image_width); \
+ tmp = lut->cmy_tmp; \
+ memset(lut->cmy_tmp, 0, width * 3 * sizeof(unsigned short)); \
+ if (lut->invert_output) \
+ mask = 0xffff; \
+ \
+ for (i = 0; i < width; i++, tmp += 3, s_in += 4) \
+ { \
+ unsigned c = (s_in[0 + offset] + s_in[(3 + offset) % 4]) * \
+ (65535 / ((1 << bits) - 1)); \
+ unsigned m = (s_in[1 + offset] + s_in[(3 + offset) % 4]) * \
+ (65535 / ((1 << bits) - 1)); \
+ unsigned y = (s_in[2 + offset] + s_in[(3 + offset) % 4]) * \
+ (65535 / ((1 << bits) - 1)); \
+ if (c > 65535) \
+ c = 65535; \
+ if (m > 65535) \
+ m = 65535; \
+ if (y > 65535) \
+ y = 65535; \
+ tmp[0] = c ^ mask; \
+ tmp[1] = m ^ mask; \
+ tmp[2] = y ^ mask; \
+ } \
+ lut->steps = 65536; \
+ status = \
+ color_16_to_##name2(vars, (const unsigned char *) lut->cmy_tmp, out); \
+ lut->steps = real_steps; \
+ return status; \
+}
+
+CMYK_TO_COLOR_FUNC(cmyk, color, unsigned char, 8, 0)
+CMYK_TO_COLOR_FUNC(cmyk, color, unsigned short, 16, 0)
+GENERIC_COLOR_FUNC(cmyk, color)
+CMYK_TO_COLOR_FUNC(kcmy, color, unsigned char, 8, 1)
+CMYK_TO_COLOR_FUNC(kcmy, color, unsigned short, 16, 1)
+GENERIC_COLOR_FUNC(kcmy, color)
+CMYK_TO_COLOR_FUNC(cmyk, color_threshold, unsigned char, 8, 0)
+CMYK_TO_COLOR_FUNC(cmyk, color_threshold, unsigned short, 16, 0)
+GENERIC_COLOR_FUNC(cmyk, color_threshold)
+CMYK_TO_COLOR_FUNC(kcmy, color_threshold, unsigned char, 8, 1)
+CMYK_TO_COLOR_FUNC(kcmy, color_threshold, unsigned short, 16, 1)
+GENERIC_COLOR_FUNC(kcmy, color_threshold)
+CMYK_TO_COLOR_FUNC(cmyk, color_fast, unsigned char, 8, 0)
+CMYK_TO_COLOR_FUNC(cmyk, color_fast, unsigned short, 16, 0)
+GENERIC_COLOR_FUNC(cmyk, color_fast)
+CMYK_TO_COLOR_FUNC(kcmy, color_fast, unsigned char, 8, 1)
+CMYK_TO_COLOR_FUNC(kcmy, color_fast, unsigned short, 16, 1)
+GENERIC_COLOR_FUNC(kcmy, color_fast)
+CMYK_TO_COLOR_FUNC(cmyk, color_raw, unsigned char, 8, 0)
+CMYK_TO_COLOR_FUNC(cmyk, color_raw, unsigned short, 16, 0)
+GENERIC_COLOR_FUNC(cmyk, color_raw)
+CMYK_TO_COLOR_FUNC(kcmy, color_raw, unsigned char, 8, 1)
+CMYK_TO_COLOR_FUNC(kcmy, color_raw, unsigned short, 16, 1)
+GENERIC_COLOR_FUNC(kcmy, color_raw)
+
+#define CMYK_TO_KCMY_FUNC(T, size) \
+static unsigned \
+cmyk_##size##_to_kcmy(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ unsigned retval = 0; \
+ int j; \
+ int nz[4]; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ const unsigned short *user; \
+ const unsigned short *maps[4]; \
+ \
+ for (i = 0; i < 4; i++) \
+ { \
+ stp_curve_resample(lut->channel_curves[i].curve, 65536); \
+ maps[i] = stp_curve_cache_get_ushort_data(&(lut->channel_curves[i])); \
+ } \
+ stp_curve_resample(lut->user_color_correction.curve, 1 << size); \
+ user = stp_curve_cache_get_ushort_data(&(lut->user_color_correction)); \
+ \
+ memset(nz, 0, sizeof(nz)); \
+ \
+ for (i = 0; i < lut->image_width; i++, out += 4) \
+ { \
+ for (j = 0; j < 4; j++) \
+ { \
+ int outpos = (j + 1) & 3; \
+ int inval = *s_in++; \
+ nz[outpos] |= inval; \
+ out[outpos] = maps[outpos][user[inval]]; \
+ } \
+ } \
+ for (j = 0; j < 4; j++) \
+ if (nz[j] == 0) \
+ retval |= (1 << j); \
+ return retval; \
+}
+
+CMYK_TO_KCMY_FUNC(unsigned char, 8)
+CMYK_TO_KCMY_FUNC(unsigned short, 16)
+GENERIC_COLOR_FUNC(cmyk, kcmy)
+
+#define KCMY_TO_KCMY_FUNC(T, size) \
+static unsigned \
+kcmy_##size##_to_kcmy(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ unsigned retval = 0; \
+ int j; \
+ int nz[4]; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ const unsigned short *user; \
+ const unsigned short *maps[4]; \
+ \
+ for (i = 0; i < 4; i++) \
+ { \
+ stp_curve_resample(lut->channel_curves[i].curve, 65536); \
+ maps[i] = stp_curve_cache_get_ushort_data(&(lut->channel_curves[i])); \
+ } \
+ stp_curve_resample(lut->user_color_correction.curve, 1 << size); \
+ user = stp_curve_cache_get_ushort_data(&(lut->user_color_correction)); \
+ \
+ memset(nz, 0, sizeof(nz)); \
+ \
+ for (i = 0; i < lut->image_width; i++, out += 4) \
+ { \
+ for (j = 0; j < 4; j++) \
+ { \
+ int inval = *s_in++; \
+ nz[j] |= inval; \
+ out[j] = maps[j][user[inval]]; \
+ } \
+ } \
+ for (j = 0; j < 4; j++) \
+ if (nz[j] == 0) \
+ retval |= (1 << j); \
+ return retval; \
+}
+
+KCMY_TO_KCMY_FUNC(unsigned char, 8)
+KCMY_TO_KCMY_FUNC(unsigned short, 16)
+GENERIC_COLOR_FUNC(kcmy, kcmy)
+
+
+#define GRAY_TO_GRAY_FUNC(T, bits) \
+static unsigned \
+gray_##bits##_to_gray(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int i0 = -1; \
+ int o0 = 0; \
+ int nz = 0; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ int width = lut->image_width; \
+ const unsigned short *composite; \
+ const unsigned short *user; \
+ \
+ stp_curve_resample \
+ (stp_curve_cache_get_curve(&(lut->channel_curves[CHANNEL_K])), 65536); \
+ composite = \
+ stp_curve_cache_get_ushort_data(&(lut->channel_curves[CHANNEL_K])); \
+ stp_curve_resample(lut->user_color_correction.curve, 1 << bits); \
+ user = stp_curve_cache_get_ushort_data(&(lut->user_color_correction)); \
+ \
+ memset(out, 0, width * sizeof(unsigned short)); \
+ \
+ for (i = 0; i < lut->image_width; i++) \
+ { \
+ if (i0 != s_in[0]) \
+ { \
+ i0 = s_in[0]; \
+ o0 = composite[user[i0]]; \
+ nz |= o0; \
+ } \
+ out[0] = o0; \
+ s_in ++; \
+ out ++; \
+ } \
+ return nz == 0; \
+}
+
+GRAY_TO_GRAY_FUNC(unsigned char, 8)
+GRAY_TO_GRAY_FUNC(unsigned short, 16)
+GENERIC_COLOR_FUNC(gray, gray)
+
+#define COLOR_TO_GRAY_FUNC(T, bits) \
+static unsigned \
+color_##bits##_to_gray(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int i0 = -1; \
+ int i1 = -1; \
+ int i2 = -1; \
+ int o0 = 0; \
+ int nz = 0; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ int l_red = LUM_RED; \
+ int l_green = LUM_GREEN; \
+ int l_blue = LUM_BLUE; \
+ const unsigned short *composite; \
+ const unsigned short *user; \
+ \
+ stp_curve_resample \
+ (stp_curve_cache_get_curve(&(lut->channel_curves[CHANNEL_K])), 65536); \
+ composite = \
+ stp_curve_cache_get_ushort_data(&(lut->channel_curves[CHANNEL_K])); \
+ stp_curve_resample(lut->user_color_correction.curve, 1 << bits); \
+ user = stp_curve_cache_get_ushort_data(&(lut->user_color_correction)); \
+ \
+ if (lut->input_color_description->color_model == COLOR_BLACK) \
+ { \
+ l_red = (100 - l_red) / 2; \
+ l_green = (100 - l_green) / 2; \
+ l_blue = (100 - l_blue) / 2; \
+ } \
+ \
+ for (i = 0; i < lut->image_width; i++) \
+ { \
+ if (i0 != s_in[0] || i1 != s_in[1] || i2 != s_in[2]) \
+ { \
+ i0 = s_in[0]; \
+ i1 = s_in[1]; \
+ i2 = s_in[2]; \
+ o0 = \
+ composite[user[(i0 * l_red + i1 * l_green + i2 * l_blue) / 100]]; \
+ nz |= o0; \
+ } \
+ out[0] = o0; \
+ s_in += 3; \
+ out ++; \
+ } \
+ return nz == 0; \
+}
+
+COLOR_TO_GRAY_FUNC(unsigned char, 8)
+COLOR_TO_GRAY_FUNC(unsigned short, 16)
+GENERIC_COLOR_FUNC(color, gray)
+
+
+#define CMYK_TO_GRAY_FUNC(T, bits) \
+static unsigned \
+cmyk_##bits##_to_gray(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int i0 = -1; \
+ int i1 = -1; \
+ int i2 = -1; \
+ int i3 = -4; \
+ int o0 = 0; \
+ int nz = 0; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ int l_red = LUM_RED; \
+ int l_green = LUM_GREEN; \
+ int l_blue = LUM_BLUE; \
+ int l_white = 0; \
+ const unsigned short *composite; \
+ const unsigned short *user; \
+ \
+ stp_curve_resample \
+ (stp_curve_cache_get_curve(&(lut->channel_curves[CHANNEL_K])), 65536); \
+ composite = \
+ stp_curve_cache_get_ushort_data(&(lut->channel_curves[CHANNEL_K])); \
+ stp_curve_resample(lut->user_color_correction.curve, 1 << bits); \
+ user = stp_curve_cache_get_ushort_data(&(lut->user_color_correction)); \
+ \
+ if (lut->input_color_description->color_model == COLOR_BLACK) \
+ { \
+ l_red = (100 - l_red) / 3; \
+ l_green = (100 - l_green) / 3; \
+ l_blue = (100 - l_blue) / 3; \
+ l_white = (100 - l_white) / 3; \
+ } \
+ \
+ for (i = 0; i < lut->image_width; i++) \
+ { \
+ if (i0 != s_in[0] || i1 != s_in[1] || i2 != s_in[2] || i3 != s_in[3]) \
+ { \
+ i0 = s_in[0]; \
+ i1 = s_in[1]; \
+ i2 = s_in[2]; \
+ i3 = s_in[3]; \
+ o0 = composite[user[(i0 * l_red + i1 * l_green + \
+ i2 * l_blue + i3 * l_white) / 100]]; \
+ nz |= o0; \
+ } \
+ out[0] = o0; \
+ s_in += 4; \
+ out ++; \
+ } \
+ return nz ? 0 : 1; \
+}
+
+CMYK_TO_GRAY_FUNC(unsigned char, 8)
+CMYK_TO_GRAY_FUNC(unsigned short, 16)
+GENERIC_COLOR_FUNC(cmyk, gray)
+
+#define KCMY_TO_GRAY_FUNC(T, bits) \
+static unsigned \
+kcmy_##bits##_to_gray(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int i0 = -1; \
+ int i1 = -1; \
+ int i2 = -1; \
+ int i3 = -4; \
+ int o0 = 0; \
+ int nz = 0; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ int l_red = LUM_RED; \
+ int l_green = LUM_GREEN; \
+ int l_blue = LUM_BLUE; \
+ int l_white = 0; \
+ const unsigned short *composite; \
+ const unsigned short *user; \
+ \
+ stp_curve_resample \
+ (stp_curve_cache_get_curve(&(lut->channel_curves[CHANNEL_K])), 65536); \
+ composite = \
+ stp_curve_cache_get_ushort_data(&(lut->channel_curves[CHANNEL_K])); \
+ stp_curve_resample(lut->user_color_correction.curve, 1 << bits); \
+ user = stp_curve_cache_get_ushort_data(&(lut->user_color_correction)); \
+ \
+ if (lut->input_color_description->color_model == COLOR_BLACK) \
+ { \
+ l_red = (100 - l_red) / 3; \
+ l_green = (100 - l_green) / 3; \
+ l_blue = (100 - l_blue) / 3; \
+ l_white = (100 - l_white) / 3; \
+ } \
+ \
+ for (i = 0; i < lut->image_width; i++) \
+ { \
+ if (i0 != s_in[0] || i1 != s_in[1] || i2 != s_in[2] || i3 != s_in[3]) \
+ { \
+ i0 = s_in[0]; \
+ i1 = s_in[1]; \
+ i2 = s_in[2]; \
+ i3 = s_in[3]; \
+ o0 = composite[user[(i0 * l_red + i1 * l_green + \
+ i2 * l_blue + i3 * l_white) / 100]]; \
+ nz |= o0; \
+ } \
+ out[0] = o0; \
+ s_in += 4; \
+ out ++; \
+ } \
+ return nz ? 0 : 1; \
+}
+
+KCMY_TO_GRAY_FUNC(unsigned char, 8)
+KCMY_TO_GRAY_FUNC(unsigned short, 16)
+GENERIC_COLOR_FUNC(kcmy, gray)
+
+#define GRAY_TO_GRAY_RAW_FUNC(T, bits) \
+static unsigned \
+gray_##bits##_to_gray_raw(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int nz = 0; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ int width = lut->image_width; \
+ unsigned mask = 0; \
+ if (lut->invert_output) \
+ mask = 0xffff; \
+ \
+ memset(out, 0, width * sizeof(unsigned short)); \
+ \
+ for (i = 0; i < lut->image_width; i++) \
+ { \
+ out[0] = (s_in[0] * (65535 / ((1 << bits) - 1))) ^ mask; \
+ nz |= out[0]; \
+ s_in ++; \
+ out ++; \
+ } \
+ return nz == 0; \
+}
+
+GRAY_TO_GRAY_RAW_FUNC(unsigned char, 8)
+GRAY_TO_GRAY_RAW_FUNC(unsigned short, 16)
+GENERIC_COLOR_FUNC(gray, gray_raw)
+
+#define COLOR_TO_GRAY_RAW_FUNC(T, bits, invertable, name2) \
+static unsigned \
+color_##bits##_to_gray_##name2(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int i0 = -1; \
+ int i1 = -1; \
+ int i2 = -1; \
+ int o0 = 0; \
+ int nz = 0; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ int l_red = LUM_RED; \
+ int l_green = LUM_GREEN; \
+ int l_blue = LUM_BLUE; \
+ unsigned mask = 0; \
+ if (lut->invert_output && invertable) \
+ mask = 0xffff; \
+ \
+ if (lut->input_color_description->color_model == COLOR_BLACK) \
+ { \
+ l_red = (100 - l_red) / 2; \
+ l_green = (100 - l_green) / 2; \
+ l_blue = (100 - l_blue) / 2; \
+ } \
+ \
+ for (i = 0; i < lut->image_width; i++) \
+ { \
+ if (i0 != s_in[0] || i1 != s_in[1] || i2 != s_in[2]) \
+ { \
+ i0 = s_in[0]; \
+ i1 = s_in[1]; \
+ i2 = s_in[2]; \
+ o0 = (i0 * (65535 / ((1 << bits) - 1)) * l_red + \
+ i1 * (65535 / ((1 << bits) - 1)) * l_green + \
+ i2 * (65535 / ((1 << bits) - 1)) * l_blue) / 100; \
+ o0 ^= mask; \
+ nz |= o0; \
+ } \
+ out[0] = o0; \
+ s_in += 3; \
+ out ++; \
+ } \
+ return nz == 0; \
+}
+
+COLOR_TO_GRAY_RAW_FUNC(unsigned char, 8, 1, raw)
+COLOR_TO_GRAY_RAW_FUNC(unsigned short, 16, 1, raw)
+GENERIC_COLOR_FUNC(color, gray_raw)
+COLOR_TO_GRAY_RAW_FUNC(unsigned char, 8, 0, noninvert)
+COLOR_TO_GRAY_RAW_FUNC(unsigned short, 16, 0, noninvert)
+
+
+#define CMYK_TO_GRAY_RAW_FUNC(T, bits, invertable, name2) \
+static unsigned \
+cmyk_##bits##_to_gray_##name2(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int i0 = -1; \
+ int i1 = -1; \
+ int i2 = -1; \
+ int i3 = -4; \
+ int o0 = 0; \
+ int nz = 0; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ int l_red = LUM_RED; \
+ int l_green = LUM_GREEN; \
+ int l_blue = LUM_BLUE; \
+ int l_white = 0; \
+ unsigned mask = 0; \
+ if (lut->invert_output && invertable) \
+ mask = 0xffff; \
+ \
+ if (lut->input_color_description->color_model == COLOR_BLACK) \
+ { \
+ l_red = (100 - l_red) / 3; \
+ l_green = (100 - l_green) / 3; \
+ l_blue = (100 - l_blue) / 3; \
+ l_white = (100 - l_white) / 3; \
+ } \
+ \
+ for (i = 0; i < lut->image_width; i++) \
+ { \
+ if (i0 != s_in[0] || i1 != s_in[1] || i2 != s_in[2] || i3 != s_in[3]) \
+ { \
+ i0 = s_in[0]; \
+ i1 = s_in[1]; \
+ i2 = s_in[2]; \
+ i3 = s_in[3]; \
+ o0 = (i0 * (65535 / ((1 << bits) - 1)) * l_red + \
+ i1 * (65535 / ((1 << bits) - 1)) * l_green + \
+ i2 * (65535 / ((1 << bits) - 1)) * l_blue + \
+ i3 * (65535 / ((1 << bits) - 1)) * l_white) / 100; \
+ o0 ^= mask; \
+ nz |= o0; \
+ } \
+ out[0] = o0; \
+ s_in += 4; \
+ out ++; \
+ } \
+ return nz ? 0 : 1; \
+}
+
+CMYK_TO_GRAY_RAW_FUNC(unsigned char, 8, 1, raw)
+CMYK_TO_GRAY_RAW_FUNC(unsigned short, 16, 1, raw)
+GENERIC_COLOR_FUNC(cmyk, gray_raw)
+CMYK_TO_GRAY_RAW_FUNC(unsigned char, 8, 0, noninvert)
+CMYK_TO_GRAY_RAW_FUNC(unsigned short, 16, 0, noninvert)
+
+#define KCMY_TO_GRAY_RAW_FUNC(T, bits, invertable, name2) \
+static unsigned \
+kcmy_##bits##_to_gray_##name2(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int i0 = -1; \
+ int i1 = -1; \
+ int i2 = -1; \
+ int i3 = -4; \
+ int o0 = 0; \
+ int nz = 0; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ int l_red = LUM_RED; \
+ int l_green = LUM_GREEN; \
+ int l_blue = LUM_BLUE; \
+ int l_white = 0; \
+ unsigned mask = 0; \
+ if (lut->invert_output && invertable) \
+ mask = 0xffff; \
+ \
+ if (lut->input_color_description->color_model == COLOR_BLACK) \
+ { \
+ l_red = (100 - l_red) / 3; \
+ l_green = (100 - l_green) / 3; \
+ l_blue = (100 - l_blue) / 3; \
+ l_white = (100 - l_white) / 3; \
+ } \
+ \
+ for (i = 0; i < lut->image_width; i++) \
+ { \
+ if (i0 != s_in[0] || i1 != s_in[1] || i2 != s_in[2] || i3 != s_in[3]) \
+ { \
+ i0 = s_in[0]; \
+ i1 = s_in[1]; \
+ i2 = s_in[2]; \
+ i3 = s_in[3]; \
+ o0 = (i0 * (65535 / ((1 << bits) - 1)) * l_white + \
+ i1 * (65535 / ((1 << bits) - 1)) * l_red + \
+ i2 * (65535 / ((1 << bits) - 1)) * l_green + \
+ i3 * (65535 / ((1 << bits) - 1)) * l_blue) / 100; \
+ o0 ^= mask; \
+ nz |= o0; \
+ } \
+ out[0] = o0; \
+ s_in += 4; \
+ out ++; \
+ } \
+ return nz ? 0 : 1; \
+}
+
+KCMY_TO_GRAY_RAW_FUNC(unsigned char, 8, 1, raw)
+KCMY_TO_GRAY_RAW_FUNC(unsigned short, 16, 1, raw)
+GENERIC_COLOR_FUNC(kcmy, gray_raw)
+KCMY_TO_GRAY_RAW_FUNC(unsigned char, 8, 0, noninvert)
+KCMY_TO_GRAY_RAW_FUNC(unsigned short, 16, 0, noninvert)
+
+#define CMYK_TO_KCMY_RAW_FUNC(T, bits) \
+static unsigned \
+cmyk_##bits##_to_kcmy_raw(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int j; \
+ int nz[4]; \
+ unsigned retval = 0; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ \
+ memset(nz, 0, sizeof(nz)); \
+ for (i = 0; i < lut->image_width; i++) \
+ { \
+ out[0] = s_in[3] * (65535 / ((1 << bits) - 1)); \
+ out[1] = s_in[0] * (65535 / ((1 << bits) - 1)); \
+ out[2] = s_in[1] * (65535 / ((1 << bits) - 1)); \
+ out[3] = s_in[2] * (65535 / ((1 << bits) - 1)); \
+ for (j = 0; j < 4; j++) \
+ nz[j] |= out[j]; \
+ s_in += 4; \
+ out += 4; \
+ } \
+ for (j = 0; j < 4; j++) \
+ if (nz[j] == 0) \
+ retval |= (1 << j); \
+ return retval; \
+}
+
+CMYK_TO_KCMY_RAW_FUNC(unsigned char, 8)
+CMYK_TO_KCMY_RAW_FUNC(unsigned short, 16)
+GENERIC_COLOR_FUNC(cmyk, kcmy_raw)
+
+#define KCMY_TO_KCMY_RAW_FUNC(T, bits) \
+static unsigned \
+kcmy_##bits##_to_kcmy_raw(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int j; \
+ int nz[4]; \
+ unsigned retval = 0; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ \
+ memset(nz, 0, sizeof(nz)); \
+ for (i = 0; i < lut->image_width; i++) \
+ { \
+ for (j = 0; j < 4; j++) \
+ { \
+ out[j] = s_in[j] * (65535 / ((1 << bits) - 1)); \
+ nz[j] |= out[j]; \
+ } \
+ s_in += 4; \
+ out += 4; \
+ } \
+ for (j = 0; j < 4; j++) \
+ if (nz[j] == 0) \
+ retval |= (1 << j); \
+ return retval; \
+}
+
+KCMY_TO_KCMY_RAW_FUNC(unsigned char, 8)
+KCMY_TO_KCMY_RAW_FUNC(unsigned short, 16)
+GENERIC_COLOR_FUNC(kcmy, kcmy_raw)
+
+#define DESATURATED_FUNC(name, name2, bits) \
+static unsigned \
+name##_##bits##_to_##name2##_desaturated(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ size_t real_steps = lut->steps; \
+ unsigned status; \
+ if (!lut->gray_tmp) \
+ lut->gray_tmp = stp_malloc(2 * lut->image_width); \
+ name##_##bits##_to_gray_noninvert(vars, in, lut->gray_tmp); \
+ lut->steps = 65536; \
+ status = gray_16_to_##name2(vars, (unsigned char *) lut->gray_tmp, out); \
+ lut->steps = real_steps; \
+ return status; \
+}
+
+DESATURATED_FUNC(color, color, 8)
+DESATURATED_FUNC(color, color, 16)
+GENERIC_COLOR_FUNC(color, color_desaturated)
+DESATURATED_FUNC(color, kcmy, 8)
+DESATURATED_FUNC(color, kcmy, 16)
+GENERIC_COLOR_FUNC(color, kcmy_desaturated)
+
+DESATURATED_FUNC(cmyk, color, 8)
+DESATURATED_FUNC(cmyk, color, 16)
+GENERIC_COLOR_FUNC(cmyk, color_desaturated)
+DESATURATED_FUNC(cmyk, kcmy, 8)
+DESATURATED_FUNC(cmyk, kcmy, 16)
+GENERIC_COLOR_FUNC(cmyk, kcmy_desaturated)
+
+DESATURATED_FUNC(kcmy, color, 8)
+DESATURATED_FUNC(kcmy, color, 16)
+GENERIC_COLOR_FUNC(kcmy, color_desaturated)
+DESATURATED_FUNC(kcmy, kcmy, 8)
+DESATURATED_FUNC(kcmy, kcmy, 16)
+GENERIC_COLOR_FUNC(kcmy, kcmy_desaturated)
+
+#define CMYK_DISPATCH(name) \
+static unsigned \
+CMYK_to_##name(const stp_vars_t *vars, const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ if (lut->input_color_description->color_id == COLOR_ID_CMYK) \
+ return cmyk_to_##name(vars, in, out); \
+ else if (lut->input_color_description->color_id == COLOR_ID_KCMY) \
+ return kcmy_to_##name(vars, in, out); \
+ else \
+ { \
+ stp_eprintf(vars, "Bad dispatch to CMYK_to_%s: %d\n", #name, \
+ lut->input_color_description->color_id); \
+ return 0; \
+ } \
+}
+
+CMYK_DISPATCH(color)
+CMYK_DISPATCH(color_raw)
+CMYK_DISPATCH(color_fast)
+CMYK_DISPATCH(color_threshold)
+CMYK_DISPATCH(color_desaturated)
+CMYK_DISPATCH(kcmy)
+CMYK_DISPATCH(kcmy_raw)
+CMYK_DISPATCH(kcmy_threshold)
+CMYK_DISPATCH(kcmy_desaturated)
+CMYK_DISPATCH(gray)
+CMYK_DISPATCH(gray_raw)
+CMYK_DISPATCH(gray_threshold)
+
+#define RAW_TO_RAW_THRESHOLD_FUNC(T, name) \
+static unsigned \
+name##_to_raw_threshold(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int j; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ unsigned nz[STP_CHANNEL_LIMIT]; \
+ unsigned z = (1 << lut->out_channels) - 1; \
+ const T *s_in = (const T *) in; \
+ unsigned desired_high_bit = 0; \
+ unsigned high_bit = 1 << ((sizeof(T) * 8) - 1); \
+ int width = lut->image_width; \
+ memset(out, 0, width * lut->out_channels * sizeof(unsigned short)); \
+ if (!lut->invert_output) \
+ desired_high_bit = high_bit; \
+ for (i = 0; i < lut->out_channels; i++) \
+ nz[i] = z & ~(1 << i); \
+ \
+ for (i = 0; i < width; i++) \
+ { \
+ for (j = 0; j < lut->out_channels; j++) \
+ { \
+ if ((*s_in++ & high_bit) == desired_high_bit) \
+ { \
+ z &= nz[j]; \
+ *out = 65535; \
+ } \
+ out++; \
+ } \
+ } \
+ return z; \
+}
+
+RAW_TO_RAW_THRESHOLD_FUNC(unsigned char, raw_8)
+RAW_TO_RAW_THRESHOLD_FUNC(unsigned short, raw_16)
+GENERIC_COLOR_FUNC(raw, raw_threshold)
+
+#define RAW_TO_RAW_FUNC(T, size) \
+static unsigned \
+raw_##size##_to_raw(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ unsigned retval = 0; \
+ int j; \
+ int nz[STP_CHANNEL_LIMIT]; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ const unsigned short *maps[STP_CHANNEL_LIMIT]; \
+ const unsigned short *user; \
+ \
+ for (i = 0; i < lut->out_channels; i++) \
+ { \
+ stp_curve_resample(lut->channel_curves[i].curve, 65536); \
+ maps[i] = stp_curve_cache_get_ushort_data(&(lut->channel_curves[i])); \
+ } \
+ stp_curve_resample(lut->user_color_correction.curve, 1 << size); \
+ user = stp_curve_cache_get_ushort_data(&(lut->user_color_correction)); \
+ \
+ memset(nz, 0, sizeof(nz)); \
+ \
+ for (i = 0; i < lut->image_width; i++, out += lut->out_channels) \
+ { \
+ for (j = 0; j < lut->out_channels; j++) \
+ { \
+ int inval = *s_in++; \
+ nz[j] |= inval; \
+ out[j] = maps[j][user[inval]]; \
+ } \
+ } \
+ for (j = 0; j < lut->out_channels; j++) \
+ if (nz[j] == 0) \
+ retval |= (1 << j); \
+ return retval; \
+}
+
+RAW_TO_RAW_FUNC(unsigned char, 8)
+RAW_TO_RAW_FUNC(unsigned short, 16)
+GENERIC_COLOR_FUNC(raw, raw)
+
+
+#define RAW_TO_RAW_RAW_FUNC(T, bits) \
+static unsigned \
+raw_##bits##_to_raw_raw(const stp_vars_t *vars, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ int i; \
+ int j; \
+ int nz[STP_CHANNEL_LIMIT]; \
+ unsigned retval = 0; \
+ const T *s_in = (const T *) in; \
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color")); \
+ int colors = lut->in_channels; \
+ \
+ memset(nz, 0, sizeof(nz)); \
+ for (i = 0; i < lut->image_width; i++) \
+ { \
+ for (j = 0; j < colors; j++) \
+ { \
+ nz[j] |= s_in[j]; \
+ out[j] = s_in[j] * (65535 / ((1 << bits) - 1)); \
+ } \
+ s_in += colors; \
+ out += colors; \
+ } \
+ for (j = 0; j < colors; j++) \
+ if (nz[j] == 0) \
+ retval |= (1 << j); \
+ return retval; \
+}
+
+RAW_TO_RAW_RAW_FUNC(unsigned char, 8)
+RAW_TO_RAW_RAW_FUNC(unsigned short, 16)
+GENERIC_COLOR_FUNC(raw, raw_raw)
+
+
+#define CONVERSION_FUNCTION_WITH_FAST(from, to, from2) \
+static unsigned \
+generic_##from##_to_##to(const stp_vars_t *v, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ lut_t *lut = (lut_t *)(stp_get_component_data(v, "Color")); \
+ switch (lut->color_correction->correction) \
+ { \
+ case COLOR_CORRECTION_UNCORRECTED: \
+ return from2##_to_##to##_fast(v, in, out); \
+ case COLOR_CORRECTION_ACCURATE: \
+ case COLOR_CORRECTION_BRIGHT: \
+ case COLOR_CORRECTION_HUE: \
+ return from2##_to_##to(v, in, out); \
+ case COLOR_CORRECTION_DESATURATED: \
+ return from2##_to_##to##_desaturated(v, in, out); \
+ case COLOR_CORRECTION_THRESHOLD: \
+ case COLOR_CORRECTION_PREDITHERED: \
+ return from2##_to_##to##_threshold(v, in, out); \
+ case COLOR_CORRECTION_DENSITY: \
+ case COLOR_CORRECTION_RAW: \
+ return from2##_to_##to##_raw(v, in, out); \
+ default: \
+ return (unsigned) -1; \
+ } \
+}
+
+#define CONVERSION_FUNCTION_WITHOUT_FAST(from, to, from2) \
+static unsigned \
+generic_##from##_to_##to(const stp_vars_t *v, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ lut_t *lut = (lut_t *)(stp_get_component_data(v, "Color")); \
+ switch (lut->color_correction->correction) \
+ { \
+ case COLOR_CORRECTION_UNCORRECTED: \
+ case COLOR_CORRECTION_ACCURATE: \
+ case COLOR_CORRECTION_BRIGHT: \
+ case COLOR_CORRECTION_HUE: \
+ return from2##_to_##to(v, in, out); \
+ case COLOR_CORRECTION_DESATURATED: \
+ return from2##_to_##to##_desaturated(v, in, out); \
+ case COLOR_CORRECTION_THRESHOLD: \
+ case COLOR_CORRECTION_PREDITHERED: \
+ return from2##_to_##to##_threshold(v, in, out); \
+ case COLOR_CORRECTION_DENSITY: \
+ case COLOR_CORRECTION_RAW: \
+ return from2##_to_##to##_raw(v, in, out); \
+ default: \
+ return (unsigned) -1; \
+ } \
+}
+
+#define CONVERSION_FUNCTION_WITHOUT_DESATURATED(from, to, from2) \
+static unsigned \
+generic_##from##_to_##to(const stp_vars_t *v, \
+ const unsigned char *in, \
+ unsigned short *out) \
+{ \
+ lut_t *lut = (lut_t *)(stp_get_component_data(v, "Color")); \
+ switch (lut->color_correction->correction) \
+ { \
+ case COLOR_CORRECTION_UNCORRECTED: \
+ case COLOR_CORRECTION_ACCURATE: \
+ case COLOR_CORRECTION_BRIGHT: \
+ case COLOR_CORRECTION_HUE: \
+ case COLOR_CORRECTION_DESATURATED: \
+ return from2##_to_##to(v, in, out); \
+ case COLOR_CORRECTION_THRESHOLD: \
+ case COLOR_CORRECTION_PREDITHERED: \
+ return from2##_to_##to##_threshold(v, in, out); \
+ case COLOR_CORRECTION_DENSITY: \
+ case COLOR_CORRECTION_RAW: \
+ return from2##_to_##to##_raw(v, in, out); \
+ default: \
+ return (unsigned) -1; \
+ } \
+}
+
+CONVERSION_FUNCTION_WITH_FAST(cmyk, color, CMYK)
+CONVERSION_FUNCTION_WITH_FAST(color, color, color)
+CONVERSION_FUNCTION_WITH_FAST(color, kcmy, color)
+CONVERSION_FUNCTION_WITHOUT_FAST(cmyk, kcmy, CMYK)
+CONVERSION_FUNCTION_WITHOUT_DESATURATED(cmyk, gray, CMYK)
+CONVERSION_FUNCTION_WITHOUT_DESATURATED(color, gray, color)
+CONVERSION_FUNCTION_WITHOUT_DESATURATED(gray, gray, gray)
+CONVERSION_FUNCTION_WITHOUT_DESATURATED(gray, color, gray)
+CONVERSION_FUNCTION_WITHOUT_DESATURATED(gray, kcmy, gray)
+
+unsigned
+stpi_color_convert_to_gray(const stp_vars_t *v,
+ const unsigned char *in,
+ unsigned short *out)
+{
+ lut_t *lut = (lut_t *)(stp_get_component_data(v, "Color"));
+ switch (lut->input_color_description->color_id)
+ {
+ case COLOR_ID_GRAY:
+ case COLOR_ID_WHITE:
+ return generic_gray_to_gray(v, in, out);
+ case COLOR_ID_RGB:
+ case COLOR_ID_CMY:
+ return generic_color_to_gray(v, in, out);
+ case COLOR_ID_CMYK:
+ case COLOR_ID_KCMY:
+ return generic_cmyk_to_gray(v, in, out);
+ default:
+ return (unsigned) -1;
+ }
+}
+
+unsigned
+stpi_color_convert_to_color(const stp_vars_t *v,
+ const unsigned char *in,
+ unsigned short *out)
+{
+ lut_t *lut = (lut_t *)(stp_get_component_data(v, "Color"));
+ switch (lut->input_color_description->color_id)
+ {
+ case COLOR_ID_GRAY:
+ case COLOR_ID_WHITE:
+ return generic_gray_to_color(v, in, out);
+ case COLOR_ID_RGB:
+ case COLOR_ID_CMY:
+ return generic_color_to_color(v, in, out);
+ case COLOR_ID_CMYK:
+ case COLOR_ID_KCMY:
+ return generic_cmyk_to_color(v, in, out);
+ default:
+ return (unsigned) -1;
+ }
+}
+
+unsigned
+stpi_color_convert_to_kcmy(const stp_vars_t *v,
+ const unsigned char *in,
+ unsigned short *out)
+{
+ lut_t *lut = (lut_t *)(stp_get_component_data(v, "Color"));
+ switch (lut->input_color_description->color_id)
+ {
+ case COLOR_ID_GRAY:
+ case COLOR_ID_WHITE:
+ return generic_gray_to_kcmy(v, in, out);
+ case COLOR_ID_RGB:
+ case COLOR_ID_CMY:
+ return generic_color_to_kcmy(v, in, out);
+ case COLOR_ID_CMYK:
+ case COLOR_ID_KCMY:
+ return generic_cmyk_to_kcmy(v, in, out);
+ default:
+ return (unsigned) -1;
+ }
+}
+
+unsigned
+stpi_color_convert_raw(const stp_vars_t *v,
+ const unsigned char *in,
+ unsigned short *out)
+{
+ lut_t *lut = (lut_t *)(stp_get_component_data(v, "Color"));
+ switch (lut->color_correction->correction)
+ {
+ case COLOR_CORRECTION_THRESHOLD:
+ case COLOR_CORRECTION_PREDITHERED:
+ return raw_to_raw_threshold(v, in, out);
+ case COLOR_CORRECTION_UNCORRECTED:
+ case COLOR_CORRECTION_BRIGHT:
+ case COLOR_CORRECTION_HUE:
+ case COLOR_CORRECTION_ACCURATE:
+ case COLOR_CORRECTION_DESATURATED:
+ return raw_to_raw(v, in, out);
+ case COLOR_CORRECTION_RAW:
+ case COLOR_CORRECTION_DEFAULT:
+ case COLOR_CORRECTION_DENSITY:
+ return raw_to_raw_raw(v, in, out);
+ default:
+ return (unsigned) -1;
+ }
+}
diff --git a/src/main/color.c b/src/main/color.c
new file mode 100644
index 0000000..8a964c3
--- /dev/null
+++ b/src/main/color.c
@@ -0,0 +1,286 @@
+/*
+ * "$Id: color.c,v 1.10 2004/09/17 18:38:17 rleigh Exp $"
+ *
+ * Gimp-Print color module interface.
+ *
+ * Copyright (C) 2003 Roger Leigh (rleigh@debian.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.
+ */
+
+/*
+ * 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 <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <string.h>
+#include <stdlib.h>
+
+
+static const char* stpi_color_namefunc(const void *item);
+static const char* stpi_color_long_namefunc(const void *item);
+
+static stp_list_t *color_list = NULL;
+
+
+static int
+stpi_init_color_list(void)
+{
+ if(color_list)
+ stp_list_destroy(color_list);
+ color_list = stp_list_create();
+ stp_list_set_namefunc(color_list, stpi_color_namefunc);
+ stp_list_set_long_namefunc(color_list, stpi_color_long_namefunc);
+ /* stp_list_set_sortfunc(color_list, stpi_color_sortfunc); */
+
+ return 0;
+}
+
+static inline void
+check_list(void)
+{
+ if (color_list == NULL)
+ {
+ stp_erprintf("No color drivers found: "
+ "are STP_DATA_PATH and STP_MODULE_PATH correct?\n");
+ stpi_init_color_list();
+ }
+}
+
+
+
+int
+stp_color_count(void)
+{
+ if (color_list == NULL)
+ {
+ stp_erprintf("No color modules found: "
+ "is STP_MODULE_PATH correct?\n");
+ stpi_init_color_list();
+ }
+ return stp_list_get_length(color_list);
+}
+
+
+static inline void
+check_color(const stp_color_t *c)
+{
+ if (c == NULL)
+ {
+ stp_erprintf("Null stp_color_t! Please report this bug.\n");
+ stp_abort();
+ }
+}
+
+
+const stp_color_t *
+stp_get_color_by_index(int idx)
+{
+ stp_list_item_t *color;
+
+ check_list();
+
+ color = stp_list_get_item_by_index(color_list, idx);
+ if (color == NULL)
+ return NULL;
+ return (const stp_color_t *) stp_list_item_get_data(color);
+}
+
+
+static const char *
+stpi_color_namefunc(const void *item)
+{
+ const stp_color_t *color = (const stp_color_t *) item;
+ check_color(color);
+ return color->short_name;
+}
+
+
+static const char *
+stpi_color_long_namefunc(const void *item)
+{
+ const stp_color_t *color = (const stp_color_t *) item;
+ check_color(color);
+ return color->long_name;
+}
+
+
+const char *
+stp_color_get_name(const stp_color_t *c)
+{
+ const stp_color_t *val = (const stp_color_t *) c;
+ check_color(val);
+ return val->short_name;
+}
+
+const char *
+stp_color_get_long_name(const stp_color_t *c)
+{
+ const stp_color_t *val = (const stp_color_t *) c;
+ check_color(val);
+ return gettext(val->long_name);
+}
+
+
+static const stp_colorfuncs_t *
+stpi_get_colorfuncs(const stp_color_t *c)
+{
+ const stp_color_t *val = (const stp_color_t *) c;
+ check_color(val);
+ return val->colorfuncs;
+}
+
+
+const stp_color_t *
+stp_get_color_by_name(const char *name)
+{
+ stp_list_item_t *color;
+
+ check_list();
+
+ color = stp_list_get_item_by_name(color_list, name);
+ if (!color)
+ return NULL;
+ return (const stp_color_t *) stp_list_item_get_data(color);
+}
+
+const stp_color_t *
+stp_get_color_by_colorfuncs(stp_colorfuncs_t *colorfuncs)
+{
+ stp_list_item_t *color_item;
+ stp_color_t *color;
+
+ check_list();
+
+ color_item = stp_list_get_start(color_list);
+ while (color_item)
+ {
+ color = (stp_color_t *) stp_list_item_get_data(color_item);
+ if (color->colorfuncs == colorfuncs)
+ return color;
+ color_item = stp_list_item_next(color_item);
+ }
+ return NULL;
+}
+
+
+int
+stp_color_init(stp_vars_t *v,
+ stp_image_t *image,
+ size_t steps)
+{
+ const stp_colorfuncs_t *colorfuncs =
+ stpi_get_colorfuncs(stp_get_color_by_name(stp_get_color_conversion(v)));
+ return colorfuncs->init(v, image, steps);
+}
+
+int
+stp_color_get_row(stp_vars_t *v,
+ stp_image_t *image,
+ int row,
+ unsigned *zero_mask)
+{
+ const stp_colorfuncs_t *colorfuncs =
+ stpi_get_colorfuncs(stp_get_color_by_name(stp_get_color_conversion(v)));
+ return colorfuncs->get_row(v, image, row, zero_mask);
+}
+
+stp_parameter_list_t
+stp_color_list_parameters(const stp_vars_t *v)
+{
+ const stp_colorfuncs_t *colorfuncs =
+ stpi_get_colorfuncs(stp_get_color_by_name(stp_get_color_conversion(v)));
+ return colorfuncs->list_parameters(v);
+}
+
+void
+stp_color_describe_parameter(const stp_vars_t *v, const char *name,
+ stp_parameter_t *description)
+{
+ const stp_colorfuncs_t *colorfuncs =
+ stpi_get_colorfuncs(stp_get_color_by_name(stp_get_color_conversion(v)));
+ colorfuncs->describe_parameter(v, name, description);
+}
+
+
+int
+stp_color_register(const stp_color_t *color)
+{
+ if (color_list == NULL)
+ {
+ stpi_init_color_list();
+ stp_deprintf(STP_DBG_COLORFUNC,
+ "stpi_color_register(): initialising color_list...\n");
+ }
+
+ check_color(color);
+
+ if (color)
+ {
+ /* Add new color algorithm if it does not already exist */
+ if (stp_get_color_by_name(color->short_name) == NULL)
+ {
+ stp_deprintf
+ (STP_DBG_COLORFUNC,
+ "stpi_color_register(): registered colour module \"%s\"\n",
+ color->short_name);
+ stp_list_item_create(color_list, NULL, color);
+ }
+ }
+
+ return 0;
+}
+
+int
+stp_color_unregister(const stp_color_t *color)
+{
+ stp_list_item_t *color_item;
+ stp_color_t *color_data;
+
+ if (color_list == NULL)
+ {
+ stpi_init_color_list();
+ stp_deprintf
+ (STP_DBG_COLORFUNC,
+ "stpi_family_unregister(): initialising color_list...\n");
+ }
+
+ check_color(color);
+
+ color_item = stp_list_get_start(color_list);
+ while (color_item)
+ {
+ color_data = (stp_color_t *) stp_list_item_get_data(color_item);
+ if (strcmp(color->short_name, color_data->short_name) == 0)
+ {
+ stp_deprintf
+ (STP_DBG_COLORFUNC,
+ "stpi_color_unregister(): unregistered colour module \"%s\"\n",
+ color->short_name);
+ stp_list_item_destroy(color_list, color_item);
+ break;
+ }
+ color_item = stp_list_item_next(color_item);
+ }
+
+ return 0;
+}
+
diff --git a/src/main/curve-cache.c b/src/main/curve-cache.c
new file mode 100644
index 0000000..37b51b0
--- /dev/null
+++ b/src/main/curve-cache.c
@@ -0,0 +1,141 @@
+/*
+ * "$Id: curve-cache.c,v 1.5 2004/09/17 18:38:17 rleigh Exp $"
+ *
+ * Gimp-Print color management module - traditional Gimp-Print algorithm.
+ *
+ * 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 <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <gutenprint/curve-cache.h>
+#include <math.h>
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#include <string.h>
+
+void
+stp_curve_free_curve_cache(stp_cached_curve_t *cache)
+{
+ if (cache->curve)
+ stp_curve_destroy(cache->curve);
+ cache->curve = NULL;
+ cache->d_cache = NULL;
+ cache->s_cache = NULL;
+ cache->count = 0;
+}
+
+void
+stp_curve_cache_curve_data(stp_cached_curve_t *cache)
+{
+ if (cache->curve && !cache->d_cache)
+ {
+ cache->s_cache = stp_curve_get_ushort_data(cache->curve, &(cache->count));
+ cache->d_cache = stp_curve_get_data(cache->curve, &(cache->count));
+ }
+}
+
+stp_curve_t *
+stp_curve_cache_get_curve(stp_cached_curve_t *cache)
+{
+ return cache->curve;
+}
+
+void
+stp_curve_cache_curve_invalidate(stp_cached_curve_t *cache)
+{
+ cache->d_cache = NULL;
+ cache->s_cache = NULL;
+ cache->count = 0;
+}
+
+void
+stp_curve_cache_set_curve(stp_cached_curve_t *cache, stp_curve_t *curve)
+{
+ stp_curve_cache_curve_invalidate(cache);
+ cache->curve = curve;
+}
+
+void
+stp_curve_cache_set_curve_copy(stp_cached_curve_t *cache, const stp_curve_t *curve)
+{
+ stp_curve_cache_curve_invalidate(cache);
+ cache->curve = stp_curve_create_copy(curve);
+}
+
+const size_t
+stp_curve_cache_get_count(stp_cached_curve_t *cache)
+{
+ if (cache->curve)
+ {
+ if (!cache->d_cache)
+ cache->d_cache = stp_curve_get_data(cache->curve, &(cache->count));
+ return cache->count;
+ }
+ else
+ return 0;
+}
+
+const unsigned short *
+stp_curve_cache_get_ushort_data(stp_cached_curve_t *cache)
+{
+ if (cache->curve)
+ {
+ if (!cache->s_cache)
+ cache->s_cache =
+ stp_curve_get_ushort_data(cache->curve, &(cache->count));
+ return cache->s_cache;
+ }
+ else
+ return NULL;
+}
+
+const double *
+stp_curve_cache_get_double_data(stp_cached_curve_t *cache)
+{
+ if (cache->curve)
+ {
+ if (!cache->d_cache)
+ cache->d_cache = stp_curve_get_data(cache->curve, &(cache->count));
+ return cache->d_cache;
+ }
+ else
+ return NULL;
+}
+
+void
+stp_curve_cache_copy(stp_cached_curve_t *dest, const stp_cached_curve_t *src)
+{
+ stp_curve_cache_curve_invalidate(dest);
+ if (dest != src)
+ {
+ if (src->curve)
+ stp_curve_cache_set_curve_copy(dest, src->curve);
+ }
+}
+
diff --git a/src/main/curve.c b/src/main/curve.c
new file mode 100644
index 0000000..03c2ede
--- /dev/null
+++ b/src/main/curve.c
@@ -0,0 +1,1901 @@
+/*
+ * "$Id: curve.c,v 1.51 2005/04/10 22:57:40 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <math.h>
+#ifdef sun
+#include <ieeefp.h>
+#endif
+#include <string.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef __GNUC__
+#define inline __inline__
+#endif
+
+#undef inline
+#define inline
+
+static const int curve_point_limit = 1048576;
+
+struct stp_curve
+{
+ stp_curve_type_t curve_type;
+ stp_curve_wrap_mode_t wrap_mode;
+ int piecewise;
+ int recompute_interval; /* Do we need to recompute the deltas? */
+ double gamma; /* 0.0 means that the curve is not a gamma */
+ stp_sequence_t *seq; /* Sequence (contains the curve data) */
+ double *interval; /* We allocate an extra slot for the
+ wrap-around value. */
+
+};
+
+static const char *const stpi_curve_type_names[] =
+ {
+ "linear",
+ "spline",
+ };
+
+static const int stpi_curve_type_count =
+(sizeof(stpi_curve_type_names) / sizeof(const char *));
+
+static const char *const stpi_wrap_mode_names[] =
+ {
+ "nowrap",
+ "wrap"
+ };
+
+static const int stpi_wrap_mode_count =
+(sizeof(stpi_wrap_mode_names) / sizeof(const char *));
+
+/*
+ * We could do more sanity checks here if we want.
+ */
+static void
+check_curve(const stp_curve_t *curve)
+{
+ if (curve == NULL)
+ {
+ stp_erprintf("Null curve! Please report this bug.\n");
+ stp_abort();
+ }
+ if (curve->seq == NULL)
+ {
+ stp_erprintf("Bad curve (seq == NULL)! Please report this bug.\n");
+ stp_abort();
+ }
+}
+
+/*
+ * Get the total number of points in the base sequence class
+ */
+static size_t
+get_real_point_count(const stp_curve_t *curve)
+{
+ if (curve->piecewise)
+ return stp_sequence_get_size(curve->seq) / 2;
+ else
+ return stp_sequence_get_size(curve->seq);
+}
+
+/*
+ * Get the number of points used by the curve (that are visible to the
+ * user). This is the real point count, but is decreased by 1 if the
+ * curve wraps around.
+ */
+static size_t
+get_point_count(const stp_curve_t *curve)
+{
+ size_t count = get_real_point_count(curve);
+ if (curve->wrap_mode == STP_CURVE_WRAP_AROUND)
+ count -= 1;
+
+ return count;
+}
+
+static void
+invalidate_auxiliary_data(stp_curve_t *curve)
+{
+ STP_SAFE_FREE(curve->interval);
+}
+
+static void
+clear_curve_data(stp_curve_t *curve)
+{
+ if (curve->seq)
+ stp_sequence_set_size(curve->seq, 0);
+ curve->recompute_interval = 0;
+ invalidate_auxiliary_data(curve);
+}
+
+static void
+compute_linear_deltas(stp_curve_t *curve)
+{
+ int i;
+ size_t delta_count;
+ size_t seq_point_count;
+ const double *data;
+
+ stp_sequence_get_data(curve->seq, &seq_point_count, &data);
+ if (data == NULL)
+ return;
+
+ delta_count = get_real_point_count(curve);
+
+ if (delta_count <= 1) /* No intervals can be computed */
+ return;
+ delta_count--; /* One less than the real point count. Note size_t
+ is unsigned. */
+
+ curve->interval = stp_malloc(sizeof(double) * delta_count);
+ for (i = 0; i < delta_count; i++)
+ {
+ if (curve->piecewise)
+ curve->interval[i] = data[(2 * (i + 1)) + 1] - data[(2 * i) + 1];
+ else
+ curve->interval[i] = data[i + 1] - data[i];
+ }
+}
+
+static void
+compute_spline_deltas_piecewise(stp_curve_t *curve)
+{
+ int i;
+ int k;
+ double *u;
+ double *y2;
+ const double *data = NULL;
+ const stp_curve_point_t *dp;
+ size_t point_count;
+ size_t real_point_count;
+ double sig;
+ double p;
+
+ point_count = get_point_count(curve);
+
+ stp_sequence_get_data(curve->seq, &real_point_count, &data);
+ dp = (const stp_curve_point_t *)data;
+ real_point_count = real_point_count / 2;
+
+ u = stp_malloc(sizeof(double) * real_point_count);
+ y2 = stp_malloc(sizeof(double) * real_point_count);
+
+ if (curve->wrap_mode == STP_CURVE_WRAP_AROUND)
+ {
+ int reps = 3;
+ int count = reps * real_point_count;
+ double *y2a = stp_malloc(sizeof(double) * count);
+ double *ua = stp_malloc(sizeof(double) * count);
+ y2a[0] = 0.0;
+ ua[0] = 0.0;
+ for (i = 1; i < count - 1; i++)
+ {
+ int im1 = (i - 1) % point_count;
+ int ia = i % point_count;
+ int ip1 = (i + 1) % point_count;
+
+ sig = (dp[ia].x - dp[im1].x) / (dp[ip1].x - dp[im1].x);
+ p = sig * y2a[im1] + 2.0;
+ y2a[i] = (sig - 1.0) / p;
+
+ ua[i] = ((dp[ip1].y - dp[ia].y) / (dp[ip1].x - dp[ia].x)) -
+ ((dp[ia].y - dp[im1].y) / (dp[ia].x - dp[im1].x));
+ ua[i] =
+ (((6.0 * ua[ia]) / (dp[ip1].x - dp[im1].x)) - (sig * ua[im1])) / p;
+ }
+ y2a[count - 1] = 0.0;
+ for (k = count - 2 ; k >= 0; k--)
+ y2a[k] = y2a[k] * y2a[k + 1] + ua[k];
+ memcpy(u, ua + ((reps / 2) * point_count),
+ sizeof(double) * real_point_count);
+ memcpy(y2, y2a + ((reps / 2) * point_count),
+ sizeof(double) * real_point_count);
+ stp_free(y2a);
+ stp_free(ua);
+ }
+ else
+ {
+ int count = real_point_count - 1;
+
+ y2[0] = 0;
+ u[0] = 2 * (dp[1].y - dp[0].y);
+ for (i = 1; i < count; i++)
+ {
+ int im1 = (i - 1);
+ int ip1 = (i + 1);
+
+ sig = (dp[i].x - dp[im1].x) / (dp[ip1].x - dp[im1].x);
+ p = sig * y2[im1] + 2.0;
+ y2[i] = (sig - 1.0) / p;
+
+ u[i] = ((dp[ip1].y - dp[i].y) / (dp[ip1].x - dp[i].x)) -
+ ((dp[i].y - dp[im1].y) / (dp[i].x - dp[im1].x));
+ u[i] =
+ (((6.0 * u[i]) / (dp[ip1].x - dp[im1].x)) - (sig * u[im1])) / p;
+ stp_deprintf(STP_DBG_CURVE,
+ "%d sig %f p %f y2 %f u %f x %f %f %f y %f %f %f\n",
+ i, sig, p, y2[i], u[i],
+ dp[im1].x, dp[i].x, dp[ip1].x,
+ dp[im1].y, dp[i].y, dp[ip1].y);
+ }
+ y2[count] = 0.0;
+ u[count] = 0.0;
+ for (k = real_point_count - 2; k >= 0; k--)
+ y2[k] = y2[k] * y2[k + 1] + u[k];
+ }
+
+ curve->interval = y2;
+ stp_free(u);
+}
+
+static void
+compute_spline_deltas_dense(stp_curve_t *curve)
+{
+ int i;
+ int k;
+ double *u;
+ double *y2;
+ const double *y;
+ size_t point_count;
+ size_t real_point_count;
+ double sig;
+ double p;
+
+ point_count = get_point_count(curve);
+
+ stp_sequence_get_data(curve->seq, &real_point_count, &y);
+ u = stp_malloc(sizeof(double) * real_point_count);
+ y2 = stp_malloc(sizeof(double) * real_point_count);
+
+ if (curve->wrap_mode == STP_CURVE_WRAP_AROUND)
+ {
+ int reps = 3;
+ int count = reps * real_point_count;
+ double *y2a = stp_malloc(sizeof(double) * count);
+ double *ua = stp_malloc(sizeof(double) * count);
+ y2a[0] = 0.0;
+ ua[0] = 0.0;
+ for (i = 1; i < count - 1; i++)
+ {
+ int im1 = (i - 1);
+ int ip1 = (i + 1);
+ int im1a = im1 % point_count;
+ int ia = i % point_count;
+ int ip1a = ip1 % point_count;
+
+ sig = (i - im1) / (ip1 - im1);
+ p = sig * y2a[im1] + 2.0;
+ y2a[i] = (sig - 1.0) / p;
+
+ ua[i] = y[ip1a] - 2 * y[ia] + y[im1a];
+ ua[i] = 3.0 * ua[i] - sig * ua[im1] / p;
+ }
+ y2a[count - 1] = 0.0;
+ for (k = count - 2 ; k >= 0; k--)
+ y2a[k] = y2a[k] * y2a[k + 1] + ua[k];
+ memcpy(u, ua + ((reps / 2) * point_count),
+ sizeof(double) * real_point_count);
+ memcpy(y2, y2a + ((reps / 2) * point_count),
+ sizeof(double) * real_point_count);
+ stp_free(y2a);
+ stp_free(ua);
+ }
+ else
+ {
+ int count = real_point_count - 1;
+
+ y2[0] = 0;
+ u[0] = 2 * (y[1] - y[0]);
+ for (i = 1; i < count; i++)
+ {
+ int im1 = (i - 1);
+ int ip1 = (i + 1);
+
+ sig = (i - im1) / (ip1 - im1);
+ p = sig * y2[im1] + 2.0;
+ y2[i] = (sig - 1.0) / p;
+
+ u[i] = y[ip1] - 2 * y[i] + y[im1];
+ u[i] = 3.0 * u[i] - sig * u[im1] / p;
+ }
+
+ u[count] = 2 * (y[count] - y[count - 1]);
+ y2[count] = 0.0;
+
+ u[count] = 0.0;
+ for (k = real_point_count - 2; k >= 0; k--)
+ y2[k] = y2[k] * y2[k + 1] + u[k];
+ }
+
+ curve->interval = y2;
+ stp_free(u);
+}
+
+static void
+compute_spline_deltas(stp_curve_t *curve)
+{
+ if (curve->piecewise)
+ compute_spline_deltas_piecewise(curve);
+ else
+ compute_spline_deltas_dense(curve);
+}
+
+/*
+ * Recompute the delta values for interpolation.
+ * When we actually do support spline curves, this routine will
+ * compute the second derivatives for that purpose, too.
+ */
+static void
+compute_intervals(stp_curve_t *curve)
+{
+ if (curve->interval)
+ {
+ stp_free(curve->interval);
+ curve->interval = NULL;
+ }
+ if (stp_sequence_get_size(curve->seq) > 0)
+ {
+ switch (curve->curve_type)
+ {
+ case STP_CURVE_TYPE_SPLINE:
+ compute_spline_deltas(curve);
+ break;
+ case STP_CURVE_TYPE_LINEAR:
+ compute_linear_deltas(curve);
+ break;
+ }
+ }
+ curve->recompute_interval = 0;
+}
+
+static int
+stpi_curve_set_points(stp_curve_t *curve, size_t points)
+{
+ if (points < 2)
+ return 0;
+ if (points > curve_point_limit ||
+ (curve->wrap_mode == STP_CURVE_WRAP_AROUND &&
+ points > curve_point_limit - 1))
+ return 0;
+ clear_curve_data(curve);
+ if (curve->wrap_mode == STP_CURVE_WRAP_AROUND)
+ points++;
+ if (curve->piecewise)
+ points *= 2;
+ if ((stp_sequence_set_size(curve->seq, points)) == 0)
+ return 0;
+ return 1;
+}
+
+/*
+ * Create a default curve
+ */
+static void
+stpi_curve_ctor(stp_curve_t *curve, stp_curve_wrap_mode_t wrap_mode)
+{
+ curve->seq = stp_sequence_create();
+ stp_sequence_set_bounds(curve->seq, 0.0, 1.0);
+ curve->curve_type = STP_CURVE_TYPE_LINEAR;
+ curve->wrap_mode = wrap_mode;
+ curve->piecewise = 0;
+ stpi_curve_set_points(curve, 2);
+ curve->recompute_interval = 1;
+ if (wrap_mode == STP_CURVE_WRAP_NONE)
+ curve->gamma = 1.0;
+ stp_sequence_set_point(curve->seq, 0, 0);
+ stp_sequence_set_point(curve->seq, 1, 1);
+}
+
+stp_curve_t *
+stp_curve_create(stp_curve_wrap_mode_t wrap_mode)
+{
+ stp_curve_t *ret;
+ if (wrap_mode != STP_CURVE_WRAP_NONE && wrap_mode != STP_CURVE_WRAP_AROUND)
+ return NULL;
+ ret = stp_zalloc(sizeof(stp_curve_t));
+ stpi_curve_ctor(ret, wrap_mode);
+ return ret;
+}
+
+static void
+curve_dtor(stp_curve_t *curve)
+{
+ check_curve(curve);
+ clear_curve_data(curve);
+ if (curve->seq)
+ stp_sequence_destroy(curve->seq);
+ memset(curve, 0, sizeof(stp_curve_t));
+ curve->curve_type = -1;
+}
+
+void
+stp_curve_destroy(stp_curve_t *curve)
+{
+ curve_dtor(curve);
+ stp_free(curve);
+}
+
+void
+stp_curve_copy(stp_curve_t *dest, const stp_curve_t *source)
+{
+ check_curve(dest);
+ check_curve(source);
+ curve_dtor(dest);
+ dest->curve_type = source->curve_type;
+ dest->wrap_mode = source->wrap_mode;
+ dest->gamma = source->gamma;
+ dest->seq = stp_sequence_create_copy(source->seq);
+ dest->piecewise = source->piecewise;
+ dest->recompute_interval = 1;
+}
+
+stp_curve_t *
+stp_curve_create_copy(const stp_curve_t *curve)
+{
+ stp_curve_t *ret;
+ check_curve(curve);
+ ret = stp_curve_create(curve->wrap_mode);
+ stp_curve_copy(ret, curve);
+ return ret;
+}
+
+int
+stp_curve_set_bounds(stp_curve_t *curve, double low, double high)
+{
+ check_curve(curve);
+ return stp_sequence_set_bounds(curve->seq, low, high);
+}
+
+void
+stp_curve_get_bounds(const stp_curve_t *curve, double *low, double *high)
+{
+ check_curve(curve);
+ stp_sequence_get_bounds(curve->seq, low, high);
+}
+
+/*
+ * Find the minimum and maximum points on the curve. This does not
+ * attempt to find the minimum and maximum interpolations; with cubic
+ * splines these could exceed the boundaries. That's OK; the interpolation
+ * code will clip them to the bounds.
+ */
+void
+stp_curve_get_range(const stp_curve_t *curve, double *low, double *high)
+{
+ check_curve(curve);
+ stp_sequence_get_range(curve->seq, low, high);
+}
+
+size_t
+stp_curve_count_points(const stp_curve_t *curve)
+{
+ check_curve(curve);
+ return get_point_count(curve);
+}
+
+stp_curve_wrap_mode_t
+stp_curve_get_wrap(const stp_curve_t *curve)
+{
+ check_curve(curve);
+ return curve->wrap_mode;
+}
+
+int
+stp_curve_is_piecewise(const stp_curve_t *curve)
+{
+ check_curve(curve);
+ return curve->piecewise;
+}
+
+int
+stp_curve_set_interpolation_type(stp_curve_t *curve, stp_curve_type_t itype)
+{
+ check_curve(curve);
+ if (itype < 0 || itype >= stpi_curve_type_count)
+ return 0;
+ curve->curve_type = itype;
+ return 1;
+}
+
+stp_curve_type_t
+stp_curve_get_interpolation_type(const stp_curve_t *curve)
+{
+ check_curve(curve);
+ return curve->curve_type;
+}
+
+int
+stp_curve_set_gamma(stp_curve_t *curve, double fgamma)
+{
+ check_curve(curve);
+ if (curve->wrap_mode || ! finite(fgamma) || fgamma == 0.0)
+ return 0;
+ clear_curve_data(curve);
+ curve->gamma = fgamma;
+ stp_curve_resample(curve, 2);
+ return 1;
+}
+
+double
+stp_curve_get_gamma(const stp_curve_t *curve)
+{
+ check_curve(curve);
+ return curve->gamma;
+}
+
+int
+stp_curve_set_data(stp_curve_t *curve, size_t count, const double *data)
+{
+ size_t i;
+ size_t real_count = count;
+ double low, high;
+ check_curve(curve);
+ if (count < 2)
+ return 0;
+ if (curve->wrap_mode == STP_CURVE_WRAP_AROUND)
+ real_count++;
+ if (real_count > curve_point_limit)
+ return 0;
+
+ /* Validate the data before we commit to it. */
+ stp_sequence_get_bounds(curve->seq, &low, &high);
+ for (i = 0; i < count; i++)
+ if (! finite(data[i]) || data[i] < low || data[i] > high)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_set_data: datum out of bounds: "
+ "%g (require %g <= x <= %g), n = %d\n",
+ data[i], low, high, i);
+ return 0;
+ }
+ /* Allocate sequence; also accounts for WRAP_MODE */
+ stpi_curve_set_points(curve, count);
+ curve->gamma = 0.0;
+ stp_sequence_set_subrange(curve->seq, 0, count, data);
+
+ if (curve->wrap_mode == STP_CURVE_WRAP_AROUND)
+ stp_sequence_set_point(curve->seq, count, data[0]);
+ curve->recompute_interval = 1;
+ curve->piecewise = 0;
+
+ return 1;
+}
+
+int
+stp_curve_set_data_points(stp_curve_t *curve, size_t count,
+ const stp_curve_point_t *data)
+{
+ size_t i;
+ size_t real_count = count;
+ double low, high;
+ double last_x = -1;
+ check_curve(curve);
+ if (count < 2)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_set_data_points: too few points %d\n", count);
+ return 0;
+ }
+ if (curve->wrap_mode == STP_CURVE_WRAP_AROUND)
+ real_count++;
+ if (real_count > curve_point_limit)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_set_data_points: too many points %d\n",
+ real_count);
+ return 0;
+ }
+
+ /* Validate the data before we commit to it. */
+ stp_sequence_get_bounds(curve->seq, &low, &high);
+ for (i = 0; i < count; i++)
+ {
+ if (! finite(data[i].y) || data[i].y < low || data[i].y > high)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_set_data_points: datum out of bounds: "
+ "%g (require %g <= x <= %g), n = %d\n",
+ data[i].y, low, high, i);
+ return 0;
+ }
+ if (i == 0 && data[i].x != 0.0)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_set_data_points: first point must have x=0\n");
+ return 0;
+ }
+ if (curve->wrap_mode == STP_CURVE_WRAP_NONE && i == count - 1 &&
+ data[i].x != 1.0)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_set_data_points: last point must have x=1\n");
+ return 0;
+ }
+ if (curve->wrap_mode == STP_CURVE_WRAP_AROUND &&
+ data[i].x >= 1.0 - .000001)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_set_data_points: horizontal value must "
+ "not exceed .99999\n");
+ return 0;
+ }
+ if (data[i].x < 0 || data[i].x > 1)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_set_data_points: horizontal position out of bounds: "
+ "%g, n = %d\n",
+ data[i].x, i);
+ return 0;
+ }
+ if (data[i].x - .000001 < last_x)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_set_data_points: horizontal position must "
+ "exceed previous position by .000001: %g, %g, n = %d\n",
+ data[i].x, last_x, i);
+ return 0;
+ }
+ last_x = data[i].x;
+ }
+ /* Allocate sequence; also accounts for WRAP_MODE */
+ curve->piecewise = 1;
+ stpi_curve_set_points(curve, count);
+ curve->gamma = 0.0;
+ stp_sequence_set_subrange(curve->seq, 0, count * 2, (const double *) data);
+
+ if (curve->wrap_mode == STP_CURVE_WRAP_AROUND)
+ {
+ stp_sequence_set_point(curve->seq, count * 2, data[0].x);
+ stp_sequence_set_point(curve->seq, count * 2 + 1, data[0].y);
+ }
+ curve->recompute_interval = 1;
+
+ return 1;
+}
+
+
+/*
+ * Note that we return a pointer to the raw data here.
+ * A lot of operations change the data vector, that's why we don't
+ * guarantee it across non-const calls.
+ */
+const double *
+stp_curve_get_data(const stp_curve_t *curve, size_t *count)
+{
+ const double *ret;
+ check_curve(curve);
+ if (curve->piecewise)
+ return NULL;
+ stp_sequence_get_data(curve->seq, count, &ret);
+ *count = get_point_count(curve);
+ return ret;
+}
+
+const stp_curve_point_t *
+stp_curve_get_data_points(const stp_curve_t *curve, size_t *count)
+{
+ const double *ret;
+ check_curve(curve);
+ if (!curve->piecewise)
+ return NULL;
+ stp_sequence_get_data(curve->seq, count, &ret);
+ *count = get_point_count(curve);
+ return (const stp_curve_point_t *) ret;
+}
+
+static const double *
+stpi_curve_get_data_internal(const stp_curve_t *curve, size_t *count)
+{
+ const double *ret;
+ check_curve(curve);
+ stp_sequence_get_data(curve->seq, count, &ret);
+ *count = get_point_count(curve);
+ if (curve->piecewise)
+ *count *= 2;
+ return ret;
+}
+
+
+/* "Overloaded" functions */
+
+#define DEFINE_DATA_SETTER(t, name) \
+int \
+stp_curve_set_##name##_data(stp_curve_t *curve, size_t count, const t *data) \
+{ \
+ double *tmp_data; \
+ size_t i; \
+ int status; \
+ size_t real_count = count; \
+ \
+ check_curve(curve); \
+ if (count < 2) \
+ return 0; \
+ if (curve->wrap_mode == STP_CURVE_WRAP_AROUND) \
+ real_count++; \
+ if (real_count > curve_point_limit) \
+ return 0; \
+ tmp_data = stp_malloc(count * sizeof(double)); \
+ for (i = 0; i < count; i++) \
+ tmp_data[i] = (double) data[i]; \
+ status = stp_curve_set_data(curve, count, tmp_data); \
+ stp_free(tmp_data); \
+ return status; \
+ }
+
+DEFINE_DATA_SETTER(float, float)
+DEFINE_DATA_SETTER(long, long)
+DEFINE_DATA_SETTER(unsigned long, ulong)
+DEFINE_DATA_SETTER(int, int)
+DEFINE_DATA_SETTER(unsigned int, uint)
+DEFINE_DATA_SETTER(short, short)
+DEFINE_DATA_SETTER(unsigned short, ushort)
+
+
+#define DEFINE_DATA_ACCESSOR(t, name) \
+const t * \
+stp_curve_get_##name##_data(const stp_curve_t *curve, size_t *count) \
+{ \
+ if (curve->piecewise) \
+ return 0; \
+ return stp_sequence_get_##name##_data(curve->seq, count); \
+}
+
+DEFINE_DATA_ACCESSOR(float, float)
+DEFINE_DATA_ACCESSOR(long, long)
+DEFINE_DATA_ACCESSOR(unsigned long, ulong)
+DEFINE_DATA_ACCESSOR(int, int)
+DEFINE_DATA_ACCESSOR(unsigned int, uint)
+DEFINE_DATA_ACCESSOR(short, short)
+DEFINE_DATA_ACCESSOR(unsigned short, ushort)
+
+
+stp_curve_t *
+stp_curve_get_subrange(const stp_curve_t *curve, size_t start, size_t count)
+{
+ stp_curve_t *retval;
+ size_t ncount;
+ double blo, bhi;
+ const double *data;
+ if (start + count > stp_curve_count_points(curve) || count < 2)
+ return NULL;
+ if (curve->piecewise)
+ return NULL;
+ retval = stp_curve_create(STP_CURVE_WRAP_NONE);
+ stp_curve_get_bounds(curve, &blo, &bhi);
+ stp_curve_set_bounds(retval, blo, bhi);
+ data = stp_curve_get_data(curve, &ncount);
+ if (! stp_curve_set_data(retval, count, data + start))
+ {
+ stp_curve_destroy(retval);
+ return NULL;
+ }
+ return retval;
+}
+
+int
+stp_curve_set_subrange(stp_curve_t *curve, const stp_curve_t *range,
+ size_t start)
+{
+ double blo, bhi;
+ double rlo, rhi;
+ const double *data;
+ size_t count;
+ check_curve(curve);
+ if (start + stp_curve_count_points(range) > stp_curve_count_points(curve))
+ return 0;
+ if (curve->piecewise)
+ return 0;
+ stp_sequence_get_bounds(curve->seq, &blo, &bhi);
+ stp_sequence_get_range(curve->seq, &rlo, &rhi);
+ if (rlo < blo || rhi > bhi)
+ return 0;
+ stp_sequence_get_data(range->seq, &count, &data);
+ curve->recompute_interval = 1;
+ curve->gamma = 0.0;
+ invalidate_auxiliary_data(curve);
+ stp_sequence_set_subrange(curve->seq, start, stp_curve_count_points(range),
+ data);
+ return 1;
+}
+
+
+int
+stp_curve_set_point(stp_curve_t *curve, size_t where, double data)
+{
+ check_curve(curve);
+ if (where >= get_point_count(curve))
+ return 0;
+ curve->gamma = 0.0;
+
+ if (curve->piecewise)
+ return 0;
+ if ((stp_sequence_set_point(curve->seq, where, data)) == 0)
+ return 0;
+ if (where == 0 && curve->wrap_mode == STP_CURVE_WRAP_AROUND)
+ if ((stp_sequence_set_point(curve->seq,
+ get_point_count(curve), data)) == 0)
+ return 0;
+ invalidate_auxiliary_data(curve);
+ return 1;
+}
+
+int
+stp_curve_get_point(const stp_curve_t *curve, size_t where, double *data)
+{
+ check_curve(curve);
+ if (where >= get_point_count(curve))
+ return 0;
+ if (curve->piecewise)
+ return 0;
+ return stp_sequence_get_point(curve->seq, where, data);
+}
+
+const stp_sequence_t *
+stp_curve_get_sequence(const stp_curve_t *curve)
+{
+ check_curve(curve);
+ if (curve->piecewise)
+ return NULL;
+ return curve->seq;
+}
+
+int
+stp_curve_rescale(stp_curve_t *curve, double scale,
+ stp_curve_compose_t mode, stp_curve_bounds_t bounds_mode)
+{
+ size_t real_point_count;
+ int i;
+ double nblo;
+ double nbhi;
+ size_t count;
+
+ check_curve(curve);
+
+ real_point_count = get_real_point_count(curve);
+
+ stp_sequence_get_bounds(curve->seq, &nblo, &nbhi);
+ if (bounds_mode == STP_CURVE_BOUNDS_RESCALE)
+ {
+ switch (mode)
+ {
+ case STP_CURVE_COMPOSE_ADD:
+ nblo += scale;
+ nbhi += scale;
+ break;
+ case STP_CURVE_COMPOSE_MULTIPLY:
+ if (scale < 0)
+ {
+ double tmp = nblo * scale;
+ nblo = nbhi * scale;
+ nbhi = tmp;
+ }
+ else
+ {
+ nblo *= scale;
+ nbhi *= scale;
+ }
+ break;
+ case STP_CURVE_COMPOSE_EXPONENTIATE:
+ if (scale == 0.0)
+ return 0;
+ if (nblo < 0)
+ return 0;
+ nblo = pow(nblo, scale);
+ nbhi = pow(nbhi, scale);
+ break;
+ default:
+ return 0;
+ }
+ }
+
+ if (! finite(nbhi) || ! finite(nblo))
+ return 0;
+
+ count = get_point_count(curve);
+ if (count)
+ {
+ double *tmp;
+ size_t scount;
+ int stride = 1;
+ int offset = 0;
+ const double *data;
+ if (curve->piecewise)
+ {
+ stride = 2;
+ offset = 1;
+ }
+ stp_sequence_get_data(curve->seq, &scount, &data);
+ tmp = stp_malloc(sizeof(double) * scount);
+ memcpy(tmp, data, scount * sizeof(double));
+ for (i = offset; i < scount; i += stride)
+ {
+ switch (mode)
+ {
+ case STP_CURVE_COMPOSE_ADD:
+ tmp[i] = tmp[i] + scale;
+ break;
+ case STP_CURVE_COMPOSE_MULTIPLY:
+ tmp[i] = tmp[i] * scale;
+ break;
+ case STP_CURVE_COMPOSE_EXPONENTIATE:
+ tmp[i] = pow(tmp[i], scale);
+ break;
+ }
+ if (tmp[i] > nbhi || tmp[i] < nblo)
+ {
+ if (bounds_mode == STP_CURVE_BOUNDS_ERROR)
+ {
+ stp_free(tmp);
+ return(0);
+ }
+ else if (tmp[i] > nbhi)
+ tmp[i] = nbhi;
+ else
+ tmp[i] = nblo;
+ }
+ }
+ stp_sequence_set_bounds(curve->seq, nblo, nbhi);
+ curve->gamma = 0.0;
+ stpi_curve_set_points(curve, count);
+ stp_sequence_set_subrange(curve->seq, 0, scount, tmp);
+ stp_free(tmp);
+ curve->recompute_interval = 1;
+ invalidate_auxiliary_data(curve);
+ }
+ return 1;
+}
+
+static int
+stpi_curve_check_parameters(stp_curve_t *curve, size_t points)
+{
+ double blo, bhi;
+ if (curve->gamma && curve->wrap_mode)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "curve sets both gamma and wrap_mode\n");
+ return 0;
+ }
+ stp_sequence_get_bounds(curve->seq, &blo, &bhi);
+ if (blo > bhi)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "curve low bound is greater than high bound\n");
+ return 0;
+ }
+ return 1;
+}
+
+static inline double
+interpolate_gamma_internal(const stp_curve_t *curve, double where)
+{
+ double fgamma = curve->gamma;
+ double blo, bhi;
+ size_t real_point_count;
+
+ real_point_count = get_real_point_count(curve);;
+
+ if (real_point_count)
+ where /= (real_point_count - 1);
+ if (fgamma < 0)
+ {
+ where = 1.0 - where;
+ fgamma = -fgamma;
+ }
+ stp_sequence_get_bounds(curve->seq, &blo, &bhi);
+ stp_deprintf(STP_DBG_CURVE,
+ "interpolate_gamma %f %f %f %f %f\n", where, fgamma,
+ blo, bhi, pow(where, fgamma));
+ return blo + (bhi - blo) * pow(where, fgamma);
+}
+
+static inline double
+do_interpolate_spline(double low, double high, double frac,
+ double interval_low, double interval_high,
+ double x_interval)
+{
+ double a = 1.0 - frac;
+ double b = frac;
+ double retval =
+ ((a * a * a - a) * interval_low) + ((b * b * b - b) * interval_high);
+ retval = retval * x_interval * x_interval / 6;
+ retval += (a * low) + (b * high);
+ return retval;
+}
+
+static inline double
+interpolate_point_internal(stp_curve_t *curve, double where)
+{
+ int integer = where;
+ double frac = where - (double) integer;
+ double bhi, blo;
+
+ if (frac == 0.0)
+ {
+ double val;
+ if ((stp_sequence_get_point(curve->seq, integer, &val)) == 0)
+ return HUGE_VAL; /* Infinity */
+ return val;
+ }
+ if (curve->recompute_interval)
+ compute_intervals(curve);
+ if (curve->curve_type == STP_CURVE_TYPE_LINEAR)
+ {
+ double val;
+ if ((stp_sequence_get_point(curve->seq, integer, &val)) == 0)
+ return HUGE_VAL; /* Infinity */
+ return val + frac * curve->interval[integer];
+ }
+ else
+ {
+ size_t point_count;
+ double ival, ip1val;
+ double retval;
+ int i = integer;
+ int ip1 = integer + 1;
+
+ point_count = get_point_count(curve);
+
+ if (ip1 >= point_count)
+ ip1 -= point_count;
+
+ if ((stp_sequence_get_point(curve->seq, i, &ival)) == 0 ||
+ (stp_sequence_get_point(curve->seq, ip1, &ip1val)) == 0)
+ return HUGE_VAL; /* Infinity */
+
+ retval = do_interpolate_spline(ival, ip1val, frac, curve->interval[i],
+ curve->interval[ip1], 1.0);
+
+ stp_sequence_get_bounds(curve->seq, &blo, &bhi);
+ if (retval > bhi)
+ retval = bhi;
+ if (retval < blo)
+ retval = blo;
+ return retval;
+ }
+}
+
+int
+stp_curve_interpolate_value(const stp_curve_t *curve, double where,
+ double *result)
+{
+ size_t limit;
+
+ check_curve(curve);
+ if (curve->piecewise)
+ return 0;
+
+ limit = get_real_point_count(curve);
+
+ if (where < 0 || where > limit)
+ return 0;
+ if (curve->gamma) /* this means a pure gamma curve */
+ *result = interpolate_gamma_internal(curve, where);
+ else
+ *result = interpolate_point_internal((stp_curve_t *) curve, where);
+ return 1;
+}
+
+int
+stp_curve_resample(stp_curve_t *curve, size_t points)
+{
+ size_t limit = points;
+ size_t old;
+ size_t i;
+ double *new_vec;
+
+ check_curve(curve);
+
+ if (points == get_point_count(curve) && curve->seq && !(curve->piecewise))
+ return 1;
+
+ if (points < 2)
+ return 1;
+
+ if (curve->wrap_mode == STP_CURVE_WRAP_AROUND)
+ limit++;
+ if (limit > curve_point_limit)
+ return 0;
+ old = get_real_point_count(curve);
+ if (old)
+ old--;
+ if (!old)
+ old = 1;
+
+ new_vec = stp_malloc(sizeof(double) * limit);
+
+ /*
+ * Be very careful how we calculate the location along the scale!
+ * If we're not careful how we do it, we might get a small roundoff
+ * error
+ */
+ if (curve->piecewise)
+ {
+ double blo, bhi;
+ int curpos = 0;
+ stp_sequence_get_bounds(curve->seq, &blo, &bhi);
+ if (curve->recompute_interval)
+ compute_intervals(curve);
+ for (i = 0; i < old; i++)
+ {
+ double low;
+ double high;
+ double low_y;
+ double high_y;
+ double x_delta;
+ if (!stp_sequence_get_point(curve->seq, i * 2, &low))
+ {
+ stp_free(new_vec);
+ return 0;
+ }
+ if (i == old - 1)
+ high = 1.0;
+ else if (!stp_sequence_get_point(curve->seq, ((i + 1) * 2), &high))
+ {
+ stp_free(new_vec);
+ return 0;
+ }
+ if (!stp_sequence_get_point(curve->seq, (i * 2) + 1, &low_y))
+ {
+ stp_free(new_vec);
+ return 0;
+ }
+ if (!stp_sequence_get_point(curve->seq, ((i + 1) * 2) + 1, &high_y))
+ {
+ stp_free(new_vec);
+ return 0;
+ }
+ stp_deprintf(STP_DBG_CURVE,
+ "Filling slots at %d %d: %f %f %f %f %d\n",
+ i,curpos, high, low, high_y, low_y, limit);
+ x_delta = high - low;
+ high *= (limit - 1);
+ low *= (limit - 1);
+ while (curpos <= high)
+ {
+ double frac = (curpos - low) / (high - low);
+ if (curve->curve_type == STP_CURVE_TYPE_LINEAR)
+ new_vec[curpos] = low_y + frac * (high_y - low_y);
+ else
+ new_vec[curpos] =
+ do_interpolate_spline(low_y, high_y, frac,
+ curve->interval[i],
+ curve->interval[i + 1],
+ x_delta);
+ if (new_vec[curpos] < blo)
+ new_vec[curpos] = blo;
+ if (new_vec[curpos] > bhi)
+ new_vec[curpos] = bhi;
+ stp_deprintf(STP_DBG_CURVE,
+ " Filling slot %d %f %f\n",
+ curpos, frac, new_vec[curpos]);
+ curpos++;
+ }
+ }
+ curve->piecewise = 0;
+ }
+ else
+ {
+ for (i = 0; i < limit; i++)
+ if (curve->gamma)
+ new_vec[i] =
+ interpolate_gamma_internal(curve, ((double) i * (double) old /
+ (double) (limit - 1)));
+ else
+ new_vec[i] =
+ interpolate_point_internal(curve, ((double) i * (double) old /
+ (double) (limit - 1)));
+ }
+ stpi_curve_set_points(curve, points);
+ stp_sequence_set_subrange(curve->seq, 0, limit, new_vec);
+ curve->recompute_interval = 1;
+ stp_free(new_vec);
+ return 1;
+}
+
+static unsigned
+gcd(unsigned a, unsigned b)
+{
+ unsigned tmp;
+ if (b > a)
+ {
+ tmp = a;
+ a = b;
+ b = tmp;
+ }
+ while (1)
+ {
+ tmp = a % b;
+ if (tmp == 0)
+ return b;
+ a = b;
+ b = tmp;
+ }
+}
+
+static unsigned
+lcm(unsigned a, unsigned b)
+{
+ if (a == b)
+ return a;
+ else if (a * b == 0)
+ return a > b ? a : b;
+ else
+ {
+ double rval = (double) a / gcd(a, b) * b;
+ if (rval > curve_point_limit)
+ return curve_point_limit;
+ else
+ return rval;
+ }
+}
+
+static int
+create_gamma_curve(stp_curve_t **retval, double lo, double hi, double fgamma,
+ int points)
+{
+ *retval = stp_curve_create(STP_CURVE_WRAP_NONE);
+ if (stp_curve_set_bounds(*retval, lo, hi) &&
+ stp_curve_set_gamma(*retval, fgamma) &&
+ stp_curve_resample(*retval, points))
+ return 1;
+ stp_curve_destroy(*retval);
+ *retval = 0;
+ return 0;
+}
+
+static int
+interpolate_points(stp_curve_t *a, stp_curve_t *b,
+ stp_curve_compose_t mode,
+ int points, double *tmp_data)
+{
+ double pa, pb;
+ int i;
+ size_t points_a = stp_curve_count_points(a);
+ size_t points_b = stp_curve_count_points(b);
+ for (i = 0; i < points; i++)
+ {
+ if (!stp_curve_interpolate_value
+ (a, (double) i * (points_a - 1) / (points - 1), &pa))
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "interpolate_points: interpolate curve a value failed\n");
+ return 0;
+ }
+ if (!stp_curve_interpolate_value
+ (b, (double) i * (points_b - 1) / (points - 1), &pb))
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "interpolate_points: interpolate curve b value failed\n");
+ return 0;
+ }
+ if (mode == STP_CURVE_COMPOSE_ADD)
+ pa += pb;
+ else
+ pa *= pb;
+ if (! finite(pa))
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "interpolate_points: interpolated point %lu is invalid\n",
+ (unsigned long) i);
+ return 0;
+ }
+ tmp_data[i] = pa;
+ }
+ return 1;
+}
+
+int
+stp_curve_compose(stp_curve_t **retval,
+ stp_curve_t *a, stp_curve_t *b,
+ stp_curve_compose_t mode, int points)
+{
+ stp_curve_t *ret;
+ double *tmp_data;
+ double gamma_a = stp_curve_get_gamma(a);
+ double gamma_b = stp_curve_get_gamma(b);
+ unsigned points_a = stp_curve_count_points(a);
+ unsigned points_b = stp_curve_count_points(b);
+ double alo, ahi, blo, bhi;
+
+ if (a->piecewise && b->piecewise)
+ return 0;
+ if (a->piecewise)
+ {
+ stp_curve_t *a_save = a;
+ a = stp_curve_create_copy(a_save);
+ stp_curve_resample(a, stp_curve_count_points(b));
+ }
+ if (b->piecewise)
+ {
+ stp_curve_t *b_save = b;
+ b = stp_curve_create_copy(b_save);
+ stp_curve_resample(b, stp_curve_count_points(a));
+ }
+
+ if (mode != STP_CURVE_COMPOSE_ADD && mode != STP_CURVE_COMPOSE_MULTIPLY)
+ return 0;
+ if (stp_curve_get_wrap(a) != stp_curve_get_wrap(b))
+ return 0;
+ stp_curve_get_bounds(a, &alo, &ahi);
+ stp_curve_get_bounds(b, &blo, &bhi);
+ if (mode == STP_CURVE_COMPOSE_MULTIPLY && (alo < 0 || blo < 0))
+ return 0;
+
+ if (stp_curve_get_wrap(a) == STP_CURVE_WRAP_AROUND)
+ {
+ points_a++;
+ points_b++;
+ }
+ if (points == -1)
+ {
+ points = lcm(points_a, points_b);
+ if (stp_curve_get_wrap(a) == STP_CURVE_WRAP_AROUND)
+ points--;
+ }
+ if (points < 2 || points > curve_point_limit ||
+ ((stp_curve_get_wrap(a) == STP_CURVE_WRAP_AROUND) &&
+ points > curve_point_limit - 1))
+ return 0;
+
+ if (gamma_a && gamma_b && gamma_a * gamma_b > 0 &&
+ mode == STP_CURVE_COMPOSE_MULTIPLY)
+ return create_gamma_curve(retval, alo * blo, ahi * bhi, gamma_a + gamma_b,
+ points);
+ tmp_data = stp_malloc(sizeof(double) * points);
+ if (!interpolate_points(a, b, mode, points, tmp_data))
+ {
+ stp_free(tmp_data);
+ return 0;
+ }
+ ret = stp_curve_create(stp_curve_get_wrap(a));
+ if (mode == STP_CURVE_COMPOSE_ADD)
+ {
+ stp_curve_rescale(ret, (ahi - alo) + (bhi - blo),
+ STP_CURVE_COMPOSE_MULTIPLY, STP_CURVE_BOUNDS_RESCALE);
+ stp_curve_rescale(ret, alo + blo,
+ STP_CURVE_COMPOSE_ADD, STP_CURVE_BOUNDS_RESCALE);
+ }
+ else
+ {
+ stp_curve_rescale(ret, (ahi - alo) * (bhi - blo),
+ STP_CURVE_COMPOSE_MULTIPLY, STP_CURVE_BOUNDS_RESCALE);
+ stp_curve_rescale(ret, alo * blo,
+ STP_CURVE_COMPOSE_ADD, STP_CURVE_BOUNDS_RESCALE);
+ }
+ if (! stp_curve_set_data(ret, points, tmp_data))
+ goto bad1;
+ *retval = ret;
+ stp_free(tmp_data);
+ return 1;
+ bad1:
+ stp_curve_destroy(ret);
+ stp_free(tmp_data);
+ return 0;
+}
+
+
+stp_curve_t *
+stp_curve_create_from_xmltree(stp_mxml_node_t *curve) /* The curve node */
+{
+ const char *stmp; /* Temporary string */
+ stp_mxml_node_t *child; /* Child sequence node */
+ stp_curve_t *ret = NULL; /* Curve to return */
+ stp_curve_type_t curve_type; /* Type of curve */
+ stp_curve_wrap_mode_t wrap_mode; /* Curve wrap mode */
+ double fgamma; /* Gamma value */
+ stp_sequence_t *seq = NULL; /* Sequence data */
+ double low, high; /* Sequence bounds */
+ int piecewise = 0;
+
+ stp_xml_init();
+ /* Get curve type */
+ stmp = stp_mxmlElementGetAttr(curve, "type");
+ if (stmp)
+ {
+ if (!strcmp(stmp, "linear"))
+ curve_type = STP_CURVE_TYPE_LINEAR;
+ else if (!strcmp(stmp, "spline"))
+ curve_type = STP_CURVE_TYPE_SPLINE;
+ else
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_create_from_xmltree: %s: \"type\" invalid\n", stmp);
+ goto error;
+ }
+ }
+ else
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_create_from_xmltree: \"type\" missing\n");
+ goto error;
+ }
+ /* Get curve wrap mode */
+ stmp = stp_mxmlElementGetAttr(curve, "wrap");
+ if (stmp)
+ {
+ if (!strcmp(stmp, "nowrap"))
+ wrap_mode = STP_CURVE_WRAP_NONE;
+ else if (!strcmp(stmp, "wrap"))
+ {
+ wrap_mode = STP_CURVE_WRAP_AROUND;
+ }
+ else
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_create_from_xmltree: %s: \"wrap\" invalid\n", stmp);
+ goto error;
+ }
+ }
+ else
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_create_from_xmltree: \"wrap\" missing\n");
+ goto error;
+ }
+ /* Get curve gamma */
+ stmp = stp_mxmlElementGetAttr(curve, "gamma");
+ if (stmp)
+ {
+ fgamma = stp_xmlstrtod(stmp);
+ }
+ else
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_create_from_xmltree: \"gamma\" missing\n");
+ goto error;
+ }
+ /* If gamma is set, wrap_mode must be STP_CURVE_WRAP_NONE */
+ if (fgamma && wrap_mode != STP_CURVE_WRAP_NONE)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS, "stp_curve_create_from_xmltree: "
+ "gamma set and \"wrap\" is not STP_CURVE_WRAP_NONE\n");
+ goto error;
+ }
+ stmp = stp_mxmlElementGetAttr(curve, "piecewise");
+ if (stmp && strcmp(stmp, "true") == 0)
+ piecewise = 1;
+
+ /* Set up the curve */
+ ret = stp_curve_create(wrap_mode);
+ stp_curve_set_interpolation_type(ret, curve_type);
+
+ child = stp_mxmlFindElement(curve, curve, "sequence", NULL, NULL, STP_MXML_DESCEND);
+ if (child)
+ seq = stp_sequence_create_from_xmltree(child);
+
+ if (seq == NULL)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_create_from_xmltree: sequence read failed\n");
+ goto error;
+ }
+
+ /* Set curve bounds */
+ stp_sequence_get_bounds(seq, &low, &high);
+ stp_curve_set_bounds(ret, low, high);
+
+ if (fgamma)
+ stp_curve_set_gamma(ret, fgamma);
+ else /* Not a gamma curve, so set points */
+ {
+ size_t seq_count;
+ const double* data;
+
+ stp_sequence_get_data(seq, &seq_count, &data);
+ if (piecewise)
+ {
+ if ((seq_count % 2) != 0)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_create_from_xmltree: invalid data count %d\n",
+ seq_count);
+ goto error;
+ }
+ if (stp_curve_set_data_points(ret, seq_count / 2,
+ (const stp_curve_point_t *) data) == 0)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_create_from_xmltree: failed to set curve data points\n");
+ goto error;
+ }
+ }
+ else
+ {
+ if (stp_curve_set_data(ret, seq_count, data) == 0)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_create_from_xmltree: failed to set curve data\n");
+ goto error;
+ }
+ }
+ }
+
+ if (seq)
+ {
+ stp_sequence_destroy(seq);
+ seq = NULL;
+ }
+
+ /* Validate curve */
+ if (stpi_curve_check_parameters(ret, stp_curve_count_points(ret)) == 0)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_create_from_xmltree: parameter check failed\n");
+ goto error;
+ }
+
+ stp_xml_exit();
+
+ return ret;
+
+ error:
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_create_from_xmltree: error during curve read\n");
+ if (ret)
+ stp_curve_destroy(ret);
+ stp_xml_exit();
+ return NULL;
+}
+
+
+stp_mxml_node_t *
+stp_xmltree_create_from_curve(const stp_curve_t *curve) /* The curve */
+{
+ stp_curve_wrap_mode_t wrapmode;
+ stp_curve_type_t interptype;
+ double gammaval, low, high;
+ stp_sequence_t *seq;
+
+ char *cgamma;
+
+ stp_mxml_node_t *curvenode = NULL;
+ stp_mxml_node_t *child = NULL;
+
+ stp_xml_init();
+
+ /* Get curve details */
+ wrapmode = stp_curve_get_wrap(curve);
+ interptype = stp_curve_get_interpolation_type(curve);
+ gammaval = stp_curve_get_gamma(curve);
+
+ if (gammaval && wrapmode != STP_CURVE_WRAP_NONE)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS, "stp_xmltree_create_from_curve: "
+ "curve sets gamma and wrap_mode is not STP_CURVE_WRAP_NONE\n");
+ goto error;
+ }
+
+ /* Construct the allocated strings required */
+ stp_asprintf(&cgamma, "%g", gammaval);
+
+ curvenode = stp_mxmlNewElement(NULL, "curve");
+ stp_mxmlElementSetAttr(curvenode, "wrap", stpi_wrap_mode_names[wrapmode]);
+ stp_mxmlElementSetAttr(curvenode, "type", stpi_curve_type_names[interptype]);
+ stp_mxmlElementSetAttr(curvenode, "gamma", cgamma);
+ if (curve->piecewise)
+ stp_mxmlElementSetAttr(curvenode, "piecewise", "true");
+ else
+ stp_mxmlElementSetAttr(curvenode, "piecewise", "false");
+
+ stp_free(cgamma);
+
+ seq = stp_sequence_create();
+ stp_curve_get_bounds(curve, &low, &high);
+ stp_sequence_set_bounds(seq, low, high);
+ if (gammaval != 0) /* A gamma curve does not require sequence data */
+ {
+ stp_sequence_set_size(seq, 0);
+ }
+ else
+ {
+ const double *data;
+ size_t count;
+ data = stpi_curve_get_data_internal(curve, &count);
+ stp_sequence_set_data(seq, count, data);
+ }
+
+ child = stp_xmltree_create_from_sequence(seq);
+
+ if (seq)
+ {
+ stp_sequence_destroy(seq);
+ seq = NULL;
+ }
+
+ if (child == NULL)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_xmltree_create_from_curve: sequence node is NULL\n");
+ goto error;
+ }
+ stp_mxmlAdd(curvenode, STP_MXML_ADD_AFTER, NULL, child);
+
+ stp_xml_exit();
+
+ return curvenode;
+
+ error:
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_xmltree_create_from_curve: error during xmltree creation\n");
+ if (curvenode)
+ stp_mxmlDelete(curvenode);
+ if (child)
+ stp_mxmlDelete(child);
+ stp_xml_exit();
+
+ return NULL;
+}
+
+static stp_mxml_node_t *
+xmldoc_create_from_curve(const stp_curve_t *curve)
+{
+ stp_mxml_node_t *xmldoc;
+ stp_mxml_node_t *rootnode;
+ stp_mxml_node_t *curvenode;
+
+ /* Get curve details */
+ curvenode = stp_xmltree_create_from_curve(curve);
+ if (curvenode == NULL)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "xmldoc_create_from_curve: error creating curve node\n");
+ return NULL;
+ }
+ /* Create the XML tree */
+ xmldoc = stp_xmldoc_create_generic();
+ if (xmldoc == NULL)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "xmldoc_create_from_curve: error creating XML document\n");
+ return NULL;
+ }
+ rootnode = xmldoc->child;
+ if (rootnode == NULL)
+ {
+ stp_mxmlDelete(xmldoc);
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "xmldoc_create_from_curve: error getting XML document root node\n");
+ return NULL;
+ }
+
+ stp_mxmlAdd(rootnode, STP_MXML_ADD_AFTER, NULL, curvenode);
+
+ return xmldoc;
+}
+
+static int
+curve_whitespace_callback(stp_mxml_node_t *node, int where)
+{
+ if (node->type != STP_MXML_ELEMENT)
+ return 0;
+ if (strcasecmp(node->value.element.name, "gutenprint") == 0)
+ {
+ switch (where)
+ {
+ case STP_MXML_WS_AFTER_OPEN:
+ case STP_MXML_WS_BEFORE_CLOSE:
+ case STP_MXML_WS_AFTER_CLOSE:
+ return '\n';
+ case STP_MXML_WS_BEFORE_OPEN:
+ default:
+ return 0;
+ }
+ }
+ else if (strcasecmp(node->value.element.name, "curve") == 0)
+ {
+ switch (where)
+ {
+ case STP_MXML_WS_AFTER_OPEN:
+ return '\n';
+ case STP_MXML_WS_BEFORE_CLOSE:
+ case STP_MXML_WS_AFTER_CLOSE:
+ case STP_MXML_WS_BEFORE_OPEN:
+ default:
+ return 0;
+ }
+ }
+ else if (strcasecmp(node->value.element.name, "sequence") == 0)
+ {
+ const char *count;
+ switch (where)
+ {
+ case STP_MXML_WS_BEFORE_CLOSE:
+ count = stp_mxmlElementGetAttr(node, "count");
+ if (strcmp(count, "0") == 0)
+ return 0;
+ else
+ return '\n';
+ case STP_MXML_WS_AFTER_OPEN:
+ case STP_MXML_WS_AFTER_CLOSE:
+ return '\n';
+ case STP_MXML_WS_BEFORE_OPEN:
+ default:
+ return 0;
+ }
+ }
+ else
+ return 0;
+}
+
+
+int
+stp_curve_write(FILE *file, const stp_curve_t *curve) /* The curve */
+{
+ stp_mxml_node_t *xmldoc = NULL;
+
+ stp_xml_init();
+
+ xmldoc = xmldoc_create_from_curve(curve);
+ if (xmldoc == NULL)
+ {
+ stp_xml_exit();
+ return 1;
+ }
+
+ stp_mxmlSaveFile(xmldoc, file, curve_whitespace_callback);
+
+ if (xmldoc)
+ stp_mxmlDelete(xmldoc);
+
+ stp_xml_exit();
+
+ return 0;
+}
+
+char *
+stp_curve_write_string(const stp_curve_t *curve) /* The curve */
+{
+ stp_mxml_node_t *xmldoc = NULL;
+ char *retval;
+
+ stp_xml_init();
+
+ xmldoc = xmldoc_create_from_curve(curve);
+ if (xmldoc == NULL)
+ {
+ stp_xml_exit();
+ return NULL;
+ }
+
+ retval = stp_mxmlSaveAllocString(xmldoc, curve_whitespace_callback);
+
+ if (xmldoc)
+ stp_mxmlDelete(xmldoc);
+
+ stp_xml_exit();
+
+ return retval;
+}
+
+static stp_curve_t *
+xml_doc_get_curve(stp_mxml_node_t *doc)
+{
+ stp_mxml_node_t *cur;
+ stp_mxml_node_t *xmlcurve;
+ stp_curve_t *curve = NULL;
+
+ if (doc == NULL )
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "xml_doc_get_curve: XML file not parsed successfully.\n");
+ return NULL;
+ }
+
+ cur = doc->child;
+
+ if (cur == NULL)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "xml_doc_get_curve: empty document\n");
+ return NULL;
+ }
+
+ xmlcurve = stp_xml_get_node(cur, "gutenprint", "curve", NULL);
+
+ if (xmlcurve)
+ curve = stp_curve_create_from_xmltree(xmlcurve);
+
+ return curve;
+}
+
+stp_curve_t *
+stp_curve_create_from_file(const char* file)
+{
+ stp_curve_t *curve = NULL;
+ stp_mxml_node_t *doc;
+ FILE *fp = fopen(file, "r");
+ if (!fp)
+ {
+ stp_deprintf(STP_DBG_CURVE_ERRORS,
+ "stp_curve_create_from_file: unable to open %s: %s\n",
+ file, strerror(errno));
+ return NULL;
+ }
+ stp_deprintf(STP_DBG_XML, "stp_curve_create_from_file: reading `%s'...\n",
+ file);
+
+ stp_xml_init();
+
+ doc = stp_mxmlLoadFile(NULL, fp, STP_MXML_NO_CALLBACK);
+
+ curve = xml_doc_get_curve(doc);
+
+ if (doc)
+ stp_mxmlDelete(doc);
+
+ stp_xml_exit();
+ (void) fclose(fp);
+ return curve;
+
+}
+
+stp_curve_t *
+stp_curve_create_from_stream(FILE* fp)
+{
+ stp_curve_t *curve = NULL;
+ stp_mxml_node_t *doc;
+ stp_deprintf(STP_DBG_XML, "stp_curve_create_from_fp: reading...\n");
+
+ stp_xml_init();
+
+ doc = stp_mxmlLoadFile(NULL, fp, STP_MXML_NO_CALLBACK);
+
+ curve = xml_doc_get_curve(doc);
+
+ if (doc)
+ stp_mxmlDelete(doc);
+
+ stp_xml_exit();
+ return curve;
+
+}
+
+stp_curve_t *
+stp_curve_create_from_string(const char* string)
+{
+ stp_curve_t *curve = NULL;
+ stp_mxml_node_t *doc;
+ stp_deprintf(STP_DBG_XML,
+ "stp_curve_create_from_string: reading '%s'...\n", string);
+ stp_xml_init();
+
+ doc = stp_mxmlLoadString(NULL, string, STP_MXML_NO_CALLBACK);
+
+ curve = xml_doc_get_curve(doc);
+
+ if (doc)
+ stp_mxmlDelete(doc);
+
+ stp_xml_exit();
+ return curve;
+}
diff --git a/src/main/dither-ed.c b/src/main/dither-ed.c
new file mode 100644
index 0000000..76820a0
--- /dev/null
+++ b/src/main/dither-ed.c
@@ -0,0 +1,466 @@
+/*
+ * "$Id: dither-ed.c,v 1.18 2004/09/17 18:38:17 rleigh Exp $"
+ *
+ * Error diffusion and closely related adaptive hybrid dither algorithm
+ *
+ * Copyright 1997-2003 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 <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <string.h>
+#include "dither-impl.h"
+#include "dither-inlined-functions.h"
+
+/*
+ * Add the error to the input value. Notice that we micro-optimize this
+ * to save a division when appropriate. This has yielded measurable
+ * improvement -- rlk 20030119
+ */
+
+#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(stpi_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];
+ }
+}
+
+
+/*
+ * Print a single dot. This routine has become awfully complicated
+ * awfully fast!
+ */
+
+static inline int
+print_color(const stpi_dither_t *d, stpi_dither_channel_t *dc, int x, int y,
+ unsigned char bit, int length, int dontprint, int stpi_dither_type,
+ const unsigned char *mask)
+{
+ int base = dc->b;
+ int density = dc->o;
+ int adjusted = dc->v;
+ unsigned randomizer = dc->randomizer;
+ stp_dither_matrix_impl_t *pick_matrix = &(dc->pick);
+ stp_dither_matrix_impl_t *dither_matrix = &(dc->dithermat);
+ unsigned rangepoint = 32768;
+ unsigned vmatrix;
+ int i;
+ int j;
+ unsigned char *tptr;
+ unsigned bits;
+ unsigned v;
+ int levels = dc->nlevels - 1;
+ int dither_value = adjusted;
+ stpi_ink_defn_t *lower;
+ stpi_ink_defn_t *upper;
+
+ if (base <= 0 || density <= 0 ||
+ (adjusted <= 0 && !(stpi_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--)
+ {
+ stpi_dither_segment_t *dd = &(dc->ranges[i]);
+
+ if (density <= dd->lower->range)
+ 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 (stpi_dither_type & D_ADAPTIVE_BASE)
+ {
+ stpi_dither_type -= D_ADAPTIVE_BASE;
+
+ if (i < levels || base <= d->adaptive_limit)
+ {
+ stpi_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.
+ */
+
+ lower = dd->lower;
+ upper = dd->upper;
+
+ /*
+ * Reduce the randomness as the base value increases, to get
+ * smoother output in the midtones. Idea suggested by
+ * Thomas Tonino.
+ */
+ if (stpi_dither_type & D_ORDERED_BASE)
+ {
+ rangepoint = density - dd->lower->range;
+ if (dd->range_span < 65535)
+ rangepoint = rangepoint * 65535 / dd->range_span;
+ vmatrix = 0;
+ }
+ else
+ {
+
+ /*
+ * 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.
+ */
+
+ unsigned virtual_value;
+ rangepoint = density - dd->lower->range;
+ if (dd->range_span < 65535)
+ rangepoint = rangepoint * 65535 / dd->range_span;
+ if (dd->value_span == 0)
+ virtual_value = upper->value;
+ else /* if (dd->range_span == 0) */
+ virtual_value = (upper->value + lower->value) / 2;
+ /*
+ else
+ virtual_value = lower->value + (dd->value_span * rangepoint / 65535);
+ */
+ randomizer = 0;
+ 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 > 0 && dither_value >= vmatrix)
+ {
+ stpi_ink_defn_t *subc;
+
+ if (dd->is_same_ink)
+ subc = upper;
+ else
+ {
+ if (rangepoint >= ditherpoint(d, pick_matrix, x))
+ subc = upper;
+ else
+ subc = lower;
+ }
+ v = subc->value;
+ if (!mask || (*(mask + d->ptr_offset) & bit))
+ {
+ if (dc->ptr)
+ {
+ tptr = dc->ptr + d->ptr_offset;
+
+ /*
+ * Lay down all of the bits in the pixel.
+ */
+ if (dontprint < v)
+ {
+ bits = subc->bits;
+ set_row_ends(dc, x);
+ for (j = 1; j <= bits; j += j, tptr += length)
+ {
+ if (j & bits)
+ tptr[0] |= bit;
+ }
+ }
+ }
+ }
+ if (stpi_dither_type & D_ORDERED_BASE)
+ {
+ double adj = -(int) v;
+ adj /= 2.0;
+ adjusted = adj;
+ }
+ else
+ {
+ double adj = v;
+ adjusted -= adj;
+ }
+ }
+ return adjusted;
+ }
+ return adjusted;
+}
+
+static int
+shared_ed_initializer(stpi_dither_t *d,
+ int row,
+ int duplicate_line,
+ int zero_mask,
+ int length,
+ int direction,
+ int ****error,
+ int **ndither)
+{
+ int i, j;
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ CHANNEL(d, i).error_rows = 2;
+ if (!duplicate_line)
+ {
+ if ((zero_mask & ((1 << CHANNEL_COUNT(d)) - 1)) !=
+ ((1 << CHANNEL_COUNT(d)) - 1))
+ 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 0;
+ else if (d->last_line_was_empty == 4)
+ {
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ for (j = 0; j < d->error_rows; j++)
+ memset(stpi_dither_get_errline(d, row + j, i), 0,
+ d->dst_width * sizeof(int));
+ return 0;
+ }
+ d->ptr_offset = (direction == 1) ? 0 : length - 1;
+
+ *error = stp_malloc(CHANNEL_COUNT(d) * sizeof(int **));
+ *ndither = stp_malloc(CHANNEL_COUNT(d) * sizeof(int));
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ {
+ (*error)[i] = stp_malloc(d->error_rows * sizeof(int *));
+ for (j = 0; j < d->error_rows; j++)
+ {
+ (*error)[i][j] = stpi_dither_get_errline(d, row + j, i);
+ if (j == d->error_rows - 1)
+ memset((*error)[i][j], 0, d->dst_width * sizeof(int));
+ if (direction == -1)
+ (*error)[i][j] += d->dst_width - 1;
+ }
+ (*ndither)[i] = (*error)[i][0][0];
+ }
+ return 1;
+}
+
+static void
+shared_ed_deinitializer(stpi_dither_t *d,
+ int ***error,
+ int *ndither)
+{
+ int i;
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ {
+ STP_SAFE_FREE(error[i]);
+ }
+ STP_SAFE_FREE(error);
+ STP_SAFE_FREE(ndither);
+}
+
+void
+stpi_dither_ed(stp_vars_t *v,
+ int row,
+ const unsigned short *raw,
+ int duplicate_line,
+ int zero_mask,
+ const unsigned char *mask)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ int x,
+ length;
+ unsigned char bit;
+ int i;
+ int *ndither;
+ int ***error;
+
+ int terminate;
+ int direction = row & 1 ? 1 : -1;
+ int xerror, xstep, xmod;
+
+ length = (d->dst_width + 7) / 8;
+ if (d->stpi_dither_type & D_ADAPTIVE_BASE)
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ if (CHANNEL(d, i).nlevels > 1)
+ {
+ stpi_dither_ordered(v, row, raw, duplicate_line, zero_mask, mask);
+ return;
+ }
+ if (!shared_ed_initializer(d, row, duplicate_line, zero_mask, length,
+ direction, &error, &ndither))
+ return;
+
+ x = (direction == 1) ? 0 : d->dst_width - 1;
+ bit = 1 << (7 - (x & 7));
+ xstep = CHANNEL_COUNT(d) * (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)
+ raw += (CHANNEL_COUNT(d) * (d->src_width - 1));
+
+ for (; x != terminate; x += direction)
+ {
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ {
+ if (CHANNEL(d, i).ptr)
+ {
+ CHANNEL(d, i).v = raw[i];
+ CHANNEL(d, i).o = CHANNEL(d, i).v;
+ 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->stpi_dither_type,
+ mask);
+ ndither[i] = update_dither(d, i, d->src_width,
+ direction, error[i][0], error[i][1]);
+ }
+ }
+ ADVANCE_BIDIRECTIONAL(d, bit, raw, direction, CHANNEL_COUNT(d), xerror,
+ xstep, xmod, error, d->error_rows);
+ }
+ shared_ed_deinitializer(d, error, ndither);
+ if (direction == -1)
+ stpi_dither_reverse_row_ends(d);
+}
diff --git a/src/main/dither-eventone.c b/src/main/dither-eventone.c
new file mode 100644
index 0000000..51eb10b
--- /dev/null
+++ b/src/main/dither-eventone.c
@@ -0,0 +1,710 @@
+/*
+ * "$Id: dither-eventone.c,v 1.40 2004/09/17 18:38:18 rleigh Exp $"
+ *
+ * EvenTone dither implementation for Gimp-Print
+ *
+ * Copyright 2002-2003 Mark Tomlinson (mark@southern.co.nz)
+ *
+ * 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 code uses the Eventone dither algorithm. This is described
+ * at the website http://www.artofcode.com/eventone/
+ * This algorithm is covered by US Patents 5,055,942 and 5,917,614
+ * and was invented by Raph Levien <raph@acm.org>
+ * It was made available to be used free of charge in GPL-licensed
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <string.h>
+#include <math.h>
+#include <limits.h>
+#include "dither-impl.h"
+#include "dither-inlined-functions.h"
+
+typedef struct
+{
+ int dx;
+ int dy;
+ int r_sq;
+} distance_t;
+
+typedef struct
+{
+ int d2x;
+ int d2y;
+ distance_t d_sq;
+ int aspect;
+ int unitone_aspect;
+ int physical_aspect;
+ int diff_factor;
+ stpi_dither_channel_t *dummy_channel;
+} eventone_t;
+
+typedef struct shade_segment
+{
+ distance_t dis;
+ distance_t *et_dis;
+ stpi_ink_defn_t lower;
+ stpi_ink_defn_t upper;
+ int share_this_channel;
+} shade_distance_t;
+
+
+#define EVEN_C1 256
+#define EVEN_C2 (EVEN_C1 * sqrt(3.0) / 2.0)
+#define UNITONE_C1 16384
+#define UNITONE_C2 (UNITONE_C1 * sqrt(3.0) / 2.0)
+
+static void
+free_eventone_data(stpi_dither_t *d)
+{
+ int i;
+ eventone_t *et = (eventone_t *) (d->aux_data);
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ {
+ if (CHANNEL(d, i).aux_data)
+ {
+ shade_distance_t *shade = (shade_distance_t *) CHANNEL(d,i).aux_data;
+ STP_SAFE_FREE(shade->et_dis);
+ STP_SAFE_FREE(CHANNEL(d, i).aux_data);
+ }
+ }
+ if (et->dummy_channel) {
+ stpi_dither_channel_t *dc = et->dummy_channel;
+ shade_distance_t *shade = (shade_distance_t *) dc->aux_data;
+ STP_SAFE_FREE(shade->et_dis);
+ STP_SAFE_FREE(dc->aux_data);
+ stpi_dither_channel_destroy(dc);
+ STP_SAFE_FREE(et->dummy_channel);
+ }
+ STP_SAFE_FREE(et);
+}
+
+static void
+et_setup(stpi_dither_t *d)
+{
+ int size = 2 * MAX_SPREAD + ((d->dst_width + 7) & ~7);
+ static const int diff_factors[] = {1, 10, 16, 23, 32};
+ eventone_t *et = stp_zalloc(sizeof(eventone_t));
+ int xa, ya;
+ int i;
+ for (i = 0; i < CHANNEL_COUNT(d); i++) {
+ CHANNEL(d, i).error_rows = 1;
+ CHANNEL(d, i).errs = stp_zalloc(1 * sizeof(int *));
+ CHANNEL(d, i).errs[0] = stp_zalloc(size * sizeof(int));
+ }
+ if (d->stpi_dither_type & D_UNITONE) {
+ stpi_dither_channel_t *dc = stp_zalloc(sizeof(stpi_dither_channel_t));
+ stp_dither_matrix_clone(&(d->dither_matrix), &(dc->dithermat), 0, 0);
+ stp_dither_matrix_clone(&(d->transition_matrix), &(dc->pick), 0, 0);
+ dc->error_rows = 1;
+ dc->errs = stp_zalloc(1 * sizeof(int *));
+ dc->errs[0] = stp_zalloc(size * sizeof(int));
+ et->dummy_channel = dc;
+ }
+
+ xa = d->x_aspect / d->y_aspect;
+ if (xa == 0)
+ xa = 1;
+ et->d_sq.dx = xa * xa;
+ et->d2x = 2 * et->d_sq.dx;
+
+ ya = d->y_aspect / d->x_aspect;
+ if (ya == 0)
+ ya = 1;
+ et->d_sq.dy = ya * ya;
+ et->d2y = 2 * et->d_sq.dy;
+
+ et->aspect = EVEN_C2 / (xa * ya);
+ et->unitone_aspect = UNITONE_C2 / (xa * ya);
+ et->d_sq.r_sq = 0;
+
+ for (i = 0; i < CHANNEL_COUNT(d); i++) {
+ int x;
+ shade_distance_t *shade = stp_zalloc(sizeof(shade_distance_t));
+ shade->dis = et->d_sq;
+ shade->et_dis = stp_malloc(sizeof(distance_t) * d->dst_width);
+ if (CHANNEL(d, i).darkness > .1)
+ shade->share_this_channel = 1;
+ else
+ shade->share_this_channel = 0;
+ for (x = 0; x < d->dst_width; x++) {
+ shade->et_dis[x] = et->d_sq;
+ }
+ CHANNEL(d, i).aux_data = shade;
+ }
+ if (et->dummy_channel) {
+ int x;
+ shade_distance_t *shade = stp_zalloc(sizeof(shade_distance_t));
+ shade->dis = et->d_sq;
+ shade->et_dis = stp_malloc(sizeof(distance_t) * d->dst_width);
+ for (x = 0; x < d->dst_width; x++) {
+ shade->et_dis[x] = et->d_sq;
+ }
+ et->dummy_channel->aux_data = shade;
+ }
+
+ et->physical_aspect = d->y_aspect / d->x_aspect;
+ if (et->physical_aspect >= 4)
+ et->physical_aspect = 4;
+ else if (et->physical_aspect >= 2)
+ et->physical_aspect = 2;
+ else et->physical_aspect = 1;
+
+ et->diff_factor = diff_factors[et->physical_aspect];
+
+ d->aux_data = et;
+ d->aux_freefunc = free_eventone_data;
+}
+
+static int
+et_initializer(stpi_dither_t *d, int duplicate_line, int zero_mask)
+{
+ int i;
+ eventone_t *et;
+ if (!d->aux_data)
+ et_setup(d);
+
+ et = (eventone_t *) (d->aux_data);
+ if (!duplicate_line) {
+ if ((zero_mask & ((1 << CHANNEL_COUNT(d)) - 1)) !=
+ ((1 << CHANNEL_COUNT(d)) - 1)) {
+ 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 0;
+ } else if (d->last_line_was_empty == 4) {
+ if (et->dummy_channel) {
+ memset(et->dummy_channel->errs[0], 0, d->dst_width * sizeof(int));
+ }
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ memset(CHANNEL(d, i).errs[0], 0, d->dst_width * sizeof(int));
+ return 0;
+ }
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ CHANNEL(d, i).v = 0;
+ if (et->dummy_channel)
+ et->dummy_channel->v = 0;
+ return 1;
+}
+
+static inline void
+advance_eventone_pre(shade_distance_t *sp, eventone_t *et, int x)
+{
+ distance_t *etd = &sp->et_dis[x];
+ int t = sp->dis.r_sq + sp->dis.dx;
+ if (t <= etd->r_sq) { /* Do eventone calculations */
+ sp->dis.r_sq = t; /* Nearest pixel same as last one */
+ sp->dis.dx += et->d2x;
+ } else {
+ sp->dis = *etd; /* Nearest pixel is from a previous line */
+ }
+}
+
+static inline void
+eventone_update(stpi_dither_channel_t *dc, eventone_t *et,
+ int x, int direction)
+{
+ shade_distance_t *sp = (shade_distance_t *) dc->aux_data;
+ distance_t *etd = &sp->et_dis[x];
+ int t = etd->r_sq + etd->dy; /* r^2 from dot above */
+ int u = sp->dis.r_sq + sp->dis.dy; /* r^2 from dot on this line */
+ if (u < t) { /* If dot from this line is close */
+ t = u; /* Use it instead */
+ etd->dx = sp->dis.dx;
+ etd->dy = sp->dis.dy;
+ }
+ etd->dy += et->d2y;
+
+ if (t > 65535) { /* Do some hard limiting */
+ t = 65535;
+ }
+ etd->r_sq = t;
+}
+
+static inline void
+diffuse_error(stpi_dither_channel_t *dc, eventone_t *et, int x, int direction)
+{
+ /*
+ * Tests to date show that the second diffusion pattern works better
+ * than the first in most cases. The previous code is being left here
+ * in case it is later determined that the original code works better.
+ * -- rlk 20031101
+ */
+#if 0
+/* int fraction = (dc->v + (et->diff_factor>>1)) / et->diff_factor; */
+ int frac_2 = dc->v + dc->v;
+ int frac_3 = frac_2 + dc->v;
+ dc->errs[0][x + MAX_SPREAD] = frac_3;
+ dc->errs[0][x + MAX_SPREAD - direction] += frac_2;
+ dc->v -= (frac_2 + frac_3) / 16;
+#else
+ dc->errs[0][x + MAX_SPREAD] = dc->v * 3;
+ dc->errs[0][x + MAX_SPREAD - direction] += dc->v * 5;
+ dc->errs[0][x + MAX_SPREAD - (direction * 2)] += dc->v * 1;
+ dc->v -= dc->v * 9 / 16;
+#endif
+}
+
+static inline int
+eventone_adjust(stpi_dither_channel_t *dc, eventone_t *et, int dither_point,
+ unsigned int desired)
+{
+ if (dither_point <= 0)
+ return 0;
+ else if (dither_point >= 65535)
+ return 65535;
+ if (desired == 0) {
+ dither_point = 0;
+ } else {
+ shade_distance_t *shade = (shade_distance_t *) dc->aux_data;
+ dither_point += shade->dis.r_sq * et->aspect - (EVEN_C1 * 65535) / desired;
+ if (dither_point > 65535)
+ dither_point = 65535;
+ else if (dither_point < 0)
+ dither_point = 0;
+ }
+ return dither_point;
+}
+
+static inline int
+unitone_adjust(stpi_dither_channel_t *dc, eventone_t *et,
+ int dither_point, unsigned int desired)
+{
+ if (dither_point <= 0)
+ return INT_MIN;
+ else if (dither_point >= 65535)
+ return dither_point;
+ if (desired == 0) {
+ dither_point = INT_MIN;
+ } else {
+ shade_distance_t *shade = (shade_distance_t *) dc->aux_data;
+ dither_point += shade->dis.r_sq * et->unitone_aspect -
+ (UNITONE_C1 * 65535u) / desired;
+ }
+ return dither_point;
+}
+
+
+static inline void
+find_segment(stpi_dither_channel_t *dc, unsigned inkval,
+ stpi_ink_defn_t *lower, stpi_ink_defn_t *upper)
+{
+ lower->range = 0;
+ lower->bits = 0;
+
+ if (dc->nlevels == 1)
+ {
+ upper->bits = dc->ink_list[1].bits;
+ upper->range = dc->ink_list[1].value;
+ }
+ else
+ {
+ int i;
+ stpi_ink_defn_t *ip;
+
+ for (i=0, ip = dc->ink_list; i < dc->nlevels - 1; i++, ip++) {
+ if (ip->value > inkval)
+ break;
+ lower->bits = ip->bits;
+ lower->range = ip->value;
+ }
+
+ upper->bits = ip->bits;
+ upper->range = ip->value;
+ }
+}
+
+static inline int
+find_segment_and_ditherpoint(stpi_dither_channel_t *dc, unsigned inkval,
+ stpi_ink_defn_t *lower, stpi_ink_defn_t *upper)
+{
+ find_segment(dc, inkval, lower, upper);
+ if (inkval <= lower->range)
+ return 0;
+ else if (inkval >= upper->range)
+ return 65535;
+ else
+ return (65535u * (inkval - lower->range)) / (upper->range - lower->range);
+}
+
+static inline void
+print_ink(stpi_dither_t *d, unsigned char *tptr, const stpi_ink_defn_t *ink,
+ unsigned char bit, int length)
+{
+ int j;
+
+ if (tptr != 0)
+ {
+ tptr += d->ptr_offset;
+ switch(ink->bits)
+ {
+ case 1:
+ tptr[0] |= bit;
+ return;
+ case 2:
+ tptr[length] |= bit;
+ return;
+ case 3:
+ tptr[0] |= bit;
+ tptr[length] |= bit;
+ return;
+ default:
+ for (j=1; j <= ink->bits; j+=j, tptr += length) {
+ if (j & ink->bits)
+ *tptr |= bit;
+ }
+ return;
+ }
+ }
+}
+
+void
+stpi_dither_et(stp_vars_t *v,
+ int row,
+ const unsigned short *raw,
+ int duplicate_line,
+ int zero_mask,
+ const unsigned char *mask)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ eventone_t *et;
+
+ int x,
+ length;
+ unsigned char bit;
+ int i;
+
+ int terminate;
+ int direction;
+ int xerror, xstep, xmod;
+ int channel_count = CHANNEL_COUNT(d);
+
+ if (!et_initializer(d, duplicate_line, zero_mask))
+ return;
+
+ et = (eventone_t *) d->aux_data;
+
+ length = (d->dst_width + 7) / 8;
+
+ if (row & 1) {
+ direction = 1;
+ x = 0;
+ terminate = d->dst_width;
+ d->ptr_offset = 0;
+ } else {
+ direction = -1;
+ x = d->dst_width - 1;
+ terminate = -1;
+ d->ptr_offset = length - 1;
+ raw += channel_count * (d->src_width - 1);
+ }
+ bit = 1 << (7 - (x & 7));
+ xstep = channel_count * (d->src_width / d->dst_width);
+ xmod = d->src_width % d->dst_width;
+ xerror = (xmod * x) % d->dst_width;
+
+ for (; x != terminate; x += direction) {
+
+ int point_error = 0;
+ int comparison = 32768;
+
+ if (d->stpi_dither_type & D_ORDERED_BASE)
+ comparison += (ditherpoint(d, &(d->dither_matrix), x) / 16) - 2048;
+
+ for (i=0; i < channel_count; i++) {
+ if (CHANNEL(d, i).ptr)
+ {
+ int inkspot;
+ int range_point;
+ stpi_dither_channel_t *dc = &CHANNEL(d, i);
+ shade_distance_t *sp = (shade_distance_t *) dc->aux_data;
+ stpi_ink_defn_t *inkp;
+ stpi_ink_defn_t lower, upper;
+
+ advance_eventone_pre(sp, et, x);
+
+ /*
+ * Find which are the two candidate dot sizes.
+ * Rather than use the absolute value of the point to compute
+ * the error, we will use the relative value of the point within
+ * the range to find the two candidate dot sizes.
+ */
+ range_point =
+ find_segment_and_ditherpoint(dc, raw[i], &lower, &upper);
+
+ /* Incorporate error data from previous line */
+ dc->v += 2 * range_point + (dc->errs[0][x + MAX_SPREAD] + 8) / 16;
+ inkspot = dc->v - range_point;
+
+ point_error += eventone_adjust(dc, et, inkspot, range_point);
+
+ /* Determine whether to print the larger or smaller dot */
+ inkp = &lower;
+ if (point_error >= comparison) {
+ point_error -= 65535;
+ inkp = &upper;
+ dc->v -= 131070;
+ sp->dis = et->d_sq;
+ }
+
+ /* Adjust the error to reflect the dot choice */
+ if (inkp->bits) {
+ if (!mask || (*(mask + d->ptr_offset) & bit)) {
+ set_row_ends(dc, x);
+
+ /* Do the printing */
+ print_ink(d, dc->ptr, inkp, bit, length);
+ }
+ }
+
+ /* Spread the error around to the adjacent dots */
+ eventone_update(dc, et, x, direction);
+ diffuse_error(dc, et, x, direction);
+ }
+ }
+ if (direction == 1)
+ ADVANCE_UNIDIRECTIONAL(d, bit, raw, channel_count, xerror, xstep, xmod);
+ else
+ ADVANCE_REVERSE(d, bit, raw, channel_count, xerror, xstep, xmod);
+ }
+ if (direction == -1)
+ stpi_dither_reverse_row_ends(d);
+}
+
+void
+stpi_dither_ut(stp_vars_t *v,
+ int row,
+ const unsigned short *raw,
+ int duplicate_line,
+ int zero_mask,
+ const unsigned char *mask)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ eventone_t *et;
+
+ int x,
+ length;
+ unsigned char bit;
+ int i;
+
+ int terminate;
+ int direction;
+ int xerror, xstep, xmod;
+ int channel_count = CHANNEL_COUNT(d);
+ stpi_dither_channel_t *ddc;
+
+ if (channel_count == 1) {
+ stpi_dither_et(v, row, raw, duplicate_line, zero_mask, mask);
+ return;
+ }
+
+ if (!et_initializer(d, duplicate_line, zero_mask))
+ return;
+
+ et = (eventone_t *) d->aux_data;
+ ddc = et->dummy_channel;
+
+ length = (d->dst_width + 7) / 8;
+
+ if (row & 1) {
+ direction = 1;
+ x = 0;
+ terminate = d->dst_width;
+ d->ptr_offset = 0;
+ } else {
+ direction = -1;
+ x = d->dst_width - 1;
+ terminate = -1;
+ d->ptr_offset = length - 1;
+ raw += channel_count * (d->src_width - 1);
+ }
+ bit = 1 << (7 - (x & 7));
+ xstep = channel_count * (d->src_width / d->dst_width);
+ xmod = d->src_width % d->dst_width;
+ xerror = (xmod * x) % d->dst_width;
+
+ for (; x != terminate; x += direction) {
+
+ shade_distance_t *ssp = (shade_distance_t *) ddc->aux_data;
+ int point_error = 0;
+ int total_error = 0;
+ int channels_to_print = 0;
+ int print_all_channels = 0;
+ int maximum_value = 0;
+ int comparison = 32768;
+ stpi_dither_channel_t *best_channel = NULL;
+ stpi_dither_channel_t *second_best_channel = NULL;
+ int best_channel_value = INT_MIN;
+ int second_best_channel_value = INT_MIN;
+ int random_value = ditherpoint(d, &(d->dither_matrix), x);
+
+ if (d->stpi_dither_type & D_ORDERED_BASE)
+ comparison += (random_value / 16) - 2048;
+
+
+ ddc->b = 0;
+ advance_eventone_pre(ssp, et, x);
+
+ for (i=0; i < channel_count; i++) {
+ stpi_dither_channel_t *dc = &CHANNEL(d, i);
+ if (dc->ptr) {
+ shade_distance_t *sp = (shade_distance_t *) dc->aux_data;
+
+ advance_eventone_pre(sp, et, x);
+
+ /*
+ * Find which are the two candidate dot sizes.
+ * Rather than use the absolute value of the point to compute
+ * the error, we will use the relative value of the point within
+ * the range to find the two candidate dot sizes.
+ */
+ dc->b = find_segment_and_ditherpoint(dc, raw[i],
+ &(sp->lower), &(sp->upper));
+ if (sp->share_this_channel) {
+ if (dc->b > maximum_value)
+ maximum_value = dc->b;
+ ddc->b += dc->b;
+ }
+ /* Incorporate error data from previous line */
+ dc->v += 2 * dc->b + (dc->errs[0][x + MAX_SPREAD] + 8) / 16;
+ dc->o = unitone_adjust(dc, et, dc->v - dc->b, dc->b);
+ }
+ }
+
+#if 0
+ if ((2 * (ddc->b - maximum_value)) < (3 * maximum_value))
+ print_all_channels = 1;
+#endif
+
+ if (ddc->b > 131070)
+ print_all_channels = 1;
+ else if (ddc->b > 65535) {
+ ddc->b -= 65535;
+ channels_to_print = 1;
+ }
+
+ if (ddc->b > 65535) {
+ ddc->b = 65535;
+ }
+
+ ddc->v += 2 * ddc->b + (ddc->errs[0][x + MAX_SPREAD] + 8) / 16;
+ total_error += eventone_adjust(ddc, et, ddc->v - ddc->b, ddc->b);
+ if (total_error >= comparison) {
+ channels_to_print += 1;
+ }
+
+ if (!print_all_channels) {
+ for (i=0; i < channel_count; i++) {
+ stpi_dither_channel_t *dc = &CHANNEL(d, i);
+ shade_distance_t *sp = (shade_distance_t *) dc->aux_data;
+
+ if (dc->ptr) {
+
+ if (sp->share_this_channel) {
+ if (dc->o > best_channel_value) {
+ second_best_channel = best_channel;
+ best_channel = dc;
+ second_best_channel_value = best_channel_value;
+ if (dc->o >= 32768)
+ best_channel_value = INT_MAX;
+ else
+ best_channel_value = dc->o;
+ } else if (dc->o > second_best_channel_value) {
+ second_best_channel = dc;
+ if (dc->o >= 32768)
+ second_best_channel_value = INT_MAX;
+ else
+ second_best_channel_value = dc->o;
+ }
+ }
+ }
+ }
+ }
+
+ for (i=0; i < channel_count; i++) {
+ stpi_dither_channel_t *dc = &CHANNEL(d, i);
+ if (dc->ptr) {
+
+ /* Determine whether to print the larger or smaller dot */
+ shade_distance_t *sp = (shade_distance_t *) dc->aux_data;
+ stpi_ink_defn_t *inkp = &(sp->lower);
+
+ if (dc->o < 0)
+ dc->o = 0;
+ else if (dc->o > 65535)
+ dc->o = 65535;
+ if (print_all_channels || !sp->share_this_channel) {
+ point_error += dc->o;
+ if (point_error >= comparison) {
+ point_error -= 65535;
+ inkp = &(sp->upper);
+ dc->v -= 131070;
+ sp->dis = et->d_sq;
+ }
+ } else if ((channels_to_print >= 1 && best_channel == dc) ||
+ (channels_to_print >= 2 && second_best_channel == dc)) {
+ inkp = &(sp->upper);
+ dc->v -= 131070;
+ sp->dis = et->d_sq;
+ }
+ if (inkp->bits) {
+ if (!mask || (*(mask + d->ptr_offset) & bit)) {
+ set_row_ends(dc, x);
+
+ /* Do the printing */
+ print_ink(d, dc->ptr, inkp, bit, length);
+ }
+ }
+ }
+ }
+ if (total_error >= comparison) {
+ ddc->v -= 131070;
+ total_error -= 65535;
+ ssp->dis = et->d_sq;
+ }
+
+ eventone_update(ddc, et, x, direction);
+ diffuse_error(ddc, et, x, direction);
+ for (i=0; i < channel_count; i++) {
+ stpi_dither_channel_t *dc = &CHANNEL(d, i);
+ if (dc->ptr) {
+
+ /* Spread the error around to the adjacent dots */
+ eventone_update(dc, et, x, direction);
+ diffuse_error(dc, et, x, direction);
+ }
+ }
+
+
+ if (direction == 1)
+ ADVANCE_UNIDIRECTIONAL(d, bit, raw, channel_count, xerror, xstep, xmod);
+ else
+ ADVANCE_REVERSE(d, bit, raw, channel_count, xerror, xstep, xmod);
+ }
+ if (direction == -1)
+ stpi_dither_reverse_row_ends(d);
+}
diff --git a/src/main/dither-impl.h b/src/main/dither-impl.h
new file mode 100644
index 0000000..be17169
--- /dev/null
+++ b/src/main/dither-impl.h
@@ -0,0 +1,263 @@
+/*
+ * "$Id: dither-impl.h,v 1.25 2005/04/12 00:57:01 rlk Exp $"
+ *
+ * Internal implementation of dither algorithms
+ *
+ * Copyright 1997-2003 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 GUTENPRINT_INTERNAL_DITHER_IMPL_H
+#define GUTENPRINT_INTERNAL_DITHER_IMPL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <limits.h>
+
+#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 D_EVENTONE 32
+#define D_UNITONE 64
+#define D_EVENBETTER 128
+#define D_HYBRID_EVENTONE (D_ORDERED_BASE | D_EVENTONE)
+#define D_HYBRID_UNITONE (D_ORDERED_BASE | D_UNITONE)
+#define D_HYBRID_EVENBETTER (D_ORDERED_BASE | D_EVENBETTER)
+#define D_PREDITHERED 128
+#define D_INVALID -2
+
+#define DITHER_FAST_STEPS (6)
+
+typedef struct
+{
+ const char *name;
+ const char *text;
+ int id;
+} stpi_dither_algorithm_t;
+
+#define ERROR_ROWS 2
+
+#define MAX_SPREAD 32
+
+typedef void stpi_ditherfunc_t(stp_vars_t *, int, const unsigned short *, int,
+ int, const unsigned char *);
+
+/*
+ * An end of a dither segment, describing one ink
+ */
+
+typedef struct ink_defn
+{
+ unsigned range;
+ unsigned value;
+ unsigned bits;
+} stpi_ink_defn_t;
+
+/*
+ * A segment of the entire 0-65535 intensity range.
+ */
+
+typedef struct dither_segment
+{
+ stpi_ink_defn_t *lower;
+ stpi_ink_defn_t *upper;
+ unsigned range_span;
+ unsigned value_span;
+ int is_same_ink;
+ int is_equal;
+} stpi_dither_segment_t;
+
+typedef struct dither_channel
+{
+ unsigned randomizer; /* With Floyd-Steinberg dithering, control */
+ /* how much randomness is applied to the */
+ /* threshold values (0-65535). */
+ unsigned bit_max;
+ unsigned signif_bits;
+ unsigned density;
+ double darkness; /* Relative darkness of this ink */
+
+ int v;
+ int o;
+ int b;
+ int very_fast;
+
+ stpi_ink_defn_t *ink_list;
+
+ int nlevels;
+ stpi_dither_segment_t *ranges;
+
+ int error_rows;
+ int **errs;
+
+ stp_dither_matrix_impl_t pick;
+ stp_dither_matrix_impl_t dithermat;
+ int row_ends[2];
+ unsigned char *ptr;
+ void *aux_data; /* aux_freefunc for dither should free this */
+} stpi_dither_channel_t;
+
+typedef struct dither
+{
+ int src_width; /* Input width */
+ int dst_width; /* Output width */
+
+ 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 stpi_dither_type;
+
+ 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 d_cutoff;
+
+ int last_line_was_empty;
+ int ptr_offset;
+ int error_rows;
+
+ int finalized; /* When dither is first called, calculate
+ * some things */
+
+ stp_dither_matrix_impl_t dither_matrix;
+ stp_dither_matrix_impl_t transition_matrix;
+ stpi_dither_channel_t *channel;
+ unsigned channel_count;
+ unsigned total_channel_count;
+ unsigned *channel_index;
+ unsigned *subchannel_count;
+
+ stpi_ditherfunc_t *ditherfunc;
+ void *aux_data;
+ void (*aux_freefunc)(struct dither *);
+} stpi_dither_t;
+
+#define CHANNEL(d, c) ((d)->channel[(c)])
+#define CHANNEL_COUNT(d) ((d)->total_channel_count)
+
+#define USMIN(a, b) ((a) < (b) ? (a) : (b))
+
+
+extern stpi_ditherfunc_t stpi_dither_predithered;
+extern stpi_ditherfunc_t stpi_dither_very_fast;
+extern stpi_ditherfunc_t stpi_dither_ordered;
+extern stpi_ditherfunc_t stpi_dither_ed;
+extern stpi_ditherfunc_t stpi_dither_et;
+extern stpi_ditherfunc_t stpi_dither_ut;
+
+extern void stpi_dither_reverse_row_ends(stpi_dither_t *d);
+extern int stpi_dither_translate_channel(stp_vars_t *v, unsigned channel,
+ unsigned subchannel);
+extern void stpi_dither_channel_destroy(stpi_dither_channel_t *channel);
+extern void stpi_dither_finalize(stp_vars_t *v);
+extern int *stpi_dither_get_errline(stpi_dither_t *d, int row, int color);
+
+
+#define ADVANCE_UNIDIRECTIONAL(d, bit, input, width, xerror, xstep, xmod) \
+do \
+{ \
+ bit >>= 1; \
+ if (bit == 0) \
+ { \
+ d->ptr_offset++; \
+ bit = 128; \
+ } \
+ input += xstep; \
+ if (xmod) \
+ { \
+ xerror += xmod; \
+ if (xerror >= d->dst_width) \
+ { \
+ xerror -= d->dst_width; \
+ input += (width); \
+ } \
+ } \
+} while (0)
+
+#define ADVANCE_REVERSE(d, bit, input, width, xerror, xstep, xmod) \
+do \
+{ \
+ if (bit == 128) \
+ { \
+ d->ptr_offset--; \
+ bit = 1; \
+ } \
+ else \
+ bit <<= 1; \
+ input -= xstep; \
+ if (xmod) \
+ { \
+ xerror -= xmod; \
+ if (xerror < 0) \
+ { \
+ xerror += d->dst_width; \
+ input -= (width); \
+ } \
+ } \
+} while (0)
+
+#define ADVANCE_BIDIRECTIONAL(d,bit,in,dir,width,xer,xstep,xmod,err,S) \
+do \
+{ \
+ int ii; \
+ int jj; \
+ for (ii = 0; ii < width; ii++) \
+ for (jj = 0; jj < S; jj++) \
+ err[ii][jj] += dir; \
+ if (dir == 1) \
+ ADVANCE_UNIDIRECTIONAL(d, bit, in, width, xer, xstep, xmod); \
+ else \
+ ADVANCE_REVERSE(d, bit, in, width, xer, xstep, xmod); \
+} while (0)
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* GUTENPRINT_INTERNAL_DITHER_IMPL_H */
+/*
+ * End of "$Id: dither-impl.h,v 1.25 2005/04/12 00:57:01 rlk Exp $".
+ */
diff --git a/src/main/dither-inks.c b/src/main/dither-inks.c
new file mode 100644
index 0000000..f7568e3
--- /dev/null
+++ b/src/main/dither-inks.c
@@ -0,0 +1,423 @@
+/*
+ * "$Id: dither-inks.c,v 1.25 2004/09/17 18:38:18 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.
+ *
+ * Revision History:
+ *
+ * See ChangeLog
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#include <math.h>
+#include <assert.h>
+#include <string.h>
+#include "dither-impl.h"
+
+int
+stpi_dither_translate_channel(stp_vars_t *v, unsigned channel,
+ unsigned subchannel)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ unsigned chan_idx;
+ if (!d)
+ return -1;
+ if (channel >= d->channel_count)
+ return -1;
+ if (subchannel >= d->subchannel_count[channel])
+ return -1;
+ chan_idx = d->channel_index[channel];
+ return chan_idx + subchannel;
+}
+
+unsigned char *
+stp_dither_get_channel(stp_vars_t *v, unsigned channel, unsigned subchannel)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ int place = stpi_dither_translate_channel(v, channel, subchannel);
+ if (place >= 0)
+ return d->channel[place].ptr;
+ else
+ return NULL;
+}
+
+static void
+insert_channel(stp_vars_t *v, stpi_dither_t *d, int channel)
+{
+ unsigned oc = d->channel_count;
+ int i;
+ d->channel_index =
+ stp_realloc (d->channel_index, sizeof(unsigned) * (channel + 1));
+ d->subchannel_count =
+ stp_realloc (d->subchannel_count, sizeof(unsigned) * (channel + 1));
+ for (i = oc; i < channel + 1; i++)
+ {
+ if (oc == 0)
+ d->channel_index[i] = 0;
+ else
+ d->channel_index[i] =
+ d->channel_index[oc - 1] + d->subchannel_count[oc - 1];
+ d->subchannel_count[i] = 0;
+ }
+ d->channel_count = channel + 1;
+}
+
+void
+stpi_dither_channel_destroy(stpi_dither_channel_t *channel)
+{
+ int i;
+ STP_SAFE_FREE(channel->ink_list);
+ if (channel->errs)
+ {
+ for (i = 0; i < channel->error_rows; i++)
+ STP_SAFE_FREE(channel->errs[i]);
+ STP_SAFE_FREE(channel->errs);
+ }
+ STP_SAFE_FREE(channel->ranges);
+ stp_dither_matrix_destroy(&(channel->pick));
+ stp_dither_matrix_destroy(&(channel->dithermat));
+}
+
+static void
+initialize_channel(stp_vars_t *v, int channel, int subchannel)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ int idx = stpi_dither_translate_channel(v, channel, subchannel);
+ stpi_dither_channel_t *dc = &(CHANNEL(d, idx));
+ stp_shade_t shade;
+ stp_dotsize_t dot;
+ assert(idx >= 0);
+ memset(dc, 0, sizeof(stpi_dither_channel_t));
+ stp_dither_matrix_clone(&(d->dither_matrix), &(dc->dithermat), 0, 0);
+ stp_dither_matrix_clone(&(d->transition_matrix), &(dc->pick), 0, 0);
+ shade.dot_sizes = &dot;
+ shade.value = 1.0;
+ shade.numsizes = 1;
+ dot.bit_pattern = 1;
+ dot.value = 1.0;
+ stp_dither_set_inks_full(v, channel, 1, &shade, 1.0, 1.0);
+}
+
+static void
+insert_subchannel(stp_vars_t *v, stpi_dither_t *d, int channel, int subchannel)
+{
+ int i;
+ unsigned oc = d->subchannel_count[channel];
+ unsigned increment = subchannel - oc + 1;
+ unsigned old_place = d->channel_index[channel] + oc;
+ stpi_dither_channel_t *nc =
+ stp_malloc(sizeof(stpi_dither_channel_t) *
+ (d->total_channel_count + increment));
+
+ if (d->channel)
+ {
+ /*
+ * Copy the old channels, including all subchannels of the current
+ * channel that already existed.
+ */
+ memcpy(nc, d->channel, sizeof(stpi_dither_channel_t) * old_place);
+ if (old_place < d->total_channel_count)
+ /*
+ * If we're inserting a new subchannel in the middle somewhere,
+ * we need to move everything else up
+ */
+ memcpy(nc + old_place + increment, d->channel + old_place,
+ (sizeof(stpi_dither_channel_t) *
+ (d->total_channel_count - old_place)));
+ stp_free(d->channel);
+ }
+ d->channel = nc;
+ if (channel < d->channel_count - 1)
+ /* Now fix up the subchannel offsets */
+ for (i = channel + 1; i < d->channel_count; i++)
+ d->channel_index[i] += increment;
+ d->subchannel_count[channel] = subchannel + 1;
+ d->total_channel_count += increment;
+ for (i = oc; i < oc + increment; i++)
+ initialize_channel(v, channel, i);
+}
+
+void
+stpi_dither_finalize(stp_vars_t *v)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ if (!d->finalized)
+ {
+ int i;
+ unsigned rc = 1 + (unsigned) ceil(sqrt(CHANNEL_COUNT(d)));
+ unsigned x_n = d->dither_matrix.x_size / rc;
+ unsigned y_n = d->dither_matrix.y_size / rc;
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ {
+ stpi_dither_channel_t *dc = &(CHANNEL(d, i));
+ stp_dither_matrix_clone(&(d->dither_matrix), &(dc->dithermat),
+ x_n * (i % rc), y_n * (i / rc));
+ stp_dither_matrix_clone(&(d->dither_matrix), &(dc->pick),
+ x_n * (i % rc), y_n * (i / rc));
+ }
+ d->finalized = 1;
+ }
+}
+
+void
+stp_dither_add_channel(stp_vars_t *v, unsigned char *data,
+ unsigned channel, unsigned subchannel)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ int idx;
+ if (channel >= d->channel_count)
+ insert_channel(v, d, channel);
+ if (subchannel >= d->subchannel_count[channel])
+ insert_subchannel(v, d, channel, subchannel);
+ idx = stpi_dither_translate_channel(v, channel, subchannel);
+ assert(idx >= 0);
+ d->channel[idx].ptr = data;
+}
+
+static void
+stpi_dither_finalize_ranges(stp_vars_t *v, stpi_dither_channel_t *dc)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ int i;
+ unsigned lbit = dc->bit_max;
+ dc->signif_bits = 0;
+ while (lbit > 0)
+ {
+ dc->signif_bits++;
+ lbit >>= 1;
+ }
+
+ for (i = 0; i < dc->nlevels; i++)
+ {
+ if (dc->ranges[i].lower->bits == dc->ranges[i].upper->bits)
+ dc->ranges[i].is_same_ink = 1;
+ else
+ dc->ranges[i].is_same_ink = 0;
+ if (dc->ranges[i].range_span > 0 && dc->ranges[i].value_span > 0)
+ dc->ranges[i].is_equal = 0;
+ else
+ dc->ranges[i].is_equal = 1;
+
+ stp_dprintf(STP_DBG_INK, v,
+ " level %d value[0] %d value[1] %d range[0] %d range[1] %d\n",
+ i, dc->ranges[i].lower->value, dc->ranges[i].upper->value,
+ dc->ranges[i].lower->range, dc->ranges[i].upper->range);
+ stp_dprintf(STP_DBG_INK, v,
+ " bits[0] %d bits[1] %d\n",
+ dc->ranges[i].lower->bits, dc->ranges[i].upper->bits);
+ stp_dprintf(STP_DBG_INK, v,
+ " rangespan %d valuespan %d same_ink %d equal %d\n",
+ dc->ranges[i].range_span, dc->ranges[i].value_span,
+ dc->ranges[i].is_same_ink, dc->ranges[i].is_equal);
+ if (i > 0 && dc->ranges[i].lower->range >= d->adaptive_limit)
+ {
+ d->adaptive_limit = dc->ranges[i].lower->range + 1;
+ if (d->adaptive_limit > 65535)
+ d->adaptive_limit = 65535;
+ stp_dprintf(STP_DBG_INK, v, "Setting adaptive limit to %d\n",
+ d->adaptive_limit);
+ }
+ }
+ for (i = 0; i <= dc->nlevels; i++)
+ stp_dprintf(STP_DBG_INK, v,
+ " ink_list[%d] range %d value %d bits %d\n",
+ i, dc->ink_list[i].range,
+ dc->ink_list[i].value, dc->ink_list[i].bits);
+ if (dc->nlevels == 1 && dc->ranges[0].upper->bits == 1)
+ dc->very_fast = 1;
+ else
+ dc->very_fast = 0;
+
+ stp_dprintf(STP_DBG_INK, v,
+ " bit_max %d signif_bits %d\n", dc->bit_max, dc->signif_bits);
+}
+
+static void
+stpi_dither_set_ranges(stp_vars_t *v, int color, const stp_shade_t *shade,
+ double density, double darkness)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ stpi_dither_channel_t *dc = &(CHANNEL(d, color));
+ const stp_dotsize_t *ranges = shade->dot_sizes;
+ int nlevels = shade->numsizes;
+ int i;
+
+ STP_SAFE_FREE(dc->ranges);
+ STP_SAFE_FREE(dc->ink_list);
+
+ dc->nlevels = nlevels > 1 ? nlevels + 1 : nlevels;
+ dc->ranges = (stpi_dither_segment_t *)
+ stp_zalloc(dc->nlevels * sizeof(stpi_dither_segment_t));
+ dc->ink_list = (stpi_ink_defn_t *)
+ stp_zalloc((dc->nlevels + 1) * sizeof(stpi_ink_defn_t));
+ dc->bit_max = 0;
+ dc->density = density * 65535;
+ dc->darkness = darkness;
+ stp_init_debug_messages(v);
+ stp_dprintf(STP_DBG_INK, v,
+ "stpi_dither_set_ranges channel %d nlevels %d density %f darkness %f\n",
+ color, nlevels, density, darkness);
+ for (i = 0; i < nlevels; i++)
+ stp_dprintf(STP_DBG_INK, v,
+ " level %d value %f pattern %x\n", i,
+ ranges[i].value, ranges[i].bit_pattern);
+ dc->ranges[0].lower = &dc->ink_list[0];
+ dc->ranges[0].upper = &dc->ink_list[1];
+ dc->ink_list[0].range = 0;
+ dc->ink_list[0].value = 0;
+ dc->ink_list[0].bits = 0;
+ if (nlevels == 1)
+ dc->ink_list[1].range = 65535;
+ else
+ dc->ink_list[1].range = ranges[0].value * 65535.0 * density;
+ if (dc->ink_list[1].range > 65535)
+ dc->ink_list[1].range = 65535;
+ dc->ink_list[1].value = ranges[0].value * 65535.0;
+ if (dc->ink_list[1].value > 65535)
+ dc->ink_list[1].value = 65535;
+ dc->ink_list[1].bits = ranges[0].bit_pattern;
+ if (ranges[0].bit_pattern > dc->bit_max)
+ dc->bit_max = ranges[0].bit_pattern;
+ dc->ranges[0].range_span = dc->ranges[0].upper->range;
+ dc->ranges[0].value_span = dc->ranges[0].upper->value;
+ if (dc->nlevels > 1)
+ {
+ for (i = 1; i < nlevels; i++)
+ {
+ int l = i + 1;
+ dc->ranges[i].lower = &dc->ink_list[i];
+ dc->ranges[i].upper = &dc->ink_list[l];
+
+ dc->ink_list[l].range =
+ (ranges[i].value + ranges[i].value) * 32768.0 * density;
+ if (dc->ink_list[l].range > 65535)
+ dc->ink_list[l].range = 65535;
+ dc->ink_list[l].value = ranges[i].value * 65535.0;
+ if (dc->ink_list[l].value > 65535)
+ dc->ink_list[l].value = 65535;
+ dc->ink_list[l].bits = ranges[i].bit_pattern;
+ if (ranges[i].bit_pattern > dc->bit_max)
+ dc->bit_max = ranges[i].bit_pattern;
+ dc->ranges[i].range_span =
+ dc->ink_list[l].range - dc->ink_list[i].range;
+ dc->ranges[i].value_span =
+ dc->ink_list[l].value - dc->ink_list[i].value;
+ }
+ dc->ranges[i].lower = &dc->ink_list[i];
+ dc->ranges[i].upper = &dc->ink_list[i+1];
+ dc->ink_list[i+1] = dc->ink_list[i];
+ dc->ink_list[i+1].range = 65535;
+ dc->ranges[i].range_span =
+ dc->ink_list[i+1].range - dc->ink_list[i].range;
+ dc->ranges[i].value_span =
+ dc->ink_list[i+1].value - dc->ink_list[i].value;
+ }
+ stpi_dither_finalize_ranges(v, dc);
+ stp_flush_debug_messages(v);
+}
+
+void
+stp_dither_set_inks_simple(stp_vars_t *v, int color, int nlevels,
+ const double *levels, double density,
+ double darkness)
+{
+ stp_shade_t s;
+ stp_dotsize_t *d = stp_malloc(nlevels * sizeof(stp_dotsize_t));
+ int i;
+ s.dot_sizes = d;
+ s.value = 65535.0;
+ s.numsizes = nlevels;
+
+ for (i = 0; i < nlevels; i++)
+ {
+ d[i].bit_pattern = i + 1;
+ d[i].value = levels[i];
+ }
+ stp_dither_set_inks_full(v, color, 1, &s, density, darkness);
+ stp_free(d);
+}
+
+void
+stp_dither_set_inks_full(stp_vars_t *v, int color, int nshades,
+ const stp_shade_t *shades, double density,
+ double darkness)
+{
+ int i;
+ int idx;
+ stpi_dither_channel_t *dc;
+
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+
+ stp_channel_reset_channel(v, color);
+
+ for (i = nshades - 1; i >= 0; i--)
+ {
+ int subchannel = nshades - i - 1;
+ idx = stpi_dither_translate_channel(v, color, subchannel);
+ assert(idx >= 0);
+ dc = &(CHANNEL(d, idx));
+
+ stp_channel_add(v, color, subchannel, shades[i].value);
+ if (idx >= 0)
+ stpi_dither_set_ranges(v, idx, &shades[i], density,
+ shades[i].value * darkness);
+ stp_dprintf(STP_DBG_INK, v,
+ " shade %d value %f\n",
+ i, shades[i].value);
+ }
+}
+
+void
+stp_dither_set_inks(stp_vars_t *v, int color, double density, double darkness,
+ int nshades, const double *svalues,
+ int ndotsizes, const double *dvalues)
+{
+ int i, j;
+ stp_shade_t *shades = stp_malloc(sizeof(stp_shade_t) * nshades);
+ stp_dotsize_t *dotsizes = stp_malloc(sizeof(stp_dotsize_t) * ndotsizes);
+ j = 0;
+ for (i = 0; i < ndotsizes; i++)
+ {
+ /* Skip over any zero-valued dot sizes */
+ if (dvalues[i] > 0)
+ {
+ dotsizes[j].value = dvalues[i];
+ dotsizes[j].bit_pattern = i + 1;
+ j++;
+ }
+ }
+ for (i = 0; i < nshades; i++)
+ {
+ shades[i].value = svalues[i];
+ shades[i].numsizes = j;
+ shades[i].dot_sizes = dotsizes;
+ }
+ stp_dither_set_inks_full(v, color, nshades, shades, density, darkness);
+ stp_free(dotsizes);
+ stp_free(shades);
+}
diff --git a/src/main/dither-inlined-functions.h b/src/main/dither-inlined-functions.h
new file mode 100644
index 0000000..5cd09d4
--- /dev/null
+++ b/src/main/dither-inlined-functions.h
@@ -0,0 +1,85 @@
+/*
+ * "$Id: dither-inlined-functions.h,v 1.6 2004/09/17 18:38:18 rleigh Exp $"
+ *
+ * Performance-critical functions that should be inlined, based on
+ * measurements.
+ *
+ * Copyright 1997-2003 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
+ */
+
+#ifndef GUTENPRINT_INTERNAL_DITHER_INLINED_FUNCTIONS_H
+#define GUTENPRINT_INTERNAL_DITHER_INLINED_FUNCTIONS_H
+
+/*
+ * Inlining has yielded significant (measured) speedup, even with the
+ * more complicated dither function. --rlk 20011219
+ */
+
+static inline unsigned
+ditherpoint(const stpi_dither_t *d, stp_dither_matrix_impl_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)
+ {
+ 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 inline void
+set_row_ends(stpi_dither_channel_t *dc, int x)
+{
+ if (dc->row_ends[0] == -1)
+ dc->row_ends[0] = x;
+ dc->row_ends[1] = x;
+}
+
+#endif /* GUTENPRINT_INTERNAL_DITHER_INLINED_FUNCTIONS_H */
diff --git a/src/main/dither-main.c b/src/main/dither-main.c
new file mode 100644
index 0000000..a5aadb6
--- /dev/null
+++ b/src/main/dither-main.c
@@ -0,0 +1,513 @@
+/*
+ * "$Id: dither-main.c,v 1.50 2005/04/12 00:57:01 rlk Exp $"
+ *
+ * Dither routine entrypoints
+ *
+ * Copyright 1997-2003 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 <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#include <math.h>
+#include <string.h>
+#include "dither-impl.h"
+#include "generic-options.h"
+
+static const stpi_dither_algorithm_t dither_algos[] =
+{
+ /* Note to translators: "EvenTone" is the proper name, rather than a */
+ /* descriptive name, of this algorithm. */
+ { "None", N_ ("Default"), -1 },
+ { "EvenTone", N_ ("EvenTone"), D_EVENTONE },
+ { "HybridEvenTone", N_ ("Hybrid EvenTone"), D_HYBRID_EVENTONE },
+ /*
+ * Placeholders for future implementation of EvenBetter Screening
+ * Translators: EvenTone, EvenBetter, and UniTone are proper
+ * names, not descriptive.
+ */
+ { "EBS", N_ ("EvenBetter"), D_INVALID },
+ { "HybridEBS", N_ ("Hybrid EvenBetter"), D_INVALID },
+ /*
+ * Unitone dithering seems to have some numerical stability problems
+ * -- rlk 20050113
+ */
+#if UNITONE_WORKS
+ { "UniTone", N_ ("UniTone"), D_UNITONE },
+ { "HybridUniTone", N_ ("Hybrid UniTone"), D_HYBRID_UNITONE },
+#endif
+ { "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 },
+ { "Predithered", N_ ("Predithered Input"), D_PREDITHERED }
+};
+
+static const int num_dither_algos = sizeof(dither_algos)/sizeof(stpi_dither_algorithm_t);
+
+
+/*
+ * 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
+};
+
+static const stp_parameter_t dither_parameters[] =
+{
+ {
+ "Density", N_("Density"), N_("Output Level Adjustment"),
+ N_("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."),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, -1, 1, 0
+ },
+ {
+ "DitherAlgorithm", N_("Dither Algorithm"), N_("Screening Adjustment"),
+ N_("Choose the dither algorithm to be used.\n"
+ "Adaptive Hybrid usually produces the best all-around quality.\n"
+ "EvenTone is a new, experimental algorithm that often produces excellent results.\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."),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 1, 1, -1, 1, 0
+ },
+};
+
+static const int dither_parameter_count =
+sizeof(dither_parameters) / sizeof(const stp_parameter_t);
+
+stp_parameter_list_t
+stp_dither_list_parameters(const stp_vars_t *v)
+{
+ stp_parameter_list_t *ret = stp_parameter_list_create();
+ int i;
+ for (i = 0; i < dither_parameter_count; i++)
+ stp_parameter_list_add_param(ret, &(dither_parameters[i]));
+ return ret;
+}
+
+void
+stp_dither_describe_parameter(const stp_vars_t *v, const char *name,
+ stp_parameter_t *description)
+{
+ int i;
+ description->p_type = STP_PARAMETER_TYPE_INVALID;
+ if (name == NULL)
+ return;
+ description->deflt.str = NULL;
+ if (strcmp(name, "Density") == 0)
+ {
+ stp_fill_parameter_settings(description, &(dither_parameters[0]));
+ description->bounds.dbl.upper = 8.0;
+ description->bounds.dbl.lower = 0.1;
+ description->deflt.dbl = 1.0;
+ }
+ else if (strcmp(name, "DitherAlgorithm") == 0)
+ {
+ stp_fill_parameter_settings(description, &(dither_parameters[1]));
+ if (stp_check_string_parameter(v, "Quality", STP_PARAMETER_ACTIVE) &&
+ stpi_get_quality_by_name(stp_get_string_parameter(v, "Quality")))
+ description->is_active = 0;
+ else
+ {
+ description->bounds.str = stp_string_list_create();
+ for (i = 0; i < num_dither_algos; i++)
+ {
+ const stpi_dither_algorithm_t *dt = &dither_algos[i];
+ if (dt->id != D_INVALID)
+ stp_string_list_add_string(description->bounds.str,
+ dt->name, dt->text);
+ }
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
+ }
+ else
+ return;
+ if (stp_check_string_parameter(v, "Quality", STP_PARAMETER_ACTIVE) &&
+ stpi_get_quality_by_name(stp_get_string_parameter(v, "Quality")))
+ description->is_active = 0;
+ else if (stp_check_string_parameter(v, "ImageType", STP_PARAMETER_ACTIVE) &&
+ strcmp(stp_get_string_parameter(v, "ImageType"), "None") != 0 &&
+ description->p_level > STP_PARAMETER_LEVEL_BASIC)
+ description->is_active = 0;
+}
+
+#define RETURN_DITHERFUNC(func, v) \
+do \
+{ \
+ stp_dprintf(STP_DBG_COLORFUNC, v, "ditherfunc %s\n", #func); \
+ return (func); \
+} while (0)
+
+static stpi_ditherfunc_t *
+stpi_set_dither_function(stp_vars_t *v)
+{
+ const stpi_quality_t *quality = NULL;
+ const char *image_type = stp_get_string_parameter(v, "ImageType");
+ const char *color_correction = stp_get_string_parameter(v,"ColorCorrection");
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ int i;
+ const char *algorithm = stp_get_string_parameter(v, "DitherAlgorithm");
+ d->stpi_dither_type = -1;
+ if (stp_check_string_parameter(v, "Quality", STP_PARAMETER_ACTIVE))
+ quality = stpi_get_quality_by_name(stp_get_string_parameter(v, "Quality"));
+
+ if (color_correction)
+ {
+ if (strcmp(color_correction, "Predithered") == 0)
+ d->stpi_dither_type = D_PREDITHERED;
+ }
+ if (image_type && d->stpi_dither_type == -1)
+ {
+ if (strcmp(image_type, "Text") == 0)
+ d->stpi_dither_type = D_VERY_FAST;
+ }
+ if (quality && d->stpi_dither_type == -1)
+ {
+ switch (quality->quality_level)
+ {
+ case 0:
+ case 1:
+ d->stpi_dither_type = D_VERY_FAST;
+ break;
+ case 2:
+ case 3:
+ if (image_type && strcmp(image_type, "LineArt") == 0)
+ d->stpi_dither_type = D_VERY_FAST;
+ else
+ d->stpi_dither_type = D_FAST;
+ break;
+ case 4:
+ if (image_type &&
+ (strcmp(image_type, "LineArt") == 0 ||
+ strcmp(image_type, "TextGraphics") == 0))
+ d->stpi_dither_type = D_ADAPTIVE_HYBRID;
+ else
+ d->stpi_dither_type = D_ORDERED;
+ break;
+ case 5:
+ if (image_type &&
+ (strcmp(image_type, "LineArt") == 0 ||
+ strcmp(image_type, "TextGraphics") == 0))
+ d->stpi_dither_type = D_HYBRID_EVENTONE;
+ else if (image_type && (strcmp(image_type, "Photo") == 0))
+ d->stpi_dither_type = D_EVENTONE;
+ else
+ d->stpi_dither_type = D_ORDERED;
+ break;
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ case 10:
+ default:
+ if (image_type &&
+ (strcmp(image_type, "LineArt") == 0 ||
+ strcmp(image_type, "TextGraphics") == 0))
+ d->stpi_dither_type = D_HYBRID_EVENTONE;
+ else
+ d->stpi_dither_type = D_EVENTONE;
+ break;
+ }
+ /* EvenTone performs poorly if the aspect ratio is greater than 2 */
+ if ((d->stpi_dither_type & (D_EVENTONE | D_UNITONE)) &&
+ (d->x_aspect > 2 || d->y_aspect > 2))
+ d->stpi_dither_type = D_ADAPTIVE_HYBRID;
+ }
+ else if (algorithm)
+ {
+ for (i = 0; i < num_dither_algos; i++)
+ {
+ if (!strcmp(algorithm, _(dither_algos[i].name)))
+ {
+ d->stpi_dither_type = dither_algos[i].id;
+ break;
+ }
+ }
+ if (d->stpi_dither_type == -1)
+ {
+ d->stpi_dither_type = D_EVENTONE;
+ /* EvenTone performs poorly if the aspect ratio is greater than 2 */
+ if ((d->stpi_dither_type & (D_EVENTONE | D_UNITONE)) &&
+ (d->x_aspect > 2 || d->y_aspect > 2))
+ d->stpi_dither_type = D_ADAPTIVE_HYBRID;
+ }
+ }
+ switch (d->stpi_dither_type)
+ {
+ case D_PREDITHERED:
+ RETURN_DITHERFUNC(stpi_dither_predithered, v);
+ case D_VERY_FAST:
+ RETURN_DITHERFUNC(stpi_dither_very_fast, v);
+ case D_ORDERED:
+ case D_FAST:
+ RETURN_DITHERFUNC(stpi_dither_ordered, v);
+ case D_HYBRID_EVENTONE:
+ case D_EVENTONE:
+ RETURN_DITHERFUNC(stpi_dither_et, v);
+ case D_HYBRID_UNITONE:
+ case D_UNITONE:
+ RETURN_DITHERFUNC(stpi_dither_ut, v);
+ default:
+ RETURN_DITHERFUNC(stpi_dither_ed, v);
+ }
+}
+
+void
+stp_dither_set_adaptive_limit(stp_vars_t *v, double limit)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ d->adaptive_limit = limit;
+}
+
+void
+stp_dither_set_ink_spread(stp_vars_t *v, int spread)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ STP_SAFE_FREE(d->offset0_table);
+ STP_SAFE_FREE(d->offset1_table);
+ 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;
+}
+
+void
+stp_dither_set_randomizer(stp_vars_t *v, int i, double val)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ if (i < 0 || i >= CHANNEL_COUNT(d))
+ return;
+ CHANNEL(d, i).randomizer = val * 65535;
+}
+
+static void
+stpi_dither_free(void *vd)
+{
+ stpi_dither_t *d = (stpi_dither_t *) vd;
+ int j;
+ if (d->aux_freefunc)
+ (d->aux_freefunc)(d);
+ for (j = 0; j < CHANNEL_COUNT(d); j++)
+ stpi_dither_channel_destroy(&(CHANNEL(d, j)));
+ STP_SAFE_FREE(d->offset0_table);
+ STP_SAFE_FREE(d->offset1_table);
+ stp_dither_matrix_destroy(&(d->dither_matrix));
+ stp_dither_matrix_destroy(&(d->transition_matrix));
+ stp_free(d->channel);
+ stp_free(d->channel_index);
+ stp_free(d->subchannel_count);
+ stp_free(d);
+}
+
+void
+stp_dither_init(stp_vars_t *v, stp_image_t *image, int out_width,
+ int xdpi, int ydpi)
+{
+ int in_width = stp_image_width(image);
+ stpi_dither_t *d = stp_zalloc(sizeof(stpi_dither_t));
+
+ stp_allocate_component_data(v, "Dither", NULL, stpi_dither_free, d);
+
+ d->finalized = 0;
+ d->error_rows = ERROR_ROWS;
+ d->d_cutoff = 4096;
+
+ d->offset0_table = NULL;
+ d->offset1_table = NULL;
+ if (xdpi > ydpi)
+ {
+ d->x_aspect = 1;
+ d->y_aspect = xdpi / ydpi;
+ }
+ else
+ {
+ d->x_aspect = ydpi / xdpi;
+ d->y_aspect = 1;
+ }
+ d->ditherfunc = stpi_set_dither_function(v);
+ d->transition = 1.0;
+ d->adaptive_limit = .75 * 65535;
+
+ /*
+ * For hybrid EvenTone we want to use the good matrix. For regular
+ * EvenTone, we don't need to pay the cost.
+ */
+
+ if (d->stpi_dither_type == D_VERY_FAST || d->stpi_dither_type ==D_EVENTONE ||
+ d->stpi_dither_type == D_FAST || d->stpi_dither_type == D_PREDITHERED)
+ {
+ if (stp_check_int_parameter(v, "DitherVeryFastSteps",
+ STP_PARAMETER_ACTIVE))
+ stp_dither_set_iterated_matrix
+ (v, 2, stp_get_int_parameter(v, "DitherVeryFastSteps"), sq2, 0, 2,4);
+ else
+ stp_dither_set_iterated_matrix(v, 2, DITHER_FAST_STEPS, sq2, 0, 2, 4);
+ }
+ else if (stp_check_array_parameter(v, "DitherMatrix",
+ STP_PARAMETER_ACTIVE) &&
+ (stp_dither_matrix_validate_array
+ (stp_get_array_parameter(v, "DitherMatrix"))))
+ {
+ stp_dither_set_matrix_from_dither_array
+ (v, stp_get_array_parameter(v, "DitherMatrix"), 0);
+ }
+ else
+ {
+ stp_array_t *array;
+ int transposed;
+ array = stp_find_standard_dither_array(d->y_aspect, d->x_aspect);
+ transposed = d->y_aspect < d->x_aspect ? 1 : 0;
+ if (array)
+ {
+ stp_dither_set_matrix_from_dither_array(v, array, transposed);
+ stp_array_destroy(array);
+ }
+ else
+ {
+ stp_eprintf(v, "Cannot find dither matrix file! Aborting.\n");
+ stp_abort();
+ }
+ }
+ stp_dither_set_transition(v, 0.7);
+
+ d->src_width = in_width;
+ d->dst_width = out_width;
+
+ stp_dither_set_ink_spread(v, 13);
+ d->channel_count = 0;
+}
+
+void
+stpi_dither_reverse_row_ends(stpi_dither_t *d)
+{
+ int i;
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ {
+ int tmp = CHANNEL(d, i).row_ends[0];
+ CHANNEL(d, i).row_ends[0] =
+ CHANNEL(d, i).row_ends[1];
+ CHANNEL(d, i).row_ends[1] = tmp;
+ }
+}
+
+int
+stp_dither_get_first_position(stp_vars_t *v, int color, int subchannel)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ int channel = stpi_dither_translate_channel(v, color, subchannel);
+ if (channel < 0)
+ return -1;
+ return CHANNEL(d, channel).row_ends[0];
+}
+
+int
+stp_dither_get_last_position(stp_vars_t *v, int color, int subchannel)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ int channel = stpi_dither_translate_channel(v, color, subchannel);
+ if (channel < 0)
+ return -1;
+ return CHANNEL(d, channel).row_ends[1];
+}
+
+int *
+stpi_dither_get_errline(stpi_dither_t *d, int row, int color)
+{
+ stpi_dither_channel_t *dc;
+ if (row < 0 || color < 0 || color >= CHANNEL_COUNT(d))
+ return NULL;
+ dc = &(CHANNEL(d, color));
+ if (!dc->errs)
+ dc->errs = stp_zalloc(d->error_rows * sizeof(int *));
+ if (!dc->errs[row % dc->error_rows])
+ {
+ int size = 2 * MAX_SPREAD + (16 * ((d->dst_width + 7) / 8));
+ dc->errs[row % dc->error_rows] = stp_zalloc(size * sizeof(int));
+ }
+ return dc->errs[row % dc->error_rows] + MAX_SPREAD;
+}
+
+void
+stp_dither_internal(stp_vars_t *v, int row, const unsigned short *input,
+ int duplicate_line, int zero_mask,
+ const unsigned char *mask)
+{
+ int i;
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ stpi_dither_finalize(v);
+ stp_dither_matrix_set_row(&(d->dither_matrix), row);
+ stp_dither_matrix_set_row(&(d->transition_matrix), row);
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ {
+ CHANNEL(d, i).ptr = CHANNEL(d, i).ptr;
+ if (CHANNEL(d, i).ptr)
+ memset(CHANNEL(d, i).ptr, 0,
+ (d->dst_width + 7) / 8 * CHANNEL(d, i).signif_bits);
+ CHANNEL(d, i).row_ends[0] = -1;
+ CHANNEL(d, i).row_ends[1] = -1;
+
+ stp_dither_matrix_set_row(&(CHANNEL(d, i).dithermat), row);
+ stp_dither_matrix_set_row(&(CHANNEL(d, i).pick), row);
+ }
+ d->ptr_offset = 0;
+ (d->ditherfunc)(v, row, input, duplicate_line, zero_mask, mask);
+}
+
+void
+stp_dither(stp_vars_t *v, int row, int duplicate_line, int zero_mask,
+ const unsigned char *mask)
+{
+ const unsigned short *input = stp_channel_get_output(v);
+ stp_dither_internal(v, row, input, duplicate_line, zero_mask, mask);
+}
diff --git a/src/main/dither-matrix-1x1.xml b/src/main/dither-matrix-1x1.xml
new file mode 100644
index 0000000..87a2ccf
--- /dev/null
+++ b/src/main/dither-matrix-1x1.xml
@@ -0,0 +1,5553 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gutenprint xmlns="http://gimp-print.sourceforge.net/xsd/gp.xsd-1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://gimp-print.sourceforge.net/xsd/gp.xsd-1.0
+ gutenprint.xsd">
+ <dither-matrix x-aspect="1" y-aspect="1">
+ <array x-size="257" y-size="257">
+ <sequence count="66049" lower-bound="0" upper-bound="65535">
+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
+ </sequence>
+ </array>
+ </dither-matrix>
+</gutenprint>
diff --git a/src/main/dither-matrix-2x1.xml b/src/main/dither-matrix-2x1.xml
new file mode 100644
index 0000000..29aab5e
--- /dev/null
+++ b/src/main/dither-matrix-2x1.xml
@@ -0,0 +1,5505 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gutenprint xmlns="http://gimp-print.sourceforge.net/xsd/gp.xsd-1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://gimp-print.sourceforge.net/xsd/gp.xsd-1.0
+ gutenprint.xsd">
+ <dither-matrix x-aspect="2" y-aspect="1">
+ <array x-size="367" y-size="179">
+ <sequence count="65693" lower-bound="0" upper-bound="65535">
+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
+ </sequence>
+ </array>
+ </dither-matrix>
+</gutenprint>
diff --git a/src/main/dither-matrix-4x1.xml b/src/main/dither-matrix-4x1.xml
new file mode 100644
index 0000000..46d6817
--- /dev/null
+++ b/src/main/dither-matrix-4x1.xml
@@ -0,0 +1,5569 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gutenprint xmlns="http://gimp-print.sourceforge.net/xsd/gp.xsd-1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://gimp-print.sourceforge.net/xsd/gp.xsd-1.0
+ gutenprint.xsd">
+ <dither-matrix x-aspect="4" y-aspect="1">
+ <array x-size="509" y-size="131">
+ <sequence count="66679" lower-bound="0" upper-bound="65535">
+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
+ </sequence>
+ </array>
+ </dither-matrix>
+</gutenprint>
diff --git a/src/main/dither-ordered.c b/src/main/dither-ordered.c
new file mode 100644
index 0000000..6a17d83
--- /dev/null
+++ b/src/main/dither-ordered.c
@@ -0,0 +1,166 @@
+/*
+ * "$Id: dither-ordered.c,v 1.17 2004/09/17 18:38:20 rleigh Exp $"
+ *
+ * Ordered dither algorithm
+ *
+ * Copyright 1997-2003 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 <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include "dither-impl.h"
+#include "dither-inlined-functions.h"
+
+static inline void
+print_color_ordered(const stpi_dither_t *d, stpi_dither_channel_t *dc, int val,
+ int x, int y, unsigned char bit, int length)
+{
+ int i;
+ int j;
+ unsigned bits;
+ int levels = dc->nlevels - 1;
+
+ /*
+ * 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--)
+ {
+ stpi_dither_segment_t *dd = &(dc->ranges[i]);
+
+ if (val > dd->lower->value)
+ {
+ /*
+ * Where are we within the range.
+ */
+
+ unsigned rangepoint = val - dd->lower->value;
+ if (dd->value_span < 65535)
+ rangepoint = rangepoint * 65535 / dd->value_span;
+
+ if (rangepoint >= ditherpoint(d, &(dc->dithermat), x))
+ bits = dd->upper->bits;
+ else
+ bits = dd->lower->bits;
+
+ if (bits)
+ {
+ unsigned char *tptr = dc->ptr + d->ptr_offset;
+
+ /*
+ * Lay down all of the bits in the pixel.
+ */
+ set_row_ends(dc, x);
+ for (j = 1; j <= bits; j += j, tptr += length)
+ {
+ if (j & bits)
+ tptr[0] |= bit;
+ }
+
+ }
+ return;
+ }
+ }
+}
+
+
+void
+stpi_dither_ordered(stp_vars_t *v,
+ int row,
+ const unsigned short *raw,
+ int duplicate_line,
+ int zero_mask,
+ const unsigned char *mask)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ int x,
+ length;
+ unsigned char bit;
+ int i;
+ int one_bit_only = 1;
+
+ int xerror, xstep, xmod;
+
+ if ((zero_mask & ((1 << CHANNEL_COUNT(d)) - 1)) ==
+ ((1 << CHANNEL_COUNT(d)) - 1))
+ return;
+
+ length = (d->dst_width + 7) / 8;
+
+ bit = 128;
+ xstep = CHANNEL_COUNT(d) * (d->src_width / d->dst_width);
+ xmod = d->src_width % d->dst_width;
+ xerror = 0;
+
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ {
+ stpi_dither_channel_t *dc = &(CHANNEL(d, i));
+ if (dc->nlevels != 1 || dc->ranges[0].upper->bits != 1)
+ one_bit_only = 0;
+ }
+
+ if (one_bit_only)
+ {
+ for (x = 0; x < d->dst_width; x ++)
+ {
+ if (!mask || (*(mask + d->ptr_offset) & bit))
+ {
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ {
+ if (raw[i] &&
+ raw[i] >= ditherpoint(d, &(CHANNEL(d, i).dithermat), x))
+ {
+ set_row_ends(&(CHANNEL(d, i)), x);
+ CHANNEL(d, i).ptr[d->ptr_offset] |= bit;
+ }
+ }
+ }
+ ADVANCE_UNIDIRECTIONAL(d, bit, raw, CHANNEL_COUNT(d),
+ xerror, xstep, xmod);
+ }
+ }
+ else
+ {
+ for (x = 0; x != d->dst_width; x ++)
+ {
+ if (!mask || (*(mask + d->ptr_offset) & bit))
+ {
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ {
+ if (CHANNEL(d, i).ptr && raw[i])
+ print_color_ordered(d, &(CHANNEL(d, i)), raw[i], x, row,
+ bit, length);
+ }
+ }
+ ADVANCE_UNIDIRECTIONAL(d, bit, raw, CHANNEL_COUNT(d), xerror,
+ xstep, xmod);
+ }
+ }
+}
diff --git a/src/main/dither-predithered.c b/src/main/dither-predithered.c
new file mode 100644
index 0000000..df5b71a
--- /dev/null
+++ b/src/main/dither-predithered.c
@@ -0,0 +1,134 @@
+/*
+ * "$Id: dither-predithered.c,v 1.2 2004/09/17 18:38:20 rleigh Exp $"
+ *
+ * Very fast dither algorithm
+ *
+ * Copyright 1997-2003 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 <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include "dither-impl.h"
+#include "dither-inlined-functions.h"
+
+static inline void
+print_color_very_fast(const stpi_dither_t *d, stpi_dither_channel_t *dc,
+ int val, int x, int y, unsigned char bit,
+ unsigned bits, int length)
+{
+ int j;
+ if (bits && val)
+ {
+ unsigned char *tptr = dc->ptr + d->ptr_offset;
+
+ /*
+ * Lay down all of the bits in the pixel.
+ */
+ set_row_ends(dc, x);
+ for (j = 1; j <= bits; j += j, tptr += length)
+ {
+ if (j & bits)
+ tptr[0] |= bit;
+ }
+ }
+}
+
+void
+stpi_dither_predithered(stp_vars_t *v,
+ int row,
+ const unsigned short *raw,
+ int duplicate_line,
+ int zero_mask,
+ const unsigned char *mask)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ int x,
+ length;
+ unsigned char *bit_patterns;
+ unsigned char bit;
+ int i;
+ int one_bit_only = 1;
+
+ int xerror, xstep, xmod;
+
+ if ((zero_mask & ((1 << CHANNEL_COUNT(d)) - 1)) ==
+ ((1 << CHANNEL_COUNT(d)) - 1))
+ return;
+
+ length = (d->dst_width + 7) / 8;
+
+ bit = 128;
+ xstep = CHANNEL_COUNT(d) * (d->src_width / d->dst_width);
+ xmod = d->src_width % d->dst_width;
+ xerror = 0;
+
+ bit_patterns = stp_zalloc(sizeof(unsigned char) * CHANNEL_COUNT(d));
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ {
+ stpi_dither_channel_t *dc = &(CHANNEL(d, i));
+ if (dc->nlevels > 0)
+ bit_patterns[i] = dc->ranges[dc->nlevels - 1].upper->bits;
+ if (bit_patterns[i] != 1)
+ one_bit_only = 0;
+ }
+ if (one_bit_only)
+ {
+ for (x = 0; x < d->dst_width; x ++)
+ {
+ if (!mask || (*(mask + d->ptr_offset) & bit))
+ {
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ {
+ if (raw[i])
+ {
+ set_row_ends(&(CHANNEL(d, i)), x);
+ CHANNEL(d, i).ptr[d->ptr_offset] |= bit;
+ }
+ }
+ }
+ ADVANCE_UNIDIRECTIONAL(d, bit, raw, CHANNEL_COUNT(d),
+ xerror, xstep, xmod);
+ }
+ }
+ else
+ {
+ for (x = 0; x < d->dst_width; x ++)
+ {
+ if (!mask || (*(mask + d->ptr_offset) & bit))
+ {
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ {
+ if (CHANNEL(d, i).ptr && raw[i])
+ print_color_very_fast(d, &(CHANNEL(d, i)), raw[i], x, row,
+ bit, bit_patterns[i], length);
+ }
+ }
+ ADVANCE_UNIDIRECTIONAL(d, bit, raw, CHANNEL_COUNT(d),
+ xerror, xstep, xmod);
+ }
+ }
+ stp_free(bit_patterns);
+}
diff --git a/src/main/dither-very-fast.c b/src/main/dither-very-fast.c
new file mode 100644
index 0000000..7b83aa8
--- /dev/null
+++ b/src/main/dither-very-fast.c
@@ -0,0 +1,135 @@
+/*
+ * "$Id: dither-very-fast.c,v 1.15 2004/09/17 18:38:20 rleigh Exp $"
+ *
+ * Very fast dither algorithm
+ *
+ * Copyright 1997-2003 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 <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include "dither-impl.h"
+#include "dither-inlined-functions.h"
+
+static inline void
+print_color_very_fast(const stpi_dither_t *d, stpi_dither_channel_t *dc,
+ int val, int x, int y, unsigned char bit,
+ unsigned bits, int length)
+{
+ int j;
+ if (bits && val >= ditherpoint(d, &(dc->dithermat), x))
+ {
+ unsigned char *tptr = dc->ptr + d->ptr_offset;
+
+ /*
+ * Lay down all of the bits in the pixel.
+ */
+ set_row_ends(dc, x);
+ for (j = 1; j <= bits; j += j, tptr += length)
+ {
+ if (j & bits)
+ tptr[0] |= bit;
+ }
+ }
+}
+
+void
+stpi_dither_very_fast(stp_vars_t *v,
+ int row,
+ const unsigned short *raw,
+ int duplicate_line,
+ int zero_mask,
+ const unsigned char *mask)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ int x,
+ length;
+ unsigned char *bit_patterns;
+ unsigned char bit;
+ int i;
+ int one_bit_only = 1;
+
+ int xerror, xstep, xmod;
+
+ if ((zero_mask & ((1 << CHANNEL_COUNT(d)) - 1)) ==
+ ((1 << CHANNEL_COUNT(d)) - 1))
+ return;
+
+ length = (d->dst_width + 7) / 8;
+
+ bit = 128;
+ xstep = CHANNEL_COUNT(d) * (d->src_width / d->dst_width);
+ xmod = d->src_width % d->dst_width;
+ xerror = 0;
+
+ bit_patterns = stp_zalloc(sizeof(unsigned char) * CHANNEL_COUNT(d));
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ {
+ stpi_dither_channel_t *dc = &(CHANNEL(d, i));
+ if (dc->nlevels > 0)
+ bit_patterns[i] = dc->ranges[dc->nlevels - 1].upper->bits;
+ if (bit_patterns[i] != 1)
+ one_bit_only = 0;
+ }
+ if (one_bit_only)
+ {
+ for (x = 0; x < d->dst_width; x ++)
+ {
+ if (!mask || (*(mask + d->ptr_offset) & bit))
+ {
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ {
+ if (raw[i] &&
+ raw[i] >= ditherpoint(d, &(CHANNEL(d, i).dithermat), x))
+ {
+ set_row_ends(&(CHANNEL(d, i)), x);
+ CHANNEL(d, i).ptr[d->ptr_offset] |= bit;
+ }
+ }
+ }
+ ADVANCE_UNIDIRECTIONAL(d, bit, raw, CHANNEL_COUNT(d),
+ xerror, xstep, xmod);
+ }
+ }
+ else
+ {
+ for (x = 0; x < d->dst_width; x ++)
+ {
+ if (!mask || (*(mask + d->ptr_offset) & bit))
+ {
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ {
+ if (CHANNEL(d, i).ptr && raw[i])
+ print_color_very_fast(d, &(CHANNEL(d, i)), raw[i], x, row,
+ bit, bit_patterns[i], length);
+ }
+ }
+ ADVANCE_UNIDIRECTIONAL(d, bit, raw, CHANNEL_COUNT(d),
+ xerror, xstep, xmod);
+ }
+ }
+ stp_free(bit_patterns);
+}
diff --git a/src/main/escp2-channels.c b/src/main/escp2-channels.c
new file mode 100644
index 0000000..7d9a839
--- /dev/null
+++ b/src/main/escp2-channels.c
@@ -0,0 +1,2212 @@
+/*
+ * "$Id: escp2-channels.c,v 1.54 2005/06/26 22:07:46 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include "print-escp2.h"
+
+
+#define DECLARE_INK_CHANNEL(name) \
+static const ink_channel_t name##_channel = \
+{ \
+ #name, \
+ name##_subchannels, \
+ sizeof(name##_subchannels) / sizeof(physical_subchannel_t), \
+ NULL \
+}
+
+#define DECLARE_EXTENDED_INK_CHANNEL(name) \
+static const ink_channel_t name##_channel = \
+{ \
+ #name, \
+ name##_subchannels, \
+ sizeof(name##_subchannels) / sizeof(physical_subchannel_t), \
+ &name##_curve \
+}
+
+static hue_curve_t generic_cyan_curve =
+{
+ "CyanCurve",
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+ "<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+ /* C */ "1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 " /* B */
+ /* B */ "1.000 0.875 0.750 0.625 0.500 0.375 0.250 0.125 " /* M */
+ /* M */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* R */
+ /* R */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* Y */
+ /* Y */ "0.000 0.125 0.250 0.375 0.500 0.625 0.750 0.875 " /* G */
+ /* G */ "1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 " /* C */
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n"
+};
+
+static hue_curve_t generic_magenta_curve =
+{
+ "CyanCurve",
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+ "<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+ /* C */ "0.000 0.125 0.250 0.375 0.500 0.625 0.750 0.875 " /* B */
+ /* B */ "1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 " /* M */
+ /* M */ "1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 " /* R */
+ /* R */ "1.000 0.875 0.750 0.625 0.500 0.375 0.250 0.125 " /* Y */
+ /* Y */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* G */
+ /* G */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* C */
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n"
+};
+
+static hue_curve_t generic_yellow_curve =
+{
+ "CyanCurve",
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+ "<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+ /* C */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* B */
+ /* B */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* M */
+ /* M */ "0.000 0.125 0.250 0.375 0.500 0.625 0.750 0.875 " /* R */
+ /* R */ "1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 " /* Y */
+ /* Y */ "1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 " /* G */
+ /* G */ "1.000 0.875 0.750 0.625 0.500 0.375 0.250 0.125 " /* C */
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n"
+};
+
+static hue_curve_t r800_cyan_curve =
+{
+ "CyanCurve",
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+ "<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+ /* C */ "1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 " /* B */
+ /* B */ "1.000 0.875 0.700 0.550 0.400 0.300 0.200 0.100 " /* M */
+ /* M */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* R */
+ /* R */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* Y */
+ /* Y */ "0.000 0.125 0.250 0.375 0.500 0.625 0.750 0.875 " /* G */
+ /* G */ "1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 " /* C */
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n"
+};
+
+static hue_curve_t r800_magenta_curve =
+{
+ "CyanCurve",
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+ "<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+ /* C */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* B */
+ /* B */ "0.000 0.000 0.000 0.002 0.050 0.300 0.600 0.800 " /* M */
+ /* M */ "1.000 1.000 0.850 0.700 0.600 0.500 0.400 0.300 " /* R */
+ /* R */ "0.200 0.100 0.050 0.000 0.000 0.000 0.000 0.000 " /* Y */
+ /* Y */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* G */
+ /* G */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* C */
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n"
+};
+
+static hue_curve_t r800_yellow_curve =
+{
+ "CyanCurve",
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+ "<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+ /* C */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* B */
+ /* B */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* M */
+ /* M */ "0.000 0.000 0.000 0.000 0.000 0.000 0.050 0.150 " /* R */
+ /* R */ "0.250 0.350 0.450 0.550 0.650 0.750 0.850 0.950 " /* Y */
+ /* Y */ "1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 " /* G */
+ /* G */ "1.000 0.875 0.750 0.625 0.500 0.375 0.250 0.125 " /* C */
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n"
+};
+
+static hue_curve_t r800_red_curve =
+{
+ "CyanCurve",
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+ "<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+ /* C */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* B */
+ /* B */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* M */
+ /* M */ "0.000 0.350 0.550 0.700 0.850 1.000 1.000 1.000 " /* R */
+ /* R */ "1.000 0.875 0.750 0.625 0.500 0.375 0.250 0.125 " /* Y */
+ /* Y */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* G */
+ /* G */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* C */
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n"
+};
+
+static hue_curve_t r800_blue_curve =
+{
+ "CyanCurve",
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+ "<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+ /* C */ "0.000 0.125 0.250 0.375 0.500 0.625 0.750 0.875 " /* B */
+ /* B */ "1.000 1.000 1.000 1.000 0.900 0.800 0.500 0.200 " /* M */
+ /* M */ "0.005 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* R */
+ /* R */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* Y */
+ /* Y */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* G */
+ /* G */ "0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 " /* C */
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n"
+};
+
+
+static const physical_subchannel_t standard_black_subchannels[] =
+{
+ { 0, -1, 0, "BlackDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(standard_black);
+
+static const physical_subchannel_t x80_black_subchannels[] =
+{
+ { 0, -1, 48, "BlackDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(x80_black);
+
+static const physical_subchannel_t c80_black_subchannels[] =
+{
+ { 0, -1, 0, "BlackDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(c80_black);
+
+static const physical_subchannel_t c64_black_subchannels[] =
+{
+ { 0, -1, 0, "BlackDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(c64_black);
+
+static const physical_subchannel_t standard_cyan_subchannels[] =
+{
+ { 2, -1, 0, "CyanDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(standard_cyan);
+
+static const physical_subchannel_t f360_standard_cyan_subchannels[] =
+{
+ { 2, -1, 1, "CyanDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(f360_standard_cyan);
+
+static const physical_subchannel_t r800_cyan_subchannels[] =
+{
+ { 2, -1, 1, "CyanDensity", NULL }
+};
+
+DECLARE_EXTENDED_INK_CHANNEL(r800_cyan);
+
+static const physical_subchannel_t cx3650_standard_cyan_subchannels[] =
+{
+ { 2, -1, 2, "CyanDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(cx3650_standard_cyan);
+
+static const physical_subchannel_t x80_cyan_subchannels[] =
+{
+ { 2, -1, 96, "CyanDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(x80_cyan);
+
+static const physical_subchannel_t c80_cyan_subchannels[] =
+{
+ { 2, -1, 0, "CyanDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(c80_cyan);
+
+static const physical_subchannel_t c64_cyan_subchannels[] =
+{
+ { 2, -1, 0, "CyanDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(c64_cyan);
+
+static const physical_subchannel_t standard_magenta_subchannels[] =
+{
+ { 1, -1, 0, "MagentaDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(standard_magenta);
+
+static const physical_subchannel_t r800_magenta_subchannels[] =
+{
+ { 1, -1, 0, "MagentaDensity", NULL }
+};
+
+DECLARE_EXTENDED_INK_CHANNEL(r800_magenta);
+
+static const physical_subchannel_t f360_standard_magenta_subchannels[] =
+{
+ { 1, -1, 1, "MagentaDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(f360_standard_magenta);
+
+static const physical_subchannel_t x80_magenta_subchannels[] =
+{
+ { 1, -1, 48, "MagentaDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(x80_magenta);
+
+static const physical_subchannel_t c80_magenta_subchannels[] =
+{
+ { 1, -1, 120, "MagentaDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(c80_magenta);
+
+static const physical_subchannel_t c64_magenta_subchannels[] =
+{
+ { 1, -1, 90, "MagentaDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(c64_magenta);
+
+static const physical_subchannel_t standard_yellow_subchannels[] =
+{
+ { 4, -1, 0, "YellowDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(standard_yellow);
+
+static const physical_subchannel_t x80_yellow_subchannels[] =
+{
+ { 4, -1, 0, "YellowDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(x80_yellow);
+
+static const physical_subchannel_t c80_yellow_subchannels[] =
+{
+ { 4, -1, 240, "YellowDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(c80_yellow);
+
+static const physical_subchannel_t c64_yellow_subchannels[] =
+{
+ { 4, -1, 180, "YellowDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(c64_yellow);
+
+static const physical_subchannel_t f360_standard_yellow_subchannels[] =
+{
+ { 4, -1, 1, "YellowDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(f360_standard_yellow);
+
+static const physical_subchannel_t r800_yellow_subchannels[] =
+{
+ { 4, -1, 1, "YellowDensity", NULL }
+};
+
+DECLARE_EXTENDED_INK_CHANNEL(r800_yellow);
+
+static const physical_subchannel_t r800_red_subchannels[] =
+{
+ { 7, -1, 0, "RedDensity", NULL }
+};
+
+DECLARE_EXTENDED_INK_CHANNEL(r800_red);
+
+static const physical_subchannel_t r800_blue_subchannels[] =
+{
+ { 8, -1, 1, "BlueDensity", NULL }
+};
+
+DECLARE_EXTENDED_INK_CHANNEL(r800_blue);
+
+static const physical_subchannel_t standard_gloss_subchannels[] =
+{
+ { 9, -1, 0, "GlossDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(standard_gloss);
+
+static const physical_subchannel_t f360_gloss_subchannels[] =
+{
+ { 9, -1, 1, "GlossDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(f360_gloss);
+
+static const physical_subchannel_t standard_photo_black_subchannels[] =
+{
+ { 0, 4, 0, "BlackDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(standard_photo_black);
+
+static const physical_subchannel_t f360_r800_photo_black_subchannels[] =
+{
+ { 0, 4, 1, "BlackDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(f360_r800_photo_black);
+
+static const physical_subchannel_t r800_matte_black_subchannels[] =
+{
+ { 0, 0, 0, "BlackDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(r800_matte_black);
+
+static const physical_subchannel_t photo_black_subchannels[] =
+{
+ { 0, 0, 0, "BlackDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(photo_black);
+
+static const physical_subchannel_t f360_photo_black_subchannels[] =
+{
+ { 0, 0, 0, "BlackDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(f360_photo_black);
+
+static const physical_subchannel_t extended_black_subchannels[] =
+{
+ { 0, 1, 0, "BlackDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(extended_black);
+
+static const physical_subchannel_t photo_cyan_subchannels[] =
+{
+ { 2, 0, 0, "CyanDensity", NULL },
+ { 2, 1, 0, "CyanDensity", "LightCyanTransition" }
+};
+
+DECLARE_INK_CHANNEL(photo_cyan);
+
+static const physical_subchannel_t extended_cyan_subchannels[] =
+{
+ { 2, 1, 0, "CyanDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(extended_cyan);
+
+static const physical_subchannel_t photo_magenta_subchannels[] =
+{
+ { 1, 0, 0, "MagentaDensity", NULL },
+ { 1, 1, 0, "MagentaDensity", "LightMagentaTransition" }
+};
+
+DECLARE_INK_CHANNEL(photo_magenta);
+
+static const physical_subchannel_t extended_magenta_subchannels[] =
+{
+ { 1, 1, 0, "MagentaDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(extended_magenta);
+
+static const physical_subchannel_t photo_yellow_subchannels[] =
+{
+ { 4, 0, 0, "YellowDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(photo_yellow);
+
+static const physical_subchannel_t f360_photo_yellow_subchannels[] =
+{
+ { 4, 0, 1, "YellowDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(f360_photo_yellow);
+
+static const physical_subchannel_t j_extended_yellow_subchannels[] =
+{
+ { 4, 2, 0, "YellowDensity", NULL }
+};
+
+DECLARE_INK_CHANNEL(j_extended_yellow);
+
+/* For Japanese 7-color printers, with dark yellow */
+static const physical_subchannel_t photo2_yellow_subchannels[] =
+{
+ { 4, 2, 0, "YellowDensity", NULL },
+ { 4, 0, 0, "YellowDensity", "DarkYellowTransition" }
+};
+
+DECLARE_INK_CHANNEL(photo2_yellow);
+
+static const physical_subchannel_t f360_photo2_yellow_subchannels[] =
+{
+ { 4, 2, 0, "YellowDensity", NULL },
+ { 4, 0, 1, "YellowDensity", "DarkYellowTransition" }
+};
+
+DECLARE_INK_CHANNEL(f360_photo2_yellow);
+
+static const physical_subchannel_t photo2_black_subchannels[] =
+{
+ { 0, 0, 0, "BlackDensity", NULL },
+ { 0, 1, 0, "BlackDensity", "GrayTransition" }
+};
+
+DECLARE_INK_CHANNEL(photo2_black);
+
+static const physical_subchannel_t f360_photo2_black_subchannels[] =
+{
+ { 0, 0, 1, "BlackDensity", NULL },
+ { 0, 1, 0, "BlackDensity", "GrayTransition" }
+};
+
+DECLARE_INK_CHANNEL(f360_photo2_black);
+
+static const physical_subchannel_t quadtone_subchannels[] =
+{
+ { 0, -1, 0, "BlackDensity", NULL },
+ { 2, -1, 0, "BlackDensity", "Gray3Transition" },
+ { 1, -1, 0, "BlackDensity", "Gray2Transition" },
+ { 4, -1, 0, "BlackDensity", "Gray1Transition" },
+};
+
+DECLARE_INK_CHANNEL(quadtone);
+
+static const physical_subchannel_t c80_quadtone_subchannels[] =
+{
+ { 0, -1, 0, "BlackDensity", NULL },
+ { 2, -1, 0, "BlackDensity", "Gray3Transition" },
+ { 1, -1, 120, "BlackDensity", "Gray2Transition" },
+ { 4, -1, 240, "BlackDensity", "Gray1Transition" },
+};
+
+DECLARE_INK_CHANNEL(c80_quadtone);
+
+static const physical_subchannel_t c64_quadtone_subchannels[] =
+{
+ { 0, -1, 0, "BlackDensity", NULL },
+ { 2, -1, 0, "BlackDensity", "Gray3Transition" },
+ { 1, -1, 90, "BlackDensity", "Gray2Transition" },
+ { 4, -1, 180, "BlackDensity", "Gray1Transition" },
+};
+
+DECLARE_INK_CHANNEL(c64_quadtone);
+
+static const physical_subchannel_t f360_quadtone_subchannels[] =
+{
+ { 0, -1, 0, "BlackDensity", NULL },
+ { 2, -1, 1, "BlackDensity", "Gray3Transition" },
+ { 1, -1, 1, "BlackDensity", "Gray2Transition" },
+ { 4, -1, 0, "BlackDensity", "Gray1Transition" },
+};
+
+DECLARE_INK_CHANNEL(f360_quadtone);
+
+static const physical_subchannel_t cx3650_quadtone_subchannels[] =
+{
+ { 0, -1, 0, "BlackDensity", NULL },
+ { 2, -1, 2, "BlackDensity", "Gray3Transition" },
+ { 1, -1, 1, "BlackDensity", "Gray2Transition" },
+ { 4, -1, 0, "BlackDensity", "Gray1Transition" },
+};
+
+DECLARE_INK_CHANNEL(cx3650_quadtone);
+
+static const physical_subchannel_t f360_photo_cyan_subchannels[] =
+{
+ { 2, 0, 1, "CyanDensity", NULL },
+ { 2, 1, 0, "CyanDensity", "LightCyanTransition" }
+};
+
+DECLARE_INK_CHANNEL(f360_photo_cyan);
+
+static const physical_subchannel_t f360_photo_magenta_subchannels[] =
+{
+ { 1, 0, 1, "MagentaDensity", NULL },
+ { 1, 1, 0, "MagentaDensity", "LightMagentaTransition" }
+};
+
+DECLARE_INK_CHANNEL(f360_photo_magenta);
+
+
+#define DECLARE_CHANNEL_SET(name) \
+static const channel_set_t name##_channel_set = \
+{ \
+ #name " channel set", \
+ name##_channels, \
+ NULL, \
+ sizeof(name##_channels) / sizeof(ink_channel_t *), \
+ 0 \
+}
+
+#define DECLARE_AUX_CHANNEL_SET(name, aux) \
+static const channel_set_t name##_##aux##_channel_set = \
+{ \
+ #name " channel set", \
+ name##_channels, \
+ aux##_channels, \
+ sizeof(name##_channels) / sizeof(ink_channel_t *), \
+ sizeof(aux##_channels) / sizeof(ink_channel_t *), \
+}
+
+
+/*
+ ****************************************************************
+ * *
+ * Grayscale *
+ * *
+ ****************************************************************
+ */
+
+static const ink_channel_t *const standard_gloss_channels[] =
+{
+ &standard_gloss_channel
+};
+
+static const ink_channel_t *const f360_gloss_channels[] =
+{
+ &f360_gloss_channel
+};
+
+static const ink_channel_t *const standard_black_channels[] =
+{
+ &standard_black_channel
+};
+
+DECLARE_CHANNEL_SET(standard_black);
+
+const escp2_inkname_t stpi_escp2_default_black_inkset =
+{
+ "Gray", N_("Grayscale"), INKSET_CMYK,
+ &standard_black_channel_set
+};
+
+static const ink_channel_t *const standard_photo_black_channels[] =
+{
+ &standard_photo_black_channel
+};
+
+DECLARE_CHANNEL_SET(standard_photo_black);
+
+const escp2_inkname_t stpi_escp2_default_photo_black_inkset =
+{
+ "Gray", N_("Grayscale"), INKSET_CMYK,
+ &standard_photo_black_channel_set
+};
+
+static const ink_channel_t *const standard_photo_gloss_black_channels[] =
+{
+ &f360_r800_photo_black_channel, &standard_gloss_channel
+};
+
+DECLARE_CHANNEL_SET(standard_photo_gloss_black);
+DECLARE_AUX_CHANNEL_SET(standard_photo_black, standard_gloss);
+
+const escp2_inkname_t stpi_escp2_default_photo_gloss_black_inkset =
+{
+ "GrayG", N_("Grayscale"), INKSET_CMYK,
+ &standard_photo_black_standard_gloss_channel_set
+};
+
+
+/*
+ ****************************************************************
+ * *
+ * Two shade gray *
+ * *
+ ****************************************************************
+ */
+
+static const ink_channel_t *const photo2_black_channels[] =
+{
+ &photo2_black_channel
+};
+
+DECLARE_CHANNEL_SET(photo2_black);
+
+static const escp2_inkname_t two_color_grayscale_inkset =
+{
+ "Gray2", N_("Two Level Grayscale"), INKSET_CcMmYKk,
+ &photo2_black_channel_set
+};
+
+static const ink_channel_t *const f360_photo2_black_channels[] =
+{
+ &f360_photo2_black_channel
+};
+
+DECLARE_CHANNEL_SET(f360_photo2_black);
+
+static const escp2_inkname_t f360_two_color_grayscale_inkset =
+{
+ "Gray2", N_("Two Level Grayscale"), INKSET_CcMmYKk,
+ &f360_photo2_black_channel_set
+};
+
+
+/*
+ ****************************************************************
+ * *
+ * Quadtone gray *
+ * *
+ ****************************************************************
+ */
+
+static const ink_channel_t *const quadtone_channels[] =
+{
+ &quadtone_channel
+};
+
+DECLARE_CHANNEL_SET(quadtone);
+
+static const escp2_inkname_t generic_quadtone_inkset =
+{
+ "Quadtone", N_("Quadtone"), INKSET_QUADTONE,
+ &quadtone_channel_set
+};
+
+static const ink_channel_t *const c80_quadtone_channels[] =
+{
+ &c80_quadtone_channel
+};
+
+DECLARE_CHANNEL_SET(c80_quadtone);
+
+static const escp2_inkname_t c80_generic_quadtone_inkset =
+{
+ "Quadtone", N_("Quadtone"), INKSET_QUADTONE,
+ &c80_quadtone_channel_set
+};
+
+static const ink_channel_t *const c64_quadtone_channels[] =
+{
+ &c64_quadtone_channel
+};
+
+DECLARE_CHANNEL_SET(c64_quadtone);
+
+static const escp2_inkname_t c64_generic_quadtone_inkset =
+{
+ "Quadtone", N_("Quadtone"), INKSET_QUADTONE,
+ &c64_quadtone_channel_set
+};
+
+static const ink_channel_t *const f360_quadtone_channels[] =
+{
+ &f360_quadtone_channel
+};
+
+DECLARE_CHANNEL_SET(f360_quadtone);
+
+static const escp2_inkname_t f360_generic_quadtone_inkset =
+{
+ "Quadtone", N_("Quadtone"), INKSET_QUADTONE,
+ &f360_quadtone_channel_set
+};
+
+static const ink_channel_t *const cx3650_quadtone_channels[] =
+{
+ &cx3650_quadtone_channel
+};
+
+DECLARE_CHANNEL_SET(cx3650_quadtone);
+
+static const escp2_inkname_t cx3650_generic_quadtone_inkset =
+{
+ "Quadtone", N_("Quadtone"), INKSET_QUADTONE,
+ &cx3650_quadtone_channel_set
+};
+
+
+
+/*
+ ****************************************************************
+ * *
+ * Three color CMY *
+ * *
+ ****************************************************************
+ */
+
+static const ink_channel_t *const standard_cmy_channels[] =
+{
+ NULL, &standard_cyan_channel,
+ &standard_magenta_channel, &standard_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(standard_cmy);
+
+static const escp2_inkname_t three_color_composite_inkset =
+{
+ "RGB", N_("Three Color Composite"), INKSET_CMYK,
+ &standard_cmy_channel_set
+};
+
+static const ink_channel_t *const x80_cmy_channels[] =
+{
+ NULL, &x80_cyan_channel,
+ &x80_magenta_channel, &x80_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(x80_cmy);
+
+static const escp2_inkname_t x80_three_color_composite_inkset =
+{
+ "RGB", N_("Three Color Composite"), INKSET_CMYK,
+ &x80_cmy_channel_set
+};
+
+static const ink_channel_t *const c80_cmy_channels[] =
+{
+ NULL, &c80_cyan_channel,
+ &c80_magenta_channel, &c80_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(c80_cmy);
+
+static const escp2_inkname_t c80_three_color_composite_inkset =
+{
+ "RGB", N_("Three Color Composite"), INKSET_CMYK,
+ &c80_cmy_channel_set
+};
+
+static const ink_channel_t *const c64_cmy_channels[] =
+{
+ NULL, &c64_cyan_channel,
+ &c64_magenta_channel, &c64_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(c64_cmy);
+
+static const escp2_inkname_t c64_three_color_composite_inkset =
+{
+ "RGB", N_("Three Color Composite"), INKSET_CMYK,
+ &c64_cmy_channel_set
+};
+
+static const ink_channel_t *const f360_cmy_channels[] =
+{
+ NULL, &f360_standard_cyan_channel,
+ &f360_standard_magenta_channel, &standard_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(f360_cmy);
+
+static const escp2_inkname_t f360_three_color_composite_inkset =
+{
+ "RGB", N_("Three Color Composite"), INKSET_CMYK,
+ &f360_cmy_channel_set
+};
+
+static const ink_channel_t *const cx3650_cmy_channels[] =
+{
+ NULL, &cx3650_standard_cyan_channel,
+ &f360_standard_magenta_channel, &standard_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(cx3650_cmy);
+
+static const escp2_inkname_t cx3650_three_color_composite_inkset =
+{
+ "RGB", N_("Three Color Composite"), INKSET_CMYK,
+ &cx3650_cmy_channel_set
+};
+
+static const ink_channel_t *const standard_gloss_cmy_channels[] =
+{
+ NULL, &f360_standard_cyan_channel,
+ &standard_magenta_channel, &f360_standard_yellow_channel,
+ &standard_gloss_channel
+};
+
+DECLARE_CHANNEL_SET(standard_gloss_cmy);
+
+static const ink_channel_t *const r800_cmy_channels[] =
+{
+ NULL, &f360_standard_cyan_channel,
+ &standard_magenta_channel, &f360_standard_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(r800_cmy);
+DECLARE_AUX_CHANNEL_SET(r800_cmy, standard_gloss);
+
+static const escp2_inkname_t three_color_r800_gloss_inkset =
+{
+ "RGBG", N_("Three Color Composite"), INKSET_CMYK,
+ &r800_cmy_standard_gloss_channel_set
+};
+
+static const escp2_inkname_t three_color_r800_composite_inkset =
+{
+ "RGBG", N_("Three Color Composite"), INKSET_CMYK,
+ &r800_cmy_channel_set
+};
+
+
+/*
+ ****************************************************************
+ * *
+ * Four color CMYK *
+ * *
+ ****************************************************************
+ */
+
+static const ink_channel_t *const standard_cmyk_channels[] =
+{
+ &standard_black_channel, &standard_cyan_channel,
+ &standard_magenta_channel, &standard_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(standard_cmyk);
+
+static const escp2_inkname_t four_color_standard_inkset =
+{
+ "CMYK", N_("Four Color Standard"), INKSET_CMYK,
+ &standard_cmyk_channel_set
+};
+
+static const ink_channel_t *const photo_cmyk_channels[] =
+{
+ &standard_photo_black_channel, &standard_cyan_channel,
+ &standard_magenta_channel, &standard_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(photo_cmyk);
+
+static const escp2_inkname_t four_color_photo_inkset =
+{
+ "CMYK", N_("Four Color Standard"), INKSET_CMYK,
+ &photo_cmyk_channel_set
+};
+
+static const ink_channel_t *const r800_cmyk_channels[] =
+{
+ &standard_black_channel, &f360_standard_cyan_channel,
+ &standard_magenta_channel, &f360_standard_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(r800_cmyk);
+
+static const escp2_inkname_t four_color_r800_matte_inkset =
+{
+ "CMYKG", N_("Four Color Standard"), INKSET_CMYK,
+ &r800_cmyk_channel_set
+};
+
+static const ink_channel_t *const photo_gloss_cmyk_channels[] =
+{
+ &f360_r800_photo_black_channel, &f360_standard_cyan_channel,
+ &standard_magenta_channel, &f360_standard_yellow_channel,
+ &standard_gloss_channel
+};
+
+DECLARE_CHANNEL_SET(photo_gloss_cmyk);
+
+static const ink_channel_t *const r800_photo_cmyk_channels[] =
+{
+ &f360_r800_photo_black_channel, &f360_standard_cyan_channel,
+ &standard_magenta_channel, &f360_standard_yellow_channel,
+};
+
+DECLARE_CHANNEL_SET(r800_photo_cmyk);
+DECLARE_AUX_CHANNEL_SET(r800_photo_cmyk, standard_gloss);
+
+static const escp2_inkname_t four_color_r800_photo_gloss_inkset =
+{
+ "CMYKG", N_("Four Color Standard"), INKSET_CMYK,
+ &r800_photo_cmyk_standard_gloss_channel_set
+};
+
+static const ink_channel_t *const x80_cmyk_channels[] =
+{
+ &x80_black_channel, &x80_cyan_channel,
+ &x80_magenta_channel, &x80_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(x80_cmyk);
+
+static const escp2_inkname_t x80_four_color_standard_inkset =
+{
+ "CMYK", N_("Four Color Standard"), INKSET_CMYK,
+ &x80_cmyk_channel_set
+};
+
+static const ink_channel_t *const c80_cmyk_channels[] =
+{
+ &c80_black_channel, &c80_cyan_channel,
+ &c80_magenta_channel, &c80_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(c80_cmyk);
+
+static const escp2_inkname_t c80_four_color_standard_inkset =
+{
+ "CMYK", N_("Four Color Standard"), INKSET_CMYK,
+ &c80_cmyk_channel_set
+};
+
+static const ink_channel_t *const c64_cmyk_channels[] =
+{
+ &c64_black_channel, &c64_cyan_channel,
+ &c64_magenta_channel, &c64_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(c64_cmyk);
+
+static const escp2_inkname_t c64_four_color_standard_inkset =
+{
+ "CMYK", N_("Four Color Standard"), INKSET_CMYK,
+ &c64_cmyk_channel_set
+};
+
+static const ink_channel_t *const f360_cmyk_channels[] =
+{
+ &standard_black_channel, &f360_standard_cyan_channel,
+ &f360_standard_magenta_channel, &standard_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(f360_cmyk);
+
+static const escp2_inkname_t f360_four_color_standard_inkset =
+{
+ "CMYK", N_("Four Color Standard"), INKSET_CMYK,
+ &f360_cmyk_channel_set
+};
+
+static const ink_channel_t *const cx3650_cmyk_channels[] =
+{
+ &standard_black_channel, &cx3650_standard_cyan_channel,
+ &f360_standard_magenta_channel, &standard_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(cx3650_cmyk);
+
+static const escp2_inkname_t cx3650_four_color_standard_inkset =
+{
+ "CMYK", N_("Four Color Standard"), INKSET_CMYK,
+ &cx3650_cmyk_channel_set
+};
+
+
+/*
+ ****************************************************************
+ * *
+ * Five color CcMmY *
+ * *
+ ****************************************************************
+ */
+
+static const ink_channel_t *const photo_composite_channels[] =
+{
+ NULL, &photo_cyan_channel,
+ &photo_magenta_channel, &photo_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(photo_composite);
+
+static const escp2_inkname_t five_color_photo_composite_inkset =
+{
+ "PhotoCMY", N_("Five Color Photo Composite"), INKSET_CcMmYK,
+ &photo_composite_channel_set
+};
+
+static const ink_channel_t *const f360_photo_composite_channels[] =
+{
+ NULL, &f360_photo_cyan_channel,
+ &f360_photo_magenta_channel, &f360_photo_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(f360_photo_composite);
+
+static const escp2_inkname_t f360_five_color_photo_composite_inkset =
+{
+ "PhotoCMY", N_("Five Color Photo Composite"), INKSET_CcMmYK,
+ &f360_photo_composite_channel_set
+};
+
+
+/*
+ ****************************************************************
+ * *
+ * Six color CcMmYK *
+ * *
+ ****************************************************************
+ */
+
+static const ink_channel_t *const photo_channels[] =
+{
+ &photo_black_channel, &photo_cyan_channel,
+ &photo_magenta_channel, &photo_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(photo);
+
+static const escp2_inkname_t six_color_photo_inkset =
+{
+ "PhotoCMYK", N_("Six Color Photo"), INKSET_CcMmYK,
+ &photo_channel_set
+};
+
+static const ink_channel_t *const f360_photo_channels[] =
+{
+ &f360_photo_black_channel, &f360_photo_cyan_channel,
+ &f360_photo_magenta_channel, &f360_photo_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(f360_photo);
+
+static const escp2_inkname_t f360_six_color_photo_inkset =
+{
+ "PhotoCMYK", N_("Six Color Photo"), INKSET_CcMmYK,
+ &f360_photo_channel_set
+};
+
+
+/*
+ ****************************************************************
+ * *
+ * Six color CcMmYy (Japan) *
+ * *
+ ****************************************************************
+ */
+
+static const ink_channel_t *const photoj_composite_channels[] =
+{
+ NULL, &photo_cyan_channel,
+ &photo_magenta_channel, &photo2_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(photoj_composite);
+
+static const escp2_inkname_t j_six_color_enhanced_composite_inkset =
+{
+ "PhotoEnhanceJ", N_("Six Color Enhanced Composite"), INKSET_CcMmYyK,
+ &photoj_composite_channel_set
+};
+
+static const ink_channel_t *const f360_photoj_composite_channels[] =
+{
+ NULL, &f360_photo_cyan_channel,
+ &f360_photo_magenta_channel, &f360_photo2_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(f360_photoj_composite);
+
+static const escp2_inkname_t f360_j_six_color_enhanced_composite_inkset =
+{
+ "PhotoEnhanceJ", N_("Six Color Enhanced Composite"), INKSET_CcMmYyK,
+ &f360_photoj_composite_channel_set
+};
+
+
+/*
+ ****************************************************************
+ * *
+ * Seven color CcMmYKk *
+ * *
+ ****************************************************************
+ */
+
+static const ink_channel_t *const photo2_channels[] =
+{
+ &photo2_black_channel, &photo_cyan_channel,
+ &photo_magenta_channel, &photo_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(photo2);
+
+static const escp2_inkname_t seven_color_enhanced_inkset =
+{
+ "PhotoCMYK7", N_("Seven Color Photo"), INKSET_CcMmYKk,
+ &photo2_channel_set
+};
+
+static const ink_channel_t *const f360_photo2_channels[] =
+{
+ &f360_photo2_black_channel, &f360_photo_cyan_channel,
+ &f360_photo_magenta_channel, &f360_photo_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(f360_photo2);
+
+static const escp2_inkname_t f360_seven_color_enhanced_inkset =
+{
+ "PhotoCMYK7", N_("Seven Color Photo"), INKSET_CcMmYKk,
+ &f360_photo2_channel_set
+};
+
+/*
+ ****************************************************************
+ * *
+ * Seven color CcMmYyK (Japan) *
+ * *
+ ****************************************************************
+ */
+
+static const ink_channel_t *const photoj_channels[] =
+{
+ &photo_black_channel, &photo_cyan_channel,
+ &photo_magenta_channel, &photo2_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(photoj);
+
+static const escp2_inkname_t j_seven_color_enhanced_inkset =
+{
+ "Photo7J", N_("Seven Color Enhanced"), INKSET_CcMmYyK,
+ &photoj_channel_set
+};
+
+static const ink_channel_t *const f360_photoj_channels[] =
+{
+ &f360_photo_black_channel, &f360_photo_cyan_channel,
+ &f360_photo_magenta_channel, &f360_photo2_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(f360_photoj);
+
+static const escp2_inkname_t f360_j_seven_color_enhanced_inkset =
+{
+ "Photo7J", N_("Seven Color Photo"), INKSET_CcMmYKk,
+ &f360_photoj_channel_set
+};
+
+
+/*
+ ****************************************************************
+ * *
+ * Five color CMYRB *
+ * *
+ ****************************************************************
+ */
+
+static const ink_channel_t *const five_color_r800_channels[] =
+{
+ NULL, &r800_cyan_channel,
+ &r800_magenta_channel, &r800_yellow_channel,
+ &r800_red_channel, &r800_blue_channel
+};
+
+DECLARE_CHANNEL_SET(five_color_r800);
+
+static const escp2_inkname_t five_color_r800_inkset =
+{
+ "CMYRB", N_("Five Color Photo Composite"), INKSET_CMYKRB,
+ &five_color_r800_channel_set
+};
+
+static const ink_channel_t *const five_color_r800_photo_channels[] =
+{
+ NULL, &r800_cyan_channel,
+ &r800_magenta_channel, &r800_yellow_channel,
+ &r800_red_channel, &r800_blue_channel
+};
+
+DECLARE_CHANNEL_SET(five_color_r800_photo);
+
+static const escp2_inkname_t five_color_r800_photo_inkset =
+{
+ "CMYRB", N_("Five Color Photo Composite"), INKSET_CMYKRB,
+ &five_color_r800_photo_channel_set
+};
+
+static const ink_channel_t *const five_color_r800_photo_gloss_channels[] =
+{
+ NULL, &f360_standard_cyan_channel,
+ &r800_magenta_channel, &r800_yellow_channel,
+ &r800_red_channel, &r800_blue_channel,
+ &standard_gloss_channel
+};
+
+DECLARE_CHANNEL_SET(five_color_r800_photo_gloss);
+DECLARE_AUX_CHANNEL_SET(five_color_r800_photo, standard_gloss);
+
+static const escp2_inkname_t five_color_r800_photo_gloss_inkset =
+{
+ "CMYRBG", N_("Five Color Photo Composite"), INKSET_CMYKRB,
+ &five_color_r800_photo_standard_gloss_channel_set
+};
+
+
+/*
+ ****************************************************************
+ * *
+ * Six color CMYKRB *
+ * *
+ ****************************************************************
+ */
+
+static const ink_channel_t *const six_color_r800_channels[] =
+{
+ &standard_black_channel, &r800_cyan_channel,
+ &r800_magenta_channel, &r800_yellow_channel,
+ &r800_red_channel, &r800_blue_channel
+};
+
+DECLARE_CHANNEL_SET(six_color_r800);
+
+static const escp2_inkname_t six_color_r800_inkset =
+{
+ "CMYKRB", N_("Six Color Photo"), INKSET_CMYKRB,
+ &six_color_r800_channel_set
+};
+
+static const ink_channel_t *const six_color_r800_photo_channels[] =
+{
+ &f360_r800_photo_black_channel, &r800_cyan_channel,
+ &r800_magenta_channel, &r800_yellow_channel,
+ &r800_red_channel, &r800_blue_channel
+};
+
+DECLARE_CHANNEL_SET(six_color_r800_photo);
+
+static const escp2_inkname_t six_color_r800_photo_inkset =
+{
+ "CMYKRB", N_("Six Color Photo"), INKSET_CMYKRB,
+ &six_color_r800_photo_channel_set
+};
+
+static const ink_channel_t *const six_color_r800_photo_gloss_channels[] =
+{
+ &f360_r800_photo_black_channel, &f360_standard_cyan_channel,
+ &r800_magenta_channel, &r800_yellow_channel,
+ &r800_red_channel, &r800_blue_channel,
+ &standard_gloss_channel
+};
+
+DECLARE_CHANNEL_SET(six_color_r800_photo_gloss);
+DECLARE_AUX_CHANNEL_SET(six_color_r800_photo, standard_gloss);
+
+static const escp2_inkname_t six_color_r800_photo_gloss_inkset =
+{
+ "CMYKRBG", N_("Six Color Photo"), INKSET_CMYKRB,
+ &six_color_r800_photo_standard_gloss_channel_set
+};
+
+
+/*
+ ****************************************************************
+ * *
+ * Extended (raw) *
+ * *
+ ****************************************************************
+ */
+
+static const ink_channel_t *const one_color_extended_channels[] =
+{
+ &standard_black_channel
+};
+DECLARE_CHANNEL_SET(one_color_extended);
+
+static const escp2_inkname_t one_color_extended_inkset =
+{
+ "PhysicalBlack", N_("One Color Raw"), INKSET_EXTENDED,
+ &one_color_extended_channel_set
+};
+
+static const escp2_inkname_t one_color_photo_extended_inkset =
+{
+ "PhysicalBlack", N_("One Color Raw"), INKSET_EXTENDED,
+ &standard_photo_black_channel_set
+};
+
+static const escp2_inkname_t one_color_r800_photo_gloss_extended_inkset =
+{
+ "PhysicalBlackGloss", N_("One Color Raw Enhanced Gloss"), INKSET_EXTENDED,
+ &standard_photo_gloss_black_channel_set
+};
+
+
+static const ink_channel_t *const two_color_extended_channels[] =
+{
+ &photo_black_channel, &extended_black_channel
+};
+DECLARE_CHANNEL_SET(two_color_extended);
+
+static const escp2_inkname_t two_color_extended_inkset =
+{
+ "PhysicalBlack2", N_("Two Color Raw"), INKSET_EXTENDED,
+ &two_color_extended_channel_set
+};
+
+static const ink_channel_t *const f360_two_color_extended_channels[] =
+{
+ &f360_photo_black_channel, &extended_black_channel
+};
+DECLARE_CHANNEL_SET(f360_two_color_extended);
+
+static const escp2_inkname_t f360_two_color_extended_inkset =
+{
+ "PhysicalBlack2", N_("Two Color Raw"), INKSET_EXTENDED,
+ &f360_two_color_extended_channel_set
+};
+
+
+static const ink_channel_t *const standard_three_color_extended_channels[] =
+{
+ &standard_cyan_channel, &standard_magenta_channel, &standard_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(standard_three_color_extended);
+
+static const escp2_inkname_t three_color_extended_inkset =
+{
+ "PhysicalCMY", N_("Three Color Raw"), INKSET_EXTENDED,
+ &standard_three_color_extended_channel_set
+};
+
+static const ink_channel_t *const r800_cmy_extended_channels[] =
+{
+ &f360_standard_cyan_channel, &standard_magenta_channel,
+ &f360_standard_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(r800_cmy_extended);
+
+static const escp2_inkname_t three_color_r800_extended_inkset =
+{
+ "PhysicalCMY", N_("Three Color Raw"), INKSET_EXTENDED,
+ &r800_cmy_extended_channel_set
+};
+
+static const ink_channel_t *const r800_cmy_gloss_extended_channels[] =
+{
+ &f360_standard_cyan_channel, &standard_magenta_channel,
+ &f360_standard_yellow_channel, &standard_gloss_channel
+};
+
+DECLARE_CHANNEL_SET(r800_cmy_gloss_extended);
+
+static const escp2_inkname_t three_color_r800_gloss_extended_inkset =
+{
+ "PhysicalCMY", N_("Three Color Raw Gloss"), INKSET_EXTENDED,
+ &r800_cmy_gloss_extended_channel_set
+};
+
+static const ink_channel_t *const x80_three_color_extended_channels[] =
+{
+ &x80_cyan_channel, &x80_magenta_channel, &x80_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(x80_three_color_extended);
+
+static const escp2_inkname_t x80_three_color_extended_inkset =
+{
+ "PhysicalCMY", N_("Three Color Raw"), INKSET_EXTENDED,
+ &x80_three_color_extended_channel_set
+};
+
+static const ink_channel_t *const c80_three_color_extended_channels[] =
+{
+ &c80_cyan_channel, &c80_magenta_channel, &c80_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(c80_three_color_extended);
+
+static const escp2_inkname_t c80_three_color_extended_inkset =
+{
+ "PhysicalCMY", N_("Three Color Raw"), INKSET_EXTENDED,
+ &c80_three_color_extended_channel_set
+};
+
+static const ink_channel_t *const c64_three_color_extended_channels[] =
+{
+ &c64_cyan_channel, &c64_magenta_channel, &c64_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(c64_three_color_extended);
+
+static const escp2_inkname_t c64_three_color_extended_inkset =
+{
+ "PhysicalCMY", N_("Three Color Raw"), INKSET_EXTENDED,
+ &c64_three_color_extended_channel_set
+};
+
+static const ink_channel_t *const f360_three_color_extended_channels[] =
+{
+ &f360_standard_cyan_channel, &f360_standard_magenta_channel,
+ &standard_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(f360_three_color_extended);
+
+static const escp2_inkname_t f360_three_color_extended_inkset =
+{
+ "PhysicalCMY", N_("Three Color Raw"), INKSET_EXTENDED,
+ &f360_three_color_extended_channel_set
+};
+
+static const ink_channel_t *const cx3650_three_color_extended_channels[] =
+{
+ &cx3650_standard_cyan_channel, &f360_standard_magenta_channel,
+ &standard_yellow_channel
+};
+
+DECLARE_CHANNEL_SET(cx3650_three_color_extended);
+
+static const escp2_inkname_t cx3650_three_color_extended_inkset =
+{
+ "PhysicalCMY", N_("Three Color Raw"), INKSET_EXTENDED,
+ &cx3650_three_color_extended_channel_set
+};
+
+
+static const escp2_inkname_t four_color_extended_inkset =
+{
+ "PhysicalCMYK", N_("Four Color Raw"), INKSET_EXTENDED,
+ &standard_cmyk_channel_set
+};
+
+static const escp2_inkname_t four_color_photo_extended_inkset =
+{
+ "PhysicalCMYK", N_("Four Color Raw"), INKSET_EXTENDED,
+ &photo_cmyk_channel_set
+};
+
+static const escp2_inkname_t x80_four_color_extended_inkset =
+{
+ "PhysicalCMYK", N_("Four Color Raw"), INKSET_EXTENDED,
+ &x80_cmyk_channel_set
+};
+
+static const escp2_inkname_t c80_four_color_extended_inkset =
+{
+ "PhysicalCMYK", N_("Four Color Raw"), INKSET_EXTENDED,
+ &c80_cmyk_channel_set
+};
+
+static const escp2_inkname_t c64_four_color_extended_inkset =
+{
+ "PhysicalCMYK", N_("Four Color Raw"), INKSET_EXTENDED,
+ &c64_cmyk_channel_set
+};
+
+static const escp2_inkname_t f360_four_color_extended_inkset =
+{
+ "PhysicalCMYK", N_("Four Color Raw"), INKSET_EXTENDED,
+ &f360_cmyk_channel_set
+};
+
+static const escp2_inkname_t cx3650_four_color_extended_inkset =
+{
+ "PhysicalCMYK", N_("Four Color Raw"), INKSET_EXTENDED,
+ &cx3650_cmyk_channel_set
+};
+
+static const escp2_inkname_t four_color_r800_extended_inkset =
+{
+ "PhysicalCMYKGloss", N_("Four Color Raw"), INKSET_EXTENDED,
+ &r800_cmyk_channel_set
+};
+
+static const escp2_inkname_t four_color_r800_photo_gloss_extended_inkset =
+{
+ "PhysicalCMYKGloss", N_("Four Color Raw Gloss"), INKSET_EXTENDED,
+ &photo_gloss_cmyk_channel_set
+};
+
+
+static const ink_channel_t *const five_color_extended_channels[] =
+{
+ &standard_cyan_channel, &extended_cyan_channel,
+ &standard_magenta_channel, &extended_magenta_channel,
+ &photo_yellow_channel
+};
+DECLARE_CHANNEL_SET(five_color_extended);
+
+static const escp2_inkname_t five_color_extended_inkset =
+{
+ "PhysicalCcMmY", N_("Five Color Raw"), INKSET_EXTENDED,
+ &five_color_extended_channel_set
+};
+
+static const ink_channel_t *const f360_five_color_extended_channels[] =
+{
+ &f360_standard_cyan_channel, &extended_cyan_channel,
+ &f360_standard_magenta_channel, &extended_magenta_channel,
+ &f360_photo_yellow_channel
+};
+DECLARE_CHANNEL_SET(f360_five_color_extended);
+
+static const escp2_inkname_t f360_five_color_extended_inkset =
+{
+ "PhysicalCcMmY", N_("Five Color Raw"), INKSET_EXTENDED,
+ &f360_five_color_extended_channel_set
+};
+
+
+static const ink_channel_t *const six_color_extended_channels[] =
+{
+ &photo_black_channel,
+ &standard_cyan_channel, &extended_cyan_channel,
+ &standard_magenta_channel, &extended_magenta_channel,
+ &photo_yellow_channel
+};
+DECLARE_CHANNEL_SET(six_color_extended);
+
+static const escp2_inkname_t six_color_extended_inkset =
+{
+ "PhysicalCcMmYK", N_("Six Color Raw"), INKSET_EXTENDED,
+ &six_color_extended_channel_set
+};
+
+static const escp2_inkname_t six_color_r800_extended_inkset =
+{
+ "PhysicalCMYKRB", N_("Six Color Raw"), INKSET_EXTENDED,
+ &six_color_r800_channel_set
+};
+
+static const ink_channel_t *const f360_six_color_extended_channels[] =
+{
+ &f360_photo_black_channel,
+ &f360_standard_cyan_channel, &extended_cyan_channel,
+ &f360_standard_magenta_channel, &extended_magenta_channel,
+ &f360_photo_yellow_channel
+};
+DECLARE_CHANNEL_SET(f360_six_color_extended);
+
+static const escp2_inkname_t f360_six_color_extended_inkset =
+{
+ "PhysicalCcMmYK", N_("Six Color Raw"), INKSET_EXTENDED,
+ &f360_six_color_extended_channel_set
+};
+
+static const escp2_inkname_t six_color_r800_photo_gloss_extended_inkset =
+{
+ "PhysicalCMYKRB", N_("Six Color Enhanced Gloss Raw"), INKSET_EXTENDED,
+ &six_color_r800_photo_gloss_channel_set
+};
+
+static const ink_channel_t *const j_seven_color_extended_channels[] =
+{
+ &photo_black_channel,
+ &standard_cyan_channel, &extended_cyan_channel,
+ &standard_magenta_channel, &extended_magenta_channel,
+ &photo_yellow_channel, &j_extended_yellow_channel
+};
+DECLARE_CHANNEL_SET(j_seven_color_extended);
+
+static const escp2_inkname_t j_seven_color_extended_inkset =
+{
+ "PhysicalCcMmYyK", N_("Seven Color Raw"), INKSET_EXTENDED,
+ &j_seven_color_extended_channel_set
+};
+
+static const ink_channel_t *const seven_color_extended_channels[] =
+{
+ &photo_black_channel, &extended_black_channel,
+ &standard_cyan_channel, &extended_cyan_channel,
+ &standard_magenta_channel, &extended_magenta_channel,
+ &photo_yellow_channel
+};
+DECLARE_CHANNEL_SET(seven_color_extended);
+
+static const escp2_inkname_t seven_color_extended_inkset =
+{
+ "PhysicalCcMmYKk", N_("Seven Color Raw"), INKSET_EXTENDED,
+ &seven_color_extended_channel_set
+};
+
+static const ink_channel_t *const f360_seven_color_extended_channels[] =
+{
+ &f360_photo_black_channel, &extended_black_channel,
+ &f360_standard_cyan_channel, &extended_cyan_channel,
+ &f360_standard_magenta_channel, &extended_magenta_channel,
+ &f360_photo_yellow_channel
+};
+DECLARE_CHANNEL_SET(f360_seven_color_extended);
+
+static const escp2_inkname_t f360_seven_color_extended_inkset =
+{
+ "PhysicalCcMmYKk", N_("Seven Color Raw"), INKSET_EXTENDED,
+ &f360_seven_color_extended_channel_set
+};
+
+
+static const ink_channel_t *const seven_color_r800_gloss_extended_channels[] =
+{
+ &standard_black_channel, &f360_r800_photo_black_channel,
+ &r800_cyan_channel, &r800_magenta_channel,
+ &r800_yellow_channel, &r800_red_channel,
+ &r800_blue_channel, &standard_gloss_channel
+};
+
+DECLARE_CHANNEL_SET(seven_color_r800_gloss_extended);
+
+static const escp2_inkname_t seven_color_r800_gloss_extended_inkset =
+{
+ "PhysicalCMYKPRB", N_("Seven Color Enhanced Gloss Raw"), INKSET_EXTENDED,
+ &seven_color_r800_gloss_extended_channel_set
+};
+
+
+
+static const shade_set_t standard_shades =
+{
+ { 1, { 1.0 }}, /* K */
+ { 1, { 1.0 }}, /* C */
+ { 1, { 1.0 }}, /* M */
+ { 1, { 1.0 }}, /* Y */
+ { 1, { 1.0 }}, /* Extended 5 */
+ { 1, { 1.0 }}, /* Extended 6 */
+ { 1, { 1.0 }}, /* Extended 7 */
+ { 1, { 1.0 }}, /* Extended 8 */
+};
+
+static const shade_set_t photo_gen1_shades = /* Stylus 750 and older */
+{
+ { 1, { 1.0 }},
+ { 2, { 1.0, 0.305 }},
+ { 2, { 1.0, 0.315 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+};
+
+static const shade_set_t photo_gen2_shades = /* Stylus 870 and newer */
+{
+ { 1, { 1.0 }},
+ { 2, { 1.0, 0.29 }},
+ { 2, { 1.0, 0.29 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+};
+
+static const shade_set_t photo_gen3_shades = /* Stylus R300 and newer */
+{
+ { 1, { 1.0 }},
+ { 2, { 1.0, 0.35 }},
+ { 2, { 1.0, 0.35 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+};
+
+static const shade_set_t esp960_shades = /* Epson 950/960/PM-950C/PM-970C */
+{
+ { 1, { 1.0 }},
+ { 2, { 1.0, 0.316 }},
+ { 2, { 1.0, 0.34 }},
+ { 2, { 1.0, 0.5 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+};
+
+static const shade_set_t stp2000_shades = /* Stylus Photo 2000 */
+{
+ { 1, { 1.0 }},
+ { 2, { 1.0, 0.227 }}, /* Just a guess */
+ { 2, { 1.0, 0.227 }}, /* Just a guess */
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+};
+
+static const shade_set_t ultrachrome_photo_shades = /* Ultrachrome with photo black ink */
+{
+ { 2, { 1.0, 0.48 }},
+ { 2, { 1.0, 0.33 }},
+ { 2, { 1.0, 0.25 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+};
+
+static const shade_set_t ultrachrome_matte_shades = /* Ultrachrome with matte black ink */
+{
+ { 2, { 1.0, 0.33 }},
+ { 2, { 1.0, 0.33 }},
+ { 2, { 1.0, 0.25 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+};
+
+static const shade_set_t quadtone_shades = /* Some kind of quadtone ink */
+{
+ { 4, { 1.0, 0.75, 0.5, 0.25 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+ { 1, { 1.0 }},
+};
+
+#define DECLARE_INKLIST(tname, name, inks, text, papers, adjustments, shades) \
+static const inklist_t name##_inklist = \
+{ \
+ tname, \
+ text, \
+ inks##_ink_types, \
+ &stpi_escp2_##papers##_paper_list, \
+ &stpi_escp2_##adjustments##_paper_adjustment_list, \
+ &shades##_shades, \
+ sizeof(inks##_ink_types) / sizeof(escp2_inkname_t *), \
+}
+
+
+static const escp2_inkname_t *const cmy_ink_types[] =
+{
+ &three_color_composite_inkset
+};
+
+DECLARE_INKLIST("None", cmy, cmy, N_("EPSON Standard Inks"),
+ standard, standard, standard);
+
+
+static const escp2_inkname_t *const standard_ink_types[] =
+{
+ &four_color_standard_inkset,
+ &three_color_composite_inkset,
+ &one_color_extended_inkset,
+ &three_color_extended_inkset,
+ &four_color_extended_inkset,
+};
+
+DECLARE_INKLIST("None", standard, standard, N_("EPSON Standard Inks"),
+ standard, standard, standard);
+
+static const escp2_inkname_t *const quadtone_ink_types[] =
+{
+ &generic_quadtone_inkset,
+};
+
+DECLARE_INKLIST("quadtone", quadtone, quadtone, N_("Quadtone"),
+ standard, standard, quadtone);
+
+static const escp2_inkname_t *const c80_ink_types[] =
+{
+ &c80_four_color_standard_inkset,
+ &c80_three_color_composite_inkset,
+ &one_color_extended_inkset,
+ &c80_three_color_extended_inkset,
+ &c80_four_color_extended_inkset,
+};
+
+DECLARE_INKLIST("None", c80, c80, N_("EPSON Standard Inks"),
+ durabrite, durabrite, standard);
+
+DECLARE_INKLIST("None", c82, c80, N_("EPSON Standard Inks"),
+ durabrite2, durabrite2, standard);
+
+static const escp2_inkname_t *const c80_quadtone_ink_types[] =
+{
+ &c80_generic_quadtone_inkset,
+};
+
+DECLARE_INKLIST("Quadtone", c80_quadtone, c80_quadtone, N_("Quadtone"),
+ standard, standard, quadtone);
+
+static const escp2_inkname_t *const c64_ink_types[] =
+{
+ &c64_four_color_standard_inkset,
+ &c64_three_color_composite_inkset,
+ &one_color_extended_inkset,
+ &c64_three_color_extended_inkset,
+ &c64_four_color_extended_inkset,
+};
+
+DECLARE_INKLIST("None", c64, c64, N_("EPSON Standard Inks"),
+ durabrite2, durabrite2, standard);
+
+static const escp2_inkname_t *const c64_quadtone_ink_types[] =
+{
+ &c64_generic_quadtone_inkset,
+};
+
+DECLARE_INKLIST("Quadtone", c64_quadtone, c64_quadtone, N_("Quadtone"),
+ standard, standard, quadtone);
+
+static const escp2_inkname_t *const f360_ink_types[] =
+{
+ &f360_four_color_standard_inkset,
+ &f360_three_color_composite_inkset,
+ &one_color_extended_inkset,
+ &f360_three_color_extended_inkset,
+ &f360_four_color_extended_inkset,
+};
+
+DECLARE_INKLIST("None", f360, f360, N_("EPSON Standard Inks"),
+ durabrite2, durabrite2, standard);
+
+static const escp2_inkname_t *const f360_quadtone_ink_types[] =
+{
+ &f360_generic_quadtone_inkset,
+};
+
+DECLARE_INKLIST("Quadtone", f360_quadtone, f360_quadtone, N_("Quadtone"),
+ standard, standard, quadtone);
+
+static const escp2_inkname_t *const cx3650_ink_types[] =
+{
+ &cx3650_four_color_standard_inkset,
+ &cx3650_three_color_composite_inkset,
+ &one_color_extended_inkset,
+ &cx3650_three_color_extended_inkset,
+ &cx3650_four_color_extended_inkset,
+};
+
+DECLARE_INKLIST("None", cx3650, cx3650, N_("EPSON Standard Inks"),
+ durabrite2, durabrite2, standard);
+
+static const escp2_inkname_t *const cx3650_quadtone_ink_types[] =
+{
+ &cx3650_generic_quadtone_inkset,
+};
+
+DECLARE_INKLIST("Quadtone", cx3650_quadtone, cx3650_quadtone, N_("Quadtone"),
+ standard, standard, quadtone);
+
+static const escp2_inkname_t *const x80_ink_types[] =
+{
+ &x80_four_color_standard_inkset,
+ &x80_three_color_composite_inkset,
+ &one_color_extended_inkset,
+ &x80_three_color_extended_inkset,
+ &x80_four_color_extended_inkset,
+};
+
+DECLARE_INKLIST("None", x80, x80, N_("EPSON Standard Inks"),
+ standard, standard, standard);
+
+static const escp2_inkname_t *const photo_ink_types[] =
+{
+ &six_color_photo_inkset,
+ &five_color_photo_composite_inkset,
+ &four_color_standard_inkset,
+ &three_color_composite_inkset,
+ &one_color_extended_inkset,
+ &three_color_extended_inkset,
+ &four_color_extended_inkset,
+ &five_color_extended_inkset,
+ &six_color_extended_inkset,
+};
+
+DECLARE_INKLIST("None", gen1, photo, N_("EPSON Standard Inks"),
+ standard, photo, photo_gen1);
+DECLARE_INKLIST("None", photo_gen2, photo, N_("EPSON Standard Inks"),
+ standard, photo2, photo_gen2);
+DECLARE_INKLIST("None", photo_gen3, photo, N_("EPSON Standard Inks"),
+ standard, photo3, photo_gen3);
+DECLARE_INKLIST("None", pigment, photo, N_("EPSON Standard Inks"),
+ ultrachrome, ultrachrome_photo, stp2000);
+
+static const escp2_inkname_t *const f360_photo_ink_types[] =
+{
+ &f360_six_color_photo_inkset,
+ &f360_five_color_photo_composite_inkset,
+ &f360_four_color_standard_inkset,
+ &three_color_composite_inkset,
+ &one_color_extended_inkset,
+ &three_color_extended_inkset,
+ &f360_four_color_extended_inkset,
+ &f360_five_color_extended_inkset,
+ &f360_six_color_extended_inkset,
+};
+
+DECLARE_INKLIST("None", f360_photo, f360_photo, N_("EPSON Standard Inks"),
+ standard, sp960, esp960);
+
+static const escp2_inkname_t *const f360_photo7_japan_ink_types[] =
+{
+ &f360_j_seven_color_enhanced_inkset,
+ &f360_j_six_color_enhanced_composite_inkset,
+ &f360_six_color_photo_inkset,
+ &f360_five_color_photo_composite_inkset,
+ &four_color_standard_inkset,
+ &three_color_composite_inkset,
+ &one_color_extended_inkset,
+ &three_color_extended_inkset,
+ &four_color_extended_inkset,
+ &f360_five_color_extended_inkset,
+ &f360_six_color_extended_inkset,
+ &f360_seven_color_extended_inkset,
+};
+
+DECLARE_INKLIST("None", f360_photo7_japan, f360_photo7_japan,
+ N_("EPSON Standard Inks"), standard, sp960, esp960);
+
+static const escp2_inkname_t *const f360_photo7_ink_types[] =
+{
+ &f360_seven_color_enhanced_inkset,
+ &f360_six_color_photo_inkset,
+ &f360_five_color_photo_composite_inkset,
+ &four_color_standard_inkset,
+ &three_color_composite_inkset,
+ &f360_two_color_grayscale_inkset,
+ &one_color_extended_inkset,
+ &f360_two_color_extended_inkset,
+ &three_color_extended_inkset,
+ &four_color_extended_inkset,
+ &f360_five_color_extended_inkset,
+ &f360_six_color_extended_inkset,
+ &f360_seven_color_extended_inkset,
+};
+
+DECLARE_INKLIST("ultraphoto", f360_ultra_photo7, f360_photo7,
+ N_("UltraChrome Photo Black"), ultrachrome,
+ ultrachrome_photo, ultrachrome_photo);
+
+DECLARE_INKLIST("ultramatte", f360_ultra_matte7, f360_photo7,
+ N_("UltraChrome Matte Black"), ultrachrome,
+ ultrachrome_matte, ultrachrome_matte);
+
+static const escp2_inkname_t *const photo7_ink_types[] =
+{
+ &seven_color_enhanced_inkset,
+ &six_color_photo_inkset,
+ &five_color_photo_composite_inkset,
+ &four_color_standard_inkset,
+ &three_color_composite_inkset,
+ &two_color_grayscale_inkset,
+ &one_color_extended_inkset,
+ &two_color_extended_inkset,
+ &three_color_extended_inkset,
+ &four_color_extended_inkset,
+ &five_color_extended_inkset,
+ &six_color_extended_inkset,
+ &seven_color_extended_inkset,
+};
+
+DECLARE_INKLIST("ultraphoto", ultra_photo7, photo7,
+ N_("UltraChrome Photo Black"), ultrachrome,
+ ultrachrome_photo, ultrachrome_photo);
+
+DECLARE_INKLIST("ultramatte", ultra_matte7, photo7,
+ N_("UltraChrome Matte Black"), ultrachrome,
+ ultrachrome_matte, ultrachrome_matte);
+
+static const escp2_inkname_t *const cmykrb_matte_ink_types[] =
+{
+ &six_color_r800_inkset,
+ &five_color_r800_inkset,
+ &four_color_r800_matte_inkset,
+ &three_color_r800_composite_inkset,
+ &one_color_extended_inkset,
+ &three_color_r800_extended_inkset,
+ &four_color_r800_extended_inkset,
+ &six_color_r800_extended_inkset,
+};
+
+DECLARE_INKLIST("cmykrbmatte", cmykrb_matte, cmykrb_matte,
+ N_("Matte Black"), r800, r800_matte, standard);
+
+static const escp2_inkname_t *const cmykrb_photo_ink_types[] =
+{
+ &six_color_r800_photo_gloss_inkset,
+ &five_color_r800_photo_gloss_inkset,
+ &four_color_r800_photo_gloss_inkset,
+ &three_color_r800_gloss_inkset,
+ &one_color_extended_inkset,
+ &one_color_r800_photo_gloss_extended_inkset,
+ &three_color_r800_extended_inkset,
+ &three_color_r800_gloss_extended_inkset,
+ &four_color_r800_photo_gloss_extended_inkset,
+ &six_color_r800_photo_gloss_extended_inkset,
+ &seven_color_r800_gloss_extended_inkset
+};
+
+DECLARE_INKLIST("cmykrbphoto", cmykrb_photo, cmykrb_photo,
+ N_("Photo Black"), r800, r800_photo, standard);
+
+
+#define DECLARE_INKGROUP(name) \
+const inkgroup_t stpi_escp2_##name##_inkgroup = \
+{ \
+ #name, \
+ name##_group, \
+ sizeof(name##_group) / sizeof(inklist_t *), \
+}
+
+static const inklist_t *const cmy_group[] =
+{
+ &cmy_inklist
+};
+
+DECLARE_INKGROUP(cmy);
+
+static const inklist_t *const standard_group[] =
+{
+ &standard_inklist,
+ &quadtone_inklist
+};
+
+DECLARE_INKGROUP(standard);
+
+static const inklist_t *const c80_group[] =
+{
+ &c80_inklist,
+ &c80_quadtone_inklist
+};
+
+DECLARE_INKGROUP(c80);
+
+static const inklist_t *const c82_group[] =
+{
+ &c82_inklist,
+ &c80_quadtone_inklist
+};
+
+DECLARE_INKGROUP(c82);
+
+static const inklist_t *const c64_group[] =
+{
+ &c64_inklist,
+ &c64_quadtone_inklist
+};
+
+DECLARE_INKGROUP(c64);
+
+static const inklist_t *const f360_group[] =
+{
+ &f360_inklist,
+ &f360_quadtone_inklist
+};
+
+DECLARE_INKGROUP(f360);
+
+static const inklist_t *const cx3650_group[] =
+{
+ &cx3650_inklist,
+ &cx3650_quadtone_inklist
+};
+
+DECLARE_INKGROUP(cx3650);
+
+static const inklist_t *const x80_group[] =
+{
+ &x80_inklist
+};
+
+DECLARE_INKGROUP(x80);
+
+static const inklist_t *const photo_gen1_group[] =
+{
+ &gen1_inklist,
+ &quadtone_inklist
+};
+
+DECLARE_INKGROUP(photo_gen1);
+
+static const inklist_t *const photo_gen2_group[] =
+{
+ &photo_gen2_inklist,
+ &quadtone_inklist
+};
+
+DECLARE_INKGROUP(photo_gen2);
+
+static const inklist_t *const photo_gen3_group[] =
+{
+ &photo_gen3_inklist,
+ &quadtone_inklist
+};
+
+DECLARE_INKGROUP(photo_gen3);
+
+static const inklist_t *const photo_pigment_group[] =
+{
+ &pigment_inklist
+};
+
+DECLARE_INKGROUP(photo_pigment);
+
+static const inklist_t *const f360_photo_group[] =
+{
+ &f360_photo_inklist
+};
+
+DECLARE_INKGROUP(f360_photo);
+
+static const inklist_t *const f360_photo7_japan_group[] =
+{
+ &f360_photo7_japan_inklist
+};
+
+DECLARE_INKGROUP(f360_photo7_japan);
+
+static const inklist_t *const f360_ultrachrome_group[] =
+{
+ &f360_ultra_photo7_inklist,
+ &f360_ultra_matte7_inklist
+};
+
+DECLARE_INKGROUP(f360_ultrachrome);
+
+static const inklist_t *const ultrachrome_group[] =
+{
+ &ultra_photo7_inklist,
+ &ultra_matte7_inklist
+};
+
+DECLARE_INKGROUP(ultrachrome);
+
+static const inklist_t *const cmykrb_group[] =
+{
+ &cmykrb_photo_inklist,
+ &cmykrb_matte_inklist
+};
+
+DECLARE_INKGROUP(cmykrb);
diff --git a/src/main/escp2-driver.c b/src/main/escp2-driver.c
new file mode 100644
index 0000000..d64ecf2
--- /dev/null
+++ b/src/main/escp2-driver.c
@@ -0,0 +1,652 @@
+/*
+ * "$Id: escp2-driver.c,v 1.25 2005/04/17 23:13:59 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 <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include <gutenprint/gutenprint-intl-internal.h>
+#include "gutenprint-internal.h"
+#include <string.h>
+#include "print-escp2.h"
+
+#ifdef __GNUC__
+#define inline __inline__
+#endif
+
+static escp2_privdata_t *
+get_privdata(stp_vars_t *v)
+{
+ return (escp2_privdata_t *) stp_get_component_data(v, "Driver");
+}
+
+static void
+escp2_reset_printer(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ /*
+ * Magic initialization string that's needed to take printer out of
+ * packet mode.
+ */
+ if (pd->init_sequence)
+ stp_zfwrite(pd->init_sequence->data, pd->init_sequence->bytes, 1, v);
+
+ stp_send_command(v, "\033@", "");
+}
+
+static void
+print_remote_param(stp_vars_t *v, const char *param, const char *value)
+{
+ stp_send_command(v, "\033(R", "bcscs", '\0', param, ':',
+ value ? value : "NULL");
+ stp_send_command(v, "\033", "ccc", 0, 0, 0);
+}
+
+static void
+print_remote_int_param(stp_vars_t *v, const char *param, int value)
+{
+ char buf[64];
+ (void) snprintf(buf, 64, "%d", value);
+ print_remote_param(v, param, buf);
+}
+
+static void
+print_remote_float_param(stp_vars_t *v, const char *param, double value)
+{
+ char buf[64];
+ (void) snprintf(buf, 64, "%f", value);
+ print_remote_param(v, param, buf);
+}
+
+static void
+print_debug_params(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ stp_parameter_list_t params = stp_get_parameter_list(v);
+ int count = stp_parameter_list_count(params);
+ int i;
+ print_remote_param(v, "Package", PACKAGE);
+ print_remote_param(v, "Version", VERSION);
+ print_remote_param(v, "Release Date", RELEASE_DATE);
+ print_remote_param(v, "Driver", stp_get_driver(v));
+ print_remote_int_param(v, "Left", stp_get_left(v));
+ print_remote_int_param(v, "Top", stp_get_top(v));
+ print_remote_int_param(v, "Page Width", stp_get_page_width(v));
+ print_remote_int_param(v, "Page Height", stp_get_page_height(v));
+ print_remote_int_param(v, "Model", stp_get_model_id(v));
+ print_remote_int_param(v, "Ydpi", pd->res->vres);
+ print_remote_int_param(v, "Xdpi", pd->res->hres);
+ print_remote_int_param(v, "Use_softweave", pd->res->softweave);
+ print_remote_int_param(v, "Use_printer_weave", pd->res->printer_weave);
+ print_remote_int_param(v, "Use_printer_weave", pd->use_printer_weave);
+ print_remote_int_param(v, "Page_left", pd->page_left);
+ print_remote_int_param(v, "Page_right", pd->page_right);
+ print_remote_int_param(v, "Page_top", pd->page_top);
+ print_remote_int_param(v, "Page_bottom", pd->page_bottom);
+ print_remote_int_param(v, "Page_width", pd->page_width);
+ print_remote_int_param(v, "Page_height", pd->page_height);
+ print_remote_int_param(v, "Page_true_height", pd->page_true_height);
+ print_remote_int_param(v, "Image_left", pd->image_left);
+ print_remote_int_param(v, "Image_top", pd->image_top);
+ print_remote_int_param(v, "Image_width", pd->image_width);
+ print_remote_int_param(v, "Image_height", pd->image_height);
+ print_remote_int_param(v, "Image_scaled_width", pd->image_scaled_width);
+ print_remote_int_param(v, "Image_scaled_height", pd->image_scaled_height);
+ print_remote_int_param(v, "Image_printed_width", pd->image_printed_width);
+ print_remote_int_param(v, "Image_printed_height", pd->image_printed_height);
+ print_remote_int_param(v, "Image_left_position", pd->image_left_position);
+ print_remote_int_param(v, "Nozzles", pd->nozzles);
+ print_remote_int_param(v, "Nozzle_separation", pd->nozzle_separation);
+ print_remote_int_param(v, "Horizontal_passes", pd->horizontal_passes);
+ print_remote_int_param(v, "Vertical_passes", pd->res->vertical_passes);
+ print_remote_int_param(v, "Physical_xdpi", pd->physical_xdpi);
+ print_remote_int_param(v, "Page_management_units", pd->page_management_units);
+ print_remote_int_param(v, "Vertical_units", pd->vertical_units);
+ print_remote_int_param(v, "Horizontal_units", pd->horizontal_units);
+ print_remote_int_param(v, "Micro_units", pd->micro_units);
+ print_remote_int_param(v, "Unit_scale", pd->unit_scale);
+ print_remote_int_param(v, "Zero_advance", pd->send_zero_pass_advance);
+ print_remote_int_param(v, "Bits", pd->bitwidth);
+ print_remote_int_param(v, "Resid", pd->ink_resid);
+ print_remote_int_param(v, "Drop Size", pd->drop_size);
+ print_remote_int_param(v, "Initial_vertical_offset", pd->initial_vertical_offset);
+ print_remote_int_param(v, "Channels_in_use", pd->channels_in_use);
+ print_remote_int_param(v, "Logical_channels", pd->logical_channels);
+ print_remote_int_param(v, "Physical_channels", pd->physical_channels);
+ print_remote_int_param(v, "Use_black_parameters", pd->use_black_parameters);
+ print_remote_int_param(v, "Use_fast_360", pd->use_fast_360);
+ print_remote_int_param(v, "Command_set", pd->command_set);
+ print_remote_int_param(v, "Variable_dots", pd->variable_dots);
+ print_remote_int_param(v, "Has_vacuum", pd->has_vacuum);
+ print_remote_int_param(v, "Has_graymode", pd->has_graymode);
+ print_remote_int_param(v, "Base_separation", pd->base_separation);
+ print_remote_int_param(v, "Resolution_scale", pd->resolution_scale);
+ print_remote_int_param(v, "Printing_resolution", pd->printing_resolution);
+ print_remote_int_param(v, "Separation_rows", pd->separation_rows);
+ print_remote_int_param(v, "Pseudo_separation_rows", pd->pseudo_separation_rows);
+ print_remote_int_param(v, "Extra_720dpi_separation", pd->extra_720dpi_separation);
+ print_remote_int_param(v, "Use_aux_channels", pd->use_aux_channels);
+ print_remote_param(v, "Ink name", pd->inkname->name);
+ print_remote_int_param(v, " channels", pd->inkname->channel_set->channel_count);
+ print_remote_int_param(v, " inkset", pd->inkname->inkset);
+ for (i = 0; i < count; i++)
+ {
+ const stp_parameter_t *p = stp_parameter_list_param(params, i);
+ switch (p->p_type)
+ {
+ case STP_PARAMETER_TYPE_DOUBLE:
+ if (stp_check_float_parameter(v, p->name, STP_PARAMETER_DEFAULTED))
+ print_remote_float_param(v, p->name,
+ stp_get_float_parameter(v, p->name));
+ break;
+ case STP_PARAMETER_TYPE_INT:
+ if (stp_check_int_parameter(v, p->name, STP_PARAMETER_DEFAULTED))
+ print_remote_int_param(v, p->name,
+ stp_get_int_parameter(v, p->name));
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ if (stp_check_dimension_parameter(v, p->name, STP_PARAMETER_DEFAULTED))
+ print_remote_int_param(v, p->name,
+ stp_get_dimension_parameter(v, p->name));
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ if (stp_check_boolean_parameter(v, p->name, STP_PARAMETER_DEFAULTED))
+ print_remote_int_param(v, p->name,
+ stp_get_boolean_parameter(v, p->name));
+ break;
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ if (stp_check_string_parameter(v, p->name, STP_PARAMETER_DEFAULTED))
+ print_remote_param(v, p->name,
+ stp_get_string_parameter(v, p->name));
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ if (stp_check_curve_parameter(v, p->name, STP_PARAMETER_DEFAULTED))
+ {
+ char *curve =
+ stp_curve_write_string(stp_get_curve_parameter(v, p->name));
+ print_remote_param(v, p->name, curve);
+ stp_free(curve);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ stp_parameter_list_destroy(params);
+ stp_send_command(v, "\033", "ccc", 0, 0, 0);
+}
+
+static void
+escp2_set_remote_sequence(stp_vars_t *v)
+{
+ /* Magic remote mode commands, whatever they do */
+ escp2_privdata_t *pd = get_privdata(v);
+
+ if (stp_get_debug_level() & STP_DBG_MARK_FILE)
+ print_debug_params(v);
+ if (pd->advanced_command_set || pd->input_slot)
+ {
+ int feed_sequence = 0;
+ /* Enter remote mode */
+ stp_send_command(v, "\033(R", "bcs", 0, "REMOTE1");
+ if (pd->command_set == MODEL_COMMAND_PRO)
+ {
+ if (pd->paper_type)
+ {
+ stp_send_command(v, "PH", "bcc", 0,
+ pd->paper_type->paper_thickness);
+ if (pd->has_vacuum)
+ stp_send_command(v, "SN", "bccc", 0, 5,
+ pd->paper_type->vacuum_intensity);
+ stp_send_command(v, "SN", "bccc", 0, 4,
+ pd->paper_type->feed_adjustment);
+ }
+ }
+ else if (pd->advanced_command_set)
+ {
+ if (pd->paper_type)
+ feed_sequence = pd->paper_type->paper_feed_sequence;
+ /* Function unknown */
+ stp_send_command(v, "PM", "bh", 0);
+ /* Set mechanism sequence */
+ stp_send_command(v, "SN", "bccc", 0, 0, feed_sequence);
+ if (stp_get_boolean_parameter(v, "FullBleed"))
+ {
+ stp_send_command(v, "FP", "bch", 0, 0xffb0);
+#if 0
+ /* These commands do not appear to do anything on the */
+ /* 2200. Need to test on R800. */
+ /* From the R1800 manual -- bottom margin borderless */
+ stp_send_command(v, "US", "bcc", 0, 2);
+ /* This command means "check paper size - no" */
+ stp_send_command(v, "US", "bcc", 2, 0);
+#endif
+ }
+ }
+ if (pd->input_slot)
+ {
+ int divisor = pd->base_separation / 360;
+ int height = pd->page_true_height * 5 / divisor;
+ if (pd->input_slot->init_sequence.bytes)
+ stp_zfwrite(pd->input_slot->init_sequence.data,
+ pd->input_slot->init_sequence.bytes, 1, v);
+ switch (pd->input_slot->roll_feed_cut_flags)
+ {
+ case ROLL_FEED_CUT_ALL:
+ stp_send_command(v, "JS", "bh", 0);
+ stp_send_command(v, "CO", "bccccl", 0, 0, 1, 0, 0);
+ stp_send_command(v, "CO", "bccccl", 0, 0, 0, 0, height);
+ break;
+ case ROLL_FEED_CUT_LAST:
+ stp_send_command(v, "CO", "bccccl", 0, 0, 1, 0, 0);
+ stp_send_command(v, "CO", "bccccl", 0, 0, 2, 0, height);
+ break;
+ default:
+ break;
+ }
+ }
+
+ /* Exit remote mode */
+
+ stp_send_command(v, "\033", "ccc", 0, 0, 0);
+ }
+}
+
+static void
+escp2_set_graphics_mode(stp_vars_t *v)
+{
+ stp_send_command(v, "\033(G", "bc", 1);
+}
+
+static void
+escp2_set_resolution(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ if (pd->use_extended_commands)
+ stp_send_command(v, "\033(U", "bccch",
+ pd->unit_scale / pd->page_management_units,
+ pd->unit_scale / pd->vertical_units,
+ pd->unit_scale / pd->horizontal_units,
+ pd->unit_scale);
+ else
+ stp_send_command(v, "\033(U", "bc",
+ pd->unit_scale / pd->page_management_units);
+}
+
+static void
+escp2_set_color(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ if (pd->use_fast_360)
+ stp_send_command(v, "\033(K", "bcc", 0, 3);
+ else if (pd->has_graymode)
+ stp_send_command(v, "\033(K", "bcc", 0,
+ (pd->use_black_parameters ? 1 : 2));
+}
+
+static void
+escp2_set_printer_weave(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ int printer_weave_parm = 0;
+ if (pd->printer_weave)
+ printer_weave_parm = pd->printer_weave->value;
+ else if (pd->res->printer_weave)
+ printer_weave_parm = pd->res->printer_weave;
+ stp_send_command(v, "\033(i", "bc", printer_weave_parm);
+}
+
+static void
+escp2_set_printhead_speed(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ const char *direction = stp_get_string_parameter(v, "PrintingDirection");
+ int unidirectional;
+ if (direction && strcmp(direction, "Unidirectional") == 0)
+ unidirectional = 1;
+ else if (direction && strcmp(direction, "Bidirectional") == 0)
+ unidirectional = 0;
+ else if (pd->res->hres >= 720 && pd->res->vres >= 720)
+ unidirectional = 1;
+ else
+ unidirectional = 0;
+ if (unidirectional)
+ {
+ stp_send_command(v, "\033U", "c", 1);
+ if (pd->res->hres > pd->printing_resolution)
+ stp_send_command(v, "\033(s", "bc", 2);
+ }
+ else
+ stp_send_command(v, "\033U", "c", 0);
+}
+
+static void
+escp2_set_dot_size(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ /* Dot size */
+ if (pd->drop_size >= 0)
+ stp_send_command(v, "\033(e", "bcc", 0, pd->drop_size);
+}
+
+static void
+escp2_set_page_height(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ int l = pd->page_management_units * pd->page_true_height / 72;
+ if (pd->use_extended_commands)
+ stp_send_command(v, "\033(C", "bl", l);
+ else
+ stp_send_command(v, "\033(C", "bh", l);
+}
+
+static void
+escp2_set_margins(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ int bot = pd->page_management_units * pd->page_bottom / 72;
+ int top = pd->page_management_units * pd->page_top / 72;
+
+ top += pd->initial_vertical_offset;
+ if (pd->use_extended_commands &&
+ (pd->command_set == MODEL_COMMAND_2000 ||
+ pd->command_set == MODEL_COMMAND_PRO))
+ stp_send_command(v, "\033(c", "bll", top, bot);
+ else
+ stp_send_command(v, "\033(c", "bhh", top, bot);
+}
+
+static void
+escp2_set_form_factor(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ if (pd->advanced_command_set)
+ {
+ int w = pd->page_width * pd->page_management_units / 72;
+ int h = pd->page_true_height * pd->page_management_units / 72;
+
+ if (stp_get_boolean_parameter(v, "FullBleed"))
+ /* Make the page 160/360" wider for full bleed printing. */
+ /* Per the Epson manual, the margin should be expanded by 80/360" */
+ /* so we need to do this on the left and the right */
+ w += 320 * pd->page_management_units / 720;
+
+ stp_send_command(v, "\033(S", "bll", w, h);
+ }
+}
+
+static void
+escp2_set_printhead_resolution(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ if (pd->use_extended_commands)
+ {
+ int xres;
+ int yres = pd->resolution_scale;
+
+ xres = pd->resolution_scale / pd->physical_xdpi;
+
+ if (pd->command_set == MODEL_COMMAND_PRO && !pd->res->softweave)
+ yres = yres / pd->res->vres;
+ else
+ yres = yres * pd->nozzle_separation / pd->base_separation;
+
+ /* Magic resolution cookie */
+ stp_send_command(v, "\033(D", "bhcc", pd->resolution_scale, yres, xres);
+ }
+}
+
+static void
+set_vertical_position(stp_vars_t *v, stp_pass_t *pass)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ int advance = pass->logicalpassstart - pd->last_pass_offset -
+ (pd->separation_rows - 1);
+ advance = advance * pd->vertical_units / pd->res->vres;
+ if (pass->logicalpassstart > pd->last_pass_offset ||
+ (pd->send_zero_pass_advance && pass->pass > pd->last_pass) ||
+ pd->printing_initial_vertical_offset != 0)
+ {
+ advance += pd->printing_initial_vertical_offset;
+ pd->printing_initial_vertical_offset = 0;
+ if (pd->use_extended_commands)
+ stp_send_command(v, "\033(v", "bl", advance);
+ else
+ stp_send_command(v, "\033(v", "bh", advance);
+ pd->last_pass_offset = pass->logicalpassstart;
+ pd->last_pass = pass->pass;
+ }
+}
+
+static void
+set_color(stp_vars_t *v, stp_pass_t *pass, int color)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ if (pd->last_color != color && ! pd->use_extended_commands)
+ {
+ int ncolor = pd->channels[color]->color;
+ int subchannel = pd->channels[color]->subchannel;
+ if (subchannel >= 0)
+ stp_send_command(v, "\033(r", "bcc", subchannel, ncolor);
+ else
+ stp_send_command(v, "\033r", "c", ncolor);
+ pd->last_color = color;
+ }
+}
+
+static void
+set_horizontal_position(stp_vars_t *v, stp_pass_t *pass, int vertical_subpass)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ int microoffset = (vertical_subpass & (pd->horizontal_passes - 1)) *
+ pd->image_scaled_width / pd->image_printed_width;
+ int pos = pd->image_left_position + microoffset;
+
+ if (pos != 0)
+ {
+ /* Note hard-coded 1440 -- from Epson manuals */
+ if (pd->command_set == MODEL_COMMAND_PRO || pd->variable_dots)
+ stp_send_command(v, "\033($", "bl", pos);
+ else if (pd->advanced_command_set || pd->res->hres > 720)
+ stp_send_command(v, "\033(\\", "bhh", pd->micro_units, pos);
+ else
+ stp_send_command(v, "\033\\", "h", pos);
+ }
+}
+
+static void
+send_print_command(stp_vars_t *v, stp_pass_t *pass, int color, int nlines)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ int lwidth = (pd->image_printed_width + (pd->horizontal_passes - 1)) /
+ pd->horizontal_passes;
+ if (pd->command_set == MODEL_COMMAND_PRO || pd->variable_dots)
+ {
+ int ncolor = pd->channels[color]->color;
+ int subchannel = pd->channels[color]->subchannel;
+ int nwidth = pd->bitwidth * ((lwidth + 7) / 8);
+ if (subchannel >= 0)
+ ncolor |= (subchannel << 4);
+ stp_send_command(v, "\033i", "ccchh", ncolor, COMPRESSION,
+ pd->bitwidth, nwidth, nlines);
+ }
+ else
+ {
+ int ygap = 3600 / pd->vertical_units;
+ int xgap = 3600 / pd->physical_xdpi;
+ if (pd->nozzles == 1)
+ {
+ if (pd->vertical_units == 720 && pd->extra_720dpi_separation)
+ ygap *= pd->extra_720dpi_separation;
+ }
+ else if (pd->extra_720dpi_separation)
+ ygap *= pd->extra_720dpi_separation;
+ else if (pd->pseudo_separation_rows > 0)
+ ygap *= pd->pseudo_separation_rows;
+ else
+ ygap *= pd->separation_rows;
+ stp_send_command(v, "\033.", "cccch", COMPRESSION, ygap, xgap, nlines,
+ lwidth);
+ }
+}
+
+static void
+send_extra_data(stp_vars_t *v, int extralines)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ int lwidth = (pd->image_printed_width + (pd->horizontal_passes - 1)) /
+ pd->horizontal_passes;
+#if TEST_UNCOMPRESSED
+ int i;
+ for (i = 0; i < pd->bitwidth * (lwidth + 7) / 8; i++)
+ stp_putc(0, v);
+#else /* !TEST_UNCOMPRESSED */
+ int k, l;
+ int bytes_to_fill = pd->bitwidth * ((lwidth + 7) / 8);
+ int full_blocks = bytes_to_fill / 128;
+ int leftover = bytes_to_fill % 128;
+ int total_bytes = extralines * (full_blocks + 1) * 2;
+ unsigned char *buf = stp_malloc(total_bytes);
+ total_bytes = 0;
+ for (k = 0; k < extralines; k++)
+ {
+ for (l = 0; l < full_blocks; l++)
+ {
+ buf[total_bytes++] = 129;
+ buf[total_bytes++] = 0;
+ }
+ if (leftover == 1)
+ {
+ buf[total_bytes++] = 1;
+ buf[total_bytes++] = 0;
+ }
+ else if (leftover > 0)
+ {
+ buf[total_bytes++] = 257 - leftover;
+ buf[total_bytes++] = 0;
+ }
+ }
+ stp_zfwrite((const char *) buf, total_bytes, 1, v);
+ stp_free(buf);
+#endif /* TEST_UNCOMPRESSED */
+}
+
+void
+stpi_escp2_init_printer(stp_vars_t *v)
+{
+ escp2_reset_printer(v);
+ escp2_set_remote_sequence(v);
+ escp2_set_graphics_mode(v);
+ escp2_set_resolution(v);
+ escp2_set_color(v);
+ escp2_set_printer_weave(v);
+ escp2_set_printhead_speed(v);
+ escp2_set_dot_size(v);
+ escp2_set_printhead_resolution(v);
+ escp2_set_page_height(v);
+ escp2_set_margins(v);
+ escp2_set_form_factor(v);
+}
+
+void
+stpi_escp2_deinit_printer(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ stp_puts("\033@", v); /* ESC/P2 reset */
+ if (pd->advanced_command_set || pd->input_slot)
+ {
+ stp_send_command(v, "\033(R", "bcs", 0, "REMOTE1");
+ if (pd->input_slot && pd->input_slot->deinit_sequence.bytes)
+ stp_zfwrite(pd->input_slot->deinit_sequence.data,
+ pd->input_slot->deinit_sequence.bytes, 1, v);
+ /* Load settings from NVRAM */
+ stp_send_command(v, "LD", "b");
+
+ /* Magic deinit sequence reported by Simone Falsini */
+ if (pd->deinit_sequence)
+ stp_zfwrite(pd->deinit_sequence->data, pd->deinit_sequence->bytes,
+ 1, v);
+ /* Exit remote mode */
+ stp_send_command(v, "\033", "ccc", 0, 0, 0);
+ }
+}
+
+void
+stpi_escp2_flush_pass(stp_vars_t *v, int passno, int vertical_subpass)
+{
+ int j;
+ escp2_privdata_t *pd = get_privdata(v);
+ stp_lineoff_t *lineoffs = stp_get_lineoffsets_by_pass(v, passno);
+ stp_lineactive_t *lineactive = stp_get_lineactive_by_pass(v, passno);
+ const stp_linebufs_t *bufs = stp_get_linebases_by_pass(v, passno);
+ stp_pass_t *pass = stp_get_pass_by_pass(v, passno);
+ stp_linecount_t *linecount = stp_get_linecount_by_pass(v, passno);
+ int minlines = pd->min_nozzles;
+
+ for (j = 0; j < pd->channels_in_use; j++)
+ {
+ if (lineactive[0].v[j] > 0)
+ {
+ int nlines = linecount[0].v[j];
+ int extralines = 0;
+ if (nlines < minlines)
+ {
+ extralines = minlines - nlines;
+ nlines = minlines;
+ }
+ set_vertical_position(v, pass);
+ set_color(v, pass, j);
+ set_horizontal_position(v, pass, vertical_subpass);
+ send_print_command(v, pass, j, nlines);
+
+ /*
+ * Send the data
+ */
+ stp_zfwrite((const char *)bufs[0].v[j], lineoffs[0].v[j], 1, v);
+ if (extralines)
+ send_extra_data(v, extralines);
+ stp_send_command(v, "\r", "");
+ pd->printed_something = 1;
+ }
+ lineoffs[0].v[j] = 0;
+ linecount[0].v[j] = 0;
+ }
+}
+
+void
+stpi_escp2_terminate_page(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ if (!pd->input_slot ||
+ pd->input_slot->roll_feed_cut_flags != ROLL_FEED_DONT_EJECT)
+ {
+ if (!pd->printed_something)
+ stp_send_command(v, "\n", "");
+ stp_send_command(v, "\f", ""); /* Eject page */
+ }
+}
diff --git a/src/main/escp2-inks.c b/src/main/escp2-inks.c
new file mode 100644
index 0000000..99a4a97
--- /dev/null
+++ b/src/main/escp2-inks.c
@@ -0,0 +1,338 @@
+/*
+ * "$Id: escp2-inks.c,v 1.40 2005/06/26 22:07:59 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include "print-escp2.h"
+
+/* Single drop size printers */
+static const escp2_dropsize_t escp2_single_dropsizes =
+ { "single", 1, { 1.0 } };
+
+/* 6 pl printers */
+static const escp2_dropsize_t escp2_low_dropsizes =
+ { "low", 3, { 0.28, 0.58, 1.0 } };
+static const escp2_dropsize_t escp2_6pl_dropsizes =
+ { "6pl", 3, { 0.25, 0.5, 1.0 } };
+static const escp2_dropsize_t escp2_6pl_1440_dropsizes =
+ { "6pl_1440", 2, { 0.5, 1.0 } };
+static const escp2_dropsize_t escp2_6pl_2880_dropsizes =
+ { "6pl_2880", 1, { 1.0 } };
+
+/* Stylus Color 480/580/C40/C50 */
+static const escp2_dropsize_t escp2_x80_low_dropsizes =
+ { "x80_low", 3, { 0.325, 0.5, 1.0 } };
+static const escp2_dropsize_t escp2_x80_6pl_dropsizes =
+ { "x80_6pl", 3, { 0.325, 0.5, 1.0 } };
+static const escp2_dropsize_t escp2_x80_1440_6pl_dropsizes =
+ { "x80_1440_6pl", 2, { 0.65, 1.0 } };
+static const escp2_dropsize_t escp2_x80_2880_6pl_dropsizes =
+ { "x80_2880_6pl", 1, { 1.0 } };
+
+/* 2880 DPI capable 4 picolitre printers */
+static const escp2_dropsize_t escp2_new_low_dropsizes =
+ { "680_low", 3, { 0.375, 0.75, 1.0 } };
+static const escp2_dropsize_t escp2_new_6pl_dropsizes =
+ { "680_6pl", 3, { 0.375, 0.50, 1.0 } };
+static const escp2_dropsize_t escp2_new_4pl_dropsizes =
+ { "680_4pl", 3, { 0.50, 0.75, 1.0 } };
+static const escp2_dropsize_t escp2_4pl_2880_dropsizes =
+ { "4pl_2880", 1, { 1.0 } };
+
+/* 1440 DPI capable printers */
+static const escp2_dropsize_t escp2_4pl_dropsizes =
+ { "4pl", 3, { 0.33, 0.50, 1.0 } };
+
+/* Stylus Color 900/980 */
+static const escp2_dropsize_t escp2_3pl_dropsizes =
+ { "3pl", 3, { 0.25, 0.61, 1.0 } };
+static const escp2_dropsize_t escp2_3pl_1440_dropsizes =
+ { "3pl_1440", 2, { 0.39, 1.0 } };
+static const escp2_dropsize_t escp2_3pl_2880_dropsizes =
+ { "3pl_2880", 1, { 1.0 } };
+static const escp2_dropsize_t escp2_980_6pl_dropsizes =
+ { "980_6pl", 3, { 0.40, 0.675, 1.0 } };
+
+/* Stylus Photo 960 */
+static const escp2_dropsize_t escp2_2pl_360_dropsizes =
+ { "2pl_360", 3, { 0.25, 0.5, 1.0 } };
+static const escp2_dropsize_t escp2_2pl_720_dropsizes =
+ { "2pl_720", 3, { 0.25, 0.5, 1.0 } };
+static const escp2_dropsize_t escp2_2pl_1440_dropsizes =
+ { "2pl_1440", 2, { 0.5, 1.0 } };
+static const escp2_dropsize_t escp2_2pl_2880_dropsizes =
+ { "2pl_2880", 1, { 1.0 } };
+
+/* PM-G800 */
+/* Guess */
+static const escp2_dropsize_t escp2_1_5pl_360_dropsizes =
+ { "1_5pl_360", 1, { 1, 0, 1.0 } };
+/* 7, 14, 20 pl */
+static const escp2_dropsize_t escp2_1_5pl_720_dropsizes =
+ { "1_5pl_720", 3, { 0.35, 0.70, 1.0 } };
+/*
+ * Note that the site
+ * (http://www.i-love-epson.co.jp/products/printer/inkjet/pmg800/pmg8002.htm)
+ * is unclear: it says 3 pl MSDT, but the diagram reads 2 pl
+ */
+/* 3, 6, 13 pl */
+/* Looks like 3, 7.5, 15 */
+static const escp2_dropsize_t escp2_1_5pl_1440_dropsizes =
+ { "1_5pl_1440", 3, { 0.2, 0.5, 1.0 } };
+/*
+ * See above comment. 3 pl makes more sense than 2 pl
+ */
+/* 1.5, 3, 6 pl */
+/* Looks like 1.5, 3.25, 6 */
+static const escp2_dropsize_t escp2_1_5pl_2880_dropsizes =
+ { "1_5pl_2880", 3, { 0.25, 0.47, 1.0 } };
+static const escp2_dropsize_t escp2_1_5pl_5760_dropsizes =
+ { "1_5pl_5760", 2, { 0.53, 1.0 } };
+
+/* Stylus Photo R300 */
+static const escp2_dropsize_t escp2_r300_360_dropsizes =
+ { "r300_360", 3, { 0.15, 0.3, 1.0 } };
+static const escp2_dropsize_t escp2_r300_720_dropsizes =
+ { "r300_720", 3, { 0.15, 0.5, 1.0 } };
+static const escp2_dropsize_t escp2_r300_1440_dropsizes =
+ { "r300_1440", 3, { 0.29, 0.48, 1.0 } };
+static const escp2_dropsize_t escp2_r300_2880_dropsizes =
+ { "r300_2880", 2, { 0.604, 1.0 } };
+static const escp2_dropsize_t escp2_r300_2880_1440_dropsizes =
+ { "r300_2880_1440", 1, { 1.0 } };
+
+/* Stylus C80 */
+static const escp2_dropsize_t escp2_economy_pigment_dropsizes =
+ { "economy_pigment", 3, { 0, 0, 1.0 } };
+static const escp2_dropsize_t escp2_low_pigment_dropsizes =
+ { "low_pigment", 3, { 0.28, 0, 1.0 } };
+static const escp2_dropsize_t escp2_6pl_pigment_dropsizes =
+ { "6pl_pigment", 3, { 0.28, 0, 1.0 } };
+static const escp2_dropsize_t escp2_3pl_pigment_dropsizes =
+ { "3pl_pigment", 3, { 0.25, 0.5, 1.0 } };
+static const escp2_dropsize_t escp2_3pl_pigment_2880_dropsizes =
+ { "3pl_pigment_2880", 2, { 0.5, 1.0 } };
+static const escp2_dropsize_t escp2_3pl_pigment_5760_dropsizes =
+ { "3pl_pigment_5760", 1, { 1.0 } };
+
+/* Stylus C66 */
+static const escp2_dropsize_t escp2_economy_pigment_c66_dropsizes =
+ { "economy_pigment_c66", 3, { 0, 0, 1.0 } };
+static const escp2_dropsize_t escp2_low_pigment_c66_dropsizes =
+ { "low_pigment_c66", 3, { 0.125, 0.25, 1.0 } };
+static const escp2_dropsize_t escp2_6pl_pigment_c66_dropsizes =
+ { "6pl_pigment_c66", 3, { 0.28, 0, 1.0 } };
+static const escp2_dropsize_t escp2_3pl_pigment_c66_dropsizes =
+ { "3pl_pigment_c66", 3, { 0.25, 0.5, 1.0 } };
+static const escp2_dropsize_t escp2_3pl_pigment_c66_2880_dropsizes =
+ { "3pl_pigment_c66_2880", 2, { 0.5, 1.0 } };
+static const escp2_dropsize_t escp2_3pl_pigment_c66_5760_dropsizes =
+ { "3pl_pigment_c66_5760", 1, { 1.0 } };
+
+/* Stylus Photo 2000P */
+static const escp2_dropsize_t escp2_2000p_dropsizes =
+ { "2000p", 2, { 0.55, 1.0 } };
+
+/* Stylus Photo 2200, Stylus Pro 7600 */
+static const escp2_dropsize_t escp2_ultrachrome_low_dropsizes =
+ { "ultrachrome_low", 3, { 0.16, 0.4, 1.0 } };
+static const escp2_dropsize_t escp2_ultrachrome_720_dropsizes =
+ { "ultrachrome_720", 3, { 0.2, 0.45, 1.0 } };
+static const escp2_dropsize_t escp2_ultrachrome_2880_dropsizes =
+ { "ultrachrome_2880", 1, { 1.0 } };
+
+/* Stylus Pro 10000 */
+static const escp2_dropsize_t escp2_spro10000_dropsizes =
+ { "spro10000", 2, { 0.661, 1.0 } };
+
+const escp2_drop_list_t stpi_escp2_simple_drops =
+{
+ &escp2_single_dropsizes,
+ &escp2_single_dropsizes,
+ &escp2_single_dropsizes,
+ &escp2_single_dropsizes,
+ &escp2_single_dropsizes,
+ &escp2_single_dropsizes,
+ &escp2_single_dropsizes,
+ &escp2_single_dropsizes,
+};
+
+const escp2_drop_list_t stpi_escp2_variable_6pl_drops =
+{
+ &escp2_6pl_dropsizes,
+ &escp2_6pl_dropsizes,
+ &escp2_6pl_dropsizes,
+ &escp2_6pl_dropsizes,
+ &escp2_6pl_1440_dropsizes,
+ &escp2_6pl_2880_dropsizes,
+ &escp2_6pl_2880_dropsizes,
+ &escp2_6pl_2880_dropsizes
+};
+
+const escp2_drop_list_t stpi_escp2_variable_x80_6pl_drops =
+{
+ &escp2_x80_low_dropsizes,
+ &escp2_x80_low_dropsizes,
+ &escp2_x80_low_dropsizes,
+ &escp2_x80_6pl_dropsizes,
+ &escp2_x80_1440_6pl_dropsizes,
+ &escp2_x80_2880_6pl_dropsizes,
+ &escp2_x80_2880_6pl_dropsizes,
+ &escp2_x80_2880_6pl_dropsizes,
+};
+
+const escp2_drop_list_t stpi_escp2_variable_1440_4pl_drops =
+{
+ &escp2_low_dropsizes,
+ &escp2_low_dropsizes,
+ &escp2_low_dropsizes,
+ &escp2_6pl_dropsizes,
+ &escp2_4pl_dropsizes,
+ &escp2_4pl_2880_dropsizes,
+ &escp2_4pl_2880_dropsizes,
+ &escp2_4pl_2880_dropsizes,
+};
+
+const escp2_drop_list_t stpi_escp2_variable_2880_4pl_drops =
+{
+ &escp2_new_low_dropsizes,
+ &escp2_new_low_dropsizes,
+ &escp2_new_low_dropsizes,
+ &escp2_new_6pl_dropsizes,
+ &escp2_new_4pl_dropsizes,
+ &escp2_4pl_2880_dropsizes,
+ &escp2_4pl_2880_dropsizes,
+ &escp2_4pl_2880_dropsizes,
+};
+
+const escp2_drop_list_t stpi_escp2_variable_3pl_drops =
+{
+ &escp2_low_dropsizes,
+ &escp2_low_dropsizes,
+ &escp2_980_6pl_dropsizes,
+ &escp2_3pl_dropsizes,
+ &escp2_3pl_1440_dropsizes,
+ &escp2_3pl_2880_dropsizes,
+ &escp2_3pl_2880_dropsizes,
+ &escp2_3pl_2880_dropsizes,
+};
+
+const escp2_drop_list_t stpi_escp2_variable_2pl_drops =
+{
+ &escp2_2pl_360_dropsizes,
+ &escp2_2pl_360_dropsizes,
+ &escp2_2pl_360_dropsizes,
+ &escp2_2pl_720_dropsizes,
+ &escp2_2pl_1440_dropsizes,
+ &escp2_2pl_2880_dropsizes,
+ &escp2_2pl_2880_dropsizes,
+ &escp2_2pl_2880_dropsizes,
+};
+
+const escp2_drop_list_t stpi_escp2_variable_3pl_pmg_drops =
+{
+ &escp2_r300_360_dropsizes,
+ &escp2_r300_360_dropsizes,
+ &escp2_r300_360_dropsizes,
+ &escp2_r300_720_dropsizes,
+ &escp2_r300_1440_dropsizes,
+ &escp2_r300_2880_dropsizes,
+ &escp2_r300_2880_1440_dropsizes,
+ &escp2_r300_2880_1440_dropsizes,
+};
+
+const escp2_drop_list_t stpi_escp2_variable_1_5pl_drops =
+{
+ &escp2_1_5pl_360_dropsizes,
+ &escp2_1_5pl_360_dropsizes,
+ &escp2_1_5pl_720_dropsizes, /* Even though we use 0x10 drop size */
+ &escp2_1_5pl_720_dropsizes,
+ &escp2_1_5pl_1440_dropsizes,
+ &escp2_1_5pl_2880_dropsizes,
+ &escp2_1_5pl_2880_dropsizes,
+ &escp2_1_5pl_5760_dropsizes,
+};
+
+const escp2_drop_list_t stpi_escp2_variable_2000p_drops =
+{
+ &escp2_2000p_dropsizes,
+ &escp2_2000p_dropsizes,
+ &escp2_2000p_dropsizes,
+ &escp2_2000p_dropsizes,
+ &escp2_2000p_dropsizes,
+ &escp2_2000p_dropsizes,
+ &escp2_2000p_dropsizes,
+ &escp2_2000p_dropsizes
+};
+
+const escp2_drop_list_t stpi_escp2_variable_ultrachrome_drops =
+{
+ &escp2_ultrachrome_low_dropsizes,
+ &escp2_ultrachrome_low_dropsizes,
+ &escp2_ultrachrome_low_dropsizes,
+ &escp2_ultrachrome_720_dropsizes,
+ &escp2_ultrachrome_720_dropsizes,
+ &escp2_ultrachrome_2880_dropsizes,
+ &escp2_ultrachrome_2880_dropsizes,
+ &escp2_ultrachrome_2880_dropsizes,
+};
+
+const escp2_drop_list_t stpi_escp2_variable_3pl_pigment_drops =
+{
+ &escp2_economy_pigment_dropsizes,
+ &escp2_low_pigment_dropsizes,
+ &escp2_low_pigment_dropsizes,
+ &escp2_6pl_pigment_dropsizes,
+ &escp2_3pl_pigment_dropsizes,
+ &escp2_3pl_pigment_2880_dropsizes,
+ &escp2_3pl_pigment_5760_dropsizes,
+ &escp2_3pl_pigment_5760_dropsizes,
+};
+
+const escp2_drop_list_t stpi_escp2_variable_3pl_pigment_c66_drops =
+{
+ &escp2_economy_pigment_c66_dropsizes,
+ &escp2_low_pigment_c66_dropsizes,
+ &escp2_low_pigment_c66_dropsizes,
+ &escp2_6pl_pigment_c66_dropsizes,
+ &escp2_3pl_pigment_c66_dropsizes,
+ &escp2_3pl_pigment_c66_2880_dropsizes,
+ &escp2_3pl_pigment_c66_5760_dropsizes,
+ &escp2_3pl_pigment_c66_5760_dropsizes,
+};
+
+const escp2_drop_list_t stpi_escp2_spro10000_drops =
+{
+ &escp2_spro10000_dropsizes,
+ &escp2_spro10000_dropsizes,
+ &escp2_spro10000_dropsizes,
+ &escp2_spro10000_dropsizes,
+ &escp2_spro10000_dropsizes,
+ &escp2_spro10000_dropsizes,
+ &escp2_spro10000_dropsizes,
+ &escp2_spro10000_dropsizes
+};
diff --git a/src/main/escp2-papers.c b/src/main/escp2-papers.c
new file mode 100644
index 0000000..ce892b4
--- /dev/null
+++ b/src/main/escp2-papers.c
@@ -0,0 +1,1181 @@
+/*
+ * "$Id: escp2-papers.c,v 1.75 2005/07/01 01:40:09 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 eral 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 <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include "print-escp2.h"
+
+static const char standard_sat_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "1.20 1.20 1.30 1.50 1.70 1.90 2.00 2.00 " /* B */
+/* B */ "2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 " /* M */
+/* M */ "2.00 1.80 1.60 1.40 1.20 1.00 1.00 1.00 " /* R */
+/* R */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 1.15 1.40 1.70 2.00 2.30 2.40 2.40 " /* G */
+/* G */ "2.40 2.40 2.40 2.30 2.00 1.70 1.40 1.15 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char standard_lum_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "0.56 0.58 0.62 0.68 0.73 0.78 0.82 0.85 " /* B */
+/* B */ "0.85 0.82 0.78 0.78 0.79 0.80 0.82 0.85 " /* M */
+/* M */ "0.87 0.90 0.94 0.97 1.00 1.00 1.00 1.00 " /* R */
+/* R */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 1.00 1.00 0.99 0.98 0.97 0.95 0.93 " /* G */
+/* G */ "0.90 0.76 0.65 0.58 0.58 0.57 0.56 0.56 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char standard_hue_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"-6\" upper-bound=\"6\">\n"
+/* C */ "0.00 0.00 0.00 -.02 -.04 -.08 -.12 -.16 " /* B */
+/* B */ "-.20 -.24 -.28 -.32 -.32 -.32 -.32 -.32 " /* M */
+/* M */ "-.36 -.40 -.44 -.48 -.50 -.45 -.40 -.30 " /* R */
+/* R */ "-.12 -.07 -.04 -.02 0.00 0.00 0.00 0.00 " /* Y */
+/* Y */ "0.00 -.00 -.03 -.06 -.09 -.13 -.17 -.21 " /* G */
+/* G */ "-.25 -.22 -.19 -.16 -.13 -.10 -.07 -.03 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+
+static const char photo2_sat_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "1.20 1.20 1.30 1.50 1.70 1.90 2.00 2.00 " /* B */
+/* B */ "2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 " /* M */
+/* M */ "2.00 1.80 1.60 1.40 1.20 1.00 1.00 1.00 " /* R */
+/* R */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 1.15 1.40 1.70 2.00 2.30 2.40 2.40 " /* G */
+/* G */ "2.40 2.40 2.40 2.30 2.00 1.70 1.40 1.15 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char photo2_lum_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "0.56 0.58 0.62 0.68 0.73 0.78 0.82 0.85 " /* B */
+/* B */ "0.85 0.82 0.78 0.78 0.79 0.80 0.82 0.85 " /* M */
+/* M */ "0.87 0.90 0.94 0.97 1.00 1.00 1.00 1.00 " /* R */
+/* R */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 1.00 1.00 0.99 0.98 0.97 0.95 0.93 " /* G */
+/* G */ "0.90 0.76 0.65 0.58 0.58 0.57 0.56 0.56 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char photo2_hue_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"-6\" upper-bound=\"6\">\n"
+/* C */ "0.00 0.00 0.00 -.02 -.04 -.08 -.12 -.16 " /* B */
+/* B */ "-.20 -.24 -.28 -.32 -.32 -.32 -.32 -.32 " /* M */
+/* M */ "-.36 -.40 -.44 -.48 -.50 -.45 -.40 -.30 " /* R */
+/* R */ "-.12 -.07 -.04 -.02 0.00 0.00 0.00 0.00 " /* Y */
+/* Y */ "0.00 -.00 -.03 -.06 -.09 -.13 -.17 -.21 " /* G */
+/* G */ "-.25 -.22 -.19 -.16 -.13 -.10 -.07 -.03 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+
+static const char photo3_sat_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "1.00 1.05 1.15 1.25 1.35 1.45 1.50 1.50 " /* B */
+/* B */ "1.50 1.50 1.50 1.50 1.50 1.50 1.50 1.50 " /* M */
+/* M */ "1.50 1.40 1.30 1.20 1.10 1.00 1.00 1.00 " /* R */
+/* R */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 1.10 1.30 1.55 1.80 1.95 2.00 2.00 " /* G */
+/* G */ "2.00 2.00 2.00 1.95 1.80 1.55 1.30 1.10 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char photo3_lum_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "0.60 0.61 0.64 0.68 0.73 0.78 0.82 0.85 " /* B */
+/* B */ "0.85 0.82 0.78 0.78 0.79 0.80 0.82 0.85 " /* M */
+/* M */ "0.87 0.90 0.94 0.97 1.00 1.00 1.00 1.00 " /* R */
+/* R */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 1.00 0.99 0.98 0.96 0.94 0.92 0.88 " /* G */
+/* G */ "0.84 0.72 0.68 0.66 0.64 0.62 0.61 0.60 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char photo3_hue_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"-6\" upper-bound=\"6\">\n"
+/* C */ "0.00 0.00 0.00 -.02 -.04 -.08 -.12 -.16 " /* B */
+/* B */ "-.20 -.24 -.28 -.32 -.32 -.32 -.32 -.32 " /* M */
+/* M */ "-.36 -.40 -.44 -.48 -.50 -.45 -.40 -.30 " /* R */
+/* R */ "-.12 -.07 -.04 -.02 0.00 0.00 0.00 0.00 " /* Y */
+/* Y */ "0.00 -.00 -.00 -.00 -.02 -.04 -.08 -.13 " /* G */
+/* G */ "-.18 -.18 -.19 -.16 -.13 -.10 -.07 -.03 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+
+static const char sp960_sat_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "1.00 1.05 1.15 1.25 1.35 1.45 1.50 1.50 " /* B */
+/* B */ "1.50 1.50 1.50 1.50 1.50 1.50 1.50 1.50 " /* M */
+/* M */ "1.50 1.40 1.30 1.20 1.10 1.00 1.00 1.00 " /* R */
+/* R */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 1.10 1.30 1.55 1.80 1.95 2.00 2.00 " /* G */
+/* G */ "2.00 2.00 2.00 1.95 1.80 1.55 1.30 1.10 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char sp960_lum_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "0.58 0.60 0.65 0.69 0.74 0.79 0.82 0.84 " /* B */
+/* B */ "0.86 0.81 0.76 0.76 0.78 0.79 0.83 0.86 " /* M */
+/* M */ "0.93 0.95 0.97 0.98 1.00 1.00 1.00 1.00 " /* R */
+/* R */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 0.99 0.98 0.97 0.96 0.94 0.93 0.89 " /* G */
+/* G */ "0.86 0.73 0.65 0.58 0.59 0.59 0.58 0.58 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char sp960_hue_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"-6\" upper-bound=\"6\">\n"
+/* C */ "0.00 0.06 0.10 0.10 0.06 0.00 -.06 -.12 " /* B */
+/* B */ "-.18 -.21 -.22 -.23 -.24 -.25 -.26 -.27 " /* M */
+/* M */ "-.28 -.33 -.38 -.45 -.50 -.40 -.30 -.20 " /* R */
+/* R */ "-.12 -.07 -.04 -.02 0.00 0.00 0.00 0.00 " /* Y */
+/* Y */ "0.00 -.00 -.00 -.00 -.00 -.00 -.00 -.00 " /* G */
+/* G */ "-.00 -.00 -.00 -.00 -.00 -.00 -.00 -.00 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char sp960_matte_sat_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "1.00 1.05 1.15 1.25 1.35 1.45 1.50 1.50 " /* B */
+/* B */ "1.50 1.50 1.50 1.50 1.50 1.50 1.50 1.50 " /* M */
+/* M */ "1.50 1.40 1.30 1.20 1.10 1.00 1.00 1.00 " /* R */
+/* R */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 1.10 1.30 1.55 1.80 1.95 2.00 2.00 " /* G */
+/* G */ "2.00 2.00 2.00 1.95 1.80 1.55 1.30 1.10 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char sp960_matte_lum_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "0.58 0.63 0.70 0.75 0.80 0.86 0.88 0.90 " /* B */
+/* B */ "0.90 0.83 0.78 0.78 0.78 0.79 0.83 0.86 " /* M */
+/* M */ "0.93 0.95 0.97 0.98 1.00 1.00 1.00 1.00 " /* R */
+/* R */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 0.99 0.98 0.97 0.96 0.94 0.93 0.89 " /* G */
+/* G */ "0.86 0.73 0.65 0.58 0.59 0.59 0.58 0.58 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char sp960_matte_hue_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"-6\" upper-bound=\"6\">\n"
+/* C */ "0.00 0.06 0.10 0.10 0.06 0.00 -.06 -.12 " /* B */
+/* B */ "-.18 -.21 -.22 -.23 -.24 -.25 -.26 -.27 " /* M */
+/* M */ "-.28 -.33 -.38 -.45 -.50 -.40 -.30 -.20 " /* R */
+/* R */ "-.12 -.07 -.04 -.02 0.00 0.00 0.00 0.00 " /* Y */
+/* Y */ "0.00 -.00 -.00 -.00 -.00 -.00 -.00 -.00 " /* G */
+/* G */ "-.00 -.00 -.00 -.00 -.00 -.00 -.00 -.00 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+
+static const char ultra_matte_sat_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "1.00 1.00 1.00 1.05 1.10 1.15 1.15 1.15 " /* B */
+/* B */ "1.15 1.15 1.15 1.10 1.10 1.05 1.05 1.00 " /* M */
+/* M */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* R */
+/* R */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 1.05 1.15 1.25 1.35 1.45 1.50 1.50 " /* G */
+/* G */ "1.50 1.50 1.50 1.45 1.35 1.25 1.15 1.05 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char ultra_matte_lum_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "0.49 0.51 0.55 0.61 0.67 0.71 0.76 0.79 " /* B */
+/* B */ "0.83 0.80 0.76 0.76 0.78 0.79 0.83 0.86 " /* M */
+/* M */ "0.93 0.95 0.97 0.97 0.97 0.97 0.96 0.96 " /* R */
+/* R */ "0.96 0.97 0.97 0.98 0.99 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 0.98 0.97 0.95 0.94 0.93 0.90 0.86 " /* G */
+/* G */ "0.82 0.69 0.60 0.54 0.52 0.51 0.50 0.49 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char ultra_matte_hue_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"-6\" upper-bound=\"6\">\n"
+/* C */ "0.00 0.06 0.10 0.10 0.06 0.00 -.06 -.12 " /* B */
+/* B */ "-.18 -.21 -.22 -.22 -.22 -.22 -.22 -.22 " /* M */
+/* M */ "-.22 -.28 -.34 -.40 -.50 -.40 -.30 -.20 " /* R */
+/* R */ "-.12 -.07 -.04 -.02 0.00 0.00 0.00 0.00 " /* Y */
+/* Y */ "0.00 -.00 -.03 -.07 -.11 -.15 -.19 -.22 " /* G */
+/* G */ "-.25 -.22 -.19 -.15 -.12 -.10 -.06 -.03 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char ultra_glossy_sat_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "1.00 1.00 1.00 1.05 1.10 1.15 1.15 1.15 " /* B */
+/* B */ "1.15 1.15 1.15 1.10 1.10 1.05 1.05 1.00 " /* M */
+/* M */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* R */
+/* R */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 1.05 1.15 1.25 1.35 1.45 1.50 1.50 " /* G */
+/* G */ "1.50 1.50 1.50 1.45 1.35 1.25 1.15 1.05 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char ultra_glossy_lum_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "0.49 0.53 0.60 0.64 0.69 0.73 0.77 0.80 " /* B */
+/* B */ "0.84 0.81 0.77 0.77 0.78 0.80 0.84 0.87 " /* M */
+/* M */ "0.93 0.95 0.97 0.98 0.98 0.97 0.96 0.96 " /* R */
+/* R */ "0.96 0.97 0.98 0.98 0.99 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 0.98 0.97 0.96 0.95 0.93 0.90 0.87 " /* G */
+/* G */ "0.83 0.69 0.61 0.55 0.53 0.52 0.50 0.49 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char ultra_glossy_hue_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"-6\" upper-bound=\"6\">\n"
+/* C */ "0.00 0.06 0.10 0.10 0.06 0.00 -.06 -.12 " /* B */
+/* B */ "-.18 -.21 -.22 -.22 -.22 -.22 -.22 -.22 " /* M */
+/* M */ "-.22 -.28 -.34 -.40 -.50 -.40 -.30 -.20 " /* R */
+/* R */ "-.12 -.07 -.04 -.02 0.00 0.00 0.00 0.00 " /* Y */
+/* Y */ "0.00 -.00 -.03 -.07 -.11 -.15 -.19 -.22 " /* G */
+/* G */ "-.25 -.22 -.19 -.15 -.12 -.10 -.06 -.03 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+
+static const char r800_matte_sat_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* B */
+/* B */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* M */
+/* M */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* R */
+/* R */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 1.03 1.06 1.09 1.12 1.15 1.18 1.20 " /* G */
+/* G */ "1.20 1.15 1.10 1.05 1.00 1.00 1.00 1.00 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char r800_matte_lum_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "0.75 0.75 0.75 0.75 0.76 0.80 0.85 0.90 " /* B */
+/* B */ "0.90 0.88 0.82 0.78 0.78 0.82 0.85 0.92 " /* M */
+/* M */ "0.98 0.98 0.97 0.97 0.96 0.96 0.96 0.96 " /* R */
+/* R */ "0.96 0.97 0.98 0.98 0.99 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 1.00 1.00 0.99 0.98 0.97 0.96 0.93 " /* G */
+/* G */ "0.88 0.87 0.86 0.85 0.82 0.79 0.76 0.75 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char r800_matte_hue_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"-6\" upper-bound=\"6\">\n"
+/* C */ "0.00 -.07 -.10 -.15 -.19 -.25 -.30 -.35 " /* B */
+/* B */ "-.38 -.38 -.30 -.20 -.10 -.00 0.02 0.02 " /* M */
+/* M */ "-.00 -.00 -.00 -.00 -.00 -.00 -.00 0.00 " /* R */
+/* R */ "0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 " /* Y */
+/* Y */ "0.00 -.00 -.00 -.00 -.00 -.00 -.00 -.00 " /* G */
+/* G */ "-.00 -.00 -.00 -.00 -.00 -.00 -.00 -.00 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char r800_glossy_sat_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* B */
+/* B */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* M */
+/* M */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* R */
+/* R */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 1.03 1.06 1.09 1.12 1.15 1.18 1.20 " /* G */
+/* G */ "1.20 1.15 1.10 1.05 1.00 1.00 1.00 1.00 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+
+static const char r800_glossy_lum_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "0.75 0.75 0.75 0.75 0.76 0.80 0.85 0.90 " /* B */
+/* B */ "0.90 0.88 0.82 0.78 0.78 0.82 0.85 0.92 " /* M */
+/* M */ "0.98 0.98 0.97 0.97 0.96 0.96 0.96 0.96 " /* R */
+/* R */ "0.96 0.97 0.98 0.98 0.99 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 1.00 1.00 0.99 0.98 0.97 0.96 0.93 " /* G */
+/* G */ "0.88 0.87 0.86 0.85 0.82 0.79 0.76 0.75 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char r800_glossy_hue_adj[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"-6\" upper-bound=\"6\">\n"
+/* C */ "0.00 -.07 -.10 -.15 -.19 -.25 -.30 -.35 " /* B */
+/* B */ "-.38 -.38 -.30 -.20 -.10 -.00 0.02 0.02 " /* M */
+/* M */ "-.00 -.00 -.00 -.00 -.00 -.00 -.00 0.00 " /* R */
+/* R */ "0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 " /* Y */
+/* Y */ "0.00 -.00 -.00 -.00 -.00 -.00 -.00 -.00 " /* G */
+/* G */ "-.00 -.00 -.00 -.00 -.00 -.00 -.00 -.00 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+#define DECLARE_PAPERS(name) \
+const paperlist_t stpi_escp2_##name##_paper_list = \
+{ \
+ #name, \
+ sizeof(name##_papers) / sizeof(paper_t), \
+ name##_papers \
+}
+
+#define DECLARE_PAPER_ADJUSTMENTS(name) \
+const paper_adjustment_list_t stpi_escp2_##name##_paper_adjustment_list = \
+{ \
+ #name, \
+ sizeof(name##_adjustments) / sizeof(paper_adjustment_t), \
+ name##_adjustments \
+}
+
+static const paper_adjustment_t standard_adjustments[] =
+{
+ { "Plain", 0.615, .5, 1, .075, .9, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "PlainFast", 0.615, .5, 1, .075, .9, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Postcard", 0.83, .5, 1, .075, .9, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "GlossyFilm", 1.00, 1.0, 1, .15, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Transparency", 1.00, .75, 1, .15, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Envelope", 0.615, .5, 1, .075, .9, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "BackFilm", 1.00, .75, 1, .15, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Matte", 0.85, .8, 1.0, .15, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "MatteHeavy", 1.0, 1.0, 1, .15, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Inkjet", 0.85, .5, 1, .10, .9, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Coated", 1.10, 1.0, 1, .15, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Photo", 1.00, 1.0, 1, .15, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "GlossyPhoto", 1.10, 1.0, 1, .15, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Semigloss", 1.00, 1.0, 1, .15, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Luster", 1.00, 1.0, 1, .15, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "GlossyPaper", 1.00, 1.0, 1, .15, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Ilford", 1.0, 1.0, 1, .15, 1.35, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "ColorLife", 1.00, 1.0, 1, .15, .9, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Other", 0.615, .5, 1, .075, .9, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+};
+
+DECLARE_PAPER_ADJUSTMENTS(standard);
+
+static const paper_adjustment_t photo_adjustments[] =
+{
+ { "Plain", 0.615, .25, 1, .15, .9, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "PlainFast", 0.615, .25, 1, .15, .9, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Postcard", 0.83, .25, 1, .15, .9, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "GlossyFilm", 1.00, 1.0, 1, .2, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Transparency", 1.00, .75, 1, .2, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Envelope", 0.615, .25, 1, .15, .9, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "BackFilm", 1.00, .75, 1, .2, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Matte", 0.85, .8, 1.0, .2, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "MatteHeavy", 1.0, 1.0, 1, .35, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Inkjet", 0.85, .375, 1, .2, .9, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Coated", 1.10, 1.0, 1, .35, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Photo", 1.00, 1.00, 1, .35, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "GlossyPhoto", 1.10, 1.0, 1, .35, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Semigloss", 1.00, 1.0, 1, .35, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Luster", 1.00, 1.0, 1, .35, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "GlossyPaper", 1.00, 1.0, 1, .35, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Ilford", 1.0, 1.0, 1, .35, 1.35, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "ColorLife", 1.00, 1.0, 1, .35, .9, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Other", 0.615, .25, 1, .15, .9, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+};
+
+DECLARE_PAPER_ADJUSTMENTS(photo);
+
+static const paper_adjustment_t photo2_adjustments[] =
+{
+ { "Plain", 0.738, 1.0, 0.5, .1, .9, 1, 1, 1, 1, 1, 1.0,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+ { "PlainFast", 0.738, 1.0, 0.5, .1, .9, 1, 1, 1, 1, 1, 1.0,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+ { "Postcard", 0.83, 1.0, 0.5, .1, .9, 1, 1, 1, 1, 1, 1.0,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+ { "GlossyFilm", 1.00, 1.0, 0.5, .2, .999, 1, 1, 1, 1, 1, 1,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+ { "Transparency", 1.00, 1.0, 0.25, .2, .999, 1, 1, 1, 1, 1, 1,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+ { "Envelope", 0.738, 1.0, 0.5, .1, .9, 1, 1, 1, 1, 1, 1,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+ { "BackFilm", 1.00, 1.0, 0.25, .2, .999, 1, 1, 1, 1, 1, 1,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+ { "Matte", 0.85, 1.0, 0.4, .3, .999, 1, 1, 1, 1, 1, 1,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+ { "MatteHeavy", 0.85, 1.0, .3, .2, .999, 1, 1, 1, 1, 1, 1,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+ { "Inkjet", 0.85, 1.0, 0.5, .15, .9, 1, 1, 1, 1, 1, 1,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+ { "Coated", 1.2, 1.0, .25, .15, .999, .89, 1, 1, .9, 1, 1.,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+ { "Photo", 1.00, 1.0, 0.25, .2, .999, 1, 1, 1, 1, 1, 1,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+ { "GlossyPhoto", 1.0, 1.0, 0.5, .3, .999, .9, .98, 1, .9, 1, 0.92,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+ { "Semigloss", 1.0, 1.0, 0.5, .3, .999, .9, .98, 1, .9, 1, 0.92,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+ { "Luster", 1.0, 1.0, 0.5, .3, .999, .9, .98, 1, .9, 1, 0.92,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+ { "GlossyPaper", 1.00, 1.0, 0.25, .2, .999, 1, 1, 1, 1, 1, 1,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+ { "Ilford", .85, 1.0, 0.25, .2, .999, 1, 1, 1, 1, 1, 1,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+ { "ColorLife", 1.00, 1.0, 0.25, .2, .9, 1, 1, 1, 1, 1, 1,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+ { "Other", 0.738, 1.0, 0.5, .1, .9, 1, 1, 1, 1, 1, 1,
+ photo2_hue_adj, photo2_lum_adj, photo2_sat_adj },
+};
+
+DECLARE_PAPER_ADJUSTMENTS(photo2);
+
+static const paper_adjustment_t photo3_adjustments[] =
+{
+ { "Plain", 0.738, .5, 0.75, .1, .9, 1, .525, .816, .75, 1, 1.0,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+ { "PlainFast", 0.738, .5, 0.75, .1, .9, 1, .525, .816, .75, 1, 1.0,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+ { "Postcard", 0.83, .5, 0.75, .1, .9, 1, .525, .816, .75, 1, 1.0,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+ { "GlossyFilm", 1.00, .5, 0.75, .2, .999, 1, .525, .816, .75, 1, 1,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+ { "Transparency", 1.00, .5, 0.75, .2, .999, 1, .525, .816, .75, 1, 1,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+ { "Envelope", 0.738, .5, 0.75, .1, .9, 1, .525, .816, .75, 1, 1.0,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+ { "BackFilm", 1.00, .5, 0.75, .2, .999, 1, .525, .816, .75, 1, 1,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+ { "Matte", 0.85, .75, 0.75, .3, .999, 1, .525, .816, .75, 1, 1,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+ { "MatteHeavy", 0.85, .75, .3, .2, .999, 1, .525, .816, .75, 1, 1,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+ { "Inkjet", 0.85, .5, 0.75, .15, .9, 1, .525, .816, .75, 1, 1,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+ { "Coated", 1.2, .5, .75, .15, .999, 1, .525, .816, .75, 1, 1,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+ { "Photo", 1.00, .5, 0.75, .2, .999, 1, .525, .816, .75, 1, 1,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+ { "GlossyPhoto", 1.0, .25, 0.5, .3, .999, 1, .6, .82, .66, 1, 0.85,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+ { "Semigloss", 1.0, .25, 0.5, .3, .999, 1, .525, .816, .75, 1, 0.92,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+ { "Luster", 1.0, .25, 0.5, .3, .999, 1, .525, .816, .75, 1, 0.92,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+ { "GlossyPaper", 1.00, .5, 0.75, .2, .999, 1, .525, .816, .75, 1, 1,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+ { "Ilford", .85, .5, 0.75, .2, .999, 1, .525, .816, .75, 1, 1,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+ { "ColorLife", 1.00, .5, 0.75, .2, .9, 1, .525, .816, .75, 1, 1,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+ { "Other", 0.738, .5, 0.75, .1, .9, 1, .525, .816, .75, 1, 1,
+ photo3_hue_adj, photo3_lum_adj, photo3_sat_adj },
+};
+
+DECLARE_PAPER_ADJUSTMENTS(photo3);
+
+static const paper_adjustment_t sp960_adjustments[] =
+{
+ { "Plain", 0.86, .2, 0.4, .1, .9, .9, 1, 1, 1, 1, 1,
+ sp960_matte_hue_adj, sp960_matte_lum_adj, sp960_matte_sat_adj },
+ { "PlainFast", 0.86, .2, 0.4, .1, .9, 1, 1, 1, 1, 1, 1,
+ sp960_matte_hue_adj, sp960_matte_lum_adj, sp960_matte_sat_adj },
+ { "Postcard", 0.90, .2, 0.4, .1, .9, .9, 1, 1, 1, 1, 1,
+ sp960_matte_hue_adj, sp960_matte_lum_adj, sp960_matte_sat_adj },
+ { "GlossyFilm", 0.9, .3, 0.4, .2, .999, 1, 1, 1, 1, 1, 1,
+ sp960_matte_hue_adj, sp960_matte_lum_adj, sp960_matte_sat_adj },
+ { "Transparency", 0.9, .2, 0.4, .1, .9, 1, 1, 1, 1, 1, 1,
+ sp960_matte_hue_adj, sp960_matte_lum_adj, sp960_matte_sat_adj },
+ { "Envelope", 0.86, .2, 0.4, .1, .9, 1, 1, 1, 1, 1, 1,
+ sp960_matte_hue_adj, sp960_matte_lum_adj, sp960_matte_sat_adj },
+ { "BackFilm", 0.9, .2, 0.4, .1, .9, 1, 1, 1, 1, 1, 1,
+ sp960_matte_hue_adj, sp960_matte_lum_adj, sp960_matte_sat_adj },
+ { "Matte", 0.9, .25, 0.4, .2, .9, 1, 1, 1, 1, 1, 1,
+ sp960_matte_hue_adj, sp960_matte_lum_adj, sp960_matte_sat_adj },
+ { "MatteHeavy", 0.9, .3, 0.4, .2, .999, 1, 1, 1, 1, 1, 1,
+ sp960_matte_hue_adj, sp960_matte_lum_adj, sp960_matte_sat_adj },
+ { "Inkjet", 0.9, .2, 0.4, .15, .9, 1, 1, 1, 1, 1, 1,
+ sp960_matte_hue_adj, sp960_matte_lum_adj, sp960_matte_sat_adj },
+ { "Coated", 0.9, .3, 0.4, .2, .999, 1, 1, 1, 1, 1, 1,
+ sp960_matte_hue_adj, sp960_matte_lum_adj, sp960_matte_sat_adj },
+ { "Photo", 0.9, .3, 0.4, .2, .999, 1, 1, 1, 1, 1, 1,
+ sp960_matte_hue_adj, sp960_matte_lum_adj, sp960_matte_sat_adj },
+ { "GlossyPhoto", 0.9, .3, 0.4, .2, .999, 1, 1, 1, 1, 1, 1,
+ sp960_hue_adj, sp960_lum_adj, sp960_sat_adj },
+ { "Semigloss", 0.9, .3, 0.4, .2, .999, 1, 1, 1, 1, 1, 1,
+ sp960_hue_adj, sp960_lum_adj, sp960_sat_adj },
+ { "Luster", 0.9, .3, 0.4, .2, .999, 1, 1, 1, 1, 1, 1,
+ sp960_hue_adj, sp960_lum_adj, sp960_sat_adj },
+ { "GlossyPaper", 0.9, .3, 0.4, .15, .9, 1, 1, 1, 1, 1, 1,
+ sp960_matte_hue_adj, sp960_matte_lum_adj, sp960_matte_sat_adj },
+ { "Ilford", 0.85, .3, 0.4, .15, 1.35, 1, 1, 1, 1, 1, 1,
+ sp960_matte_hue_adj, sp960_matte_lum_adj, sp960_matte_sat_adj },
+ { "ColorLife", 0.9, .3, 0.4, .15, .9, 1, 1, 1, 1, 1, 1,
+ sp960_matte_hue_adj, sp960_matte_lum_adj, sp960_matte_sat_adj },
+ { "Other", 0.86, .2, 0.4, .1, .9, 1, 1, 1, 1, 1, 1,
+ sp960_matte_hue_adj, sp960_matte_lum_adj, sp960_matte_sat_adj },
+};
+
+DECLARE_PAPER_ADJUSTMENTS(sp960);
+
+static const paper_adjustment_t ultrachrome_photo_adjustments[] =
+{
+ { "Plain", 0.72, .1, 1, .01, 1.5, 1, 1, 1, 1, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "PlainFast", 0.72, .1, 1, .01, 1.5, 1, 1, 1, 1, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "Postcard", 0.72, .1, 1, .01, 1.5, 1, 1, 1, 1, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "GlossyFilm", 0.83, 1.0, 1, .01, 1.5, 1, 1, 1, 1, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "Transparency", 0.83, .75, 1, .01, 1.5, 1, 1, 1, 1, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "Envelope", 0.72, .1, 1, .01, 1.5, 1, 1, 1, 1, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "BackFilm", 0.83, .75, 1, .01, 1.5, 1, 1, 1, 1, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "Matte", 0.92, 0.4, 1, .01, 1.5, 1, 1, 1, 1, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "MatteHeavy", 0.92, 0.4, 1, .01, 1.5, 1, 1, 1, 1, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "Inkjet", 0.72, .5, 1, .01, 1.5, 1, 1, 1, 1, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "Coated", 0.83, .5, 1, .01, 1.5, 1, 1, 1, 1, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "Photo", 1.0, .75, 1, .01, 1.5, 1, 1, 1, 1, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "GlossyPhoto", 0.72, 1, 1, .01, 1.8, 1, 1, 1, 1, 1, .92,
+ ultra_glossy_hue_adj, ultra_glossy_lum_adj, ultra_glossy_sat_adj },
+ { "Semigloss", 0.72, .8, 1, .01, 1.8, 1, 1, 1, 1, 1, .92,
+ ultra_glossy_hue_adj, ultra_glossy_lum_adj, ultra_glossy_sat_adj },
+ { "Luster", 0.72, .8, 1, .01, 1.8, 1, 1, 1, 1, 1, .92,
+ ultra_glossy_hue_adj, ultra_glossy_lum_adj, ultra_glossy_sat_adj },
+ { "ArchivalMatte", 0.92, .4, 1, .01, 1.5, 1, 1, 1, 1, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "WaterColorRadiant", 0.92, .4, 1, .01, 1.5, 1, 1, 1, 1, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "GlossyPaper", 0.83, 1.0, 1, .01, 1.5, 1, 1, 1, 1, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "Ilford", 0.83, 1.0, 1, .01, 1.5, 1, 1, 1, 1, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "ColorLife", 0.83, 1.0, 1, .01, 1.5, 1, 1, 1, 1, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "Other", 0.72, .1, 1, .01, 1.5, 1, 1, 1, 1, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+};
+
+DECLARE_PAPER_ADJUSTMENTS(ultrachrome_photo);
+
+static const paper_adjustment_t ultrachrome_matte_adjustments[] =
+{
+ { "Plain", 0.72, .1, 1, 0, 0.5, 1, 1, 1, .6, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "PlainFast", 0.72, .1, 1, 0, 0.5, 1, 1, 1, .6, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "Postcard", 0.72, .1, 1, 0, 0.5, 1, 1, 1, .6, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "GlossyFilm", 0.83, .5, 1, 0.01, 0.5, 1, 1, 1, .6, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "Transparency", 0.83, .5, 1, 0.01, 0.5, 1, 1, 1, .6, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "Envelope", 0.72, .1, 1, 0, 0.5, 1, 1, 1, .6, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "BackFilm", 0.83, .5, 1, 0.01, 0.5, 1, 1, 1, .6, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "Matte", 0.92, 0.4, 1, 0.00, 1.25, 1, 1, 1, .6, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "MatteHeavy", 0.92, 0.4, .4, .01, 0.5, 1, 1, 1, .6, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "Inkjet", 0.72, .3, 1, .01, 0.5, 1, 1, 1, .6, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "Coated", 0.83, .4, 1, .01, 0.5, 1, 1, 1, .6, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "Photo", 1.0, 0.5, 1, 0.01, 0.5, 1, 1, 1, .6, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "GlossyPhoto", 0.72, 1, 1, .01, 0.5, 1, 1, 1, .6, 1, .92,
+ ultra_glossy_hue_adj, ultra_glossy_lum_adj, ultra_glossy_sat_adj },
+ { "Semigloss", 0.72, .8, 1, .01, 0.5, 1, 1, 1, .6, 1, .92,
+ ultra_glossy_hue_adj, ultra_glossy_lum_adj, ultra_glossy_sat_adj },
+ { "Luster", 0.72, .8, 1, .01, 0.5, 1, 1, 1, 1, .5, .92,
+ ultra_glossy_hue_adj, ultra_glossy_lum_adj, ultra_glossy_sat_adj },
+ { "WaterColorRadiant", 0.92, 0.4, 1, .01, 0.5, 1, 1, 1, .6, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "GlossyPaper", 0.83, 0.5, 1, 0.01, 0.5, 1, 1, 1, .6, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "Ilford", 0.83, 0.5, 1, 0.01, 0.5, 1, 1, 1, .6, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "ColorLife", 0.83, 0.5, 1, 0.01, 0.5, 1, 1, 1, .6, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+ { "Other", 0.72, .1, .4, 0, 0.5, 1, 1, 1, .6, 1, 1.0,
+ ultra_matte_hue_adj, ultra_matte_lum_adj, ultra_matte_sat_adj },
+};
+
+DECLARE_PAPER_ADJUSTMENTS(ultrachrome_matte);
+
+static const paper_adjustment_t r800_photo_adjustments[] =
+{
+ { "Plain", 0.72, .1, 1, .1, 0.5, .882, 1, .300, 1, 1, 1.0,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "PlainFast", 0.72, .1, 1, .1, 0.5, .882, 1, .300, 1, 1, 1.0,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "Postcard", 0.72, .1, 1, .1, 0.5, .882, 1, .300, 1, 1, 1.0,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "GlossyFilm", 0.83, 1.0, 1, .1, 0.5, .882, 1, .300, 1, 1, 1.0,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "Transparency", 0.83, .75, 1, .1, 0.5, .882, 1, .300, 1, 1, 1.0,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "Envelope", 0.72, .1, 1, .1, 0.5, .882, 1, .300, 1, 1, 1.0,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "BackFilm", 0.83, .75, 1, .1, 0.5, .882, 1, .300, 1, 1, 1.0,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "Glossy", 0.92, 0.4, 1, .1, 0.5, .882, 1, .300, 1, 1, 1.0,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "GlossyHeavy", 0.92, 0.4, 1, .1, 0.5, .882, 1, .300, 1, 1, 1.0,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "Inkjet", 0.72, .5, 1, .1, 0.5, .882, 1, .300, 1, 1, 1.0,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "Coated", 0.83, .5, 1, .1, 0.5, .882, 1, .300, 1, 1, 1.0,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "Photo", 1.0, .75, 1, .1, 0.5, .882, 1, .300, 1, 1, 1.0,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "GlossyPhoto", 0.72, 1, 1, .1, 0.5, .882, 1, .300, 1, 1, 0.92,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "Semigloss", 0.72, .8, 1, .1, 0.5, .882, 1, .300, 1, 1, 0.92,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "Luster", 0.72, .8, 1, .1, .5, .882, 1, .300, 1, 1, 0.92,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "ArchivalGlossy", 0.92, .4, 1, .1, 0.5, .882, 1, .300, 1, 1, 1.0,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "WaterColorRadiant", 0.92, .4, 1, .1, 0.5, .882, 1, .300, 1, 1, 1.0,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "GlossyPaper", 0.83, 1.0, 1, .1, 0.5, .882, 1, .300, 1, 1, 1.0,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "Ilford", 0.83, 1.0, 1, .1, 0.5, .882, 1, .300, 1, 1, 1.0,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "ColorLife", 0.83, 1.0, 1, .1, 0.5, .882, 1, .300, 1, 1, 1.0,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "Other", 0.72, .1, 1, .1, 0.5, .882, 1, .300, 1, 1, 1.0,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+};
+
+DECLARE_PAPER_ADJUSTMENTS(r800_photo);
+
+static const paper_adjustment_t r800_matte_adjustments[] =
+{
+ { "Plain", 0.72, .1, .5, .025, .5, .882, 1, .300, .6, 1, 1.0,
+ r800_matte_hue_adj, r800_matte_lum_adj, r800_matte_sat_adj },
+ { "PlainFast", 0.72, .1, .5, .025, .5, .882, 1, .300, .6, 1, 1.0,
+ r800_matte_hue_adj, r800_matte_lum_adj, r800_matte_sat_adj },
+ { "Postcard", 0.72, .1, .5, .025, .5, .882, 1, .300, .6, 1, 1.0,
+ r800_matte_hue_adj, r800_matte_lum_adj, r800_matte_sat_adj },
+ { "GlossyFilm", 0.83, .5, .5, .025, .5, .882, 1, .300, .6, 1, 1.0,
+ r800_matte_hue_adj, r800_matte_lum_adj, r800_matte_sat_adj },
+ { "Transparency", 0.83, .5, .5, .025, .5, .882, 1, .300, .6, 1, 1.0,
+ r800_matte_hue_adj, r800_matte_lum_adj, r800_matte_sat_adj },
+ { "Envelope", 0.72, .1, .5, .025, .5, .882, 1, .300, .6, 1, 1.0,
+ r800_matte_hue_adj, r800_matte_lum_adj, r800_matte_sat_adj },
+ { "BackFilm", 0.83, .5, .5, .025, .5, .882, 1, .300, .6, 1, 1.0,
+ r800_matte_hue_adj, r800_matte_lum_adj, r800_matte_sat_adj },
+ { "Matte", 0.92, 0.4, .5, .025, .5, .882, 1, .300, .6, 1, 1.0,
+ r800_matte_hue_adj, r800_matte_lum_adj, r800_matte_sat_adj },
+ { "MatteHeavy", 0.92, 0.4, .4, .01, .5, .882, 1, .300, .6, 1, 1.0,
+ r800_matte_hue_adj, r800_matte_lum_adj, r800_matte_sat_adj },
+ { "Inkjet", 0.72, .3, .5, .025, .5, .882, 1, .300, .6, 1, 1.0,
+ r800_matte_hue_adj, r800_matte_lum_adj, r800_matte_sat_adj },
+ { "Coated", 0.83, .4, .5, .025, .5, .882, 1, .300, .6, 1, 1.0,
+ r800_matte_hue_adj, r800_matte_lum_adj, r800_matte_sat_adj },
+ { "Photo", 1.0, 0.5, .5, .025, .5, .882, 1, .300, .6, 1, 1.0,
+ r800_matte_hue_adj, r800_matte_lum_adj, r800_matte_sat_adj },
+ { "GlossyPhoto", 0.72, 1, .5, .025, .5, .882, 1, .300, .6, 1, 0.92,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "Semigloss", 0.72, .8, .5, .025, .5, .882, 1, .300, .6, 1, 0.92,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "Luster", 0.72, .8, .5, .025, .5, .882, 1, .300, .6, 1, 0.92,
+ r800_glossy_hue_adj, r800_glossy_lum_adj, r800_glossy_sat_adj },
+ { "WaterColorRadiant", 0.92, 0.4, .5, .025, .5, .882, 1, .300, .6, 1, 1.0,
+ r800_matte_hue_adj, r800_matte_lum_adj, r800_matte_sat_adj },
+ { "GlossyPaper", 0.83, 0.5, .5, .025, .5, .882, 1, .300, .6, 1, 1.0,
+ r800_matte_hue_adj, r800_matte_lum_adj, r800_matte_sat_adj },
+ { "Ilford", 0.83, 0.5, .5, .025, .5, .882, 1, .300, .6, 1, 1.0,
+ r800_matte_hue_adj, r800_matte_lum_adj, r800_matte_sat_adj },
+ { "ColorLife", 0.83, 0.5, .5, .025, .5, .882, 1, .300, .6, 1, 1.0,
+ r800_matte_hue_adj, r800_matte_lum_adj, r800_matte_sat_adj },
+ { "Other", 0.72, .1, .5, .025, .5, .882, 1, .300, .6, 1, 1.0,
+ r800_matte_hue_adj, r800_matte_lum_adj, r800_matte_sat_adj },
+};
+
+DECLARE_PAPER_ADJUSTMENTS(r800_matte);
+
+static const paper_adjustment_t durabrite_adjustments[] =
+{
+ { "Plain", 1.0, .5, .5, .05, .9, 1, 1, 1, 1, 1, 1.0,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "PlainFast", 1.0, .5, .5, .05, .9, 1, 1, 1, 1, 1, 1.0,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Postcard", 1.0, .5, 1, .05, .9, 1, 1, 1, 1, 1, 1.0,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "GlossyFilm", 0.8, 1.0, 1, .05, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Transparency", 0.8, .75, 1, .05, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Envelope", 1.0, .5, 1, .05, .9, 1, 1, 1, 1, 1, 1.0,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "BackFilm", 0.8, .75, 1, .05, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Matte", 0.9, .5, .5, .075, .999, 1, .975, .975, 1, 1, 1.1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "MatteHeavy", 0.9, .5, .5, .075, .999, 1, .975, .975, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Inkjet", 1.0, .5, .5, .05, .9, 1, 1, 1, 1, 1, 1.0,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Coated", 1.0, .5, .5, .075, .999, 1, 1, 1, 1, 1, 1.1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Photo", .833, .5, .5, .075, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "GlossyPhoto", .833, 1.0, 1, .15, .999, 1, 1, 1, 1, 1, .92,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Semigloss", .833, 1.0, 1, .15, .999, 1, 1, 1, 1, 1, .92,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Luster", .833, 1.0, 1, .15, .999, 1, 1, 1, 1, 1, .92,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "GlossyPaper", .833, 1.0, 1, .15, .999, 1, 1, 1, 1, 1, 1.0,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Ilford", .833, 1.0, 1, .15, 1.35, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "ColorLife", .833, 1.0, 1, .15, .9, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Other", 1.0, .5, 1, .05, .9, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+};
+
+DECLARE_PAPER_ADJUSTMENTS(durabrite);
+
+static const paper_adjustment_t durabrite2_adjustments[] =
+{
+ { "Plain", 1.0, .5, .5, .05, .9, 1, 1, 1, 1, 1, 1.0,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "PlainFast", 1.0, .5, .5, .05, .9, 1, 1, 1, 1, 1, 1.0,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Postcard", 1.0, .5, 1, .05, .9, 1, 1, 1, 1, 1, 1.0,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "GlossyFilm", 0.8, 1.0, 1, .05, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Transparency", 0.8, .75, 1, .05, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Envelope", 1.0, .5, 1, .05, .9, 1, 1, 1, 1, 1, 1.0,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "BackFilm", 0.8, .75, 1, .05, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Matte", 0.9, .5, .5, .075, .999, 1, .975, .975, 1, 1, 1.0,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "MatteHeavy", 0.9, .5, .5, .075, .999, 1, .975, .975, 1, 1, 1.0,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Inkjet", 1.0, .5, .5, .05, .9, 1, 1, 1, 1, 1, 1.0,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Coated", 1.0, .5, .5, .075, .999, 1, 1, 1, 1, 1, 1.0,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Photo", .833, .5, .5, .075, .999, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "GlossyPhoto", .833, 1.0, 1, .15, .999, 1, 1, 1, 1, 1, .92,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Semigloss", .833, 1.0, 1, .15, .999, 1, 1, 1, 1, 1, .92,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Luster", .833, 1.0, 1, .15, .999, 1, 1, 1, 1, 1, .92,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "GlossyPaper", .833, 1.0, 1, .15, .999, 1, 1, 1, 1, 1, 1.0,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Ilford", .833, 1.0, 1, .15, 1.35, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "ColorLife", .833, 1.0, 1, .15, .9, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+ { "Other", 1.0, .5, 1, .05, .9, 1, 1, 1, 1, 1, 1,
+ standard_hue_adj, standard_lum_adj, standard_sat_adj },
+};
+
+DECLARE_PAPER_ADJUSTMENTS(durabrite2);
+
+static const paper_t standard_papers[] =
+{
+ { "Plain", N_("Plain Paper"), PAPER_PLAIN,
+ 1, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+ { "PlainFast", N_("Plain Paper Fast Load"), PAPER_PLAIN,
+ 5, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+ { "Postcard", N_("Postcard"), PAPER_PLAIN,
+ 2, 0, 0x00, 0x00, 0x02, NULL, NULL },
+ { "GlossyFilm", N_("Glossy Film"), PAPER_PHOTO,
+ 3, 0, 0x6d, 0x00, 0x01, NULL, NULL },
+ { "Transparency", N_("Transparencies"), PAPER_TRANSPARENCY,
+ 3, 0, 0x6d, 0x00, 0x02, NULL, NULL },
+ { "Envelope", N_("Envelopes"), PAPER_PLAIN,
+ 4, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+ { "BackFilm", N_("Back Light Film"), PAPER_TRANSPARENCY,
+ 6, 0, 0x6d, 0x00, 0x01, NULL, NULL },
+ { "Matte", N_("Matte Paper"), PAPER_GOOD,
+ 7, 0, 0x00, 0x00, 0x02, NULL, NULL },
+ { "MatteHeavy", N_("Matte Paper Heavyweight"), PAPER_GOOD,
+ 7, 0, 0x00, 0x00, 0x02, NULL, NULL },
+ { "Inkjet", N_("Inkjet Paper"), PAPER_GOOD,
+ 7, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+ { "Coated", N_("Photo Quality Inkjet Paper"), PAPER_GOOD,
+ 7, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+ { "Photo", N_("Photo Paper"), PAPER_PHOTO,
+ 8, 0, 0x67, 0x00, 0x02, NULL, NULL },
+ { "GlossyPhoto", N_("Premium Glossy Photo Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, NULL, NULL },
+ { "Semigloss", N_("Premium Semigloss Photo Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, NULL, NULL },
+ { "Luster", N_("Premium Luster Photo Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, NULL, NULL },
+ { "GlossyPaper", N_("Photo Quality Glossy Paper"), PAPER_PREMIUM_PHOTO,
+ 6, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+ { "Ilford", N_("Ilford Heavy Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, NULL, NULL },
+ { "ColorLife", N_("ColorLife Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x67, 0x00, 0x02, NULL, NULL },
+ { "Other", N_("Other"), PAPER_PLAIN,
+ 0, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+};
+
+DECLARE_PAPERS(standard);
+
+static const paper_t durabrite_papers[] =
+{
+ { "Plain", N_("Plain Paper"), PAPER_PLAIN,
+ 1, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+ { "PlainFast", N_("Plain Paper Fast Load"), PAPER_PLAIN,
+ 5, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+ { "Postcard", N_("Postcard"), PAPER_PLAIN,
+ 2, 0, 0x00, 0x00, 0x02, NULL, NULL },
+ { "GlossyFilm", N_("Glossy Film"), PAPER_PHOTO,
+ 3, 0, 0x6d, 0x00, 0x01, NULL, NULL },
+ { "Transparency", N_("Transparencies"), PAPER_TRANSPARENCY,
+ 3, 0, 0x6d, 0x00, 0x02, NULL, NULL },
+ { "Envelope", N_("Envelopes"), PAPER_PLAIN,
+ 4, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+ { "BackFilm", N_("Back Light Film"), PAPER_TRANSPARENCY,
+ 6, 0, 0x6d, 0x00, 0x01, NULL, NULL },
+ { "Matte", N_("Matte Paper"), PAPER_GOOD,
+ 7, 0, 0x00, 0x00, 0x02, NULL, NULL },
+ { "MatteHeavy", N_("Matte Paper Heavyweight"), PAPER_GOOD,
+ 7, 0, 0x00, 0x00, 0x02, NULL, NULL },
+ { "Inkjet", N_("Inkjet Paper"), PAPER_GOOD,
+ 7, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+ { "Coated", N_("Photo Quality Inkjet Paper"), PAPER_GOOD,
+ 7, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+ { "Photo", N_("Photo Paper"), PAPER_PHOTO,
+ 8, 0, 0x67, 0x00, 0x02, "RGB", NULL },
+ { "GlossyPhoto", N_("Premium Glossy Photo Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, "RGB", NULL },
+ { "Semigloss", N_("Premium Semigloss Photo Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, "RGB", NULL },
+ { "Luster", N_("Premium Luster Photo Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, "RGB", NULL },
+ { "GlossyPaper", N_("Photo Quality Glossy Paper"), PAPER_PHOTO,
+ 6, 0, 0x6b, 0x1a, 0x01, "RGB", NULL },
+ { "Ilford", N_("Ilford Heavy Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, NULL, NULL },
+ { "ColorLife", N_("ColorLife Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x67, 0x00, 0x02, NULL, NULL },
+ { "Other", N_("Other"), PAPER_PLAIN,
+ 0, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+};
+
+DECLARE_PAPERS(durabrite);
+
+static const paper_t ultrachrome_papers[] =
+{
+ { "Plain", N_("Plain Paper"), PAPER_PLAIN,
+ 1, 0, 0x6b, 0x1a, 0x01, NULL, "UltraMatte" },
+ { "PlainFast", N_("Plain Paper Fast Load"), PAPER_PLAIN,
+ 5, 0, 0x6b, 0x1a, 0x01, NULL, "UltraMatte" },
+ { "Postcard", N_("Postcard"), PAPER_PLAIN,
+ 2, 0, 0x00, 0x00, 0x02, NULL, "UltraMatte" },
+ { "GlossyFilm", N_("Glossy Film"), PAPER_PHOTO,
+ 3, 0, 0x6d, 0x00, 0x01, NULL, "UltraPhoto" },
+ { "Transparency", N_("Transparencies"), PAPER_TRANSPARENCY,
+ 3, 0, 0x6d, 0x00, 0x02, NULL, "UltraPhoto" },
+ { "Envelope", N_("Envelopes"), PAPER_PLAIN,
+ 4, 0, 0x6b, 0x1a, 0x01, NULL, "UltraMatte" },
+ { "BackFilm", N_("Back Light Film"), PAPER_TRANSPARENCY,
+ 6, 0, 0x6d, 0x00, 0x01, NULL, "UltraPhoto" },
+ { "Matte", N_("Matte Paper"), PAPER_GOOD,
+ 7, 0, 0x00, 0x00, 0x02, NULL, "UltraMatte" },
+ { "MatteHeavy", N_("Matte Paper Heavyweight"), PAPER_GOOD,
+ 7, 0, 0x00, 0x00, 0x02, NULL, "UltraMatte" },
+ { "Inkjet", N_("Inkjet Paper"), PAPER_GOOD,
+ 7, 0, 0x6b, 0x1a, 0x01, NULL, "UltraMatte" },
+ { "Coated", N_("Photo Quality Inkjet Paper"), PAPER_GOOD,
+ 7, 0, 0x6b, 0x1a, 0x01, NULL, "UltraPhoto" },
+ { "Photo", N_("Photo Paper"), PAPER_PHOTO,
+ 8, 0, 0x67, 0x00, 0x02, NULL, "UltraPhoto" },
+ { "GlossyPhoto", N_("Premium Glossy Photo Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, NULL, "UltraPhoto" },
+ { "Semigloss", N_("Premium Semigloss Photo Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, NULL, "UltraPhoto" },
+ { "Luster", N_("Premium Luster Photo Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, NULL, "UltraPhoto" },
+ { "ArchivalMatte", N_("Archival Matte Paper"), PAPER_PREMIUM_PHOTO,
+ 7, 0, 0x00, 0x00, 0x02, NULL, "UltraMatte" },
+ { "WaterColorRadiant", N_("Watercolor Paper - Radiant White"), PAPER_PREMIUM_PHOTO,
+ 7, 0, 0x00, 0x00, 0x02, NULL, "UltraMatte" },
+ { "GlossyPaper", N_("Photo Quality Glossy Paper"), PAPER_PHOTO,
+ 6, 0, 0x6b, 0x1a, 0x01, NULL, "UltraPhoto" },
+ { "Ilford", N_("Ilford Heavy Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, NULL, "UltraMatte" },
+ { "ColorLife", N_("ColorLife Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x67, 0x00, 0x02, NULL, "UltraPhoto" },
+ { "Other", N_("Other"), PAPER_PLAIN,
+ 0, 0, 0x6b, 0x1a, 0x01, NULL, "UltraMatte" },
+};
+
+DECLARE_PAPERS(ultrachrome);
+
+static const paper_t durabrite2_papers[] =
+{
+ { "Plain", N_("Plain Paper"), PAPER_PLAIN,
+ 1, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+ { "PlainFast", N_("Plain Paper Fast Load"), PAPER_PLAIN,
+ 5, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+ { "Postcard", N_("Postcard"), PAPER_PLAIN,
+ 2, 0, 0x00, 0x00, 0x02, NULL, NULL },
+ { "GlossyFilm", N_("Glossy Film"), PAPER_PHOTO,
+ 3, 0, 0x6d, 0x00, 0x01, NULL, NULL },
+ { "Transparency", N_("Transparencies"), PAPER_TRANSPARENCY,
+ 3, 0, 0x6d, 0x00, 0x02, NULL, NULL },
+ { "Envelope", N_("Envelopes"), PAPER_PLAIN,
+ 4, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+ { "BackFilm", N_("Back Light Film"), PAPER_TRANSPARENCY,
+ 6, 0, 0x6d, 0x00, 0x01, NULL, NULL },
+ { "Matte", N_("Matte Paper"), PAPER_GOOD,
+ 7, 0, 0x00, 0x00, 0x02, NULL, NULL },
+ { "MatteHeavy", N_("Matte Paper Heavyweight"), PAPER_GOOD,
+ 7, 0, 0x00, 0x00, 0x02, NULL, NULL },
+ { "Inkjet", N_("Inkjet Paper"), PAPER_GOOD,
+ 7, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+ { "Coated", N_("Photo Quality Inkjet Paper"), PAPER_GOOD,
+ 7, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+ { "Photo", N_("Photo Paper"), PAPER_PHOTO,
+ 8, 0, 0x67, 0x00, 0x02, NULL, NULL },
+ { "GlossyPhoto", N_("Premium Glossy Photo Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, NULL, NULL },
+ { "Semigloss", N_("Premium Semigloss Photo Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, NULL, NULL },
+ { "Luster", N_("Premium Luster Photo Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, NULL, NULL },
+ { "GlossyPaper", N_("Photo Quality Glossy Paper"), PAPER_PHOTO,
+ 6, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+ { "Ilford", N_("Ilford Heavy Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, NULL, NULL },
+ { "ColorLife", N_("ColorLife Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x67, 0x00, 0x02, NULL, NULL },
+ { "Other", N_("Other"), PAPER_PLAIN,
+ 0, 0, 0x6b, 0x1a, 0x01, NULL, NULL },
+};
+
+DECLARE_PAPERS(durabrite2);
+
+static const paper_t r800_papers[] =
+{
+ { "Plain", N_("Plain Paper"), PAPER_PLAIN,
+ 1, 0, 0x6b, 0x1a, 0x01, NULL, "r800Matte" },
+ { "PlainFast", N_("Plain Paper Fast Load"), PAPER_PLAIN,
+ 5, 0, 0x6b, 0x1a, 0x01, NULL, "r800Matte" },
+ { "Postcard", N_("Postcard"), PAPER_PLAIN,
+ 2, 0, 0x00, 0x00, 0x02, NULL, "r800Matte" },
+ { "GlossyFilm", N_("Glossy Film"), PAPER_PHOTO,
+ 3, 0, 0x6d, 0x00, 0x01, NULL, "r800Photo" },
+ { "Transparency", N_("Transparencies"), PAPER_TRANSPARENCY,
+ 3, 0, 0x6d, 0x00, 0x02, NULL, "r800Photo" },
+ { "Envelope", N_("Envelopes"), PAPER_PLAIN,
+ 4, 0, 0x6b, 0x1a, 0x01, NULL, "r800Matte" },
+ { "BackFilm", N_("Back Light Film"), PAPER_TRANSPARENCY,
+ 6, 0, 0x6d, 0x00, 0x01, NULL, "r800Photo" },
+ { "Matte", N_("Matte Paper"), PAPER_GOOD,
+ 7, 0, 0x00, 0x00, 0x02, NULL, "r800Matte" },
+ { "MatteHeavy", N_("Matte Paper Heavyweight"), PAPER_GOOD,
+ 7, 0, 0x00, 0x00, 0x02, NULL, "r800Matte" },
+ { "Inkjet", N_("Inkjet Paper"), PAPER_GOOD,
+ 7, 0, 0x6b, 0x1a, 0x01, NULL, "r800Matte" },
+ { "Coated", N_("Photo Quality Inkjet Paper"), PAPER_GOOD,
+ 7, 0, 0x6b, 0x1a, 0x01, NULL, "r800Photo" },
+ { "Photo", N_("Photo Paper"), PAPER_PHOTO,
+ 8, 0, 0x67, 0x00, 0x02, NULL, "r800Photo" },
+ { "GlossyPhoto", N_("Premium Glossy Photo Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, NULL, "r800Photo" },
+ { "Semigloss", N_("Premium Semigloss Photo Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, NULL, "r800Photo" },
+ { "Luster", N_("Premium Luster Photo Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, NULL, "r800Photo" },
+ { "ArchivalMatte", N_("Archival Matte Paper"), PAPER_PREMIUM_PHOTO,
+ 7, 0, 0x00, 0x00, 0x02, NULL, "r800Matte" },
+ { "WaterColorRadiant", N_("Watercolor Paper - Radiant White"), PAPER_PREMIUM_PHOTO,
+ 7, 0, 0x00, 0x00, 0x02, NULL, "r800Matte" },
+ { "GlossyPaper", N_("Photo Quality Glossy Paper"), PAPER_PHOTO,
+ 6, 0, 0x6b, 0x1a, 0x01, NULL, "r800Photo" },
+ { "Ilford", N_("Ilford Heavy Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x80, 0x00, 0x02, NULL, "r800Matte" },
+ { "ColorLife", N_("ColorLife Paper"), PAPER_PREMIUM_PHOTO,
+ 8, 0, 0x67, 0x00, 0x02, NULL, "r800Photo" },
+ { "Other", N_("Other"), PAPER_PLAIN,
+ 0, 0, 0x6b, 0x1a, 0x01, NULL, "r800Matte" },
+};
+
+DECLARE_PAPERS(r800);
diff --git a/src/main/escp2-resolutions.c b/src/main/escp2-resolutions.c
new file mode 100644
index 0000000..17535c2
--- /dev/null
+++ b/src/main/escp2-resolutions.c
@@ -0,0 +1,469 @@
+/*
+ * "$Id: escp2-resolutions.c,v 1.27 2005/06/29 01:42:34 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include "print-escp2.h"
+
+static const res_t r_360x90dpi =
+{ "360x90dpi", N_("360 x 90 DPI Fast Economy"),
+ 360, 90, 360, 90, 0, 0, 1 };
+static const res_t r_360x90sw =
+{ "360x90sw", N_("360 x 90 DPI Fast Economy"),
+ 360, 90, 360, 90, 1, 0, 1 };
+
+static const res_t r_360x120dpi =
+{ "360x120dpi", N_("360 x 120 DPI Economy"),
+ 360, 120, 360, 120, 0, 0, 1 };
+static const res_t r_360x120sw =
+{ "360x120sw", N_("360 x 120 DPI Economy"),
+ 360, 120, 360, 120, 1, 0, 1 };
+
+static const res_t r_180dpi =
+{ "180dpi", N_("180 DPI Economy"),
+ 180, 180, 180, 180, 0, 0, 1 };
+static const res_t r_180sw =
+{ "180sw", N_("180 DPI Economy"),
+ 180, 180, 180, 180, 1, 0, 1 };
+
+static const res_t r_360x180dpi =
+{ "360x180dpi", N_("360 x 180 DPI Draft"),
+ 360, 180, 360, 180, 0, 0, 1 };
+static const res_t r_360x180sw =
+{ "360x180sw", N_("360 x 180 DPI Draft"),
+ 360, 180, 360, 180, 1, 0, 1 };
+
+static const res_t r_360x240dpi =
+{ "360x240dpi", N_("360 x 240 DPI Draft"),
+ 360, 240, 360, 240, 0, 0, 1 };
+static const res_t r_360x240sw =
+{ "360x240sw", N_("360 x 240 DPI Draft"),
+ 360, 240, 360, 240, 1, 0, 1 };
+
+static const res_t r_360mw =
+{ "360mw", N_("360 DPI High Quality"),
+ 360, 360, 360, 360, 0, 1, 1 };
+static const res_t r_360pro =
+{ "360pro", N_("360 DPI"),
+ 360, 360, 360, 360, 0, 1, 1 };
+static const res_t r_360 =
+{ "360", N_("360 DPI"),
+ 360, 360, 360, 360, 0, 0, 1 };
+static const res_t r_360sw =
+{ "360sw", N_("360 DPI"),
+ 360, 360, 360, 360, 1, 0, 1 };
+
+static const res_t r_720x360mw =
+{ "720x360mw", N_("720 x 360 DPI"),
+ 720, 360, 720, 360, 0, 1, 1 };
+static const res_t r_720x360sw =
+{ "720x360sw", N_("720 x 360 DPI"),
+ 720, 360, 720, 360, 1, 0, 1 };
+
+static const res_t r_720mw =
+{ "720mw", N_("720 DPI"),
+ 720, 720, 720, 720, 0, 1, 1 };
+static const res_t r_720sw =
+{ "720sw", N_("720 DPI"),
+ 720, 720, 720, 720, 1, 0, 1 };
+static const res_t r_720hq =
+{ "720hq", N_("720 DPI High Quality"),
+ 720, 720, 720, 720, 1, 0, 2 };
+static const res_t r_720hq2 =
+{ "720hq2", N_("720 DPI Highest Quality"),
+ 720, 720, 720, 720, 1, 0, 4 };
+
+static const res_t r_1440x720mw =
+{ "1440x720mw", N_("1440 x 720 DPI"),
+ 1440, 720, 1440, 720, 0, 1, 1 };
+static const res_t r_1440x720sw =
+{ "1440x720sw", N_("1440 x 720 DPI"),
+ 1440, 720, 1440, 720, 1, 0, 1 };
+static const res_t r_1440x720hq2 =
+{ "1440x720hq2", N_("1440 x 720 DPI Highest Quality"),
+ 1440, 720, 1440, 720, 1, 0, 2 };
+
+static const res_t r_2880x720mw =
+{ "2880x720mw", N_("2880 x 720 DPI"),
+ 2880, 720, 2880, 720, 0, 1, 1};
+static const res_t r_2880x720sw =
+{ "2880x720sw", N_("2880 x 720 DPI"),
+ 2880, 720, 2880, 720, 1, 0, 1};
+static const res_t r_2880x720hq2 =
+{ "2880x720hq2", N_("2880 x 720 DPI Highest Quality"),
+ 2880, 720, 2880, 720, 1, 0, 2 };
+
+static const res_t r_1440x1440mw =
+{ "1440x1440mw", N_("1440 x 1440 DPI"),
+ 1440, 1440, 1440, 1440, 0, 1, 1};
+static const res_t r_1440x1440sw =
+{ "1440x1440sw", N_("1440 x 1440 DPI"),
+ 1440, 1440, 1440, 1440, 1, 0, 1};
+static const res_t r_1440x1440ov =
+{ "1440x1440ov", N_("1440 x 1440 DPI"),
+ 2880, 1440, 1440, 1440, 1, 0, 1};
+
+static const res_t r_2880x1440mw =
+{ "2880x1440mw", N_("2880 x 1440 DPI"),
+ 2880, 1440, 2880, 1440, 0, 1, 1};
+static const res_t r_2880x1440sw =
+{ "2880x1440sw", N_("2880 x 1440 DPI"),
+ 2880, 1440, 2880, 1440, 1, 0, 1};
+
+static const res_t r_2880x2880mw =
+{ "2880x2880mw", N_("2880 x 2880 DPI"),
+ 2880, 2880, 2880, 2880, 0, 1, 1};
+static const res_t r_2880x2880sw =
+{ "2880x2880sw", N_("2880 x 2880 DPI"),
+ 2880, 2880, 2880, 2880, 1, 0, 1};
+
+
+
+const res_t *const stpi_escp2_720dpi_reslist[] =
+{
+ &r_360x90dpi,
+
+ &r_360x120dpi,
+
+ &r_180dpi,
+
+ &r_360x240dpi,
+
+ &r_360x180dpi,
+
+ &r_360mw,
+ &r_360,
+
+ &r_720x360sw,
+
+ &r_720mw,
+
+ NULL
+};
+
+const res_t *const stpi_escp2_1440dpi_reslist[] =
+{
+ &r_360x90sw,
+
+ &r_360x120sw,
+
+ &r_180sw,
+
+ &r_360x240sw,
+
+ &r_360x180sw,
+
+ &r_360sw,
+
+ &r_720x360sw,
+
+ &r_720sw,
+ &r_720hq,
+
+ &r_1440x720sw,
+ &r_1440x720hq2,
+
+ NULL
+};
+
+const res_t *const stpi_escp2_2880dpi_reslist[] =
+{
+ &r_360x90sw,
+
+ &r_360x120sw,
+
+ &r_180sw,
+
+ &r_360x240sw,
+
+ &r_360x180sw,
+
+ &r_360sw,
+
+ &r_720x360sw,
+
+ &r_720sw,
+
+ &r_1440x720sw,
+ &r_1440x720hq2,
+
+ &r_2880x720sw,
+ &r_2880x720hq2,
+
+ NULL
+};
+
+const res_t *const stpi_escp2_2880_1440dpi_reslist[] =
+{
+ &r_360x90sw,
+
+ &r_360x120sw,
+
+ &r_180sw,
+
+ &r_360x240sw,
+
+ &r_360x180sw,
+
+ &r_360sw,
+
+ &r_720x360sw,
+
+ &r_720sw,
+
+ &r_1440x720sw,
+
+ &r_2880x720sw,
+
+ &r_1440x1440sw,
+
+ &r_2880x1440sw,
+
+ &r_2880x2880sw,
+
+ NULL
+};
+
+const res_t *const stpi_escp2_g3_reslist[] =
+{
+ &r_360x90dpi,
+
+ &r_360x120dpi,
+
+ &r_180dpi,
+
+ &r_360x240dpi,
+
+ &r_360x180dpi,
+
+ &r_360mw,
+ &r_360,
+
+ &r_720x360sw,
+
+ &r_720sw,
+ &r_720hq,
+
+ &r_1440x720sw,
+ &r_1440x720hq2,
+
+ NULL
+};
+
+const res_t *const stpi_escp2_superfine_reslist[] =
+{
+ &r_360x120sw,
+
+ &r_360x180sw,
+
+ &r_360x240sw,
+
+ &r_360sw,
+
+ &r_720x360sw,
+
+ &r_720sw,
+
+ &r_1440x720sw,
+
+ &r_1440x1440ov,
+
+ &r_2880x1440sw,
+
+ &r_2880x2880sw,
+
+ NULL
+};
+
+const res_t *const stpi_escp2_sc500_reslist[] =
+{
+ &r_360x90dpi,
+
+ &r_360x120dpi,
+
+ &r_180dpi,
+
+ &r_360x240dpi,
+
+ &r_360x180dpi,
+
+ &r_360mw,
+ &r_360,
+
+ &r_720x360mw,
+
+ &r_720mw,
+
+ NULL
+};
+
+const res_t *const stpi_escp2_g3_720dpi_reslist[] =
+{
+ &r_360x90dpi,
+
+ &r_360x120sw,
+
+ &r_180dpi,
+
+ &r_360x240sw,
+
+ &r_360x180dpi,
+
+ &r_360mw,
+ &r_360,
+
+ &r_720x360sw,
+
+ &r_720sw,
+ &r_720hq,
+ &r_720hq2,
+
+ NULL
+};
+
+const res_t *const stpi_escp2_720dpi_soft_reslist[] =
+{
+ &r_360x90dpi,
+
+ &r_360x120sw,
+
+ &r_180dpi,
+
+ &r_360x240sw,
+
+ &r_360x180dpi,
+
+ &r_360sw,
+
+ &r_720x360sw,
+
+ &r_720sw,
+ &r_720hq,
+ &r_720hq2,
+
+ NULL
+};
+
+const res_t *const stpi_escp2_sc640_reslist[] =
+{
+ &r_360x90dpi,
+
+ &r_180dpi,
+
+ &r_360x180dpi,
+
+ &r_360mw,
+ &r_360,
+
+ &r_720x360sw,
+
+ &r_720mw,
+
+ &r_1440x720sw,
+ &r_1440x720hq2,
+
+ NULL
+};
+
+const res_t *const stpi_escp2_pro_reslist[] =
+{
+ &r_360x90dpi,
+
+ &r_180dpi,
+
+ &r_360x180dpi,
+
+ &r_360pro,
+
+ &r_720x360mw,
+
+ &r_720mw,
+
+ &r_1440x720mw,
+
+ &r_2880x720mw,
+
+ &r_1440x1440mw,
+
+ &r_2880x1440mw,
+
+ &r_2880x2880mw,
+
+ NULL
+};
+
+#define DECLARE_PRINTER_WEAVES(name) \
+const printer_weave_list_t stpi_escp2_##name##_printer_weave_list = \
+{ \
+ #name, \
+ sizeof(name##_printer_weaves) / sizeof(printer_weave_t), \
+ name##_printer_weaves \
+}
+
+static const printer_weave_t standard_printer_weaves[] =
+{
+ { "Off", N_("Off"), 0 },
+ { "On", N_("On"), 1 }
+};
+
+DECLARE_PRINTER_WEAVES(standard);
+
+static const printer_weave_t pro7000_printer_weaves[] =
+{
+ { "Off", N_("Off"), 0 },
+ { "On", N_("Interleave"), 1 },
+ { "FOL", N_("Full Overlap"), 2 },
+ { "FourPass", N_("Four Pass"), 3 },
+ { "FOL2", N_("Full Overlap 2"), 4 },
+};
+
+DECLARE_PRINTER_WEAVES(pro7000);
+
+static const printer_weave_t pro7500_printer_weaves[] =
+{
+ { "Off", N_("Off"), 0 },
+ { "On", N_("Interleave"), 1 },
+ { "FOL", N_("Full Overlap"), 2 },
+ { "FourPass", N_("Four Pass"), 3 },
+ { "FOL2", N_("Full Overlap 2"), 4 },
+ { "MW2", N_("Interleave 2"), 5 },
+};
+
+DECLARE_PRINTER_WEAVES(pro7500);
+
+static const printer_weave_t pro7600_printer_weaves[] =
+{
+ { "Off", N_("Off"), 0 },
+ { "On", N_("Interleave"), 1 },
+ { "FOL", N_("Full Overlap"), 2 },
+ { "FourPass", N_("Four Pass"), 3 },
+ { "FOL2", N_("Full Overlap 2"), 4 },
+ { "MW2", N_("Interleave 2"), 5 },
+ { "EightPass", N_("Eight Pass"), 6 },
+};
+
+DECLARE_PRINTER_WEAVES(pro7600);
diff --git a/src/main/generic-options.c b/src/main/generic-options.c
new file mode 100644
index 0000000..25bc373
--- /dev/null
+++ b/src/main/generic-options.c
@@ -0,0 +1,257 @@
+/*
+ * "$Id: generic-options.c,v 1.9 2004/11/22 13:31:40 rlk Exp $"
+ *
+ * Copyright 2003 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 <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include "generic-options.h"
+#include <string.h>
+#include <limits.h>
+
+static const stpi_quality_t standard_qualities[] =
+{
+ { "FastEconomy", N_("Fast Economy"), 0 },
+ { "Economy", N_("Economy"), 1 },
+ { "Draft", N_("Draft"), 3 },
+ { "Standard", N_("Standard"), 5 },
+ { "High", N_("High"), 6 },
+ { "Photo", N_("Photo"), 7 },
+ { "HighPhoto", N_("Super Photo"), 8 },
+ { "UltraPhoto", N_("Ultra Photo"), 9 },
+ { "Best", N_("Best"), 10 },
+};
+
+static const stpi_image_type_t standard_image_types[] =
+{
+ { "Text", N_("Text") },
+ { "Graphics", N_("Graphics") },
+ { "TextGraphics", N_("Mixed Text and Graphics") },
+ { "Photo", N_("Photograph") },
+ { "LineArt", N_("Line Art") },
+};
+
+static const stpi_job_mode_t standard_job_modes[] =
+{
+ { "Page", N_("Page") },
+ { "Job", N_("Job") },
+};
+
+static const stp_parameter_t the_parameters[] =
+{
+ {
+ "Quality", N_("Print Quality"), N_("Basic Output Adjustment"),
+ N_("Print Quality"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 0, 0
+ },
+ {
+ "ImageType", N_("Image Type"), N_("Basic Image Adjustment"),
+ N_("Type of image being printed"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 0, 0
+ },
+ {
+ "JobMode", N_("Job Mode"), N_("Job Mode"),
+ N_("Job vs. page mode"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 0, 0
+ },
+ {
+ "PageNumber", N_("Page Number"), N_("Job Mode"),
+ N_("Page number"),
+ STP_PARAMETER_TYPE_INT, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_BASIC, 0, 1, -1, 1, 0
+ },
+};
+
+static const int the_parameter_count =
+sizeof(the_parameters) / sizeof(const stp_parameter_t);
+
+int
+stpi_get_qualities_count(void)
+{
+ return sizeof(standard_qualities) / sizeof(stpi_quality_t);
+}
+
+const stpi_quality_t *
+stpi_get_quality_by_index(int idx)
+{
+ if (idx < 0 || idx >= stpi_get_qualities_count())
+ return NULL;
+ else
+ return &(standard_qualities[idx]);
+}
+
+const stpi_quality_t *
+stpi_get_quality_by_name(const char *quality)
+{
+ int i;
+ if (!quality)
+ return NULL;
+ for (i = 0; i < stpi_get_qualities_count(); i++)
+ {
+ const stpi_quality_t *qual = stpi_get_quality_by_index(i);
+ if (strcmp(quality, qual->name) == 0)
+ return qual;
+ }
+ return NULL;
+}
+
+int
+stpi_get_image_types_count(void)
+{
+ return sizeof(standard_image_types) / sizeof(stpi_image_type_t);
+}
+
+const stpi_image_type_t *
+stpi_get_image_type_by_index(int idx)
+{
+ if (idx < 0 || idx >= stpi_get_image_types_count())
+ return NULL;
+ else
+ return &(standard_image_types[idx]);
+}
+
+const stpi_image_type_t *
+stpi_get_image_type_by_name(const char *image_type)
+{
+ int i;
+ if (!image_type)
+ return NULL;
+ for (i = 0; i < stpi_get_image_types_count(); i++)
+ {
+ const stpi_image_type_t *itype = stpi_get_image_type_by_index(i);
+ if (strcmp(image_type, itype->name) == 0)
+ return itype;
+ }
+ return NULL;
+}
+
+int
+stpi_get_job_modes_count(void)
+{
+ return sizeof(standard_job_modes) / sizeof(stpi_job_mode_t);
+}
+
+const stpi_job_mode_t *
+stpi_get_job_mode_by_index(int idx)
+{
+ if (idx < 0 || idx >= stpi_get_job_modes_count())
+ return NULL;
+ else
+ return &(standard_job_modes[idx]);
+}
+
+const stpi_job_mode_t *
+stpi_get_job_mode_by_name(const char *job_mode)
+{
+ int i;
+ if (!job_mode)
+ return NULL;
+ for (i = 0; i < stpi_get_job_modes_count(); i++)
+ {
+ const stpi_job_mode_t *itype = stpi_get_job_mode_by_index(i);
+ if (strcmp(job_mode, itype->name) == 0)
+ return itype;
+ }
+ return NULL;
+}
+
+stp_parameter_list_t
+stp_list_generic_parameters(const stp_vars_t *v)
+{
+ stp_parameter_list_t *ret = stp_parameter_list_create();
+ int i;
+ for (i = 0; i < the_parameter_count; i++)
+ stp_parameter_list_add_param(ret, &(the_parameters[i]));
+ return ret;
+}
+
+void
+stpi_describe_generic_parameter(const stp_vars_t *v, const char *name,
+ stp_parameter_t *description)
+{
+ int i;
+ description->p_type = STP_PARAMETER_TYPE_INVALID;
+ if (name == NULL)
+ return;
+
+ for (i = 0; i < the_parameter_count; i++)
+ if (strcmp(name, the_parameters[i].name) == 0)
+ {
+ stp_fill_parameter_settings(description, &(the_parameters[i]));
+ break;
+ }
+
+ description->deflt.str = NULL;
+
+ if (strcmp(name, "Quality") == 0)
+ {
+#if 0
+ description->bounds.str = stp_string_list_create();
+ stp_string_list_add_string(description->bounds.str, "None",
+ _("Manual Control"));
+ for (i = 0; i < stpi_get_qualities_count(); i++)
+ {
+ const stpi_quality_t *qual = stpi_get_quality_by_index(i);
+ stp_string_list_add_string(description->bounds.str, qual->name,
+ qual->text);
+ }
+ description->deflt.str = "Standard";
+#else
+ description->bounds.str = stp_string_list_create();
+ description->is_active = 0;
+#endif
+ }
+ else if (strcmp(name, "ImageType") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ stp_string_list_add_string(description->bounds.str, "None",
+ _("Manual Control"));
+ for (i = 0; i < stpi_get_image_types_count(); i++)
+ {
+ const stpi_image_type_t *itype = stpi_get_image_type_by_index(i);
+ stp_string_list_add_string(description->bounds.str, itype->name,
+ itype->text);
+ }
+ description->deflt.str = "TextGraphics";
+ }
+ else if (strcmp(name, "JobMode") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ for (i = 0; i < stpi_get_job_modes_count(); i++)
+ {
+ const stpi_job_mode_t *itype = stpi_get_job_mode_by_index(i);
+ stp_string_list_add_string(description->bounds.str, itype->name,
+ itype->text);
+ }
+ description->deflt.str = "Page";
+ }
+ else if (strcmp(name, "PageNumber") == 0)
+ {
+ description->deflt.integer = 0;
+ description->bounds.integer.lower = 0;
+ description->bounds.integer.upper = INT_MAX;
+ }
+}
+
diff --git a/src/main/generic-options.h b/src/main/generic-options.h
new file mode 100644
index 0000000..446f349
--- /dev/null
+++ b/src/main/generic-options.h
@@ -0,0 +1,67 @@
+/*
+ * "$Id: generic-options.h,v 1.5 2004/09/17 18:38:20 rleigh Exp $"
+ *
+ * Copyright 2003 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.
+ */
+
+#ifndef GUTENPRINT_INTERNAL_GENERIC_OPTIONS_H
+#define GUTENPRINT_INTERNAL_GENERIC_OPTIONS_H
+
+typedef struct
+{
+ const char *name;
+ const char *text;
+ int quality_level; /* Between 0 and 10 */
+} stpi_quality_t;
+
+typedef struct
+{
+ const char *name;
+ const char *text;
+} stpi_image_type_t;
+
+typedef struct
+{
+ const char *name;
+ const char *text;
+} stpi_job_mode_t;
+
+extern int stpi_get_qualities_count(void);
+
+extern const stpi_quality_t *stpi_get_quality_by_index(int idx);
+
+extern const stpi_quality_t *stpi_get_quality_by_name(const char *quality);
+
+extern int stpi_get_image_types_count(void);
+
+extern const stpi_image_type_t *stpi_get_image_type_by_index(int idx);
+
+extern const stpi_image_type_t *stpi_get_image_type_by_name(const char *image_type);
+
+extern int stpi_get_job_modes_count(void);
+
+extern const stpi_job_mode_t *stpi_get_job_mode_by_index(int idx);
+
+extern const stpi_job_mode_t *stpi_get_job_mode_by_name(const char *job_mode);
+
+extern stp_parameter_list_t stp_list_generic_parameters(const stp_vars_t *v);
+
+extern void stpi_describe_generic_parameter(const stp_vars_t *v,
+ const char *name,
+ stp_parameter_t *description);
+
+#endif /* GUTENPRINT_INTERNAL_GENERIC_OPTIONS_H */
diff --git a/src/main/gimp-print-internal.h b/src/main/gimp-print-internal.h
deleted file mode 100644
index 95300af..0000000
--- a/src/main/gimp-print-internal.h
+++ /dev/null
@@ -1,495 +0,0 @@
-/*
- * "$Id: gimp-print-internal.h,v 1.43.4.4 2002/12/08 21:12:41 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 <config.h>
-#endif
-
-/*
- * ECOLOR_K must be 0
- */
-#define ECOLOR_K 0
-#define ECOLOR_C 1
-#define ECOLOR_M 2
-#define ECOLOR_Y 3
-#define ECOLOR_LC 4
-#define ECOLOR_LM 5
-#define ECOLOR_LY 6
-#define NCOLORS (4)
-#define MAX_WEAVE (8)
-
-typedef struct
-{
- double value;
- unsigned bit_pattern;
- int subchannel;
- unsigned dot_size;
-} stp_simple_dither_range_t;
-
-typedef struct
-{
- double value;
- double lower;
- double upper;
- unsigned bit_pattern;
- int subchannel;
- unsigned dot_size;
-} stp_dither_range_t;
-
-typedef struct
-{
- double value[2];
- unsigned bits[2];
- int subchannel[2];
-} stp_full_dither_range_t;
-
-typedef struct
-{
- unsigned subchannel_count;
- unsigned char **c;
-} stp_channel_t;
-
-typedef struct
-{
- unsigned channel_count;
- stp_channel_t *c;
-} stp_dither_data_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 struct { /* Offsets from the start of each line */
- int ncolors;
- unsigned long *v; /* (really pass) */
-} stp_lineoff_t;
-
-typedef struct { /* Is this line (really pass) active? */
- int ncolors;
- char *v;
-} stp_lineactive_t;
-
-typedef struct { /* number of rows for a pass */
- int ncolors;
- int *v;
-} stp_linecount_t;
-
-typedef struct { /* Base pointers for each pass */
- int ncolors;
- unsigned char **v;
-} 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 */
- 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 horizontal_width; /* Horizontal width, in bits */
- int *head_offset; /* 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;
-
-/*
- * 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 stp_dither_data_t *stp_create_dither_data(void);
-extern void stp_add_channel(stp_dither_data_t *d, unsigned char *data,
- unsigned channel, unsigned subchannel);
-extern void stp_free_dither_data(stp_dither_data_t *d);
-
-extern void stp_dither(const unsigned short *, int, void *,
- stp_dither_data_t *, 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 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 int stp_start_job(const stp_printer_t printer,
- stp_image_t *image, const stp_vars_t v);
-extern int stp_end_job(const stp_printer_t printer,
- stp_image_t *image, const stp_vars_t v);
-
-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,
- unsigned char *const 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
-#define STP_DBG_MARK_FILE 0x400
-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 unsigned long stp_debug_level;
-
-extern void *stp_malloc (size_t);
-extern void *stp_zalloc (size_t);
-extern void *stp_realloc (void *ptr, 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 <assert.h>
-#include <sys/time.h>
-#include <unistd.h>
-#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.4.4 2002/12/08 21:12:41 rlk Exp $".
- */
diff --git a/src/main/gimpprint-config.in b/src/main/gimpprint-config.in
deleted file mode 100644
index 45753f0..0000000
--- a/src/main/gimpprint-config.in
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/bin/sh
-
-gimpprint_libs="@gimpprint_libs@"
-gimpprint_cflags="@gimpprint_cflags@"
-
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-exec_prefix_set=no
-
-usage()
-{
- cat <<EOF
-Usage: gimpprint-config [OPTIONS] [LIBRARIES]
-Options:
- [--prefix[=DIR]]
- [--exec-prefix[=DIR]]
- [--version]
- [--libs]
- [--cflags]
-Libraries:
- gimpprint
-EOF
- exit $1
-}
-
-if test $# -eq 0; then
- usage 1 1>&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
-fi
-
diff --git a/src/main/gimpprint.m4 b/src/main/gimpprint.m4
deleted file mode 100644
index 0da0030..0000000
--- a/src/main/gimpprint.m4
+++ /dev/null
@@ -1,190 +0,0 @@
-# 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 <gimp-print/gimp-print.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-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, &micro) != 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 <gimp-print/gimp-print.h>
-#include <stdio.h>
-#include <string.h>
-], [ 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/gutenprint-internal.h b/src/main/gutenprint-internal.h
new file mode 100644
index 0000000..32d1ae1
--- /dev/null
+++ b/src/main/gutenprint-internal.h
@@ -0,0 +1,56 @@
+/*
+ * "$Id: gutenprint-internal.h,v 1.1 2004/09/17 18:38:21 rleigh 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 GUTENPRINT_INTERNAL_INTERNAL_H
+#define GUTENPRINT_INTERNAL_INTERNAL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gutenprint/gutenprint-module.h>
+
+#include "util.h"
+
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* GUTENPRINT_INTERNAL_INTERNAL_H */
+/*
+ * End of "$Id: gutenprint-internal.h,v 1.1 2004/09/17 18:38:21 rleigh Exp $".
+ */
diff --git a/src/main/gutenprint.pc.in b/src/main/gutenprint.pc.in
new file mode 100644
index 0000000..0f82a63
--- /dev/null
+++ b/src/main/gutenprint.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: Gutenprint
+Description: Gutenprint Top Quality Printer Drivers
+Version: @gutenprint_version@
+Libs: -L${libdir} @gutenprint_libs@
+Cflags: -I${includedir} @gutenprint_cflags@
diff --git a/src/main/image.c b/src/main/image.c
new file mode 100644
index 0000000..9149319
--- /dev/null
+++ b/src/main/image.c
@@ -0,0 +1,77 @@
+/*
+ * "$Id: image.c,v 1.6 2004/09/17 18:38:21 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+
+void
+stp_image_init(stp_image_t *image)
+{
+ if (image->init)
+ image->init(image);
+}
+
+void
+stp_image_reset(stp_image_t *image)
+{
+ if (image->reset)
+ image->reset(image);
+}
+
+int
+stp_image_width(stp_image_t *image)
+{
+ return image->width(image);
+}
+
+int
+stp_image_height(stp_image_t *image)
+{
+ return image->height(image);
+}
+
+stp_image_status_t
+stp_image_get_row(stp_image_t *image, unsigned char *data,
+ size_t byte_limit, int row)
+{
+ return image->get_row(image, data, byte_limit, row);
+}
+
+const char *
+stp_image_get_appname(stp_image_t *image)
+{
+ if (image->get_appname)
+ return image->get_appname(image);
+ else
+ return NULL;
+}
+
+void
+stp_image_conclude(stp_image_t *image)
+{
+ if (image->conclude)
+ image->conclude(image);
+}
diff --git a/src/main/libgutenprint.sym b/src/main/libgutenprint.sym
new file mode 100644
index 0000000..702349a
--- /dev/null
+++ b/src/main/libgutenprint.sym
@@ -0,0 +1,440 @@
+stp_abort
+stp_allocate_component_data
+stp_array_copy
+stp_array_create
+stp_array_create_copy
+stp_array_create_from_xmltree
+stp_array_destroy
+stp_array_get_data
+stp_array_get_point
+stp_array_get_sequence
+stp_array_get_size
+stp_array_set_data
+stp_array_set_point
+stp_array_set_size
+stp_asprintf
+stp_catprintf
+stp_channel_add
+stp_channel_convert
+stp_channel_get_input
+stp_channel_get_output
+stp_channel_initialize
+stp_channel_reset
+stp_channel_reset_channel
+stp_channel_set_black_channel
+stp_channel_set_cutoff_adjustment
+stp_channel_set_density_adjustment
+stp_channel_set_ink_limit
+stp_check_array_parameter
+stp_check_boolean_parameter
+stp_check_curve_parameter
+stp_check_file_parameter
+stp_check_float_parameter
+stp_check_int_parameter
+stp_check_raw_parameter
+stp_check_string_parameter
+stp_check_version
+stp_clear_array_parameter
+stp_clear_boolean_parameter
+stp_clear_curve_parameter
+stp_clear_file_parameter
+stp_clear_float_parameter
+stp_clear_int_parameter
+stp_clear_raw_parameter
+stp_clear_string_parameter
+stp_color_count
+stp_color_describe_parameter
+stp_color_get_long_name
+stp_color_get_name
+stp_color_get_row
+stp_color_init
+stp_color_list_parameters
+stp_color_register
+stp_color_unregister
+stp_compute_tiff_linewidth
+stp_compute_uncompressed_linewidth
+stp_curve_cache_copy
+stp_curve_cache_curve_data
+stp_curve_cache_curve_invalidate
+stp_curve_cache_get_count
+stp_curve_cache_get_curve
+stp_curve_cache_get_double_data
+stp_curve_cache_get_ushort_data
+stp_curve_cache_set_curve
+stp_curve_cache_set_curve_copy
+stp_curve_compose
+stp_curve_copy
+stp_curve_count_points
+stp_curve_create
+stp_curve_create_copy
+stp_curve_create_from_file
+stp_curve_create_from_stream
+stp_curve_create_from_string
+stp_curve_create_from_xmltree
+stp_curve_destroy
+stp_curve_free_curve_cache
+stp_curve_get_bounds
+stp_curve_get_data
+stp_curve_get_data_points
+stp_curve_get_float_data
+stp_curve_get_gamma
+stp_curve_get_int_data
+stp_curve_get_interpolation_type
+stp_curve_get_long_data
+stp_curve_get_point
+stp_curve_get_range
+stp_curve_get_sequence
+stp_curve_get_short_data
+stp_curve_get_subrange
+stp_curve_get_uint_data
+stp_curve_get_ulong_data
+stp_curve_get_ushort_data
+stp_curve_get_wrap
+stp_curve_interpolate_value
+stp_curve_is_piecewise
+stp_curve_resample
+stp_curve_rescale
+stp_curve_set_bounds
+stp_curve_set_data
+stp_curve_set_data_points
+stp_curve_set_float_data
+stp_curve_set_gamma
+stp_curve_set_int_data
+stp_curve_set_interpolation_type
+stp_curve_set_long_data
+stp_curve_set_point
+stp_curve_set_short_data
+stp_curve_set_subrange
+stp_curve_set_uint_data
+stp_curve_set_ulong_data
+stp_curve_set_ushort_data
+stp_curve_write
+stp_curve_write_string
+stp_default_media_size
+stp_default_settings
+stp_deprintf
+stp_describe_output
+stp_describe_parameter
+stp_describe_resolution
+stp_destroy_component_data
+stp_dither
+stp_dither_add_channel
+stp_dither_describe_parameter
+stp_dither_get_channel
+stp_dither_get_first_position
+stp_dither_get_last_position
+stp_dither_init
+stp_dither_internal
+stp_dither_list_parameters
+stp_dither_matrix_clone
+stp_dither_matrix_copy
+stp_dither_matrix_destroy
+stp_dither_matrix_init
+stp_dither_matrix_init_from_dither_array
+stp_dither_matrix_init_short
+stp_dither_matrix_iterated_init
+stp_dither_matrix_scale_exponentially
+stp_dither_matrix_set_row
+stp_dither_matrix_shear
+stp_dither_matrix_validate_array
+stp_dither_set_adaptive_limit
+stp_dither_set_ink_spread
+stp_dither_set_inks
+stp_dither_set_inks_full
+stp_dither_set_inks_simple
+stp_dither_set_iterated_matrix
+stp_dither_set_matrix
+stp_dither_set_matrix_from_dither_array
+stp_dither_set_randomizer
+stp_dither_set_transition
+stp_dprintf
+stp_end_job
+stp_eprintf
+stp_erprintf
+stp_erputc
+stp_family_register
+stp_family_unregister
+stp_fill_parameter_settings
+stp_fill_tiff
+stp_fill_uncompressed
+stp_find_standard_dither_array
+stp_flush_all
+stp_flush_debug_messages
+stp_fold
+stp_free
+stp_get_array_parameter
+stp_get_array_parameter_active
+stp_get_boolean_parameter
+stp_get_boolean_parameter_active
+stp_get_color_by_colorfuncs
+stp_get_color_by_index
+stp_get_color_by_name
+stp_get_color_conversion
+stp_get_component_data
+stp_get_curve_parameter
+stp_get_curve_parameter_active
+stp_get_debug_level
+stp_get_driver
+stp_get_errdata
+stp_get_errfunc
+stp_get_file_parameter
+stp_get_file_parameter_active
+stp_get_float_parameter
+stp_get_float_parameter_active
+stp_get_height
+stp_get_imageable_area
+stp_get_int_parameter
+stp_get_int_parameter_active
+stp_get_left
+stp_get_lineactive_by_pass
+stp_get_linebases_by_pass
+stp_get_linecount_by_pass
+stp_get_lineoffsets_by_pass
+stp_get_media_size
+stp_get_model_id
+stp_get_outdata
+stp_get_outfunc
+stp_get_page_height
+stp_get_page_width
+stp_get_papersize_by_index
+stp_get_papersize_by_name
+stp_get_papersize_by_size
+stp_get_parameter_list
+stp_get_pass_by_pass
+stp_get_printer
+stp_get_printer_by_driver
+stp_get_printer_by_index
+stp_get_printer_by_long_name
+stp_get_printer_index_by_driver
+stp_get_raw_parameter
+stp_get_raw_parameter_active
+stp_get_size_limit
+stp_get_string_parameter
+stp_get_string_parameter_active
+stp_get_top
+stp_get_verified
+stp_get_width
+stp_image_conclude
+stp_image_get_appname
+stp_image_get_row
+stp_image_height
+stp_image_init
+stp_image_reset
+stp_image_width
+stp_init
+stp_init_debug_messages
+stp_initialize_printer_defaults
+stp_initialize_weave
+stp_known_papersizes
+stp_list_copy
+stp_list_create
+stp_list_destroy
+stp_list_generic_parameters
+stp_list_get_copyfunc
+stp_list_get_end
+stp_list_get_freefunc
+stp_list_get_item_by_index
+stp_list_get_item_by_long_name
+stp_list_get_item_by_name
+stp_list_get_length
+stp_list_get_long_namefunc
+stp_list_get_namefunc
+stp_list_get_sortfunc
+stp_list_get_start
+stp_list_item_create
+stp_list_item_destroy
+stp_list_item_get_data
+stp_list_item_next
+stp_list_item_prev
+stp_list_item_set_data
+stp_list_node_free_data
+stp_list_set_copyfunc
+stp_list_set_freefunc
+stp_list_set_long_namefunc
+stp_list_set_namefunc
+stp_list_set_sortfunc
+stp_malloc
+stp_malloc_func
+stp_merge_printvars
+stp_module_close
+stp_module_exit
+stp_module_get_class
+stp_module_init
+stp_module_load
+stp_module_open
+stp_mxmlAdd
+stp_mxmlDelete
+stp_mxmlElementGetAttr
+stp_mxmlElementSetAttr
+stp_mxmlFindElement
+stp_mxmlLoadFile
+stp_mxmlLoadString
+stp_mxmlNewElement
+stp_mxmlNewInteger
+stp_mxmlNewOpaque
+stp_mxmlNewReal
+stp_mxmlNewText
+stp_mxmlRemove
+stp_mxmlSaveAllocString
+stp_mxmlSaveFile
+stp_mxmlSaveString
+stp_mxmlWalkNext
+stp_mxmlWalkPrev
+stp_pack_tiff
+stp_pack_uncompressed
+stp_parameter_description_destroy
+stp_parameter_find
+stp_parameter_find_in_settings
+stp_parameter_list_add_param
+stp_parameter_list_append
+stp_parameter_list_copy
+stp_parameter_list_count
+stp_parameter_list_create
+stp_parameter_list_destroy
+stp_parameter_list_param
+stp_path_search
+stp_path_split
+stp_print
+stp_printer_describe_parameter
+stp_printer_get_defaults
+stp_printer_get_driver
+stp_printer_get_family
+stp_printer_get_long_name
+stp_printer_get_manufacturer
+stp_printer_get_model
+stp_printer_list_parameters
+stp_printer_model_count
+stp_prune_inactive_options
+stp_put16_be
+stp_put16_le
+stp_put32_be
+stp_put32_le
+stp_putc
+stp_puts
+stp_read_and_compose_curves
+stp_realloc
+stp_register_xml_parser
+stp_register_xml_preload
+stp_scale_float_parameter
+stp_send_command
+stp_sequence_copy
+stp_sequence_create
+stp_sequence_create_copy
+stp_sequence_create_from_xmltree
+stp_sequence_destroy
+stp_sequence_get_bounds
+stp_sequence_get_data
+stp_sequence_get_float_data
+stp_sequence_get_int_data
+stp_sequence_get_long_data
+stp_sequence_get_point
+stp_sequence_get_range
+stp_sequence_get_short_data
+stp_sequence_get_size
+stp_sequence_get_uint_data
+stp_sequence_get_ulong_data
+stp_sequence_get_ushort_data
+stp_sequence_set_bounds
+stp_sequence_set_data
+stp_sequence_set_float_data
+stp_sequence_set_int_data
+stp_sequence_set_long_data
+stp_sequence_set_point
+stp_sequence_set_short_data
+stp_sequence_set_size
+stp_sequence_set_subrange
+stp_sequence_set_uint_data
+stp_sequence_set_ulong_data
+stp_sequence_set_ushort_data
+stp_set_array_parameter
+stp_set_array_parameter_active
+stp_set_boolean_parameter
+stp_set_boolean_parameter_active
+stp_set_color_conversion
+stp_set_color_conversion_n
+stp_set_curve_parameter
+stp_set_curve_parameter_active
+stp_set_default_array_parameter
+stp_set_default_boolean_parameter
+stp_set_default_curve_parameter
+stp_set_default_file_parameter
+stp_set_default_file_parameter_n
+stp_set_default_float_parameter
+stp_set_default_int_parameter
+stp_set_default_raw_parameter
+stp_set_default_string_parameter
+stp_set_default_string_parameter_n
+stp_set_driver
+stp_set_driver_n
+stp_set_errdata
+stp_set_errfunc
+stp_set_file_parameter
+stp_set_file_parameter_active
+stp_set_file_parameter_n
+stp_set_float_parameter
+stp_set_float_parameter_active
+stp_set_height
+stp_set_int_parameter
+stp_set_int_parameter_active
+stp_set_left
+stp_set_outdata
+stp_set_outfunc
+stp_set_output_codeset
+stp_set_page_height
+stp_set_page_width
+stp_set_printer_defaults
+stp_set_raw_parameter
+stp_set_raw_parameter_active
+stp_set_string_parameter
+stp_set_string_parameter_active
+stp_set_string_parameter_n
+stp_set_top
+stp_set_verified
+stp_set_width
+stp_split_2
+stp_split_4
+stp_start_job
+stp_strdup
+stp_string_list_add_string
+stp_string_list_count
+stp_string_list_create
+stp_string_list_create_copy
+stp_string_list_create_from_params
+stp_string_list_destroy
+stp_string_list_find
+stp_string_list_is_present
+stp_string_list_param
+stp_string_list_remove_string
+stp_strlen
+stp_strndup
+stp_unpack_2
+stp_unpack_4
+stp_unpack_8
+stp_unregister_xml_parser
+stp_unregister_xml_preload
+stp_vars_copy
+stp_vars_create
+stp_vars_create_copy
+stp_vars_destroy
+stp_verify
+stp_verify_parameter
+stp_verify_printer_params
+stp_weave_parameters_by_row
+stp_write_weave
+stp_xml_exit
+stp_xml_get_node
+stp_xml_init
+stp_xml_init_defaults
+stp_xml_parse_file
+stp_xml_parse_file_named
+stp_xml_preinit
+stp_xmldoc_create_generic
+stp_xmlstrtod
+stp_xmlstrtol
+stp_xmlstrtoul
+stp_xmltree_create_from_array
+stp_xmltree_create_from_curve
+stp_xmltree_create_from_sequence
+stp_zalloc
+stp_zfwrite
+stp_zprintf
diff --git a/src/main/module.c b/src/main/module.c
new file mode 100644
index 0000000..f2fdfe6
--- /dev/null
+++ b/src/main/module.c
@@ -0,0 +1,415 @@
+/*
+ * "$Id: module.c,v 1.25 2004/09/17 18:38:21 rleigh Exp $"
+ *
+ * Gutenprint module loader - load modules with libltdl/libdl.
+ *
+ * Copyright 2002 Roger Leigh (rleigh@debian.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 <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <libgen.h>
+#include <errno.h>
+#include <unistd.h>
+
+
+typedef struct stpi_internal_module_class
+{
+ stp_module_class_t class;
+ const char *description;
+} stpi_internal_module_class_t;
+
+
+static void module_list_freefunc(void *item);
+static int stp_module_register(stp_module_t *module);
+#ifdef USE_DLOPEN
+static void *stp_dlsym(void *handle, const char *symbol, const char *modulename);
+#endif
+
+static const stpi_internal_module_class_t module_classes[] =
+ {
+ {STP_MODULE_CLASS_MISC, N_("Miscellaneous (unclassified)")},
+ {STP_MODULE_CLASS_FAMILY, N_("Family driver")},
+ {STP_MODULE_CLASS_COLOR, N_("Color conversion module")},
+ {STP_MODULE_CLASS_DITHER, N_("Dither algorithm")},
+ {STP_MODULE_CLASS_INVALID, NULL} /* Must be last */
+ };
+
+#if !defined(USE_LTDL) && !defined(USE_DLOPEN)
+extern stp_module_t print_canon_LTX_stp_module_data;
+extern stp_module_t print_escp2_LTX_stp_module_data;
+extern stp_module_t print_lexmark_LTX_stp_module_data;
+extern stp_module_t print_pcl_LTX_stp_module_data;
+extern stp_module_t print_ps_LTX_stp_module_data;
+extern stp_module_t print_olympus_LTX_stp_module_data;
+extern stp_module_t print_raw_LTX_stp_module_data;
+extern stp_module_t color_traditional_LTX_stp_module_data;
+
+/*
+ * A list of modules, for use when the modules are linked statically.
+ */
+static stp_module_t *static_modules[] =
+ {
+ &print_ps_LTX_stp_module_data,
+ &print_canon_LTX_stp_module_data,
+ &print_escp2_LTX_stp_module_data,
+ &print_pcl_LTX_stp_module_data,
+ &print_lexmark_LTX_stp_module_data,
+ &print_olympus_LTX_stp_module_data,
+ &print_raw_LTX_stp_module_data,
+ &color_traditional_LTX_stp_module_data,
+ NULL
+ };
+#endif
+
+static stp_list_t *module_list = NULL;
+
+
+/*
+ * Callback for removing a module from stp_module_list.
+ */
+static void
+module_list_freefunc(void *item /* module to remove */)
+{
+ stp_module_t *module = (stp_module_t *) item;
+ if (module && module->fini) /* Call the module exit function */
+ module->fini();
+#if defined(USE_LTDL) || defined(USE_DLOPEN)
+ DLCLOSE(module->handle); /* Close the module if it's not static */
+#endif
+}
+
+
+/*
+ * Load all available modules. Return nonzero on failure.
+ */
+int stp_module_load(void)
+{
+ /* initialise libltdl */
+#ifdef USE_LTDL
+ static int ltdl_is_initialised = 0; /* Is libltdl initialised? */
+#endif
+ static int module_list_is_initialised = 0; /* Is the module list initialised? */
+#if defined(USE_LTDL) || defined(USE_DLOPEN)
+ stp_list_t *dir_list; /* List of directories to scan */
+ stp_list_t *file_list; /* List of modules to open */
+ stp_list_item_t *file; /* Pointer to current module */
+#endif
+
+#ifdef USE_LTDL
+ if (!ltdl_is_initialised)
+ {
+ if (lt_dlinit())
+ {
+ stp_erprintf("Error initialising libltdl: %s\n", DLERROR());
+ return 1;
+ }
+ ltdl_is_initialised = 1;
+ }
+ /* set default search paths */
+ lt_dladdsearchdir(PKGMODULEDIR);
+#endif
+
+ /* initialise module_list */
+ if (!module_list_is_initialised)
+ {
+ if (!(module_list = stp_list_create()))
+ return 1;
+ stp_list_set_freefunc(module_list, module_list_freefunc);
+ module_list_is_initialised = 1;
+ }
+
+ /* search for available modules */
+#if defined (USE_LTDL) || defined (USE_DLOPEN)
+ if (!(dir_list = stp_list_create()))
+ return 1;
+ stp_list_set_freefunc(dir_list, stp_list_node_free_data);
+ if (getenv("STP_MODULE_PATH"))
+ {
+ stp_path_split(dir_list, getenv("STP_MODULE_PATH"));
+ }
+ else
+ {
+#ifdef USE_LTDL
+ stp_path_split(dir_list, getenv("LTDL_LIBRARY_PATH"));
+ stp_path_split(dir_list, lt_dlgetsearchpath());
+#else
+ stp_path_split(dir_list, PKGMODULEDIR);
+#endif
+ }
+#ifdef USE_LTDL
+ file_list = stp_path_search(dir_list, ".la");
+#else
+ file_list = stp_path_search(dir_list, ".so");
+#endif
+ stp_list_destroy(dir_list);
+
+ /* load modules */
+ file = stp_list_get_start(file_list);
+ while (file)
+ {
+ stp_module_open((const char *) stp_list_item_get_data(file));
+ file = stp_list_item_next(file);
+ }
+
+ stp_list_destroy(file_list);
+#else /* use a static module list */
+ {
+ int i=0;
+ while (static_modules[i])
+ {
+ stp_module_register(static_modules[i]);
+ i++;
+ }
+ }
+#endif
+ return 0;
+ }
+
+
+/*
+ * Unload all modules and clean up.
+ */
+int
+stp_module_exit(void)
+{
+ /* destroy the module list (modules unloaded by callback) */
+ if (module_list)
+ stp_list_destroy(module_list);
+ /* shut down libltdl (forces close of any unclosed modules) */
+#ifdef USE_LTDL
+ return lt_dlexit();
+#else
+ return 0;
+#endif
+}
+
+
+/*
+ * Find all modules in a given class.
+ */
+stp_list_t *
+stp_module_get_class(stp_module_class_t class /* Module class */)
+{
+ stp_list_t *list; /* List to return */
+ stp_list_item_t *ln; /* Module to check*/
+
+ list = stp_list_create(); /* No freefunc, so it can be destroyed
+ without unloading any modules! */
+ if (!list)
+ return NULL;
+
+ ln = stp_list_get_start(module_list);
+ while (ln)
+ {
+ /* Add modules of the same class to our list */
+ if (((stp_module_t *) stp_list_item_get_data(ln))->class == class)
+ stp_list_item_create(list, NULL, stp_list_item_get_data(ln));
+ ln = stp_list_item_next(ln);
+ }
+ return list;
+}
+
+
+/*
+ * Open a module.
+ */
+int
+stp_module_open(const char *modulename /* Module filename */)
+{
+#if defined(USE_LTDL) || defined(USE_DLOPEN)
+#ifdef USE_LTDL
+ lt_dlhandle module; /* Handle for module */
+#else
+ void *module; /* Handle for module */
+#endif
+ stp_module_version_t *version; /* Module version */
+ stp_module_t *data; /* Module data */
+ stp_list_item_t *reg_module; /* Pointer to module list nodes */
+ int error = 0; /* Error status */
+
+ stp_deprintf(STP_DBG_MODULE, "stp-module: open: %s\n", modulename);
+ while(1)
+ {
+ module = DLOPEN(modulename);
+ if (!module)
+ break;
+
+ /* check version is valid */
+ version = (stp_module_version_t *) DLSYM(module, "stp_module_version");
+ if (!version)
+ break;
+ if (version->major != 1 && version->minor < 0)
+ break;
+
+ data = (void *) DLSYM(module, "stp_module_data");
+ if (!data)
+ break;
+ data->handle = module; /* store module handle */
+
+ /* check same module isn't already loaded */
+ reg_module = stp_list_get_start(module_list);
+ while (reg_module)
+ {
+ if (!strcmp(data->name, ((stp_module_t *)
+ stp_list_item_get_data(reg_module))->name) &&
+ data->class == ((stp_module_t *)
+ stp_list_item_get_data(reg_module))->class)
+ {
+ stp_deprintf(STP_DBG_MODULE,
+ "stp-module: reject duplicate: %s\n",
+ data->name);
+ error = 1;
+ break;
+ }
+ reg_module = stp_list_item_next(reg_module);
+ }
+ if (error)
+ break;
+
+ /* Register the module */
+ if (stp_module_register(data))
+ break;
+
+ return 0;
+ }
+
+ if (module)
+ DLCLOSE(module);
+#endif
+ return 1;
+}
+
+
+/*
+ * Register a loaded module.
+ */
+static int stp_module_register(stp_module_t *module /* Module to register */)
+{
+ /* Add to the module list */
+ if (stp_list_item_create(module_list, NULL, module))
+ return 1;
+
+ stp_deprintf(STP_DBG_MODULE, "stp-module: register: %s\n", module->name);
+ return 0;
+}
+
+
+/*
+ * Initialise all loaded modules
+ */
+int stp_module_init(void)
+{
+ stp_list_item_t *module_item; /* Module list pointer */
+ stp_module_t *module; /* Module to initialise */
+
+ module_item = stp_list_get_start(module_list);
+ while (module_item)
+ {
+ module = (stp_module_t *) stp_list_item_get_data(module_item);
+ if (module)
+ {
+ stp_deprintf(STP_DBG_MODULE, "stp-module-init: %s\n", module->name);
+ /* Initialise module */
+ if (module->init && module->init())
+ {
+ stp_deprintf(STP_DBG_MODULE,
+ "stp-module-init: %s: Module init failed\n",
+ module->name);
+ }
+ }
+ module_item = stp_list_item_next(module_item);
+ }
+ return 0;
+}
+
+
+
+/*
+ * Close a module.
+ */
+int
+stp_module_close(stp_list_item_t *module /* Module to close */)
+{
+ return stp_list_item_destroy(module_list, module);
+}
+
+
+/*
+ * If using dlopen, add modulename_LTX_ to symbol name
+ */
+#ifdef USE_DLOPEN
+static void *stp_dlsym(void *handle, /* Module */
+ const char *symbol, /* Symbol name */
+ const char *modulename) /* Module name */
+{
+ int len; /* Length of string */
+ static char *full_symbol = NULL; /* Symbol to return */
+ char *module; /* Real module name */
+ char *tmp = stp_strdup(modulename); /* Temporary string */
+
+ module = basename(tmp);
+
+ if (full_symbol)
+ {
+ stp_free (full_symbol);
+ full_symbol = NULL;
+ }
+
+ full_symbol = (char *) stp_malloc(sizeof(char) * (strlen(module) - 2));
+
+ /* "_LTX_" + '\0' - ".so" */
+ len = strlen(symbol) + strlen(module) + 3;
+ full_symbol = (char *) stp_malloc(sizeof(char) * len);
+
+ len = 0;
+ strncpy (full_symbol, module, strlen(module) - 3);
+ len = strlen(module) - 3;
+ strcpy (full_symbol+len, "_LTX_");
+ len += 5;
+ strcpy (full_symbol+len, symbol);
+ len += strlen(symbol);
+ full_symbol[len] = '\0';
+
+#if defined(__OpenBSD__)
+/* OpenBSD needs a prepended underscore to match symbols */
+ {
+ char *prefix_symbol = stp_malloc(sizeof(char) * (strlen(full_symbol) + 2));
+ prefix_symbol[0] = '_';
+ strcpy(prefix_symbol+1, full_symbol);
+ stp_free(full_symbol);
+ full_symbol = prefix_symbol;
+ }
+#endif
+
+ /* Change any hyphens to underscores */
+ for (len = 0; full_symbol[len] != '\0'; len++)
+ if (full_symbol[len] == '-')
+ full_symbol[len] = '_';
+
+ stp_deprintf(STP_DBG_MODULE, "SYMBOL: %s\n", full_symbol);
+
+ return dlsym(handle, full_symbol);
+}
+#endif
diff --git a/src/main/mxml-attr.c b/src/main/mxml-attr.c
new file mode 100644
index 0000000..2087d85
--- /dev/null
+++ b/src/main/mxml-attr.c
@@ -0,0 +1,160 @@
+/*
+ * "$Id: mxml-attr.c,v 1.7 2004/09/17 18:38:21 rleigh Exp $"
+ *
+ * Attribute support code for mini-XML, a small XML-like file parsing library.
+ *
+ * Copyright 2003 by Michael Sweet.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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.
+ *
+ * Contents:
+ *
+ * stp_mxmlElementGetAttr() - Get an attribute.
+ * stp_mxmlElementSetAttr() - Set an attribute.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include <gutenprint/mxml.h>
+#include "config.h"
+
+
+/*
+ * 'stp_mxmlElementGetAttr()' - Get an attribute.
+ *
+ * This function returns NULL if the node is not an element or the
+ * named attribute does not exist.
+ */
+
+const char * /* O - Attribute value or NULL */
+stp_mxmlElementGetAttr(stp_mxml_node_t *node, /* I - Element node */
+ const char *name) /* I - Name of attribute */
+{
+ int i; /* Looping var */
+ stp_mxml_attr_t *attr; /* Cirrent attribute */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!node || node->type != STP_MXML_ELEMENT || !name)
+ return (NULL);
+
+ /*
+ * Look for the attribute...
+ */
+
+ for (i = node->value.element.num_attrs, attr = node->value.element.attrs;
+ i > 0;
+ i --, attr ++)
+ if (!strcmp(attr->name, name))
+ return (attr->value);
+
+ /*
+ * Didn't find attribute, so return NULL...
+ */
+
+ return (NULL);
+}
+
+
+/*
+ * 'stp_mxmlElementSetAttr()' - Set an attribute.
+ *
+ * If the named attribute already exists, the value of the attribute
+ * is replaced by the new string value. The string value is copied
+ * into the element node. This function does nothing if the node is
+ * not an element.
+ */
+
+void
+stp_mxmlElementSetAttr(stp_mxml_node_t *node, /* I - Element node */
+ const char *name, /* I - Name of attribute */
+ const char *value) /* I - Attribute value */
+{
+ int i; /* Looping var */
+ stp_mxml_attr_t *attr; /* New attribute */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!node || node->type != STP_MXML_ELEMENT || !name || !value)
+ return;
+
+ /*
+ * Look for the attribute...
+ */
+
+ for (i = node->value.element.num_attrs, attr = node->value.element.attrs;
+ i > 0;
+ i --, attr ++)
+ if (!strcmp(attr->name, name))
+ {
+ /*
+ * Replace the attribute value and return...
+ */
+
+ free(attr->value);
+
+ attr->value = strdup(value);
+
+ return;
+ }
+
+ /*
+ * Attribute not found, so add a new one...
+ */
+
+ if (node->value.element.num_attrs == 0)
+ attr = malloc(sizeof(stp_mxml_attr_t));
+ else
+ attr = realloc(node->value.element.attrs,
+ (node->value.element.num_attrs + 1) * sizeof(stp_mxml_attr_t));
+
+ if (!attr)
+ {
+ fprintf(stderr, "Unable to allocate memory for attribute '%s' in element %s!\n",
+ name, node->value.element.name);
+ return;
+ }
+
+ node->value.element.attrs = attr;
+ attr += node->value.element.num_attrs;
+
+ attr->name = strdup(name);
+ attr->value = strdup(value);
+
+ if (!attr->name || !attr->value)
+ {
+ if (attr->name)
+ free(attr->name);
+
+ if (attr->value)
+ free(attr->value);
+
+ fprintf(stderr, "Unable to allocate memory for attribute '%s' in element %s!\n",
+ name, node->value.element.name);
+
+ return;
+ }
+
+ node->value.element.num_attrs ++;
+}
+
+
+/*
+ * End of "$Id: mxml-attr.c,v 1.7 2004/09/17 18:38:21 rleigh Exp $".
+ */
diff --git a/src/main/mxml-file.c b/src/main/mxml-file.c
new file mode 100644
index 0000000..ef676e7
--- /dev/null
+++ b/src/main/mxml-file.c
@@ -0,0 +1,1436 @@
+/*
+ * "$Id: mxml-file.c,v 1.7 2004/09/17 18:38:21 rleigh Exp $"
+ *
+ * File loading code for mini-XML, a small XML-like file parsing library.
+ *
+ * Copyright 2003 by Michael Sweet.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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.
+ *
+ * Contents:
+ *
+ * stp_mxmlLoadFile() - Load a file into an XML node tree.
+ * stp_mxmlLoadString() - Load a string into an XML node tree.
+ * stp_mxmlSaveAllocString() - Save an XML node tree to an allocated string.
+ * stp_mxmlSaveFile() - Save an XML tree to a file.
+ * stp_mxmlSaveString() - Save an XML node tree to a string.
+ * mxml_add_char() - Add a character to a buffer, expanding as needed.
+ * mxml_file_getc() - Get a character from a file.
+ * mxml_load_data() - Load data into an XML node tree.
+ * mxml_parse_element() - Parse an element for any attributes...
+ * mxml_string_getc() - Get a character from a string.
+ * mxml_write_node() - Save an XML node to a file.
+ * mxml_write_string() - Write a string, escaping & and < as needed.
+ * mxml_write_ws() - Do whitespace callback...
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include <gutenprint/mxml.h>
+#include "config.h"
+
+
+/*
+ * Local functions...
+ */
+
+static int mxml_add_char(int ch, char **ptr, char **buffer,
+ int *bufsize);
+static int mxml_file_getc(void *p);
+static int mxml_file_putc(int ch, void *p);
+static stp_mxml_node_t *mxml_load_data(stp_mxml_node_t *top, void *p,
+ stp_mxml_type_t (*cb)(stp_mxml_node_t *),
+ int (*getc_cb)(void *));
+static int mxml_parse_element(stp_mxml_node_t *node, void *p,
+ int (*getc_cb)(void *));
+static int mxml_string_getc(void *p);
+static int mxml_string_putc(int ch, void *p);
+static int mxml_write_node(stp_mxml_node_t *node, void *p,
+ int (*cb)(stp_mxml_node_t *, int),
+ int col,
+ int (*putc_cb)(int, void *));
+static int mxml_write_string(const char *s, void *p,
+ int (*putc_cb)(int, void *));
+static int mxml_write_ws(stp_mxml_node_t *node, void *p,
+ int (*cb)(stp_mxml_node_t *, int), int ws,
+ int col, int (*putc_cb)(int, void *));
+
+
+/*
+ * 'stp_mxmlLoadFile()' - Load a file into an XML node tree.
+ *
+ * The nodes in the specified file are added to the specified top node.
+ * If no top node is provided, the XML file MUST be well-formed with a
+ * single parent node like <?xml> for the entire file. The callback
+ * function returns the value type that should be used for child nodes.
+ * If STP_MXML_NO_CALLBACK is specified then all child nodes will be either
+ * STP_MXML_ELEMENT or STP_MXML_TEXT nodes.
+ */
+
+stp_mxml_node_t * /* O - First node or NULL if the file could not be read. */
+stp_mxmlLoadFile(stp_mxml_node_t *top, /* I - Top node */
+ FILE *fp, /* I - File to read from */
+ stp_mxml_type_t (*cb)(stp_mxml_node_t *))
+ /* I - Callback function or STP_MXML_NO_CALLBACK */
+{
+ return (mxml_load_data(top, fp, cb, mxml_file_getc));
+}
+
+
+/*
+ * 'stp_mxmlLoadString()' - Load a string into an XML node tree.
+ *
+ * The nodes in the specified string are added to the specified top node.
+ * If no top node is provided, the XML string MUST be well-formed with a
+ * single parent node like <?xml> for the entire string. The callback
+ * function returns the value type that should be used for child nodes.
+ * If STP_MXML_NO_CALLBACK is specified then all child nodes will be either
+ * STP_MXML_ELEMENT or STP_MXML_TEXT nodes.
+ */
+
+stp_mxml_node_t * /* O - First node or NULL if the string has errors. */
+stp_mxmlLoadString(stp_mxml_node_t *top, /* I - Top node */
+ const char *s, /* I - String to load */
+ stp_mxml_type_t (*cb)(stp_mxml_node_t *))
+ /* I - Callback function or STP_MXML_NO_CALLBACK */
+{
+ return (mxml_load_data(top, &s, cb, mxml_string_getc));
+}
+
+
+/*
+ * 'stp_mxmlSaveAllocString()' - Save an XML node tree to an allocated string.
+ *
+ * This function returns a pointer to a string containing the textual
+ * representation of the XML node tree. The string should be freed
+ * using the free() function when you are done with it. NULL is returned
+ * if the node would produce an empty string or if the string cannot be
+ * allocated.
+ */
+
+char * /* O - Allocated string or NULL */
+stp_mxmlSaveAllocString(stp_mxml_node_t *node, /* I - Node to write */
+ int (*cb)(stp_mxml_node_t *, int))
+ /* I - Whitespace callback or STP_MXML_NO_CALLBACK */
+{
+ int bytes; /* Required bytes */
+ char buffer[8192]; /* Temporary buffer */
+ char *s; /* Allocated string */
+
+
+ /*
+ * Write the node to the temporary buffer...
+ */
+
+ bytes = stp_mxmlSaveString(node, buffer, sizeof(buffer), cb);
+
+ if (bytes <= 0)
+ return (NULL);
+
+ if (bytes < (int)(sizeof(buffer) - 1))
+ {
+ /*
+ * Node fit inside the buffer, so just duplicate that string and
+ * return...
+ */
+
+ return (strdup(buffer));
+ }
+
+ /*
+ * Allocate a buffer of the required size and save the node to the
+ * new buffer...
+ */
+
+ if ((s = malloc(bytes + 1)) == NULL)
+ return (NULL);
+
+ stp_mxmlSaveString(node, s, bytes + 1, cb);
+
+ /*
+ * Return the allocated string...
+ */
+
+ return (s);
+}
+
+
+/*
+ * 'stp_mxmlSaveFile()' - Save an XML tree to a file.
+ *
+ * The callback argument specifies a function that returns a whitespace
+ * character or nul (0) before and after each element. If STP_MXML_NO_CALLBACK
+ * is specified, whitespace will only be added before STP_MXML_TEXT nodes
+ * with leading whitespace and before attribute names inside opening
+ * element tags.
+ */
+
+int /* O - 0 on success, -1 on error. */
+stp_mxmlSaveFile(stp_mxml_node_t *node, /* I - Node to write */
+ FILE *fp, /* I - File to write to */
+ int (*cb)(stp_mxml_node_t *, int))
+ /* I - Whitespace callback or STP_MXML_NO_CALLBACK */
+{
+ int col; /* Final column */
+
+
+ /*
+ * Write the node...
+ */
+
+ if ((col = mxml_write_node(node, fp, cb, 0, mxml_file_putc)) < 0)
+ return (-1);
+
+ if (col > 0)
+ if (putc('\n', fp) < 0)
+ return (-1);
+
+ /*
+ * Return 0 (success)...
+ */
+
+ return (0);
+}
+
+
+/*
+ * 'stp_mxmlSaveString()' - Save an XML node tree to a string.
+ *
+ * This function returns the total number of bytes that would be
+ * required for the string but only copies (bufsize - 1) characters
+ * into the specified buffer.
+ */
+
+int /* O - Size of string */
+stp_mxmlSaveString(stp_mxml_node_t *node, /* I - Node to write */
+ char *buffer, /* I - String buffer */
+ int bufsize, /* I - Size of string buffer */
+ int (*cb)(stp_mxml_node_t *, int))
+ /* I - Whitespace callback or STP_MXML_NO_CALLBACK */
+{
+ int col; /* Final column */
+ char *ptr[2]; /* Pointers for putc_cb */
+
+
+ /*
+ * Write the node...
+ */
+
+ ptr[0] = buffer;
+ ptr[1] = buffer + bufsize;
+
+ if ((col = mxml_write_node(node, ptr, cb, 0, mxml_string_putc)) < 0)
+ return (-1);
+
+ if (col > 0)
+ mxml_string_putc('\n', ptr);
+
+ /*
+ * Nul-terminate the buffer...
+ */
+
+ if (ptr[0] >= ptr[1])
+ buffer[bufsize - 1] = '\0';
+ else
+ ptr[0][0] = '\0';
+
+ /*
+ * Return the number of characters...
+ */
+
+ return (ptr[0] - buffer);
+}
+
+
+/*
+ * 'mxml_add_char()' - Add a character to a buffer, expanding as needed.
+ */
+
+static int /* O - 0 on success, -1 on error */
+mxml_add_char(int ch, /* I - Character to add */
+ char **bufptr, /* IO - Current position in buffer */
+ char **buffer, /* IO - Current buffer */
+ int *bufsize) /* IO - Current buffer size */
+{
+ char *newbuffer; /* New buffer value */
+
+
+ if (*bufptr >= (*buffer + *bufsize - 1))
+ {
+ /*
+ * Increase the size of the buffer...
+ */
+
+ if (*bufsize < 1024)
+ (*bufsize) *= 2;
+ else
+ (*bufsize) += 1024;
+
+ if ((newbuffer = realloc(*buffer, *bufsize)) == NULL)
+ {
+ free(*buffer);
+
+ fprintf(stderr, "Unable to expand string buffer to %d bytes!\n",
+ *bufsize);
+
+ return (-1);
+ }
+
+ *bufptr = newbuffer + (*bufptr - *buffer);
+ *buffer = newbuffer;
+ }
+
+ *(*bufptr)++ = ch;
+
+ return (0);
+}
+
+
+/*
+ * 'mxml_file_getc()' - Get a character from a file.
+ */
+
+static int /* O - Character or EOF */
+mxml_file_getc(void *p) /* I - Pointer to file */
+{
+ return (getc((FILE *)p));
+}
+
+
+/*
+ * 'mxml_file_putc()' - Write a character to a file.
+ */
+
+static int /* O - 0 on success, -1 on failure */
+mxml_file_putc(int ch, /* I - Character to write */
+ void *p) /* I - Pointer to file */
+{
+ return (putc(ch, (FILE *)p));
+}
+
+
+/*
+ * 'mxml_load_data()' - Load data into an XML node tree.
+ */
+
+static stp_mxml_node_t * /* O - First node or NULL if the file could not be read. */
+mxml_load_data(stp_mxml_node_t *top, /* I - Top node */
+ void *p, /* I - Pointer to data */
+ stp_mxml_type_t (*cb)(stp_mxml_node_t *),
+ /* I - Callback function or STP_MXML_NO_CALLBACK */
+ int (*getc_cb)(void *))
+ /* I - Read function */
+{
+ stp_mxml_node_t *node, /* Current node */
+ *parent; /* Current parent node */
+ int ch, /* Character from file */
+ whitespace; /* Non-zero if whitespace seen */
+ char *buffer, /* String buffer */
+ *bufptr; /* Pointer into buffer */
+ int bufsize; /* Size of buffer */
+ stp_mxml_type_t type; /* Current node type */
+
+
+ /*
+ * Read elements and other nodes from the file...
+ */
+
+ if ((buffer = malloc(64)) == NULL)
+ {
+ fputs("Unable to allocate string buffer!\n", stderr);
+ return (NULL);
+ }
+
+ bufsize = 64;
+ bufptr = buffer;
+ parent = top;
+ whitespace = 0;
+
+ if (cb && parent)
+ type = (*cb)(parent);
+ else
+ type = STP_MXML_TEXT;
+
+ while ((ch = (*getc_cb)(p)) != EOF)
+ {
+ if ((ch == '<' || (isspace(ch) && type != STP_MXML_OPAQUE)) && bufptr > buffer)
+ {
+ /*
+ * Add a new value node...
+ */
+
+ *bufptr = '\0';
+
+ switch (type)
+ {
+ case STP_MXML_INTEGER :
+ node = stp_mxmlNewInteger(parent, strtol(buffer, &bufptr, 0));
+ break;
+
+ case STP_MXML_OPAQUE :
+ node = stp_mxmlNewOpaque(parent, buffer);
+ break;
+
+ case STP_MXML_REAL :
+ node = stp_mxmlNewReal(parent, strtod(buffer, &bufptr));
+ break;
+
+ case STP_MXML_TEXT :
+ node = stp_mxmlNewText(parent, whitespace, buffer);
+ break;
+
+ default : /* Should never happen... */
+ node = NULL;
+ break;
+ }
+
+ if (*bufptr)
+ {
+ /*
+ * Bad integer/real number value...
+ */
+
+ fprintf(stderr, "Bad %s value '%s' in parent <%s>!\n",
+ type == STP_MXML_INTEGER ? "integer" : "real", buffer,
+ parent ? parent->value.element.name : "null");
+ break;
+ }
+
+ bufptr = buffer;
+ whitespace = isspace(ch) && type == STP_MXML_TEXT;
+
+ if (!node)
+ {
+ /*
+ * Just print error for now...
+ */
+
+ fprintf(stderr, "Unable to add value node of type %d to parent <%s>!\n",
+ type, parent ? parent->value.element.name : "null");
+ break;
+ }
+ }
+ else if (isspace(ch) && type == STP_MXML_TEXT)
+ whitespace = 1;
+
+ /*
+ * Add lone whitespace node if we have an element and existing
+ * whitespace...
+ */
+
+ if (ch == '<' && whitespace && type == STP_MXML_TEXT)
+ {
+ stp_mxmlNewText(parent, whitespace, "");
+ whitespace = 0;
+ }
+
+ if (ch == '<')
+ {
+ /*
+ * Start of open/close tag...
+ */
+
+ bufptr = buffer;
+
+ while ((ch = (*getc_cb)(p)) != EOF)
+ if (isspace(ch) || ch == '>' || (ch == '/' && bufptr > buffer))
+ break;
+ else if (mxml_add_char(ch, &bufptr, &buffer, &bufsize))
+ {
+ free(buffer);
+ return (NULL);
+ }
+ else if ((bufptr - buffer) == 3 && !strncmp(buffer, "!--", 3))
+ break;
+
+ *bufptr = '\0';
+
+ if (!strcmp(buffer, "!--"))
+ {
+ /*
+ * Gather rest of comment...
+ */
+
+ while ((ch = (*getc_cb)(p)) != EOF)
+ {
+ if (ch == '>' && bufptr > (buffer + 4) &&
+ !strncmp(bufptr - 2, "--", 2))
+ break;
+ else if (mxml_add_char(ch, &bufptr, &buffer, &bufsize))
+ {
+ free(buffer);
+ return (NULL);
+ }
+ }
+
+ /*
+ * Error out if we didn't get the whole comment...
+ */
+
+ if (ch != '>')
+ break;
+
+ /*
+ * Otherwise add this as an element under the current parent...
+ */
+
+ *bufptr = '\0';
+
+ if (!stp_mxmlNewElement(parent, buffer))
+ {
+ /*
+ * Just print error for now...
+ */
+
+ fprintf(stderr, "Unable to add comment node to parent <%s>!\n",
+ parent ? parent->value.element.name : "null");
+ break;
+ }
+ }
+ else if (buffer[0] == '!')
+ {
+ /*
+ * Gather rest of declaration...
+ */
+
+ do
+ {
+ if (ch == '>')
+ break;
+ else if (mxml_add_char(ch, &bufptr, &buffer, &bufsize))
+ {
+ free(buffer);
+ return (NULL);
+ }
+ }
+ while ((ch = (*getc_cb)(p)) != EOF);
+
+ /*
+ * Error out if we didn't get the whole declaration...
+ */
+
+ if (ch != '>')
+ break;
+
+ /*
+ * Otherwise add this as an element under the current parent...
+ */
+
+ *bufptr = '\0';
+
+ node = stp_mxmlNewElement(parent, buffer);
+ if (!node)
+ {
+ /*
+ * Just print error for now...
+ */
+
+ fprintf(stderr, "Unable to add declaration node to parent <%s>!\n",
+ parent ? parent->value.element.name : "null");
+ break;
+ }
+
+ /*
+ * Descend into this node, setting the value type as needed...
+ */
+
+ parent = node;
+
+ if (cb && parent)
+ type = (*cb)(parent);
+ }
+ else if (buffer[0] == '/')
+ {
+ /*
+ * Handle close tag...
+ */
+
+ if (!parent || strcmp(buffer + 1, parent->value.element.name))
+ {
+ /*
+ * Close tag doesn't match tree; print an error for now...
+ */
+
+ fprintf(stderr, "Mismatched close tag <%s> under parent <%s>!\n",
+ buffer, parent->value.element.name);
+ break;
+ }
+
+ /*
+ * Keep reading until we see >...
+ */
+
+ while (ch != '>' && ch != EOF)
+ ch = (*getc_cb)(p);
+
+ /*
+ * Ascend into the parent and set the value type as needed...
+ */
+
+ parent = parent->parent;
+
+ if (cb && parent)
+ type = (*cb)(parent);
+ }
+ else
+ {
+ /*
+ * Handle open tag...
+ */
+
+ node = stp_mxmlNewElement(parent, buffer);
+
+ if (!node)
+ {
+ /*
+ * Just print error for now...
+ */
+
+ fprintf(stderr, "Unable to add element node to parent <%s>!\n",
+ parent ? parent->value.element.name : "null");
+ break;
+ }
+
+ if (isspace(ch))
+ ch = mxml_parse_element(node, p, getc_cb);
+ else if (ch == '/')
+ {
+ if ((ch = (*getc_cb)(p)) != '>')
+ {
+ fprintf(stderr, "Expected > but got '%c' instead for element <%s/>!\n",
+ ch, buffer);
+ break;
+ }
+
+ ch = '/';
+ }
+
+ if (ch == EOF)
+ break;
+
+ if (ch != '/')
+ {
+ /*
+ * Descend into this node, setting the value type as needed...
+ */
+
+ parent = node;
+
+ if (cb && parent)
+ type = (*cb)(parent);
+ }
+ }
+
+ bufptr = buffer;
+ }
+ else if (ch == '&')
+ {
+ /*
+ * Add character entity to current buffer... Currently we only
+ * support &lt;, &amp;, &gt;, &nbsp;, &quot;, &#nnn;, and &#xXXXX;...
+ */
+
+ char entity[64], /* Entity string */
+ *entptr; /* Pointer into entity */
+
+
+ entity[0] = ch;
+ entptr = entity + 1;
+
+ while ((ch = (*getc_cb)(p)) != EOF)
+ if (!isalnum(ch) && ch != '#')
+ break;
+ else if (entptr < (entity + sizeof(entity) - 1))
+ *entptr++ = ch;
+ else
+ {
+ fprintf(stderr, "Entity name too long under parent <%s>!\n",
+ parent ? parent->value.element.name : "null");
+ break;
+ }
+
+ *entptr = '\0';
+
+ if (ch != ';')
+ {
+ fprintf(stderr, "Entity name \"%s\" not terminated under parent <%s>!\n",
+ entity, parent ? parent->value.element.name : "null");
+ break;
+ }
+
+ if (entity[1] == '#')
+ {
+ if (entity[2] == 'x')
+ ch = strtol(entity + 3, NULL, 16);
+ else
+ ch = strtol(entity + 2, NULL, 10);
+ }
+ else if (!strcmp(entity, "&amp"))
+ ch = '&';
+ else if (!strcmp(entity, "&gt"))
+ ch = '>';
+ else if (!strcmp(entity, "&lt"))
+ ch = '<';
+ else if (!strcmp(entity, "&nbsp"))
+ ch = 0xa0;
+ else if (!strcmp(entity, "&quot"))
+ ch = '\"';
+ else
+ {
+ fprintf(stderr, "Entity name \"%s;\" not supported under parent <%s>!\n",
+ entity, parent ? parent->value.element.name : "null");
+ break;
+ }
+
+ if (ch < 128)
+ {
+ /*
+ * Plain ASCII doesn't need special encoding...
+ */
+
+ if (mxml_add_char(ch, &bufptr, &buffer, &bufsize))
+ {
+ free(buffer);
+ return (NULL);
+ }
+ }
+ else
+ {
+ /*
+ * Use UTF-8 encoding for the Unicode char...
+ */
+
+ if (ch < 2048)
+ {
+ if (mxml_add_char(0xc0 | (ch >> 6), &bufptr, &buffer, &bufsize))
+ {
+ free(buffer);
+ return (NULL);
+ }
+ if (mxml_add_char(0x80 | (ch & 63), &bufptr, &buffer, &bufsize))
+ {
+ free(buffer);
+ return (NULL);
+ }
+ }
+ else if (ch < 65536)
+ {
+ if (mxml_add_char(0xe0 | (ch >> 12), &bufptr, &buffer, &bufsize))
+ {
+ free(buffer);
+ return (NULL);
+ }
+ if (mxml_add_char(0x80 | ((ch >> 6) & 63), &bufptr, &buffer, &bufsize))
+ {
+ free(buffer);
+ return (NULL);
+ }
+ if (mxml_add_char(0x80 | (ch & 63), &bufptr, &buffer, &bufsize))
+ {
+ free(buffer);
+ return (NULL);
+ }
+ }
+ else
+ {
+ if (mxml_add_char(0xf0 | (ch >> 18), &bufptr, &buffer, &bufsize))
+ {
+ free(buffer);
+ return (NULL);
+ }
+ if (mxml_add_char(0x80 | ((ch >> 12) & 63), &bufptr, &buffer, &bufsize))
+ {
+ free(buffer);
+ return (NULL);
+ }
+ if (mxml_add_char(0x80 | ((ch >> 6) & 63), &bufptr, &buffer, &bufsize))
+ {
+ free(buffer);
+ return (NULL);
+ }
+ if (mxml_add_char(0x80 | (ch & 63), &bufptr, &buffer, &bufsize))
+ {
+ free(buffer);
+ return (NULL);
+ }
+ }
+ }
+ }
+ else if (type == STP_MXML_OPAQUE || !isspace(ch))
+ {
+ /*
+ * Add character to current buffer...
+ */
+
+ if (mxml_add_char(ch, &bufptr, &buffer, &bufsize))
+ {
+ free(buffer);
+ return (NULL);
+ }
+ }
+ }
+
+ /*
+ * Free the string buffer - we don't need it anymore...
+ */
+
+ free(buffer);
+
+ /*
+ * Find the top element and return it...
+ */
+
+ if (parent)
+ {
+ while (parent->parent != top)
+ parent = parent->parent;
+ }
+
+ return (parent);
+}
+
+
+/*
+ * 'mxml_parse_element()' - Parse an element for any attributes...
+ */
+
+static int /* O - Terminating character */
+mxml_parse_element(stp_mxml_node_t *node, /* I - Element node */
+ void *p, /* I - Data to read from */
+ int (*getc_cb)(void *))
+ /* I - Data callback */
+{
+ int ch, /* Current character in file */
+ quote; /* Quoting character */
+ char *name, /* Attribute name */
+ *value, /* Attribute value */
+ *ptr; /* Pointer into name/value */
+ int namesize, /* Size of name string */
+ valsize; /* Size of value string */
+
+
+ /*
+ * Initialize the name and value buffers...
+ */
+
+ if ((name = malloc(64)) == NULL)
+ {
+ fputs("Unable to allocate memory for name!\n", stderr);
+ return (EOF);
+ }
+
+ namesize = 64;
+
+ if ((value = malloc(64)) == NULL)
+ {
+ free(name);
+ fputs("Unable to allocate memory for value!\n", stderr);
+ return (EOF);
+ }
+
+ valsize = 64;
+
+ /*
+ * Loop until we hit a >, /, ?, or EOF...
+ */
+
+ while ((ch = (*getc_cb)(p)) != EOF)
+ {
+#ifdef DEBUG
+ fprintf(stderr, "parse_element: ch='%c'\n", ch);
+#endif /* DEBUG */
+
+ /*
+ * Skip leading whitespace...
+ */
+
+ if (isspace(ch))
+ continue;
+
+ /*
+ * Stop at /, ?, or >...
+ */
+
+ if (ch == '/' || ch == '?')
+ {
+ /*
+ * Grab the > character and print an error if it isn't there...
+ */
+
+ quote = (*getc_cb)(p);
+
+ if (quote != '>')
+ {
+ fprintf(stderr, "Expected '>' after '%c' for element %s, but got '%c'!\n",
+ ch, node->value.element.name, quote);
+ ch = EOF;
+ }
+
+ break;
+ }
+ else if (ch == '>')
+ break;
+
+ /*
+ * Read the attribute name...
+ */
+
+ name[0] = ch;
+ ptr = name + 1;
+
+ while ((ch = (*getc_cb)(p)) != EOF)
+ if (isspace(ch) || ch == '=' || ch == '/' || ch == '>' || ch == '?')
+ break;
+ else if (mxml_add_char(ch, &ptr, &name, &namesize))
+ {
+ free(name);
+ free(value);
+ return (EOF);
+ }
+
+ *ptr = '\0';
+
+ if (ch == '=')
+ {
+ /*
+ * Read the attribute value...
+ */
+
+ if ((ch = (*getc_cb)(p)) == EOF)
+ {
+ fprintf(stderr, "Missing value for attribute '%s' in element %s!\n",
+ name, node->value.element.name);
+ return (EOF);
+ }
+
+ if (ch == '\'' || ch == '\"')
+ {
+ /*
+ * Read quoted value...
+ */
+
+ quote = ch;
+ ptr = value;
+
+ while ((ch = (*getc_cb)(p)) != EOF)
+ if (ch == quote)
+ break;
+ else if (mxml_add_char(ch, &ptr, &value, &valsize))
+ {
+ free(name);
+ free(value);
+ return (EOF);
+ }
+
+ *ptr = '\0';
+ }
+ else
+ {
+ /*
+ * Read unquoted value...
+ */
+
+ value[0] = ch;
+ ptr = value + 1;
+
+ while ((ch = (*getc_cb)(p)) != EOF)
+ if (isspace(ch) || ch == '=' || ch == '/' || ch == '>')
+ break;
+ else if (mxml_add_char(ch, &ptr, &value, &valsize))
+ {
+ free(name);
+ free(value);
+ return (EOF);
+ }
+
+ *ptr = '\0';
+ }
+ }
+ else
+ value[0] = '\0';
+
+ /*
+ * Save last character in case we need it...
+ */
+
+ if (ch == '/' || ch == '?')
+ {
+ /*
+ * Grab the > character and print an error if it isn't there...
+ */
+
+ quote = (*getc_cb)(p);
+
+ if (quote != '>')
+ {
+ fprintf(stderr, "Expected '>' after '%c' for element %s, but got '%c'!\n",
+ ch, node->value.element.name, quote);
+ ch = EOF;
+ }
+
+ break;
+ }
+ else if (ch == '>')
+ break;
+
+ /*
+ * Set the attribute...
+ */
+
+ stp_mxmlElementSetAttr(node, name, value);
+ }
+
+ /*
+ * Free the name and value buffers and return...
+ */
+
+ free(name);
+ free(value);
+
+ return (ch);
+}
+
+
+/*
+ * 'mxml_string_getc()' - Get a character from a string.
+ */
+
+static int /* O - Character or EOF */
+mxml_string_getc(void *p) /* I - Pointer to file */
+{
+ int ch; /* Character */
+ const char **s; /* Pointer to string pointer */
+
+
+ s = (const char **)p;
+
+ if ((ch = *s[0]) != 0)
+ {
+ (*s)++;
+ return (ch);
+ }
+ else
+ return (EOF);
+}
+
+
+/*
+ * 'mxml_string_putc()' - Write a character to a string.
+ */
+
+static int /* O - 0 on success, -1 on failure */
+mxml_string_putc(int ch, /* I - Character to write */
+ void *p) /* I - Pointer to string pointers */
+{
+ char **pp; /* Pointer to string pointers */
+
+
+ pp = (char **)p;
+
+ if (pp[0] < pp[1])
+ pp[0][0] = ch;
+
+ pp[0] ++;
+
+ return (0);
+}
+
+
+/*
+ * 'mxml_write_node()' - Save an XML node to a file.
+ */
+
+static int /* O - Column or -1 on error */
+mxml_write_node(stp_mxml_node_t *node, /* I - Node to write */
+ void *p, /* I - File to write to */
+ int (*cb)(stp_mxml_node_t *, int),
+ /* I - Whitespace callback */
+ int col, /* I - Current column */
+ int (*putc_cb)(int, void *))
+{
+ int i; /* Looping var */
+ stp_mxml_attr_t *attr; /* Current attribute */
+ char s[255]; /* Temporary string */
+
+
+ while (node != NULL)
+ {
+ /*
+ * Print the node value...
+ */
+
+ switch (node->type)
+ {
+ case STP_MXML_ELEMENT :
+ col = mxml_write_ws(node, p, cb, STP_MXML_WS_BEFORE_OPEN, col, putc_cb);
+
+ if ((*putc_cb)('<', p) < 0)
+ return (-1);
+ if (mxml_write_string(node->value.element.name, p, putc_cb) < 0)
+ return (-1);
+
+ col += strlen(node->value.element.name) + 1;
+
+ for (i = node->value.element.num_attrs, attr = node->value.element.attrs;
+ i > 0;
+ i --, attr ++)
+ {
+ if ((col + strlen(attr->name) + strlen(attr->value) + 3) > STP_MXML_WRAP)
+ {
+ if ((*putc_cb)('\n', p) < 0)
+ return (-1);
+
+ col = 0;
+ }
+ else
+ {
+ if ((*putc_cb)(' ', p) < 0)
+ return (-1);
+
+ col ++;
+ }
+
+ if (mxml_write_string(attr->name, p, putc_cb) < 0)
+ return (-1);
+ if ((*putc_cb)('=', p) < 0)
+ return (-1);
+ if ((*putc_cb)('\"', p) < 0)
+ return (-1);
+ if (mxml_write_string(attr->value, p, putc_cb) < 0)
+ return (-1);
+ if ((*putc_cb)('\"', p) < 0)
+ return (-1);
+
+ col += strlen(attr->name) + strlen(attr->value) + 3;
+ }
+
+ if (node->child)
+ {
+ /*
+ * The ? and ! elements are special-cases and have no end tags...
+ */
+
+ if (node->value.element.name[0] == '?')
+ {
+ if ((*putc_cb)('?', p) < 0)
+ return (-1);
+ if ((*putc_cb)('>', p) < 0)
+ return (-1);
+ if ((*putc_cb)('\n', p) < 0)
+ return (-1);
+
+ col = 0;
+ }
+ else if ((*putc_cb)('>', p) < 0)
+ return (-1);
+ else
+ col ++;
+
+ col = mxml_write_ws(node, p, cb, STP_MXML_WS_AFTER_OPEN, col, putc_cb);
+
+ if ((col = mxml_write_node(node->child, p, cb, col, putc_cb)) < 0)
+ return (-1);
+
+ if (node->value.element.name[0] != '?' &&
+ node->value.element.name[0] != '!')
+ {
+ col = mxml_write_ws(node, p, cb, STP_MXML_WS_BEFORE_CLOSE, col, putc_cb);
+
+ if ((*putc_cb)('<', p) < 0)
+ return (-1);
+ if ((*putc_cb)('/', p) < 0)
+ return (-1);
+ if (mxml_write_string(node->value.element.name, p, putc_cb) < 0)
+ return (-1);
+ if ((*putc_cb)('>', p) < 0)
+ return (-1);
+
+ col += strlen(node->value.element.name) + 3;
+
+ col = mxml_write_ws(node, p, cb, STP_MXML_WS_AFTER_CLOSE, col, putc_cb);
+ }
+ }
+ else if (node->value.element.name[0] == '!')
+ {
+ if ((*putc_cb)('>', p) < 0)
+ return (-1);
+ else
+ col ++;
+
+ col = mxml_write_ws(node, p, cb, STP_MXML_WS_AFTER_OPEN, col, putc_cb);
+ }
+ else
+ {
+ if ((*putc_cb)('/', p) < 0)
+ return (-1);
+ if ((*putc_cb)('>', p) < 0)
+ return (-1);
+
+ col += 2;
+
+ col = mxml_write_ws(node, p, cb, STP_MXML_WS_AFTER_OPEN, col, putc_cb);
+ }
+ break;
+
+ case STP_MXML_INTEGER :
+ if (node->prev)
+ {
+ if (col > STP_MXML_WRAP)
+ {
+ if ((*putc_cb)('\n', p) < 0)
+ return (-1);
+
+ col = 0;
+ }
+ else if ((*putc_cb)(' ', p) < 0)
+ return (-1);
+ else
+ col ++;
+ }
+
+ sprintf(s, "%d", node->value.integer);
+ if (mxml_write_string(s, p, putc_cb) < 0)
+ return (-1);
+
+ col += strlen(s);
+ break;
+
+ case STP_MXML_OPAQUE :
+ if (mxml_write_string(node->value.opaque, p, putc_cb) < 0)
+ return (-1);
+
+ col += strlen(node->value.opaque);
+ break;
+
+ case STP_MXML_REAL :
+ if (node->prev)
+ {
+ if (col > STP_MXML_WRAP)
+ {
+ if ((*putc_cb)('\n', p) < 0)
+ return (-1);
+
+ col = 0;
+ }
+ else if ((*putc_cb)(' ', p) < 0)
+ return (-1);
+ else
+ col ++;
+ }
+
+ sprintf(s, "%f", node->value.real);
+ if (mxml_write_string(s, p, putc_cb) < 0)
+ return (-1);
+
+ col += strlen(s);
+ break;
+
+ case STP_MXML_TEXT :
+ if (node->value.text.whitespace && col > 0)
+ {
+ if (col > STP_MXML_WRAP)
+ {
+ if ((*putc_cb)('\n', p) < 0)
+ return (-1);
+
+ col = 0;
+ }
+ else if ((*putc_cb)(' ', p) < 0)
+ return (-1);
+ else
+ col ++;
+ }
+
+ if (mxml_write_string(node->value.text.string, p, putc_cb) < 0)
+ return (-1);
+
+ col += strlen(node->value.text.string);
+ break;
+ }
+
+ /*
+ * Next node...
+ */
+
+ node = node->next;
+ }
+
+ return (col);
+}
+
+
+/*
+ * 'mxml_write_string()' - Write a string, escaping & and < as needed.
+ */
+
+static int /* O - 0 on success, -1 on failure */
+mxml_write_string(const char *s, /* I - String to write */
+ void *p, /* I - Write pointer */
+ int (*putc_cb)(int, void *))
+ /* I - Write callback */
+{
+ char buf[255], /* Buffer */
+ *bufptr; /* Pointer into buffer */
+
+
+ while (*s)
+ {
+ if (*s == '&')
+ {
+ if ((*putc_cb)('&', p) < 0)
+ return (-1);
+ if ((*putc_cb)('a', p) < 0)
+ return (-1);
+ if ((*putc_cb)('m', p) < 0)
+ return (-1);
+ if ((*putc_cb)('p', p) < 0)
+ return (-1);
+ if ((*putc_cb)(';', p) < 0)
+ return (-1);
+ }
+ else if (*s == '<')
+ {
+ if ((*putc_cb)('&', p) < 0)
+ return (-1);
+ if ((*putc_cb)('l', p) < 0)
+ return (-1);
+ if ((*putc_cb)('t', p) < 0)
+ return (-1);
+ if ((*putc_cb)(';', p) < 0)
+ return (-1);
+ }
+ else if (*s == '>')
+ {
+ if ((*putc_cb)('&', p) < 0)
+ return (-1);
+ if ((*putc_cb)('g', p) < 0)
+ return (-1);
+ if ((*putc_cb)('t', p) < 0)
+ return (-1);
+ if ((*putc_cb)(';', p) < 0)
+ return (-1);
+ }
+ else if (*s == '\"')
+ {
+ if ((*putc_cb)('&', p) < 0)
+ return (-1);
+ if ((*putc_cb)('q', p) < 0)
+ return (-1);
+ if ((*putc_cb)('u', p) < 0)
+ return (-1);
+ if ((*putc_cb)('o', p) < 0)
+ return (-1);
+ if ((*putc_cb)('t', p) < 0)
+ return (-1);
+ if ((*putc_cb)(';', p) < 0)
+ return (-1);
+ }
+ else if (*s & 128)
+ {
+ /*
+ * Convert UTF-8 to Unicode constant...
+ */
+
+ int ch; /* Unicode character */
+
+
+ ch = *s & 255;
+
+ if ((ch & 0xe0) == 0xc0)
+ {
+ ch = ((ch & 0x1f) << 6) | (s[1] & 0x3f);
+ s ++;
+ }
+ else if ((ch & 0xf0) == 0xe0)
+ {
+ ch = ((((ch * 0x0f) << 6) | (s[1] & 0x3f)) << 6) | (s[2] & 0x3f);
+ s += 2;
+ }
+
+ if (ch == 0xa0)
+ {
+ /*
+ * Handle non-breaking space as-is...
+ */
+
+ if ((*putc_cb)('&', p) < 0)
+ return (-1);
+ if ((*putc_cb)('n', p) < 0)
+ return (-1);
+ if ((*putc_cb)('b', p) < 0)
+ return (-1);
+ if ((*putc_cb)('s', p) < 0)
+ return (-1);
+ if ((*putc_cb)('p', p) < 0)
+ return (-1);
+ if ((*putc_cb)(';', p) < 0)
+ return (-1);
+ }
+ else
+ {
+ sprintf(buf, "&#x%x;", ch);
+
+ for (bufptr = buf; *bufptr; bufptr ++)
+ if ((*putc_cb)(*bufptr, p) < 0)
+ return (-1);
+ }
+ }
+ else if ((*putc_cb)(*s, p) < 0)
+ return (-1);
+
+ s ++;
+ }
+
+ return (0);
+}
+
+
+/*
+ * 'mxml_write_ws()' - Do whitespace callback...
+ */
+
+static int /* O - New column */
+mxml_write_ws(stp_mxml_node_t *node, /* I - Current node */
+ void *p, /* I - Write pointer */
+ int (*cb)(stp_mxml_node_t *, int),
+ /* I - Callback function */
+ int ws, /* I - Where value */
+ int col, /* I - Current column */
+ int (*putc_cb)(int, void *))
+ /* I - Write callback */
+{
+ int ch; /* Whitespace character */
+
+
+ if (cb && (ch = (*cb)(node, ws)) != 0)
+ {
+ if ((*putc_cb)(ch, p) < 0)
+ return (-1);
+ else if (ch == '\n')
+ col = 0;
+ else if (ch == '\t')
+ {
+ col += STP_MXML_TAB;
+ col = col - (col % STP_MXML_TAB);
+ }
+ else
+ col ++;
+ }
+
+ return (col);
+}
+
+
+/*
+ * End of "$Id: mxml-file.c,v 1.7 2004/09/17 18:38:21 rleigh Exp $".
+ */
diff --git a/src/main/mxml-node.c b/src/main/mxml-node.c
new file mode 100644
index 0000000..e21f60f
--- /dev/null
+++ b/src/main/mxml-node.c
@@ -0,0 +1,494 @@
+/*
+ * "$Id: mxml-node.c,v 1.7 2004/09/17 18:38:21 rleigh Exp $"
+ *
+ * Node support code for mini-XML, a small XML-like file parsing library.
+ *
+ * Copyright 2003 by Michael Sweet.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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.
+ *
+ * Contents:
+ *
+ * stp_mxmlAdd() - Add a node to a tree.
+ * stp_mxmlDelete() - Delete a node and all of its children.
+ * stp_mxmlNewElement() - Create a new element node.
+ * stp_mxmlNewInteger() - Create a new integer node.
+ * stp_mxmlNewOpaque() - Create a new opaque string.
+ * stp_mxmlNewReal() - Create a new real number node.
+ * stp_mxmlNewText() - Create a new text fragment node.
+ * stp_mxmlRemove() - Remove a node from its parent.
+ * mxml_new() - Create a new node.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include <gutenprint/mxml.h>
+#include "config.h"
+
+
+/*
+ * Local functions...
+ */
+
+static stp_mxml_node_t *mxml_new(stp_mxml_node_t *parent, stp_mxml_type_t type);
+
+
+/*
+ * 'stp_mxmlAdd()' - Add a node to a tree.
+ *
+ * Adds the specified node to the parent. If the child argument is not
+ * NULL, puts the new node before or after the specified child depending
+ * on the value of the where argument. If the child argument is NULL,
+ * puts the new node at the beginning of the child list (STP_MXML_ADD_BEFORE)
+ * or at the end of the child list (STP_MXML_ADD_AFTER). The constant
+ * STP_MXML_ADD_TO_PARENT can be used to specify a NULL child pointer.
+ */
+
+void
+stp_mxmlAdd(stp_mxml_node_t *parent, /* I - Parent node */
+ int where, /* I - Where to add, STP_MXML_ADD_BEFORE or STP_MXML_ADD_AFTER */
+ stp_mxml_node_t *child, /* I - Child node for where or STP_MXML_ADD_TO_PARENT */
+ stp_mxml_node_t *node) /* I - Node to add */
+{
+/* fprintf(stderr, "stp_mxmlAdd(parent=%p, where=%d, child=%p, node=%p)\n", parent,
+ where, child, node);*/
+
+ /*
+ * Range check input...
+ */
+
+ if (!parent || !node)
+ return;
+
+ /*
+ * Remove the node from any existing parent...
+ */
+
+ if (node->parent)
+ stp_mxmlRemove(node);
+
+ /*
+ * Reset pointers...
+ */
+
+ node->parent = parent;
+
+ switch (where)
+ {
+ case STP_MXML_ADD_BEFORE :
+ if (!child || child == parent->child || child->parent != parent)
+ {
+ /*
+ * Insert as first node under parent...
+ */
+
+ node->next = parent->child;
+
+ if (parent->child)
+ parent->child->prev = node;
+ else
+ parent->last_child = node;
+
+ parent->child = node;
+ }
+ else
+ {
+ /*
+ * Insert node before this child...
+ */
+
+ node->next = child;
+ node->prev = child->prev;
+
+ if (child->prev)
+ child->prev->next = node;
+ else
+ parent->child = node;
+
+ child->prev = node;
+ }
+ break;
+
+ case STP_MXML_ADD_AFTER :
+ if (!child || child == parent->last_child || child->parent != parent)
+ {
+ /*
+ * Insert as last node under parent...
+ */
+
+ node->parent = parent;
+ node->prev = parent->last_child;
+
+ if (parent->last_child)
+ parent->last_child->next = node;
+ else
+ parent->child = node;
+
+ parent->last_child = node;
+ }
+ else
+ {
+ /*
+ * Insert node after this child...
+ */
+
+ node->prev = child;
+ node->next = child->next;
+
+ if (child->next)
+ child->next->prev = node;
+ else
+ parent->last_child = node;
+
+ child->next = node;
+ }
+ break;
+ }
+}
+
+
+/*
+ * 'stp_mxmlDelete()' - Delete a node and all of its children.
+ *
+ * If the specified node has a parent, this function first removes the
+ * node from its parent using the stp_mxmlRemove() function.
+ */
+
+void
+stp_mxmlDelete(stp_mxml_node_t *node) /* I - Node to delete */
+{
+ int i; /* Looping var */
+
+
+/* fprintf(stderr, "stp_mxmlDelete(node=%p)\n", node);*/
+
+ /*
+ * Range check input...
+ */
+
+ if (!node)
+ return;
+
+ /*
+ * Remove the node from its parent, if any...
+ */
+
+ stp_mxmlRemove(node);
+
+ /*
+ * Delete children...
+ */
+
+ while (node->child)
+ stp_mxmlDelete(node->child);
+
+ /*
+ * Now delete any node data...
+ */
+
+ switch (node->type)
+ {
+ case STP_MXML_ELEMENT :
+ if (node->value.element.name)
+ free(node->value.element.name);
+
+ if (node->value.element.num_attrs)
+ {
+ for (i = 0; i < node->value.element.num_attrs; i ++)
+ {
+ if (node->value.element.attrs[i].name)
+ free(node->value.element.attrs[i].name);
+ if (node->value.element.attrs[i].value)
+ free(node->value.element.attrs[i].value);
+ }
+
+ free(node->value.element.attrs);
+ }
+ break;
+ case STP_MXML_INTEGER :
+ /* Nothing to do */
+ break;
+ case STP_MXML_OPAQUE :
+ if (node->value.opaque)
+ free(node->value.opaque);
+ break;
+ case STP_MXML_REAL :
+ /* Nothing to do */
+ break;
+ case STP_MXML_TEXT :
+ if (node->value.text.string)
+ free(node->value.text.string);
+ break;
+ }
+
+ /*
+ * Free this node...
+ */
+
+ free(node);
+}
+
+
+/*
+ * 'stp_mxmlNewElement()' - Create a new element node.
+ *
+ * The new element node is added to the end of the specified parent's child
+ * list. The constant STP_MXML_NO_PARENT can be used to specify that the new
+ * element node has no parent.
+ */
+
+stp_mxml_node_t * /* O - New node */
+stp_mxmlNewElement(stp_mxml_node_t *parent, /* I - Parent node or STP_MXML_NO_PARENT */
+ const char *name) /* I - Name of element */
+{
+ stp_mxml_node_t *node; /* New node */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!name)
+ return (NULL);
+
+ /*
+ * Create the node and set the element name...
+ */
+
+ if ((node = mxml_new(parent, STP_MXML_ELEMENT)) != NULL)
+ node->value.element.name = strdup(name);
+
+ return (node);
+}
+
+
+/*
+ * 'stp_mxmlNewInteger()' - Create a new integer node.
+ *
+ * The new integer node is added to the end of the specified parent's child
+ * list. The constant STP_MXML_NO_PARENT can be used to specify that the new
+ * integer node has no parent.
+ */
+
+stp_mxml_node_t * /* O - New node */
+stp_mxmlNewInteger(stp_mxml_node_t *parent, /* I - Parent node or STP_MXML_NO_PARENT */
+ int integer) /* I - Integer value */
+{
+ stp_mxml_node_t *node; /* New node */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!parent)
+ return (NULL);
+
+ /*
+ * Create the node and set the element name...
+ */
+
+ if ((node = mxml_new(parent, STP_MXML_INTEGER)) != NULL)
+ node->value.integer = integer;
+
+ return (node);
+}
+
+
+/*
+ * 'stp_mxmlNewOpaque()' - Create a new opaque string.
+ *
+ * The new opaque node is added to the end of the specified parent's child
+ * list. The constant STP_MXML_NO_PARENT can be used to specify that the new
+ * opaque node has no parent. The opaque string must be nul-terminated and
+ * is copied into the new node.
+ */
+
+stp_mxml_node_t * /* O - New node */
+stp_mxmlNewOpaque(stp_mxml_node_t *parent, /* I - Parent node or STP_MXML_NO_PARENT */
+ const char *opaque) /* I - Opaque string */
+{
+ stp_mxml_node_t *node; /* New node */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!parent || !opaque)
+ return (NULL);
+
+ /*
+ * Create the node and set the element name...
+ */
+
+ if ((node = mxml_new(parent, STP_MXML_OPAQUE)) != NULL)
+ node->value.opaque = strdup(opaque);
+
+ return (node);
+}
+
+
+/*
+ * 'stp_mxmlNewReal()' - Create a new real number node.
+ *
+ * The new real number node is added to the end of the specified parent's
+ * child list. The constant STP_MXML_NO_PARENT can be used to specify that
+ * the new real number node has no parent.
+ */
+
+stp_mxml_node_t * /* O - New node */
+stp_mxmlNewReal(stp_mxml_node_t *parent, /* I - Parent node or STP_MXML_NO_PARENT */
+ double real) /* I - Real number value */
+{
+ stp_mxml_node_t *node; /* New node */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!parent)
+ return (NULL);
+
+ /*
+ * Create the node and set the element name...
+ */
+
+ if ((node = mxml_new(parent, STP_MXML_REAL)) != NULL)
+ node->value.real = real;
+
+ return (node);
+}
+
+
+/*
+ * 'stp_mxmlNewText()' - Create a new text fragment node.
+ *
+ * The new text node is added to the end of the specified parent's child
+ * list. The constant STP_MXML_NO_PARENT can be used to specify that the new
+ * text node has no parent. The whitespace parameter is used to specify
+ * whether leading whitespace is present before the node. The text
+ * string must be nul-terminated and is copied into the new node.
+ */
+
+stp_mxml_node_t * /* O - New node */
+stp_mxmlNewText(stp_mxml_node_t *parent, /* I - Parent node or STP_MXML_NO_PARENT */
+ int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */
+ const char *string) /* I - String */
+{
+ stp_mxml_node_t *node; /* New node */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!parent || !string)
+ return (NULL);
+
+ /*
+ * Create the node and set the text value...
+ */
+
+ if ((node = mxml_new(parent, STP_MXML_TEXT)) != NULL)
+ {
+ node->value.text.whitespace = whitespace;
+ node->value.text.string = strdup(string);
+ }
+
+ return (node);
+}
+
+
+/*
+ * 'stp_mxmlRemove()' - Remove a node from its parent.
+ *
+ * Does not free memory used by the node - use stp_mxmlDelete() for that.
+ * This function does nothing if the node has no parent.
+ */
+
+void
+stp_mxmlRemove(stp_mxml_node_t *node) /* I - Node to remove */
+{
+ /*
+ * Range check input...
+ */
+
+/* fprintf(stderr, "stp_mxmlRemove(node=%p)\n", node);*/
+
+ if (!node || !node->parent)
+ return;
+
+ /*
+ * Remove from parent...
+ */
+
+ if (node->prev)
+ node->prev->next = node->next;
+ else
+ node->parent->child = node->next;
+
+ if (node->next)
+ node->next->prev = node->prev;
+ else
+ node->parent->last_child = node->prev;
+
+ node->parent = NULL;
+ node->prev = NULL;
+ node->next = NULL;
+}
+
+
+/*
+ * 'mxml_new()' - Create a new node.
+ */
+
+static stp_mxml_node_t * /* O - New node */
+mxml_new(stp_mxml_node_t *parent, /* I - Parent node */
+ stp_mxml_type_t type) /* I - Node type */
+{
+ stp_mxml_node_t *node; /* New node */
+
+
+ /*
+ * Allocate memory for the node...
+ */
+
+ if ((node = calloc(1, sizeof(stp_mxml_node_t))) == NULL)
+ return (NULL);
+
+ /*
+ * Set the node type...
+ */
+
+ node->type = type;
+
+ /*
+ * Add to the parent if present...
+ */
+
+ if (parent)
+ stp_mxmlAdd(parent, STP_MXML_ADD_AFTER, STP_MXML_ADD_TO_PARENT, node);
+
+ /*
+ * Return the new node...
+ */
+
+ return (node);
+}
+
+
+/*
+ * End of "$Id: mxml-node.c,v 1.7 2004/09/17 18:38:21 rleigh Exp $".
+ */
diff --git a/src/main/mxml-search.c b/src/main/mxml-search.c
new file mode 100644
index 0000000..02bf125
--- /dev/null
+++ b/src/main/mxml-search.c
@@ -0,0 +1,199 @@
+/*
+ * "$Id: mxml-search.c,v 1.7 2004/09/17 18:38:21 rleigh Exp $"
+ *
+ * Search/navigation functions for mini-XML, a small XML-like file
+ * parsing library.
+ *
+ * Copyright 2003 by Michael Sweet.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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.
+ *
+ * Contents:
+ *
+ * stp_mxmlFindElement() - Find the named element.
+ * stp_mxmlWalkNext() - Walk to the next logical node in the tree.
+ * stp_mxmlWalkPrev() - Walk to the previous logical node in the tree.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include <gutenprint/mxml.h>
+#include "config.h"
+
+
+/*
+ * 'stp_mxmlFindElement()' - Find the named element.
+ *
+ * The search is constrained by the name, attribute name, and value; any
+ * NULL names or values are treated as wildcards, so different kinds of
+ * searches can be implemented by looking for all elements of a given name
+ * or all elements with a specific attribute. The descend argument determines
+ * whether the search descends into child nodes; normally you will use
+ * STP_MXML_DESCEND_FIRST for the initial search and STP_MXML_NO_DESCEND to find
+ * additional direct descendents of the node. The top node argument
+ * constrains the search to a particular node's children.
+ */
+
+stp_mxml_node_t * /* O - Element node or NULL */
+stp_mxmlFindElement(stp_mxml_node_t *node, /* I - Current node */
+ stp_mxml_node_t *top, /* I - Top node */
+ const char *name, /* I - Element name or NULL for any */
+ const char *attr, /* I - Attribute name, or NULL for none */
+ const char *value, /* I - Attribute value, or NULL for any */
+ int descend) /* I - Descend into tree - STP_MXML_DESCEND, STP_MXML_NO_DESCEND, or STP_MXML_DESCEND_FIRST */
+{
+ const char *temp; /* Current attribute value */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!node || !top || (!attr && value))
+ return (NULL);
+
+ /*
+ * Start with the next node...
+ */
+
+ node = stp_mxmlWalkNext(node, top, descend);
+
+ /*
+ * Loop until we find a matching element...
+ */
+
+ while (node != NULL)
+ {
+ /*
+ * See if this node matches...
+ */
+
+ if (node->type == STP_MXML_ELEMENT &&
+ node->value.element.name &&
+ (!name || !strcmp(node->value.element.name, name)))
+ {
+ /*
+ * See if we need to check for an attribute...
+ */
+
+ if (!attr)
+ return (node); /* No attribute search, return it... */
+
+ /*
+ * Check for the attribute...
+ */
+
+ if ((temp = stp_mxmlElementGetAttr(node, attr)) != NULL)
+ {
+ /*
+ * OK, we have the attribute, does it match?
+ */
+
+ if (!value || !strcmp(value, temp))
+ return (node); /* Yes, return it... */
+ }
+ }
+
+ /*
+ * No match, move on to the next node...
+ */
+
+ if (descend == STP_MXML_DESCEND)
+ node = stp_mxmlWalkNext(node, top, STP_MXML_DESCEND);
+ else
+ node = node->next;
+ }
+
+ return (NULL);
+}
+
+
+/*
+ * 'stp_mxmlWalkNext()' - Walk to the next logical node in the tree.
+ *
+ * The descend argument controls whether the first child is considered
+ * to be the next node. The top node argument constrains the walk to
+ * the node's children.
+ */
+
+stp_mxml_node_t * /* O - Next node or NULL */
+stp_mxmlWalkNext(stp_mxml_node_t *node, /* I - Current node */
+ stp_mxml_node_t *top, /* I - Top node */
+ int descend) /* I - Descend into tree - STP_MXML_DESCEND, STP_MXML_NO_DESCEND, or STP_MXML_DESCEND_FIRST */
+{
+ if (!node)
+ return (NULL);
+ else if (node->child && descend)
+ return (node->child);
+ else if (node->next)
+ return (node->next);
+ else if (node->parent && node->parent != top)
+ {
+ node = node->parent;
+
+ while (!node->next)
+ if (node->parent == top || !node->parent)
+ return (NULL);
+ else
+ node = node->parent;
+
+ return (node->next);
+ }
+ else
+ return (NULL);
+}
+
+
+/*
+ * 'stp_mxmlWalkPrev()' - Walk to the previous logical node in the tree.
+ *
+ * The descend argument controls whether the previous node's last child
+ * is considered to be the previous node. The top node argument constrains
+ * the walk to the node's children.
+ */
+
+stp_mxml_node_t * /* O - Previous node or NULL */
+stp_mxmlWalkPrev(stp_mxml_node_t *node, /* I - Current node */
+ stp_mxml_node_t *top, /* I - Top node */
+ int descend) /* I - Descend into tree - STP_MXML_DESCEND, STP_MXML_NO_DESCEND, or STP_MXML_DESCEND_FIRST */
+{
+ if (!node)
+ return (NULL);
+ else if (node->prev)
+ {
+ if (node->prev->last_child && descend)
+ {
+ /*
+ * Find the last child under the previous node...
+ */
+
+ node = node->prev->last_child;
+
+ while (node->last_child)
+ node = node->last_child;
+
+ return (node);
+ }
+ else
+ return (node->prev);
+ }
+ else if (node->parent != top)
+ return (node->parent);
+ else
+ return (NULL);
+}
+
+
+/*
+ * End of "$Id: mxml-search.c,v 1.7 2004/09/17 18:38:21 rleigh Exp $".
+ */
diff --git a/src/main/papers.xml b/src/main/papers.xml
new file mode 100644
index 0000000..b45ce57
--- /dev/null
+++ b/src/main/papers.xml
@@ -0,0 +1,1023 @@
+<?xml version="1.0"?>
+
+<!--
+ XML description of papers known to libgutenprint.
+ It should be edited by hand.
+
+ "$Id: papers.xml,v 1.18 2005/03/29 00:23:43 rlk Exp $"
+-->
+
+<!--
+ Sizes are converted to 1/72in, then rounded down so that we don't
+ print off the edge of the paper.
+-->
+
+
+
+<gutenprint xmlns="http://gimp-print.sourceforge.net/xsd/gp.xsd-1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://gimp-print.sourceforge.net/xsd/gp.xsd-1.0 gutenprint.xsd">
+ <paperdef>
+<!-- GROUP: Imperial -->
+ <paper name="Letter">
+ <description value="Letter"/>
+ <comment value="8.5in x 11in"/>
+ <width value="612"/>
+ <height value="792"/>
+ <unit value="english"/>
+ </paper>
+ <paper name="Legal">
+ <description value="Legal"/>
+ <comment value="8.5in x 14in"/>
+ <width value="612"/>
+ <height value="1008"/>
+ <unit value="english"/>
+ </paper>
+ <paper name="Tabloid">
+ <description value="Tabloid"/>
+ <comment value="11in x 17in"/>
+ <width value="792"/>
+ <height value="1224"/>
+ <unit value="english"/>
+ </paper>
+ <paper name="Executive">
+ <description value="Executive"/>
+ <comment value="7.25in x 10.5in"/>
+ <width value="522"/>
+ <height value="756"/>
+ <unit value="english"/>
+ </paper>
+ <paper name="Postcard">
+ <description value="Postcard"/>
+ <comment value="100mm x 147mm"/>
+ <width value="283"/>
+ <height value="416"/>
+ <unit value="english"/>
+ </paper>
+ <paper name="CD5Inch">
+ <description value="CD - 5 inch"/>
+ <comment value="CD, 116mm diameter"/>
+ <width value="329"/>
+ <height value="329"/>
+ <unit value="english"/>
+ </paper>
+ <paper name="CD3Inch">
+ <description value="CD - 3 inch"/>
+ <comment value="CD, 65mm diameter"/>
+ <width value="184"/>
+ <height value="184"/>
+ <unit value="english"/>
+ </paper>
+ <paper name="w216h360">
+ <description value="3x5"/>
+ <width value="216"/>
+ <height value="360"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="w288h432">
+ <description value="4x6"/>
+ <width value="288"/>
+ <height value="432"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="w324h495">
+ <description value="Epson 4x6 Photo Paper"/>
+ <width value="324"/>
+ <height value="495"/>
+ <unit value="english-extended"/>
+ <top value="18"/>
+ <left value="18"/>
+ <right value="18"/>
+ <bottom value="45"/>
+ </paper>
+ <paper name="w360h504">
+ <description value="5x7"/>
+ <width value="360"/>
+ <height value="504"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="w360h576">
+ <description value="5x8"/>
+ <width value="360"/>
+ <height value="576"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="w432h576">
+ <description value="6x8"/>
+ <width value="432"/>
+ <height value="576"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="c8x10">
+ <description value="8x10"/>
+ <width value="576"/>
+ <height value="720"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="Statement">
+ <description value="Manual"/>
+ <comment value="5.5in x 8.5in (Statement)"/>
+ <width value="396"/>
+ <height value="612"/>
+ <unit value="english"/>
+ </paper>
+ <paper name="TabloidExtra">
+ <description value="12x18"/>
+ <comment value="Tabloid Extra"/>
+ <width value="864"/>
+ <height value="1296"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="SuperB">
+ <description value="Super B 13x19"/>
+ <width value="936"/>
+ <height value="1368"/>
+ <unit value="english"/>
+ </paper>
+ <paper name="EngineeringC">
+ <description value="Engineering C 17x22"/>
+ <width value="1224"/>
+ <height value="1584"/>
+ <unit value="english"/>
+ </paper>
+<!--
+ Other common photographic paper sizes
+-->
+ <paper name="w576h864">
+ <description value="8x12"/>
+ <comment value="Sometimes used for 35mm"/>
+ <width value="576"/>
+ <height value="864"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="w792h1008">
+ <description value="11x14"/>
+ <width value="792"/>
+ <height value="1008"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="w1152h1440">
+ <description value="16x20"/>
+ <width value="1152"/>
+ <height value="1440"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="w1152h1728">
+ <description value="16x24"/>
+ <comment value="20 x 24 for 35mm"/>
+ <width value="1152"/>
+ <height value="1728"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="w1440h1728">
+ <description value="20x24"/>
+ <width value="1440"/>
+ <height value="1728"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="w1440h2160">
+ <description value="20x30"/>
+ <comment value="24 x 30 for 35mm"/>
+ <width value="1440"/>
+ <height value="2160"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="w1584h2160">
+ <description value="22x30"/>
+ <comment value="Common watercolor paper"/>
+ <width value="1584"/>
+ <height value="2160"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="w1728h2160">
+ <description value="24x30"/>
+ <width value="1728"/>
+ <height value="2160"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="w1728h2592">
+ <description value="Super A1 24x36"/>
+ <comment value="Sometimes used for 35mm"/>
+ <width value="1728"/>
+ <height value="2592"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="w2160h2880">
+ <description value="30x40"/>
+ <width value="2160"/>
+ <height value="2880"/>
+ <unit value="english-extended"/>
+ </paper>
+<!-- GROUP: International A -->
+<!--
+ 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.
+-->
+ <paper name="w4768h6749">
+ <description value="4A"/>
+ <comment value="1682mm x 2378mm"/>
+ <width value="4768"/>
+ <height value="6749"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w3370h4768">
+ <description value="2A"/>
+ <comment value="1189mm x 1682mm"/>
+ <width value="3370"/>
+ <height value="4768"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="SuperA0">
+ <description value="Super A0"/>
+ <comment value="914mm x 1292mm"/>
+ <width value="2590"/>
+ <height value="3662"/>
+ <unit value="metric"/>
+ </paper>
+ <paper name="A0">
+ <description value="A0"/>
+ <comment value="841mm x 1189mm"/>
+ <width value="2384"/>
+ <height value="3370"/>
+ <unit value="metric"/>
+ </paper>
+ <paper name="A1">
+ <description value="A1"/>
+ <comment value="594mm x 841mm"/>
+ <width value="1684"/>
+ <height value="2384"/>
+ <unit value="metric"/>
+ </paper>
+ <paper name="A2">
+ <description value="A2"/>
+ <comment value="420mm x 594mm"/>
+ <width value="1191"/>
+ <height value="1684"/>
+ <unit value="metric"/>
+ </paper>
+ <paper name="A3">
+ <description value="A3"/>
+ <comment value="297mm x 420mm"/>
+ <width value="842"/>
+ <height value="1191"/>
+ <unit value="metric"/>
+ </paper>
+ <paper name="A4">
+ <description value="A4"/>
+ <comment value="210mm x 297mm"/>
+ <width value="595"/>
+ <height value="842"/>
+ <unit value="metric"/>
+ </paper>
+ <paper name="A5">
+ <description value="A5"/>
+ <comment value="148mm x 210mm"/>
+ <width value="420"/>
+ <height value="595"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="A6">
+ <description value="A6"/>
+ <comment value="105mm x 148mm"/>
+ <width value="297"/>
+ <height value="420"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="A7">
+ <description value="A7"/>
+ <comment value="74mm x 105mm"/>
+ <width value="210"/>
+ <height value="297"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="A8">
+ <description value="A8"/>
+ <comment value="52mm x 74mm"/>
+ <width value="148"/>
+ <height value="210"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="A9">
+ <description value="A9"/>
+ <comment value="37mm x 52mm"/>
+ <width value="105"/>
+ <height value="148"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="A10">
+ <description value="A10"/>
+ <comment value="26mm x 37mm"/>
+ <width value="73"/>
+ <height value="105"/>
+ <unit value="metric-extended"/>
+ </paper>
+<!--
+ Stock sizes for normal trims.
+ Allowance for trim is 3 millimetres.
+-->
+ <paper name="w2437h3458">
+ <description value="RA0"/>
+ <comment value="860mm x 1220mm"/>
+ <width value="2437"/>
+ <height value="3458"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w1729h2437">
+ <description value="RA1"/>
+ <comment value="610mm x 860mm"/>
+ <width value="1729"/>
+ <height value="2437"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w1218h1729">
+ <description value="RA2"/>
+ <comment value="430mm x 610mm"/>
+ <width value="1218"/>
+ <height value="1729"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w864h1218">
+ <description value="RA3"/>
+ <comment value="305mm x 430mm"/>
+ <width value="864"/>
+ <height value="1218"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w609h864">
+ <description value="RA4"/>
+ <comment value="215mm x 305mm"/>
+ <width value="609"/>
+ <height value="864"/>
+ <unit value="metric-extended"/>
+ </paper>
+<!--
+ Stock sizes for bled work or extra trims.
+-->
+ <paper name="w2551h3628">
+ <description value="SRA0"/>
+ <comment value="900mm x 1280mm"/>
+ <width value="2551"/>
+ <height value="3628"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w1814h2551">
+ <description value="SRA1"/>
+ <comment value="640mm x 900mm"/>
+ <width value="1814"/>
+ <height value="2551"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w1275h1814">
+ <description value="SRA2"/>
+ <comment value="450mm x 640mm"/>
+ <width value="1275"/>
+ <height value="1814"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w907h1275">
+ <description value="SRA3"/>
+ <comment value="320mm x 450mm"/>
+ <width value="907"/>
+ <height value="1275"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w637h907">
+ <description value="SRA4"/>
+ <comment value="225mm x 320mm"/>
+ <width value="637"/>
+ <height value="907"/>
+ <unit value="metric-extended"/>
+ </paper>
+<!-- GROUP: International B -->
+<!--
+ "B" series: Posters, wall charts and similar items.
+-->
+ <paper name="w5669h8016">
+ <description value="4B ISO"/>
+ <comment value="2000mm x 2828mm"/>
+ <width value="5669"/>
+ <height value="8016"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w4008h5669">
+ <description value="2B ISO"/>
+ <comment value="1414mm x 2000mm"/>
+ <width value="4008"/>
+ <height value="5669"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="ISOB0">
+ <description value="B0 ISO"/>
+ <comment value="1000mm x 1414mm"/>
+ <width value="2834"/>
+ <height value="4008"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="ISOB1">
+ <description value="B1 ISO"/>
+ <comment value="707mm x 1000mm"/>
+ <width value="2004"/>
+ <height value="2834"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="ISOB2">
+ <description value="B2 ISO"/>
+ <comment value="500mm x 707mm"/>
+ <width value="1417"/>
+ <height value="2004"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="ISOB3">
+ <description value="B3 ISO"/>
+ <comment value="353mm x 500mm"/>
+ <width value="1000"/>
+ <height value="1417"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="ISOB4">
+ <description value="B4 ISO"/>
+ <comment value="250mm x 353mm"/>
+ <width value="708"/>
+ <height value="1000"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="ISOB5">
+ <description value="B5 ISO"/>
+ <comment value="176mm x 250mm"/>
+ <width value="498"/>
+ <height value="708"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="ISOB6">
+ <description value="B6 ISO"/>
+ <comment value="125mm x 176mm"/>
+ <width value="354"/>
+ <height value="498"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="ISOB7">
+ <description value="B7 ISO"/>
+ <comment value="88mm x 125mm"/>
+ <width value="249"/>
+ <height value="354"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="ISOB8">
+ <description value="B8 ISO"/>
+ <comment value="62mm x 88mm"/>
+ <width value="175"/>
+ <height value="249"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="ISOB9">
+ <description value="B9 ISO"/>
+ <comment value="44mm x 62mm"/>
+ <width value="124"/>
+ <height value="175"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="ISOB10">
+ <description value="B10 ISO"/>
+ <comment value="31mm x 44mm"/>
+ <width value="87"/>
+ <height value="124"/>
+ <unit value="metric-extended"/>
+ </paper>
+<!--
+ JIS
+-->
+ <paper name="SuperB0">
+ <description value="Super B0 JIS"/>
+ <width value="3167"/> <!-- Should be 3169, but Epson driver doesn't like that -->
+ <height value="4478"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="B0">
+ <description value="B0 JIS"/>
+ <width value="2919"/>
+ <height value="4127"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="B1">
+ <description value="B1 JIS"/>
+ <width value="2063"/>
+ <height value="2919"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="B2">
+ <description value="B2 JIS"/>
+ <width value="1459"/>
+ <height value="2063"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="B3">
+ <description value="B3 JIS"/>
+ <width value="1029"/>
+ <height value="1459"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="B4">
+ <description value="B4 JIS"/>
+ <width value="727"/>
+ <height value="1029"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="B5">
+ <description value="B5 JIS"/>
+ <width value="518"/>
+ <height value="727"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="B6">
+ <description value="B6 JIS"/>
+ <width value="362"/>
+ <height value="518"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="B7">
+ <description value="B7 JIS"/>
+ <width value="257"/>
+ <height value="362"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="B8">
+ <description value="B8 JIS"/>
+ <width value="180"/>
+ <height value="257"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="B9">
+ <description value="B9 JIS"/>
+ <width value="127"/>
+ <height value="180"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="B10">
+ <description value="B10 JIS"/>
+ <width value="90"/>
+ <height value="127"/>
+ <unit value="metric-extended"/>
+ </paper>
+<!-- GROUP: International C -->
+<!--
+ "C" series: Envelopes or folders suitable for A size stationery.
+-->
+ <paper name="C0">
+ <description value="C0"/>
+ <comment value="917mm x 1297mm"/>
+ <width value="2599"/>
+ <height value="3676"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="C1">
+ <description value="C1"/>
+ <comment value="648mm x 917mm"/>
+ <width value="1836"/>
+ <height value="2599"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="C2">
+ <description value="C2"/>
+ <comment value="458mm x 648mm"/>
+ <width value="1298"/>
+ <height value="1836"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="C3">
+ <description value="C3"/>
+ <comment value="324mm x 458mm"/>
+ <width value="918"/>
+ <height value="1298"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="C4">
+ <description value="C4"/>
+ <comment value="229mm x 324mm"/>
+ <width value="649"/>
+ <height value="918"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="C5">
+ <description value="C5"/>
+ <comment value="162mm x 229mm"/>
+ <width value="459"/>
+ <height value="649"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w354h918">
+ <description value="B6-C4"/>
+ <comment value="125mm x 324mm"/>
+ <width value="354"/>
+ <height value="918"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="C6">
+ <description value="C6"/>
+ <comment value="114mm x 162mm"/>
+ <width value="323"/>
+ <height value="459"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="DL">
+ <description value="DL"/>
+ <comment value="110mm x 220mm"/>
+ <width value="311"/>
+ <height value="623"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w229h459">
+ <description value="C7-6"/>
+ <comment value="81mm x 162mm"/>
+ <width value="229"/>
+ <height value="459"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="C7">
+ <description value="C7"/>
+ <comment value="81mm x 114mm"/>
+ <width value="229"/>
+ <height value="323"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="C8">
+ <description value="C8"/>
+ <comment value="57mm x 81mm"/>
+ <width value="161"/>
+ <height value="229"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="C9">
+ <description value="C9"/>
+ <comment value="40mm x 57mm"/>
+ <width value="113"/>
+ <height value="161"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="C10">
+ <description value="C10"/>
+ <comment value="28mm x 40mm"/>
+ <width value="79"/>
+ <height value="113"/>
+ <unit value="metric-extended"/>
+ </paper>
+<!-- GROUP: US CAD -->
+<!--
+ US CAD standard paper sizes
+-->
+ <paper name="ARCHA">
+ <description value="ArchA"/>
+ <comment value="9in x 12in"/>
+ <width value="648"/>
+ <height value="864"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="ARCHA_trans">
+ <description value="ArchA transposed"/>
+ <comment value="12in x 9in"/>
+ <width value="864"/>
+ <height value="648"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="ARCHB">
+ <description value="ArchB"/>
+ <comment value="12in x 18in"/>
+ <width value="864"/>
+ <height value="1296"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="ARCHB_trans">
+ <description value="ArchB transposed"/>
+ <comment value="18in x 12in"/>
+ <width value="1296"/>
+ <height value="864"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="ARCHC">
+ <description value="ArchC"/>
+ <comment value="18in x 24in"/>
+ <width value="1296"/>
+ <height value="1728"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="ARCHC_trans">
+ <description value="ArchC transposed"/>
+ <comment value="24in x 18in"/>
+ <width value="1728"/>
+ <height value="1296"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="ARCHD">
+ <description value="ArchD"/>
+ <comment value="24in x 36in"/>
+ <width value="1728"/>
+ <height value="2592"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="ARCHD_trans">
+ <description value="ArchD transposed"/>
+ <comment value="36in x 24in"/>
+ <width value="2592"/>
+ <height value="1728"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="ARCHE">
+ <description value="ArchE"/>
+ <comment value="36in x 48in"/>
+ <width value="2592"/>
+ <height value="3456"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="ARCHE_trans">
+ <description value="ArchE transposed"/>
+ <comment value="48in x 36in"/>
+ <width value="3456"/>
+ <height value="2592"/>
+ <unit value="english-extended"/>
+ </paper>
+<!-- GROUP: Foolscap -->
+ <paper name="w612h936">
+ <description value="American foolscap"/>
+ <width value="612"/>
+ <height value="936"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="w648h936">
+ <description value="European foolscap"/>
+ <width value="648"/>
+ <height value="936"/>
+ <unit value="english-extended"/>
+ </paper>
+<!-- GROUP: Book -->
+<!--
+ Sizes for book production
+ The BPIF and the Publishers Association jointly recommend ten
+ standard metric sizes for case-bound titles as follows:
+-->
+ <paper name="w535h697">
+ <description value="Crown Quarto"/>
+ <comment value="189mm x 246mm"/>
+ <width value="535"/>
+ <height value="697"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w569h731">
+ <description value="Large Crown Quarto"/>
+ <comment value="201mm x 258mm"/>
+ <width value="569"/>
+ <height value="731"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w620h782">
+ <description value="Demy Quarto"/>
+ <comment value="219mm x 276mm"/>
+ <width value="620"/>
+ <height value="782"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w671h884">
+ <description value="Royal Quarto"/>
+ <comment value="237mm x 312mm"/>
+ <width value="671"/>
+ <height value="884"/>
+ <unit value="metric-extended"/>
+ </paper>
+<!--
+ <paper name="ISO A4">
+ <description value="ISO A4"/>
+ <comment value="210mm x 297mm"/>
+ <width value="595"/>
+ <height value="841"/>
+ <unit value="metric-extended"/>
+ </paper>
+-->
+ <paper name="w348h527">
+ <description value="Crown Octavo"/>
+ <comment value="123mm x 186mm"/>
+ <width value="348"/>
+ <height value="527"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w365h561">
+ <description value="Large Crown Octavo"/>
+ <comment value="129mm x 198mm"/>
+ <width value="365"/>
+ <height value="561"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w391h612">
+ <description value="Demy Octavo"/>
+ <comment value="138mm x 216mm"/>
+ <width value="391"/>
+ <height value="612"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w442h663">
+ <description value="Royal Octavo"/>
+ <comment value="156mm x 234mm"/>
+ <width value="442"/>
+ <height value="663"/>
+ <unit value="metric-extended"/>
+ </paper>
+<!--
+ <paper name="ISO A5">
+ <description value="ISO A5"/>
+ <comment value="148mm x 210mm"/>
+ <width value="419"/>
+ <height value="595"/>
+ <unit value="metric-extended"/>
+ </paper>
+-->
+<!--
+ Paperback sizes in common usage
+-->
+ <paper name="w314h504">
+ <description value="Small paperback"/>
+ <comment value="111mm x 178mm"/>
+ <width value="314"/>
+ <height value="504"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w314h513">
+ <description value="Penguin small paperback"/>
+ <comment value="111mm x 181mm"/>
+ <width value="314"/>
+ <height value="513"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="cw365h561">
+ <description value="Penguin large paperback"/>
+ <comment value="129mm x 198mm"/>
+ <width value="365"/>
+ <height value="561"/>
+ <unit value="metric-extended"/>
+ </paper>
+<!-- Group: Miscellaneous -->
+<!--
+ Miscellaneous sizes
+-->
+ <paper name="w283h425">
+ <description value="10cm x 15cm"/>
+ <comment value="100 x 150mm"/>
+ <width value="283"/>
+ <height value="425"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w283h420">
+ <description value="Hagaki Card"/>
+ <comment value="100mm x 148mm"/>
+ <width value="283"/>
+ <height value="420"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w420h567">
+ <description value="Oufuku Card"/>
+ <comment value="148mm x 200mm"/>
+ <width value="420"/>
+ <height value="567"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w340h666">
+ <description value="Japanese long envelope #3"/>
+ <width value="340"/>
+ <height value="666"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w255h581">
+ <description value="Japanese long envelope #4"/>
+ <width value="255"/>
+ <height value="581"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w680h941">
+ <description value="Japanese Kaku envelope #4"/>
+ <width value="680"/>
+ <height value="941"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="COM10">
+ <description value="Commercial 10"/>
+ <comment value="US Commercial 10 env"/>
+ <width value="297"/>
+ <height value="684"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="w315h414">
+ <description value="A2 Invitation"/>
+ <comment value="US A2 invitation"/>
+ <width value="315"/>
+ <height value="414"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="Monarch">
+ <description value="Monarch Envelope"/>
+ <comment value="3.875in x 7.5in"/>
+ <width value="279"/>
+ <height value="540"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="w288h387">
+ <description value="4x5 3/8"/>
+ <width value="288"/>
+ <height value="387"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="w288h504">
+ <description value="4x7"/>
+ <width value="288"/>
+ <height value="504"/>
+ <unit value="english-extended"/>
+ </paper>
+ <paper name="w253h337">
+ <description value="CP_L"/>
+ <comment value="89mm x 119mm"/>
+ <width value="253"/>
+ <height value="337"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w244h155">
+ <description value="Card"/>
+ <comment value="86mm x 54mm"/>
+ <width value="244"/>
+ <height value="155"/>
+ <unit value="metric-extended"/>
+ </paper>
+ <paper name="w283h566">
+ <description value="Wide Postcard"/>
+ <comment value="100mm x 200mm"/>
+ <width value="283"/>
+ <height value="566"/>
+ <unit value="english-extended"/>
+ </paper>
+<!--
+ Custom
+-->
+ <paper name="Custom">
+ <description value="Custom"/>
+ <comment value="User-Defined Size"/>
+ <width value="0"/>
+ <height value="0"/>
+ <unit value="english"/>
+ </paper>
+<!-- Group: Roll Papers -->
+ <paper name="w252">
+ <description value="89 mm Roll Paper"/>
+ <width value="252"/>
+ <height value="0"/>
+ <unit value="metric"/>
+ </paper>
+ <paper name="w288">
+ <description value="4 Inch Roll Paper"/>
+ <width value="288"/>
+ <height value="0"/>
+ <unit value="english"/>
+ </paper>
+ <paper name="w360">
+ <description value="5 Inch Roll Paper"/>
+ <width value="360"/>
+ <height value="0"/>
+ <unit value="english"/>
+ </paper>
+ <paper name="w595">
+ <description value="210 mm Roll Paper"/>
+ <width value="595"/>
+ <height value="0"/>
+ <unit value="metric"/>
+ </paper>
+ <paper name="w936">
+ <description value="13 Inch Roll Paper"/>
+ <width value="936"/>
+ <height value="0"/>
+ <unit value="english"/>
+ </paper>
+ <paper name="w1584">
+ <description value="22 Inch Roll Paper"/>
+ <width value="1584"/>
+ <height value="0"/>
+ <unit value="english"/>
+ </paper>
+ <paper name="w1728">
+ <description value="24 Inch Roll Paper"/>
+ <width value="1728"/>
+ <height value="0"/>
+ <unit value="english"/>
+ </paper>
+ <paper name="w2592">
+ <description value="36 Inch Roll Paper"/>
+ <width value="2592"/>
+ <height value="0"/>
+ <unit value="english"/>
+ </paper>
+ <paper name="w3168">
+ <description value="44 Inch Roll Paper"/>
+ <width value="3168"/>
+ <height value="0"/>
+ <unit value="english"/>
+ </paper>
+ </paperdef>
+</gutenprint>
diff --git a/src/main/path.c b/src/main/path.c
new file mode 100644
index 0000000..86e131b
--- /dev/null
+++ b/src/main/path.c
@@ -0,0 +1,320 @@
+/*
+ * "$Id: path.c,v 1.17 2004/09/17 18:38:21 rleigh Exp $"
+ *
+ * Gutenprint path functions - split and search paths.
+ *
+ * Copyright 2002 Roger Leigh (rleigh@debian.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.
+ */
+
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <dirent.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+static int stpi_path_check(const struct dirent *module);
+static char *stpi_path_merge(const char *path,
+ const char *file);
+static int stpi_scandir (const char *dir,
+ struct dirent ***namelist,
+ int (*sel) (const struct dirent *),
+ int (*cmp) (const void *, const void *));
+
+/* WARNING: This is not thread safe! -- rlk 20030721 */
+static const char *path_check_path; /* Path for stpi_scandir() callback */
+static const char *path_check_suffix; /* Suffix for stpi_scandir() callback */
+
+
+static int
+dirent_sort(const void *a,
+ const void *b)
+{
+ return strcoll ((*(const struct dirent **) a)->d_name,
+ (*(const struct dirent **) b)->d_name);
+}
+
+
+/*
+ * Make a list of all modules in the search path.
+ */
+stp_list_t *
+stp_path_search(stp_list_t *dirlist, /* List of directories to search */
+ const char *suffix) /* Required filename suffix */
+{
+ stp_list_t *findlist; /* List of files to return */
+ stp_list_item_t *diritem; /* Current directory */
+ struct dirent** module_dir; /* Current directory contents */
+ char *module_name; /* File name to check */
+ int n; /* Number of directory entries */
+
+ if (!dirlist)
+ return NULL;
+
+ path_check_suffix = suffix;
+
+ findlist = stp_list_create();
+ if (!findlist)
+ return NULL;
+ stp_list_set_freefunc(findlist, stp_list_node_free_data);
+
+ diritem = stp_list_get_start(dirlist);
+ while (diritem)
+ {
+ path_check_path = (const char *) stp_list_item_get_data(diritem);
+ stp_deprintf(STP_DBG_PATH, "stp-path: directory: %s\n",
+ (const char *) stp_list_item_get_data(diritem));
+ n = stpi_scandir ((const char *) stp_list_item_get_data(diritem),
+ &module_dir, stpi_path_check, dirent_sort);
+ if (n >= 0)
+ {
+ int idx;
+ for (idx = 0; idx < n; ++idx)
+ {
+ module_name = stpi_path_merge((const char *) stp_list_item_get_data(diritem),
+ module_dir[idx]->d_name);
+ stp_list_item_create(findlist, NULL, module_name);
+ free (module_dir[idx]); /* Must use plain free() */
+ }
+ free (module_dir); /* Must use plain free() */
+ }
+ diritem = stp_list_item_next(diritem);
+ }
+ return findlist;
+}
+
+
+/*
+ * stpi_scandir() callback. Check the filename is sane, has the
+ * correct mode bits and suffix.
+ */
+static int
+stpi_path_check(const struct dirent *module) /* File to check */
+{
+ int namelen; /* Filename length */
+ int status = 0; /* Error status */
+ int savederr; /* Saved errno */
+ char *filename; /* Filename */
+ struct stat modstat; /* stat() output */
+
+ savederr = errno; /* since we are a callback, preserve
+ stpi_scandir() state */
+
+ filename = stpi_path_merge(path_check_path, module->d_name);
+
+ namelen = strlen(filename);
+ /* make sure we can take off suffix (e.g. .la)
+ and still have a sane filename */
+ if (namelen >= strlen(path_check_suffix) + 1)
+ {
+ if (!stat (filename, &modstat))
+ {
+ /* check file exists, and is a regular file */
+ if (S_ISREG(modstat.st_mode))
+ status = 1;
+ if (strncmp(filename + (namelen - strlen(path_check_suffix)),
+ path_check_suffix,
+ strlen(path_check_suffix)))
+ {
+ status = 0;
+ }
+ }
+ }
+
+ if (status)
+ stp_deprintf(STP_DBG_PATH, "stp-path: file: `%s'\n", filename);
+
+ stp_free(filename);
+ filename = NULL;
+
+ errno = savederr;
+ return status;
+}
+
+
+/*
+ * Join a path and filename together.
+ */
+static char *
+stpi_path_merge(const char *path, /* Path */
+ const char *file) /* Filename */
+{
+ char *filename; /* Filename to return */
+ int namelen = strlen(path) + strlen(file) + 2;
+ filename = (char *) stp_malloc(namelen * sizeof(char));
+ strcpy (filename, path);
+ strcat (filename, "/");
+ strcat (filename, file);
+ filename[namelen - 1] = '\0';
+ return filename;
+}
+
+
+/*
+ * Split a PATH-type string (colon-delimited) into separate
+ * directories.
+ */
+void
+stp_path_split(stp_list_t *list, /* List to add directories to */
+ const char *path) /* Path to split */
+{
+ const char *start = path; /* Start of path name */
+ const char *end = NULL; /* End of path name */
+ char *dir = NULL; /* Path name */
+ int len; /* Length of path name */
+
+ while (start)
+ {
+ end = (const char *) strchr(start, ':');
+ if (!end)
+ len = strlen(start) + 1;
+ else
+ len = (end - start);
+
+ if (len && !(len == 1 && !end))
+ {
+ dir = (char *) stp_malloc(len + 1);
+ strncpy(dir, start, len);
+ dir[len] = '\0';
+ stp_list_item_create(list, NULL, dir);
+ }
+ if (!end)
+ {
+ start = NULL;
+ break;
+ }
+ start = end + 1;
+ }
+}
+
+/* Adapted from GNU libc <dirent.h>
+ These macros extract size information from a `struct dirent *'.
+ They may evaluate their argument multiple times, so it must not
+ have side effects. Each of these may involve a relatively costly
+ call to `strlen' on some systems, so these values should be cached.
+
+ _D_EXACT_NAMLEN (DP) returns the length of DP->d_name, not including
+ its terminating null character.
+
+ _D_ALLOC_NAMLEN (DP) returns a size at least (_D_EXACT_NAMLEN (DP) + 1);
+ that is, the allocation size needed to hold the DP->d_name string.
+ Use this macro when you don't need the exact length, just an upper bound.
+ This macro is less likely to require calling `strlen' than _D_EXACT_NAMLEN.
+ */
+
+#ifdef _DIRENT_HAVE_D_NAMLEN
+# ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(d) ((d)->d_namlen)
+# endif
+# ifndef _D_ALLOC_NAMLEN
+# define _D_ALLOC_NAMLEN(d) (_D_EXACT_NAMLEN (d) + 1)
+# endif
+#else
+# ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(d) (strlen ((d)->d_name))
+# endif
+# ifndef _D_ALLOC_NAMLEN
+# ifdef _DIRENT_HAVE_D_RECLEN
+# define _D_ALLOC_NAMLEN(d) (((char *) (d) + (d)->d_reclen) - &(d)->d_name[0])
+# else
+# define _D_ALLOC_NAMLEN(d) (sizeof (d)->d_name > 1 ? sizeof (d)->d_name : \
+ _D_EXACT_NAMLEN (d) + 1)
+# endif
+# endif
+#endif
+
+/*
+ * BSD scandir() replacement, from glibc
+ */
+static int
+stpi_scandir (const char *dir,
+ struct dirent ***namelist,
+ int (*sel) (const struct dirent *),
+ int (*cmp) (const void *, const void *))
+{
+ DIR *dp = opendir (dir);
+ struct dirent **v = NULL;
+ size_t vsize = 0, i;
+ struct dirent *d;
+ int save;
+
+ if (dp == NULL)
+ return -1;
+
+ save = errno;
+ errno = 0;
+
+ i = 0;
+ while ((d = readdir (dp)) != NULL)
+ if (sel == NULL || (*sel) (d))
+ {
+ struct dirent *vnew;
+ size_t dsize;
+
+ /* Ignore errors from sel or readdir */
+ errno = 0;
+
+ if (i == vsize)
+ {
+ struct dirent **new;
+ if (vsize == 0)
+ vsize = 10;
+ else
+ vsize *= 2;
+ new = (struct dirent **) realloc (v, vsize * sizeof (*v));
+ if (new == NULL)
+ break;
+ v = new;
+ }
+
+ dsize = &d->d_name[_D_ALLOC_NAMLEN (d)] - (char *) d;
+ vnew = (struct dirent *) malloc (dsize);
+ if (vnew == NULL)
+ break;
+
+ v[i++] = (struct dirent *) memcpy (vnew, d, dsize);
+ }
+
+ if (errno != 0)
+ {
+ save = errno;
+
+ while (i > 0)
+ free (v[--i]);
+ free (v);
+
+ i = -1;
+ }
+ else
+ {
+ /* Sort the list if we have a comparison function to sort with. */
+ if (cmp != NULL)
+ qsort (v, i, sizeof (*v), cmp);
+
+ *namelist = v;
+ }
+
+ (void) closedir (dp);
+ errno = save;
+
+ return i;
+}
diff --git a/src/main/print-canon.c b/src/main/print-canon.c
index e021dc3..a07699c 100644
--- a/src/main/print-canon.c
+++ b/src/main/print-canon.c
@@ -1,5 +1,5 @@
/*
- * "$Id: print-canon.c,v 1.71.2.9 2003/10/19 23:48:19 rlk Exp $"
+ * "$Id: print-canon.c,v 1.155 2005/05/08 03:10:37 rlk Exp $"
*
* Print plug-in CANON BJL driver for the GIMP.
*
@@ -42,9 +42,9 @@
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#include <gimp-print/gimp-print.h>
-#include "gimp-print-internal.h"
-#include <gimp-print/gimp-print-intl-internal.h>
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
#include <string.h>
#include <stdio.h>
#if defined(HAVE_VARARGS_H) && !defined(HAVE_STDARG_H)
@@ -52,7 +52,15 @@
#else
#include <stdarg.h>
#endif
-#include <ctype.h>
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+/* Solaris with gcc has problems because gcc's limits.h doesn't #define */
+/* this */
+#ifndef CHAR_BIT
+#define CHAR_BIT 8
+#endif
#if (0)
#define EXPERIMENTAL_STUFF 0
@@ -66,9 +74,26 @@
#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)
+ MAX_CARRIAGE_WIDTH / CHAR_BIT)
+
+#define MIN(a,b) (((a)<(b)) ? (a) : (b))
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+
+static const int channel_color_map[] =
+{
+ STP_ECOLOR_K, STP_ECOLOR_C, STP_ECOLOR_M, STP_ECOLOR_Y, STP_ECOLOR_C, STP_ECOLOR_M, STP_ECOLOR_Y
+};
+
+static const int subchannel_color_map[] =
+{
+ 0, 0, 0, 0, 1, 1, 1
+};
+
+static const double ink_darknesses[] =
+{
+ 1.0, 0.31 / .5, 0.61 / .97, 0.08
+};
#define USE_3BIT_FOLD_TYPE 323
@@ -146,9 +171,9 @@ typedef struct canon_densities
typedef struct canon_variable_ink
{
- const stp_simple_dither_range_t *range;
- int count;
double density;
+ const stp_shade_t *shades;
+ int numshades;
} canon_variable_ink_t;
typedef struct canon_variable_inkset
@@ -197,9 +222,9 @@ typedef struct canon_variable_printmode
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. */
+ const char *lum_adjustment; /* optional lum adj. */
+ const char *hue_adjustment; /* optional hue adj. */
+ const char *sat_adjustment; /* optional sat adj. */
} canon_variable_printmode_t;
#endif
@@ -211,80 +236,78 @@ typedef struct canon_variable_printmode
* if you get better results. Please send mail to thaller@ph.tum.de
*/
+#define DECLARE_INK(name, density) \
+static const canon_variable_ink_t name##_ink = \
+{ \
+ density, \
+ name##_shades, \
+ sizeof(name##_shades) / sizeof(stp_shade_t) \
+}
+
+#define SHADE(density, name) \
+{ density, sizeof(name)/sizeof(stp_dotsize_t), name }
+
/*
* Dither ranges specifically for Cyan/LightCyan (see NOTE above)
*
*/
-static const stp_simple_dither_range_t canon_dither_ranges_Cc_1bit[] =
+
+static const stp_dotsize_t single_dotsize[] =
{
- { 0.25, 0x1, 1, 1 },
- { 1.0, 0x1, 0, 1 }
+ { 0x1, 1.0 }
};
-static const canon_variable_ink_t canon_ink_Cc_1bit =
+static const stp_shade_t canon_Cc_1bit_shades[] =
{
- canon_dither_ranges_Cc_1bit,
- sizeof(canon_dither_ranges_Cc_1bit) / sizeof(stp_simple_dither_range_t),
- .75
+ SHADE(1.0, single_dotsize),
+ SHADE(0.25, single_dotsize),
};
+DECLARE_INK(canon_Cc_1bit, 0.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, 1, 1 },
- { 1.0, 0x1, 0, 1 }
-};
-static const canon_variable_ink_t canon_ink_Mm_1bit =
+static const stp_shade_t canon_Mm_1bit_shades[] =
{
- canon_dither_ranges_Mm_1bit,
- sizeof(canon_dither_ranges_Mm_1bit) / sizeof(stp_simple_dither_range_t),
- .75
+ SHADE(1.0, single_dotsize),
+ SHADE(0.26, single_dotsize),
};
+DECLARE_INK(canon_Mm_1bit, 0.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[] =
+static const stp_dotsize_t two_bit_dotsize[] =
{
- { 0.45, 0x1, 0, 1 },
- { 0.68, 0x2, 0, 2 },
- { 1.0, 0x3, 0, 3 }
+ { 0x1, 0.45 },
+ { 0x2, 0.68 },
+ { 0x3, 1.0 }
};
-static const canon_variable_ink_t canon_ink_X_2bit =
+static const stp_shade_t canon_X_2bit_shades[] =
{
- canon_dither_ranges_X_2bit,
- sizeof(canon_dither_ranges_X_2bit) / sizeof(stp_simple_dither_range_t),
- 1.0
+ SHADE(1.0, two_bit_dotsize)
};
+DECLARE_INK(canon_X_2bit, 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, 1, 1 },
- { 0.227, 0x2, 1, 2 },
-/*{ 0.333, 0x3, 1, 3 }, */
- { 0.45, 0x1, 0, 1 },
- { 0.68, 0x2, 0, 2 },
- { 1.0, 0x3, 0, 3 }
-};
-
-static const canon_variable_ink_t canon_ink_Xx_2bit =
+static const stp_shade_t canon_Xx_2bit_shades[] =
{
- canon_dither_ranges_Xx_2bit,
- sizeof(canon_dither_ranges_Xx_2bit) / sizeof(stp_simple_dither_range_t),
- 1.0
+ SHADE(1.0, two_bit_dotsize),
+ SHADE(0.33, two_bit_dotsize),
};
+DECLARE_INK(canon_Xx_2bit, 1.0);
+
/*
* Dither ranges specifically for any Color and 3bit/pixel
* (see NOTE above)
@@ -296,48 +319,35 @@ static const canon_variable_ink_t canon_ink_Xx_2bit =
*
*
*/
-static const stp_simple_dither_range_t canon_dither_ranges_X_3bit[] =
-{
- { 0.45, 0x1, 0, 1 },
- { 0.55, 0x2, 0, 2 },
- { 0.66, 0x3, 0, 3 },
- { 0.77, 0x4, 0, 4 },
- { 0.88, 0x5, 0, 5 },
- { 1.0, 0x6, 0, 6 }
+static const stp_dotsize_t three_bit_dotsize[] =
+{
+ { 0x1, 0.45 },
+ { 0x2, 0.55 },
+ { 0x3, 0.66 },
+ { 0x4, 0.77 },
+ { 0x5, 0.88 },
+ { 0x6, 1.0 }
};
-static const canon_variable_ink_t canon_ink_X_3bit =
+static const stp_shade_t canon_X_3bit_shades[] =
{
- canon_dither_ranges_X_3bit,
- sizeof(canon_dither_ranges_X_3bit) / sizeof(stp_simple_dither_range_t),
- 1.0
+ SHADE(1.0, three_bit_dotsize)
};
+DECLARE_INK(canon_X_3bit, 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, 1, 1 },
- { 0.227, 0x2, 1, 2 },
- { 0.333, 0x3, 1, 3 },
-/* { 0.333, 0x3, 1, 3 }, */
- { 0.45, 0x1, 0, 1 },
- { 0.55, 0x2, 0, 2 },
- { 0.66, 0x3, 0, 3 },
- { 0.77, 0x4, 0, 4 },
- { 0.88, 0x5, 0, 5 },
- { 1.0, 0x6, 0, 6 }
-};
-
-static const canon_variable_ink_t canon_ink_Xx_3bit =
+static const stp_shade_t canon_Xx_3bit_shades[] =
{
- canon_dither_ranges_Xx_3bit,
- sizeof(canon_dither_ranges_Xx_3bit) / sizeof(stp_simple_dither_range_t),
- 1.0
+ SHADE(1.0, three_bit_dotsize),
+ SHADE(0.33, three_bit_dotsize),
};
+DECLARE_INK(canon_Xx_3bit, 1.0);
+
/* Inkset for printing in CMY and 1bit/pixel */
static const canon_variable_inkset_t ci_CMY_1 =
@@ -351,9 +361,9 @@ static const canon_variable_inkset_t ci_CMY_1 =
/* 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,
+ &canon_X_2bit_ink,
+ &canon_X_2bit_ink,
+ &canon_X_2bit_ink,
NULL
};
@@ -369,8 +379,8 @@ static const canon_variable_inkset_t ci_CMYK_1 =
/* 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,
+ &canon_Cc_1bit_ink,
+ &canon_Mm_1bit_ink,
NULL,
NULL
};
@@ -378,37 +388,37 @@ static const canon_variable_inkset_t ci_CcMmYK_1 =
/* 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
+ &canon_X_2bit_ink,
+ &canon_X_2bit_ink,
+ &canon_X_2bit_ink,
+ &canon_X_2bit_ink
};
/* 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
+ &canon_Xx_2bit_ink,
+ &canon_Xx_2bit_ink,
+ &canon_X_2bit_ink,
+ &canon_X_2bit_ink
};
/* 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
+ &canon_X_3bit_ink,
+ &canon_X_3bit_ink,
+ &canon_X_3bit_ink,
+ &canon_X_3bit_ink
};
/* 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,
+ &canon_Xx_3bit_ink,
+ &canon_Xx_3bit_ink,
+ &canon_X_3bit_ink,
+ &canon_X_3bit_ink,
};
@@ -486,50 +496,51 @@ static const canon_variable_inklist_t canon_ink_superphoto[] =
},
};
-static const double standard_sat_adjustment[49] =
-{
- 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, /* C */
- 1.8, 1.9, 1.9, 1.9, 1.7, 1.5, 1.3, 1.1, /* B */
- 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 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.1, 1.2, 1.3, 1.4, 1.5, /* Y */
- 1.5, 1.4, 1.3, 1.2, 1.1, 1.0, 1.0, 1.0, /* G */
- 1.0 /* C */
-};
-
-static const double standard_lum_adjustment[49] =
-{
- 0.50, 0.6, 0.7, 0.8, 0.9, 0.86, 0.82, 0.79, /* C */
- 0.78, 0.8, 0.83, 0.87, 0.9, 0.95, 1.05, 1.15, /* B */
- 1.3, 1.25, 1.2, 1.15, 1.12, 1.09, 1.06, 1.03, /* M */
- 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, /* R */
- 1.0, 0.9, 0.8, 0.7, 0.65, 0.6, 0.55, 0.52, /* Y */
- 0.48, 0.47, 0.47, 0.49, 0.49, 0.49, 0.52, 0.51, /* G */
- 0.50 /* C */
-};
-
-static const double standard_hue_adjustment[49] =
-{
- 0.00, 0.05, 0.04, 0.01, -.03, -.10, -.18, -.26, /* C */
- -.35, -.43, -.40, -.32, -.25, -.18, -.10, -.07, /* B */
- 0.00, -.04, -.09, -.13, -.18, -.23, -.27, -.31, /* M */
- -.35, -.38, -.30, -.23, -.15, -.08, 0.00, -.02, /* R */
- 0.00, 0.08, 0.10, 0.08, 0.05, 0.03, -.03, -.12, /* Y */
- -.20, 0.17, -.20, -.17, -.15, -.12, -.10, -.08, /* G */
- 0.00, /* C */
-};
-
-static const double plain_paper_lum_adjustment[49] =
-{
- 1.2, 1.22, 1.28, 1.34, 1.39, 1.42, 1.45, 1.48, /* C */
- 1.5, 1.4, 1.3, 1.25, 1.2, 1.1, 1.05, 1.05, /* B */
- 1.05, 1.05, 1.05, 1.05, 1.05, 1.05, 1.05, 1.05, /* M */
- 1.05, 1.05, 1.05, 1.1, 1.1, 1.1, 1.1, 1.1, /* R */
- 1.1, 1.15, 1.3, 1.45, 1.6, 1.75, 1.9, 2.0, /* Y */
- 2.1, 2.0, 1.8, 1.7, 1.6, 1.5, 1.4, 1.3, /* G */
- 1.2 /* C */
-};
+static const char standard_sat_adjustment[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* B */
+/* B */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* M */
+/* M */ "1.00 0.95 0.90 0.90 0.90 0.90 0.90 0.90 " /* R */
+/* R */ "0.90 0.95 0.95 1.00 1.00 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* G */
+/* G */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char standard_lum_adjustment[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "0.65 0.67 0.70 0.72 0.77 0.80 0.82 0.85 " /* B */
+/* B */ "0.87 0.86 0.82 0.79 0.79 0.82 0.85 0.88 " /* M */
+/* M */ "0.92 0.95 0.96 0.97 0.97 0.97 0.96 0.96 " /* R */
+/* R */ "0.96 0.97 0.97 0.98 0.99 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 0.97 0.95 0.94 0.93 0.92 0.90 0.86 " /* G */
+/* G */ "0.79 0.76 0.71 0.68 0.68 0.68 0.68 0.66 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char standard_hue_adjustment[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"-6\" upper-bound=\"6\">\n"
+/* C */ "0.00 0.06 0.10 0.10 0.06 -.01 -.09 -.17 " /* B */
+/* B */ "-.25 -.33 -.38 -.38 -.36 -.34 -.34 -.34 " /* M */
+/* M */ "-.34 -.34 -.36 -.40 -.50 -.40 -.30 -.20 " /* R */
+/* R */ "-.12 -.07 -.04 -.02 0.00 0.00 0.00 0.00 " /* Y */
+/* Y */ "0.00 0.00 0.00 -.05 -.10 -.15 -.22 -.24 " /* G */
+/* G */ "-.26 -.30 -.33 -.28 -.25 -.20 -.13 -.06 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
typedef enum {
COLOR_MONOCHROME = 1,
@@ -565,26 +576,26 @@ typedef struct canon_caps {
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;
+ const char *lum_adjustment;
+ const char *hue_adjustment;
+ const char *sat_adjustment;
} canon_cap_t;
-typedef struct canon_privdata_weave {
- int bidirectional; /* tells us if we are allowed to print bidirectional */
- int direction; /* stores the last direction of the print head */
-} canon_privdata_weave;
-
+typedef struct
+{
+ const canon_cap_t *caps;
+ unsigned char *cols[7];
+ int delay[7];
+ int delay_max;
+ int buf_length;
+ int out_width;
+ int left;
+ int emptylines;
+ int bits;
+ int ydpi;
+} canon_privdata_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);
+static void canon_write_line(stp_vars_t *v);
/* Codes for possible ink-tank combinations.
@@ -624,9 +635,6 @@ static void canon_write_line(const stp_vars_t, const canon_cap_t *, int,
#define CANON_CAP_r 0x800ul
#define CANON_CAP_g 0x1000ul
#define CANON_CAP_ACKSHORT 0x2000ul
-#define CANON_CAP_rr 0x4000ul
-#define CANON_CAP_WEAVE 0x8000ul /* S200 has to be fed with weaved data */
- /* for Resolutions above 360dpi */
#define CANON_CAP_STD0 (CANON_CAP_b|CANON_CAP_c|CANON_CAP_d|\
CANON_CAP_l|CANON_CAP_q|CANON_CAP_t)
@@ -695,9 +703,9 @@ static const canon_variable_printmode_t canon_modes_6x00[] = {
static const canon_cap_t canon_model_capabilities[] =
{
- /* default settings for unkown models */
+ /* default settings for unknown models */
- { -1, 8*72,11*72,180,180,20,20,20,20, CANON_INK_K, CANON_SLOT_ASF1, 0 },
+ { -1, 17*72/2,842,180,180,20,20,20,20, CANON_INK_K, CANON_SLOT_ASF1, 0 },
/* ******************************** */
/* */
@@ -714,27 +722,6 @@ static const canon_cap_t canon_model_capabilities[] =
/* */
/* ************************************ */
- { /* Canon S200x *//* heads: BC-24 */
- 4202, 3,
- 618, 936, /* 8.58" x 13 " */
- 180, 2880, 2880, 4,
- 10, 10, 9, 20,
- CANON_INK_CMYK | CANON_INK_CMY | CANON_INK_K,
- CANON_SLOT_ASF1,
- CANON_CAP_STD1 | CANON_CAP_rr | CANON_CAP_WEAVE,
- CANON_MODES(canon_nomodes),
-#ifndef EXPERIMENTAL_STUFF
-/* 2880dpi Resolutions: TBD */
-/* 180x180 360x360 720x720 1440x720 1440x1440 2880x2880 */
- {-1, 0, 0, 0, 0, -1},
-/*------- 360x360 720x720 1440x720 1440x1440 ---------*/
- { 1, 2, 1, 0.5, 0.3, 0.2},
- CANON_INK(canon_ink_standard),
-#endif
- standard_lum_adjustment,
- standard_hue_adjustment,
- standard_sat_adjustment
- },
{ /* Canon BJ 30 *//* heads: BC-10 */
30, 1,
@@ -1141,20 +1128,63 @@ static const canon_cap_t canon_model_capabilities[] =
};
typedef struct {
+ int x;
+ int y;
+ const char *name;
+ const char *text;
+ const char *name_dmt;
+ const char *text_dmt;
+} canon_res_t;
+
+static const canon_res_t canon_resolutions[] = {
+ { 90, 90, "90x90dpi", N_("90x90 DPI"), "90x90dmt", N_("90x90 DPI DMT") },
+ { 180, 180, "180x180dpi", N_("180x180 DPI"), "180x180dmt", N_("180x180 DPI DMT") },
+ { 360, 360, "360x360dpi", N_("360x360 DPI"), "360x360dmt", N_("360x360 DPI DMT") },
+ { 720, 360, "720x360dpi", N_("720x360 DPI"), "720x360dmt", N_("720x360 DPI DMT") },
+ { 720, 720, "720x720dpi", N_("720x720 DPI"), "720x720dmt", N_("720x720 DPI DMT") },
+ { 1440, 720, "1440x720dpi", N_("1440x720 DPI"), "1440x720dmt", N_("1440x720 DPI DMT") },
+ { 1440, 1440, "1440x1440dpi", N_("1440x1440 DPI"), "1440x1440dmt", N_("1440x1440 DPI DMT") },
+ { 2880, 2880, "2880x2880dpi", N_("2880x2880 DPI"), "2880x2880dmt", N_("2880x2880 DPI DMT") },
+ { 150, 150, "150x150dpi", N_("150x150 DPI"), "150x150dmt", N_("150x150 DPI DMT") },
+ { 300, 300, "300x300dpi", N_("300x300 DPI"), "300x300dmt", N_("300x300 DPI DMT") },
+ { 600, 300, "600x300dpi", N_("600x300 DPI"), "600x300dmt", N_("600x300 DPI DMT") },
+ { 600, 600, "600x600dpi", N_("600x600 DPI"), "600x600dmt", N_("600x600 DPI DMT") },
+ { 1200, 600, "1200x600dpi", N_("1200x600 DPI"), "1200x600dmt", N_("1200x600 DPI DMT") },
+ { 1200, 1200, "1200x1200dpi", N_("1200x1200 DPI"), "1200x1200dmt", N_("1200x1200 DPI DMT") },
+ { 2400, 2400, "2400x2400dpi", N_("2400x2400 DPI"), "2400x2400dmt", N_("2400x2400 DPI DMT") },
+ { 0, 0, NULL, NULL, NULL, NULL }
+};
+
+static const char plain_paper_lum_adjustment[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+"1.20 1.22 1.28 1.34 1.39 1.42 1.45 1.48 " /* C */
+"1.50 1.40 1.30 1.25 1.20 1.10 1.05 1.05 " /* B */
+"1.05 1.05 1.05 1.05 1.05 1.05 1.05 1.05 " /* M */
+"1.05 1.05 1.05 1.10 1.10 1.10 1.10 1.10 " /* R */
+"1.10 1.15 1.30 1.45 1.60 1.75 1.90 2.00 " /* Y */
+"2.10 2.00 1.80 1.70 1.60 1.50 1.40 1.30 " /* G */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+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;
+ const char *hue_adjustment;
+ const char *lum_adjustment;
+ const char *sat_adjustment;
} paper_t;
typedef struct {
const canon_cap_t *caps;
- int output_type;
+ int printing_color;
const paper_t *pt;
int print_head;
int colormode;
@@ -1183,31 +1213,146 @@ static const paper_t canon_paper_list[] = {
{ "Other", N_ ("Other"), 0x00, 0.50, 0.25, .5, 0, 0, 0 },
};
-/* ---- Function prototypes ----*/
+static const int paper_type_count = sizeof(canon_paper_list) / sizeof(paper_t);
+
+static const stp_parameter_t the_parameters[] =
+{
+ {
+ "PageSize", N_("Page Size"), N_("Basic Printer Setup"),
+ N_("Size of the paper being printed to"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "MediaType", N_("Media Type"), N_("Basic Printer Setup"),
+ N_("Type of media (plain paper, photo paper, etc.)"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "InputSlot", N_("Media Source"), N_("Basic Printer Setup"),
+ N_("Source (input slot) of the media"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "Resolution", N_("Resolution"), N_("Basic Printer Setup"),
+ N_("Resolution and quality of the print"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "InkType", N_("Ink Type"), N_("Advanced Printer Setup"),
+ N_("Type of ink in the printer"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "InkChannels", N_("Ink Channels"), N_("Advanced Printer Functionality"),
+ N_("Ink Channels"),
+ STP_PARAMETER_TYPE_INT, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_INTERNAL, 0, 0, -1, 0, 0
+ },
+ {
+ "PrintingMode", N_("Printing Mode"), N_("Core Parameter"),
+ N_("Printing Output Mode"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+};
+
+static const int the_parameter_count =
+sizeof(the_parameters) / sizeof(const stp_parameter_t);
-static void canon_advance_paper(stp_vars_t, int);
+typedef struct
+{
+ const stp_parameter_t param;
+ double min;
+ double max;
+ double defval;
+ int color_only;
+} float_param_t;
+
+static const float_param_t float_parameters[] =
+{
+ {
+ {
+ "CyanDensity", N_("Cyan Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the cyan balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 1, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "MagentaDensity", N_("Magenta Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the magenta balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 2, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "YellowDensity", N_("Yellow Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the yellow balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 3, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "BlackDensity", N_("Black Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the black balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 0, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "LightCyanTransition", N_("Light Cyan Transition"), N_("Advanced Ink Adjustment"),
+ N_("Light Cyan Transition"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, -1, 1, 0
+ }, 0.0, 5.0, 1.0, 1
+ },
+ {
+ {
+ "LightMagentaTransition", N_("Light Magenta Transition"), N_("Advanced Ink Adjustment"),
+ N_("Light Magenta Transition"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, -1, 1, 0
+ }, 0.0, 5.0, 1.0, 1
+ },
+ {
+ {
+ "LightYellowTransition", N_("Light Yellow Transition"), N_("Advanced Ink Adjustment"),
+ N_("Light Yellow Transition"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, -1, 1, 0
+ }, 0.0, 5.0, 1.0, 1
+ },
+};
-static const int paper_type_count = sizeof(canon_paper_list) / sizeof(paper_t);
-static void canon_flush_pass(stp_softweave_t *sw, int passno, int model, int width,
- int hoffset, int ydpi, int xdpi, int physical_xdpi,
- int vertical_subpass);
+static const int float_parameter_count =
+sizeof(float_parameters) / sizeof(const float_param_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]);
- }
+ if (name)
+ 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)
+
+static const canon_cap_t * canon_get_model_capabilities(int model)
{
int i;
int models= sizeof(canon_model_capabilities) / sizeof(canon_cap_t);
@@ -1224,9 +1369,12 @@ static int
canon_source_type(const char *name, const canon_cap_t * caps)
{
/* used internally: do not translate */
- if (!strcmp(name,"Auto")) return 4;
- if (!strcmp(name,"Manual")) return 0;
- if (!strcmp(name,"ManualNP")) return 1;
+ if (name)
+ {
+ if (!strcmp(name,"Auto")) return 4;
+ if (!strcmp(name,"Manual")) return 0;
+ if (!strcmp(name,"ManualNP")) return 1;
+ }
stp_deprintf(STP_DBG_CANON,"canon: Unknown source type '%s' - reverting to auto\n",name);
return 4;
@@ -1236,20 +1384,22 @@ static int
canon_printhead_type(const char *name, const canon_cap_t * caps)
{
/* used internally: do not translate */
- if (!strcmp(name,"Gray")) return 0;
- if (!strcmp(name,"RGB")) return 1;
- if (!strcmp(name,"CMYK")) return 2;
- if (!strcmp(name,"PhotoCMY")) return 3;
- if (!strcmp(name,"Photo")) return 4;
- if (!strcmp(name,"PhotoCMYK")) return 5;
-
- if (*name == 0) {
+ if (name)
+ {
+ if (!strcmp(name,"Gray")) return 0;
+ if (!strcmp(name,"RGB")) return 1;
+ if (!strcmp(name,"CMYK")) return 2;
+ if (!strcmp(name,"PhotoCMY")) return 3;
+ if (!strcmp(name,"Photo")) return 4;
+ if (!strcmp(name,"PhotoCMYK")) return 5;
+ }
+ if (name && *name == 0) {
if (caps->inks & 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);
+ stp_deprintf(STP_DBG_CANON,"canon: Unknown head combo '%s' - reverting to black\n",name);
return 0;
}
@@ -1257,30 +1407,33 @@ 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)
+ {
+ 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 (name && *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);
+ stp_deprintf(STP_DBG_CANON,"canon: Unknown head combo '%s' - reverting to black\n",name);
return COLOR_MONOCHROME;
}
static unsigned char
-canon_size_type(const stp_vars_t v, const canon_cap_t * caps)
+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));
+ 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);
+ const char *name = pp->name;
/* used internally: do not translate */
/* built ins: */
if (!strcmp(name,"A5")) return 0x01;
@@ -1303,14 +1456,6 @@ canon_size_type(const stp_vars_t v, const canon_cap_t * caps)
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)
{
@@ -1367,27 +1512,24 @@ canon_ink_type(const canon_cap_t * caps, int res_code)
#endif
}
-static const double *
-canon_lum_adjustment(const stp_printer_t printer)
+static const char *
+canon_lum_adjustment(int model)
{
- const canon_cap_t * caps=
- canon_get_model_capabilities(stp_printer_get_model(printer));
+ const canon_cap_t * caps= canon_get_model_capabilities(model);
return (caps->lum_adjustment);
}
-static const double *
-canon_hue_adjustment(const stp_printer_t printer)
+static const char *
+canon_hue_adjustment(int model)
{
- const canon_cap_t * caps=
- canon_get_model_capabilities(stp_printer_get_model(printer));
+ const canon_cap_t * caps= canon_get_model_capabilities(model);
return (caps->hue_adjustment);
}
-static const double *
-canon_sat_adjustment(const stp_printer_t printer)
+static const char *
+canon_sat_adjustment(int model)
{
- const canon_cap_t * caps=
- canon_get_model_capabilities(stp_printer_get_model(printer));
+ const canon_cap_t * caps= canon_get_model_capabilities(model);
return (caps->sat_adjustment);
}
@@ -1450,16 +1592,52 @@ canon_inks(const canon_cap_t * caps, int res_code, int colors, int bits)
}
static void
-canon_describe_resolution(const stp_printer_t printer,
- const char *resolution, int *x, int *y)
+canon_describe_resolution(const stp_vars_t *v, int *x, int *y)
{
+ const char *resolution = stp_get_string_parameter(v, "Resolution");
+ const canon_res_t *res = canon_resolutions;
+ while (res->x > 0)
+ {
+ if (strcmp(resolution, res->name) == 0 ||
+ strcmp(resolution, res->name_dmt) == 0)
+ {
+ *x = res->x;
+ *y = res->y;
+ return;
+ }
+ res++;
+ }
*x = -1;
*y = -1;
- sscanf(resolution, "%dx%d", x, y);
- return;
}
-static const stp_param_t media_sources[] =
+static const char *
+canon_describe_output(const stp_vars_t *v)
+{
+ int model = stp_get_model_id(v);
+ const canon_cap_t *caps = canon_get_model_capabilities(model);
+ const char *print_mode = stp_get_string_parameter(v, "PrintingMode");
+ const char *ink_type = stp_get_string_parameter(v, "InkType");
+ colormode_t colormode = canon_printhead_colors(ink_type,caps);
+ int printhead= canon_printhead_type(ink_type,caps);
+
+ if ((print_mode && strcmp(print_mode, "BW") == 0) ||
+ printhead == 0 || caps->inks == CANON_INK_K)
+ colormode = COLOR_MONOCHROME;
+
+ switch (colormode)
+ {
+ case COLOR_CMY:
+ return "CMY";
+ case COLOR_CMYK:
+ return "CMYK";
+ case COLOR_MONOCHROME:
+ default:
+ return "Grayscale";
+ }
+}
+
+static const stp_param_string_t media_sources[] =
{
{ "Auto", N_ ("Auto Sheet Feeder") },
{ "Manual", N_ ("Manual with Pause") },
@@ -1471,226 +1649,172 @@ static const stp_param_t media_sources[] =
* '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 */
+static stp_parameter_list_t
+canon_list_parameters(const stp_vars_t *v)
+{
+ stp_parameter_list_t *ret = stp_parameter_list_create();
+ int i;
+ for (i = 0; i < the_parameter_count; i++)
+ stp_parameter_list_add_param(ret, &(the_parameters[i]));
+ for (i = 0; i < float_parameter_count; i++)
+ stp_parameter_list_add_param(ret, &(float_parameters[i].param));
+ return ret;
+}
+
+static void
+canon_parameters(const stp_vars_t *v, const char *name,
+ stp_parameter_t *description)
{
int i;
- 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;
+ canon_get_model_capabilities(stp_get_model_id(v));
+ description->p_type = STP_PARAMETER_TYPE_INVALID;
if (name == NULL)
- return (NULL);
+ return;
+
+ for (i = 0; i < float_parameter_count; i++)
+ if (strcmp(name, float_parameters[i].param.name) == 0)
+ {
+ stp_fill_parameter_settings(description,
+ &(float_parameters[i].param));
+ description->deflt.dbl = float_parameters[i].defval;
+ description->bounds.dbl.upper = float_parameters[i].max;
+ description->bounds.dbl.lower = float_parameters[i].min;
+ return;
+ }
+ for (i = 0; i < the_parameter_count; i++)
+ if (strcmp(name, the_parameters[i].name) == 0)
+ {
+ stp_fill_parameter_settings(description, &(the_parameters[i]));
+ break;
+ }
if (strcmp(name, "PageSize") == 0)
{
int height_limit, width_limit;
int papersizes = stp_known_papersizes();
- valptrs = stp_zalloc(sizeof(stp_param_t) * papersizes);
- *count = 0;
+ description->bounds.str = stp_string_list_create();
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)
+ const stp_papersize_t *pt = stp_get_papersize_by_index(i);
+ if (strlen(pt->name) > 0 &&
+ pt->width <= width_limit && pt->height <= height_limit)
{
- valptrs[*count].name = c_strdup(stp_papersize_get_name(pt));
- valptrs[*count].text = c_strdup(stp_papersize_get_text(pt));
- (*count)++;
+ if (stp_string_list_count(description->bounds.str) == 0)
+ description->deflt.str = pt->name;
+ stp_string_list_add_string(description->bounds.str,
+ pt->name, pt->text);
}
}
}
else if (strcmp(name, "Resolution") == 0)
{
- char tmp[100];
int x,y;
- int c= 0;
int t;
- valptrs = stp_zalloc(sizeof(stp_param_t) * 10);
+ description->bounds.str= stp_string_list_create();
+ description->deflt.str = NULL;
for (x=1; x<6; x++) {
for (y=x-1; y<x+1; y++) {
if ((t= canon_ink_type(caps,(x<<4)|y)) > -1) {
- sprintf(tmp,"%dx%ddpi",
- (1<<x)/2*caps->base_res,(1<<y)/2*caps->base_res);
- valptrs[c].name= c_strdup(tmp);
-
- sprintf(tmp,"%dx%d DPI",
- (1<<x)/2*caps->base_res,(1<<y)/2*caps->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<<x)/2*caps->base_res,(1<<y)/2*caps->base_res);
- valptrs[c].name= c_strdup(tmp);
- sprintf(tmp,"%dx%d DPI DMT",
- (1<<x)/2*caps->base_res,(1<<y)/2*caps->base_res);
- stp_deprintf(STP_DBG_CANON,"supports mode '%s'\n",tmp);
- valptrs[c++].text = c_strdup(tmp);
+ int xx = (1<<x)/2*caps->base_res;
+ int yy = (1<<y)/2*caps->base_res;
+ const canon_res_t *res = canon_resolutions;
+ while (res->x > 0) {
+ if (xx == res->x && yy == res->y) {
+ stp_string_list_add_string(description->bounds.str,
+ res->name, _(res->text));
+ stp_deprintf(STP_DBG_CANON,"supports mode '%s'\n",
+ res->name);
+ if (xx >= 300 && yy >= 300 && description->deflt.str == NULL)
+ description->deflt.str = res->name;
+ if (t == 1) {
+ stp_string_list_add_string(description->bounds.str,
+ res->name_dmt, _(res->text_dmt));
+ stp_deprintf(STP_DBG_CANON,"supports mode '%s'\n",
+ res->name_dmt);
+ }
+ break;
+ }
+ res++;
}
}
}
}
- *count= c;
}
else if (strcmp(name, "InkType") == 0)
{
- int c= 0;
- valptrs = stp_zalloc(sizeof(stp_param_t) * 5);
+ description->bounds.str= stp_string_list_create();
/* used internally: do not translate */
if ((caps->inks & CANON_INK_K))
- {
- valptrs[c].name = c_strdup("Gray");
- valptrs[c++].text = c_strdup(_("Black"));
- }
+ stp_string_list_add_string(description->bounds.str,
+ "Gray", _("Black"));
if ((caps->inks & CANON_INK_CMY))
- {
- valptrs[c].name = c_strdup("RGB");
- valptrs[c++].text = c_strdup(_("CMY Color"));
- }
+ stp_string_list_add_string(description->bounds.str,
+ "RGB", _("CMY Color"));
if ((caps->inks & CANON_INK_CMYK))
- {
- valptrs[c].name = c_strdup("CMYK");
- valptrs[c++].text = c_strdup(_("CMYK Color"));
- }
+ stp_string_list_add_string(description->bounds.str,
+ "CMYK", _("CMYK Color"));
if ((caps->inks & CANON_INK_CcMmYK))
- {
- valptrs[c].name = c_strdup("PhotoCMY");
- valptrs[c++].text = c_strdup(_("Photo CcMmY Color"));
- }
+ stp_string_list_add_string(description->bounds.str,
+ "PhotoCMY", _("Photo CcMmY Color"));
if ((caps->inks & CANON_INK_CcMmYyK))
+ stp_string_list_add_string(description->bounds.str,
+ "PhotoCMYK", _("Photo CcMmYK Color"));
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
+ else if (strcmp(name, "InkChannels") == 0)
{
- valptrs[c].name = c_strdup("PhotoCMYK");
- valptrs[c++].text = c_strdup(_("Photo CcMmYK Color"));
+ if (caps->inks & CANON_INK_CcMmYyK)
+ description->deflt.integer = 7;
+ else if (caps->inks & CANON_INK_CcMmYK)
+ description->deflt.integer = 6;
+ else if (caps->inks & CANON_INK_CMYK)
+ description->deflt.integer = 4;
+ else if (caps->inks & CANON_INK_CMY)
+ description->deflt.integer = 3;
+ else
+ description->deflt.integer = 1;
+ description->bounds.integer.lower = -1;
+ description->bounds.integer.upper = -1;
}
-
- *count = c;
- }
else if (strcmp(name, "MediaType") == 0)
{
- *count = sizeof(canon_paper_list) / sizeof(canon_paper_list[0]);
-
- valptrs = stp_zalloc(*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));
- }
+ int count = sizeof(canon_paper_list) / sizeof(canon_paper_list[0]);
+ description->bounds.str= stp_string_list_create();
+ description->deflt.str= canon_paper_list[0].name;
+
+ for (i = 0; i < count; i ++)
+ stp_string_list_add_string(description->bounds.str,
+ canon_paper_list[i].name,
+ _(canon_paper_list[i].text));
}
else if (strcmp(name, "InputSlot") == 0)
{
- *count = sizeof(media_sources) / sizeof(media_sources[0]);
-
- valptrs = stp_zalloc(*count * sizeof(stp_param_t));
- for (i = 0; i < *count; i ++)
- {
- /* translate media_sources */
- valptrs[i].name = c_strdup(media_sources[i].name);
- valptrs[i].text = c_strdup(_(media_sources[i].text));
- }
+ int count = 3;
+ description->bounds.str= stp_string_list_create();
+ description->deflt.str= media_sources[0].name;
+ for (i = 0; i < count; i ++)
+ stp_string_list_add_string(description->bounds.str,
+ media_sources[i].name,
+ _(media_sources[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)
+ else if (strcmp(name, "PrintingMode") == 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;
+ description->bounds.str = stp_string_list_create();
+ stp_string_list_add_string
+ (description->bounds.str, "Color", _("Color"));
+ stp_string_list_add_string
+ (description->bounds.str, "BW", _("Black and White"));
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
}
- 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<x+1; y++)
- {
- if ((t= canon_ink_type(caps,(x<<4)|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);
}
@@ -1699,36 +1823,64 @@ canon_default_parameters(const stp_printer_t printer,
*/
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 */
+internal_imageable_area(const stp_vars_t *v, /* I */
+ int use_paper_margins,
+ 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 */
+ int left_margin = 0;
+ int right_margin = 0;
+ int bottom_margin = 0;
+ int top_margin = 0;
- const canon_cap_t * caps=
- canon_get_model_capabilities(stp_printer_get_model(printer));
+ const canon_cap_t * caps= canon_get_model_capabilities(stp_get_model_id(v));
+ const char *media_size = stp_get_string_parameter(v, "PageSize");
+ const stp_papersize_t *pt = NULL;
- stp_default_media_size(printer, v, &width, &length);
+ if (media_size && use_paper_margins)
+ pt = stp_get_papersize_by_name(media_size);
- *left = caps->border_left;
- *right = width - caps->border_right;
- *top = length - caps->border_top;
- *bottom = caps->border_bottom;
+ stp_default_media_size(v, &width, &length);
+ if (pt)
+ {
+ left_margin = pt->left;
+ right_margin = pt->right;
+ bottom_margin = pt->bottom;
+ top_margin = pt->top;
+ }
+ left_margin = MAX(left_margin, caps->border_left);
+ right_margin = MAX(right_margin, caps->border_right);
+ top_margin = MAX(top_margin, caps->border_top);
+ bottom_margin = MAX(bottom_margin, caps->border_bottom);
+
+ *left = left_margin;
+ *right = width - right_margin;
+ *top = top_margin;
+ *bottom = length - bottom_margin;
}
static void
-canon_limit(const stp_printer_t printer, /* I - Printer model */
- const stp_vars_t v, /* I */
+canon_imageable_area(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 */
+{
+ internal_imageable_area(v, 1, left, right, bottom, top);
+}
+
+static void
+canon_limit(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));
+ canon_get_model_capabilities(stp_get_model_id(v));
*width = caps->max_width;
*height = caps->max_height;
*min_width = 1;
@@ -1739,7 +1891,7 @@ canon_limit(const stp_printer_t printer, /* I - Printer model */
* 'canon_cmd()' - Sends a command with variable args
*/
static void
-canon_cmd(const stp_vars_t v, /* I - the printer */
+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 */
@@ -1762,8 +1914,7 @@ canon_cmd(const stp_vars_t v, /* I - the printer */
if (cmd)
{
stp_putc(cmd,v);
- stp_putc((num & 255),v);
- stp_putc((num >> 8 ),v);
+ stp_put16_le(num, v);
if (num)
stp_zfwrite((const char *)buffer,num,1,v);
}
@@ -1777,13 +1928,10 @@ canon_cmd(const stp_vars_t v, /* I - the printer */
#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)
+canon_init_resetPrinter(const stp_vars_t *v, canon_init_t *init)
{
unsigned long f=init->caps->features;
if (f & (CANON_CAP_ACKSHORT))
@@ -1799,7 +1947,7 @@ canon_init_resetPrinter(const stp_vars_t v, canon_init_t *init)
/* ESC (a -- 0x61 -- cmdSetPageMode --:
*/
static void
-canon_init_setPageMode(const stp_vars_t v, canon_init_t *init)
+canon_init_setPageMode(const stp_vars_t *v, canon_init_t *init)
{
if (!(init->caps->features & CANON_CAP_a))
return;
@@ -1811,7 +1959,7 @@ canon_init_setPageMode(const stp_vars_t v, canon_init_t *init)
/* ESC (b -- 0x62 -- -- set data compression:
*/
static void
-canon_init_setDataCompression(const stp_vars_t v, canon_init_t *init)
+canon_init_setDataCompression(const stp_vars_t *v, canon_init_t *init)
{
if (!(init->caps->features & CANON_CAP_b))
return;
@@ -1822,17 +1970,16 @@ canon_init_setDataCompression(const stp_vars_t v, canon_init_t *init)
/* ESC (c -- 0x63 -- cmdSetColor --:
*/
static void
-canon_init_setColor(const stp_vars_t v, canon_init_t *init)
+canon_init_setColor(const stp_vars_t *v, canon_init_t *init)
{
unsigned char
- numargs, arg_63[6];
+ arg_63_1, arg_63_2, arg_63_3;
if (!(init->caps->features & CANON_CAP_c))
return;
- numargs = 3;
- arg_63[0] = init->caps->model_id << 4; /* MODEL_ID */
+ arg_63_1 = init->caps->model_id << 4; /* MODEL_ID */
switch ( init->caps->model_id ) {
@@ -1840,46 +1987,27 @@ canon_init_setColor(const stp_vars_t v, canon_init_t *init)
break; /* tbd */
case 1: /* 360 dpi series - BJC-4000, BJC-210, BJC-70 and their descendants */
- if (init->output_type==OUTPUT_GRAY || init->output_type == OUTPUT_MONOCHROME)
- arg_63[0]|= 0x01; /* PRINT_COLOUR */
+ if (!init->printing_color)
+ arg_63_1|= 0x01; /* PRINT_COLOUR */
- arg_63[1] = ((init->pt ? init->pt->media_code : 0) << 4) /* PRINT_MEDIA */
+ arg_63_2 = ((init->pt ? init->pt->media_code : 0) << 4) /* PRINT_MEDIA */
+ 1; /* hardcode to High quality for now */ /* PRINT_QUALITY */
- canon_cmd(v,ESC28,0x63, 2, arg_63[0], arg_63[1]);
+ canon_cmd(v,ESC28,0x63, 2, arg_63_1, arg_63_2);
break;
case 2: /* are any models using this? */
break;
case 3: /* 720 dpi series - BJC-3000 and descendants */
- if (init->output_type==OUTPUT_GRAY || init->output_type == OUTPUT_MONOCHROME)
- arg_63[0]|= 0x01; /* colour mode */
-
- arg_63[1] = (init->pt) ? init->pt->media_code : 0; /* print media type */
- if (init->caps->model == 4202) /* S200 */
- {
- if ((init->xdpi == 720) && (init->ydpi == 720 ))
- arg_63[2] = 1;
- else
- arg_63[2] = 4; /* hardcoded: quality 3 (may be 0...4) */
- /* bidirectional is controlled via quality: 0..2 is bidi, 3 and 4 uni */
- /* not every combination works, no idea about the principle */
- if ( (init->xdpi > 360) || (init->ydpi > 360) )
- {
- numargs = 6;
- arg_63[3] = 0x10; arg_63[4] = 6; arg_63[5] = 8; /* arg5 makes a vert. offset for K */
- if (init->output_type==OUTPUT_GRAY || init->output_type == OUTPUT_MONOCHROME)
- arg_63[4] = 1;
- }
- }
- else
- arg_63[2] = 2; /* hardcode to whatever this means for now; quality, apparently */
-
- stp_zprintf(v, "\033\050\143");
- stp_putc((numargs & 255),v);
- stp_putc((numargs >> 8 ),v);
- stp_zfwrite((const char *)arg_63, numargs, 1, v);
+ if (!init->printing_color)
+ arg_63_1|= 0x01; /* colour mode */
+
+ arg_63_2 = (init->pt) ? init->pt->media_code : 0; /* print media type */
+
+ arg_63_3 = 2; /* hardcode to whatever this means for now */ /* quality, apparently */
+
+ canon_cmd(v,ESC28,0x63, 3, arg_63_1, arg_63_2, arg_63_3);
break;
}
@@ -1889,29 +2017,20 @@ canon_init_setColor(const stp_vars_t v, canon_init_t *init)
/* ESC (d -- 0x64 -- -- set raster resolution:
*/
static void
-canon_init_setResolution(const stp_vars_t v, canon_init_t *init)
+canon_init_setResolution(const stp_vars_t *v, canon_init_t *init)
{
if (!(init->caps->features & CANON_CAP_d))
return;
- if (init->caps->model != 4202 || (init->xdpi < 360))
+
canon_cmd(v,ESC28,0x64, 4,
(init->ydpi >> 8 ), (init->ydpi & 255),
(init->xdpi >> 8 ), (init->xdpi & 255));
- else
- if (init->xdpi < 2880)
- canon_cmd(v,ESC28,0x64, 4,
- (720 >> 8), (720 & 255),
- (720 >> 8), (720 & 255));
- else
- canon_cmd(v,ESC28,0x64, 4,
- (720 >> 8), (720 & 255),
- (2880 >> 8), (2880 & 255));
}
/* ESC (g -- 0x67 -- cmdSetPageMargins --:
*/
static void
-canon_init_setPageMargins(const stp_vars_t v, canon_init_t *init)
+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?
@@ -1938,7 +2057,7 @@ canon_init_setPageMargins(const stp_vars_t v, canon_init_t *init)
/* ESC (l -- 0x6c -- cmdSetTray --:
*/
static void
-canon_init_setTray(const stp_vars_t v, canon_init_t *init)
+canon_init_setTray(const stp_vars_t *v, canon_init_t *init)
{
unsigned char
arg_6c_1 = 0x00,
@@ -1954,22 +2073,20 @@ canon_init_setTray(const stp_vars_t v, canon_init_t *init)
arg_6c_1|= (source & 0x0f);
- if (init->pt)
- arg_6c_2 = init->pt->media_code;
+ 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 -- cmdSetPrintMode -- :
+/* ESC (m -- 0x6d -- -- :
*/
static void
-canon_init_setPrintMode(const stp_vars_t v, canon_init_t *init)
+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 and S200*/
- /* S200:for envelope and t-shirt transfer = 03 */
+ arg_6d_3 = 0x00, /* only 01 for bjc8200 */
arg_6d_a = 0x03, /* A4 paper */
arg_6d_b = 0x00;
@@ -1986,10 +2103,10 @@ canon_init_setPrintMode(const stp_vars_t v, canon_init_t *init)
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)
+ if (!init->printing_color)
arg_6d_2= 0x02;
- if (init->caps->model==8200 || init->caps->model==4202)
+ if (init->caps->model==8200)
arg_6d_3= 0x01;
canon_cmd(v,ESC28,0x6d,12, arg_6d_1,
@@ -2000,12 +2117,11 @@ canon_init_setPrintMode(const stp_vars_t v, canon_init_t *init)
/* ESC (p -- 0x70 -- cmdSetPageMargins2 --:
*/
static void
-canon_init_setPageMargins2(const stp_vars_t v, canon_init_t *init)
+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?
- * [KF] I think the printable width/length in units of 1/60 inch
*/
int printable_width= init->page_width*5/6;
@@ -2027,7 +2143,7 @@ canon_init_setPageMargins2(const stp_vars_t v, canon_init_t *init)
/* ESC (q -- 0x71 -- setPageID -- :
*/
static void
-canon_init_setPageID(const stp_vars_t v, canon_init_t *init)
+canon_init_setPageID(const stp_vars_t *v, canon_init_t *init)
{
if (!(init->caps->features & CANON_CAP_q))
return;
@@ -2035,35 +2151,21 @@ canon_init_setPageID(const stp_vars_t v, canon_init_t *init)
canon_cmd(v,ESC28,0x71, 1, 0x01);
}
-/* ESC (r -- 0x72 -- ??? set direction ??? -- :
+/* ESC (r -- 0x72 -- -- :
*/
static void
-canon_init_setX72(const stp_vars_t v, canon_init_t *init)
+canon_init_setX72(const stp_vars_t *v, canon_init_t *init)
{
- if ( !( (init->caps->features & CANON_CAP_r)
- || (init->caps->features & CANON_CAP_rr) ) )
+ if (!(init->caps->features & CANON_CAP_r))
return;
- if ( (init->caps->features & CANON_CAP_r)
- || (init->caps->features & CANON_CAP_rr) )
- canon_cmd(v,ESC28,0x72, 1, 0x61); /* whatever for - 8200/S200 need it */
- if (init->caps->features & CANON_CAP_rr)
- canon_cmd(v,ESC28,0x72, 3, 0x63, 1, 0); /* whatever for - S200 needs it */
- /* probably to set the print direction of the head */
-}
-
-/* ESC (r -- 0x72 -- ??? set direction ??? -- :
- only works if quality = 01 (S200) */
-static void
-canon_set_X72(const stp_vars_t v, int x72arg)
-{
- canon_cmd(v,ESC28,0x72, 3, 0x63, x72arg, 0);
+ 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)
+canon_init_setImage(const stp_vars_t *v, canon_init_t *init)
{
unsigned char
arg_74_1 = 0x01, /* 1 bit per pixel */
@@ -2073,17 +2175,6 @@ canon_init_setImage(const stp_vars_t v, canon_init_t *init)
if (!(init->caps->features & CANON_CAP_t))
return;
-
- if (init->caps->model==4202) /* 1 bit per pixel (arg 4,7,10,13); */
- /* 2 level per pixel (arg 6,9,12,15) for each color */
- /* though we print only 1bit/pixel - but this is how */
- /* the windows driver works */
- {
- canon_cmd(v,ESC28,0x74, 30, 0x80, 4, 1, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2,\
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
- return;
- }
-
if (init->xdpi==1440) arg_74_2= 0x04;
if (init->ydpi>=720) arg_74_3= 0x09;
@@ -2114,7 +2205,7 @@ canon_init_setImage(const stp_vars_t v, canon_init_t *init)
}
static void
-canon_init_printer(const stp_vars_t v, canon_init_t *init)
+canon_init_printer(const stp_vars_t *v, canon_init_t *init)
{
int mytop;
/* init printer */
@@ -2139,7 +2230,7 @@ canon_init_printer(const stp_vars_t v, canon_init_t *init)
}
static void
-canon_deinit_printer(const stp_vars_t v, canon_init_t *init)
+canon_deinit_printer(const stp_vars_t *v, canon_init_t *init)
{
/* eject page */
stp_putc(0x0c,v);
@@ -2151,14 +2242,14 @@ canon_deinit_printer(const stp_vars_t v, canon_init_t *init)
}
static int
-canon_end_job(const stp_printer_t printer, /* I - Model */
- stp_image_t *image, /* I - Image to print */
- const stp_vars_t v)
+canon_start_job(const stp_vars_t *v, stp_image_t *image)
+{
+ return 1;
+}
+
+static int
+canon_end_job(const stp_vars_t *v, stp_image_t *image)
{
- if (!stp_get_verified(v))
- return 0;
- if (stp_get_job_mode(v) != STP_JOB_MODE_JOB)
- return 0;
canon_cmd(v,ESC40,0,0);
return 1;
}
@@ -2178,98 +2269,108 @@ canon_advance_buffer(unsigned char *buf, int len, int num)
memset(buf,0,len);
}
+static void
+setup_column(canon_privdata_t *privdata, int col, int buf_length)
+{
+ privdata->cols[col] = stp_zalloc(buf_length * (privdata->delay[col] + 1));
+}
+
+static void
+canon_printfunc(stp_vars_t *v)
+{
+ int i;
+ canon_privdata_t *pd = (canon_privdata_t *) stp_get_component_data(v, "Driver");
+ canon_write_line(v);
+ for (i = 0; i < 7; i++)
+ canon_advance_buffer(pd->cols[i], pd->buf_length, pd->delay[i]);
+
+}
+
+static double
+get_double_param(stp_vars_t *v, const char *param)
+{
+ if (param && stp_check_float_parameter(v, param, STP_PARAMETER_ACTIVE))
+ return stp_get_float_parameter(v, param);
+ else
+ return 1.0;
+}
+
+static void
+set_ink_ranges(stp_vars_t *v, const canon_variable_ink_t *ink, int color,
+ const char *channel_param, const char *subchannel_param)
+{
+ if (!ink)
+ return;
+ stp_dither_set_inks_full(v, color, ink->numshades, ink->shades, 1.0,
+ ink_darknesses[color]);
+ stp_channel_set_density_adjustment
+ (v, color, 1, (get_double_param(v, channel_param) *
+ get_double_param(v, subchannel_param) *
+ get_double_param(v, "Density")));
+}
+
/*
* '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)
+static int
+canon_do_print(stp_vars_t *v, stp_image_t *image)
{
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 status = 1;
+ int model = stp_get_model_id(v);
+ const char *resolution = stp_get_string_parameter(v, "Resolution");
+ const char *media_source = stp_get_string_parameter(v, "InputSlot");
+ const char *print_mode = stp_get_string_parameter(v, "PrintingMode");
+ int printing_color = 0;
+ const char *ink_type = stp_get_string_parameter(v, "InkType");
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 */
- unsigned char *cols[7]; /* Bitmap data: cols[0]=black ... */
- /* ... cols[6]=lyellow */
-
- 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 */
+ canon_privdata_t privdata;
+ int page_width, /* Width of page */
page_height, /* Length of page */
- page_true_height,/* True length of page */
+ page_left,
+ page_top,
+ page_right,
+ page_bottom,
+ 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 */
+ out_height, /* Length of image on page */
+ out_channels, /* 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;
+ unsigned zero_mask;
int bits= 1;
int image_height,
- image_width,
- image_bpp;
- int ink_spread;
- void * dither;
+ image_width;
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;
+ stp_curve_t *lum_adjustment = NULL;
+ stp_curve_t *hue_adjustment = NULL;
+ stp_curve_t *sat_adjustment = NULL;
canon_init_t init;
- const canon_cap_t * caps = canon_get_model_capabilities(model);
- int printhead = canon_printhead_type(ink_type,caps);
+ 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;
+ const canon_res_t *res = canon_resolutions;
- stp_dither_data_t *dt;
- void * weave = NULL;
- int total_channels; /* number of colors to print with */
- int physical_xdpi = 720, nozzle_ydpi = 360, stepper_ydpi = 720;
- int nozzles = 24; /* count of inkjets for one pass */
- int nozzle_separation, horizontal_passes;
- int vertical_passes, vertical_oversample;
- int * head_offset = NULL;
- canon_privdata_weave privdata;
-
- if (!stp_get_verified(nv))
+ if (!stp_verify(v))
{
- stp_eprintf(nv, "Print options not verified; cannot print.\n");
- return;
+ stp_eprintf(v, "Print options not verified; cannot print.\n");
+ return 0;
}
+ if (strcmp(print_mode, "Color") == 0)
+ printing_color = 1;
PUT("top ",top,72);
PUT("left ",left,72);
@@ -2278,52 +2379,44 @@ canon_print(const stp_printer_t printer, /* I - 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);
+ stp_image_init(image);
/* force grayscale if image is grayscale
* or single black cartridge installed
*/
- if ((printhead == 0 || caps->inks == CANON_INK_K) &&
- output_type != OUTPUT_MONOCHROME)
+ if (printhead == 0 || caps->inks == CANON_INK_K)
{
- output_type = OUTPUT_GRAY;
- stp_set_output_type(nv, output_type);
+ printing_color = 0;
+ stp_set_string_parameter(v, "PrintingMode", "BW");
}
- if (output_type == OUTPUT_GRAY || output_type == OUTPUT_MONOCHROME)
+ if (!printing_color)
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;
+ xdpi = -1;
+ ydpi = -1;
+ while (res->x > 0) {
+ if (strcmp(resolution, res->name) == 0 ||
+ strcmp(resolution, res->name_dmt) == 0)
+ {
+ xdpi = res->x;
+ ydpi = res->y;
+ break;
+ }
+ res++;
}
stp_deprintf(STP_DBG_CANON,"canon: resolution=%dx%d\n",xdpi,ydpi);
-#ifndef EXPERIMENTAL_STUFF
stp_deprintf(STP_DBG_CANON," rescode =0x%x\n",canon_res_code(caps,xdpi,ydpi));
res_code= canon_res_code(caps,xdpi,ydpi);
-#endif
- if (((!strcmp(resolution+(strlen(resolution)-3),"DMT")) ||
- (!strcmp(resolution+(strlen(resolution)-3),"dmt"))) &&
- (caps->features & CANON_CAP_DMT) &&
- output_type != OUTPUT_MONOCHROME) {
+ if (strcmp(resolution, res->name_dmt) == 0 &&
+ (caps->features & CANON_CAP_DMT)) {
bits= 2;
stp_deprintf(STP_DBG_CANON,"canon: using drop modulation technology\n");
}
@@ -2332,44 +2425,34 @@ canon_print(const stp_printer_t printer, /* I - Model */
* Compute the output size...
*/
- canon_imageable_area(printer, nv, &page_left, &page_right,
- &page_bottom, &page_top);
+ out_width = stp_get_width(v);
+ out_height = stp_get_height(v);
- 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);
+ internal_imageable_area(v, 0, &page_left, &page_right,
+ &page_bottom, &page_top);
+ left -= page_left;
+ top -= page_top;
+ page_width = page_right - page_left;
+ page_height = page_bottom - page_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);
+ image_height = stp_image_height(image);
+ image_width = stp_image_width(image);
- stp_default_media_size(printer, nv, &n, &page_true_height);
+ stp_default_media_size(v, &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("out_height", out_height,ydpi);
PUT("top ",top,72);
PUT("left ",left,72);
- pt = get_media_type(stp_get_media_type(nv));
+ pt = get_media_type(stp_get_string_parameter(v, "MediaType"));
init.caps = caps;
- init.output_type = output_type;
+ init.printing_color = printing_color;
init.pt = pt;
init.print_head = printhead;
init.colormode = colormode;
@@ -2382,7 +2465,7 @@ canon_print(const stp_printer_t printer, /* I - Model */
init.left = left;
init.bits = bits;
- canon_init_printer(nv, &init);
+ canon_init_printer(v, &init);
/* possibly changed during initialitation
* to enforce valid modes of operation:
@@ -2396,38 +2479,32 @@ canon_print(const stp_printer_t printer, /* I - Model */
*/
out_width = xdpi * out_width / 72;
- out_length = ydpi * out_length / 72;
+ out_height = ydpi * out_height / 72;
PUT("out_width ", out_width,xdpi);
- PUT("out_length", out_length,ydpi);
+ PUT("out_height", out_height,ydpi);
left = xdpi * left / 72;
PUT("leftskip",left,xdpi);
- if((xdpi == 1440) && (model != 4202)){
- delay_k= 0;
- delay_c= 112;
- delay_m= 224;
- delay_y= 336;
- delay_lc= 112;
- delay_lm= 224;
- delay_ly= 336;
- delay_max= 336;
+ for (i = 0; i < 7; i++)
+ privdata.cols[i] = NULL;
+
+ if(xdpi==1440){
+ privdata.delay[0] = 0;
+ privdata.delay[1] = 112;
+ privdata.delay[2] = 224;
+ privdata.delay[3] = 336;
+ privdata.delay[4] = 112;
+ privdata.delay[5] = 224;
+ privdata.delay[6] = 336;
+ privdata.delay_max = 336;
stp_deprintf(STP_DBG_CANON,"canon: delay on!\n");
- } else if (model ==4202 ){
- delay_k= 0;
- delay_c= 0x30;
- delay_m= 0x50;
- delay_y= 0x70;
- delay_lc= 0;
- delay_lm= 0;
- delay_ly= 0;
- delay_max= 0x70;
- stp_deprintf(STP_DBG_CANON,"canon: delay for S200 on!\n");
} else {
- delay_k= delay_c= delay_m= delay_y= delay_lc= delay_lm= delay_ly=0;
- delay_max=0;
+ for (i = 0; i < 7; i++)
+ privdata.delay[i] = 0;
+ privdata.delay_max = 0;
stp_deprintf(STP_DBG_CANON,"canon: delay off!\n");
}
@@ -2437,67 +2514,84 @@ canon_print(const stp_printer_t printer, /* I - Model */
length = (out_width + 7) / 8;
- buf_length= length*bits;
+ privdata.buf_length= length*bits;
+ privdata.left = left;
+ privdata.bits = bits;
+ privdata.out_width = out_width;
+ privdata.caps = caps;
+ privdata.ydpi = ydpi;
- stp_deprintf(STP_DBG_CANON,"canon: buflength is %d!\n",buf_length);
+ stp_deprintf(STP_DBG_CANON,"canon: buflength is %d!\n",privdata.buf_length);
- for (i=0; i<=6; i++)
- cols[i] = NULL;
-
- if (colormode==COLOR_MONOCHROME)
- cols[0] = stp_zalloc(buf_length*(delay_k+1));
-
- else { /* use Colors CMY */
- cols[1] = stp_zalloc(buf_length*(delay_c+1));
- cols[2] = stp_zalloc(buf_length*(delay_m+1));
- cols[3] = stp_zalloc(buf_length*(delay_y+1));
+ if (colormode==COLOR_MONOCHROME) {
+ setup_column(&privdata, 0, privdata.buf_length);
+ } else {
+ setup_column(&privdata, 1, privdata.buf_length);
+ setup_column(&privdata, 2, privdata.buf_length);
+ setup_column(&privdata, 3, privdata.buf_length);
- if (colormode!=COLOR_CMY) /* use also K */
- cols[0] = stp_zalloc(buf_length*(delay_k+1));
+ if (colormode!=COLOR_CMY)
+ setup_column(&privdata, 0, privdata.buf_length);
if (colormode==COLOR_CCMMYK || colormode==COLOR_CCMMYYK) {
use_6color= 1;
- cols[4] = stp_zalloc(buf_length*(delay_lc+1));
- cols[5] = stp_zalloc(buf_length*(delay_lm+1));
+ setup_column(&privdata, 4, privdata.buf_length);
+ setup_column(&privdata, 5, privdata.buf_length);
if (colormode==CANON_INK_CcMmYyK)
- cols[6] = stp_zalloc(buf_length*(delay_lc+1));
+ setup_column(&privdata, 6, privdata.buf_length);
}
}
- stp_deprintf(STP_DBG_CANON,"canon: driver will use colors %s%s%s%s%s%s\n",
- cols[1] ? "C" : "", cols[4] ? "c" : "", cols[2] ? "M" : "",
- cols[5] ? "m" : "", cols[3] ? "Y" : "", cols[0] ? "K" : "");
+ if (privdata.cols[0])
+ {
+ if (privdata.cols[1])
+ stp_set_string_parameter(v, "STPIOutputType", "KCMY");
+ else
+ stp_set_string_parameter(v, "STPIOutputType", "Grayscale");
+ }
+ else
+ stp_set_string_parameter(v, "STPIOutputType", "CMY");
+
+ stp_deprintf(STP_DBG_CANON,
+ "canon: driver will use colors %s%s%s%s%s%s%s\n",
+ privdata.cols[0] ? "K" : "",
+ privdata.cols[1] ? "C" : "",
+ privdata.cols[2] ? "M" : "",
+ privdata.cols[3] ? "Y" : "",
+ privdata.cols[4] ? "c" : "",
+ privdata.cols[5] ? "m" : "",
+ privdata.cols[6] ? "y" : "");
- stp_deprintf(STP_DBG_CANON,"density is %f\n",stp_get_density(nv));
+ stp_deprintf(STP_DBG_CANON,"density is %f\n",
+ stp_get_float_parameter(v, "Density"));
/*
* Compute the LUT. For now, it's 8 bit, but that may eventually
* sometimes change.
*/
+
+ if (!stp_check_float_parameter(v, "Density", STP_PARAMETER_DEFAULTED))
+ {
+ stp_set_float_parameter_active(v, "Density", STP_PARAMETER_ACTIVE);
+ stp_set_float_parameter(v, "Density", 1.0);
+ }
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);
+ stp_scale_float_parameter(v, "Density", pt->base_density);
+ else /* Can't find paper type? Assume plain */
+ stp_scale_float_parameter(v, "Density", .5);
+ stp_scale_float_parameter(v, "Density", canon_density(caps, res_code));
+ if (stp_get_float_parameter(v, "Density") > 1.0)
+ stp_set_float_parameter(v, "Density", 1.0);
if (colormode == COLOR_MONOCHROME)
- stp_set_gamma(nv, stp_get_gamma(nv) / .8);
- stp_compute_lut(nv, 256);
+ stp_scale_float_parameter(v, "Gamma", 1.25);
- stp_deprintf(STP_DBG_CANON,"density is %f\n",stp_get_density(nv));
+ stp_deprintf(STP_DBG_CANON,"density is %f\n",
+ stp_get_float_parameter(v, "Density"));
/*
* 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;
@@ -2513,305 +2607,163 @@ canon_print(const stp_printer_t printer, /* I - Model */
k_lower *= .5;
k_upper = .5;
}
- stp_dither_set_black_lower(dither, k_lower);
- stp_dither_set_black_upper(dither, k_upper);
+ if (!stp_check_float_parameter(v, "GCRLower", STP_PARAMETER_ACTIVE))
+ stp_set_default_float_parameter(v, "GCRLower", k_lower);
+ if (!stp_check_float_parameter(v, "GCRUpper", STP_PARAMETER_ACTIVE))
+ stp_set_default_float_parameter(v, "GCRUpper", k_upper);
+ stp_dither_init(v, image, out_width, xdpi, ydpi);
- 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))
+ for (i = 0; i < 7; i++)
{
- 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;
+ if (privdata.cols[i])
+ {
+ stp_dither_add_channel(v, privdata.cols[i], channel_color_map[i],
+ subchannel_color_map[i]);
+ if (channel_color_map[i] == STP_ECOLOR_K)
+ stp_channel_set_black_channel(v, STP_ECOLOR_K);
+ }
}
- stp_dither_set_density(dither, stp_get_density(nv));
- /* initialize weaving for S200 for resolutions > 360dpi */
- if (init.caps->features & CANON_CAP_WEAVE && xdpi > 360)
- {
- stepper_ydpi = 720;
- nozzle_ydpi = 360;
- if (xdpi == 2880)
- physical_xdpi = 2880;
- else
- physical_xdpi = 720;
-
- total_channels = 4;
- head_offset = stp_zalloc(sizeof(int) * total_channels);
- memset(head_offset, 0, sizeof(head_offset));
-
- if ( colormode == COLOR_MONOCHROME )
- nozzles = 64; /* black nozzles */
- else
- nozzles = 24; /* color nozzles */
- if (colormode == COLOR_MONOCHROME)
- {
- head_offset[0] = 0; /* K starts at 0 */
- head_offset[1] = 144 ;/* how far C starts after K */
- head_offset[2] = 144 + 64;/* how far M starts after K */
- head_offset[3] = 144 + 64 + 64;/* how far Y starts after K */
- top += 11;
- }
- else if (colormode == COLOR_CMYK)
+ if ((inks = canon_inks(caps, res_code, colormode, bits))!=0)
{
- head_offset[0] = 0; /* K starts at 0 */
- head_offset[1] = 144 ;/* how far C starts after K */
- head_offset[2] = 144 + 64;/* how far M starts after K */
- head_offset[3] = 144 + 64 + 64;/* how far Y starts after K */
- top += 5;
- }
- else /* colormode == CMY */
- {
- head_offset[0] = 0; /* K starts at 0 */
- head_offset[1] = 0 ;/* how far C starts after K */
- head_offset[2] = 64;/* how far M starts after K */
- head_offset[3] = 128;/* how far Y starts after K */
- top += 18;
- }
-
- nozzle_separation = stepper_ydpi / nozzle_ydpi;
- horizontal_passes = xdpi / physical_xdpi;
- vertical_passes = 1;
- vertical_oversample = ydpi / stepper_ydpi;
-
- privdata.bidirectional = 1; /* 1: bidirectional; 0: unidirectional printing */
- privdata.direction = 1;
- stp_set_driver_data(nv, &privdata);
-
- stp_deprintf(STP_DBG_CANON,"canon: initializing weaving: nozzles=%d, nozzle_separation=%d, "
- "horizontal_passes=%d, vertical_passes=%d,vertical_oversample=%d, total_channels=%d \n",
- nozzles, nozzle_separation,
- horizontal_passes, vertical_passes,
- vertical_oversample, total_channels);
-
- weave = stp_initialize_weave(nozzles, nozzle_separation,
- horizontal_passes, vertical_passes,
- vertical_oversample, total_channels,
- 1,
- out_width, out_length,
- top * stepper_ydpi / 72,
- page_height * stepper_ydpi / 72,
- 1, head_offset, nv,
- canon_flush_pass,
- stp_fill_uncompressed,
- stp_pack_uncompressed,
- stp_compute_uncompressed_linewidth);
+ set_ink_ranges(v, inks->c, STP_ECOLOR_C, "MagentaDensity",
+ "LightCyanTransition");
+ set_ink_ranges(v, inks->m, STP_ECOLOR_M, "MagentaDensity",
+ "LightMagentaTransition");
+ set_ink_ranges(v, inks->y, STP_ECOLOR_Y, "YellowDensity",
+ "LightYellowTransition");
+ set_ink_ranges(v, inks->k, STP_ECOLOR_K, "BlackDensity", NULL);
}
-
- in = stp_zalloc(image_width * image_bpp);
- out = stp_zalloc(image_width * out_bpp * 2);
-
- errdiv = image_height / out_length;
- errmod = image_height % out_length;
+ stp_channel_set_density_adjustment
+ (v, STP_ECOLOR_C, 0,
+ get_double_param(v, "CyanDensity") * get_double_param(v, "Density"));
+ stp_channel_set_density_adjustment
+ (v, STP_ECOLOR_M, 0,
+ get_double_param(v, "MagentaDensity") * get_double_param(v, "Density"));
+ stp_channel_set_density_adjustment
+ (v, STP_ECOLOR_Y, 0,
+ get_double_param(v, "YellowDensity") * get_double_param(v, "Density"));
+ stp_channel_set_density_adjustment
+ (v, STP_ECOLOR_K, 0,
+ get_double_param(v, "BlackDensity") * get_double_param(v, "Density"));
+
+ errdiv = image_height / out_height;
+ errmod = image_height % out_height;
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 (!stp_check_curve_parameter(v, "HueMap", STP_PARAMETER_ACTIVE) &&
+ pt->hue_adjustment)
+ {
+ hue_adjustment = stp_read_and_compose_curves
+ (canon_hue_adjustment(model),
+ pt ? pt->hue_adjustment : NULL, STP_CURVE_COMPOSE_ADD, 384);
+ stp_set_curve_parameter(v, "HueMap", hue_adjustment);
+ stp_curve_destroy(hue_adjustment);
}
- }
- 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 (!stp_check_curve_parameter(v, "LumMap", STP_PARAMETER_ACTIVE) &&
+ pt->lum_adjustment)
+ {
+ lum_adjustment = stp_read_and_compose_curves
+ (canon_lum_adjustment(model),
+ pt ? pt->lum_adjustment : NULL, STP_CURVE_COMPOSE_MULTIPLY, 384);
+ stp_set_curve_parameter(v, "LumMap", lum_adjustment);
+ stp_curve_destroy(lum_adjustment);
}
- }
- 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];
+ if (!stp_check_curve_parameter(v, "SatMap", STP_PARAMETER_ACTIVE) &&
+ pt->sat_adjustment)
+ {
+ sat_adjustment = stp_read_and_compose_curves
+ (canon_sat_adjustment(model),
+ pt ? pt->sat_adjustment : NULL, STP_CURVE_COMPOSE_MULTIPLY, 384);
+ stp_set_curve_parameter(v, "SatMap", sat_adjustment);
+ stp_curve_destroy(sat_adjustment);
}
- }
- dt = stp_create_dither_data();
- stp_add_channel(dt, cols[0], ECOLOR_K, 0);
- stp_add_channel(dt, cols[1], ECOLOR_C, 0);
- stp_add_channel(dt, cols[4], ECOLOR_C, 1);
- stp_add_channel(dt, cols[2], ECOLOR_M, 0);
- stp_add_channel(dt, cols[5], ECOLOR_M, 1);
- stp_add_channel(dt, cols[3], ECOLOR_Y, 0);
- stp_add_channel(dt, cols[6], ECOLOR_Y, 1);
+ out_channels = stp_color_init(v, image, 65536);
+ stp_allocate_component_data(v, "Driver", NULL, NULL, &privdata);
-/* ---- go through every image line (y) ---- */
-
- for (y = 0; y < out_length; y ++)
+ privdata.emptylines = 0;
+ for (y = 0; y < out_height; y ++)
{
int duplicate_line = 1;
-/* stp_deprintf(STP_DBG_CANON,"\ny=%d\n",y); */
-
- 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);
+ if (stp_color_get_row(v, image, errline, &zero_mask))
+ {
+ status = 2;
+ break;
+ }
}
- stp_dither(out, y, dither, dt, duplicate_line, zero_mask);
-
-#if 0 /* excessive debugging */
- stp_deprintf(STP_DBG_CANON,"dithering done, length=%d, out_width=%d \n"
- "black=%p; cyan=%p; magenta=%p; yellow=%p \n",
- length, out_width, cols[0], cols[1], cols[2], cols[3]);
- dump_area(cols[0], length, "black:");
- dump_area(cols[1], length, "cyan:");
- dump_area(cols[2], length, "magenta:");
- dump_area(cols[3], length, "yellow:");
-#endif
-
- if (init.caps->features & CANON_CAP_WEAVE && xdpi > 360)
- {
- stp_write_weave(weave, length, stepper_ydpi, model, out_width,
- left * physical_xdpi / xdpi,
- xdpi, physical_xdpi, cols);
- }
-
- else
- {
- canon_write_line(nv, caps, ydpi, cols[0], delay_k,
- cols[1], delay_c,
- cols[2], delay_m,
- cols[3], delay_y,
- cols[4], delay_lc,
- cols[5], delay_lm,
- cols[6], delay_ly,
- length, out_width, left, &emptylines, bits);
-
- canon_advance_buffer(cols[0], buf_length,delay_k);
- canon_advance_buffer(cols[1], buf_length,delay_c);
- canon_advance_buffer(cols[2], buf_length,delay_m);
- canon_advance_buffer(cols[3], buf_length,delay_y);
- canon_advance_buffer(cols[4], buf_length,delay_lc);
- canon_advance_buffer(cols[5], buf_length,delay_lm);
- canon_advance_buffer(cols[6], buf_length,delay_ly);
- }
-
+ stp_dither(v, y, duplicate_line, zero_mask, NULL);
+ canon_printfunc(v);
errval += errmod;
errline += errdiv;
- if (errval >= out_length)
+ if (errval >= out_height)
{
- errval -= out_length;
+ errval -= out_height;
errline ++;
}
}
- if (init.caps->features & CANON_CAP_WEAVE && xdpi > 360)
- {
- stp_flush_all(weave, model, out_width,
- left * physical_xdpi / xdpi,
- ydpi, xdpi, physical_xdpi);
- canon_advance_paper(nv, 5);
- }
- else
- {
/*
* Flush delayed buffers...
*/
- if (delay_max) {
+ if (privdata.delay_max) {
stp_deprintf(STP_DBG_CANON,"\ncanon: flushing %d possibly delayed buffers\n",
- delay_max);
- for (y= 0; y<delay_max; y++) {
-
- canon_write_line(nv, caps, ydpi, cols[0], delay_k,
- cols[1], delay_c,
- cols[2], delay_m,
- cols[3], delay_y,
- cols[4], delay_lc,
- cols[5], delay_lm,
- cols[6], delay_ly,
- length, out_width, left, &emptylines, bits);
-
- canon_advance_buffer(cols[0], buf_length,delay_k);
- canon_advance_buffer(cols[1], buf_length,delay_c);
- canon_advance_buffer(cols[2], buf_length,delay_m);
- canon_advance_buffer(cols[3], buf_length,delay_y);
- canon_advance_buffer(cols[4], buf_length,delay_lc);
- canon_advance_buffer(cols[5], buf_length,delay_lm);
- canon_advance_buffer(cols[6], buf_length,delay_ly);
+ privdata.delay_max);
+ for (y= 0; y<privdata.delay_max; y++) {
+
+ canon_write_line(v);
+ for (i = 0; i < 7; i++)
+ canon_advance_buffer(privdata.cols[i], privdata.buf_length,
+ privdata.delay[i]);
}
}
- }
- image->progress_conclude(image);
+ stp_image_conclude(image);
/*
* Cleanup...
*/
- stp_free_dither_data(dt);
- stp_free_dither(dither);
- stp_free_lut(nv);
- stp_free(in);
- stp_free(out);
- if (weave != NULL) stp_destroy_weave(weave);
- for (y = 0; y < 6; y++)
- if ( cols[y] != NULL ) stp_free(cols[y]);
-
- canon_deinit_printer(nv, &init);
- stp_free_vars(nv);
+ for (i = 0; i < 7; i++)
+ if (privdata.cols[i])
+ stp_free(privdata.cols[i]);
+
+ canon_deinit_printer(v, &init);
+ return status;
}
-const stp_printfuncs_t stp_canon_printfuncs =
+static int
+canon_print(const stp_vars_t *v, stp_image_t *image)
+{
+ int status;
+ stp_vars_t *nv = stp_vars_create_copy(v);
+ stp_prune_inactive_options(nv);
+ status = canon_do_print(nv, image);
+ stp_vars_destroy(nv);
+ return status;
+}
+
+static const stp_printfuncs_t print_canon_printfuncs =
{
+ canon_list_parameters,
canon_parameters,
stp_default_media_size,
canon_imageable_area,
canon_limit,
canon_print,
- canon_default_parameters,
canon_describe_resolution,
+ canon_describe_output,
stp_verify_printer_params,
- stp_start_job,
+ canon_start_job,
canon_end_job
};
@@ -3010,24 +2962,36 @@ canon_shift_buffer(unsigned char *line,int length,int bits)
}
}
+#if 0
+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;
+}
+#endif
+
/*
* '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; currently unused */
+canon_write(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; currently unused */
+ int ydpi, /* I - Vertical resolution */
int *empty, /* IO- Preceeding empty lines */
- int width, /* I - Printed width; currently unused */
+ int width, /* I - Printed width */
int offset, /* I - Offset from left side */
int bits)
{
unsigned char
- comp_buf[COMPBUFWIDTH], /* Compression buffer */
+ comp_buf[COMPBUFWIDTH + COMPBUFWIDTH / 4], /* Compression buffer */
in_fold[COMPBUFWIDTH],
*in_ptr= line,
*comp_ptr, *comp_data;
@@ -3045,14 +3009,14 @@ canon_write(const stp_vars_t v, /* I - Print file or command */
if (bits==2) {
- memset(in_fold,0,length*2);
+ memset(in_fold,0,length);
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);
+ memset(in_fold,0,length);
canon_fold_3bit(line,length,in_fold);
in_ptr= in_fold;
length= (length*8)/3;
@@ -3065,7 +3029,6 @@ canon_write(const stp_vars_t v, /* I - Print file or command */
}
#endif
}
-
/* pack left border rounded to multiples of 8 dots */
comp_data= comp_buf;
@@ -3086,23 +3049,21 @@ canon_write(const stp_vars_t v, /* I - Print file or command */
"bitoffset=%d!!\n",bitoffset);
}
- stp_pack_tiff(in_ptr, length, comp_data, &comp_ptr);
- newlength = comp_ptr - comp_buf;
+ stp_pack_tiff(v, in_ptr, length, comp_data, &comp_ptr, NULL, NULL);
+ 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);
+ stp_put16_be(*empty, 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);
+ stp_put16_le(newlength + 1, v);
color= "CMYKcmy"[coloridx];
if (!color) color= 'K';
stp_putc(color,v);
@@ -3113,157 +3074,69 @@ canon_write(const stp_vars_t v, /* I - Print file or command */
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)
+canon_write_line(stp_vars_t *v)
{
+ canon_privdata_t *pd =
+ (canon_privdata_t *) stp_get_component_data(v, "Driver");
+ static const int write_sequence[] = { 0, 3, 2, 1, 6, 5, 4 };
+ static const int write_number[] = { 3, 2, 1, 0, 6, 5, 4 };
+ int i;
int written= 0;
- stp_deprintf(STP_DBG_CANON,"canon_write_line: length=%d, width=%d, (hor.)offset=%d\n",
- l, width, offset);
-
- 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;
-}
-
-static void
-canon_advance_paper(stp_vars_t v, int advance)
-{
- if ( advance > 0 )
+ for (i = 0; i < 7; i++)
{
- int a0, a1, a2, a3;
- stp_deprintf(STP_DBG_CANON,"canon_advance_paper: advance= %d\n", advance);
- a0 = advance & 0xff;
- a1 = (advance >> 8) & 0xff;
- a2 = (advance >> 16) & 0xff;
- a3 = (advance >> 24) & 0xff;
- stp_zprintf(v, "\033(e%c%c%c%c%c%c", 4, 0, a3, a2, a1, a0);
+ int col = write_sequence[i];
+ int num = write_number[i];
+ if (pd->cols[col])
+ written += canon_write(v, pd->caps,
+ pd->cols[col] + pd->delay[col] * pd->buf_length,
+ pd->buf_length / pd->bits, num, pd->ydpi,
+ &(pd->emptylines), pd->out_width,
+ pd->left, pd->bits);
}
+ if (written)
+ stp_zfwrite("\033\050\145\002\000\000\001", 7, 1, v);
+ else
+ pd->emptylines += 1;
}
-static void
-canon_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);
- canon_privdata_weave *privdata_weave = stp_get_driver_data(nv);
- int papershift = (pass->logicalpassstart - sw->last_pass_offset);
- int color, line, empty = 0, written = 0, linelength = 0, lines = 0;
- int idx[4]={3, 0, 1, 2}; /* color numbering is different between canon_write and weaving */
-
- stp_deprintf(STP_DBG_CANON,"canon_flush_pass: pass=%d, papershift=%d\n", passno, papershift);
-
- for ( color = 0; color < sw->ncolors; color++ ) /* find max. linecount */
- {
- if ( linecount[0].v[color] > lines ) lines = linecount[0].v[color];
- }
- for ( line = 0; line < lines; line++ ) /* go through each nozzle of that pass */
- {
- stp_deprintf(STP_DBG_CANON,"canon_flush_pass: line=%d, written=%d, empty=%d \n",
- line, written, empty);
- if ( written > 0 )
- canon_cmd(nv,ESC28,0x65, 2, 0, 1); /* go to next nozzle if there was printed some data */
-
- written = 0;
- for ( color = 0; color < sw->ncolors; color++ )
- {
- if ( line < linecount[0].v[color] ) /* try only existing lines */
- {
- if ( lineactive[0].v[color] > 0 )
- {
- linelength = lineoffs[0].v[color] / linecount[0].v[color];
-/* stp_deprintf(STP_DBG_CANON,"canon_flush_pass: linelength=%d, bufs[0].v[color]=%p,"
- "bufs[0].v[color]+line * linelength=%p, empty=%d \n", linelength, bufs[0].v[color], bufs[0].v[color] + line * linelength, empty);
-*/
- if ( pass->logicalpassstart > sw->last_pass_offset)
- {
- canon_advance_paper(nv, papershift);
- sw->last_pass_offset = pass->logicalpassstart;
- if (privdata_weave->bidirectional)
- {
- privdata_weave->direction = (privdata_weave->direction +1) & 1;
- canon_set_X72(nv, privdata_weave->direction);
- }
- }
-
- written += canon_write(nv, NULL,
- (unsigned char *)(bufs[0].v[color] + line * linelength),
- linelength, idx[color], 0, &empty, 0, hoffset, sw->bitwidth);
- }
- }
- }
-
- if ( written == 0 ) /* count unused nozzles */
- empty += 1;
- }
-
- for ( color = 0; color < sw->ncolors; color++ )
- {
- lineoffs[0].v[color] = 0;
- linecount[0].v[color] = 0;
- }
+static stp_family_t print_canon_module_data =
+ {
+ &print_canon_printfuncs,
+ NULL
+ };
- sw->last_pass = pass->pass;
- pass->pass = -1;
+static int
+print_canon_module_init(void)
+{
+ return stp_family_register(print_canon_module_data.printer_list);
}
+static int
+print_canon_module_exit(void)
+{
+ return stp_family_unregister(print_canon_module_data.printer_list);
+}
+/* Module header */
+#define stp_module_version print_canon_LTX_stp_module_version
+#define stp_module_data print_canon_LTX_stp_module_data
+stp_module_version_t stp_module_version = {0, 0};
-
-
-
-
-
-
-
-
-
-
+stp_module_t stp_module_data =
+ {
+ "canon",
+ VERSION,
+ "Canon family driver",
+ STP_MODULE_CLASS_FAMILY,
+ NULL,
+ print_canon_module_init,
+ print_canon_module_exit,
+ (void *) &print_canon_module_data
+ };
diff --git a/src/main/print-color.c b/src/main/print-color.c
index 3587e9a..b381667 100644
--- a/src/main/print-color.c
+++ b/src/main/print-color.c
@@ -1,7 +1,7 @@
/*
- * "$Id: print-color.c,v 1.26.2.3 2003/08/25 17:04:13 rleigh Exp $"
+ * "$Id: print-color.c,v 1.129 2005/06/30 01:45:19 rlk Exp $"
*
- * Print plug-in color management for the GIMP.
+ * Gutenprint color management module - traditional Gutenprint algorithm.
*
* Copyright 1997-2000 Michael Sweet (mike@easysw.com) and
* Robert Krawitz (rlk@alum.mit.edu)
@@ -29,2120 +29,1606 @@
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#include <gimp-print/gimp-print.h>
-#include "gimp-print-internal.h"
-#include <gimp-print/gimp-print-intl-internal.h>
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <gutenprint/curve-cache.h>
#include <math.h>
-#include <string.h>
+#ifdef HAVE_LIMITS_H
#include <limits.h>
+#endif
+#include <string.h>
+#include "color-conversion.h"
#ifdef __GNUC__
#define inline __inline__
#endif
-typedef struct
+static const color_correction_t color_corrections[] =
{
- 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 */
+ { "None", N_("Default"), COLOR_CORRECTION_DEFAULT, 1 },
+ { "Accurate", N_("High Accuracy"), COLOR_CORRECTION_ACCURATE, 1 },
+ { "Bright", N_("Bright Colors"), COLOR_CORRECTION_BRIGHT, 1 },
+ { "Hue", N_("Correct Hue Only"), COLOR_CORRECTION_HUE, 1 },
+ { "Uncorrected", N_("Uncorrected"), COLOR_CORRECTION_UNCORRECTED, 0 },
+ { "Desaturated", N_("Desaturated"), COLOR_CORRECTION_DESATURATED, 0 },
+ { "Threshold", N_("Threshold"), COLOR_CORRECTION_THRESHOLD, 0 },
+ { "Density", N_("Density"), COLOR_CORRECTION_DENSITY, 0 },
+ { "Raw", N_("Raw"), COLOR_CORRECTION_RAW, 0 },
+ { "Predithered", N_("Pre-Dithered"), COLOR_CORRECTION_PREDITHERED, 0 },
+};
+
+static const int color_correction_count =
+sizeof(color_corrections) / sizeof(color_correction_t);
+
+static const channel_param_t channel_params[] =
+{
+ { CMASK_K, "BlackGamma", "BlackCurve", "WhiteGamma", "WhiteCurve" },
+ { CMASK_C, "CyanGamma", "CyanCurve", "RedGamma", "RedCurve" },
+ { CMASK_M, "MagentaGamma", "MagentaCurve", "GreenGamma", "GreenCurve" },
+ { CMASK_Y, "YellowGamma", "YellowCurve", "BlueGamma", "BlueCurve" },
+ { CMASK_W, "WhiteGamma", "WhiteCurve", "BlackGamma", "BlackCurve" },
+ { CMASK_R, "RedGamma", "RedCurve", "CyanGamma", "CyanCurve" },
+ { CMASK_G, "GreenGamma", "GreenCurve", "MagentaGamma", "MagentaCurve" },
+ { CMASK_B, "BlueGamma", "BlueCurve", "YellowGamma", "YellowCurve" },
+};
+
+static const int channel_param_count =
+sizeof(channel_params) / sizeof(channel_param_t);
+
+static const channel_param_t raw_channel_params[] =
+{
+ { 0, "GammaCh0", "CurveCh0", "GammaCh0", "CurveCh0" },
+ { 1, "GammaCh1", "CurveCh1", "GammaCh1", "CurveCh1" },
+ { 2, "GammaCh2", "CurveCh2", "GammaCh2", "CurveCh2" },
+ { 3, "GammaCh3", "CurveCh3", "GammaCh3", "CurveCh3" },
+ { 4, "GammaCh4", "CurveCh4", "GammaCh4", "CurveCh4" },
+ { 5, "GammaCh5", "CurveCh5", "GammaCh5", "CurveCh5" },
+ { 6, "GammaCh6", "CurveCh6", "GammaCh6", "CurveCh6" },
+ { 7, "GammaCh7", "CurveCh7", "GammaCh7", "CurveCh7" },
+ { 8, "GammaCh8", "CurveCh8", "GammaCh8", "CurveCh8" },
+ { 9, "GammaCh9", "CurveCh9", "GammaCh9", "CurveCh9" },
+ { 10, "GammaCh10", "CurveCh10", "GammaCh10", "CurveCh10" },
+ { 11, "GammaCh11", "CurveCh11", "GammaCh11", "CurveCh11" },
+ { 12, "GammaCh12", "CurveCh12", "GammaCh12", "CurveCh12" },
+ { 13, "GammaCh13", "CurveCh13", "GammaCh13", "CurveCh13" },
+ { 14, "GammaCh14", "CurveCh14", "GammaCh14", "CurveCh14" },
+ { 15, "GammaCh15", "CurveCh15", "GammaCh15", "CurveCh15" },
+ { 16, "GammaCh16", "CurveCh16", "GammaCh16", "CurveCh16" },
+ { 17, "GammaCh17", "CurveCh17", "GammaCh17", "CurveCh17" },
+ { 18, "GammaCh18", "CurveCh18", "GammaCh18", "CurveCh18" },
+ { 19, "GammaCh19", "CurveCh19", "GammaCh19", "CurveCh19" },
+ { 20, "GammaCh20", "CurveCh20", "GammaCh20", "CurveCh20" },
+ { 21, "GammaCh21", "CurveCh21", "GammaCh21", "CurveCh21" },
+ { 22, "GammaCh22", "CurveCh22", "GammaCh22", "CurveCh22" },
+ { 23, "GammaCh23", "CurveCh23", "GammaCh23", "CurveCh23" },
+ { 24, "GammaCh24", "CurveCh24", "GammaCh24", "CurveCh24" },
+ { 25, "GammaCh25", "CurveCh25", "GammaCh25", "CurveCh25" },
+ { 26, "GammaCh26", "CurveCh26", "GammaCh26", "CurveCh26" },
+ { 27, "GammaCh27", "CurveCh27", "GammaCh27", "CurveCh27" },
+ { 28, "GammaCh28", "CurveCh28", "GammaCh28", "CurveCh28" },
+ { 29, "GammaCh29", "CurveCh29", "GammaCh29", "CurveCh29" },
+ { 30, "GammaCh30", "CurveCh30", "GammaCh30", "CurveCh30" },
+ { 31, "GammaCh31", "CurveCh31", "GammaCh31", "CurveCh31" },
+};
+
+static const int raw_channel_param_count =
+sizeof(raw_channel_params) / sizeof(channel_param_t);
+
+
+static const color_description_t color_descriptions[] =
+{
+ { N_("Grayscale"), 1, 1, COLOR_ID_GRAY, COLOR_BLACK, CMASK_K, 1,
+ COLOR_CORRECTION_UNCORRECTED, &stpi_color_convert_to_gray },
+ { N_("Whitescale"), 1, 1, COLOR_ID_WHITE, COLOR_WHITE, CMASK_K, 1,
+ COLOR_CORRECTION_UNCORRECTED, &stpi_color_convert_to_gray },
+ { N_("RGB"), 1, 1, COLOR_ID_RGB, COLOR_WHITE, CMASK_CMY, 3,
+ COLOR_CORRECTION_ACCURATE, &stpi_color_convert_to_color },
+ { N_("CMY"), 1, 1, COLOR_ID_CMY, COLOR_BLACK, CMASK_CMY, 3,
+ COLOR_CORRECTION_ACCURATE, &stpi_color_convert_to_color },
+ { N_("CMYK"), 1, 0, COLOR_ID_CMYK, COLOR_BLACK, CMASK_CMYK, 4,
+ COLOR_CORRECTION_ACCURATE, &stpi_color_convert_to_kcmy },
+ { N_("KCMY"), 1, 1, COLOR_ID_KCMY, COLOR_BLACK, CMASK_CMYK, 4,
+ COLOR_CORRECTION_ACCURATE, &stpi_color_convert_to_kcmy },
+ { N_("Raw"), 1, 1, COLOR_ID_RAW, COLOR_UNKNOWN, 0, -1,
+ COLOR_CORRECTION_RAW, &stpi_color_convert_raw },
+};
+
+static const int color_description_count =
+sizeof(color_descriptions) / sizeof(color_description_t);
+
+
+static const channel_depth_t channel_depths[] =
+{
+ { "8", 8 },
+ { "16", 16 }
+};
-#define FMAX(a, b) ((a) > (b) ? (a) : (b))
-#define FMIN(a, b) ((a) < (b) ? (a) : (b))
+static const int channel_depth_count =
+sizeof(channel_depths) / sizeof(channel_depth_t);
-static inline void
-calc_rgb_to_hsl(unsigned short *rgb, double *hue, double *sat,
- double *lightness)
+typedef struct
{
- 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;
+ const stp_parameter_t param;
+ double min;
+ double max;
+ double defval;
+ unsigned channel_mask;
+ int color_only;
+} float_param_t;
+
+#define RAW_GAMMA_CHANNEL(channel) \
+ { \
+ { \
+ "GammaCh" #channel, N_("Channel " #channel " Gamma"), N_("Gamma"), \
+ N_("Gamma for raw channel " #channel), \
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT, \
+ STP_PARAMETER_LEVEL_INTERNAL, 0, 1, channel, 1, 0 \
+ }, 0.1, 4.0, 1.0, CMASK_RAW, 0 \
+ }
- if (red > green)
+static const float_param_t float_parameters[] =
+{
+ {
{
- if (red > blue)
- {
- max = red;
- maxval = 0;
- }
- else
- {
- max = blue;
- maxval = 2;
- }
- min = FMIN(green, blue);
- }
- else
+ "ColorCorrection", N_("Color Correction"), N_("Basic Image Adjustment"),
+ N_("Color correction to be applied"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 1, 1, -1, 1, 0
+ }, 0.0, 0.0, 0.0, CMASK_EVERY, 0
+ },
+ {
{
- 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 <eugene@anikin.com> */
+ "ChannelBitDepth", N_("Channel Bit Depth"), N_("Core Parameter"),
+ N_("Bit depth per channel"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ }, 0.0, 0.0, 0.0, CMASK_EVERY, 0
+ },
+ {
{
- s = 0.0;
- h = 0.0;
- }
- else
+ "InputImageType", N_("Input Image Type"), N_("Core Parameter"),
+ N_("Input image type"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ }, 0.0, 0.0, 0.0, CMASK_EVERY, 0
+ },
+ {
{
- 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;
-}
+ "STPIOutputType", N_("Output Image Type"), N_("Core Parameter"),
+ N_("Output image type"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_INTERNAL, 1, 1, -1, 1, 0
+ }, 0.0, 0.0, 0.0, CMASK_EVERY, 0
+ },
+ {
+ {
+ "STPIRawChannels", N_("Raw Channels"), N_("Core Parameter"),
+ N_("Raw Channels"),
+ STP_PARAMETER_TYPE_INT, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_INTERNAL, 1, 1, -1, 1, 0
+ }, 1.0, STP_CHANNEL_LIMIT, 1.0, CMASK_EVERY, 0
+ },
+ {
+ {
+ "Brightness", N_("Brightness"), N_("Basic Image Adjustment"),
+ N_("Brightness of the print"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ }, 0.0, 2.0, 1.0, CMASK_ALL, 0
+ },
+ {
+ {
+ "Contrast", N_("Contrast"), N_("Basic Image Adjustment"),
+ N_("Contrast of the print (0 is solid gray)"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ }, 0.0, 4.0, 1.0, CMASK_ALL, 0
+ },
+ {
+ {
+ "LinearContrast", N_("Linear Contrast Adjustment"), N_("Advanced Image Control"),
+ N_("Use linear vs. fixed end point contrast adjustment"),
+ STP_PARAMETER_TYPE_BOOLEAN, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED3, 1, 1, -1, 1, 0
+ }, 0.0, 0.0, 0.0, CMASK_ALL, 0
+ },
+ {
+ {
+ "Gamma", N_("Composite Gamma"), N_("Gamma"),
+ N_("Adjust the gamma of the print. Larger values will "
+ "produce a generally brighter print, while smaller "
+ "values will produce a generally darker print. "),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED1, 0, 1, -1, 1, 0
+ }, 0.1, 4.0, 1.0, CMASK_EVERY, 0
+ },
+ {
+ {
+ "AppGamma", N_("AppGamma"), N_("Gamma"),
+ N_("Gamma value assumed by application"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_INTERNAL, 0, 1, -1, 1, 0
+ }, 0.1, 4.0, 1.0, CMASK_EVERY, 0
+ },
+ {
+ {
+ "CyanGamma", N_("Cyan"), N_("Gamma"),
+ N_("Adjust the cyan gamma"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED1, 0, 1, 1, 1, 0
+ }, 0.0, 4.0, 1.0, CMASK_C, 1
+ },
+ {
+ {
+ "MagentaGamma", N_("Magenta"), N_("Gamma"),
+ N_("Adjust the magenta gamma"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED1, 0, 1, 2, 1, 0
+ }, 0.0, 4.0, 1.0, CMASK_M, 1
+ },
+ {
+ {
+ "YellowGamma", N_("Yellow"), N_("Gamma"),
+ N_("Adjust the yellow gamma"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED1, 0, 1, 3, 1, 0
+ }, 0.0, 4.0, 1.0, CMASK_Y, 1
+ },
+ {
+ {
+ "RedGamma", N_("Red"), N_("Gamma"),
+ N_("Adjust the red gamma"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED1, 0, 1, 1, 1, 0
+ }, 0.0, 4.0, 1.0, CMASK_R, 1
+ },
+ {
+ {
+ "GreenGamma", N_("Green"), N_("Gamma"),
+ N_("Adjust the green gamma"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED1, 0, 1, 2, 1, 0
+ }, 0.0, 4.0, 1.0, CMASK_G, 1
+ },
+ {
+ {
+ "BlueGamma", N_("Blue"), N_("Gamma"),
+ N_("Adjust the blue gamma"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED1, 0, 1, 3, 1, 0
+ }, 0.0, 4.0, 1.0, CMASK_B, 1
+ },
+ {
+ {
+ "BlackGamma", N_("Black"), N_("Gamma"),
+ N_("Adjust the black gamma"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED1, 0, 1, 3, 1, 0
+ }, 0.0, 4.0, 1.0, CMASK_K, 1
+ },
+ {
+ {
+ "Saturation", N_("Saturation"), N_("Basic Image Adjustment"),
+ N_("Adjust the saturation (color balance) of the print\n"
+ "Use zero saturation to produce grayscale output "
+ "using color and black inks"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ }, 0.0, 9.0, 1.0, CMASK_CMY | CMASK_RGB, 1
+ },
+ /* Need to think this through a bit more -- rlk 20030712 */
+ {
+ {
+ "InkLimit", N_("Ink Limit"), N_("Advanced Output Control"),
+ N_("Limit the total ink printed to the page"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, -1, 0, 0
+ }, 0.0, STP_CHANNEL_LIMIT, STP_CHANNEL_LIMIT, CMASK_CMY, 0
+ },
+ {
+ {
+ "BlackTrans", N_("GCR Transition"), N_("Advanced Output Control"),
+ N_("Adjust the gray component transition rate"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, 0, 1, 0
+ }, 0.0, 1.0, 1.0, CMASK_K, 1
+ },
+ {
+ {
+ "GCRLower", N_("GCR Lower Bound"), N_("Advanced Output Control"),
+ N_("Lower bound of gray component reduction"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, 0, 1, 0
+ }, 0.0, 1.0, 0.2, CMASK_K, 1
+ },
+ {
+ {
+ "GCRUpper", N_("GCR Upper Bound"), N_("Advanced Output Control"),
+ N_("Upper bound of gray component reduction"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, 0, 1, 0
+ }, 0.0, 5.0, 0.5, CMASK_K, 1
+ },
+ RAW_GAMMA_CHANNEL(0),
+ RAW_GAMMA_CHANNEL(1),
+ RAW_GAMMA_CHANNEL(2),
+ RAW_GAMMA_CHANNEL(3),
+ RAW_GAMMA_CHANNEL(4),
+ RAW_GAMMA_CHANNEL(5),
+ RAW_GAMMA_CHANNEL(6),
+ RAW_GAMMA_CHANNEL(7),
+ RAW_GAMMA_CHANNEL(8),
+ RAW_GAMMA_CHANNEL(9),
+ RAW_GAMMA_CHANNEL(10),
+ RAW_GAMMA_CHANNEL(11),
+ RAW_GAMMA_CHANNEL(12),
+ RAW_GAMMA_CHANNEL(13),
+ RAW_GAMMA_CHANNEL(14),
+ RAW_GAMMA_CHANNEL(15),
+ RAW_GAMMA_CHANNEL(16),
+ RAW_GAMMA_CHANNEL(17),
+ RAW_GAMMA_CHANNEL(18),
+ RAW_GAMMA_CHANNEL(19),
+ RAW_GAMMA_CHANNEL(20),
+ RAW_GAMMA_CHANNEL(21),
+ RAW_GAMMA_CHANNEL(22),
+ RAW_GAMMA_CHANNEL(23),
+ RAW_GAMMA_CHANNEL(24),
+ RAW_GAMMA_CHANNEL(25),
+ RAW_GAMMA_CHANNEL(26),
+ RAW_GAMMA_CHANNEL(27),
+ RAW_GAMMA_CHANNEL(28),
+ RAW_GAMMA_CHANNEL(29),
+ RAW_GAMMA_CHANNEL(30),
+ RAW_GAMMA_CHANNEL(31),
+};
+
+static const int float_parameter_count =
+sizeof(float_parameters) / sizeof(float_param_t);
-static inline double
-hsl_value(double n1, double n2, double hue)
+typedef struct
{
- 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);
-}
+ stp_parameter_t param;
+ stp_curve_t **defval;
+ unsigned channel_mask;
+ int hsl_only;
+ int color_only;
+} curve_param_t;
+
+static int standard_curves_initialized = 0;
+
+static stp_curve_t *hue_map_bounds = NULL;
+static stp_curve_t *lum_map_bounds = NULL;
+static stp_curve_t *sat_map_bounds = NULL;
+static stp_curve_t *color_curve_bounds = NULL;
+static stp_curve_t *gcr_curve_bounds = NULL;
+
+
+#define RAW_CURVE_CHANNEL(channel) \
+ { \
+ { \
+ "CurveCh" #channel, N_("Channel " #channel " Curve"), \
+ N_("Output Curves"), N_("Curve for raw channel " #channel), \
+ STP_PARAMETER_TYPE_CURVE, STP_PARAMETER_CLASS_OUTPUT, \
+ STP_PARAMETER_LEVEL_INTERNAL, 0, 1, channel, 1, 0 \
+ }, &color_curve_bounds, CMASK_RAW, 0, 0 \
+ }
-static inline void
-calc_hsl_to_rgb(unsigned short *rgb, double h, double s, double l)
+static curve_param_t curve_parameters[] =
{
- 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
+ "CyanCurve", N_("Cyan Curve"), N_("Output Curves"),
+ N_("Cyan curve"),
+ STP_PARAMETER_TYPE_CURVE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED2, 0, 1, 1, 1, 0
+ }, &color_curve_bounds, CMASK_C, 0, 1
+ },
+ {
{
- 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);
- }
+ "MagentaCurve", N_("Magenta Curve"), N_("Output Curves"),
+ N_("Magenta curve"),
+ STP_PARAMETER_TYPE_CURVE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED2, 0, 1, 2, 1, 0
+ }, &color_curve_bounds, CMASK_M, 0, 1
+ },
+ {
+ {
+ "YellowCurve", N_("Yellow Curve"), N_("Output Curves"),
+ N_("Yellow curve"),
+ STP_PARAMETER_TYPE_CURVE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED2, 0, 1, 3, 1, 0
+ }, &color_curve_bounds, CMASK_Y, 0, 1
+ },
+ {
+ {
+ "BlackCurve", N_("Black Curve"), N_("Output Curves"),
+ N_("Black curve"),
+ STP_PARAMETER_TYPE_CURVE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED2, 0, 1, 0, 1, 0
+ }, &color_curve_bounds, CMASK_K, 0, 0
+ },
+ {
+ {
+ "RedCurve", N_("Red Curve"), N_("Output Curves"),
+ N_("Red curve"),
+ STP_PARAMETER_TYPE_CURVE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED2, 0, 1, 1, 1, 0
+ }, &color_curve_bounds, CMASK_R, 0, 1
+ },
+ {
+ {
+ "GreenCurve", N_("Green Curve"), N_("Output Curves"),
+ N_("Green curve"),
+ STP_PARAMETER_TYPE_CURVE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED2, 0, 1, 1, 1, 0
+ }, &color_curve_bounds, CMASK_G, 0, 1
+ },
+ {
+ {
+ "BlueCurve", N_("Blue Curve"), N_("Output Curves"),
+ N_("Blue curve"),
+ STP_PARAMETER_TYPE_CURVE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED2, 0, 1, 1, 1, 0
+ }, &color_curve_bounds, CMASK_B, 0, 1
+ },
+ {
+ {
+ "WhiteCurve", N_("White Curve"), N_("Output Curves"),
+ N_("White curve"),
+ STP_PARAMETER_TYPE_CURVE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED2, 0, 1, 1, 1, 0
+ }, &color_curve_bounds, CMASK_W, 0, 0
+ },
+ {
+ {
+ "HueMap", N_("Hue Map"), N_("Advanced HSL Curves"),
+ N_("Hue adjustment curve"),
+ STP_PARAMETER_TYPE_CURVE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED3, 0, 1, -1, 1, 0
+ }, &hue_map_bounds, CMASK_CMY | CMASK_RGB, 1, 1
+ },
+ {
+ {
+ "SatMap", N_("Saturation Map"), N_("Advanced HSL Curves"),
+ N_("Saturation adjustment curve"),
+ STP_PARAMETER_TYPE_CURVE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED3, 0, 1, -1, 1, 0
+ }, &sat_map_bounds, CMASK_CMY | CMASK_RGB, 1, 1
+ },
+ {
+ {
+ "LumMap", N_("Luminosity Map"), N_("Advanced HSL Curves"),
+ N_("Luminosity adjustment curve"),
+ STP_PARAMETER_TYPE_CURVE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED3, 0, 1, -1, 1, 0
+ }, &lum_map_bounds, CMASK_CMY | CMASK_RGB, 1, 1
+ },
+ {
+ {
+ "GCRCurve", N_("Gray Component Reduction"), N_("Advanced Output Control"),
+ N_("Gray component reduction curve"),
+ STP_PARAMETER_TYPE_CURVE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED3, 0, 1, 0, 1, 0
+ }, &gcr_curve_bounds, CMASK_K, 0, 1
+ },
+ RAW_CURVE_CHANNEL(0),
+ RAW_CURVE_CHANNEL(1),
+ RAW_CURVE_CHANNEL(2),
+ RAW_CURVE_CHANNEL(3),
+ RAW_CURVE_CHANNEL(4),
+ RAW_CURVE_CHANNEL(5),
+ RAW_CURVE_CHANNEL(6),
+ RAW_CURVE_CHANNEL(7),
+ RAW_CURVE_CHANNEL(8),
+ RAW_CURVE_CHANNEL(9),
+ RAW_CURVE_CHANNEL(10),
+ RAW_CURVE_CHANNEL(11),
+ RAW_CURVE_CHANNEL(12),
+ RAW_CURVE_CHANNEL(13),
+ RAW_CURVE_CHANNEL(14),
+ RAW_CURVE_CHANNEL(15),
+ RAW_CURVE_CHANNEL(16),
+ RAW_CURVE_CHANNEL(17),
+ RAW_CURVE_CHANNEL(18),
+ RAW_CURVE_CHANNEL(19),
+ RAW_CURVE_CHANNEL(20),
+ RAW_CURVE_CHANNEL(21),
+ RAW_CURVE_CHANNEL(22),
+ RAW_CURVE_CHANNEL(23),
+ RAW_CURVE_CHANNEL(24),
+ RAW_CURVE_CHANNEL(25),
+ RAW_CURVE_CHANNEL(26),
+ RAW_CURVE_CHANNEL(27),
+ RAW_CURVE_CHANNEL(28),
+ RAW_CURVE_CHANNEL(29),
+ RAW_CURVE_CHANNEL(30),
+ RAW_CURVE_CHANNEL(31),
+};
+
+static const int curve_parameter_count =
+sizeof(curve_parameters) / sizeof(curve_param_t);
+
+
+static const color_description_t *
+get_color_description(const char *name)
+{
+ int i;
+ if (name)
+ for (i = 0; i < color_description_count; i++)
+ {
+ if (strcmp(name, color_descriptions[i].name) == 0)
+ return &(color_descriptions[i]);
+ }
+ return NULL;
}
-static inline void
-update_cmyk(unsigned short *rgb)
+static const channel_depth_t *
+get_channel_depth(const char *name)
{
- 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;
+ int i;
+ if (name)
+ for (i = 0; i < channel_depth_count; i++)
+ {
+ if (strcmp(name, channel_depths[i].name) == 0)
+ return &(channel_depths[i]);
+ }
+ return NULL;
}
-/*
- * 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)
+static const color_correction_t *
+get_color_correction(const char *name)
{
- 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);
+ int i;
+ if (name)
+ for (i = 0; i < color_correction_count; i++)
+ {
+ if (strcmp(name, color_corrections[i].name) == 0)
+ return &(color_corrections[i]);
+ }
+ return NULL;
}
-/*
- * '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)
+static const color_correction_t *
+get_color_correction_by_tag(color_correction_enum_t correction)
{
- 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)
+ int i;
+ for (i = 0; i < color_correction_count; i++)
{
- 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 (correction == color_corrections[i].correction)
+ return &(color_corrections[i]);
}
- if (zero_mask)
- *zero_mask = nz ? 0 : 1;
+ return NULL;
}
+
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)
+initialize_channels(stp_vars_t *v, stp_image_t *image)
{
- 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;
+ lut_t *lut = (lut_t *)(stp_get_component_data(v, "Color"));
+ if (stp_check_float_parameter(v, "InkLimit", STP_PARAMETER_ACTIVE))
+ stp_channel_set_ink_limit(v, stp_get_float_parameter(v, "InkLimit"));
+ stp_channel_initialize(v, image, lut->out_channels);
+ lut->channels_are_initialized = 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)
+static int
+stpi_color_traditional_get_row(stp_vars_t *v,
+ stp_image_t *image,
+ int row,
+ unsigned *zero_mask)
{
- 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 --;
- }
+ const lut_t *lut = (const lut_t *)(stp_get_component_data(v, "Color"));
+ unsigned zero;
+ if (stp_image_get_row(image, lut->in_data,
+ lut->image_width * lut->in_channels, row)
+ != STP_IMAGE_STATUS_OK)
+ return 2;
+ if (!lut->channels_are_initialized)
+ initialize_channels(v, image);
+ zero = (lut->output_color_description->conversion_function)
+ (v, lut->in_data, stp_channel_get_input(v));
if (zero_mask)
- *zero_mask = nz ? 0 : 1;
+ *zero_mask = zero;
+ stp_channel_convert(v, zero_mask);
+ return 0;
}
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)
+free_channels(lut_t *lut)
{
- 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;
+ int i;
+ for (i = 0; i < STP_CHANNEL_LIMIT; i++)
+ stp_curve_free_curve_cache(&(lut->channel_curves[i]));
}
-/*
- * '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)
+static lut_t *
+allocate_lut(void)
{
- 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)
+ lut_t *ret = stp_zalloc(sizeof(lut_t));
+ for (i = 0; i < STP_CHANNEL_LIMIT; i++)
{
- 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 --;
+ ret->gamma_values[i] = 1.0;
}
- if (zero_mask)
- *zero_mask = nz ? 0 : 1;
+ ret->print_gamma = 1.0;
+ ret->app_gamma = 1.0;
+ ret->contrast = 1.0;
+ ret->brightness = 1.0;
+ return ret;
}
-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)
+static void *
+copy_lut(void *vlut)
{
- int i0 = -1;
- int i1 = -1;
- int o0 = 0;
- int nz = 0;
+ const lut_t *src = (const lut_t *)vlut;
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)
+ lut_t *dest;
+ if (!src)
+ return NULL;
+ dest = allocate_lut();
+ free_channels(dest);
+
+ dest->steps = src->steps;
+ dest->channel_depth = src->channel_depth;
+ dest->image_width = src->image_width;
+ dest->in_channels = src->in_channels;
+ dest->out_channels = src->out_channels;
+ /* Don't copy channels_are_initialized */
+ dest->invert_output = src->invert_output;
+ dest->input_color_description = src->input_color_description;
+ dest->output_color_description = src->output_color_description;
+ dest->color_correction = src->color_correction;
+ for (i = 0; i < STP_CHANNEL_LIMIT; i++)
{
- 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 --;
+ stp_curve_cache_copy(&(dest->channel_curves[i]), &(src->channel_curves[i]));
+ dest->gamma_values[i] = src->gamma_values[i];
}
- if (zero_mask)
- *zero_mask = nz ? 0 : 1;
+ stp_curve_cache_copy(&(dest->brightness_correction),
+ &(src->brightness_correction));
+ stp_curve_cache_copy(&(dest->contrast_correction),
+ &(src->contrast_correction));
+ stp_curve_cache_copy(&(dest->user_color_correction),
+ &(src->user_color_correction));
+ dest->print_gamma = src->print_gamma;
+ dest->app_gamma = src->app_gamma;
+ dest->screen_gamma = src->screen_gamma;
+ dest->contrast = src->contrast;
+ dest->brightness = src->brightness;
+ dest->linear_contrast_adjustment = src->linear_contrast_adjustment;
+ stp_curve_cache_copy(&(dest->hue_map), &(src->hue_map));
+ stp_curve_cache_copy(&(dest->lum_map), &(src->lum_map));
+ stp_curve_cache_copy(&(dest->sat_map), &(src->sat_map));
+ stp_curve_cache_copy(&(dest->gcr_curve), &(src->gcr_curve));
+ /* Don't copy gray_tmp */
+ /* Don't copy cmy_tmp */
+ if (src->in_data)
+ {
+ dest->in_data = stp_malloc(src->image_width * src->in_channels);
+ memset(dest->in_data, 0, src->image_width * src->in_channels);
+ }
+ return dest;
}
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)
+free_lut(void *vlut)
{
- 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;
+ lut_t *lut = (lut_t *)vlut;
+ free_channels(lut);
+ stp_curve_free_curve_cache(&(lut->brightness_correction));
+ stp_curve_free_curve_cache(&(lut->contrast_correction));
+ stp_curve_free_curve_cache(&(lut->user_color_correction));
+ stp_curve_free_curve_cache(&(lut->hue_map));
+ stp_curve_free_curve_cache(&(lut->lum_map));
+ stp_curve_free_curve_cache(&(lut->sat_map));
+ stp_curve_free_curve_cache(&(lut->gcr_curve));
+ STP_SAFE_FREE(lut->gray_tmp);
+ STP_SAFE_FREE(lut->cmy_tmp);
+ STP_SAFE_FREE(lut->in_data);
+ memset(lut, 0, sizeof(lut_t));
+ stp_free(lut);
+}
- /* 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;
+static stp_curve_t *
+compute_gcr_curve(const stp_vars_t *vars)
+{
+ stp_curve_t *curve;
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color"));
+ double k_lower = 0.0;
+ double k_upper = 1.0;
+ double k_trans = 1.0;
+ double i_k_trans = 1.0;
+ double *tmp_data = stp_malloc(sizeof(double) * lut->steps);
+ int i;
- while (width)
+ if (stp_check_float_parameter(vars, "GCRUpper", STP_PARAMETER_DEFAULTED))
+ k_upper = stp_get_float_parameter(vars, "GCRUpper");
+ if (stp_check_float_parameter(vars, "GCRLower", STP_PARAMETER_DEFAULTED))
+ k_lower = stp_get_float_parameter(vars, "GCRLower");
+ if (stp_check_float_parameter(vars, "BlackTrans", STP_PARAMETER_DEFAULTED))
+ k_trans = stp_get_float_parameter(vars, "BlackTrans");
+ k_upper *= lut->steps;
+ k_lower *= lut->steps;
+
+ if (k_lower > lut->steps)
+ k_lower = lut->steps;
+ if (k_upper < k_lower)
+ k_upper = k_lower + 1;
+ i_k_trans = 1.0 / k_trans;
+
+ for (i = 0; i < k_lower; i ++)
+ tmp_data[i] = 0;
+ if (k_upper < lut->steps)
{
- if (i0 != indexed[0])
+ for (i = ceil(k_lower); i < k_upper; i ++)
{
- i0 = indexed[0];
- o0 = lut->composite[gray_cmap[i0]];
- if (o0 < 32768)
- o0 = 0;
- else
- o0 = 65535;
- nz |= o0;
+ double where = (i - k_lower) / (k_upper - k_lower);
+ double g1 = pow(where, i_k_trans);
+ double g2 = 1.0 - pow(1.0 - where, k_trans);
+ double value = (i_k_trans <= 1.0 ? g1 : g2);
+ tmp_data[i] = 65535.0 * k_upper * value / (double) (lut->steps - 1);
+ tmp_data[i] = floor(tmp_data[i] + .5);
}
- gray[0] = o0;
- indexed ++;
- gray ++;
- width --;
+ for (i = ceil(k_upper); i < lut->steps; i ++)
+ tmp_data[i] = 65535.0 * i / (double) (lut->steps - 1);
}
- if (zero_mask)
- *zero_mask = nz ? 0 : 1;
+ else if (k_lower < lut->steps)
+ for (i = ceil(k_lower); i < lut->steps; i ++)
+ {
+ double where = (i - k_lower) / (k_upper - k_lower);
+ double g1 = pow(where, i_k_trans);
+ double g2 = 1.0 - pow(1.0 - where, k_trans);
+ double value = (i_k_trans <= 1.0 ? g1 : g2);
+ tmp_data[i] = 65535.0 * lut->steps * value / (double) (lut->steps - 1);
+ tmp_data[i] = floor(tmp_data[i] + .5);
+ }
+ curve = stp_curve_create(STP_CURVE_WRAP_NONE);
+ stp_curve_set_bounds(curve, 0, 65535);
+ if (! stp_curve_set_data(curve, lut->steps, tmp_data))
+ {
+ stp_eprintf(vars, "set curve data failed!\n");
+ stp_abort();
+ }
+ stp_free(tmp_data);
+ return curve;
}
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)
+initialize_gcr_curve(const stp_vars_t *vars)
{
- 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)
+ lut_t *lut = (lut_t *)(stp_get_component_data(vars, "Color"));
+ if (!stp_curve_cache_get_curve(&(lut->gcr_curve)))
{
- if (i0 != indexed[0] || i1 != indexed[1])
+ if (stp_check_curve_parameter(vars, "GCRCurve", STP_PARAMETER_DEFAULTED))
{
- 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;
+ double data;
+ size_t count;
+ int i;
+ stp_curve_t *curve =
+ stp_curve_create_copy(stp_get_curve_parameter(vars, "GCRCurve"));
+ stp_curve_resample(curve, lut->steps);
+ count = stp_curve_count_points(curve);
+ stp_curve_set_bounds(curve, 0.0, 65535.0);
+ for (i = 0; i < count; i++)
+ {
+ stp_curve_get_point(curve, i, &data);
+ data = 65535.0 * data * (double) i / (count - 1);
+ stp_curve_set_point(curve, i, data);
+ }
+ stp_curve_cache_set_curve(&(lut->gcr_curve), curve);
}
- gray[0] = o0;
- indexed += 2;
- gray ++;
- width --;
+ else
+ stp_curve_cache_set_curve(&(lut->gcr_curve), compute_gcr_curve(vars));
}
- if (zero_mask)
- *zero_mask = nz ? 0 : 1;
}
/*
- * 'rgb_to_gray()' - Convert RGB image data to grayscale.
+ * Channels that are synthesized (e. g. the black channel in CMY -> CMYK
+ * conversion) need to be computed differently from channels that are
+ * mapped 1-1 from input to output. Channels that are simply mapped need
+ * to be inverted if necessary, and in addition the contrast, brightness,
+ * and other gamma factors are factored in. Channels that are synthesized
+ * are never inverted, since they're computed from the output of other
+ * channels that have already been inverted.
+ *
+ * This isn't simply a matter of comparing the input channels to the output
+ * channels, since some of the conversions (K -> CMYK) work by means
+ * of a chain of conversions (K->CMY->CMYK). In this case, we need to
+ * fully compute the CMY channels, but the K channel in the output is
+ * not inverted.
+ *
+ * The rules that are implemented by the logic below are:
+ *
+ * 1) If the input is raw, we always perform the normal computation (without
+ * synthesizing channels).
+ *
+ * 2) If the output is CMY or K only, we never synthesize channels. We've
+ * now covered raw, black, and CMY/RGB outputs, leaving CMYK and MULTI.
+ *
+ * 3) Output channels above CMYK are synthesized.
+ *
+ * 4) If the input is CMYK, we do not synthesize channels.
+ *
+ * 5) The black channel (in CMYK) is synthesized.
+ *
+ * 6) All other channels (CMY/RGB) are not synthesized.
*/
-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)
+static int
+channel_is_synthesized(lut_t *lut, int channel)
{
- 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;
+ if (lut->output_color_description->color_id == COLOR_ID_RAW)
+ return 1; /* Case 1 */
+ else if (lut->output_color_description->channels == CMASK_CMY ||
+ lut->output_color_description->channels == CMASK_K)
+ return 0; /* Case 2 */
+ else if (channel >= CHANNEL_W)
+ return 1; /* Case 3 */
+ else if (lut->input_color_description->channels == CMASK_CMYK)
+ return 0; /* Case 4 */
+ else if (channel == CHANNEL_K)
+ return 1; /* Case 5 */
+ else
+ return 0; /* Case 6 */
}
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)
+compute_user_correction(lut_t *lut)
{
- 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)
+ double *tmp;
+ double *tmp_brightness;
+ double *tmp_contrast;
+ double xcontrast = lut->contrast;
+ stp_curve_t *curve =
+ stp_curve_cache_get_curve(&(lut->user_color_correction));
+ stp_curve_t *brightness_curve =
+ stp_curve_cache_get_curve(&(lut->brightness_correction));
+ stp_curve_t *contrast_curve =
+ stp_curve_cache_get_curve(&(lut->contrast_correction));
+ double brightness = lut->brightness;
+ int i;
+ int isteps = lut->steps;
+ if (isteps > 256)
+ isteps = 256;
+ tmp = stp_malloc(sizeof(double) * lut->steps);
+ tmp_brightness = stp_malloc(sizeof(double) * lut->steps);
+ tmp_contrast = stp_malloc(sizeof(double) * lut->steps);
+ if (brightness < .001)
+ brightness = 1000;
+ else if (brightness > 1.999)
+ brightness = .001;
+ else if (brightness > 1)
+ brightness = 2.0 - brightness;
+ else
+ brightness = 1.0 / brightness;
+ for (i = 0; i < isteps; i ++)
{
- if (i0 != rgb[0] || i1 != rgb[1] || i2 != rgb[2] || i3 != rgb[3])
+ double temp_pixel, pixel;
+ pixel = (double) i / (double) (isteps - 1);
+ /*
+ * First, correct contrast
+ */
+ if (pixel >= .5)
+ temp_pixel = 1.0 - pixel;
+ else
+ temp_pixel = pixel;
+ if (lut->contrast > 3.99999)
{
- 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;
+ if (temp_pixel < .5)
+ temp_pixel = 0;
+ else
+ temp_pixel = 1;
}
- gray[0] = o0;
- rgb += 4;
- gray ++;
- width --;
- }
- if (zero_mask)
- *zero_mask = nz ? 0 : 1;
+ if (temp_pixel <= .000001 && lut->contrast <= .0001)
+ temp_pixel = .5;
+ else if (temp_pixel > 1)
+ temp_pixel = .5 * pow(2 * temp_pixel, xcontrast);
+ else if (temp_pixel < 1)
+ {
+ if (lut->linear_contrast_adjustment)
+ temp_pixel = 0.5 -
+ ((0.5 - .5 * pow(2 * temp_pixel, lut->contrast)) *
+ lut->contrast);
+ else
+ temp_pixel = 0.5 -
+ ((0.5 - .5 * pow(2 * temp_pixel, lut->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;
+ tmp_contrast[i] = floor((pixel * 65535) + .5);
+
+ /*
+ * Second, do brightness
+ */
+ if (brightness < 1)
+ pixel = pow(pixel, brightness);
+ else
+ pixel = 1.0 - pow(1.0 - pixel, 1.0 / brightness);
+ tmp[i] = floor((pixel * 65535) + .5);
+
+ pixel = (double) i / (double) (isteps - 1);
+ if (brightness < 1)
+ pixel = pow(pixel, brightness);
+ else
+ pixel = 1.0 - pow(1.0 - pixel, 1.0 / brightness);
+ tmp_brightness[i] = floor((pixel * 65535) + .5);
+ }
+ stp_curve_set_data(curve, isteps, tmp);
+ if (isteps != lut->steps)
+ stp_curve_resample(curve, lut->steps);
+ stp_curve_set_data(brightness_curve, isteps, tmp_brightness);
+ if (isteps != lut->steps)
+ stp_curve_resample(brightness_curve, lut->steps);
+ stp_curve_set_data(contrast_curve, isteps, tmp_contrast);
+ if (isteps != lut->steps)
+ stp_curve_resample(contrast_curve, lut->steps);
+ stp_free(tmp);
+ stp_free(tmp_brightness);
+ stp_free(tmp_contrast);
}
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)
+compute_a_curve_full(lut_t *lut, int channel)
{
- 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)
+ double *tmp;
+ double pivot = .25;
+ double ipivot = 1.0 - pivot;
+ double xgamma = pow(pivot, lut->screen_gamma);
+ double print_gamma=1.0+9.0*(lut->print_gamma-1.0);
+ double pivot2 = .75;
+ double ipivot2 = 1.0 - pivot2;
+ double xgamma2 = pow(pivot2, print_gamma);
+ stp_curve_t *curve = stp_curve_cache_get_curve(&(lut->channel_curves[channel]));
+ int i;
+ int isteps = lut->steps;
+ if (isteps > 256)
+ isteps = 256;
+ tmp = stp_malloc(sizeof(double) * lut->steps);
+ for (i = 0; i < isteps; i ++)
{
- 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 --;
+ double pixel = (double) i / (double) (isteps - 1);
+
+ if (lut->input_color_description->color_model == COLOR_BLACK)
+ pixel = 1.0 - pixel;
+
+ pixel = 1.0 -
+ (1.0 / (1.0 - xgamma)) *
+ (pow(pivot + ipivot * pixel, lut->screen_gamma) - xgamma);
+
+ /*
+ * Fourth, fix up cyan, magenta, yellow values
+ */
+ if (pixel < 0.0)
+ pixel = 0.0;
+ else if (pixel > 1.0)
+ pixel = 1.0;
+
+ if (pixel > .9999 && lut->gamma_values[channel] < .00001)
+ pixel = 0;
+ else
+ pixel = 1 - pow(1 - pixel, lut->gamma_values[channel]);
+ /*
+ * Finally, fix up print gamma and scale
+ */
+
+ /*
+ * Change to this function suggested by Alastair Robinson
+ * blackfive@fakenhamweb.co.uk
+ */
+ pixel = 65535 * (1.0 / (1.0 - xgamma2)) *
+ (pow(pivot2 + ipivot2 * pixel, print_gamma) - xgamma2);
+ if (lut->output_color_description->color_model == COLOR_WHITE)
+ pixel = 65535 - pixel;
+
+ if (pixel <= 0.0)
+ tmp[i] = 0;
+ else if (pixel >= 65535.0)
+ tmp[i] = 65535;
+ else
+ tmp[i] = (pixel);
+ tmp[i] = floor(tmp[i] + 0.5); /* rounding is done here */
}
- if (zero_mask)
- *zero_mask = nz ? 0 : 1;
+ stp_curve_set_data(curve, isteps, tmp);
+ if (isteps != lut->steps)
+ stp_curve_resample(curve, lut->steps);
+ stp_free(tmp);
}
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)
+compute_a_curve_fast(lut_t *lut, int channel)
{
- 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)
+ double *tmp;
+ stp_curve_t *curve = stp_curve_cache_get_curve(&(lut->channel_curves[channel]));
+ int i;
+ int isteps = lut->steps;
+ if (isteps > 256)
+ isteps = 256;
+ tmp = stp_malloc(sizeof(double) * lut->steps);
+ for (i = 0; i < isteps; i++)
{
- 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 --;
+ double pixel = (double) i / (double) (isteps - 1);
+ pixel = 1 - pow(1 - pixel, lut->gamma_values[channel]);
+ tmp[i] = floor((65535.0 * pixel) + 0.5);
}
- if (zero_mask)
- *zero_mask = nz ? 0 : 1;
+ stp_curve_set_data(curve, isteps, tmp);
+ if (isteps != lut->steps)
+ stp_curve_resample(curve, lut->steps);
+ stp_free(tmp);
}
/*
- * 'rgb_to_rgb()' - Convert rgb image data to RGB.
+ * If the input and output color spaces both have a particular channel,
+ * we want to use the general algorithm. If not (i. e. we have to
+ * synthesize the channel), use a simple gamma curve.
*/
+static void
+compute_a_curve(lut_t *lut, int channel)
+{
+ if (channel_is_synthesized(lut, channel))
+ compute_a_curve_fast(lut, channel);
+ else
+ compute_a_curve_full(lut, channel);
+}
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)
+invert_curve(stp_curve_t *curve, int invert_output)
{
- 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 lo, hi;
+ int i;
+ size_t count;
+ const double *data = stp_curve_get_data(curve, &count);
+ double f_gamma = stp_curve_get_gamma(curve);
+ double *tmp_data;
+
+ stp_curve_get_bounds(curve, &lo, &hi);
+
+ if (f_gamma)
+ stp_curve_set_gamma(curve, -f_gamma);
+ else
{
- 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 --;
+ tmp_data = stp_malloc(sizeof(double) * count);
+ for (i = 0; i < count; i++)
+ tmp_data[i] = data[count - i - 1];
+ stp_curve_set_data(curve, count, tmp_data);
+ stp_free(tmp_data);
}
- if (zero_mask)
+ if (!invert_output)
{
- *zero_mask = nz0 ? 0 : 1;
- *zero_mask |= nz1 ? 0 : 2;
- *zero_mask |= nz2 ? 0 : 4;
+ stp_curve_rescale(curve, -1, STP_CURVE_COMPOSE_MULTIPLY,
+ STP_CURVE_BOUNDS_RESCALE);
+ stp_curve_rescale(curve, lo + hi, STP_CURVE_COMPOSE_ADD,
+ STP_CURVE_BOUNDS_RESCALE);
}
}
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)
+compute_one_lut(lut_t *lut, int i)
{
- 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)
+ stp_curve_t *curve =
+ stp_curve_cache_get_curve(&(lut->channel_curves[i]));
+ if (curve)
{
- 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 --;
+ int invert_output =
+ !channel_is_synthesized(lut, i) && lut->invert_output;
+ stp_curve_rescale(curve, 65535.0, STP_CURVE_COMPOSE_MULTIPLY,
+ STP_CURVE_BOUNDS_RESCALE);
+ if (stp_curve_is_piecewise(curve))
+ stp_curve_resample(curve, lut->steps);
+ invert_curve(curve, invert_output);
+ stp_curve_resample(curve, lut->steps);
}
- if (zero_mask)
+ else
{
- *zero_mask = nz0 ? 0 : 1;
- *zero_mask |= nz1 ? 0 : 2;
- *zero_mask |= nz2 ? 0 : 4;
+ curve = stp_curve_create_copy(color_curve_bounds);
+ stp_curve_rescale(curve, 65535.0, STP_CURVE_COMPOSE_MULTIPLY,
+ STP_CURVE_BOUNDS_RESCALE);
+ stp_curve_cache_set_curve(&(lut->channel_curves[i]), curve);
+ compute_a_curve(lut, i);
}
}
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)
+setup_channel(stp_vars_t *v, int i, const channel_param_t *p)
{
- solid_rgb_to_rgb(vars, indexed, rgb, zero_mask, width, bpp, cmap,
- hue_map, lum_map, sat_map);
+ lut_t *lut = (lut_t *)(stp_get_component_data(v, "Color"));
+ const char *gamma_name =
+ (lut->output_color_description->color_model == COLOR_BLACK ?
+ p->gamma_name : p->rgb_gamma_name);
+ const char *curve_name =
+ (lut->output_color_description->color_model == COLOR_BLACK ?
+ p->curve_name : p->rgb_curve_name);
+ if (stp_check_float_parameter(v, p->gamma_name, STP_PARAMETER_DEFAULTED))
+ lut->gamma_values[i] = stp_get_float_parameter(v, gamma_name);
+
+ if (stp_get_curve_parameter_active(v, curve_name) > 0 &&
+ stp_get_curve_parameter_active(v, curve_name) >=
+ stp_get_float_parameter_active(v, gamma_name))
+ stp_curve_cache_set_curve_copy
+ (&(lut->channel_curves[i]), stp_get_curve_parameter(v, curve_name));
+
+ stp_dprintf(STP_DBG_LUT, v, " %s %.3f\n", gamma_name, lut->gamma_values[i]);
+ compute_one_lut(lut, i);
}
-/*
- * '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)
+stpi_compute_lut(stp_vars_t *v)
{
- 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)
+ int i;
+ lut_t *lut = (lut_t *)(stp_get_component_data(v, "Color"));
+ stp_curve_t *curve;
+ stp_dprintf(STP_DBG_LUT, v, "stpi_compute_lut\n");
+
+ if (lut->input_color_description->color_model == COLOR_UNKNOWN ||
+ lut->output_color_description->color_model == COLOR_UNKNOWN ||
+ lut->input_color_description->color_model ==
+ lut->output_color_description->color_model)
+ lut->invert_output = 0;
+ else
+ lut->invert_output = 1;
+
+ lut->linear_contrast_adjustment = 0;
+ lut->print_gamma = 1.0;
+ lut->app_gamma = 1.0;
+ lut->contrast = 1.0;
+ lut->brightness = 1.0;
+
+ if (stp_check_boolean_parameter(v, "LinearContrast", STP_PARAMETER_DEFAULTED))
+ lut->linear_contrast_adjustment =
+ stp_get_boolean_parameter(v, "LinearContrast");
+ if (stp_check_float_parameter(v, "Gamma", STP_PARAMETER_DEFAULTED))
+ lut->print_gamma = stp_get_float_parameter(v, "Gamma");
+ if (stp_check_float_parameter(v, "Contrast", STP_PARAMETER_DEFAULTED))
+ lut->contrast = stp_get_float_parameter(v, "Contrast");
+ if (stp_check_float_parameter(v, "Brightness", STP_PARAMETER_DEFAULTED))
+ lut->brightness = stp_get_float_parameter(v, "Brightness");
+
+ if (stp_check_float_parameter(v, "AppGamma", STP_PARAMETER_ACTIVE))
+ lut->app_gamma = stp_get_float_parameter(v, "AppGamma");
+ lut->screen_gamma = lut->app_gamma / 4.0; /* "Empirical" */
+ curve = stp_curve_create_copy(color_curve_bounds);
+ stp_curve_rescale(curve, 65535.0, STP_CURVE_COMPOSE_MULTIPLY,
+ STP_CURVE_BOUNDS_RESCALE);
+ stp_curve_cache_set_curve(&(lut->user_color_correction), curve);
+ curve = stp_curve_create_copy(color_curve_bounds);
+ stp_curve_rescale(curve, 65535.0, STP_CURVE_COMPOSE_MULTIPLY,
+ STP_CURVE_BOUNDS_RESCALE);
+ stp_curve_cache_set_curve(&(lut->brightness_correction), curve);
+ curve = stp_curve_create_copy(color_curve_bounds);
+ stp_curve_rescale(curve, 65535.0, STP_CURVE_COMPOSE_MULTIPLY,
+ STP_CURVE_BOUNDS_RESCALE);
+ stp_curve_cache_set_curve(&(lut->contrast_correction), curve);
+ compute_user_correction(lut);
+
+ /*
+ * TODO check that these are wraparound curves and all that
+ */
+
+ if (lut->color_correction->correct_hsl)
{
- unsigned short trgb[3];
- if (bpp == 1)
+ if (stp_check_curve_parameter(v, "HueMap", STP_PARAMETER_DEFAULTED))
{
- /*
- * 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);
- }
+ lut->hue_map.curve =
+ stp_curve_create_copy(stp_get_curve_parameter(v, "HueMap"));
+ if (stp_curve_is_piecewise(lut->hue_map.curve))
+ stp_curve_resample(lut->hue_map.curve, 384);
}
- else
+ if (stp_check_curve_parameter(v, "LumMap", STP_PARAMETER_DEFAULTED))
{
- 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);
- }
+ lut->lum_map.curve =
+ stp_curve_create_copy(stp_get_curve_parameter(v, "LumMap"));
+ if (stp_curve_is_piecewise(lut->lum_map.curve))
+ stp_curve_resample(lut->lum_map.curve, 384);
}
- 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)
+ if (stp_check_curve_parameter(v, "SatMap", STP_PARAMETER_DEFAULTED))
{
- int i;
- for (i = 0; i < 3; i++)
- rgbout[i] = .5 + (rgbout[i] * density);
+ lut->sat_map.curve =
+ stp_curve_create_copy(stp_get_curve_parameter(v, "SatMap"));
+ if (stp_curve_is_piecewise(lut->sat_map.curve))
+ stp_curve_resample(lut->sat_map.curve, 384);
}
- o0 = rgbout[0];
- o1 = rgbout[1];
- o2 = rgbout[2];
- nz0 |= o0;
- nz1 |= o1;
- nz2 |= o2;
- out:
- grayin += bpp;
- rgbout += 3;
- width --;
}
- if (zero_mask)
+
+ stp_dprintf(STP_DBG_LUT, v, " print_gamma %.3f\n", lut->print_gamma);
+ stp_dprintf(STP_DBG_LUT, v, " contrast %.3f\n", lut->contrast);
+ stp_dprintf(STP_DBG_LUT, v, " brightness %.3f\n", lut->brightness);
+ stp_dprintf(STP_DBG_LUT, v, " screen_gamma %.3f\n", lut->screen_gamma);
+
+ for (i = 0; i < STP_CHANNEL_LIMIT; i++)
{
- *zero_mask = nz0 ? 0 : 1;
- *zero_mask |= nz1 ? 0 : 2;
- *zero_mask |= nz2 ? 0 : 4;
+ if (lut->output_color_description->channel_count < 1 &&
+ i < lut->out_channels)
+ setup_channel(v, i, &(raw_channel_params[i]));
+ else if (i < channel_param_count &&
+ lut->output_color_description->channels & (1 << i))
+ setup_channel(v, i, &(channel_params[i]));
}
+ if (((lut->output_color_description->channels & CMASK_CMYK) == CMASK_CMYK) &&
+ (lut->color_correction->correction == COLOR_CORRECTION_DESATURATED ||
+ lut->input_color_description->color_id == COLOR_ID_GRAY ||
+ lut->input_color_description->color_id == COLOR_ID_WHITE ||
+ lut->input_color_description->color_id == COLOR_ID_RGB ||
+ lut->input_color_description->color_id == COLOR_ID_CMY))
+ initialize_gcr_curve(v);
}
-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)
+static int
+stpi_color_traditional_init(stp_vars_t *v,
+ stp_image_t *image,
+ size_t steps)
{
- 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)
+ lut_t *lut;
+ const char *image_type = stp_get_string_parameter(v, "ImageType");
+ const char *color_correction = stp_get_string_parameter(v, "ColorCorrection");
+ const channel_depth_t *channel_depth =
+ get_channel_depth(stp_get_string_parameter(v, "ChannelBitDepth"));
+ size_t total_channel_bits;
+
+ if (steps != 256 && steps != 65536)
+ return -1;
+ if (!channel_depth)
+ return -1;
+
+ lut = allocate_lut();
+ lut->input_color_description =
+ get_color_description(stp_get_string_parameter(v, "InputImageType"));
+ lut->output_color_description =
+ get_color_description(stp_get_string_parameter(v, "STPIOutputType"));
+
+ if (!lut->input_color_description || !lut->output_color_description)
{
- 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)
+ free_lut(lut);
+ return -1;
+ }
+
+ if (lut->input_color_description->color_id == COLOR_ID_RAW)
+ {
+ if (stp_verify_parameter(v, "STPIRawChannels", 1) != PARAMETER_OK)
{
- int i;
- for (i = 0; i < 3; i++)
- rgb[i] = .5 + (rgb[i] * density);
+ free_lut(lut);
+ return -1;
}
- out:
- o0 = rgb[0];
- o1 = rgb[1];
- o2 = rgb[2];
- nz0 |= o0;
- nz1 |= o1;
- nz2 |= o2;
- indexed += bpp;
- rgb += 3;
- width --;
+ lut->out_channels = stp_get_int_parameter(v, "STPIRawChannels");
+ lut->in_channels = lut->out_channels;
}
- if (zero_mask)
+ else
{
- *zero_mask = nz0 ? 0 : 1;
- *zero_mask |= nz1 ? 0 : 2;
- *zero_mask |= nz2 ? 0 : 4;
+ lut->out_channels = lut->output_color_description->channel_count;
+ lut->in_channels = lut->input_color_description->channel_count;
}
-}
-/*
- * 'rgb_to_rgb()' - Convert rgb image data to RGB.
- */
+ stp_allocate_component_data(v, "Color", copy_lut, free_lut, lut);
+ lut->steps = steps;
+ lut->channel_depth = channel_depth->bits;
-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)
+ if (image_type && strcmp(image_type, "None") != 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]];
- }
- }
+ if (strcmp(image_type, "Text") == 0)
+ lut->color_correction = get_color_correction("Threshold");
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 --;
+ lut->color_correction = get_color_correction("None");
}
- if (zero_mask)
+ else if (color_correction)
+ lut->color_correction = get_color_correction(color_correction);
+ else
+ lut->color_correction = get_color_correction("None");
+ if (lut->color_correction->correction == COLOR_CORRECTION_DEFAULT)
+ lut->color_correction =
+ (get_color_correction_by_tag
+ (lut->output_color_description->default_correction));
+
+ stpi_compute_lut(v);
+
+ lut->image_width = stp_image_width(image);
+ total_channel_bits = lut->in_channels * lut->channel_depth;
+ lut->in_data = stp_malloc(((lut->image_width * total_channel_bits) + 7)/8);
+ memset(lut->in_data, 0, ((lut->image_width * total_channel_bits) + 7) / 8);
+ return lut->out_channels;
+}
+
+static void
+initialize_standard_curves(void)
+{
+ if (!standard_curves_initialized)
{
- *zero_mask = nz0 ? 0 : 1;
- *zero_mask |= nz1 ? 0 : 2;
- *zero_mask |= nz2 ? 0 : 4;
+ int i;
+ hue_map_bounds = stp_curve_create_from_string
+ ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+ "<sequence count=\"2\" lower-bound=\"-6\" upper-bound=\"6\">\n"
+ "0 0\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>");
+ lum_map_bounds = stp_curve_create_from_string
+ ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+ "<sequence count=\"2\" lower-bound=\"0\" upper-bound=\"4\">\n"
+ "1 1\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>");
+ sat_map_bounds = stp_curve_create_from_string
+ ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+ "<sequence count=\"2\" lower-bound=\"0\" upper-bound=\"4\">\n"
+ "1 1\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>");
+ color_curve_bounds = stp_curve_create_from_string
+ ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"nowrap\" type=\"linear\" gamma=\"1.0\">\n"
+ "<sequence count=\"0\" lower-bound=\"0\" upper-bound=\"1\">\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>");
+ gcr_curve_bounds = stp_curve_create_from_string
+ ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"nowrap\" type=\"linear\" gamma=\"0.0\">\n"
+ "<sequence count=\"2\" lower-bound=\"0\" upper-bound=\"1\">\n"
+ "1 1\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>");
+ for (i = 0; i < curve_parameter_count; i++)
+ curve_parameters[i].param.deflt.curve =
+ *(curve_parameters[i].defval);
+ standard_curves_initialized = 1;
}
}
-/*
- * 'gray_to_rgb()' - Convert gray image data to RGB.
- */
+static stp_parameter_list_t
+stpi_color_traditional_list_parameters(const stp_vars_t *v)
+{
+ stp_list_t *ret = stp_parameter_list_create();
+ int i;
+ initialize_standard_curves();
+ for (i = 0; i < float_parameter_count; i++)
+ stp_parameter_list_add_param(ret, &(float_parameters[i].param));
+ for (i = 0; i < curve_parameter_count; i++)
+ stp_parameter_list_add_param(ret, &(curve_parameters[i].param));
+ return ret;
+}
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)
+stpi_color_traditional_describe_parameter(const stp_vars_t *v,
+ const char *name,
+ stp_parameter_t *description)
{
- 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)
+ int i, j;
+ description->p_type = STP_PARAMETER_TYPE_INVALID;
+ initialize_standard_curves();
+ if (name == NULL)
+ return;
+
+ for (i = 0; i < float_parameter_count; i++)
{
- if (bpp == 1)
+ const float_param_t *param = &(float_parameters[i]);
+ if (strcmp(name, param->param.name) == 0)
{
- /*
- * No alpha in image...
- */
- if (i0 == grayin[0])
+ stp_fill_parameter_settings(description, &(param->param));
+ if (param->channel_mask != CMASK_EVERY)
{
- rgbout[0] = o0;
- rgbout[1] = o1;
- rgbout[2] = o2;
- goto out;
+ const color_description_t *color_description =
+ get_color_description(stp_describe_output(v));
+ if (color_description &&
+ (param->channel_mask & color_description->channels) &&
+ param->channel_mask != CMASK_RAW)
+ description->is_active = 1;
+ else
+ description->is_active = 0;
+ if (param->color_only &&
+ !(color_description->channels & ~CMASK_K))
+ description->is_active = 0;
}
- else
+ if (stp_check_string_parameter(v, "ImageType", STP_PARAMETER_ACTIVE) &&
+ strcmp(stp_get_string_parameter(v, "ImageType"), "None") != 0 &&
+ description->p_level > STP_PARAMETER_LEVEL_BASIC)
+ description->is_active = 0;
+ switch (param->param.p_type)
{
- i0 = grayin[0];
- rgbout[0] = lut->red[grayin[0]];
- rgbout[1] = lut->green[grayin[0]];
- rgbout[2] = lut->blue[grayin[0]];
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ description->deflt.boolean = (int) param->defval;
+ break;
+ case STP_PARAMETER_TYPE_INT:
+ description->bounds.integer.upper = (int) param->max;
+ description->bounds.integer.lower = (int) param->min;
+ description->deflt.integer = (int) param->defval;
+ break;
+ case STP_PARAMETER_TYPE_DOUBLE:
+ description->bounds.dbl.upper = param->max;
+ description->bounds.dbl.lower = param->min;
+ description->deflt.dbl = param->defval;
+ if (strcmp(name, "InkLimit") == 0)
+ {
+ stp_parameter_t ink_limit_desc;
+ stp_describe_parameter(v, "InkChannels", &ink_limit_desc);
+ if (ink_limit_desc.p_type == STP_PARAMETER_TYPE_INT)
+ {
+ if (ink_limit_desc.deflt.integer > 1)
+ {
+ description->bounds.dbl.upper =
+ ink_limit_desc.deflt.integer;
+ description->deflt.dbl =
+ ink_limit_desc.deflt.integer;
+ }
+ else
+ description->is_active = 0;
+ }
+ stp_parameter_description_destroy(&ink_limit_desc);
+ }
+ break;
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ if (!strcmp(param->param.name, "ColorCorrection"))
+ {
+ description->bounds.str = stp_string_list_create();
+ for (j = 0; j < color_correction_count; j++)
+ stp_string_list_add_string
+ (description->bounds.str, color_corrections[j].name,
+ _(color_corrections[j].text));
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
+ else if (strcmp(name, "ChannelBitDepth") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ for (j = 0; j < channel_depth_count; j++)
+ stp_string_list_add_string
+ (description->bounds.str, channel_depths[j].name,
+ channel_depths[j].name);
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
+ else if (strcmp(name, "InputImageType") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ for (j = 0; j < color_description_count; j++)
+ if (color_descriptions[j].input)
+ {
+ if (color_descriptions[j].color_id == COLOR_ID_RAW)
+ {
+ stp_parameter_t desc;
+ stp_describe_parameter(v, "RawChannels", &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_STRING_LIST)
+ stp_string_list_add_string
+ (description->bounds.str,
+ color_descriptions[j].name,
+ _(color_descriptions[j].name));
+ stp_parameter_description_destroy(&desc);
+ }
+ else
+ stp_string_list_add_string
+ (description->bounds.str,
+ color_descriptions[j].name,
+ _(color_descriptions[j].name));
+ }
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
+ else if (strcmp(name, "OutputImageType") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ for (j = 0; j < color_description_count; j++)
+ if (color_descriptions[j].output)
+ stp_string_list_add_string
+ (description->bounds.str, color_descriptions[j].name,
+ _(color_descriptions[j].name));
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
+ break;
+ default:
+ break;
}
+ return;
}
- else
+ }
+ for (i = 0; i < curve_parameter_count; i++)
+ {
+ curve_param_t *param = &(curve_parameters[i]);
+ if (strcmp(name, param->param.name) == 0)
{
- if (i0 == grayin[0] && i1 == grayin[1])
+ description->is_active = 1;
+ stp_fill_parameter_settings(description, &(param->param));
+ if (param->channel_mask != CMASK_EVERY)
{
- rgbout[0] = o0;
- rgbout[1] = o1;
- rgbout[2] = o2;
- goto out;
+ const color_description_t *color_description =
+ get_color_description(stp_describe_output(v));
+ if (color_description &&
+ (param->channel_mask & color_description->channels))
+ description->is_active = 1;
+ else
+ description->is_active = 0;
+ if (param->color_only &&
+ !(color_description->channels & ~CMASK_K))
+ description->is_active = 0;
}
- else
+ if (stp_check_string_parameter(v, "ImageType", STP_PARAMETER_ACTIVE) &&
+ strcmp(stp_get_string_parameter(v, "ImageType"), "None") != 0 &&
+ description->p_level > STP_PARAMETER_LEVEL_BASIC)
+ description->is_active = 0;
+ else if (param->hsl_only)
{
- 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];
+ const color_correction_t *correction =
+ (get_color_correction
+ (stp_get_string_parameter (v, "ColorCorrection")));
+ if (correction && !correction->correct_hsl)
+ description->is_active = 0;
}
+ switch (param->param.p_type)
+ {
+ case STP_PARAMETER_TYPE_CURVE:
+ description->deflt.curve = *(param->defval);
+ description->bounds.curve =
+ stp_curve_create_copy(*(param->defval));
+ break;
+ default:
+ break;
+ }
+ return;
}
- 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;
-
- memset(nz, 0, sizeof(nz));
- 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];
+static const stp_colorfuncs_t stpi_color_traditional_colorfuncs =
+{
+ &stpi_color_traditional_init,
+ &stpi_color_traditional_get_row,
+ &stpi_color_traditional_list_parameters,
+ &stpi_color_traditional_describe_parameter
+};
- j = *cmykin++;
- nz[2] |= j;
- *cmykout++ = lut[j];
+static const stp_color_t stpi_color_traditional_module_data =
+ {
+ "traditional",
+ N_("Traditional Gutenprint color conversion"),
+ &stpi_color_traditional_colorfuncs
+ };
- 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)
+static int
+color_traditional_module_init(void)
{
- int i;
- int j;
- int nz[4];
- const unsigned short *scmykin = (const unsigned short *) cmykin;
-
- memset(nz, 0, sizeof(nz));
- 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;
- }
+ return stp_color_register(&stpi_color_traditional_module_data);
}
-static lut_t *
-allocate_lut(size_t steps)
-{
- int i;
- lut_t *ret = stp_malloc(sizeof(lut_t));
- ret->steps = steps;
- ret->composite = stp_zalloc(sizeof(unsigned short) * steps);
- ret->red = stp_zalloc(sizeof(unsigned short) * steps);
- ret->green = stp_zalloc(sizeof(unsigned short) * steps);
- ret->blue = stp_zalloc(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)
+static int
+color_traditional_module_exit(void)
{
- 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);
- }
+ return stp_color_unregister(&stpi_color_traditional_module_data);
}
-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));
+/* Module header */
+#define stp_module_version color_traditional_LTX_stp_module_version
+#define stp_module_data color_traditional_LTX_stp_module_data
- /*
- * Third, fix up cyan, magenta, yellow values
- */
- if (pixel < 0.0)
- pixel = 0.0;
- else if (pixel > 1.0)
- pixel = 1.0;
+stp_module_version_t stp_module_version = {0, 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;
- }
-}
+stp_module_t stp_module_data =
+ {
+ "traditional",
+ VERSION,
+ "Traditional Gutenprint color conversion",
+ STP_MODULE_CLASS_COLOR,
+ NULL,
+ color_traditional_module_init,
+ color_traditional_module_exit,
+ (void *) &stpi_color_traditional_module_data
+ };
diff --git a/src/main/print-dither-matrices.c b/src/main/print-dither-matrices.c
index 531d1f1..a301fb0 100644
--- a/src/main/print-dither-matrices.c
+++ b/src/main/print-dither-matrices.c
@@ -1,5 +1,5 @@
/*
- * "$Id: print-dither-matrices.c,v 1.4.4.1 2002/05/03 01:30:28 rlk Exp $"
+ * "$Id: print-dither-matrices.c,v 1.34 2004/09/17 18:38:22 rleigh Exp $"
*
* Print plug-in driver utility functions for the GIMP.
*
@@ -27,42 +27,39 @@
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#include "print-dither.h"
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include "dither-impl.h"
#ifdef __GNUC__
#define inline __inline__
#endif
-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[] =
+static unsigned
+gcd(unsigned a, unsigned b)
{
-#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
-};
+ unsigned tmp;
+ if (b > a)
+ {
+ tmp = a;
+ a = b;
+ b = tmp;
+ }
+ while (1)
+ {
+ tmp = a % b;
+ if (tmp == 0)
+ return b;
+ a = b;
+ b = tmp;
+ }
+}
static inline int
calc_ordered_point(unsigned x, unsigned y, int steps, int multiplier,
@@ -96,15 +93,15 @@ is_po2(size_t i)
}
void
-stp_init_iterated_matrix(dither_matrix_t *mat, size_t size, size_t exp,
- const unsigned *array)
+stp_dither_matrix_iterated_init(stp_dither_matrix_impl_t *mat, size_t size,
+ size_t expt, const unsigned *array)
{
int i;
int x, y;
mat->base = size;
- mat->exp = exp;
+ mat->exp = expt;
mat->x_size = 1;
- for (i = 0; i < exp; i++)
+ for (i = 0; i < expt; i++)
mat->x_size *= mat->base;
mat->y_size = mat->x_size;
mat->total_size = mat->x_size * mat->y_size;
@@ -132,7 +129,7 @@ stp_init_iterated_matrix(dither_matrix_t *mat, size_t size, size_t exp,
((m)[(((x) + (x_size)) % (x_size)) + ((x_size) * (((y) + (y_size)) % (y_size)))])
void
-stp_shear_matrix(dither_matrix_t *mat, int x_shear, int y_shear)
+stp_dither_matrix_shear(stp_dither_matrix_impl_t *mat, int x_shear, int y_shear)
{
int i;
int j;
@@ -149,9 +146,59 @@ stp_shear_matrix(dither_matrix_t *mat, int x_shear, int y_shear)
stp_free(tmp);
}
+int
+stp_dither_matrix_validate_array(const stp_array_t *array)
+{
+ double low, high;
+ const stp_sequence_t *seq = stp_array_get_sequence(array);
+ stp_sequence_get_bounds(seq, &low, &high);
+ if (low < 0 || high > 65535)
+ return 0;
+ return 1;
+}
+
+
void
-stp_init_matrix(dither_matrix_t *mat, int x_size, int y_size,
- const unsigned int *array, int transpose, int prescaled)
+stp_dither_matrix_init_from_dither_array(stp_dither_matrix_impl_t *mat,
+ const stp_array_t *array,
+ int transpose)
+{
+ int x, y;
+ size_t count;
+ const unsigned short *vec;
+ int x_size, y_size;
+ const stp_sequence_t *seq = stp_array_get_sequence(array);
+ stp_array_get_size(array, &x_size, &y_size);
+
+ vec = stp_sequence_get_ushort_data(seq, &count);
+ 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] = vec[y + x * mat->y_size];
+ else
+ mat->matrix[x + y * mat->x_size] = vec[x + y * mat->x_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;
+}
+
+
+void
+stp_dither_matrix_init(stp_dither_matrix_impl_t *mat, int x_size, int y_size,
+ const unsigned int *array, int transpose, int prescaled)
{
int x, y;
mat->base = x_size;
@@ -183,9 +230,9 @@ stp_init_matrix(dither_matrix_t *mat, int x_size, int y_size,
}
void
-stp_init_matrix_short(dither_matrix_t *mat, int x_size, int y_size,
- const unsigned short *array, int transpose,
- int prescaled)
+stp_dither_matrix_init_short(stp_dither_matrix_impl_t *mat, int x_size, int y_size,
+ const unsigned short *array, int transpose,
+ int prescaled)
{
int x, y;
mat->base = x_size;
@@ -217,7 +264,7 @@ stp_init_matrix_short(dither_matrix_t *mat, int x_size, int y_size,
}
void
-stp_destroy_matrix(dither_matrix_t *mat)
+stp_dither_matrix_destroy(stp_dither_matrix_impl_t *mat)
{
if (mat->i_own && mat->matrix)
stp_free(mat->matrix);
@@ -231,8 +278,8 @@ stp_destroy_matrix(dither_matrix_t *mat)
}
void
-stp_clone_matrix(const dither_matrix_t *src, dither_matrix_t *dest,
- int x_offset, int y_offset)
+stp_dither_matrix_clone(const stp_dither_matrix_impl_t *src, stp_dither_matrix_impl_t *dest,
+ int x_offset, int y_offset)
{
dest->base = src->base;
dest->exp = src->exp;
@@ -252,7 +299,7 @@ stp_clone_matrix(const dither_matrix_t *src, dither_matrix_t *dest,
}
void
-stp_copy_matrix(const dither_matrix_t *src, dither_matrix_t *dest)
+stp_dither_matrix_copy(const stp_dither_matrix_impl_t *src, stp_dither_matrix_impl_t *dest)
{
int x;
dest->base = src->base;
@@ -275,7 +322,7 @@ stp_copy_matrix(const dither_matrix_t *src, dither_matrix_t *dest)
}
void
-stp_exponential_scale_matrix(dither_matrix_t *mat, double exponent)
+stp_dither_matrix_scale_exponentially(stp_dither_matrix_impl_t *mat, double exponent)
{
int i;
int mat_size = mat->x_size * mat->y_size;
@@ -288,9 +335,373 @@ stp_exponential_scale_matrix(dither_matrix_t *mat, double exponent)
}
void
-stp_matrix_set_row(dither_matrix_t *mat, int y)
+stp_dither_matrix_set_row(stp_dither_matrix_impl_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 void
+preinit_matrix(stp_vars_t *v)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ int i;
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ stp_dither_matrix_destroy(&(CHANNEL(d, i).dithermat));
+ stp_dither_matrix_destroy(&(d->dither_matrix));
+}
+
+static void
+postinit_matrix(stp_vars_t *v, int x_shear, int y_shear)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ unsigned rc = 1 + (unsigned) ceil(sqrt(CHANNEL_COUNT(d)));
+ int i, j;
+ int color = 0;
+ unsigned x_n = d->dither_matrix.x_size / rc;
+ unsigned y_n = d->dither_matrix.y_size / rc;
+ if (x_shear || y_shear)
+ stp_dither_matrix_shear(&(d->dither_matrix), x_shear, y_shear);
+ for (i = 0; i < rc; i++)
+ for (j = 0; j < rc; j++)
+ if (color < CHANNEL_COUNT(d))
+ {
+ stp_dither_matrix_clone(&(d->dither_matrix),
+ &(CHANNEL(d, color).dithermat),
+ x_n * i, y_n * j);
+ color++;
+ }
+ stp_dither_set_transition(v, d->transition);
+}
+
+void
+stp_dither_set_iterated_matrix(stp_vars_t *v, size_t edge, size_t iterations,
+ const unsigned *data, int prescaled,
+ int x_shear, int y_shear)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ preinit_matrix(v);
+ stp_dither_matrix_iterated_init(&(d->dither_matrix), edge, iterations, data);
+ postinit_matrix(v, x_shear, y_shear);
+}
+
+void
+stp_dither_set_matrix(stp_vars_t *v, const stp_dither_matrix_generic_t *matrix,
+ int transposed, int x_shear, int y_shear)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ int x = transposed ? matrix->y : matrix->x;
+ int y = transposed ? matrix->x : matrix->y;
+ preinit_matrix(v);
+ if (matrix->bytes == 2)
+ stp_dither_matrix_init_short(&(d->dither_matrix), x, y,
+ (const unsigned short *) matrix->data,
+ transposed, matrix->prescaled);
+ else if (matrix->bytes == 4)
+ stp_dither_matrix_init(&(d->dither_matrix), x, y,
+ (const unsigned *)matrix->data,
+ transposed, matrix->prescaled);
+ postinit_matrix(v, x_shear, y_shear);
+}
+
+void
+stp_dither_set_matrix_from_dither_array(stp_vars_t *v,
+ const stp_array_t *array,
+ int transpose)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ preinit_matrix(v);
+ stp_dither_matrix_init_from_dither_array(&(d->dither_matrix), array, transpose);
+ postinit_matrix(v, 0, 0);
+}
+
+void
+stp_dither_set_transition(stp_vars_t *v, double exponent)
+{
+ stpi_dither_t *d = (stpi_dither_t *) stp_get_component_data(v, "Dither");
+ unsigned rc = 1 + (unsigned) ceil(sqrt(CHANNEL_COUNT(d)));
+ int i, j;
+ int color = 0;
+ unsigned x_n = d->dither_matrix.x_size / rc;
+ unsigned y_n = d->dither_matrix.y_size / rc;
+ for (i = 0; i < CHANNEL_COUNT(d); i++)
+ stp_dither_matrix_destroy(&(CHANNEL(d, i).pick));
+ stp_dither_matrix_destroy(&(d->transition_matrix));
+ stp_dither_matrix_copy(&(d->dither_matrix), &(d->transition_matrix));
+ d->transition = exponent;
+ if (exponent < .999 || exponent > 1.001)
+ stp_dither_matrix_scale_exponentially(&(d->transition_matrix), exponent);
+ for (i = 0; i < rc; i++)
+ for (j = 0; j < rc; j++)
+ if (color < CHANNEL_COUNT(d))
+ {
+ stp_dither_matrix_clone(&(d->dither_matrix),
+ &(CHANNEL(d, color).pick),
+ x_n * i, y_n * j);
+ color++;
+ }
+}
+
+static stp_list_t *dither_matrix_cache = NULL;
+
+typedef struct
+{
+ int x;
+ int y;
+ const char *filename;
+ const stp_array_t *dither_array;
+} stp_xml_dither_cache_t;
+
+static stp_xml_dither_cache_t *
+stp_xml_dither_cache_get(int x, int y)
+{
+ stp_list_item_t *ln;
+
+ stp_deprintf(STP_DBG_XML,
+ "stp_xml_dither_cache_get: lookup %dx%d... ", x, y);
+ if (!dither_matrix_cache)
+ {
+ stp_deprintf(STP_DBG_XML, "cache does not exist\n");
+ return NULL;
+ }
+
+ ln = stp_list_get_start(dither_matrix_cache);
+
+ while (ln)
+ {
+ if (((stp_xml_dither_cache_t *) stp_list_item_get_data(ln))->x == x &&
+ ((stp_xml_dither_cache_t *) stp_list_item_get_data(ln))->y == y)
+ {
+
+ stp_deprintf(STP_DBG_XML, "found\n");
+
+ return ((stp_xml_dither_cache_t *) stp_list_item_get_data(ln));
+ }
+ ln = stp_list_item_next(ln);
+ }
+ stp_deprintf(STP_DBG_XML, "missing\n");
+
+ return NULL;
+}
+
+static void
+stp_xml_dither_cache_set(int x, int y, const char *filename)
+{
+ stp_xml_dither_cache_t *cacheval;
+
+ assert(x && y && filename);
+
+ stp_xml_init();
+
+ if (dither_matrix_cache == NULL)
+ dither_matrix_cache = stp_list_create();
+
+ if (stp_xml_dither_cache_get(x, y))
+ /* Already cached for this x and y aspect */
+ return;
+
+ cacheval = stp_malloc(sizeof(stp_xml_dither_cache_t));
+ cacheval->x = x;
+ cacheval->y = y;
+ cacheval->filename = stp_strdup(filename);
+ cacheval->dither_array = NULL;
+
+ stp_list_item_create(dither_matrix_cache, NULL, (void *) cacheval);
+
+ stp_deprintf(STP_DBG_XML, "stp_xml_dither_cache_set: added %dx%d\n", x, y);
+
+ stp_xml_exit();
+
+ return;
+}
+
+/*
+ * Parse the <dither-matrix> node.
+ */
+static int
+stp_xml_process_dither_matrix(stp_mxml_node_t *dm, /* The dither matrix node */
+ const char *file) /* Source file */
+
+{
+ const char *value;
+ int x = -1;
+ int y = -1;
+
+ value = stp_mxmlElementGetAttr(dm, "x-aspect");
+ x = stp_xmlstrtol(value);
+
+ value = stp_mxmlElementGetAttr(dm, "y-aspect");
+ y = stp_xmlstrtol(value);
+
+ stp_deprintf(STP_DBG_XML,
+ "stp_xml_process_dither_matrix: x=%d, y=%d\n", x, y);
+
+ stp_xml_dither_cache_set(x, y, file);
+ return 1;
+}
+
+static stp_array_t *
+stpi_dither_array_create_from_xmltree(stp_mxml_node_t *dm) /* Dither matrix node */
+{
+ const char *stmp;
+ stp_mxml_node_t *child;
+ int x_aspect, y_aspect; /* Dither matrix size */
+
+ /* Get x-size */
+ stmp = stp_mxmlElementGetAttr(dm, "x-aspect");
+ if (stmp)
+ {
+ x_aspect = (int) stp_xmlstrtoul(stmp);
+ }
+ else
+ {
+ stp_erprintf("stpi_dither_array_create_from_xmltree: \"x-aspect\" missing\n");
+ goto error;
+ }
+ /* Get y-size */
+ stmp = stp_mxmlElementGetAttr(dm, "y-aspect");
+ if (stmp)
+ {
+ y_aspect = (int) stp_xmlstrtoul(stmp);
+ }
+ else
+ {
+ stp_erprintf("stpi_dither_array_create_from_xmltree: \"y-aspect\" missing\n");
+ goto error;
+ }
+
+ /* Now read in the array */
+ child = stp_mxmlFindElement(dm, dm, "array", NULL, NULL, STP_MXML_DESCEND);
+ if (child)
+ return stp_array_create_from_xmltree(child);
+ else
+ stp_erprintf("stpi_dither_array_create_from_xmltree: cannot find root\n");
+ error:
+ return NULL;
+}
+
+static stp_array_t *
+xml_doc_get_dither_array(stp_mxml_node_t *doc)
+{
+ stp_mxml_node_t *cur;
+ stp_mxml_node_t *xmlseq;
+
+ if (doc == NULL )
+ {
+ fprintf(stderr,"xml_doc_get_dither_array: XML file not parsed successfully.\n");
+ return NULL;
+ }
+
+ cur = doc->child;
+
+ if (cur == NULL)
+ {
+ fprintf(stderr,"xml_doc_get_dither_array: empty document\n");
+ return NULL;
+ }
+
+ xmlseq = stp_xml_get_node(cur, "gutenprint", "dither-matrix", NULL);
+ if (xmlseq == NULL )
+ {
+ fprintf(stderr,"xml-doc-get-dither-array: XML file is not a dither matrix.\n");
+ return NULL;
+ }
+
+ return stpi_dither_array_create_from_xmltree(xmlseq);
+}
+
+static stp_array_t *
+stpi_dither_array_create_from_file(const char* file)
+{
+ stp_mxml_node_t *doc;
+ stp_array_t *ret = NULL;
+
+ FILE *fp = fopen(file, "r");
+ if (!fp)
+ {
+ stp_erprintf("stp_curve_create_from_file: unable to open %s: %s\n",
+ file, strerror(errno));
+ return NULL;
+ }
+
+ stp_xml_init();
+
+ stp_deprintf(STP_DBG_XML,
+ "stpi_dither_array_create_from_file: reading `%s'...\n", file);
+
+ doc = stp_mxmlLoadFile(NULL, fp, STP_MXML_NO_CALLBACK);
+ (void) fclose(fp);
+
+ if (doc)
+ {
+ ret = xml_doc_get_dither_array(doc);
+ stp_mxmlDelete(doc);
+ }
+
+ stp_xml_exit();
+
+ return ret;
+}
+
+static stp_array_t *
+stp_xml_get_dither_array(int x, int y)
+{
+ stp_xml_dither_cache_t *cachedval;
+ stp_array_t *ret;
+
+ cachedval = stp_xml_dither_cache_get(x, y);
+
+ if (cachedval && cachedval->dither_array)
+ return stp_array_create_copy(cachedval->dither_array);
+
+ if (!cachedval)
+ {
+ char buf[1024];
+ (void) sprintf(buf, "dither-matrix-%dx%d.xml", x, y);
+ stp_xml_parse_file_named(buf);
+ cachedval = stp_xml_dither_cache_get(x, y);
+ if (cachedval == NULL || cachedval->filename == NULL)
+ {
+ return NULL;
+ }
+ }
+
+ ret = stpi_dither_array_create_from_file(cachedval->filename);
+
+ cachedval->dither_array = ret;
+ return stp_array_create_copy(ret);
+}
+
+void
+stpi_init_dither(void)
+{
+ stp_register_xml_parser("dither-matrix", stp_xml_process_dither_matrix);
+}
+
+stp_array_t *
+stp_find_standard_dither_array(int x_aspect, int y_aspect)
+{
+ stp_array_t *answer;
+ int divisor = gcd(x_aspect, y_aspect);
+
+ x_aspect /= divisor;
+ y_aspect /= divisor;
+
+ if (x_aspect == 3) /* We don't have x3 matrices */
+ x_aspect += 1; /* so cheat */
+ if (y_aspect == 3)
+ y_aspect += 1;
+
+ divisor = gcd(x_aspect, y_aspect);
+ x_aspect /= divisor;
+ y_aspect /= divisor;
+
+ answer = stp_xml_get_dither_array(x_aspect, y_aspect);
+ if (answer)
+ return answer;
+ answer = stp_xml_get_dither_array(y_aspect, x_aspect);
+ if (answer)
+ return answer;
+ return NULL;
+}
diff --git a/src/main/print-dither.c b/src/main/print-dither.c
deleted file mode 100644
index af2015b..0000000
--- a/src/main/print-dither.c
+++ /dev/null
@@ -1,3779 +0,0 @@
-/*
- * "$Id: print-dither.c,v 1.44.4.5 2002/10/27 17:48:18 rwisi 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 <config.h>
-#endif
-#include <gimp-print/gimp-print.h>
-#include "gimp-print-internal.h"
-#include "print-dither.h"
-#include <gimp-print/gimp-print-intl-internal.h>
-#include <limits.h>
-#include <math.h>
-#include <string.h>
-
-#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 D_EVENTONE 32
-
-#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 },
- /* Note to translators: "EvenTone" is the proper name, rather than a */
- /* descriptive name, of this algorithm. */
- { "EvenTone", N_ ("EvenTone"), D_EVENTONE }
-};
-
-static const int num_dither_algos = sizeof(dither_algos)/sizeof(dither_algo_t);
-
-#define ERROR_ROWS 2
-
-#define MAX_SPREAD 32
-
-/*
- * An end of a dither segment, describing one ink
- */
-
-typedef struct ink_defn
-{
- unsigned range;
- unsigned value;
- unsigned bits;
- unsigned dot_size;
- int subchannel;
-} ink_defn_t;
-
-/*
- * A segment of the entire 0-65535 intensity range.
- */
-
-typedef struct dither_segment
-{
- ink_defn_t *lower;
- ink_defn_t *upper;
- unsigned range_span;
- unsigned value_span;
- int is_same_ink;
- int is_equal;
-} dither_segment_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 */
- int nlevels;
- unsigned bit_max;
- unsigned signif_bits;
- unsigned density;
-
- int v;
- int o;
- int b;
- int very_fast;
- int subchannels;
-
- int maxdot; /* Maximum dot size */
-
- ink_defn_t *ink_list;
-
- dither_segment_t *ranges;
- int **errs;
- unsigned short *vals;
-
- dither_matrix_t pick;
- dither_matrix_t dithermat;
- int *row_ends[2];
- unsigned char **ptrs;
-} dither_channel_t;
-
-typedef struct {
- int d2x, d2y, dx2, dy2;
- int aspect;
- int **dx, **dy, **r_sq;
- int *recip;
-} eventone_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_input_set;
- 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 n_channels;
- int n_input_channels;
- int error_rows;
-
- int dither_class; /* mono, black, or CMYK */
-
- dither_matrix_t dither_matrix;
- dither_matrix_t transition_matrix;
- dither_channel_t *channel;
-
- unsigned short virtual_dot_scale[65536];
- void (*ditherfunc)(const unsigned short *, int, struct dither *, int, int);
- eventone_t *eventone;
- stp_vars_t v;
-} dither_t;
-
-typedef void ditherfunc_t(const unsigned short *, int, struct dither *, int, int);
-
-static ditherfunc_t
- stp_dither_monochrome,
- stp_dither_monochrome_very_fast,
- stp_dither_black_fast,
- stp_dither_black_very_fast,
- stp_dither_black_ordered,
- stp_dither_black_ed,
- stp_dither_black_et,
- stp_dither_cmyk_fast,
- stp_dither_cmyk_very_fast,
- stp_dither_cmyk_ordered,
- stp_dither_cmyk_ed,
- stp_dither_cmyk_et,
- stp_dither_raw_cmyk_fast,
- stp_dither_raw_cmyk_very_fast,
- stp_dither_raw_cmyk_ordered,
- stp_dither_raw_cmyk_ed,
- stp_dither_raw_cmyk_et;
-
-
-#define CHANNEL(d, c) ((d)->channel[(c)])
-
-#define SAFE_FREE(x) \
-do \
-{ \
- if ((x)) \
- stp_free((char *)(x)); \
- ((x)) = NULL; \
-} while (0)
-
-/*
- * 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);
-}
-
-/*
- * These really belong with print-dither.c. However, inlining has yielded
- * significant (measured) speedup, even with the more complicated dither
- * function. --rlk 20011219
- */
-
-static inline unsigned
-ditherpoint_fast(const dither_t *d, dither_matrix_t *mat, int x)
-{
- return mat->matrix[(mat->last_y_mod+((x + mat->x_offset) & mat->fast_mask))];
-}
-
-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 < d->n_channels; i++)
- for (j = 0; j < CHANNEL(d, i).subchannels; j++)
- {
- int tmp = CHANNEL(d, i).row_ends[0][j];
- CHANNEL(d, i).row_ends[0][j] =
- CHANNEL(d, i).row_ends[1][j];
- CHANNEL(d, i).row_ends[1][j] = tmp;
- }
-}
-
-stp_dither_data_t *
-stp_create_dither_data(void)
-{
- stp_dither_data_t *ret = stp_zalloc(sizeof(stp_dither_data_t));
- ret->channel_count = 0;
- ret->c = NULL;
- return ret;
-}
-
-void
-stp_add_channel(stp_dither_data_t *d, unsigned char *data,
- unsigned channel, unsigned subchannel)
-{
- stp_channel_t *chan;
- if (channel >= d->channel_count)
- {
- unsigned oc = d->channel_count;
- d->c = stp_realloc(d->c, sizeof(stp_channel_t) * (channel + 1));
- (void) memset(d->c + oc, 0, sizeof(stp_channel_t) * (channel + 1 - oc));
- d->channel_count = channel + 1;
- }
- chan = d->c + channel;
- if (subchannel >= chan->subchannel_count)
- {
- unsigned oc = chan->subchannel_count;
- chan->c =
- stp_realloc(chan->c, sizeof(unsigned char *) * (subchannel + 1));
- (void) memset(chan->c + oc, 0,
- sizeof(unsigned char *) * (subchannel + 1 - oc));
- chan->subchannel_count = subchannel + 1;
- }
- chan->c[subchannel] = data;
-}
-
-void
-stp_free_dither_data(stp_dither_data_t *d)
-{
- int i;
- for (i = 0; i < d->channel_count; i++)
- stp_free(d->c[i].c);
- stp_free(d->c);
-}
-
-#define SET_DITHERFUNC(d, func, v) \
-do \
-{ \
- stp_dprintf(STP_DBG_COLORFUNC, v, "ditherfunc %s\n", #func); \
- d->ditherfunc = func; \
-} while (0)
-
-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_zalloc(sizeof(dither_t));
- stp_simple_dither_range_t r;
- d->v = v;
- d->dither_class = stp_get_output_type(v);
- d->error_rows = ERROR_ROWS;
-
- d->dither_type = D_ADAPTIVE_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;
- }
- }
- switch (d->dither_class)
- {
- case OUTPUT_MONOCHROME:
- d->n_channels = 1;
- d->n_input_channels = 1;
- switch (d->dither_type)
- {
- case D_VERY_FAST:
- SET_DITHERFUNC(d, stp_dither_monochrome_very_fast, v);
- break;
- default:
- SET_DITHERFUNC(d, stp_dither_monochrome, v);
- break;
- }
- break;
- case OUTPUT_GRAY:
- d->n_channels = 1;
- d->n_input_channels = 1;
- switch (d->dither_type)
- {
- case D_FAST:
- SET_DITHERFUNC(d, stp_dither_black_fast, v);
- break;
- case D_VERY_FAST:
- SET_DITHERFUNC(d, stp_dither_black_very_fast, v);
- break;
- case D_ORDERED:
- SET_DITHERFUNC(d, stp_dither_black_ordered, v);
- break;
- case D_EVENTONE:
- SET_DITHERFUNC(d, stp_dither_black_et, v);
- break;
- default:
- SET_DITHERFUNC(d, stp_dither_black_ed, v);
- break;
- }
- break;
- case OUTPUT_COLOR:
- d->n_channels = 4;
- d->n_input_channels = 3;
- switch (d->dither_type)
- {
- case D_FAST:
- SET_DITHERFUNC(d, stp_dither_cmyk_fast, v);
- break;
- case D_VERY_FAST:
- SET_DITHERFUNC(d, stp_dither_cmyk_very_fast, v);
- break;
- case D_ORDERED:
- SET_DITHERFUNC(d, stp_dither_cmyk_ordered, v);
- break;
- case D_EVENTONE:
- SET_DITHERFUNC(d, stp_dither_cmyk_et, v);
- break;
- default:
- SET_DITHERFUNC(d, stp_dither_cmyk_ed, v);
- break;
- }
- break;
- case OUTPUT_RAW_CMYK:
- d->n_channels = 4;
- d->n_input_channels = 4;
- switch (d->dither_type)
- {
- case D_FAST:
- SET_DITHERFUNC(d, stp_dither_raw_cmyk_fast, v);
- break;
- case D_VERY_FAST:
- SET_DITHERFUNC(d, stp_dither_raw_cmyk_very_fast, v);
- break;
- case D_ORDERED:
- SET_DITHERFUNC(d, stp_dither_raw_cmyk_ordered, v);
- break;
- case D_EVENTONE:
- SET_DITHERFUNC(d, stp_dither_raw_cmyk_et, v);
- break;
- default:
- SET_DITHERFUNC(d, stp_dither_raw_cmyk_ed, v);
- break;
- }
- break;
- }
- d->channel = stp_zalloc(d->n_channels * sizeof(dither_channel_t));
- r.value = 1.0;
- r.bit_pattern = 1;
- r.subchannel = 0;
- r.dot_size = 1;
- for (i = 0; i < d->n_channels; i++)
- {
- stp_dither_set_ranges(d, i, 1, &r, 1.0);
- CHANNEL(d, i).errs = stp_zalloc(d->error_rows * sizeof(int *));
- }
- d->offset0_table = NULL;
- d->offset1_table = NULL;
- d->x_aspect = horizontal_aspect;
- d->y_aspect = vertical_aspect;
- d->transition = 1.0;
- d->adaptive_input = .75;
- d->adaptive_input_set = 0;
-
- 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 <= d->n_channels; 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);
- return d;
-}
-
-static void
-preinit_matrix(dither_t *d)
-{
- int i;
- for (i = 0; i < d->n_channels; i++)
- stp_destroy_matrix(&(CHANNEL(d, i).dithermat));
- stp_destroy_matrix(&(d->dither_matrix));
-}
-
-static void
-postinit_matrix(dither_t *d, int x_shear, int y_shear)
-{
- unsigned rc = 1 + (unsigned) ceil(sqrt(d->n_channels));
- int i, j;
- int color = 0;
- unsigned x_n = d->dither_matrix.x_size / rc;
- unsigned y_n = d->dither_matrix.y_size / rc;
- if (x_shear || y_shear)
- stp_shear_matrix(&(d->dither_matrix), x_shear, y_shear);
- for (i = 0; i < rc; i++)
- for (j = 0; j < rc; j++)
- if (color < d->n_channels)
- {
- stp_clone_matrix(&(d->dither_matrix), &(CHANNEL(d, color).dithermat),
- x_n * i, y_n * j);
- color++;
- }
- 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);
- stp_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)
- stp_init_matrix_short(&(d->dither_matrix), x, y,
- (const unsigned short *) matrix->data,
- transposed, matrix->prescaled);
- else if (matrix->bytes == 4)
- stp_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)
-{
- dither_t *d = (dither_t *) vd;
- unsigned rc = 1 + (unsigned) ceil(sqrt(d->n_channels));
- int i, j;
- int color = 0;
- unsigned x_n = d->dither_matrix.x_size / rc;
- unsigned y_n = d->dither_matrix.y_size / rc;
- for (i = 0; i < d->n_channels; i++)
- stp_destroy_matrix(&(CHANNEL(d, i).pick));
- stp_destroy_matrix(&(d->transition_matrix));
- stp_copy_matrix(&(d->dither_matrix), &(d->transition_matrix));
- d->transition = exponent;
- if (exponent < .999 || exponent > 1.001)
- stp_exponential_scale_matrix(&(d->transition_matrix), exponent);
- for (i = 0; i < rc; i++)
- for (j = 0; j < rc; j++)
- if (color < d->n_channels)
- {
- stp_clone_matrix(&(d->dither_matrix), &(CHANNEL(d, color).pick),
- x_n * i, y_n * j);
- color++;
- }
- 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_input_set = 1;
- 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;
- SAFE_FREE(d->offset0_table);
- SAFE_FREE(d->offset1_table);
- 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 >= d->n_channels)
- 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 >= d->n_channels)
- 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 >= d->n_channels)
- return;
- CHANNEL(d, i).darkness = (int) (v * 64);
-}
-
-void
-stp_dither_set_light_ink(void *vd, int i, double v, double density)
-{
- dither_t *d = (dither_t *) vd;
- stp_simple_dither_range_t range[2];
- if (i < 0 || i >= d->n_channels || v <= 0 || v > 1)
- return;
- range[0].bit_pattern = 1;
- range[0].subchannel = 1;
- range[0].value = v;
- range[0].dot_size = 1;
- range[1].bit_pattern = 1;
- range[1].subchannel = 0;
- range[1].value = 1;
- range[1].dot_size = 1;
- stp_dither_set_ranges(vd, i, 2, range, density);
-}
-
-static void
-stp_dither_finalize_ranges(dither_t *d, dither_channel_t *s)
-{
- int max_subchannel = 0;
- int i;
- unsigned lbit = s->bit_max;
- s->signif_bits = 0;
- while (lbit > 0)
- {
- s->signif_bits++;
- lbit >>= 1;
- }
-
- s->maxdot = 0;
-
- for (i = 0; i < s->nlevels; i++)
- {
- if (s->ranges[i].lower->subchannel > max_subchannel)
- max_subchannel = s->ranges[i].lower->subchannel;
- if (s->ranges[i].upper->subchannel > max_subchannel)
- max_subchannel = s->ranges[i].upper->subchannel;
- if (s->ranges[i].lower->subchannel == s->ranges[i].upper->subchannel &&
- s->ranges[i].lower->dot_size == s->ranges[i].upper->dot_size)
- 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].lower->subchannel != s->ranges[i].upper->subchannel))
- s->ranges[i].is_equal = 0;
- else
- s->ranges[i].is_equal = 1;
-
- if (s->ranges[i].lower->dot_size > s->maxdot)
- s->maxdot = s->ranges[i].lower->dot_size;
- if (s->ranges[i].upper->dot_size > s->maxdot)
- s->maxdot = s->ranges[i].upper->dot_size;
-
- 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].lower->value, s->ranges[i].upper->value,
- s->ranges[i].lower->range, s->ranges[i].upper->range);
- stp_dprintf(STP_DBG_INK, d->v,
- " bits[0] %d bits[1] %d subchannel[0] %d subchannel[1] %d\n",
- s->ranges[i].lower->bits, s->ranges[i].upper->bits,
- s->ranges[i].lower->subchannel, s->ranges[i].upper->subchannel);
- 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);
- if (!d->adaptive_input_set && i > 0 &&
- s->ranges[i].lower->range >= d->adaptive_limit)
- {
- d->adaptive_limit = s->ranges[i].lower->range + 1;
- if (d->adaptive_limit > 65535)
- d->adaptive_limit = 65535;
- d->adaptive_input = (double) d->adaptive_limit / (double) d->density;
- stp_dprintf(STP_DBG_INK, d->v,
- "Setting adaptive limit to %d, input %f\n",
- d->adaptive_limit, d->adaptive_input);
- }
- }
- if (s->nlevels == 1 && s->ranges[0].upper->bits == 1 &&
- s->ranges[0].upper->subchannel == 0)
- s->very_fast = 1;
- else
- s->very_fast = 0;
-
- s->subchannels = max_subchannel + 1;
- s->row_ends[0] = stp_zalloc(s->subchannels * sizeof(int));
- s->row_ends[1] = stp_zalloc(s->subchannels * sizeof(int));
- s->ptrs = stp_zalloc(s->subchannels * sizeof(char *));
- 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(dither_t *d, dither_channel_t *s, int nlevels,
- const stp_simple_dither_range_t *ranges,
- double density)
-{
- int i;
- SAFE_FREE(s->ranges);
- SAFE_FREE(s->row_ends[0]);
- SAFE_FREE(s->row_ends[1]);
- SAFE_FREE(s->ptrs);
-
- s->nlevels = nlevels > 1 ? nlevels + 1 : nlevels;
- s->ranges = (dither_segment_t *)
- stp_zalloc(s->nlevels * sizeof(dither_segment_t));
- s->ink_list = (ink_defn_t *)
- stp_zalloc((s->nlevels + 1) * sizeof(ink_defn_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 subchannel %d\n", i,
- ranges[i].value, ranges[i].bit_pattern, ranges[i].subchannel);
- s->ranges[0].lower = &s->ink_list[0];
- s->ranges[0].upper = &s->ink_list[1];
- s->ink_list[0].range = 0;
- s->ink_list[0].value = ranges[0].value * 65535.0;
- s->ink_list[0].bits = ranges[0].bit_pattern;
- s->ink_list[0].subchannel = ranges[0].subchannel;
- s->ink_list[0].dot_size = ranges[0].dot_size;
- if (nlevels == 1)
- s->ink_list[1].range = 65535;
- else
- s->ink_list[1].range = ranges[0].value * 65535.0 * density;
- if (s->ink_list[1].range > 65535)
- s->ink_list[1].range = 65535;
- s->ink_list[1].value = ranges[0].value * 65535.0;
- if (s->ink_list[1].value > 65535)
- s->ink_list[1].value = 65535;
- s->ink_list[1].bits = ranges[0].bit_pattern;
- if (ranges[0].bit_pattern > s->bit_max)
- s->bit_max = ranges[0].bit_pattern;
- s->ink_list[1].subchannel = ranges[0].subchannel;
- s->ink_list[1].dot_size = ranges[0].dot_size;
- s->ranges[0].range_span = s->ranges[0].upper->range;
- s->ranges[0].value_span = 0;
- if (s->nlevels > 1)
- {
- for (i = 1; i < nlevels; i++)
- {
- int l = i + 1;
- s->ranges[i].lower = &s->ink_list[i];
- s->ranges[i].upper = &s->ink_list[l];
-
- s->ink_list[l].range =
- (ranges[i].value + ranges[i].value) * 32768.0 * density;
- if (s->ink_list[l].range > 65535)
- s->ink_list[l].range = 65535;
- s->ink_list[l].value = ranges[i].value * 65535.0;
- if (s->ink_list[l].value > 65535)
- s->ink_list[l].value = 65535;
- s->ink_list[l].bits = ranges[i].bit_pattern;
- if (ranges[i].bit_pattern > s->bit_max)
- s->bit_max = ranges[i].bit_pattern;
- s->ink_list[l].subchannel = ranges[i].subchannel;
- s->ink_list[l].dot_size = ranges[i].dot_size;
- s->ranges[i].range_span =
- s->ink_list[l].range - s->ink_list[i].range;
- s->ranges[i].value_span =
- s->ink_list[l].value - s->ink_list[i].value;
- }
- s->ranges[i].lower = &s->ink_list[i];
- s->ranges[i].upper = &s->ink_list[i+1];
- s->ink_list[i+1] = s->ink_list[i];
- s->ink_list[i+1].range = 65535;
- s->ranges[i].range_span = s->ink_list[i+1].range - s->ink_list[i].range;
- s->ranges[i].value_span = s->ink_list[i+1].value - s->ink_list[i].value;
- }
- stp_dither_finalize_ranges(d, s);
-}
-
-static void
-stp_dither_set_generic_ranges_full(dither_t *d, dither_channel_t *s,
- int nlevels,
- const stp_full_dither_range_t *ranges,
- double density)
-{
- int i, j, k;
- SAFE_FREE(s->ranges);
- SAFE_FREE(s->row_ends[0]);
- SAFE_FREE(s->row_ends[1]);
- SAFE_FREE(s->ptrs);
-
- s->nlevels = nlevels+1;
- s->ranges = (dither_segment_t *)
- stp_zalloc(s->nlevels * sizeof(dither_segment_t));
- s->ink_list = (ink_defn_t *)
- stp_zalloc((s->nlevels * 2) * sizeof(ink_defn_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 subchannel low %d high %d\n", i,
- ranges[i].value[0], ranges[i].value[1],
- ranges[i].bits[0], ranges[i].bits[1],ranges[i].subchannel[0],
- ranges[i].subchannel[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->ink_list[2*j+k].dot_size = ranges[i].bits[k]; /* FIXME */
- s->ink_list[2*j+k].value = ranges[i].value[k] * 65535;
- s->ink_list[2*j+k].range = s->ink_list[2*j+k].value*density;
- s->ink_list[2*j+k].bits = ranges[i].bits[k];
- s->ink_list[2*j+k].subchannel = ranges[i].subchannel[k];
- }
- s->ranges[j].lower = &s->ink_list[2*j];
- s->ranges[j].upper = &s->ink_list[2*j+1];
- s->ranges[j].range_span = s->ranges[j].upper->range - s->ranges[j].lower->range;
- s->ranges[j].value_span = s->ranges[j].upper->value - s->ranges[j].lower->value;
- j++;
- }
- s->ink_list[2*j] = s->ink_list[2*(j-1)+1];
- s->ink_list[2*j+1] = s->ink_list[2*j];
- s->ink_list[2*j+1].range = 65535;
- s->ink_list[2*j+1].value = 65535; /* ??? Is this correct ??? */
- s->ranges[j].lower = &s->ink_list[2*j];
- s->ranges[j].upper = &s->ink_list[2*j+1];
- s->ranges[j].range_span = s->ranges[j].upper->range - s->ranges[j].lower->range;
- s->ranges[j].value_span = 0;
- s->nlevels = j+1;
- stp_dither_finalize_ranges(d, s);
-}
-
-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 >= d->n_channels)
- return;
- stp_dither_set_generic_ranges(d, &(CHANNEL(d, color)), 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].subchannel = 0;
- }
- 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)), nlevels,
- ranges, density);
-}
-
-void
-stp_free_dither(void *vd)
-{
- dither_t *d = (dither_t *) vd;
- int i;
- int j;
- for (j = 0; j < d->n_channels; j++)
- {
- SAFE_FREE(CHANNEL(d, j).vals);
- SAFE_FREE(CHANNEL(d, j).row_ends[0]);
- SAFE_FREE(CHANNEL(d, j).row_ends[1]);
- SAFE_FREE(CHANNEL(d, j).ptrs);
- if (CHANNEL(d, j).errs)
- {
- for (i = 0; i < d->error_rows; i++)
- SAFE_FREE(CHANNEL(d, j).errs[i]);
- SAFE_FREE(CHANNEL(d, j).errs);
- }
- SAFE_FREE(CHANNEL(d, j).ranges);
- stp_destroy_matrix(&(CHANNEL(d, j).pick));
- stp_destroy_matrix(&(CHANNEL(d, j).dithermat));
- }
- SAFE_FREE(d->offset0_table);
- SAFE_FREE(d->offset1_table);
- stp_destroy_matrix(&(d->dither_matrix));
- stp_destroy_matrix(&(d->transition_matrix));
- if (d->eventone) {
- eventone_t *et = d->eventone;
- stp_free(et->recip);
- for (i=0; i<d->n_channels; i++) {
- stp_free(et->dx[i]);
- stp_free(et->dy[i]);
- stp_free(et->r_sq[i]);
- }
- stp_free(et->r_sq);
- stp_free(et->dx);
- stp_free(et->dy);
- stp_free(d->eventone);
- }
- stp_free(d);
-}
-
-int
-stp_dither_get_first_position(void *vd, int color, int subchannel)
-{
- dither_t *d = (dither_t *) vd;
- if (color < 0 || color >= d->n_channels)
- return -1;
- return CHANNEL(d, color).row_ends[0][subchannel];
-}
-
-int
-stp_dither_get_last_position(void *vd, int color, int subchannel)
-{
- dither_t *d = (dither_t *) vd;
- if (color < 0 || color >= d->n_channels)
- return -1;
- return CHANNEL(d, color).row_ends[0][subchannel];
-}
-
-static int *
-get_errline(dither_t *d, int row, int color)
-{
- if (row < 0 || color < 0 || color >= d->n_channels)
- 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_zalloc(size * sizeof(int));
- return CHANNEL(d, color).errs[row & 1] + MAX_SPREAD;
- }
-}
-
-#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_REVERSE(d, bit, input, width, xerror, xmod) \
-do \
-{ \
- if (bit == 128) \
- { \
- d->ptr_offset--; \
- bit = 1; \
- } \
- else \
- bit <<= 1; \
- if (d->src_width == d->dst_width) \
- input -= (width); \
- else \
- { \
- input -= xstep; \
- xerror -= xmod; \
- if (xerror < 0) \
- { \
- 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; \
- for (i = 0; i < N; i++) \
- for (j = 0; j < S; j++) \
- err[i][j] += dir; \
- if (dir == 1) \
- ADVANCE_UNIDIRECTIONAL(d, bit, in, width, xer, xmod); \
- else \
- ADVANCE_REVERSE(d, bit, in, width, xer, xmod); \
-} 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 < d->n_channels; i++)
- answer = USMIN(answer, CHANNEL(d, i).v);
- return answer;
-}
-
-static inline void
-set_row_ends(dither_channel_t *dc, int x, int subchannel)
-{
- if (dc->row_ends[0][subchannel] == -1)
- dc->row_ends[0][subchannel] = x;
- dc->row_ends[1][subchannel] = x;
-}
-
-/*
- * 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;
- 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 subchannel;
- unsigned char *tptr;
- unsigned bits;
- unsigned v;
- unsigned dot_size;
- int levels = dc->nlevels - 1;
- int dither_value = adjusted;
- dither_segment_t *dd;
- ink_defn_t *lower;
- ink_defn_t *upper;
-
- 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 = &(dc->ranges[i]);
-
- if (density <= dd->lower->range)
- 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.
- */
-
- lower = dd->lower;
- upper = dd->upper;
-
- if (!dd->is_equal)
- rangepoint =
- ((unsigned) (density - lower->range)) * 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 = upper->value;
- else if (dd->range_span == 0)
- virtual_value = (upper->value + lower->value) / 2;
- else
- virtual_value = lower->value +
- (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)
- {
- ink_defn_t *subc;
-
- if (dd->is_same_ink)
- subc = upper;
- else
- {
- rangepoint = rangepoint * dc->density / 65535u;
- if (rangepoint >= ditherpoint(d, pick_matrix, x))
- subc = upper;
- else
- subc = lower;
- }
- subchannel = subc->subchannel;
- bits = subc->bits;
- v = subc->value;
- dot_size = subc->dot_size;
- tptr = dc->ptrs[subchannel] + d->ptr_offset;
-
- /*
- * Lay down all of the bits in the pixel.
- */
- if (dontprint < v)
- {
- set_row_ends(dc, x, subchannel);
- 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_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 subchannel;
- unsigned char *tptr;
- unsigned bits;
- unsigned v;
- unsigned dot_size;
- int levels = dc->nlevels - 1;
- int dither_value = adjusted;
- dither_segment_t *dd;
- ink_defn_t *lower;
- ink_defn_t *upper;
-
- 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 = &(dc->ranges[i]);
-
- if (density <= dd->lower->range)
- 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.
- */
-
- lower = dd->lower;
- upper = dd->upper;
-
- if (dd->is_equal)
- rangepoint = 32768;
- else
- rangepoint =
- ((unsigned) (density - lower->range)) * 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 = upper->value;
- else if (dd->range_span == 0)
- virtual_value = (upper->value + lower->value) / 2;
- else
- virtual_value = lower->value +
- (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)
- {
- ink_defn_t *subc;
-
- if (dd->is_same_ink)
- subc = upper;
- else
- {
- rangepoint = rangepoint * dc->density / 65535u;
- if (rangepoint >= ditherpoint(d, pick_matrix, x))
- subc = upper;
- else
- subc = lower;
- }
- subchannel = subc->subchannel;
- bits = subc->bits;
- v = subc->value;
- dot_size = subc->dot_size;
- tptr = dc->ptrs[subchannel] + d->ptr_offset;
-
- /*
- * Lay down all of the bits in the pixel.
- */
- if (dontprint < v)
- {
- set_row_ends(dc, x, subchannel);
- 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_matrix_t *dither_matrix = &(dc->dithermat);
- int i;
- int levels = dc->nlevels - 1;
- int j;
- unsigned char *tptr;
- unsigned bits;
-
- if (density <= 0 || adjusted <= 0)
- return;
- for (i = levels; i >= 0; i--)
- {
- dither_segment_t *dd = &(dc->ranges[i]);
- unsigned vmatrix;
- unsigned rangepoint;
- unsigned dpoint;
- unsigned range0;
- ink_defn_t *subc;
-
- range0 = dd->lower->range;
- if (density <= range0)
- continue;
- dpoint = ditherpoint(d, dither_matrix, x);
-
- if (dd->is_same_ink)
- subc = dd->upper;
- else
- {
- rangepoint = ((density - range0) << 16) / dd->range_span;
- rangepoint = (rangepoint * dc->density) >> 16;
- if (rangepoint >= dpoint)
- subc = dd->upper;
- else
- subc = dd->lower;
- }
- vmatrix = (subc->value * 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 subchannel = subc->subchannel;
- bits = subc->bits;
- tptr = dc->ptrs[subchannel] + d->ptr_offset;
- set_row_ends(dc, x, subchannel);
-
- /*
- * Lay down all of the bits in the pixel.
- */
- 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 < d->n_channels; 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 < d->n_channels; 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 < d->n_channels; i++)
- CHANNEL(d, i).v = CHANNEL(d, i).o;
- CHANNEL(d, ECOLOR_K).b = bk;
- CHANNEL(d, ECOLOR_K).v = k;
-}
-
-static int
-shared_ed_initializer(dither_t *d,
- int row,
- int duplicate_line,
- int zero_mask,
- int length,
- int direction,
- int ****error,
- int **ndither)
-{
- int i, j;
- if (!duplicate_line)
- {
- if ((zero_mask & ((1 << d->n_input_channels) - 1)) !=
- ((1 << d->n_input_channels) - 1))
- 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 0;
- else if (d->last_line_was_empty == 4)
- {
- for (i = 0; i < d->n_channels; i++)
- for (j = 0; j < d->error_rows; j++)
- memset(get_errline(d, row + j, i), 0, d->dst_width * sizeof(int));
- return 0;
- }
- d->ptr_offset = (direction == 1) ? 0 : length - 1;
-
- *error = stp_malloc(d->n_channels * sizeof(int **));
- *ndither = stp_malloc(d->n_channels * sizeof(int));
- for (i = 0; i < d->n_channels; i++)
- {
- (*error)[i] = stp_malloc(d->error_rows * sizeof(int *));
- for (j = 0; j < d->error_rows; j++)
- {
- (*error)[i][j] = get_errline(d, row + j, i);
- if (j == d->error_rows - 1)
- memset((*error)[i][j], 0, d->dst_width * sizeof(int));
- if (direction == -1)
- (*error)[i][j] += d->dst_width - 1;
- }
- (*ndither)[i] = (*error)[i][0][0];
- }
- return 1;
-}
-
-
-#define V_WHITE 0
-#define V_CYAN (1<<ECOLOR_C)
-#define V_MAGENTA (1<<ECOLOR_M)
-#define V_YELLOW (1<<ECOLOR_Y)
-#define V_BLUE (V_CYAN|V_MAGENTA)
-#define V_GREEN (V_CYAN|V_YELLOW)
-#define V_RED (V_MAGENTA|V_YELLOW)
-#define V_BLACK (V_CYAN|V_MAGENTA|V_YELLOW)
-
-static inline int
-pick_vertex(int c, int m, int y, int k)
-{
- int best;
- int tmax, vmax;
-
- if (c+m+y <= 65535) {
- best = V_WHITE; vmax = 65535-c-m-y; /* White */
- if (c > vmax) { best = V_CYAN; vmax = c; } /* Cyan */
- if (m > vmax) { best = V_MAGENTA; vmax = m; } /* Magenta */
- if (y > vmax) { best = V_YELLOW; vmax = y; } /* Yellow */
- } else if (c+m+y >= 2*65535) {
- best = V_BLACK; vmax = c+m+y-2*65535; /* Black */
- if ((tmax = 65535-y) > vmax) {best = V_BLUE; vmax = tmax; } /* Blue */
- if ((tmax = 65535-m) > vmax) {best = V_GREEN; vmax = tmax; } /* Green */
- if ((tmax = 65535-c) > vmax) {best = V_RED; vmax = tmax; } /* Red */
- } else if (m+c <= 65535) {
- if (m+y <= 65535) {
- best = V_GREEN; vmax = c+m+y-65535; /* Green */
- if (m > vmax) {best = V_MAGENTA; vmax = m;} /* Magenta */
- if ((tmax = 65535-m-y) > vmax) {best = V_CYAN; vmax = tmax;} /* Cyan */
- if ((tmax = 65535-c-m) > vmax) {best = V_YELLOW; vmax = tmax;} /* Yellow */
- } else {
- best = V_RED; vmax = m+y-65535; /* Red */
- if (c > vmax) { best = V_GREEN; vmax = c;} /* Green */
- if ((tmax = 65535-y) > vmax) {best = V_MAGENTA; vmax = tmax;} /* Magenta */
- if ((tmax = 65535-m-c) > vmax) {best = V_YELLOW; vmax = tmax;} /* Yellow */
- }
- } else {
- if (m+y > 65535) {
- best = V_MAGENTA; vmax = 2*65535-m-c-y; /* Magenta */
- if ((tmax = c+m-65535) > vmax) { best = V_BLUE; vmax = tmax; } /* Blue */
- if ((tmax = y+m-65535) > vmax) { best = V_RED; vmax = tmax; } /* Red */
- if ((tmax = 65535-m) > vmax) { best = V_GREEN; vmax = tmax; } /* Green */
- } else {
- best = V_CYAN; vmax = 65535-y-m; /* Cyan */
- if ((tmax = c+m-65535) > vmax) { best = V_BLUE; vmax = tmax; } /* Blue */
- if ((tmax = 65535-c) > vmax) { best = V_MAGENTA; vmax = tmax; } /* Magenta */
- if (y > vmax) { best = V_GREEN; vmax = y;} /* Green */
- }
- }
-
- if (k >= 32768) {
- best |= (1 << ECOLOR_K);
- }
-
- return best;
-}
-
-typedef struct {
- int dx, dy, r_sq, wetness, ri, point;
- int maxdot_dens; /* Max dot size * density */
- int maxdot_wet; /* Maximum wetness allowed */
- dither_segment_t dr;
-} et_chdata_t;
-
-static inline void find_segment(dither_t *d, dither_channel_t *dc, int wetness, int density, dither_segment_t *range)
-{
- int i;
- ink_defn_t *di;
- int max_dot;
-
- if (wetness < 0) max_dot = 0;
- else max_dot = wetness >> 16;
-
- range->lower = range->upper = dc->ranges[0].lower;
-
- for (i = dc->nlevels-1; i > 0; i--) {
- di = dc->ranges[i].lower;
- if (density < di->value) continue;
- if (max_dot < di->dot_size) continue;
- range->lower = di;
- range->upper = di;
- break;
- }
-
- for (; i < dc->nlevels; i++) {
- di = dc->ranges[i].upper;
- if (max_dot < di->dot_size) continue;
- range->upper = di;
- if (density < di->value) break;
- }
-}
-
-#define EVEN_C1 256
-#define EVEN_C2 222 /* = sqrt(3)/2 * EVEN_C1 */
-
-static inline void
-eventone_init(dither_t *d, et_chdata_t **cd)
-{
- int i;
- eventone_t *et = d->eventone;
-
- if (!et) {
-
- et = stp_zalloc(sizeof(eventone_t));
-
- { int xa, ya;
- xa = d->x_aspect / d->y_aspect;
- if (xa == 0) xa = 1;
- et->dx2 = xa * xa;
- et->d2x = 2 * et->dx2;
-
- ya = d->y_aspect / d->x_aspect;
- if (ya == 0) ya = 1;
- et->dy2 = ya * ya;
- et->d2y = 2 * et->dy2;
-
- et->aspect = EVEN_C2 / (xa * ya);
- }
-
- et->recip = stp_malloc(65536 * sizeof(int));
- et->dx = stp_malloc(sizeof(int *) * d->n_channels);
- et->dy = stp_malloc(sizeof(int *) * d->n_channels);
- et->r_sq = stp_malloc(sizeof(int *) * d->n_channels);
-
- for (i=0; i < d->n_channels; i++) {
- int x;
- et->dx[i] = stp_malloc(sizeof(int) * d->dst_width);
- et->dy[i] = stp_malloc(sizeof(int) * d->dst_width);
- et->r_sq[i] = stp_zalloc(sizeof(int) * d->dst_width);
- for (x = 0; x < d->dst_width; x++) {
- et->dx[i][x] = et->dx2;
- et->dy[i][x] = et->dy2;
- }
- }
-
- for (i=0; i < 65536; i++) {
- if (i == 0)
- et->recip[i] = EVEN_C1 * 65536;
- else
- et->recip[i] = EVEN_C1 * 65536 / i;
- }
-
- for (i = 0; i < d->n_channels; i++) {
- CHANNEL(d, i).ranges[0].lower->value = 0;
- CHANNEL(d, i).ranges[0].lower->range = 0;
- CHANNEL(d, i).ranges[0].lower->bits = 0;
- CHANNEL(d, i).ranges[0].lower->subchannel = 0;
- CHANNEL(d, i).ranges[0].lower->dot_size = 0;
- }
-
- d->eventone = et;
- }
-
- { et_chdata_t *p;
- *cd = stp_malloc(sizeof(et_chdata_t) * d->n_channels);
-
- for (i = 0, p = *cd; i < d->n_channels; i++, p++)
- {
- p->wetness = 0;
- p->maxdot_dens = CHANNEL(d, i).maxdot * d->density;
- p->maxdot_wet = (65536 + d->density / 2) * CHANNEL(d, i).maxdot;
- p->dx = et->dx2;
- p->dy = et->dy2;
- p->r_sq = 0;
- }
- }
-}
-
-static inline void
-advance_eventone_pre(dither_t *d, et_chdata_t *cd, eventone_t *et, int x)
-{
- int i;
-
- for (i=0; i < d->n_channels; cd++, i++) {
- if (cd->r_sq + cd->dx <= et->r_sq[i][x]) { /* Do our eventone calculations */
- cd->r_sq += cd->dx; /* Nearest pixel same as last one */
- cd->dx += et->d2x;
- } else {
- cd->dx = et->dx[i][x]; /* Nearest pixel is from a previous line */
- cd->dy = et->dy[i][x];
- cd->r_sq = et->r_sq[i][x];
- }
- }
-}
-
-static inline void
-advance_eventone_post(dither_t *d, et_chdata_t *cd, eventone_t *et, int x)
-{
- int i;
- int t;
-
- for (i=0; i < d->n_channels; cd++, i++) {
- if (cd->point > 0) {
- cd->r_sq = 0;
- cd->dx = et->dx2;
- cd->dy = et->dy2;
- }
- t = et->r_sq[i][x] + et->dy[i][x];
- et->dy[i][x] += et->d2y;
- if (cd->r_sq + cd->dy < t) {
- t = cd->r_sq + cd->dy;
- et->dx[i][x] = cd->dx;
- et->dy[i][x] = cd->dy + et->d2y;
- }
- if (t > 65535) {
- t = 65535;
- }
- et->r_sq[i][x] = t;
- }
-}
-
-static inline int
-eventone_adjust(dither_segment_t *range, eventone_t *et, int r_sq, int base, int value)
-{
- unsigned upper;
- unsigned lower;
- unsigned value_span;
- int ditherpoint;
-
- lower = range->lower->value;
- upper = range->upper->value;
- value_span = upper - lower;
-
- if (value >= upper) {
- ditherpoint = 65535;
- } else {
- if (value <= lower) {
- ditherpoint = 0;
- } else {
- ditherpoint = ((unsigned)(value - lower) << 16) / value_span;
- }
- /* Adjust for Eventone here */
- if (lower == 0) {
- ditherpoint += r_sq * et->aspect;
- if (base < upper) {
- ditherpoint -= et->recip[(base<<16) / value_span];
- }
- if (ditherpoint > 65535) ditherpoint = 65535;
- else if (ditherpoint < 0) ditherpoint = 0;
- }
- }
- return ditherpoint;
-}
-
-static inline void
-print_all_inks(dither_t *d, et_chdata_t *cd, int print_inks, int pick, unsigned char bit, int length)
-{
- int i, mask;
- for (i = 0, mask = 1; i < d->n_channels; mask <<= 1, cd++, i++) {
- int j;
- ink_defn_t *subc;
- int bits;
- unsigned char *tptr;
-
- if (!(print_inks & mask)) continue;
-
- subc = (pick & mask) ? cd->dr.upper : cd->dr.lower;
- bits = subc->bits;
- if (bits == 0) continue;
-
- tptr = CHANNEL(d, i).ptrs[subc->subchannel] + d->ptr_offset;
- cd->wetness += subc->dot_size << 16;
-
- for (j=1; j <= bits; j+=j, tptr += length) {
- if (j & bits) *tptr |= bit;
- }
- }
-}
-
-static inline void
-diffuse_error(dither_t *d, int *ndither, int ***error, int aspect, int direction)
-{
- int i;
- int fraction, frac_2, frac_3;
- int *err;
- static const int diff_fact[] = {1, 10, 16, 23, 32};
- int factor = diff_fact[aspect];
-
- for (i=0; i < d->n_channels; i++, ndither++, error++) {
- fraction = (*ndither + (factor>>1)) / factor;
- frac_2 = fraction + fraction;
- frac_3 = frac_2 + fraction;
- err = (*error)[1];
- err[0] += frac_3;
- err[-direction] += frac_2;
- *ndither += (*error)[0][direction] - frac_2 - frac_3;
- }
-}
-
-/*
- * 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,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- xerror,
- xstep,
- xmod,
- length;
- unsigned char bit,
- *kptr;
- dither_channel_t *dc = &(CHANNEL(d, ECOLOR_K));
- dither_matrix_t *kdither = &(dc->dithermat);
- unsigned bits = dc->signif_bits;
- int j;
- unsigned char *tptr;
- int dst_width = d->dst_width;
- if ((zero_mask & ((1 << d->n_input_channels) - 1)) ==
- ((1 << d->n_input_channels) - 1))
- 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;
- set_row_ends(dc, x, 0);
- for (j = 0; j < bits; j++, tptr += length)
- tptr[0] |= bit;
- }
- ADVANCE_UNIDIRECTIONAL(d, bit, gray, 1, xerror, xmod);
- }
-}
-
-static void
-stp_dither_monochrome_very_fast(const unsigned short *gray,
- int row,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- xerror,
- xstep,
- xmod,
- length;
- unsigned char bit,
- *kptr;
- dither_channel_t *dc = &(CHANNEL(d, ECOLOR_K));
- dither_matrix_t *kdither = &(dc->dithermat);
- int dst_width = d->dst_width;
- if ((zero_mask & ((1 << d->n_input_channels) - 1)) ==
- ((1 << d->n_input_channels) - 1))
- return;
- if (!dc->very_fast)
- {
- stp_dither_monochrome(gray, row, d, duplicate_line, 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_fast(d, kdither, x)))
- {
- set_row_ends(dc, x, 0);
- kptr[d->ptr_offset] |= 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,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- length;
- unsigned char bit;
- int dst_width = d->dst_width;
- int xerror, xstep, xmod;
-
- if ((zero_mask & ((1 << d->n_input_channels) - 1)) ==
- ((1 << d->n_input_channels) - 1))
- 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_very_fast(const unsigned short *gray,
- int row,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- length;
- unsigned char bit;
- dither_channel_t *dc = &CHANNEL(d, ECOLOR_K);
- int dst_width = d->dst_width;
- int xerror, xstep, xmod;
- if ((zero_mask & ((1 << d->n_input_channels) - 1)) ==
- ((1 << d->n_input_channels) - 1))
- return;
- if (!dc->very_fast)
- {
- stp_dither_black_fast(gray, row, d, duplicate_line, 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++)
- {
- if (gray[0] > ditherpoint_fast(d, &(dc->dithermat), x))
- {
- set_row_ends(dc, x, 0);
- dc->ptrs[0][d->ptr_offset] |= bit;
- }
- ADVANCE_UNIDIRECTIONAL(d, bit, gray, 1, xerror, xmod);
- }
-}
-
-static void
-stp_dither_black_ordered(const unsigned short *gray,
- int row,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
-
- int x,
- length;
- unsigned char bit;
- int terminate;
- int xerror, xstep, xmod;
-
- if ((zero_mask & ((1 << d->n_input_channels) - 1)) ==
- ((1 << d->n_input_channels) - 1))
- 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,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int i;
- int x,
- length;
- unsigned char bit;
- int ***error;
- int *ndither;
- int terminate;
- int direction = row & 1 ? 1 : -1;
- int xerror, xstep, xmod;
-
- length = (d->dst_width + 7) / 8;
-
- if (!shared_ed_initializer(d, row, duplicate_line, zero_mask, length,
- direction, &error, &ndither))
- return;
-
- 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;
-
- 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], ndither[ECOLOR_K]);
- CHANNEL(d, ECOLOR_K).v = print_color(d, &(CHANNEL(d, ECOLOR_K)), x, row,
- bit, length, 0, d->dither_type);
- ndither[ECOLOR_K] = 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, d->error_rows);
- }
- stp_free(ndither);
- for (i = 1; i < d->n_channels; i++)
- stp_free(error[i]);
- stp_free(error);
- if (direction == -1)
- reverse_row_ends(d);
-}
-
-static void
-stp_dither_black_et(const unsigned short *gray,
- int row,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- length;
- unsigned char bit;
- int i;
- int *ndither;
- eventone_t *et;
- et_chdata_t *cd;
-
- int ***error;
- int terminate;
- int direction = row & 1 ? 1 : -1;
- int xerror, xstep, xmod;
- int aspect = d->y_aspect / d->x_aspect;
-
- if (aspect >= 4) { aspect = 4; }
- else if (aspect >= 2) { aspect = 2; }
- else aspect = 1;
-
- length = (d->dst_width + 7) / 8;
- if (!shared_ed_initializer(d, row, duplicate_line, zero_mask, length,
- direction, &error, &ndither))
- return;
-
- eventone_init(d, &cd);
- et = d->eventone;
-
- 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;
- }
-
- QUANT(6);
- for (; x != terminate; x += direction)
- { int pick, print_inks;
-
- advance_eventone_pre(d, cd, et, x);
-
- { int value = *gray;
- int base = value;
- int maxwet;
-
- CHANNEL(d, ECOLOR_K).b = value;
- CHANNEL(d, ECOLOR_K).v = value;
- CHANNEL(d, ECOLOR_K).o = value;
-
- if ((cd->wetness -= cd->maxdot_dens) < 0) cd->wetness = 0;
-
- value = *ndither + base;
- if (value < 0) value = 0; /* Dither can make this value negative */
-
- maxwet = (CHANNEL(d, ECOLOR_K).b * CHANNEL(d,ECOLOR_K).maxdot >> 1)
- + cd->maxdot_wet - cd->wetness;
-
- find_segment(d, &CHANNEL(d, ECOLOR_K), maxwet, value, &cd->dr);
-
- cd->ri = eventone_adjust(&cd->dr, et, cd->r_sq, base, value);
- }
-
- pick = cd[ECOLOR_K].ri > 32768 ? (1<<ECOLOR_K) : 0;
-
- { if (pick & (1 << ECOLOR_K)) {
- cd->point = cd->dr.upper->value;
- } else {
- cd->point = cd->dr.lower->value;
- }
-
- advance_eventone_post(d, cd, et, x);
-
- print_inks = (1 << ECOLOR_K);
-
- /* Adjust error values for dither */
- ndither[ECOLOR_K] += 2 * (CHANNEL(d, ECOLOR_K).b - cd->point);
- }
-
- /* Now we can finally print it! */
-
- print_all_inks(d, cd, print_inks, pick, bit, length);
-
- QUANT(11);
-
- /* Diffuse the error round a bit */
- diffuse_error(d, ndither, error, aspect, direction);
-
- QUANT(12);
- ADVANCE_BIDIRECTIONAL(d, bit, gray, direction, 1, xerror, xmod, error,
- d->n_channels, ERROR_ROWS);
- QUANT(13);
- }
-
- stp_free(cd);
- stp_free(ndither);
- for (i = 0; i < d->n_channels; i++)
- stp_free(error[i]);
- stp_free(error);
-}
-
-static void
-stp_dither_cmy_fast(const unsigned short *cmy,
- int row,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- length;
- unsigned char bit;
- int i;
- int dst_width = d->dst_width;
- int xerror, xstep, xmod;
-
- if ((zero_mask & ((1 << d->n_input_channels) - 1)) ==
- ((1 << d->n_input_channels) - 1))
- 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 < d->n_channels; 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_very_fast(const unsigned short *cmy,
- int row,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- length;
- unsigned char bit;
- int i;
- int dst_width = d->dst_width;
- int xerror, xstep, xmod;
-
- if ((zero_mask & ((1 << d->n_input_channels) - 1)) ==
- ((1 << d->n_input_channels) - 1))
- return;
-
- for (i = 1; i < d->n_channels; i++)
- if (!(CHANNEL(d, i).very_fast))
- {
- stp_dither_cmy_fast(cmy, row, d, duplicate_line, zero_mask);
- 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 = cmy[0];
- CHANNEL(d, ECOLOR_M).v = cmy[1];
- CHANNEL(d, ECOLOR_Y).v = cmy[2];
-
- for (i = 1; i < d->n_channels; i++)
- {
- dither_channel_t *dc = &(CHANNEL(d, i));
- if (dc->v > ditherpoint_fast(d, &(dc->dithermat), x))
- {
- set_row_ends(dc, x, 0);
- dc->ptrs[0][d->ptr_offset] |= bit;
- }
- }
- QUANT(16);
- ADVANCE_UNIDIRECTIONAL(d, bit, cmy, 3, xerror, xmod);
- QUANT(17);
- }
-}
-
-static void
-stp_dither_cmy_ordered(const unsigned short *cmy,
- int row,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- length;
- unsigned char bit;
- int i;
-
- int terminate;
- int xerror, xstep, xmod;
-
- if ((zero_mask & ((1 << d->n_input_channels) - 1)) ==
- ((1 << d->n_input_channels) - 1))
- 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 < d->n_channels; 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,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- length;
- unsigned char bit;
- int i;
- int *ndither;
- int ***error;
-
- int terminate;
- int direction = row & 1 ? 1 : -1;
- int xerror, xstep, xmod;
-
- length = (d->dst_width + 7) / 8;
-
- if (!shared_ed_initializer(d, row, duplicate_line, zero_mask, length,
- direction, &error, &ndither))
- 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));
-
- 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 < d->n_channels; 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,
- d->n_channels, d->error_rows);
- QUANT(13);
- }
- stp_free(ndither);
- for (i = 1; i < d->n_channels; i++)
- stp_free(error[i]);
- stp_free(error);
- if (direction == -1)
- reverse_row_ends(d);
-}
-
-static void
-stp_dither_cmy_et(const unsigned short *cmy,
- int row,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- length;
- unsigned char bit;
- int i;
- int *ndither;
- eventone_t *et;
- et_chdata_t *cd;
-
- int ***error;
- int terminate;
- int direction = row & 1 ? 1 : -1;
- int xerror, xstep, xmod;
- int aspect = d->y_aspect / d->x_aspect;
-
- if (aspect >= 4) { aspect = 4; }
- else if (aspect >= 2) { aspect = 2; }
- else aspect = 1;
-
- length = (d->dst_width + 7) / 8;
- if (!shared_ed_initializer(d, row, duplicate_line, zero_mask, length,
- direction, &error, &ndither))
- return;
-
- eventone_init(d, &cd);
- et = d->eventone;
-
- 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));
- }
-
- QUANT(6);
- for (; x != terminate; x += direction)
- { int pick, print_inks;
-
- advance_eventone_pre(d, cd, et, x);
-
- for (i=1; i < d->n_channels; i++) {
- int value = cmy[i-1];
-
- CHANNEL(d, i).o = value; /* Remember value we want printed here */
- CHANNEL(d, i).v = value;
- CHANNEL(d, i).b = value;
- }
-
- for (i=1; i < d->n_channels; i++) {
- int value;
- int base;
- int maxwet;
- et_chdata_t *p = &cd[i];
-
- if ((p->wetness -= p->maxdot_dens) < 0) p->wetness = 0;
-
- base = CHANNEL(d, i).b;
- value = ndither[i] + base;
- if (value < 0) value = 0; /* Dither can make this value negative */
-
- maxwet = (CHANNEL(d, i).b * CHANNEL(d, i).maxdot >> 1)
- + p->maxdot_wet - p->wetness;
-
- find_segment(d, &CHANNEL(d, i), maxwet, value, &p->dr);
-
- p->ri = eventone_adjust(&p->dr, et, p->r_sq, base, value);
- }
-
- pick = pick_vertex(cd[ECOLOR_C].ri, cd[ECOLOR_M].ri, cd[ECOLOR_Y].ri, 0);
-
- { for (i=1; i < d->n_channels; i++) {
- if (pick & (1 << i)) {
- cd[i].point = cd[i].dr.upper->value;
- } else {
- cd[i].point = cd[i].dr.lower->value;
- }
- }
-
- advance_eventone_post(d, cd, et, x);
-
- print_inks = (1 << ECOLOR_C)|(1 << ECOLOR_M)|(1<<ECOLOR_Y);
-
- /* Adjust error values for dither */
- for (i=1; i < d->n_channels; i++) {
- ndither[i] += 2 * (CHANNEL(d, i).b - cd[i].point);
- }
- }
-
- /* Now we can finally print it! */
-
- print_all_inks(d, cd, print_inks, pick, bit, length);
-
- QUANT(11);
-
- /* Diffuse the error round a bit */
- diffuse_error(d, ndither, error, aspect, direction);
-
- QUANT(12);
- ADVANCE_BIDIRECTIONAL(d, bit, cmy, direction, 3, xerror, xmod, error,
- d->n_channels, ERROR_ROWS);
- QUANT(13);
- }
-
- stp_free(cd);
- stp_free(ndither);
- for (i = 0; i < d->n_channels; i++)
- stp_free(error[i]);
- stp_free(error);
-}
-
-static void
-stp_dither_cmyk_fast(const unsigned short *cmy,
- int row,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- length;
- unsigned char bit;
- int i;
-
- int dst_width = d->dst_width;
- int xerror, xstep, xmod;
-
- if (!CHANNEL(d, ECOLOR_K).ptrs[0])
- {
- stp_dither_cmy_fast(cmy, row, d, duplicate_line, zero_mask);
- return;
- }
-
- if ((zero_mask & ((1 << d->n_input_channels) - 1)) ==
- ((1 << d->n_input_channels) - 1))
- 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 (k < lb)
- k = 0;
- else if (k < ub)
- k = (k - lb) * ub / d->bound_range;
- for (i = 1; i < d->n_channels; i++)
- CHANNEL(d, i).v -= k;
- ok = k;
- 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 < d->n_channels; 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_very_fast(const unsigned short *cmy,
- int row,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- length;
- unsigned char bit;
- int i;
-
- int dst_width = d->dst_width;
- int xerror, xstep, xmod;
-
- if (!CHANNEL(d, ECOLOR_K).ptrs[0])
- {
- stp_dither_cmy_very_fast(cmy, row, d, duplicate_line, zero_mask);
- return;
- }
-
- if ((zero_mask & ((1 << d->n_input_channels) - 1)) ==
- ((1 << d->n_input_channels) - 1))
- return;
-
- for (i = 0; i < d->n_channels; i++)
- if (!(CHANNEL(d, i).very_fast))
- {
- stp_dither_cmyk_fast(cmy, row, d, duplicate_line, zero_mask);
- 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];
-
- if (nonzero)
- {
- int k = compute_black(d);
- for (i = 1; i < d->n_channels; i++)
- CHANNEL(d, i).v -= k;
- QUANT(15);
- CHANNEL(d, ECOLOR_K).v = k;
-
- for (i = 0; i < d->n_channels; i++)
- {
- dither_channel_t *dc = &(CHANNEL(d, i));
- if (dc->v > ditherpoint_fast(d, &(dc->dithermat), x))
- {
- set_row_ends(dc, x, 0);
- dc->ptrs[0][d->ptr_offset] |= bit;
- }
- }
- QUANT(16);
- }
- ADVANCE_UNIDIRECTIONAL(d, bit, cmy, 3, xerror, xmod);
- QUANT(17);
- }
-}
-
-static void
-stp_dither_cmyk_ordered(const unsigned short *cmy,
- int row,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- length;
- unsigned char bit;
- int i;
-
- int terminate;
- int xerror, xstep, xmod;
-
- if (!CHANNEL(d, ECOLOR_K).ptrs[0])
- {
- stp_dither_cmy_ordered(cmy, row, d, duplicate_line, zero_mask);
- return;
- }
-
- if ((zero_mask & ((1 << d->n_input_channels) - 1)) ==
- ((1 << d->n_input_channels) - 1))
- 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 < d->n_channels; 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 < d->n_channels; 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,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- length;
- unsigned char bit;
- int i;
- int *ndither;
- int ***error;
-
- int terminate;
- int direction = row & 1 ? 1 : -1;
- int xerror, xstep, xmod;
-
- if (!CHANNEL(d, ECOLOR_K).ptrs[0])
- {
- stp_dither_cmy_ed(cmy, row, d, duplicate_line, zero_mask);
- return;
- }
-
- length = (d->dst_width + 7) / 8;
- if (!shared_ed_initializer(d, row, duplicate_line, zero_mask, length,
- direction, &error, &ndither))
- 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));
-
- 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 < d->n_channels; 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 < d->n_channels; 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 < d->n_channels; 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 < d->n_channels; i++)
- CHANNEL(d, i).v = UPDATE_COLOR(CHANNEL(d, i).v, ndither[i]);
-
- QUANT(11);
- for (i = 0; i < d->n_channels; 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,
- d->n_channels, d->error_rows);
- QUANT(13);
- }
- stp_free(ndither);
- for (i = 1; i < d->n_channels; i++)
- stp_free(error[i]);
- stp_free(error);
- if (direction == -1)
- reverse_row_ends(d);
-}
-
-/* This code uses the Eventone dither algorithm. This is described
- * at the website http://www.artofcode.com/eventone/
- * This algorithm is covered by US Patents 5,055,942 and 5,917,614
- * and was invented by Raph Levien <raph@acm.org>
- * It was made available to be used free of charge in open source
- * code.
- */
-
-static void
-stp_dither_cmyk_et(const unsigned short *cmy,
- int row,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- length;
- unsigned char bit;
- int i;
- int *ndither;
- eventone_t *et;
- et_chdata_t *cd;
-
- int ***error;
- int terminate;
- int direction = row & 1 ? 1 : -1;
- int xerror, xstep, xmod;
- int aspect = d->y_aspect / d->x_aspect;
-
- if (!CHANNEL(d, ECOLOR_K).ptrs[0])
- {
- stp_dither_cmy_et(cmy, row, d, duplicate_line, zero_mask);
- return;
- }
-
- if (aspect >= 4) { aspect = 4; }
- else if (aspect >= 2) { aspect = 2; }
- else aspect = 1;
-
- length = (d->dst_width + 7) / 8;
- if (!shared_ed_initializer(d, row, duplicate_line, zero_mask, length,
- direction, &error, &ndither))
- return;
-
- eventone_init(d, &cd);
- et = d->eventone;
-
- 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));
- }
-
- QUANT(6);
- for (; x != terminate; x += direction)
- { int pick, print_inks;
-
- advance_eventone_pre(d, cd, et, x);
-
- CHANNEL(d, ECOLOR_K).b = 0;
-
- for (i=1; i < d->n_channels; i++) {
- int value = cmy[i-1];
-
- CHANNEL(d, i).o = value; /* Remember value we want printed here */
- CHANNEL(d, i).v = value;
- if (i == 1 || value < CHANNEL(d, ECOLOR_K).o)
- CHANNEL(d, ECOLOR_K).o = value; /* Set black to minimum of C,M,Y */
- }
-
- CHANNEL(d, ECOLOR_K).v = CHANNEL(d, ECOLOR_K).o;
- if (CHANNEL(d, ECOLOR_K).v > 0) {
- update_cmyk(d);
- }
-
- for (i = 1; i < d->n_channels; i++)
- CHANNEL(d, i).b = CHANNEL(d, i).v;
-
- for (i=0; i < d->n_channels; i++) {
- int base;
- int value;
- int maxwet;
- et_chdata_t *p = &cd[i];
-
- if ((p->wetness -= p->maxdot_dens) < 0) p->wetness = 0;
-
- base = CHANNEL(d, i).b;
- value = ndither[i] + base;
- if (value < 0) value = 0; /* Dither can make this value negative */
-
- maxwet = (CHANNEL(d, i).b * CHANNEL(d, i).maxdot >> 1)
- + p->maxdot_wet - p->wetness;
-
- find_segment(d, &CHANNEL(d, i), maxwet, value, &p->dr);
-
- p->ri = eventone_adjust(&p->dr, et, p->r_sq, base, value);
- }
-
- pick = pick_vertex(cd[ECOLOR_C].ri, cd[ECOLOR_M].ri, cd[ECOLOR_Y].ri, cd[ECOLOR_K].ri);
-
- { int useblack = 0; /* Do we print black at all? */
- int printed_black;
- int adjusted_black;
-
- for (i=0; i < d->n_channels; i++) {
- if (pick & (1 << i)) {
- cd[i].point = cd[i].dr.upper->value;
- } else {
- cd[i].point = cd[i].dr.lower->value;
- }
- }
-
- printed_black = cd[ECOLOR_K].point;
- adjusted_black = printed_black;
- if (printed_black > 0 && d->black_density != d->density) {
- adjusted_black = (unsigned)printed_black * (unsigned)d->density / d->black_density;
- }
-
- advance_eventone_post(d, cd, et, x);
-
- /* Only print the black ink if it means we can avoid printing another ink, otherwise we're just wasting ink */
-
- if (printed_black > 0) {
- for (i=1; i < d->n_channels; i++) {
- if (cd[i].point <= adjusted_black) {
- useblack = 1;
- break;
- }
- }
- }
-
- /* Find which channels we actually print */
-
- /* Adjust colours to print based on black ink */
- if (useblack) {
- print_inks = (1 << ECOLOR_K);
- for (i=1; i < d->n_channels; i++) {
- if (cd[i].point > adjusted_black) {
- print_inks |= (1 << i);
- }
- }
- } else {
- print_inks = (1 << ECOLOR_C)|(1 << ECOLOR_M)|(1<<ECOLOR_Y);
- }
-
- /* Adjust error values for dither */
- ndither[ECOLOR_K] += 2 * (CHANNEL(d, ECOLOR_K).b - printed_black);
- for (i=1; i < d->n_channels; i++) {
- ndither[i] += 2 * (CHANNEL(d, i).b - cd[i].point);
- }
- }
-
- /* Now we can finally print it! */
-
- print_all_inks(d, cd, print_inks, pick, bit, length);
-
- QUANT(11);
-
- /* Diffuse the error round a bit */
- diffuse_error(d, ndither, error, aspect, direction);
-
- QUANT(12);
- ADVANCE_BIDIRECTIONAL(d, bit, cmy, direction, 3, xerror, xmod, error,
- d->n_channels, ERROR_ROWS);
- QUANT(13);
- }
-
- stp_free(cd);
- stp_free(ndither);
- for (i = 0; i < d->n_channels; i++)
- stp_free(error[i]);
- stp_free(error);
-}
-
-static void
-stp_dither_raw_cmyk_fast(const unsigned short *cmyk,
- int row,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- length;
- unsigned char bit;
- int i;
-
- int dst_width = d->dst_width;
- int xerror, xstep, xmod;
- if ((zero_mask & ((1 << d->n_input_channels) - 1)) ==
- ((1 << d->n_input_channels) - 1))
- 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 < d->n_channels; 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_very_fast(const unsigned short *cmyk,
- int row,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- length;
- unsigned char bit;
- int i;
-
- int dst_width = d->dst_width;
- int xerror, xstep, xmod;
- if ((zero_mask & ((1 << d->n_input_channels) - 1)) ==
- ((1 << d->n_input_channels) - 1))
- return;
-
- for (i = 0; i < d->n_channels; i++)
- if (!(CHANNEL(d, i).very_fast))
- {
- stp_dither_raw_cmyk_fast(cmyk, row, d, duplicate_line, zero_mask);
- 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 < d->n_channels; i++)
- {
- dither_channel_t *dc = &(CHANNEL(d, i));
- if (dc->ptrs[0] && dc->v > ditherpoint_fast(d, &(dc->dithermat), x))
- {
- set_row_ends(dc, x, 0);
- dc->ptrs[0][d->ptr_offset] |= bit;
- }
- }
- 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,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- length;
- unsigned char bit;
- int i;
-
- int terminate;
- int xerror, xstep, xmod;
-
- if ((zero_mask & ((1 << d->n_input_channels) - 1)) ==
- ((1 << d->n_input_channels) - 1))
- 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 < d->n_channels; 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,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- length;
- unsigned char bit;
- int i;
- int *ndither;
- int ***error;
-
- int terminate;
- int direction = row & 1 ? 1 : -1;
- int xerror, xstep, xmod;
-
- length = (d->dst_width + 7) / 8;
- if (!shared_ed_initializer(d, row, duplicate_line, zero_mask, length,
- direction, &error, &ndither))
- return;
-
- 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));
-
- 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 < d->n_channels; 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,
- d->n_channels, d->error_rows);
- QUANT(13);
- }
- stp_free(ndither);
- for (i = 1; i < d->n_channels; i++)
- stp_free(error[i]);
- stp_free(error);
- if (direction == -1)
- reverse_row_ends(d);
-}
-
-static void
-stp_dither_raw_cmyk_et(const unsigned short *cmyk,
- int row,
- dither_t *d,
- int duplicate_line,
- int zero_mask)
-{
- int x,
- length;
- unsigned char bit;
- int i;
- int *ndither;
- eventone_t *et;
- et_chdata_t *cd;
-
- int ***error;
- int terminate;
- int direction = row & 1 ? 1 : -1;
- int xerror, xstep, xmod;
- int aspect = d->y_aspect / d->x_aspect;
-
- if (aspect >= 4) { aspect = 4; }
- else if (aspect >= 2) { aspect = 2; }
- else aspect = 1;
-
- length = (d->dst_width + 7) / 8;
- if (!shared_ed_initializer(d, row, duplicate_line, zero_mask, length,
- direction, &error, &ndither))
- return;
-
- eventone_init(d, &cd);
- et = d->eventone;
-
- 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));
- }
-
- QUANT(6);
- for (; x != terminate; x += direction)
- { int pick, print_inks;
-
- advance_eventone_pre(d, cd, et, x);
-
- { int value = cmyk[3]; /* Order of input is C,M,Y,K */
- CHANNEL(d, ECOLOR_K).o = value; /* Remember value we want printed here */
- CHANNEL(d, ECOLOR_K).v = value;
- CHANNEL(d, ECOLOR_K).b = value;
- }
-
- for (i=1; i < d->n_channels; i++) {
- int value = cmyk[i-1];
- CHANNEL(d, i).o = value; /* Remember value we want printed here */
- CHANNEL(d, i).v = value;
- CHANNEL(d, i).b = value;
- }
-
- for (i=0; i < d->n_channels; i++) {
- int value;
- int base;
- int maxwet;
- et_chdata_t *p = &cd[i];
-
- if ((p->wetness -= p->maxdot_dens) < 0) p->wetness = 0;
-
- base = CHANNEL(d, i).b;
- value = ndither[i] + base;
- if (value < 0) value = 0; /* Dither can make this value negative */
-
- maxwet = (CHANNEL(d, i).b * CHANNEL(d, i).maxdot >> 1)
- + p->maxdot_wet - p->wetness;
-
- find_segment(d, &CHANNEL(d, i), maxwet, value, &p->dr);
-
- p->ri = eventone_adjust(&p->dr, et, p->r_sq, base, value);
- }
-
- pick = pick_vertex(cd[ECOLOR_C].ri, cd[ECOLOR_M].ri, cd[ECOLOR_Y].ri, cd[ECOLOR_K].ri);
-
- { int useblack = 0; /* Do we print black at all? */
- int printed_black;
- int adjusted_black;
-
- for (i=0; i < d->n_channels; i++) {
- if (pick & (1 << i)) {
- cd[i].point = cd[i].dr.upper->value;
- } else {
- cd[i].point = cd[i].dr.lower->value;
- }
- }
-
- printed_black = cd[ECOLOR_K].point;
- adjusted_black = printed_black;
- if (printed_black > 0 && d->black_density != d->density) {
- adjusted_black = (unsigned)printed_black * (unsigned)d->density / d->black_density;
- }
-
- advance_eventone_post(d, cd, et, x);
-
- /* Only print the black ink if it means we can avoid printing another ink, otherwise we're just wasting ink */
-
- if (printed_black > 0) {
- for (i=1; i < d->n_channels; i++) {
- if (cd[i].point <= adjusted_black) {
- useblack = 1;
- break;
- }
- }
- }
-
- /* Find which channels we actually print */
-
- /* Adjust colours to print based on black ink */
- if (useblack) {
- print_inks = (1 << ECOLOR_K);
- for (i=1; i < d->n_channels; i++) {
- if (cd[i].point > adjusted_black) {
- print_inks |= (1 << i);
- }
- }
- } else {
- print_inks = (1 << ECOLOR_C)|(1 << ECOLOR_M)|(1<<ECOLOR_Y);
- }
-
- /* Adjust error values for dither */
- ndither[ECOLOR_K] += 2 * (CHANNEL(d, ECOLOR_K).b - printed_black);
- for (i=1; i < d->n_channels; i++) {
- ndither[i] += 2 * (CHANNEL(d, i).b - cd[i].point);
- }
- }
-
- /* Now we can finally print it! */
-
- print_all_inks(d, cd, print_inks, pick, bit, length);
-
- QUANT(11);
-
- /* Diffuse the error round a bit */
- diffuse_error(d, ndither, error, aspect, direction);
-
- QUANT(12);
- ADVANCE_BIDIRECTIONAL(d, bit, cmyk, direction, 4, xerror, xmod, error,
- d->n_channels, ERROR_ROWS);
- QUANT(13);
- }
-
- stp_free(cd);
- stp_free(ndither);
- for (i = 0; i < d->n_channels; i++)
- stp_free(error[i]);
- stp_free(error);
-}
-
-void
-stp_dither(const unsigned short *input,
- int row,
- void *vd,
- stp_dither_data_t *dt,
- int duplicate_line,
- int zero_mask)
-{
- int i, j;
- dither_t *d = (dither_t *) vd;
- for (i = 0; i < d->n_channels; i++)
- {
- for (j = 0; j < CHANNEL(d, i).subchannels; j++)
- {
- if (i >= dt->channel_count || j >= dt->c[i].subchannel_count)
- CHANNEL(d, i).ptrs[j] = NULL;
- else
- CHANNEL(d, i).ptrs[j] = dt->c[i].c[j];
- if (CHANNEL(d, i).ptrs[j])
- memset(CHANNEL(d, i).ptrs[j], 0,
- (d->dst_width + 7) / 8 * CHANNEL(d, i).signif_bits);
- CHANNEL(d, i).row_ends[0][j] = -1;
- CHANNEL(d, i).row_ends[1][j] = -1;
- }
- stp_matrix_set_row(&(CHANNEL(d, i).dithermat), row);
- stp_matrix_set_row(&(CHANNEL(d, i).pick), row);
- }
- d->ptr_offset = 0;
- (d->ditherfunc)(input, row, d, duplicate_line, zero_mask);
-}
diff --git a/src/main/print-dither.h b/src/main/print-dither.h
deleted file mode 100644
index cafb2be..0000000
--- a/src/main/print-dither.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * "$Id: print-dither.h,v 1.1.4.1 2002/05/03 01:30:28 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_DITHER_H_
-#define _GIMP_PRINT_DITHER_H_
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gimp-print/gimp-print.h>
-#include "gimp-print-internal.h"
-
-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;
-
-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;
-
-extern void stp_init_iterated_matrix(dither_matrix_t *mat, size_t size,
- size_t exp, const unsigned *array);
-extern void stp_shear_matrix(dither_matrix_t *mat, int x_shear, int y_shear);
-extern void stp_init_matrix(dither_matrix_t *mat, int x_size, int y_size,
- const unsigned int *array, int transpose,
- int prescaled);
-extern void stp_init_matrix_short(dither_matrix_t *mat, int x_size, int y_size,
- const unsigned short *array, int transpose,
- int prescaled);
-extern void stp_destroy_matrix(dither_matrix_t *mat);
-extern void stp_clone_matrix(const dither_matrix_t *src, dither_matrix_t *dest,
- int x_offset, int y_offset);
-extern void stp_copy_matrix(const dither_matrix_t *src, dither_matrix_t *dest);
-extern void stp_exponential_scale_matrix(dither_matrix_t *mat,double exponent);
-extern void stp_matrix_set_row(dither_matrix_t *mat, int y);
-
-#endif /* _GIMP_PRINT_DITHER_H_ */
diff --git a/src/main/print-escp2-data.c b/src/main/print-escp2-data.c
index 62a02ef..aa32b58 100644
--- a/src/main/print-escp2-data.c
+++ b/src/main/print-escp2-data.c
@@ -1,5 +1,5 @@
/*
- * "$Id: print-escp2-data.c,v 1.15.4.45 2004/04/12 10:33:44 rlk Exp $"
+ * "$Id: print-escp2-data.c,v 1.177 2005/06/26 22:08:01 rlk Exp $"
*
* Print plug-in EPSON ESC/P2 driver for the GIMP.
*
@@ -24,4178 +24,260 @@
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#include <gimp-print/gimp-print.h>
-#include "gimp-print-internal.h"
-#include <gimp-print/gimp-print-intl-internal.h>
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
#include "print-escp2.h"
-static const double standard_sat_adjustment[49] =
-{
- 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, /* C */
- 1.8, 1.9, 1.9, 1.9, 1.7, 1.5, 1.3, 1.1, /* B */
- 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 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.1, 1.2, 1.3, 1.4, 1.5, /* Y */
- 1.5, 1.4, 1.3, 1.2, 1.1, 1.0, 1.0, 1.0, /* G */
- 1.0 /* C */
-};
-
-static const double standard_lum_adjustment[49] =
-{
- 0.50, 0.6, 0.7, 0.8, 0.9, 0.86, 0.82, 0.79, /* C */
- 0.78, 0.8, 0.83, 0.87, 0.9, 0.95, 1.05, 1.15, /* B */
- 1.3, 1.25, 1.2, 1.15, 1.12, 1.09, 1.06, 1.03, /* M */
- 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, /* R */
- 1.0, 0.9, 0.8, 0.7, 0.65, 0.6, 0.55, 0.52, /* Y */
- 0.48, 0.47, 0.47, 0.49, 0.49, 0.49, 0.52, 0.51, /* G */
- 0.50 /* C */
-};
-
-static const double standard_hue_adjustment[49] =
-{
- 0.00, 0.05, 0.04, 0.01, -.03, -.10, -.18, -.26, /* C */
- -.35, -.43, -.40, -.32, -.25, -.18, -.10, -.07, /* B */
- 0.00, -.04, -.09, -.13, -.18, -.23, -.27, -.31, /* M */
- -.35, -.38, -.30, -.23, -.15, -.08, 0.00, -.02, /* R */
- 0.00, 0.08, 0.10, 0.08, 0.05, 0.03, -.03, -.12, /* Y */
- -.20, 0.17, -.20, -.17, -.15, -.12, -.10, -.08, /* G */
- 0.00, /* C */
-};
-
-static const double plain_paper_lum_adjustment[49] =
-{
- 1.2, 1.22, 1.28, 1.34, 1.39, 1.42, 1.45, 1.48, /* C */
- 1.5, 1.4, 1.3, 1.25, 1.2, 1.1, 1.05, 1.05, /* B */
- 1.05, 1.05, 1.05, 1.05, 1.05, 1.05, 1.05, 1.05, /* M */
- 1.05, 1.05, 1.05, 1.1, 1.1, 1.1, 1.1, 1.1, /* R */
- 1.1, 1.15, 1.3, 1.45, 1.6, 1.75, 1.9, 2.0, /* Y */
- 2.1, 2.0, 1.8, 1.7, 1.6, 1.5, 1.4, 1.3, /* G */
- 1.2 /* C */
-};
-
-static const double pgpp_sat_adjustment[49] =
-{
- 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, /* C */
- 1.00, 1.00, 1.00, 1.03, 1.05, 1.07, 1.09, 1.11, /* B */
- 1.13, 1.13, 1.13, 1.13, 1.13, 1.13, 1.13, 1.13, /* M */
- 1.13, 1.10, 1.05, 1.00, 1.00, 1.00, 1.00, 1.00, /* R */
- 1.00, 1.00, 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, /* C */
-};
-
-static const double pgpp_lum_adjustment[49] =
-{
- 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, /* C */
- 1.00, 1.00, 1.00, 1.03, 1.05, 1.07, 1.09, 1.11, /* B */
- 1.13, 1.13, 1.13, 1.13, 1.13, 1.13, 1.13, 1.13, /* M */
- 1.13, 1.10, 1.05, 1.00, 1.00, 1.00, 1.00, 1.00, /* R */
- 1.00, 1.00, 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, /* C */
-};
-
-static const double pgpp_hue_adjustment[49] =
-{
- 0.00, 0.00, 0.00, 0.00, 0.00, 0.01, 0.02, 0.03, /* C */
- 0.05, 0.05, 0.05, 0.04, 0.04, 0.03, 0.02, 0.01, /* B */
- 0.00, -.03, -.05, -.07, -.09, -.11, -.13, -.14, /* M */
- -.15, -.13, -.10, -.06, -.04, -.02, -.01, 0.00, /* R */
- 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, /* Y */
- 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, /* G */
- 0.00, /* C */
-};
-
-#define DECLARE_INK(name, density) \
-static const escp2_variable_ink_t name##_ink = \
-{ \
- name##_dither_ranges, \
- sizeof(name##_dither_ranges) / sizeof(stp_simple_dither_range_t), \
- density \
-}
-
-#define PIEZO_0 .25
-#define PIEZO_1 .5
-#define PIEZO_2 .75
-#define PIEZO_3 1.0
-
-#define PIEZO_DENSITY 1.0
-
-/***************************************************************\
-* *
-* SINGLE DOT SIZE *
-* *
-\***************************************************************/
-
-static const stp_simple_dither_range_t photo_cyan_dither_ranges[] =
-{
- { 0.27, 0x1, 1, 1 },
- { 1.0, 0x1, 0, 1 }
-};
-
-DECLARE_INK(photo_cyan, 1.0);
-
-static const stp_simple_dither_range_t photo_magenta_dither_ranges[] =
-{
- { 0.35, 0x1, 1, 1 },
- { 1.0, 0x1, 0, 1 }
-};
-
-DECLARE_INK(photo_magenta, 1.0);
-
-static const stp_simple_dither_range_t photo2_yellow_dither_ranges[] =
-{
- { 0.35, 0x1, 1, 1 },
- { 1.0, 0x1, 0, 1 }
-};
-
-DECLARE_INK(photo2_yellow, 1.0);
-
-static const stp_simple_dither_range_t photo2_black_dither_ranges[] =
-{
- { 0.27, 0x1, 1, 1 },
- { 1.0, 0x1, 0, 1 }
-};
-
-DECLARE_INK(photo2_black, 1.0);
-
-static const stp_simple_dither_range_t piezo_quadtone_dither_ranges[] =
-{
- { PIEZO_0, 0x1, 0, 1 },
- { PIEZO_1, 0x1, 1, 1 },
- { PIEZO_2, 0x1, 2, 1 },
- { PIEZO_3, 0x1, 3, 1 },
-};
-
-DECLARE_INK(piezo_quadtone, PIEZO_DENSITY);
-
-/***************************************************************\
-* *
-* LOW RESOLUTION, 4 AND 6 PICOLITRE PRINTERS *
-* *
-\***************************************************************/
-
-static const stp_simple_dither_range_t standard_multishot_dither_ranges[] =
-{
- { 0.28, 0x1, 0, 2 },
- { 0.58, 0x2, 0, 4 },
- { 1.0, 0x3, 0, 7 }
-};
-
-DECLARE_INK(standard_multishot, 1.0);
-
-static const stp_simple_dither_range_t photo_multishot_dither_ranges[] =
-{
- { 0.0728, 0x1, 1, 1 },
- { 0.151, 0x2, 1, 2 },
- { 0.26, 0x3, 1, 3 },
- { 1.0, 0x3, 0, 3 }
-};
-
-DECLARE_INK(photo_multishot, 1.0);
-
-static const stp_simple_dither_range_t photo_multishot_y_dither_ranges[] =
-{
- { 0.140, 0x1, 0, 1 },
- { 0.290, 0x2, 0, 2 },
- { 0.5, 0x3, 0, 3 },
- { 1.0, 0x3, 1, 3 }
-};
-
-DECLARE_INK(photo_multishot_y, 1.0);
-
-static const stp_simple_dither_range_t piezo_multishot_quadtone_dither_ranges[] =
-{
- { PIEZO_0 * .28, 0x1, 0, 2 },
- { PIEZO_0 * .58, 0x2, 0, 4 },
- { PIEZO_1 * .58, 0x2, 1, 4 },
- { PIEZO_2 * .58, 0x2, 2, 4 },
- { PIEZO_2 * 1.0, 0x3, 2, 7 },
- { PIEZO_3 * 1.0, 0x3, 3, 7 },
-};
-
-DECLARE_INK(piezo_multishot_quadtone, PIEZO_DENSITY);
-
-/***************************************************************\
-* *
-* 4 AND 6 PICOLITRE PRINTERS, 6 PICOLITRE DOTS *
-* *
-\***************************************************************/
-
-static const stp_simple_dither_range_t standard_6pl_dither_ranges[] =
-{
- { 0.25, 0x1, 0, 1 },
- { 0.5, 0x2, 0, 2 },
- { 1.0, 0x3, 0, 4 }
-};
-
-DECLARE_INK(standard_6pl, 1.0);
-
-static const stp_simple_dither_range_t standard_6pl_1440_dither_ranges[] =
-{
- { 0.5, 0x1, 0, 1 },
- { 1.0, 0x2, 0, 2 },
-};
-
-DECLARE_INK(standard_6pl_1440, 1.0);
-
-static const stp_simple_dither_range_t standard_6pl_2880_dither_ranges[] =
-{
- { 1.0, 0x1, 0, 1 },
-};
-
-DECLARE_INK(standard_6pl_2880, 1.0);
-
-static const stp_simple_dither_range_t photo_6pl_dither_ranges[] =
-{
- { 0.065, 0x1, 1, 1 },
- { 0.13, 0x2, 1, 2 },
-/* { 0.26, 0x3, 1, 4 }, */
- { 0.25, 0x1, 0, 1 },
- { 0.5, 0x2, 0, 2 },
- { 1.0, 0x3, 0, 4 }
-};
-
-DECLARE_INK(photo_6pl, 1.0);
-
-static const stp_simple_dither_range_t photo_6pl_y_dither_ranges[] =
-{
- { 0.125, 0x1, 0, 1 },
- { 0.25, 0x2, 0, 2 },
- { 0.5, 0x2, 1, 2 },
- { 1.0, 0x3, 1, 4 }
-};
-
-DECLARE_INK(photo_6pl_y, 1.0);
-
-static const stp_simple_dither_range_t photo_6pl_1440_dither_ranges[] =
-{
- { 0.13, 0x1, 1, 1 },
- { 0.26, 0x2, 1, 2 },
-/* { 0.52, 0x3, 1, 4 }, */
- { 0.5, 0x1, 0, 1 },
- { 1.0, 0x2, 0, 2 },
-};
-
-DECLARE_INK(photo_6pl_1440, 1.0);
-
-static const stp_simple_dither_range_t photo_6pl_2880_dither_ranges[] =
-{
- { 0.26, 0x1, 1, 1 },
- { 1.0, 0x1, 0, 1 },
-};
-
-DECLARE_INK(photo_6pl_2880, 1.0);
-
-static const stp_simple_dither_range_t piezo_6pl_quadtone_dither_ranges[] =
-{
- { PIEZO_0 * .25, 0x1, 0, 1 },
- { PIEZO_0 * .50, 0x2, 0, 2 },
- { PIEZO_1 * .50, 0x2, 1, 2 },
- { PIEZO_2 * .50, 0x2, 2, 2 },
- { PIEZO_2 * 1.0, 0x3, 2, 4 },
- { PIEZO_3 * 1.0, 0x3, 3, 4 },
-};
-
-DECLARE_INK(piezo_6pl_quadtone, PIEZO_DENSITY);
-
-static const stp_simple_dither_range_t piezo_6pl_1440_quadtone_dither_ranges[] =
-{
- { PIEZO_0 * .50, 0x1, 0, 1 },
- { PIEZO_1 * .50, 0x1, 1, 1 },
- { PIEZO_2 * .50, 0x1, 2, 1 },
- { PIEZO_2 * 1.0, 0x2, 2, 2 },
- { PIEZO_3 * 1.0, 0x2, 3, 2 },
-};
-
-DECLARE_INK(piezo_6pl_1440_quadtone, PIEZO_DENSITY);
-
-static const stp_simple_dither_range_t piezo_6pl_2880_quadtone_dither_ranges[] =
-{
- { PIEZO_0 * 1.0, 0x1, 0, 1 },
- { PIEZO_1 * 1.0, 0x1, 1, 1 },
- { PIEZO_2 * 1.0, 0x1, 2, 1 },
- { PIEZO_3 * 1.0, 0x1, 3, 1 },
-};
-
-DECLARE_INK(piezo_6pl_2880_quadtone, PIEZO_DENSITY);
-
-
-/***************************************************************\
-* *
-* STYLUS COLOR 480/580 *
-* *
-\***************************************************************/
-
-static const stp_simple_dither_range_t standard_x80_multishot_dither_ranges[] =
-{
- { 0.163, 0x1, 0, 1 },
- { 0.5, 0x2, 0, 3 },
- { 1.0, 0x3, 0, 6 }
-};
-
-DECLARE_INK(standard_x80_multishot, 1.0);
-
-static const stp_simple_dither_range_t standard_x80_6pl_dither_ranges[] =
-{
- { 0.325, 0x1, 0, 2 },
- { 0.5, 0x2, 0, 3 },
- { 1.0, 0x3, 0, 6 }
-};
-
-DECLARE_INK(standard_x80_6pl, 1.0);
-
-static const stp_simple_dither_range_t standard_x80_1440_6pl_dither_ranges[] =
-{
- { 0.65, 0x1, 0, 2 },
- { 1.0, 0x2, 0, 3 },
-};
-
-DECLARE_INK(standard_x80_1440_6pl, 1.0);
-
-static const stp_simple_dither_range_t standard_x80_2880_6pl_dither_ranges[] =
-{
- { 1.00, 0x1, 0, 1 },
-};
-
-DECLARE_INK(standard_x80_2880_6pl, 1.0);
-
-static const stp_simple_dither_range_t piezo_x80_multishot_quadtone_dither_ranges[] =
-{
- { PIEZO_0 * .163, 0x1, 0, 1 },
- { PIEZO_0 * .500, 0x2, 0, 3 },
- { PIEZO_1 * .500, 0x2, 1, 3 },
- { PIEZO_2 * .500, 0x2, 2, 3 },
- { PIEZO_2 * 1.00, 0x3, 2, 6 },
- { PIEZO_3 * 1.00, 0x3, 3, 6 },
-};
-
-DECLARE_INK(piezo_x80_multishot_quadtone, PIEZO_DENSITY);
-
-static const stp_simple_dither_range_t piezo_x80_6pl_quadtone_dither_ranges[] =
-{
- { PIEZO_0 * .325, 0x1, 0, 2 },
- { PIEZO_0 * .500, 0x2, 0, 3 },
- { PIEZO_1 * .500, 0x2, 1, 3 },
- { PIEZO_2 * .500, 0x2, 2, 3 },
- { PIEZO_2 * 1.00, 0x3, 2, 6 },
- { PIEZO_3 * 1.00, 0x3, 3, 6 },
-};
-
-DECLARE_INK(piezo_x80_6pl_quadtone, PIEZO_DENSITY);
-
-static const stp_simple_dither_range_t piezo_x80_1440_6pl_quadtone_dither_ranges[] =
-{
- { PIEZO_0 * .650, 0x1, 0, 2 },
- { PIEZO_1 * .650, 0x1, 1, 2 },
- { PIEZO_2 * .650, 0x1, 2, 2 },
- { PIEZO_2 * 1.00, 0x2, 2, 3 },
- { PIEZO_3 * 1.00, 0x2, 3, 3 },
-};
-
-DECLARE_INK(piezo_x80_1440_6pl_quadtone, PIEZO_DENSITY);
-
-static const stp_simple_dither_range_t piezo_x80_2880_6pl_quadtone_dither_ranges[] =
-{
- { PIEZO_0 * 1.00, 0x1, 0, 1 },
- { PIEZO_1 * 1.00, 0x1, 1, 1 },
- { PIEZO_2 * 1.00, 0x1, 2, 1 },
- { PIEZO_3 * 1.00, 0x1, 3, 1 },
-};
-
-DECLARE_INK(piezo_x80_2880_6pl_quadtone, PIEZO_DENSITY);
-
-
-/***************************************************************\
-* *
-* STYLUS COLOR 680/777
-* *
-\***************************************************************/
-
-static const stp_simple_dither_range_t standard_680_multishot_dither_ranges[] =
-{
- { 0.375, 0x1, 0, 3 },
- { 0.75, 0x2, 0, 6 },
- { 1.0, 0x3, 0, 8 }
-};
-
-DECLARE_INK(standard_680_multishot, 1.0);
-
-static const stp_simple_dither_range_t standard_680_6pl_dither_ranges[] =
-{
- { 0.50, 0x1, 0, 3 },
- { 0.66, 0x2, 0, 4 },
- { 1.0, 0x3, 0, 6 }
-};
-
-DECLARE_INK(standard_680_6pl, 1.0);
-
-static const stp_simple_dither_range_t piezo_680_multishot_quadtone_dither_ranges[] =
-{
- { PIEZO_0 * .375, 0x1, 0, 3 },
- { PIEZO_0 * .750, 0x2, 0, 6 },
- { PIEZO_1 * .750, 0x2, 1, 6 },
- { PIEZO_2 * .750, 0x2, 2, 6 },
- { PIEZO_2 * 1.00, 0x3, 2, 8 },
- { PIEZO_3 * 1.00, 0x3, 3, 8 },
-};
-
-DECLARE_INK(piezo_680_multishot_quadtone, PIEZO_DENSITY);
-
-static const stp_simple_dither_range_t piezo_680_6pl_quadtone_dither_ranges[] =
-{
- { PIEZO_0 * .500, 0x1, 0, 3 },
- { PIEZO_1 * .660, 0x2, 1, 4 },
- { PIEZO_2 * .660, 0x2, 2, 4 },
- { PIEZO_2 * 1.00, 0x2, 3, 6 },
- { PIEZO_3 * 1.00, 0x3, 3, 6 },
-};
-
-DECLARE_INK(piezo_680_6pl_quadtone, PIEZO_DENSITY);
-
-
-/***************************************************************\
-* *
-* 4 PICOLITRE DOTS *
-* *
-\***************************************************************/
-
-static const stp_simple_dither_range_t standard_4pl_dither_ranges[] =
-{
- { 0.661, 0x1, 0, 2 },
- { 1.00, 0x2, 0, 3 }
-};
-
-DECLARE_INK(standard_4pl, 1.0);
-
-static const stp_simple_dither_range_t standard_4pl_2880_dither_ranges[] =
-{
- { 1.00, 0x1, 0, 1 },
-};
-
-DECLARE_INK(standard_4pl_2880, 1.0);
-
-static const stp_simple_dither_range_t photo_4pl_dither_ranges[] =
-{
- { 0.17, 0x1, 1, 2 },
- { 0.26, 0x2, 1, 3 },
- { 0.661, 0x1, 0, 2 },
- { 1.00, 0x2, 0, 3 }
-};
-
-DECLARE_INK(photo_4pl, 1.0);
-
-static const stp_simple_dither_range_t photo_4pl_y_dither_ranges[] =
-{
- { 0.330, 0x1, 0, 2 },
- { 0.50, 0x2, 0, 3 },
- { 0.661, 0x1, 1, 2 },
- { 1.00, 0x2, 1, 3 }
-};
-
-DECLARE_INK(photo_4pl_y, 1.0);
-
-static const stp_simple_dither_range_t photo_4pl_2880_dither_ranges[] =
-{
- { 0.26, 0x1, 1, 1 },
- { 1.00, 0x1, 0, 1 },
-};
-
-DECLARE_INK(photo_4pl_2880, 1.0);
-
-static const stp_simple_dither_range_t piezo_4pl_quadtone_dither_ranges[] =
-{
- { PIEZO_0 * .661, 0x1, 0, 2 },
- { PIEZO_1 * .661, 0x1, 1, 2 },
- { PIEZO_2 * .661, 0x1, 2, 2 },
- { PIEZO_2 * 1.00, 0x2, 2, 3 },
- { PIEZO_3 * 1.00, 0x2, 3, 3 },
-};
-
-DECLARE_INK(piezo_4pl_quadtone, PIEZO_DENSITY);
-
-static const stp_simple_dither_range_t piezo_4pl_2880_quadtone_dither_ranges[] =
-{
- { PIEZO_0, 0x1, 0, 1 },
- { PIEZO_1, 0x1, 1, 1 },
- { PIEZO_2, 0x1, 2, 1 },
- { PIEZO_3, 0x1, 3, 1 },
-};
-
-DECLARE_INK(piezo_4pl_2880_quadtone, PIEZO_DENSITY);
-
-
-/***************************************************************\
-* *
-* 3 PICOLITRE DOTS (900 AND 980) *
-* *
-\***************************************************************/
-
-static const stp_simple_dither_range_t standard_3pl_dither_ranges[] =
-{
- { 0.25, 0x1, 0, 2 },
- { 0.61, 0x2, 0, 5 },
- { 1.0, 0x3, 0, 8 }
-};
-
-DECLARE_INK(standard_3pl, 1.0);
-
-
-static const stp_simple_dither_range_t standard_3pl_1440_dither_ranges[] =
-{
- { 0.39, 0x1, 0, 2 },
- { 1.0, 0x2, 0, 5 }
-};
-
-DECLARE_INK(standard_3pl_1440, 1.0);
-
-
-static const stp_simple_dither_range_t standard_3pl_2880_dither_ranges[] =
-{
- { 1.0, 0x1, 0, 1 }
-};
-
-DECLARE_INK(standard_3pl_2880, 1.0);
-
-static const stp_simple_dither_range_t standard_980_6pl_dither_ranges[] =
-{
- { 0.40, 0x1, 0, 4 },
- { 0.675, 0x2, 0, 7 },
- { 1.0, 0x3, 0, 10 }
-};
-
-DECLARE_INK(standard_980_6pl, 1.0);
-
-static const stp_simple_dither_range_t piezo_3pl_quadtone_dither_ranges[] =
-{
- { PIEZO_0 * .25, 0x1, 0, 2 },
- { PIEZO_0 * .61, 0x2, 0, 5 },
- { PIEZO_1 * .61, 0x2, 1, 5 },
- { PIEZO_2 * .61, 0x2, 2, 5 },
- { PIEZO_2 * 1.0, 0x3, 2, 8 },
- { PIEZO_3 * 1.0, 0x3, 3, 8 },
-};
-
-DECLARE_INK(piezo_3pl_quadtone, PIEZO_DENSITY);
-
-static const stp_simple_dither_range_t piezo_3pl_1440_quadtone_dither_ranges[]=
-{
- { PIEZO_0 * .390, 0x1, 0, 2 },
- { PIEZO_1 * .390, 0x1, 1, 2 },
- { PIEZO_2 * .390, 0x1, 2, 2 },
- { PIEZO_2 * 1.00, 0x2, 2, 5 },
- { PIEZO_3 * 1.00, 0x2, 3, 5 },
-};
-
-DECLARE_INK(piezo_3pl_1440_quadtone, PIEZO_DENSITY);
-
-static const stp_simple_dither_range_t piezo_3pl_2880_quadtone_dither_ranges[]=
-{
- { PIEZO_0, 0x1, 0, 1 },
- { PIEZO_1, 0x1, 1, 1 },
- { PIEZO_2, 0x1, 2, 1 },
- { PIEZO_3, 0x1, 3, 1 },
-};
-
-DECLARE_INK(piezo_3pl_2880_quadtone, PIEZO_DENSITY);
-
-static const stp_simple_dither_range_t piezo_980_6pl_quadtone_dither_ranges[] =
-{
- { PIEZO_0 * .400, 0x1, 0, 4 },
- { PIEZO_0 * .675, 0x2, 0, 7 },
- { PIEZO_1 * .675, 0x2, 1, 7 },
- { PIEZO_2 * .675, 0x2, 2, 7 },
- { PIEZO_3 * 1.00, 0x3, 3, 10 },
-};
-
-DECLARE_INK(piezo_980_6pl_quadtone, PIEZO_DENSITY);
-
-
-/***************************************************************\
-* *
-* 2 PICOLITRE DOTS (950) *
-* *
-\***************************************************************/
-
-static const stp_simple_dither_range_t standard_2pl_2880_dither_ranges[] =
-{
- { 1.00, 0x1, 0, 1 },
-};
-
-DECLARE_INK(standard_2pl_2880, 1.0);
-
-static const stp_simple_dither_range_t photo_2pl_2880_dither_ranges[] =
-{
- { 0.26, 0x1, 1, 1 },
- { 1.00, 0x1, 0, 1 },
-};
-
-DECLARE_INK(photo_2pl_2880, 0.5);
-
-static const stp_simple_dither_range_t photo_2pl_2880_c_dither_ranges[] =
-{
- { 0.26, 0x1, 1, 1 },
- { 1.00, 0x1, 0, 1 },
-};
-
-DECLARE_INK(photo_2pl_2880_c, .5);
-
-static const stp_simple_dither_range_t photo_2pl_2880_m_dither_ranges[] =
-{
- { 0.31, 0x1, 1, 1 },
- { 1.00, 0x1, 0, 1 },
-};
-
-DECLARE_INK(photo_2pl_2880_m, .5);
-
-static const stp_simple_dither_range_t photo_2pl_2880_y_dither_ranges[] =
-{
- { 0.5, 0x1, 0, 1 },
- { 1.00, 0x1, 1, 1 },
-};
-
-DECLARE_INK(photo_2pl_2880_y, 1.00);
-
-static const stp_simple_dither_range_t piezo_2pl_2880_quadtone_dither_ranges[]=
-{
- { PIEZO_0, 0x1, 0, 1 },
- { PIEZO_1, 0x1, 1, 1 },
- { PIEZO_2, 0x1, 2, 1 },
- { PIEZO_3, 0x1, 3, 1 },
-};
-
-DECLARE_INK(piezo_2pl_2880_quadtone, PIEZO_DENSITY);
-
-static const stp_simple_dither_range_t standard_2pl_1440_dither_ranges[] =
-{
- { 0.5, 0x1, 0, 1 },
- { 1.00, 0x2, 0, 2 }
-};
-
-DECLARE_INK(standard_2pl_1440, 1.0);
-
-static const stp_simple_dither_range_t piezo_2pl_1440_quadtone_dither_ranges[] =
-{
- { PIEZO_0 * .5, 0x1, 0, 1 },
- { PIEZO_1 * .5, 0x1, 1, 1 },
- { PIEZO_2 * .5, 0x1, 2, 1 },
- { PIEZO_2 * 1.00, 0x2, 2, 2 },
- { PIEZO_3 * 1.00, 0x2, 3, 2 },
-};
-
-DECLARE_INK(piezo_2pl_1440_quadtone, PIEZO_DENSITY);
-
-static const stp_simple_dither_range_t photo_2pl_1440_dither_ranges[] =
-{
- { 0.13, 0x1, 1, 1 },
- { 0.26, 0x2, 1, 2 },
- { 0.5, 0x1, 0, 1 },
- { 1.00, 0x2, 0, 2 }
-};
-
-DECLARE_INK(photo_2pl_1440, 1.0);
-
-static const stp_simple_dither_range_t photo_2pl_1440_y_dither_ranges[] =
-{
- { 0.25, 0x1, 0, 1 },
- { 0.50, 0x2, 0, 2 },
- { 1.00, 0x2, 1, 2 }
-};
-
-DECLARE_INK(photo_2pl_1440_y, 1.0);
-
-static const stp_simple_dither_range_t standard_2pl_720_dither_ranges[] =
-{
- { 0.25, 0x1, 0, 1 },
- { 0.5, 0x2, 0, 2 },
- { 1.0, 0x3, 0, 4 }
-};
-
-DECLARE_INK(standard_2pl_720, 1.0);
-
-static const stp_simple_dither_range_t photo_2pl_720_dither_ranges[] =
-{
- { 0.065, 0x1, 1, 1 },
- { 0.13, 0x2, 1, 2 },
-/* { 0.26, 0x3, 1, 4 }, */
- { 0.25, 0x1, 0, 1 },
- { 0.5, 0x2, 0, 2 },
- { 1.0, 0x3, 0, 4 }
-};
-
-DECLARE_INK(photo_2pl_720, 1.0);
-
-static const stp_simple_dither_range_t photo_2pl_720_y_dither_ranges[] =
-{
- { 0.125, 0x1, 0, 1 },
- { 0.25, 0x2, 0, 2 },
- { 0.5, 0x2, 1, 2 },
- { 1.0, 0x3, 1, 4 }
-};
-
-DECLARE_INK(photo_2pl_720_y, 1.0);
-
-static const stp_simple_dither_range_t piezo_2pl_720_quadtone_dither_ranges[] =
-{
- { PIEZO_0 * .25, 0x1, 0, 1 },
- { PIEZO_0 * .50, 0x2, 0, 2 },
- { PIEZO_1 * .50, 0x2, 1, 2 },
- { PIEZO_2 * .50, 0x2, 2, 2 },
- { PIEZO_2 * 1.0, 0x3, 2, 4 },
- { PIEZO_3 * 1.0, 0x3, 3, 4 },
-};
-
-DECLARE_INK(piezo_2pl_720_quadtone, PIEZO_DENSITY);
-
-static const stp_simple_dither_range_t standard_2pl_360_dither_ranges[] =
-{
- { 0.25, 0x1, 0, 2 },
- { 0.5, 0x2, 0, 4 },
- { 1.0, 0x3, 0, 7 }
-};
-
-DECLARE_INK(standard_2pl_360, 1.0);
-
-static const stp_simple_dither_range_t photo_2pl_360_dither_ranges[] =
-{
- { 0.065, 0x1, 1, 1 },
- { 0.13, 0x2, 1, 2 },
- { 0.26, 0x3, 1, 3 },
- { 1.0, 0x3, 0, 3 }
-};
-
-DECLARE_INK(photo_2pl_360, 1.0);
-
-static const stp_simple_dither_range_t photo_2pl_360_y_dither_ranges[] =
-{
- { 0.145, 0x1, 0, 1 },
- { 0.290, 0x2, 0, 2 },
- { 0.5, 0x3, 0, 3 },
- { 1.0, 0x3, 1, 3 }
-};
-
-DECLARE_INK(photo_2pl_360_y, 1.0);
-
-static const stp_simple_dither_range_t piezo_2pl_360_quadtone_dither_ranges[] =
-{
- { PIEZO_0 * .25, 0x1, 0, 2 },
- { PIEZO_0 * .50, 0x2, 0, 4 },
- { PIEZO_1 * .50, 0x2, 1, 4 },
- { PIEZO_2 * .50, 0x2, 2, 4 },
- { PIEZO_2 * 1.0, 0x3, 2, 7 },
- { PIEZO_3 * 1.0, 0x3, 3, 7 },
-};
-
-DECLARE_INK(piezo_2pl_360_quadtone, PIEZO_DENSITY);
-
-
-/***************************************************************\
-* *
-* STYLUS C70/C80 (PIGMENT) *
-* *
-\***************************************************************/
-
-static const stp_simple_dither_range_t standard_economy_pigment_dither_ranges[] =
-{
- { 1.0, 0x3, 0, 3 }
-};
-
-DECLARE_INK(standard_economy_pigment, 1.0);
-
-static const stp_simple_dither_range_t standard_multishot_pigment_dither_ranges[] =
-{
- { 0.410, 0x1, 0, 2 },
- { 1.0, 0x3, 0, 5 }
-};
-
-DECLARE_INK(standard_multishot_pigment, 1.0);
-
-static const stp_simple_dither_range_t standard_6pl_pigment_dither_ranges[] =
-{
- { 0.300, 0x1, 0, 3 },
- { 1.0, 0x3, 0, 10 }
-};
-
-DECLARE_INK(standard_6pl_pigment, 1.0);
-
-static const stp_simple_dither_range_t standard_3pl_pigment_dither_ranges[] =
-{
- { 0.650, 0x1, 0, 2 },
- { 1.000, 0x2, 0, 3 },
-};
-
-DECLARE_INK(standard_3pl_pigment, 1.0);
-
-static const stp_simple_dither_range_t standard_3pl_pigment_2880_dither_ranges[] =
-{
- { 1.0, 0x1, 0, 1 }
-};
-
-DECLARE_INK(standard_3pl_pigment_2880, 1.0);
-
-static const stp_simple_dither_range_t piezo_economy_pigment_quadtone_dither_ranges[]=
-{
- { PIEZO_0, 0x3, 0, 1 },
- { PIEZO_1, 0x3, 1, 1 },
- { PIEZO_2, 0x3, 2, 1 },
- { PIEZO_3, 0x3, 3, 1 },
-};
-
-DECLARE_INK(piezo_economy_pigment_quadtone, PIEZO_DENSITY);
-
-static const stp_simple_dither_range_t piezo_multishot_pigment_quadtone_dither_ranges[]=
-{
- { PIEZO_0 * .410, 0x1, 0, 2 },
- { PIEZO_1 * .410, 0x1, 1, 2 },
- { PIEZO_2 * .410, 0x1, 2, 2 },
- { PIEZO_3 * 1.00, 0x3, 3, 5 },
-};
-
-DECLARE_INK(piezo_multishot_pigment_quadtone, PIEZO_DENSITY);
-
-static const stp_simple_dither_range_t piezo_6pl_pigment_quadtone_dither_ranges[]=
-{
- { PIEZO_0 * .300, 0x1, 0, 3 },
- { PIEZO_0 * .600, 0x2, 0, 6 },
- { PIEZO_1 * .600, 0x2, 1, 6 },
- { PIEZO_2 * .600, 0x2, 2, 6 },
- { PIEZO_3 * 1.00, 0x3, 3, 10 },
-};
-
-DECLARE_INK(piezo_6pl_pigment_quadtone, PIEZO_DENSITY);
-
-static const stp_simple_dither_range_t piezo_3pl_pigment_quadtone_dither_ranges[]=
-{
- { PIEZO_0 * .650, 0x1, 0, 2 },
- { PIEZO_1 * .650, 0x1, 1, 2 },
- { PIEZO_2 * .650, 0x1, 2, 2 },
- { PIEZO_3 * 1.00, 0x2, 3, 3 },
-};
-
-DECLARE_INK(piezo_3pl_pigment_quadtone, PIEZO_DENSITY);
-
-static const stp_simple_dither_range_t piezo_3pl_pigment_2880_quadtone_dither_ranges[]=
-{
- { PIEZO_0, 0x1, 0, 1 },
- { PIEZO_1, 0x1, 1, 1 },
- { PIEZO_2, 0x1, 2, 1 },
- { PIEZO_3, 0x1, 3, 1 },
-};
-
-DECLARE_INK(piezo_3pl_pigment_2880_quadtone, PIEZO_DENSITY);
-
-
-/***************************************************************\
-* *
-* STYLUS PHOTO 2000P *
-* *
-\***************************************************************/
-
-static const stp_simple_dither_range_t standard_pigment_dither_ranges[] =
-{ /* MRS: Not calibrated! */
- { 0.55, 0x1, 0, 1 },
- { 1.0, 0x2, 0, 2 }
-};
-
-DECLARE_INK(standard_pigment, 1.0);
-
-static const stp_simple_dither_range_t photo_pigment_dither_ranges[] =
-{ /* MRS: Not calibrated! */
- { 0.15, 0x1, 1, 1 },
- { 0.227, 0x2, 1, 2 },
- { 0.5, 0x1, 0, 1 },
- { 1.0, 0x2, 0, 2 }
-};
-
-DECLARE_INK(photo_pigment, 1.0);
-
-static const stp_simple_dither_range_t piezo_pigment_quadtone_dither_ranges[]=
-{
- { PIEZO_0 * .550, 0x1, 0, 1 },
- { PIEZO_1 * .550, 0x1, 1, 1 },
- { PIEZO_2 * .550, 0x1, 2, 1 },
- { PIEZO_3 * .550, 0x1, 3, 1 },
- { PIEZO_3 * 1.00, 0x2, 3, 2 },
-};
-
-DECLARE_INK(piezo_pigment_quadtone, PIEZO_DENSITY);
-
-
-/***************************************************************\
-* *
-* ULTRACHROME (2100/2200, 7600, 9600) *
-* *
-\***************************************************************/
-
-static const stp_simple_dither_range_t standard_4pl_pigment_low_dither_ranges[] =
-{
- { 0.40, 0x1, 0, 40 },
- { 0.70, 0x2, 0, 70 },
- { 1.00, 0x3, 0, 100 }
-};
-
-DECLARE_INK(standard_4pl_pigment_low, 0.5);
-
-static const stp_simple_dither_range_t photo_4pl_pigment_low_m_dither_ranges[] =
-{
- { 0.104, 0x1, 1, 40 },
- { 0.182, 0x2, 1, 70 },
- { 0.26, 0x3, 1, 100 },
- { 0.70, 0x2, 0, 70 },
- { 1.00, 0x3, 0, 100 }
-};
-
-DECLARE_INK(photo_4pl_pigment_low_m, 0.5);
-
-static const stp_simple_dither_range_t photo_4pl_pigment_low_c_dither_ranges[] =
-{
- { 0.16, 0x1, 1, 40 },
- { 0.28, 0x2, 1, 70 },
- { 0.40, 0x3, 1, 100 },
- { 0.70, 0x2, 0, 70 },
- { 1.00, 0x3, 0, 100 }
-};
-
-DECLARE_INK(photo_4pl_pigment_low_c, 0.5);
-
-static const stp_simple_dither_range_t photo_4pl_pigment_low_y_dither_ranges[] =
-{
- { 0.20, 0x1, 1, 40 },
- { 0.35, 0x2, 1, 70 },
- { 0.50, 0x3, 1, 100 },
- { 1.00, 0x3, 0, 100 }
-};
-
-DECLARE_INK(photo_4pl_pigment_low_y, 1.5);
-
-static const stp_simple_dither_range_t photo_4pl_pigment_low_k_dither_ranges[] =
-{
- { 0.196, 0x1, 1, 40 },
- { 0.40, 0x1, 0, 40 },
- { 0.70, 0x2, 0, 70 },
- { 1.00, 0x3, 0, 100 }
-};
-
-DECLARE_INK(photo_4pl_pigment_low_k, 0.5);
-
-static const stp_simple_dither_range_t standard_4pl_pigment_dither_ranges[] =
-{
- { 0.28, 0x1, 0, 28 },
- { 0.50, 0x2, 0, 50 },
- { 1.00, 0x3, 0, 100 }
-};
-
-DECLARE_INK(standard_4pl_pigment, 1.0);
-
-static const stp_simple_dither_range_t photo_4pl_pigment_m_dither_ranges[] =
-{
- { 0.0728, 0x1, 1, 28 },
- { 0.13, 0x2, 1, 50 },
- { 0.26, 0x3, 1, 100 },
- { 0.50, 0x2, 0, 50 },
- { 1.00, 0x3, 0, 100 }
-};
-
-DECLARE_INK(photo_4pl_pigment_m, 1.0);
-
-static const stp_simple_dither_range_t photo_4pl_pigment_c_dither_ranges[] =
-{
- { 0.112, 0x1, 1, 28 },
- { 0.20, 0x2, 1, 50 },
- { 0.40, 0x3, 1, 100 },
- { 0.50, 0x2, 0, 50 },
- { 1.00, 0x3, 0, 100 }
-};
-
-DECLARE_INK(photo_4pl_pigment_c, 1.0);
-
-static const stp_simple_dither_range_t photo_4pl_pigment_y_dither_ranges[] =
-{
- { 0.14, 0x1, 1, 28 },
- { 0.25, 0x2, 1, 50 },
- { 0.50, 0x3, 1, 100 },
- { 1.00, 0x3, 0, 100 }
-};
-
-DECLARE_INK(photo_4pl_pigment_y, 1.5);
-
-static const stp_simple_dither_range_t photo_4pl_pigment_k_dither_ranges[] =
-{
- { 0.1344, 0x1, 1, 28 },
- { 0.24, 0x2, 1, 50 },
- { 0.50, 0x2, 0, 50 },
- { 1.00, 0x3, 0, 100 }
-};
-
-DECLARE_INK(photo_4pl_pigment_k, 0.75);
-
-static const stp_simple_dither_range_t standard_4pl_pigment_1440_dither_ranges[] =
-{
- { 0.56, 0x1, 0, 56 },
- { 1.00, 0x2, 0, 100 },
-};
-
-DECLARE_INK(standard_4pl_pigment_1440, 1.0);
-
-static const stp_simple_dither_range_t photo_4pl_pigment_1440_m_dither_ranges[] =
-{
- { 0.1456, 0x1, 1, 56 },
- { 0.26, 0x2, 1, 100 },
- { 0.56, 0x1, 0, 56 },
- { 1.00, 0x2, 0, 100 }
-};
-
-DECLARE_INK(photo_4pl_pigment_1440_m, 1.0);
-
-static const stp_simple_dither_range_t photo_4pl_pigment_1440_c_dither_ranges[] =
-{
- { 0.224, 0x1, 1, 56 },
- { 0.40, 0x2, 1, 100 },
- { 0.56, 0x1, 0, 56 },
- { 1.00, 0x2, 0, 100 }
-};
-
-DECLARE_INK(photo_4pl_pigment_1440_c, 1.0);
-
-static const stp_simple_dither_range_t photo_4pl_pigment_1440_y_dither_ranges[] =
-{
- { 0.28, 0x1, 1, 56 },
- { 0.50, 0x2, 1, 100 },
- { 1.00, 0x2, 0, 100 }
-};
-
-DECLARE_INK(photo_4pl_pigment_1440_y, 1.5);
-
-static const stp_simple_dither_range_t photo_4pl_pigment_1440_k_dither_ranges[] =
-{
- { 0.2688, 0x1, 1, 56 },
- { 0.56, 0x1, 0, 56 },
- { 1.00, 0x2, 0, 100 }
-};
-
-DECLARE_INK(photo_4pl_pigment_1440_k, 0.75);
-
-static const stp_simple_dither_range_t standard_4pl_pigment_2880_dither_ranges[] =
-{
- { 1.00, 0x1, 0, 1 },
-};
-
-DECLARE_INK(standard_4pl_pigment_2880, 1.0);
-
-static const stp_simple_dither_range_t photo_4pl_pigment_2880_m_dither_ranges[] =
-{
- { 0.26, 0x1, 1, 1 },
- { 1.00, 0x1, 0, 1 },
-};
-
-DECLARE_INK(photo_4pl_pigment_2880_m, 0.75);
-
-static const stp_simple_dither_range_t photo_4pl_pigment_2880_c_dither_ranges[] =
-{
- { 0.40, 0x1, 1, 1 },
- { 1.00, 0x1, 0, 1 },
-};
-
-DECLARE_INK(photo_4pl_pigment_2880_c, 0.75);
-
-static const stp_simple_dither_range_t photo_4pl_pigment_2880_y_dither_ranges[] =
-{
- { 0.50, 0x1, 1, 1 },
- { 1.00, 0x1, 0, 1 },
-};
-
-DECLARE_INK(photo_4pl_pigment_2880_y, 1.5);
-
-static const stp_simple_dither_range_t photo_4pl_pigment_2880_k_dither_ranges[] =
-{
- { 0.48, 0x1, 1, 1 },
- { 1.00, 0x1, 0, 1 },
-};
-
-DECLARE_INK(photo_4pl_pigment_2880_k, 0.75);
-
-
-/***************************************************************\
-* *
-* STYLUS PRO 10000 *
-* *
-\***************************************************************/
-
-static const stp_simple_dither_range_t spro10000_standard_dither_ranges[] =
-{
- { 0.661, 0x1, 0, 2 },
- { 1.00, 0x2, 0, 3 }
-};
-
-DECLARE_INK(spro10000_standard, 1.0);
-
-static const stp_simple_dither_range_t spro10000_photo_dither_ranges[] =
-{
- { 0.17, 0x1, 1, 2 },
- { 0.26, 0x2, 1, 3 },
- { 0.661, 0x1, 0, 2 },
- { 1.00, 0x2, 0, 3 }
-};
-
-DECLARE_INK(spro10000_photo, 1.0);
-
-
-/***************************************************************\
-* *
-* STYLUS PHOTO R300 *
-* *
-\***************************************************************/
-
-static const stp_simple_dither_range_t standard_r300_360_dither_ranges[] =
-{
- { 0.15, 0x1, 0, 3 },
- { 0.30, 0x2, 0, 6 },
- { 1.00, 0x3, 0, 20 },
-};
-
-DECLARE_INK(standard_r300_360, 1.0);
-
-static const stp_simple_dither_range_t photo_r300_360_dither_ranges[] =
-{
- { 0.053, 0x1, 1, 3 },
- { 0.105, 0x2, 1, 6 },
- { 0.30, 0x2, 0, 6 },
- { 1.00, 0x3, 0, 20 },
-};
-
-DECLARE_INK(photo_r300_360, 0.5);
-
-static const stp_simple_dither_range_t piezo_r300_360_quadtone_dither_ranges[]=
-{
- { PIEZO_0 * .15, 0x1, 0, 3 },
- { PIEZO_0 * .30, 0x2, 0, 6 },
- { PIEZO_1 * .30, 0x2, 1, 6 },
- { PIEZO_2 * .30, 0x2, 2, 6 },
- { PIEZO_2 * 1.0, 0x3, 2, 20 },
- { PIEZO_3 * 1.0, 0x3, 3, 20 },
-};
-
-DECLARE_INK(piezo_r300_360_quadtone, 0.5);
-
-static const stp_simple_dither_range_t standard_r300_720_dither_ranges[] =
-{
- { 0.15, 0x1, 0, 3 },
- { 0.50, 0x2, 0, 10 },
- { 1.00, 0x3, 0, 20 },
-};
-
-DECLARE_INK(standard_r300_720, 1.0);
-
-static const stp_simple_dither_range_t photo_r300_720_dither_ranges[] =
-{
- { 0.053, 0x1, 1, 3 },
- { 0.175, 0x2, 1, 10 },
- { 0.50, 0x2, 0, 10 },
- { 1.00, 0x3, 0, 20 },
-};
-
-DECLARE_INK(photo_r300_720, 0.5);
-
-static const stp_simple_dither_range_t piezo_r300_720_quadtone_dither_ranges[]=
-{
- { PIEZO_0 * .15, 0x1, 0, 3 },
- { PIEZO_0 * .50, 0x2, 0, 10 },
- { PIEZO_1 * .50, 0x2, 1, 10 },
- { PIEZO_2 * .50, 0x2, 2, 10 },
- { PIEZO_2 * 1.0, 0x3, 2, 20 },
- { PIEZO_3 * 1.0, 0x3, 3, 20 },
-};
-
-DECLARE_INK(piezo_r300_720_quadtone, 0.5);
-
-static const stp_simple_dither_range_t standard_r300_1440_dither_ranges[] =
-{
- { 0.25, 0x1, 0, 1 },
- { 0.50, 0x2, 0, 2 },
- { 1.00, 0x3, 0, 4 },
-};
-
-DECLARE_INK(standard_r300_1440, 1.0);
-
-static const stp_simple_dither_range_t photo_r300_1440_dither_ranges[] =
-{
- { 0.088, 0x1, 1, 1 },
- { 0.175, 0x2, 1, 2 },
- { 0.50, 0x2, 0, 2 },
- { 1.00, 0x3, 0, 4 },
-};
-
-DECLARE_INK(photo_r300_1440, 0.5);
-
-static const stp_simple_dither_range_t piezo_r300_1440_quadtone_dither_ranges[]=
-{
- { PIEZO_0 * .25, 0x1, 0, 1 },
- { PIEZO_0 * .50, 0x2, 0, 2 },
- { PIEZO_1 * .50, 0x2, 1, 2 },
- { PIEZO_2 * .50, 0x2, 2, 2 },
- { PIEZO_2 * 1.0, 0x3, 2, 4 },
- { PIEZO_3 * 1.0, 0x3, 3, 4 },
-};
-
-DECLARE_INK(piezo_r300_1440_quadtone, 0.5);
-
-static const stp_simple_dither_range_t standard_r300_2880_dither_ranges[] =
-{
- { 0.50, 0x1, 0, 1 },
- { 1.00, 0x2, 0, 2 },
-};
-
-DECLARE_INK(standard_r300_2880, 1.0);
-
-static const stp_simple_dither_range_t photo_r300_2880_dither_ranges[] =
-{
- { 0.175, 0x1, 1, 1 },
- { 0.50, 0x1, 0, 1 },
- { 1.00, 0x2, 0, 2 },
-};
-
-DECLARE_INK(photo_r300_2880, 0.5);
-
-static const stp_simple_dither_range_t piezo_r300_2880_quadtone_dither_ranges[]=
-{
- { PIEZO_0 * .50, 0x1, 0, 1 },
- { PIEZO_1 * .50, 0x1, 1, 1 },
- { PIEZO_2 * .50, 0x1, 2, 1 },
- { PIEZO_2 * 1.0, 0x2, 2, 2 },
- { PIEZO_3 * 1.0, 0x2, 3, 2 },
-};
-
-DECLARE_INK(piezo_r300_2880_quadtone, 0.5);
-
-static const stp_simple_dither_range_t standard_r300_2880_1440_dither_ranges[] =
-{
- { 1.00, 0x1, 0, 1 },
-};
-
-DECLARE_INK(standard_r300_2880_1440, 1.0);
-
-static const stp_simple_dither_range_t photo_r300_2880_1440_dither_ranges[] =
-{
- { 0.35, 0x1, 1, 1 },
- { 1.00, 0x1, 0, 1 },
-};
-
-DECLARE_INK(photo_r300_2880_1440, 0.5);
-
-static const stp_simple_dither_range_t piezo_r300_2880_1440_quadtone_dither_ranges[]=
-{
- { PIEZO_0, 0x1, 0, 1 },
- { PIEZO_1, 0x1, 1, 1 },
- { PIEZO_2, 0x1, 2, 1 },
- { PIEZO_3, 0x1, 3, 1 },
-};
-
-DECLARE_INK(piezo_r300_2880_1440_quadtone, 0.5);
-
-
-
-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 piezo_quadtone_inks =
-{
- &piezo_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-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_multishot_photo2_inks =
-{
- &photo_multishot_ink,
- &photo_multishot_ink,
- &photo_multishot_ink,
- &standard_multishot_ink
-};
-
-static const escp2_variable_inkset_t escp2_multishot_photoj_inks =
-{
- &standard_multishot_ink,
- &photo_multishot_ink,
- &photo_multishot_ink,
- &photo_multishot_y_ink
-};
-
-static const escp2_variable_inkset_t piezo_multishot_quadtone_inks =
-{
- &piezo_multishot_quadtone_ink,
- NULL,
- NULL,
- 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_6pl_photo_inks =
-{
- &standard_6pl_ink,
- &photo_6pl_ink,
- &photo_6pl_ink,
- &standard_6pl_ink
-};
-
-static const escp2_variable_inkset_t escp2_6pl_photo2_inks =
-{
- &photo_6pl_ink,
- &photo_6pl_ink,
- &photo_6pl_ink,
- &standard_6pl_ink
-};
-
-static const escp2_variable_inkset_t escp2_6pl_photoj_inks =
-{
- &standard_6pl_ink,
- &photo_6pl_ink,
- &photo_6pl_ink,
- &photo_6pl_y_ink
-};
-
-static const escp2_variable_inkset_t piezo_6pl_quadtone_inks =
-{
- &piezo_6pl_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-
-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 piezo_6pl_1440_quadtone_inks =
-{
- &piezo_6pl_1440_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-
-static const escp2_variable_inkset_t escp2_6pl_2880_standard_inks =
-{
- &standard_6pl_2880_ink,
- &standard_6pl_2880_ink,
- &standard_6pl_2880_ink,
- &standard_6pl_2880_ink
-};
-
-static const escp2_variable_inkset_t escp2_6pl_2880_photo_inks =
-{
- &standard_6pl_2880_ink,
- &photo_6pl_2880_ink,
- &photo_6pl_2880_ink,
- &standard_6pl_2880_ink
-};
-
-static const escp2_variable_inkset_t piezo_6pl_2880_quadtone_inks =
-{
- &piezo_6pl_2880_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-
-static const escp2_variable_inkset_t escp2_680_multishot_standard_inks =
-{
- &standard_680_multishot_ink,
- &standard_680_multishot_ink,
- &standard_680_multishot_ink,
- &standard_680_multishot_ink
-};
-
-static const escp2_variable_inkset_t escp2_680_6pl_standard_inks =
-{
- &standard_680_6pl_ink,
- &standard_680_6pl_ink,
- &standard_680_6pl_ink,
- &standard_680_6pl_ink
-};
-
-static const escp2_variable_inkset_t piezo_680_multishot_quadtone_inks =
-{
- &piezo_680_multishot_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-static const escp2_variable_inkset_t piezo_680_6pl_quadtone_inks =
-{
- &piezo_680_6pl_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-
-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 escp2_4pl_photoj_inks =
-{
- &standard_4pl_ink,
- &photo_4pl_ink,
- &photo_4pl_ink,
- &photo_4pl_y_ink,
-};
-
-static const escp2_variable_inkset_t piezo_4pl_quadtone_inks =
-{
- &piezo_4pl_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-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 piezo_4pl_2880_quadtone_inks =
-{
- &piezo_4pl_2880_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-
-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 piezo_6pl_quadtone_980_inks =
-{
- &piezo_980_6pl_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-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 piezo_3pl_quadtone_inks =
-{
- &piezo_3pl_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-static const escp2_variable_inkset_t piezo_3pl_1440_quadtone_inks =
-{
- &piezo_3pl_1440_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-static const escp2_variable_inkset_t piezo_3pl_2880_quadtone_inks =
-{
- &piezo_3pl_2880_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-
-static const escp2_variable_inkset_t escp2_2pl_2880_standard_inks =
-{
- &standard_2pl_2880_ink,
- &standard_2pl_2880_ink,
- &standard_2pl_2880_ink,
- &standard_2pl_2880_ink
-};
-
-static const escp2_variable_inkset_t escp2_2pl_2880_photo_inks =
-{
- &standard_2pl_2880_ink,
- &photo_2pl_2880_c_ink,
- &photo_2pl_2880_m_ink,
- &standard_2pl_2880_ink
-};
-
-static const escp2_variable_inkset_t escp2_2pl_2880_photo2_inks =
-{
- &photo_2pl_2880_ink,
- &photo_2pl_2880_ink,
- &photo_2pl_2880_ink,
- &standard_2pl_2880_ink
-};
-
-static const escp2_variable_inkset_t escp2_2pl_2880_photoj_inks =
-{
- &standard_2pl_2880_ink,
- &photo_2pl_2880_ink,
- &photo_2pl_2880_ink,
- &photo_2pl_2880_y_ink
-};
-
-static const escp2_variable_inkset_t piezo_2pl_2880_quadtone_inks =
-{
- &piezo_2pl_2880_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-static const escp2_variable_inkset_t escp2_2pl_1440_standard_inks =
-{
- &standard_2pl_1440_ink,
- &standard_2pl_1440_ink,
- &standard_2pl_1440_ink,
- &standard_2pl_1440_ink
-};
-
-static const escp2_variable_inkset_t escp2_2pl_1440_photo_inks =
-{
- &standard_2pl_1440_ink,
- &photo_2pl_1440_ink,
- &photo_2pl_1440_ink,
- &standard_2pl_1440_ink
-};
-
-static const escp2_variable_inkset_t escp2_2pl_1440_photoj_inks =
-{
- &standard_2pl_1440_ink,
- &photo_2pl_1440_ink,
- &photo_2pl_1440_ink,
- &photo_2pl_1440_y_ink,
-};
-
-static const escp2_variable_inkset_t piezo_2pl_1440_quadtone_inks =
-{
- &piezo_2pl_1440_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-static const escp2_variable_inkset_t escp2_2pl_720_standard_inks =
-{
- &standard_2pl_720_ink,
- &standard_2pl_720_ink,
- &standard_2pl_720_ink,
- &standard_2pl_720_ink
-};
-
-static const escp2_variable_inkset_t escp2_2pl_720_photo_inks =
-{
- &standard_2pl_720_ink,
- &photo_2pl_720_ink,
- &photo_2pl_720_ink,
- &standard_2pl_720_ink
-};
-
-static const escp2_variable_inkset_t escp2_2pl_720_photo2_inks =
-{
- &photo_2pl_720_ink,
- &photo_2pl_720_ink,
- &photo_2pl_720_ink,
- &standard_2pl_720_ink
-};
-
-static const escp2_variable_inkset_t escp2_2pl_720_photoj_inks =
-{
- &standard_2pl_720_ink,
- &photo_2pl_720_ink,
- &photo_2pl_720_ink,
- &photo_2pl_720_y_ink
-};
-
-static const escp2_variable_inkset_t piezo_2pl_720_quadtone_inks =
-{
- &piezo_2pl_720_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-static const escp2_variable_inkset_t escp2_2pl_360_standard_inks =
-{
- &standard_2pl_360_ink,
- &standard_2pl_360_ink,
- &standard_2pl_360_ink,
- &standard_2pl_360_ink
-};
-
-static const escp2_variable_inkset_t escp2_2pl_360_photo_inks =
-{
- &standard_2pl_360_ink,
- &photo_2pl_360_ink,
- &photo_2pl_360_ink,
- &standard_2pl_360_ink
-};
-
-static const escp2_variable_inkset_t escp2_2pl_360_photo2_inks =
-{
- &photo_2pl_360_ink,
- &photo_2pl_360_ink,
- &photo_2pl_360_ink,
- &standard_2pl_360_ink
-};
-
-static const escp2_variable_inkset_t escp2_2pl_360_photoj_inks =
-{
- &standard_2pl_360_ink,
- &photo_2pl_360_ink,
- &photo_2pl_360_ink,
- &photo_2pl_360_y_ink
-};
-
-static const escp2_variable_inkset_t piezo_2pl_360_quadtone_inks =
-{
- &piezo_2pl_360_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-
-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_x80_2880_6pl_standard_inks =
-{
- &standard_x80_2880_6pl_ink,
- &standard_x80_2880_6pl_ink,
- &standard_x80_2880_6pl_ink,
- &standard_x80_2880_6pl_ink
-};
-
-static const escp2_variable_inkset_t piezo_x80_multishot_quadtone_inks =
-{
- &piezo_x80_multishot_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-static const escp2_variable_inkset_t piezo_x80_6pl_quadtone_inks =
-{
- &piezo_x80_6pl_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-static const escp2_variable_inkset_t piezo_x80_1440_6pl_quadtone_inks =
-{
- &piezo_x80_1440_6pl_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-static const escp2_variable_inkset_t piezo_x80_2880_6pl_quadtone_inks =
-{
- &piezo_x80_2880_6pl_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-
-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 piezo_pigment_quadtone_inks =
-{
- &piezo_pigment_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-
-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 piezo_multishot_pigment_quadtone_inks =
-{
- &piezo_multishot_pigment_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-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 piezo_economy_pigment_quadtone_inks =
-{
- &piezo_economy_pigment_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-
-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 piezo_6pl_pigment_quadtone_inks =
-{
- &piezo_6pl_pigment_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-
-static const escp2_variable_inkset_t escp2_4pl_pigment_low_standard_inks =
-{
- &standard_4pl_pigment_low_ink,
- &standard_4pl_pigment_low_ink,
- &standard_4pl_pigment_low_ink,
- &standard_4pl_pigment_low_ink
-};
-
-static const escp2_variable_inkset_t escp2_4pl_pigment_low_photo_inks =
-{
- &standard_4pl_pigment_low_ink,
- &photo_4pl_pigment_low_c_ink,
- &photo_4pl_pigment_low_m_ink,
- &standard_4pl_pigment_low_ink
-};
-
-static const escp2_variable_inkset_t escp2_4pl_pigment_low_photo2_inks =
-{
- &photo_4pl_pigment_low_k_ink,
- &photo_4pl_pigment_low_c_ink,
- &photo_4pl_pigment_low_m_ink,
- &standard_4pl_pigment_low_ink
-};
-
-static const escp2_variable_inkset_t escp2_4pl_pigment_low_photoj_inks =
-{
- &standard_4pl_pigment_low_ink,
- &photo_4pl_pigment_low_c_ink,
- &photo_4pl_pigment_low_m_ink,
- &photo_4pl_pigment_low_y_ink
-};
-
-static const escp2_variable_inkset_t escp2_4pl_pigment_standard_inks =
-{
- &standard_4pl_pigment_ink,
- &standard_4pl_pigment_ink,
- &standard_4pl_pigment_ink,
- &standard_4pl_pigment_ink
-};
-
-static const escp2_variable_inkset_t escp2_4pl_pigment_photo_inks =
-{
- &standard_4pl_pigment_ink,
- &photo_4pl_pigment_c_ink,
- &photo_4pl_pigment_m_ink,
- &standard_4pl_pigment_ink
-};
-
-static const escp2_variable_inkset_t escp2_4pl_pigment_photo2_inks =
-{
- &photo_4pl_pigment_k_ink,
- &photo_4pl_pigment_c_ink,
- &photo_4pl_pigment_m_ink,
- &standard_4pl_pigment_ink
-};
-
-static const escp2_variable_inkset_t escp2_4pl_pigment_photoj_inks =
-{
- &standard_4pl_pigment_ink,
- &photo_4pl_pigment_c_ink,
- &photo_4pl_pigment_m_ink,
- &photo_4pl_pigment_y_ink
-};
-
-static const escp2_variable_inkset_t escp2_4pl_pigment_1440_standard_inks =
-{
- &standard_4pl_pigment_1440_ink,
- &standard_4pl_pigment_1440_ink,
- &standard_4pl_pigment_1440_ink,
- &standard_4pl_pigment_1440_ink
-};
-
-static const escp2_variable_inkset_t escp2_4pl_pigment_1440_photo_inks =
-{
- &standard_4pl_pigment_1440_ink,
- &photo_4pl_pigment_1440_c_ink,
- &photo_4pl_pigment_1440_m_ink,
- &standard_4pl_pigment_1440_ink
-};
-
-static const escp2_variable_inkset_t escp2_4pl_pigment_1440_photo2_inks =
-{
- &photo_4pl_pigment_1440_k_ink,
- &photo_4pl_pigment_1440_c_ink,
- &photo_4pl_pigment_1440_m_ink,
- &standard_4pl_pigment_1440_ink
-};
-
-static const escp2_variable_inkset_t escp2_4pl_pigment_1440_photoj_inks =
-{
- &standard_4pl_pigment_1440_ink,
- &photo_4pl_pigment_1440_c_ink,
- &photo_4pl_pigment_1440_m_ink,
- &photo_4pl_pigment_1440_y_ink
-};
-
-static const escp2_variable_inkset_t escp2_4pl_pigment_2880_standard_inks =
-{
- &standard_4pl_pigment_2880_ink,
- &standard_4pl_pigment_2880_ink,
- &standard_4pl_pigment_2880_ink,
- &standard_4pl_pigment_2880_ink
-};
-
-static const escp2_variable_inkset_t escp2_4pl_pigment_2880_photo_inks =
-{
- &standard_4pl_pigment_2880_ink,
- &photo_4pl_pigment_2880_c_ink,
- &photo_4pl_pigment_2880_m_ink,
- &standard_4pl_pigment_2880_ink
-};
-
-static const escp2_variable_inkset_t escp2_4pl_pigment_2880_photo2_inks =
-{
- &photo_4pl_pigment_2880_k_ink,
- &photo_4pl_pigment_2880_c_ink,
- &photo_4pl_pigment_2880_m_ink,
- &standard_4pl_pigment_2880_ink
-};
-
-static const escp2_variable_inkset_t escp2_4pl_pigment_2880_photoj_inks =
-{
- &standard_4pl_pigment_2880_ink,
- &photo_4pl_pigment_2880_c_ink,
- &photo_4pl_pigment_2880_m_ink,
- &photo_4pl_pigment_2880_y_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 piezo_3pl_pigment_quadtone_inks =
-{
- &piezo_3pl_pigment_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-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_inkset_t piezo_3pl_pigment_2880_quadtone_inks =
-{
- &piezo_3pl_pigment_2880_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-
-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_r300_360_standard_inks =
-{
- &standard_r300_360_ink,
- &standard_r300_360_ink,
- &standard_r300_360_ink,
- &standard_r300_360_ink
-};
-
-static const escp2_variable_inkset_t escp2_r300_360_photo_inks =
-{
- &standard_r300_360_ink,
- &photo_r300_360_ink,
- &photo_r300_360_ink,
- &standard_r300_360_ink
-};
-
-static const escp2_variable_inkset_t piezo_r300_360_quadtone_inks =
-{
- &piezo_r300_360_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-static const escp2_variable_inkset_t escp2_r300_720_standard_inks =
-{
- &standard_r300_720_ink,
- &standard_r300_720_ink,
- &standard_r300_720_ink,
- &standard_r300_720_ink
-};
-
-static const escp2_variable_inkset_t escp2_r300_720_photo_inks =
-{
- &standard_r300_720_ink,
- &photo_r300_720_ink,
- &photo_r300_720_ink,
- &standard_r300_720_ink
-};
-
-static const escp2_variable_inkset_t piezo_r300_720_quadtone_inks =
-{
- &piezo_r300_720_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-static const escp2_variable_inkset_t escp2_r300_1440_standard_inks =
-{
- &standard_r300_1440_ink,
- &standard_r300_1440_ink,
- &standard_r300_1440_ink,
- &standard_r300_1440_ink
-};
-
-static const escp2_variable_inkset_t escp2_r300_1440_photo_inks =
-{
- &standard_r300_1440_ink,
- &photo_r300_1440_ink,
- &photo_r300_1440_ink,
- &standard_r300_1440_ink
-};
-
-static const escp2_variable_inkset_t piezo_r300_1440_quadtone_inks =
-{
- &piezo_r300_1440_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-static const escp2_variable_inkset_t escp2_r300_2880_standard_inks =
-{
- &standard_r300_2880_ink,
- &standard_r300_2880_ink,
- &standard_r300_2880_ink,
- &standard_r300_2880_ink
-};
-
-static const escp2_variable_inkset_t escp2_r300_2880_photo_inks =
-{
- &standard_r300_2880_ink,
- &photo_r300_2880_ink,
- &photo_r300_2880_ink,
- &standard_r300_2880_ink
-};
-
-static const escp2_variable_inkset_t piezo_r300_2880_quadtone_inks =
-{
- &piezo_r300_2880_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-static const escp2_variable_inkset_t escp2_r300_2880_1440_standard_inks =
-{
- &standard_r300_2880_1440_ink,
- &standard_r300_2880_1440_ink,
- &standard_r300_2880_1440_ink,
- &standard_r300_2880_1440_ink
-};
-
-static const escp2_variable_inkset_t escp2_r300_2880_1440_photo_inks =
-{
- &standard_r300_2880_1440_ink,
- &photo_r300_2880_1440_ink,
- &photo_r300_2880_1440_ink,
- &standard_r300_2880_1440_ink
-};
-
-static const escp2_variable_inkset_t piezo_r300_2880_1440_quadtone_inks =
-{
- &piezo_r300_2880_1440_quadtone_ink,
- NULL,
- NULL,
- NULL
-};
-
-
-
-static const escp2_variable_inklist_t simple_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,
- },
- { NULL, },
- { NULL, },
- {
- &piezo_quadtone_inks,
- &piezo_quadtone_inks,
- &piezo_quadtone_inks,
- &piezo_quadtone_inks,
- &piezo_quadtone_inks,
- &piezo_quadtone_inks,
- &piezo_quadtone_inks,
- &piezo_quadtone_inks,
- &piezo_quadtone_inks,
- }
-};
-
-static const escp2_variable_inklist_t variable_6pl_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_2880_standard_inks,
- &escp2_6pl_2880_standard_inks,
- &escp2_6pl_2880_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_2880_photo_inks,
- &escp2_6pl_2880_photo_inks,
- &escp2_6pl_2880_photo_inks
- },
- { NULL, },
- { NULL, },
- {
- &piezo_6pl_quadtone_inks,
- &piezo_6pl_quadtone_inks,
- &piezo_6pl_quadtone_inks,
- &piezo_6pl_quadtone_inks,
- &piezo_6pl_quadtone_inks,
- &piezo_6pl_1440_quadtone_inks,
- &piezo_6pl_2880_quadtone_inks,
- &piezo_6pl_2880_quadtone_inks,
- &piezo_6pl_2880_quadtone_inks
- },
-};
-
-static const escp2_variable_inklist_t variable_x80_6pl_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_2880_6pl_standard_inks,
- &escp2_x80_2880_6pl_standard_inks,
- &escp2_x80_2880_6pl_standard_inks,
- },
- { NULL, },
- { NULL, },
- { NULL, },
- {
- &piezo_x80_multishot_quadtone_inks,
- &piezo_x80_multishot_quadtone_inks,
- &piezo_x80_multishot_quadtone_inks,
- &piezo_x80_multishot_quadtone_inks,
- &piezo_x80_6pl_quadtone_inks,
- &piezo_x80_1440_6pl_quadtone_inks,
- &piezo_x80_2880_6pl_quadtone_inks,
- &piezo_x80_2880_6pl_quadtone_inks,
- &piezo_x80_2880_6pl_quadtone_inks,
- }
-};
-
-static const escp2_variable_inklist_t variable_4pl_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
- },
- { NULL, },
- { NULL, },
- {
- &piezo_multishot_quadtone_inks,
- &piezo_multishot_quadtone_inks,
- &piezo_multishot_quadtone_inks,
- &piezo_multishot_quadtone_inks,
- &piezo_6pl_quadtone_inks,
- &piezo_4pl_quadtone_inks,
- &piezo_4pl_2880_quadtone_inks,
- &piezo_4pl_2880_quadtone_inks,
- &piezo_4pl_2880_quadtone_inks,
- }
-};
-
-static const escp2_variable_inklist_t variable_3pl_pmg_inks =
-{
- {
- &escp2_r300_360_standard_inks,
- &escp2_r300_360_standard_inks,
- &escp2_r300_360_standard_inks,
- &escp2_r300_360_standard_inks,
- &escp2_r300_720_standard_inks,
- &escp2_r300_1440_standard_inks,
- &escp2_r300_2880_standard_inks,
- &escp2_r300_2880_1440_standard_inks,
- &escp2_r300_2880_1440_standard_inks,
- },
- {
- &escp2_r300_360_photo_inks,
- &escp2_r300_360_photo_inks,
- &escp2_r300_360_photo_inks,
- &escp2_r300_360_photo_inks,
- &escp2_r300_720_photo_inks,
- &escp2_r300_1440_photo_inks,
- &escp2_r300_2880_photo_inks,
- &escp2_r300_2880_1440_photo_inks,
- &escp2_r300_2880_1440_photo_inks,
- },
- { NULL, },
- { NULL, },
- {
- &piezo_r300_360_quadtone_inks,
- &piezo_r300_360_quadtone_inks,
- &piezo_r300_360_quadtone_inks,
- &piezo_r300_360_quadtone_inks,
- &piezo_r300_720_quadtone_inks,
- &piezo_r300_1440_quadtone_inks,
- &piezo_r300_2880_quadtone_inks,
- &piezo_r300_2880_1440_quadtone_inks,
- &piezo_r300_2880_1440_quadtone_inks,
- }
-};
-
-static const escp2_variable_inklist_t variable_680_4pl_inks =
-{
- {
- &escp2_680_multishot_standard_inks,
- &escp2_680_multishot_standard_inks,
- &escp2_680_multishot_standard_inks,
- &escp2_680_multishot_standard_inks,
- &escp2_680_6pl_standard_inks,
- &escp2_4pl_standard_inks,
- &escp2_4pl_2880_standard_inks,
- &escp2_4pl_2880_standard_inks,
- &escp2_4pl_2880_standard_inks,
- },
- { NULL, },
- { NULL, },
- { NULL, },
- {
- &piezo_680_multishot_quadtone_inks,
- &piezo_680_multishot_quadtone_inks,
- &piezo_680_multishot_quadtone_inks,
- &piezo_680_multishot_quadtone_inks,
- &piezo_680_6pl_quadtone_inks,
- &piezo_4pl_quadtone_inks,
- &piezo_4pl_2880_quadtone_inks,
- &piezo_4pl_2880_quadtone_inks,
- &piezo_4pl_2880_quadtone_inks,
- }
-};
-
-static const escp2_variable_inklist_t variable_3pl_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_2880_standard_inks,
- &escp2_3pl_2880_standard_inks,
- &escp2_3pl_2880_standard_inks,
- },
- { NULL, },
- { NULL, },
- { NULL, },
- {
- &piezo_multishot_quadtone_inks,
- &piezo_multishot_quadtone_inks,
- &piezo_6pl_quadtone_980_inks,
- &piezo_6pl_quadtone_980_inks,
- &piezo_3pl_quadtone_inks,
- &piezo_3pl_1440_quadtone_inks,
- &piezo_3pl_2880_quadtone_inks,
- &piezo_3pl_2880_quadtone_inks,
- &piezo_3pl_2880_quadtone_inks,
- }
-};
-
-static const escp2_variable_inklist_t variable_2pl_inks =
-{
- {
- &escp2_2pl_360_standard_inks,
- &escp2_2pl_360_standard_inks,
- &escp2_2pl_360_standard_inks,
- &escp2_2pl_360_standard_inks,
- &escp2_2pl_720_standard_inks,
- &escp2_2pl_1440_standard_inks,
- &escp2_2pl_2880_standard_inks,
- &escp2_2pl_2880_standard_inks,
- &escp2_2pl_2880_standard_inks,
- },
- {
- &escp2_2pl_360_photo_inks,
- &escp2_2pl_360_photo_inks,
- &escp2_2pl_360_photo_inks,
- &escp2_2pl_360_photo_inks,
- &escp2_2pl_720_photo_inks,
- &escp2_2pl_1440_photo_inks,
- &escp2_2pl_2880_photo_inks,
- &escp2_2pl_2880_photo_inks,
- &escp2_2pl_2880_photo_inks
- },
- {
- &escp2_2pl_360_photoj_inks,
- &escp2_2pl_360_photoj_inks,
- &escp2_2pl_360_photoj_inks,
- &escp2_2pl_360_photoj_inks,
- &escp2_2pl_720_photoj_inks,
- &escp2_2pl_1440_photoj_inks,
- &escp2_2pl_2880_photoj_inks,
- &escp2_2pl_2880_photoj_inks,
- &escp2_2pl_2880_photoj_inks
- },
- { NULL, },
- {
- &piezo_2pl_360_quadtone_inks,
- &piezo_2pl_360_quadtone_inks,
- &piezo_2pl_360_quadtone_inks,
- &piezo_2pl_360_quadtone_inks,
- &piezo_2pl_720_quadtone_inks,
- &piezo_2pl_1440_quadtone_inks,
- &piezo_2pl_2880_quadtone_inks,
- &piezo_2pl_2880_quadtone_inks,
- &piezo_2pl_2880_quadtone_inks,
- }
-};
-
-static const escp2_variable_inklist_t variable_pigment_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
- },
- { NULL, },
- { NULL, },
- {
- &piezo_pigment_quadtone_inks,
- &piezo_pigment_quadtone_inks,
- &piezo_pigment_quadtone_inks,
- &piezo_pigment_quadtone_inks,
- &piezo_pigment_quadtone_inks,
- &piezo_pigment_quadtone_inks,
- &piezo_pigment_quadtone_inks,
- &piezo_pigment_quadtone_inks,
- &piezo_pigment_quadtone_inks
- },
-};
-
-static const escp2_variable_inklist_t variable_4pl_pigment_inks =
-{
- {
- &escp2_4pl_pigment_low_standard_inks,
- &escp2_4pl_pigment_low_standard_inks,
- &escp2_4pl_pigment_low_standard_inks,
- &escp2_4pl_pigment_low_standard_inks,
- &escp2_4pl_pigment_standard_inks,
- &escp2_4pl_pigment_1440_standard_inks,
- &escp2_4pl_pigment_2880_standard_inks,
- &escp2_4pl_pigment_2880_standard_inks,
- &escp2_4pl_pigment_2880_standard_inks,
- },
- {
- &escp2_4pl_pigment_low_photo_inks,
- &escp2_4pl_pigment_low_photo_inks,
- &escp2_4pl_pigment_low_photo_inks,
- &escp2_4pl_pigment_low_photo_inks,
- &escp2_4pl_pigment_photo_inks,
- &escp2_4pl_pigment_1440_photo_inks,
- &escp2_4pl_pigment_2880_photo_inks,
- &escp2_4pl_pigment_2880_photo_inks,
- &escp2_4pl_pigment_2880_photo_inks
- },
- { NULL, },
- {
- &escp2_4pl_pigment_low_photo2_inks,
- &escp2_4pl_pigment_low_photo2_inks,
- &escp2_4pl_pigment_low_photo2_inks,
- &escp2_4pl_pigment_low_photo2_inks,
- &escp2_4pl_pigment_photo2_inks,
- &escp2_4pl_pigment_1440_photo2_inks,
- &escp2_4pl_pigment_2880_photo2_inks,
- &escp2_4pl_pigment_2880_photo2_inks,
- &escp2_4pl_pigment_2880_photo2_inks
- },
-};
-
-static const escp2_variable_inklist_t variable_3pl_pigment_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,
- },
- { NULL, },
- { NULL, },
- { NULL, },
- {
- &piezo_economy_pigment_quadtone_inks,
- &piezo_economy_pigment_quadtone_inks,
- &piezo_multishot_pigment_quadtone_inks,
- &piezo_multishot_pigment_quadtone_inks,
- &piezo_6pl_pigment_quadtone_inks,
- &piezo_3pl_pigment_quadtone_inks,
- &piezo_3pl_pigment_2880_quadtone_inks,
- &piezo_3pl_pigment_2880_quadtone_inks,
- &piezo_3pl_pigment_2880_quadtone_inks,
- }
-};
-
-static const escp2_variable_inklist_t spro10000_inks =
-{
- {
- &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
- },
- {
- &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
- }
-};
-
-
-#define DECLARE_INK_CHANNEL(name) \
-static const ink_channel_t name##_channels = \
-{ \
- name##_subchannels, \
- sizeof(name##_subchannels) / sizeof(physical_subchannel_t), \
-}
-
-static const physical_subchannel_t standard_black_subchannels[] =
-{
- { 0, -1, 0 }
-};
-
-DECLARE_INK_CHANNEL(standard_black);
-
-static const physical_subchannel_t x80_black_subchannels[] =
-{
- { 0, -1, 48 }
-};
-
-DECLARE_INK_CHANNEL(x80_black);
-
-static const physical_subchannel_t c80_black_subchannels[] =
-{
- { 0, -1, 0 }
-};
-
-DECLARE_INK_CHANNEL(c80_black);
-
-static const physical_subchannel_t c64_black_subchannels[] =
-{
- { 0, -1, 0 }
-};
-
-DECLARE_INK_CHANNEL(c64_black);
-
-static const physical_subchannel_t standard_cyan_subchannels[] =
-{
- { 2, -1, 0 }
-};
-
-DECLARE_INK_CHANNEL(standard_cyan);
-
-static const physical_subchannel_t x80_cyan_subchannels[] =
-{
- { 2, -1, 96 }
-};
-
-DECLARE_INK_CHANNEL(x80_cyan);
-
-static const physical_subchannel_t c80_cyan_subchannels[] =
-{
- { 2, -1, 0 }
-};
-
-DECLARE_INK_CHANNEL(c80_cyan);
-
-static const physical_subchannel_t c64_cyan_subchannels[] =
-{
- { 2, -1, 0 }
-};
-
-DECLARE_INK_CHANNEL(c64_cyan);
-
-static const physical_subchannel_t standard_magenta_subchannels[] =
-{
- { 1, -1, 0 }
-};
-
-DECLARE_INK_CHANNEL(standard_magenta);
-
-static const physical_subchannel_t x80_magenta_subchannels[] =
-{
- { 1, -1, 48 }
-};
-
-DECLARE_INK_CHANNEL(x80_magenta);
-
-static const physical_subchannel_t c80_magenta_subchannels[] =
-{
- { 1, -1, 120 }
-};
-
-DECLARE_INK_CHANNEL(c80_magenta);
-
-static const physical_subchannel_t c64_magenta_subchannels[] =
-{
- { 1, -1, 90 }
-};
-
-DECLARE_INK_CHANNEL(c64_magenta);
-
-static const physical_subchannel_t standard_yellow_subchannels[] =
-{
- { 4, -1, 0 }
-};
-
-DECLARE_INK_CHANNEL(standard_yellow);
-
-static const physical_subchannel_t x80_yellow_subchannels[] =
-{
- { 4, -1, 0 }
-};
-
-DECLARE_INK_CHANNEL(x80_yellow);
-
-static const physical_subchannel_t c80_yellow_subchannels[] =
-{
- { 4, -1, 240 }
-};
-
-DECLARE_INK_CHANNEL(c80_yellow);
-
-static const physical_subchannel_t c64_yellow_subchannels[] =
-{
- { 4, -1, 180 }
-};
-
-DECLARE_INK_CHANNEL(c64_yellow);
-
-static const physical_subchannel_t photo_black_subchannels[] =
-{
- { 0, 0, 0 }
-};
-
-DECLARE_INK_CHANNEL(photo_black);
-
-static const physical_subchannel_t photo_cyan_subchannels[] =
-{
- { 2, 0, 0 },
- { 2, 1, 0 }
-};
-
-DECLARE_INK_CHANNEL(photo_cyan);
-
-static const physical_subchannel_t photo_magenta_subchannels[] =
-{
- { 1, 0, 0 },
- { 1, 1, 0 }
-};
-
-DECLARE_INK_CHANNEL(photo_magenta);
-
-static const physical_subchannel_t photo_yellow_subchannels[] =
-{
- { 4, 0, 0 }
-};
-
-DECLARE_INK_CHANNEL(photo_yellow);
-
-/* For Japanese 7-color printers, with dark yellow */
-static const physical_subchannel_t photo2_yellow_subchannels[] =
-{
- { 4, 0, 0 },
- { 4, 2, 0 }
-};
-
-DECLARE_INK_CHANNEL(photo2_yellow);
-
-static const physical_subchannel_t photo2_black_subchannels[] =
-{
- { 0, 0, 0 },
- { 0, 1, 0 }
-};
-
-DECLARE_INK_CHANNEL(photo2_black);
-
-static const physical_subchannel_t quadtone_subchannels[] =
-{
- { 4, -1, 0 },
- { 1, -1, 0 },
- { 2, -1, 0 },
- { 0, -1, 0 }
-};
-
-DECLARE_INK_CHANNEL(quadtone);
-
-static const physical_subchannel_t c80_quadtone_subchannels[] =
-{
- { 4, -1, 240 },
- { 1, -1, 120 },
- { 2, -1, 0 },
- { 0, -1, 0 }
-};
-
-DECLARE_INK_CHANNEL(c80_quadtone);
-
-static const physical_subchannel_t c64_quadtone_subchannels[] =
-{
- { 4, -1, 180 },
- { 1, -1, 90 },
- { 2, -1, 0 },
- { 0, -1, 0 }
-};
-
-DECLARE_INK_CHANNEL(c64_quadtone);
-
-static const physical_subchannel_t f360_standard_cyan_subchannels[] =
-{
- { 2, -1, 1 }
-};
-
-DECLARE_INK_CHANNEL(f360_standard_cyan);
-
-static const physical_subchannel_t f360_standard_magenta_subchannels[] =
-{
- { 1, -1, 1 }
-};
-
-DECLARE_INK_CHANNEL(f360_standard_magenta);
-
-static const physical_subchannel_t f360_photo_black_subchannels[] =
-{
- { 0, 0, 1 }
-};
-
-DECLARE_INK_CHANNEL(f360_photo_black);
-
-static const physical_subchannel_t f360_photo_yellow_subchannels[] =
-{
- { 4, 0, 1 }
-};
-
-DECLARE_INK_CHANNEL(f360_photo_yellow);
-
-static const physical_subchannel_t f360_photo2_yellow_subchannels[] =
-{
- { 4, 2, 0 },
- { 4, 0, 1 }
-};
-
-DECLARE_INK_CHANNEL(f360_photo2_yellow);
-
-static const physical_subchannel_t f360_photo2_black_subchannels[] =
-{
- { 0, 0, 1 },
- { 0, 1, 0 }
-};
-
-DECLARE_INK_CHANNEL(f360_photo2_black);
-
-static const physical_subchannel_t f360_photo_cyan_subchannels[] =
-{
- { 2, 0, 1 },
- { 2, 1, 0 }
-};
-
-DECLARE_INK_CHANNEL(f360_photo_cyan);
-
-static const physical_subchannel_t f360_photo_magenta_subchannels[] =
-{
- { 1, 0, 1 },
- { 1, 1, 0 }
-};
-
-DECLARE_INK_CHANNEL(f360_photo_magenta);
-
-
-
-static const escp2_inkname_t three_color_composite_inkset =
-{
- "RGB", N_ ("Three Color Composite"), 1, INKSET_CMYK, 0, 0,
- standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment,
- {
- NULL, &standard_cyan_channels,
- &standard_magenta_channels, &standard_yellow_channels
- }
-};
-
-static const escp2_inkname_t x80_three_color_composite_inkset =
-{
- "RGB", N_ ("Three Color Composite"), 1, INKSET_CMYK, 0, 0,
- standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment,
- {
- NULL, &x80_cyan_channels,
- &x80_magenta_channels, &x80_yellow_channels
- }
-};
-
-static const escp2_inkname_t c80_three_color_composite_inkset =
-{
- "RGB", N_ ("Three Color Composite"), 1, INKSET_CMYK, 0, 0,
- standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment,
- {
- NULL, &c80_cyan_channels,
- &c80_magenta_channels, &c80_yellow_channels
- }
-};
-
-static const escp2_inkname_t c64_three_color_composite_inkset =
-{
- "RGB", N_ ("Three Color Composite"), 1, INKSET_CMYK, 0, 0,
- standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment,
- {
- NULL, &c64_cyan_channels,
- &c64_magenta_channels, &c64_yellow_channels
- }
-};
-
-static const escp2_inkname_t four_color_standard_inkset =
-{
- "CMYK", N_ ("Four Color Standard"), 1, INKSET_CMYK, .25, 1.0,
- standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment,
- {
- &standard_black_channels, &standard_cyan_channels,
- &standard_magenta_channels, &standard_yellow_channels
- }
-};
-
-static const escp2_inkname_t x80_four_color_standard_inkset =
-{
- "CMYK", N_ ("Four Color Standard"), 1, INKSET_CMYK, .25, 1.0,
- standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment,
- {
- &x80_black_channels, &x80_cyan_channels,
- &x80_magenta_channels, &x80_yellow_channels
- }
-};
-
-static const escp2_inkname_t c80_four_color_standard_inkset =
-{
- "CMYK", N_ ("Four Color Standard"), 1, INKSET_CMYK, .25, 1.0,
- standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment,
- {
- &c80_black_channels, &c80_cyan_channels,
- &c80_magenta_channels, &c80_yellow_channels
- }
-};
-
-static const escp2_inkname_t c64_four_color_standard_inkset =
-{
- "CMYK", N_ ("Four Color Standard"), 1, INKSET_CMYK, .25, 1.0,
- standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment,
- {
- &c64_black_channels, &c64_cyan_channels,
- &c64_magenta_channels, &c64_yellow_channels
- }
-};
-
-static const escp2_inkname_t six_color_photo_inkset =
-{
- "PhotoCMYK", N_ ("Six Color Photo"), 1, INKSET_CcMmYK, .5, 1.0,
- standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment,
- {
- &photo_black_channels, &photo_cyan_channels,
- &photo_magenta_channels, &photo_yellow_channels
- }
-};
-
-static const escp2_inkname_t five_color_photo_composite_inkset =
-{
- "PhotoCMY", N_ ("Five Color Photo Composite"), 1, INKSET_CcMmYK, 0, 0,
- standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment,
- {
- NULL, &photo_cyan_channels,
- &photo_magenta_channels, &photo_yellow_channels
- }
-};
-
-static const escp2_inkname_t j_seven_color_enhanced_inkset =
-{
- "Photo7J", N_ ("Seven Color Enhanced"), 1, INKSET_CcMmYyK, .5, 1.0,
- standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment,
- {
- &photo_black_channels, &photo_cyan_channels,
- &photo_magenta_channels, &photo2_yellow_channels
- }
-};
-
-static const escp2_inkname_t j_six_color_enhanced_composite_inkset =
-{
- "PhotoEnhanceJ", N_ ("Six Color Enhanced Composite"), 1, INKSET_CcMmYyK, .5, 1.0,
- standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment,
- {
- NULL, &standard_cyan_channels,
- &standard_magenta_channels, &standard_yellow_channels
- }
-};
-
-static const escp2_inkname_t seven_color_photo_inkset =
-{
- "PhotoCMYK7", N_ ("Seven Color Photo"), 1, INKSET_CcMmYKk, .05 , 1.0,
- standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment,
- {
- &photo2_black_channels, &photo_cyan_channels,
- &photo_magenta_channels, &photo_yellow_channels
- }
-};
-
-static const escp2_inkname_t two_color_grayscale_inkset =
-{
- "Gray2", N_ ("Two Level Grayscale"), 0, INKSET_CcMmYKk, 0, 0,
- NULL, NULL, NULL,
- {
- &photo2_black_channels, NULL, NULL, NULL
- }
-};
-
-static const escp2_inkname_t piezo_quadtone_inkset =
-{
- "Quadtone", N_ ("Quadtone"), 0, INKSET_PIEZO_QUADTONE, 0, 0,
- NULL, NULL, NULL,
- {
- &quadtone_channels, NULL, NULL, NULL
- }
-};
-
-static const escp2_inkname_t c80_piezo_quadtone_inkset =
-{
- "Quadtone", N_ ("Quadtone"), 0, INKSET_PIEZO_QUADTONE, 0, 0,
- NULL, NULL, NULL,
- {
- &c80_quadtone_channels, NULL, NULL, NULL
- }
-};
-
-static const escp2_inkname_t c64_piezo_quadtone_inkset =
-{
- "Quadtone", N_ ("Quadtone"), 0, INKSET_PIEZO_QUADTONE, 0, 0,
- NULL, NULL, NULL,
- {
- &c64_quadtone_channels, NULL, NULL, NULL
- }
-};
-
-static const escp2_inkname_t f360_six_color_photo_inkset =
-{
- "PhotoCMYK", N_("Six Color Photo"), 1, INKSET_CcMmYK, .5, 1.0,
- standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment,
- {
- &f360_photo_black_channels, &f360_photo_cyan_channels,
- &f360_photo_magenta_channels, &f360_photo_yellow_channels
- }
-};
-
-static const escp2_inkname_t f360_five_color_photo_composite_inkset =
-{
- "PhotoCMY", N_("Five Color Photo Composite"), 1, INKSET_CcMmYK, 0, 0,
- standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment,
- {
- NULL, &f360_photo_cyan_channels,
- &f360_photo_magenta_channels, &f360_photo_yellow_channels
- }
-};
-
-static const escp2_inkname_t f360_j_seven_color_enhanced_inkset =
-{
- "Photo7J", N_("Seven Color Enhanced"), 1, INKSET_CcMmYyK, .5, 1.0,
- standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment,
- {
- &f360_photo_black_channels, &f360_photo_cyan_channels,
- &f360_photo_magenta_channels, &f360_photo2_yellow_channels
- }
-};
-
-static const escp2_inkname_t f360_j_six_color_enhanced_composite_inkset =
-{
- "PhotoEnhanceJ", N_("Six Color Enhanced Composite"), 1, INKSET_CcMmYyK, .5, 1.0,
- standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment,
- {
- NULL, &f360_photo_cyan_channels,
- &f360_photo_magenta_channels, &f360_photo2_yellow_channels
- }
-};
-
-static const escp2_inkname_t f360_seven_color_photo_inkset =
-{
- "PhotoCMYK7", N_("Seven Color Photo"), 1, INKSET_CcMmYKk, .05 , 1.0,
- standard_lum_adjustment, standard_hue_adjustment, standard_sat_adjustment,
- {
- &f360_photo2_black_channels, &f360_photo_cyan_channels,
- &f360_photo_magenta_channels, &f360_photo_yellow_channels
- }
-};
-
-static const escp2_inkname_t f360_two_color_grayscale_inkset =
-{
- "Gray2", N_("Two Level Grayscale"), 0, INKSET_CcMmYKk, 0, 0,
- NULL, NULL, NULL,
- {
- &f360_photo2_black_channels
- }
-};
-
-
-#define DECLARE_INKLIST(name) \
-static const inklist_t name##_inklist = \
-{ \
- name##_ink_types, \
- sizeof(name##_ink_types) / sizeof(escp2_inkname_t *), \
-} \
-
-
-static const escp2_inkname_t *const cmy_ink_types[] =
-{
- &three_color_composite_inkset
-};
-
-DECLARE_INKLIST(cmy);
-
-static const escp2_inkname_t *const standard_ink_types[] =
-{
- &four_color_standard_inkset,
- &three_color_composite_inkset,
- &piezo_quadtone_inkset
-};
-
-DECLARE_INKLIST(standard);
-
-static const escp2_inkname_t *const c80_ink_types[] =
-{
- &c80_four_color_standard_inkset,
- &c80_three_color_composite_inkset,
- &c80_piezo_quadtone_inkset
-};
-
-DECLARE_INKLIST(c80);
-
-static const escp2_inkname_t *const c64_ink_types[] =
-{
- &c64_four_color_standard_inkset,
- &c64_three_color_composite_inkset,
- &c64_piezo_quadtone_inkset
-};
-
-DECLARE_INKLIST(c64);
-
-static const escp2_inkname_t *const x80_ink_types[] =
-{
- &x80_four_color_standard_inkset,
- &x80_three_color_composite_inkset,
-};
-
-DECLARE_INKLIST(x80);
-
-static const escp2_inkname_t *const photo_ink_types[] =
-{
- &six_color_photo_inkset,
- &five_color_photo_composite_inkset,
- &four_color_standard_inkset,
- &three_color_composite_inkset,
- &piezo_quadtone_inkset
-};
-
-DECLARE_INKLIST(photo);
-
-static const escp2_inkname_t *const f360_photo_ink_types[] =
-{
- &f360_six_color_photo_inkset,
- &f360_five_color_photo_composite_inkset,
- &four_color_standard_inkset,
- &three_color_composite_inkset,
- &piezo_quadtone_inkset
-};
-
-DECLARE_INKLIST(f360_photo);
-
-static const escp2_inkname_t *const photo7_japan_ink_types[] =
-{
- &j_seven_color_enhanced_inkset,
- &j_six_color_enhanced_composite_inkset,
- &six_color_photo_inkset,
- &five_color_photo_composite_inkset,
- &four_color_standard_inkset,
- &three_color_composite_inkset,
- &piezo_quadtone_inkset
-};
-
-DECLARE_INKLIST(photo7_japan);
-
-static const escp2_inkname_t *const f360_photo7_japan_ink_types[] =
-{
- &f360_j_seven_color_enhanced_inkset,
- &f360_j_six_color_enhanced_composite_inkset,
- &f360_six_color_photo_inkset,
- &f360_five_color_photo_composite_inkset,
- &four_color_standard_inkset,
- &three_color_composite_inkset,
- &piezo_quadtone_inkset
-};
-
-DECLARE_INKLIST(f360_photo7_japan);
-
-static const escp2_inkname_t *const photo7_ink_types[] =
-{
- &seven_color_photo_inkset,
- &six_color_photo_inkset,
- &five_color_photo_composite_inkset,
- &four_color_standard_inkset,
- &three_color_composite_inkset,
- &two_color_grayscale_inkset
-};
-
-DECLARE_INKLIST(photo7);
-
-static const escp2_inkname_t *const f360_photo7_ink_types[] =
-{
- &f360_seven_color_photo_inkset,
- &f360_six_color_photo_inkset,
- &f360_five_color_photo_composite_inkset,
- &four_color_standard_inkset,
- &three_color_composite_inkset,
- &two_color_grayscale_inkset
-};
-
-DECLARE_INKLIST(f360_photo7);
-
-
-
-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, 1.0, 0.95, .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 },
- { "ColorLife", N_("ColorLife 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},
- { "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 sp780_papers[] =
-{
- { "Plain", N_("Plain Paper"),
- 6, 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"),
- 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},
- { "Postcard", N_("Postcard"),
- 3, 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"),
- 0, 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"),
- 0, 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"),
- 0, 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"),
- 2, 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"),
- 6, 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"),
- 0, 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"),
- 2, 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"),
- 7, 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"),
- 7, 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"),
- 0, 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"),
- 2, 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 },
- { "ColorLife", N_("ColorLife Paper"),
- 2, 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},
- { "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 sp780_paper_list =
-{
- sizeof(sp780_papers) / sizeof(paper_t),
- sp780_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 },
- { "ColorLife", N_("ColorLife 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},
- { "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
-};
-
-static const paper_t sp950_papers[] =
-{
- { "Plain", N_("Plain Paper"),
- 6, 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"),
- 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},
- { "Postcard", N_("Postcard"),
- 3, 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"),
- 0, 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"),
- 0, 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"),
- 0, 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"),
- 2, 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"),
- 6, 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"),
- 0, 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"),
- 2, 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"),
- 7, 0, 0.85, 1.0, .999, 0.9, 1.04, 0.93, 0.9, 1.04, 0.93,
- 0.9, 1.0, 0x80, 0x00, 0x02,
- pgpp_hue_adjustment, pgpp_lum_adjustment, pgpp_sat_adjustment},
- { "Luster", N_("Premium Luster Photo Paper"),
- 7, 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"),
- 0, 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"),
- 2, 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 },
- { "ColorLife", N_("ColorLife Paper"),
- 2, 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},
- { "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 sp950_paper_list =
-{
- sizeof(sp950_papers) / sizeof(paper_t),
- sp950_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: 120/180
+ * 1: 360
+ * 2: 720x360
+ * 3: 720
+ * 4: 1440x720
+ * 5: 2880x720 or 1440x1440
+ * 6: 2880x1440
+ * 7: 2880x2880
*/
-/* 0 1 2 3 4 5 6 7 8 9 10 11 12 */
+/* 0 1 2 3 4 5 6 7 */
static const escp2_dot_size_t g1_dotsizes =
-{ -2, -1, -2, -1, -1, -2, -2, -1, -1, -1, -1, -1, -1 };
+{ -2, -2, -2, -2, -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 };
+{ -2, -2, -2, -2, -1, -1, -1, -1 };
static const escp2_dot_size_t g3_dotsizes =
-{ 3, -1, 3, -1, -1, 2, 1, 1, -1, 1, -1, -1, -1 };
+{ 3, 3, 2, 1, 1, -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 sp5000_dotsizes =
-{ -1, 3, -1, 3, -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 c6pl_dotsizes =
+{ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 };
-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 c4pl_dotsizes =
+{ 0x12, 0x12, 0x12, 0x11, 0x10, 0x10, 0x10, 0x10 };
-static const escp2_dot_size_t c6pl_dotsizes =
-{ -1, 0x10, -1, 0x10, -1, 0x10, -1, 0x10, -1, 0x10, -1, 0x10, 0x10 };
+static const escp2_dot_size_t c4pl_pigment_dotsizes =
+{ 0x12, 0x12, 0x12, 0x11, 0x11, 0x10, 0x10, 0x10 };
static const escp2_dot_size_t c3pl_dotsizes =
-{ -1, 0x11, -1, 0x11, -1, 0x11, -1, 0x10, -1, 0x10, -1, 0x10, 0x10 };
+{ 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 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 c3pl_pigment_dotsizes =
+{ 0x10, 0x10, 0x10, 0x11, 0x12, 0x12, 0x12, 0x12 };
static const escp2_dot_size_t p3pl_dotsizes =
-{ -1, 0x10, -1, 0x10, -1, 0x10, -1, 0x11, -1, 0x12, -1, -1, 0x12 };
+{ 0x10, 0x10, 0x10, 0x11, 0x12, 0x12, 0x12, 0x12 };
-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 p1_5pl_dotsizes =
+{ 0x10, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x13 };
-static const escp2_dot_size_t sc660_dotsizes =
-{ 3, -1, 3, -1, 3, 0, -1, 0, -1, 0, -1, -1, -1 };
+static const escp2_dot_size_t c2pl_dotsizes =
+{ 0x12, 0x12, 0x12, 0x11, 0x13, -1, 0x10, 0x10 };
+
+static const escp2_dot_size_t c1_8pl_dotsizes =
+{ 0x10, 0x10, 0x10, 0x10, 0x11, 0x12, 0x12, 0x13 };
+
+static const escp2_dot_size_t sc440_dotsizes =
+{ 3, 3, 2, 1, -1, -1, -1, -1 };
static const escp2_dot_size_t sc480_dotsizes =
-{ -1, 0x13, -1, 0x13, -1, 0x13, -1, 0x10, -1, 0x10, -1, 0x10, 0x10 };
+{ 0x13, 0x13, 0x13, 0x10, 0x10, 0x10, 0x10, 0x10 };
+
+static const escp2_dot_size_t sc600_dotsizes =
+{ 4, 4, 3, 2, 1, -1, -1, -1 };
+
+static const escp2_dot_size_t sc640_dotsizes =
+{ 3, 3, 2, 1, 1, -1, -1, -1 };
+
+static const escp2_dot_size_t sc660_dotsizes =
+{ 3, 3, 0, 0, 0, -1, -1, -1 };
static const escp2_dot_size_t sc670_dotsizes =
-{ -1, 0x12, -1, 0x12, -1, 0x12, -1, 0x11, -1, 0x11, -1, -1, -1 };
+{ 0x12, 0x12, 0x12, 0x11, 0x11, -1, -1, -1 };
+
+static const escp2_dot_size_t sp700_dotsizes =
+{ 3, 3, 2, 1, 4, -1, -1, -1 };
+
+static const escp2_dot_size_t sp720_dotsizes =
+{ 0x12, 0x12, 0x11, 0x11, 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 };
+{ 0x11, 0x11, 0x11, 0x10, 0x10, -1, -1, -1 };
static const escp2_dot_size_t spro_dye_dotsizes =
-{ 3, -1, 3, -1, 3, -1, 1, -1, 1, -1, -1, -1, -1 };
+{ 3, 3, 3, 1, 1, -1, -1, -1 };
static const escp2_dot_size_t spro_pigment_dotsizes =
-{ 3, -1, 3, -1, 2, -1, 1, -1, 1, -1, -1, -1, -1 };
+{ 3, 3, 2, 1, 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 };
+{ 4, 0x11, 0x11, 0x10, 0x10, -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 };
-
-static const escp2_dot_size_t c2pl_dotsizes =
-{ -1, 0x12, -1, 0x12, -1, 0x12, -1, 0x11, -1, 0x13, -1, 0x13, 0x10 };
-
-static const escp2_dot_size_t c1_8pl_dotsizes =
-{ -1, 0x10, -1, 0x10, -1, 0x10, -1, 0x10, -1, 0x11, -1, -1, 0x12 };
-
-static const escp2_dot_size_t c4pl_pigment_dotsizes =
-{ -1, 0x12, -1, 0x12, -1, 0x12, -1, 0x11, -1, 0x11, -1, 0x10, 0x10 };
+static const escp2_dot_size_t spro5000_dotsizes =
+{ 3, 3, 2, 1, 4, -1, -1, -1 };
static const escp2_dot_size_t spro_c4pl_pigment_dotsizes =
-{ 0x11, -1, 0x11, -1, 0x11, -1, 0x10, -1, 0x10, -1, 5, 5, 5 };
+{ 0x11, 0x11, 0x11, 0x10, 0x10, -1, 5, 5 };
/*
* Bits 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: 120/180
+ * 1: 360
+ * 2: 720x360
+ * 3: 720
+ * 4: 1440x720
+ * 5: 2880x720 or 1440x1440
+ * 6: 2880x1440
+ * 7: 2880x2880
*/
-/* 0 1 2 3 4 5 6 7 8 9 10 11 12 */
+/* 0 1 2 3 4 5 6 7 */
static const escp2_bits_t variable_bits =
-{ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 };
+{ 2, 2, 2, 2, 2, 2, 2, 2 };
static const escp2_bits_t stp950_bits =
-{ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1 };
+{ 2, 2, 2, 2, 2, 2, 1, 1 };
static const escp2_bits_t ultrachrome_bits =
-{ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1 };
+{ 2, 2, 2, 2, 2, 1, 1, 1 };
static const escp2_bits_t standard_bits =
-{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
+{ 1, 1, 1, 1, 1, 1, 1, 1 };
static const escp2_bits_t c1_8_bits =
-{ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1 };
-
+{ 2, 2, 2, 2, 2, 1, 1, 1 };
/*
* Base resolutions 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: 120/180
+ * 1: 360
+ * 2: 720x360
+ * 3: 720
+ * 4: 1440x720
+ * 5: 2880x720 or 1440x1440
+ * 6: 2880x1440
+ * 7: 2880x2880
*/
-/* 0 1 2 3 4 5 6 7 8 9 10 11 12 */
+/* 0 1 2 3 4 5 6 7 */
static const escp2_base_resolutions_t standard_base_res =
-{ 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720 };
+{ 720, 720, 720, 720, 720, 720, 720, 720 };
static const escp2_base_resolutions_t g3_base_res =
-{ 720, 720, 720, 720, 720, 720, 720, 720, 360, 360, 360, 360, 360 };
+{ 720, 720, 720, 720, 360, 360, 360, 360 };
static const escp2_base_resolutions_t variable_base_res =
-{ 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360 };
+{ 360, 360, 360, 360, 360, 360, 360, 360 };
static const escp2_base_resolutions_t stp950_base_res =
-{ 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 720, 720, 720 };
+{ 360, 360, 360, 360, 360, 720, 720, 720 };
static const escp2_base_resolutions_t ultrachrome_base_res =
-{ 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 720, 720, 720 };
+{ 360, 360, 360, 360, 360, 720, 720, 720 };
static const escp2_base_resolutions_t c1_8_base_res =
-{ 360, 360, 360, 360, 720, 720, 720, 720, 720, 720, 1440, 1440, 1440 };
+{ 360, 360, 720, 720, 720, 1440, 1440, 1440 };
+
+static const escp2_base_resolutions_t c1_5_base_res =
+{ 360, 360, 720, 720, 720, 720, 720, 720 };
static const escp2_base_resolutions_t stc900_base_res =
-{ 360, 360, 360, 360, 360, 360, 360, 360, 180, 180, 180, 180, 180 };
+{ 360, 360, 360, 360, 180, 180, 360, 360 };
static const escp2_base_resolutions_t pro_base_res =
-{ 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880 };
+{ 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880 };
/*
* 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: 120/180
+ * 1: 360
+ * 2: 720x360
+ * 3: 720
+ * 4: 1440x720
+ * 5: 2880x720 or 1440x1440
+ * 6: 2880x1440
+ * 7: 2880x2880
*/
-/* 0 1 2 3 4 5 6 7 8 9 10 11 12 */
+/* 0 1 2 3 4 5 6 7 */
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 };
+{ 2.6, 1.3, 1.3, 0.568, 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.388, 0.388, 0.194, 0.194, 0.097 };
-
-static const escp2_densities_t photo_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.546, 0.273 };
-
-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 };
+{ 2.6, 1.3, 0.65, 0.775, 0.388, 0.0, 0.0, 0.0, };
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.568, 0.568, 0.284 };
-
-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 };
+{ 4.0, 2.0, 1.0, 0.568, 0.568, 0.568, 0.0, 0.0 };
-static const escp2_densities_t sc680_densities =
-{ 2.0, 2.0, 1.2, 1.2, 0.60, 0.60, 0.792, 0.792, 0.792, 0.792, 0.594, 0.594, 0.297 };
+static const escp2_densities_t c4pl_2880_densities =
+{ 2.6, 1.3, 0.65, 0.650, 0.650, 0.650, 0.32, 0.0 };
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 p3pl_densities =
-{ 2.0, 2.0, 1.5, 1.5, 0.75, 0.75, 0.523, 0.523, 0.523, 0.523, 0.523, 0.523, 0.523 };
-
-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_dye_densities =
-{ 2.0, 2.0, 1.3, 1.3, 1.3, 1.3, 0.775, 0.775, 0.388, 0.388, 0.275, 0.275, 0.138 };
-
-static const escp2_densities_t spro_pigment_densities =
-{ 2.0, 2.0, 1.5, 1.5, 0.78, 0.78, 0.775, 0.775, 0.388, 0.388, 0.194, 0.194, 0.097 };
-
-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 };
-
-static const escp2_densities_t c2pl_densities =
-{ 2.0, 2.0, 1.15,1.15,0.57, 0.57, 0.650, 0.650, 0.650, 0.650, 0.650, 0.650, 0.650 };
+{ 2.6, 1.3, 0.65, 0.568, 0.523, 0.792, 0.396, 0.0 };
static const escp2_densities_t c4pl_pigment_densities =
-{ 2.0, 2.0, 1.35,1.35,0.68, 0.68, 0.518, 0.518, 0.518, 0.518, 0.518, 0.518, 0.259 };
-
-
-static const res_t standard_reslist[] =
-{
- { "360x90dpi", N_("360 x 90 DPI Fast Economy Draft"),
- 360, 90, 360, 90, 0, 0, 1, 1, 0, 1, 1, RES_120_M },
- { "360x90sw", N_("360 x 90 DPI Fast Economy Draft"),
- 360, 90, 360, 90, 1, 0, 1, 1, 0, 1, 1, RES_120 },
-
- { "360x120dpi", N_("360 x 120 DPI Economy Draft"),
- 360, 120, 360, 120, 0, 0, 1, 1, 0, 3, 1, RES_120_M },
- { "360x120sw", N_("360 x 120 DPI Economy Draft"),
- 360, 120, 360, 120, 1, 0, 1, 1, 0, 3, 1, RES_120 },
-
- { "180dpi", N_("180 DPI Economy Draft"),
- 180, 180, 180, 180, 0, 0, 1, 1, 0, 1, 1, RES_180_M },
- { "180sw", N_("180 DPI Economy Draft"),
- 180, 180, 180, 180, 1, 0, 1, 1, 0, 1, 1, RES_180 },
-
- { "360x240dpi", N_("360 x 240 DPI Draft"),
- 360, 240, 360, 240, 0, 0, 1, 1, 0, 3, 2, RES_180_M },
- { "360x240sw", N_("360 x 240 DPI Draft"),
- 360, 240, 360, 240, 1, 0, 1, 1, 0, 3, 2, RES_180 },
-
- { "360x180dpi", N_("360 x 180 DPI Draft"),
- 360, 180, 360, 180, 0, 0, 1, 1, 0, 1, 1, RES_180_M },
- { "360x180sw", N_("360 x 180 DPI Draft"),
- 360, 180, 360, 180, 1, 0, 1, 1, 0, 1, 1, RES_180 },
-
- { "360sw", N_("360 DPI"),
- 360, 360, 360, 360, 1, 0, 1, 1, 0, 1, 1, RES_360 },
- { "360swuni", N_("360 DPI Unidirectional"),
- 360, 360, 360, 360, 1, 0, 1, 1, 1, 1, 1, RES_360 },
- { "360mw", N_("360 DPI Interleave"),
- 360, 360, 360, 360, 0, 1, 1, 1, 0, 1, 1, RES_360_M },
- { "360mwuni", N_("360 DPI Interleave Unidirectional"),
- 360, 360, 360, 360, 0, 1, 1, 1, 1, 1, 1, RES_360_M },
- { "360dpi", N_("360 DPI"),
- 360, 360, 360, 360, 0, 0, 1, 1, 0, 1, 1, RES_360_M },
- { "360uni", N_("360 DPI Unidirectional"),
- 360, 360, 360, 360, 0, 0, 1, 1, 1, 1, 1, RES_360_M },
-
- { "720x360sw", N_("720 x 360 DPI"),
- 720, 360, 720, 360, 1, 0, 1, 1, 0, 2, 1, RES_720_360 },
- { "720x360swuni", N_("720 x 360 DPI Unidirectional"),
- 720, 360, 720, 360, 1, 0, 1, 1, 1, 2, 1, RES_720_360 },
+{ 2.3, 1.15, 0.58, 0.766, 0.388, 0.958, 0.479, 0.0 };
- { "720mw", N_("720 DPI Interleave"),
- 720, 720, 720, 720, 0, 1, 1, 1, 0, 1, 1, RES_720_M },
- { "720mwuni", N_("720 DPI Interleave Unidirectional"),
- 720, 720, 720, 720, 0, 1, 1, 1, 1, 1, 1, RES_720_M },
- { "720sw", N_("720 DPI"),
- 720, 720, 720, 720, 1, 0, 1, 1, 0, 1, 1, RES_720 },
- { "720swuni", N_("720 DPI Unidirectional"),
- 720, 720, 720, 720, 1, 0, 1, 1, 1, 1, 1, RES_720 },
- { "720hq", N_("720 DPI High Quality"),
- 720, 720, 720, 720, 1, 0, 2, 1, 0, 1, 1, RES_720 },
- { "720hquni", N_("720 DPI High Quality Unidirectional"),
- 720, 720, 720, 720, 1, 0, 2, 1, 1, 1, 1, RES_720 },
- { "720hq2", N_("720 DPI Highest Quality"),
- 720, 720, 720, 720, 1, 0, 4, 1, 1, 1, 1, RES_720 },
-
- { "1440x720mw", N_("1440 x 720 DPI Interleave"),
- 1440, 720, 1440, 720, 0, 1, 1, 1, 0, 1, 1, RES_1440_720_M },
- { "1440x720mwuni", N_("1440 x 720 DPI Interleave Unidirectional"),
- 1440, 720, 1440, 720, 0, 1, 1, 1, 1, 1, 1, RES_1440_720_M },
- { "1440x720sw", N_("1440 x 720 DPI"),
- 1440, 720, 1440, 720, 1, 0, 1, 1, 0, 1, 1, RES_1440_720 },
- { "1440x720swuni", N_("1440 x 720 DPI Unidirectional"),
- 1440, 720, 1440, 720, 1, 0, 1, 1, 1, 1, 1, RES_1440_720 },
- { "1440x720hq2", N_("1440 x 720 DPI Highest Quality"),
- 1440, 720, 1440, 720, 1, 0, 2, 1, 1, 1, 1, RES_1440_720 },
-
- {"2880x720sw", N_("2880 x 720 DPI"),
- 2880, 720, 2880, 720, 1, 0, 1, 1, 0, 1, 1, RES_2880_720},
- { "2880x720swuni", N_("2880 x 720 DPI Unidirectional"),
- 2880, 720, 2880, 720, 1, 0, 1, 1, 1, 1, 1, RES_2880_720},
-
- { "1440x1440sw", N_("1440 x 1440 DPI"),
- 1440, 1440, 1440, 1440, 1, 0, 1, 1, 1, 1, 1, RES_1440_1440},
- { "1440x1440hq2", N_("1440 x 1440 DPI Highest Quality"),
- 1440, 1440, 1440, 1440, 1, 0, 2, 1, 1, 1, 1, RES_1440_1440},
-
- { "2880x1440sw", N_("2880 x 1440 DPI"),
- 2880, 1440, 2880, 1440, 1, 0, 1, 1, 1, 1, 1, RES_2880_1440},
-
- { "", "", 0, 0, 0, 0, 0, 0, 0, 0, 1, -1 }
-};
-
-static const res_t sp5000_reslist[] =
-{
- { "180sw", N_("180 DPI Economy Draft"),
- 180, 180, 180, 180, 1, 0, 1, 1, 0, 4, 1, RES_180 },
-
- { "360x180sw", N_("360 x 180 DPI Draft"),
- 360, 180, 360, 180, 1, 0, 1, 1, 0, 4, 1, RES_180 },
-
- { "360sw", N_("360 DPI"),
- 360, 360, 360, 360, 1, 0, 1, 1, 0, 2, 1, RES_360 },
- { "360swuni", N_("360 DPI Unidirectional"),
- 360, 360, 360, 360, 1, 0, 1, 1, 1, 2, 1, RES_360 },
-
- { "720x360sw", N_("720 x 360 DPI"),
- 720, 360, 720, 360, 1, 0, 1, 1, 0, 2, 1, RES_720_360 },
- { "720x360swuni", N_("720 x 360 DPI Unidirectional"),
- 720, 360, 720, 360, 1, 0, 1, 1, 1, 2, 1, RES_720_360 },
-
- { "720sw", N_("720 DPI"),
- 720, 720, 720, 720, 1, 0, 1, 1, 0, 1, 1, RES_720 },
- { "720swuni", N_("720 DPI Unidirectional"),
- 720, 720, 720, 720, 1, 0, 1, 1, 1, 1, 1, RES_720 },
- { "720hq", N_("720 DPI High Quality"),
- 720, 720, 720, 720, 1, 0, 2, 1, 0, 1, 1, RES_720 },
- { "720hquni", N_("720 DPI High Quality Unidirectional"),
- 720, 720, 720, 720, 1, 0, 2, 1, 1, 1, 1, RES_720 },
- { "720hq2", N_("720 DPI Highest Quality"),
- 720, 720, 720, 720, 1, 0, 4, 1, 1, 1, 1, RES_720 },
-
- { "1440x720sw", N_("1440 x 720 DPI"),
- 1440, 720, 1440, 720, 1, 0, 1, 1, 0, 1, 1, RES_1440_720 },
- { "1440x720swuni", N_("1440 x 720 DPI Unidirectional"),
- 1440, 720, 1440, 720, 1, 0, 1, 1, 1, 1, 1, RES_1440_720 },
- { "1440x720hq2", N_("1440 x 720 DPI Highest Quality"),
- 1440, 720, 1440, 720, 1, 0, 2, 1, 1, 1, 1, RES_1440_720 },
-
- { "", "", 0, 0, 0, 0, 0, 0, 0, 0, 1, -1 }
-};
-
-static const res_t escp950_reslist[] =
-{
- { "360x180dpi", N_("360 x 180 DPI Draft"),
- 360, 180, 360, 180, 0, 0, 1, 1, 0, 1, 1, RES_180_M },
- { "360x180sw", N_("360 x 180 DPI Draft"),
- 360, 180, 360, 180, 1, 0, 1, 1, 0, 1, 1, RES_180 },
-
- { "360sw", N_("360 DPI"),
- 360, 360, 360, 360, 1, 0, 1, 1, 0, 1, 1, RES_360 },
- { "360swuni", N_("360 DPI Unidirectional"),
- 360, 360, 360, 360, 1, 0, 1, 1, 1, 1, 1, RES_360 },
-
- { "720x360sw", N_("720 x 360 DPI"),
- 720, 360, 720, 360, 1, 0, 1, 1, 0, 2, 1, RES_720_360 },
- { "720x360swuni", N_("720 x 360 DPI Unidirectional"),
- 720, 360, 720, 360, 1, 0, 1, 1, 1, 2, 1, RES_720_360 },
-
- { "720sw", N_("720 DPI"),
- 720, 720, 720, 720, 1, 0, 1, 1, 0, 1, 1, RES_720 },
- { "720swuni", N_("720 DPI Unidirectional"),
- 720, 720, 720, 720, 1, 0, 1, 1, 1, 1, 1, RES_720 },
- { "720hq", N_("720 DPI High Quality"),
- 720, 720, 720, 720, 1, 0, 2, 1, 0, 1, 1, RES_720 },
- { "720hquni", N_("720 DPI High Quality Unidirectional"),
- 720, 720, 720, 720, 1, 0, 2, 1, 1, 1, 1, RES_720 },
- { "720hq2", N_("720 DPI Highest Quality"),
- 720, 720, 720, 720, 1, 0, 4, 1, 1, 1, 1, RES_720 },
-
- { "1440x720sw", N_("1440 x 720 DPI"),
- 1440, 720, 1440, 720, 1, 0, 1, 1, 0, 1, 1, RES_1440_720 },
- { "1440x720swuni", N_("1440 x 720 DPI Unidirectional"),
- 1440, 720, 1440, 720, 1, 0, 1, 1, 1, 1, 1, RES_1440_720 },
- { "1440x720hq2", N_("1440 x 720 DPI Highest Quality"),
- 1440, 720, 1440, 720, 1, 0, 2, 1, 1, 1, 1, RES_1440_720 },
-
- { "2880x720sw", N_("2880 x 720 DPI"),
- 2880, 1440, 2880, 720, 1, 0, 1, 1, 0, 1, 1, RES_2880_1440},
- { "2880x720swuni", N_("2880 x 720 DPI Unidirectional"),
- 2880, 1440, 2880, 720, 1, 0, 1, 1, 1, 1, 1, RES_2880_1440},
-
- { "1440x1440sw", N_("1440 x 1440 DPI"),
- 2880, 1440, 1440, 1440, 1, 0, 1, 1, 1, 1, 1, RES_2880_1440},
- { "1440x1440hq2", N_("1440 x 1440 DPI Highest Quality"),
- 2880, 1440, 1440, 1440, 1, 0, 1, 1, 1, 1, 1, RES_2880_1440},
-
- { "2880x1440sw", N_("2880 x 1440 DPI"),
- 2880, 1440, 2880, 1440, 1, 0, 1, 1, 1, 1, 1, RES_2880_1440},
-
- { "", "", 0, 0, 0, 0, 0, 0, 0, 0, 1, -1 }
-};
-
-static const res_t c1_8pl_reslist[] =
-{
- { "720x360sw", N_("720 x 360 DPI"),
- 720, 360, 720, 360, 1, 0, 1, 1, 0, 2, 1, RES_720_360 },
- { "720x360swuni", N_("720 x 360 DPI Unidirectional"),
- 720, 360, 720, 360, 1, 0, 1, 1, 1, 2, 1, RES_720_360 },
-
- { "720sw", N_("720 DPI"),
- 720, 720, 720, 720, 1, 0, 1, 1, 0, 1, 1, RES_720 },
- { "720swuni", N_("720 DPI Unidirectional"),
- 720, 720, 720, 720, 1, 0, 1, 1, 1, 1, 1, RES_720 },
- { "720hq", N_("720 DPI High Quality"),
- 720, 720, 720, 720, 1, 0, 2, 1, 0, 1, 1, RES_720 },
- { "720hquni", N_("720 DPI High Quality Unidirectional"),
- 720, 720, 720, 720, 1, 0, 2, 1, 1, 1, 1, RES_720 },
- { "720hq2", N_("720 DPI Highest Quality"),
- 720, 720, 720, 720, 1, 0, 4, 1, 1, 1, 1, RES_720 },
-
- { "1440x720sw", N_("1440 x 720 DPI"),
- 1440, 720, 1440, 720, 1, 0, 1, 1, 0, 1, 1, RES_1440_720 },
- { "1440x720swuni", N_("1440 x 720 DPI Unidirectional"),
- 1440, 720, 1440, 720, 1, 0, 1, 1, 1, 1, 1, RES_1440_720 },
- { "1440x720hq2", N_("1440 x 720 DPI Highest Quality"),
- 1440, 720, 1440, 720, 1, 0, 2, 1, 1, 1, 1, RES_1440_720 },
-
- { "2880x1440sw", N_("2880 x 1440 DPI"),
- 2880, 1440, 2880, 1440, 1, 0, 1, 1, 1, 1, 1, RES_2880_1440},
-
- { "", "", 0, 0, 0, 0, 0, 0, 0, 0, 1, -1 }
-};
-
-static const res_t escp2200_reslist[] =
-{
- { "360x180dpi", N_("360 x 180 DPI Draft"),
- 360, 180, 360, 180, 0, 0, 1, 1, 0, 1, 1, RES_180_M },
- { "360x180sw", N_("360 x 180 DPI Draft"),
- 360, 180, 360, 180, 1, 0, 1, 1, 0, 1, 1, RES_180 },
-
- { "360sw", N_("360 DPI"),
- 360, 360, 360, 360, 1, 0, 1, 1, 0, 1, 1, RES_360 },
- { "360swuni", N_("360 DPI Unidirectional"),
- 360, 360, 360, 360, 1, 0, 1, 1, 1, 1, 1, RES_360 },
-
- { "720x360sw", N_("720 x 360 DPI"),
- 720, 360, 720, 360, 1, 0, 1, 1, 0, 2, 1, RES_720_360 },
- { "720x360swuni", N_("720 x 360 DPI Unidirectional"),
- 720, 360, 720, 360, 1, 0, 1, 1, 1, 2, 1, RES_720_360 },
-
- { "720sw", N_("720 DPI"),
- 720, 720, 720, 720, 1, 0, 1, 1, 0, 1, 1, RES_720 },
- { "720swuni", N_("720 DPI Unidirectional"),
- 720, 720, 720, 720, 1, 0, 1, 1, 1, 1, 1, RES_720 },
- { "720hq", N_("720 DPI High Quality"),
- 720, 720, 720, 720, 1, 0, 2, 1, 0, 1, 1, RES_720 },
- { "720hquni", N_("720 DPI High Quality Unidirectional"),
- 720, 720, 720, 720, 1, 0, 2, 1, 1, 1, 1, RES_720 },
- { "720hq2", N_("720 DPI Highest Quality"),
- 720, 720, 720, 720, 1, 0, 4, 1, 1, 1, 1, RES_720 },
-
- { "1440x720sw", N_("1440 x 720 DPI"),
- 1440, 720, 1440, 720, 1, 0, 1, 1, 0, 1, 1, RES_1440_720 },
- { "1440x720swuni", N_("1440 x 720 DPI Unidirectional"),
- 1440, 720, 1440, 720, 1, 0, 1, 1, 1, 1, 1, RES_1440_720 },
- { "1440x720hq2", N_("1440 x 720 DPI Highest Quality"),
- 1440, 720, 1440, 720, 1, 0, 2, 1, 1, 1, 1, RES_1440_720 },
-
- { "2880x720sw", N_("2880 x 720 DPI"),
- 2880, 720, 2880, 720, 1, 0, 1, 1, 0, 1, 1, RES_2880_720},
- { "2880x720swuni", N_("2880 x 720 DPI Unidirectional"),
- 2880, 720, 2880, 720, 1, 0, 1, 1, 1, 1, 1, RES_2880_720},
-
- { "1440x1440sw", N_("1440 x 1440 DPI"),
- 2880, 1440, 1440, 1440, 1, 0, 1, 1, 1, 1, 1, RES_2880_1440},
- { "1440x1440hq2", N_("1440 x 1440 DPI Highest Quality"),
- 2880, 1440, 1440, 1440, 1, 0, 1, 1, 1, 1, 1, RES_2880_1440},
-
- { "2880x1440sw", N_("2880 x 1440 DPI"),
- 2880, 1440, 2880, 1440, 1, 0, 1, 1, 1, 1, 1, RES_2880_1440},
-
- { "", "", 0, 0, 0, 0, 0, 0, 0, 0, 1, -1 }
-};
-
-static const res_t no_interleave_reslist[] =
-{
- { "360x90dpi", N_("360 x 90 DPI Fast Economy Draft"),
- 360, 90, 360, 90, 0, 0, 1, 1, 0, 1, 1, RES_120_M },
- { "360x90sw", N_("360 x 90 DPI Fast Economy Draft"),
- 360, 90, 360, 90, 1, 0, 1, 1, 0, 1, 1, RES_120 },
-
- { "360x120dpi", N_("360 x 120 DPI Economy Draft"),
- 360, 120, 360, 120, 0, 0, 1, 1, 0, 3, 1, RES_120_M },
- { "360x120sw", N_("360 x 120 DPI Economy Draft"),
- 360, 120, 360, 120, 1, 0, 1, 1, 0, 3, 1, RES_120 },
-
- { "180dpi", N_("180 DPI Economy Draft"),
- 180, 180, 180, 180, 0, 0, 1, 1, 0, 1, 1, RES_180_M },
- { "180sw", N_("180 DPI Economy Draft"),
- 180, 180, 180, 180, 1, 0, 1, 1, 0, 1, 1, RES_180 },
-
- { "360x240dpi", N_("360 x 240 DPI Draft"),
- 360, 240, 360, 240, 0, 0, 1, 1, 0, 3, 2, RES_180_M },
- { "360x240sw", N_("360 x 240 DPI Draft"),
- 360, 240, 360, 240, 1, 0, 1, 1, 0, 3, 2, RES_180 },
-
- { "360x180dpi", N_("360 x 180 DPI Draft"),
- 360, 180, 360, 180, 0, 0, 1, 1, 0, 1, 1, RES_180_M },
- { "360x180sw", N_("360 x 180 DPI Draft"),
- 360, 180, 360, 180, 1, 0, 1, 1, 0, 1, 1, RES_180 },
-
- { "360sw", N_("360 DPI"),
- 360, 360, 360, 360, 1, 0, 1, 1, 0, 1, 1, RES_360 },
- { "360swuni", N_("360 DPI Unidirectional"),
- 360, 360, 360, 360, 1, 0, 1, 1, 1, 1, 1, RES_360 },
- { "360dpi", N_("360 DPI"),
- 360, 360, 360, 360, 0, 0, 1, 1, 0, 1, 1, RES_360_M },
- { "360uni", N_("360 DPI Unidirectional"),
- 360, 360, 360, 360, 0, 0, 1, 1, 1, 1, 1, RES_360_M },
-
- { "720x360sw", N_("720 x 360 DPI"),
- 720, 360, 720, 360, 1, 0, 1, 1, 0, 2, 1, RES_720_360 },
- { "720x360swuni", N_("720 x 360 DPI Unidirectional"),
- 720, 360, 720, 360, 1, 0, 1, 1, 1, 2, 1, RES_720_360 },
-
- { "720sw", N_("720 DPI"),
- 720, 720, 720, 720, 1, 0, 1, 1, 0, 1, 1, RES_720 },
- { "720swuni", N_("720 DPI Unidirectional"),
- 720, 720, 720, 720, 1, 0, 1, 1, 1, 1, 1, RES_720 },
- { "720hq", N_("720 DPI High Quality"),
- 720, 720, 720, 720, 1, 0, 2, 1, 0, 1, 1, RES_720 },
- { "720hquni", N_("720 DPI High Quality Unidirectional"),
- 720, 720, 720, 720, 1, 0, 2, 1, 1, 1, 1, RES_720 },
- { "720hq2", N_("720 DPI Highest Quality"),
- 720, 720, 720, 720, 1, 0, 4, 1, 1, 1, 1, RES_720 },
-
- { "1440x720sw", N_("1440 x 720 DPI"),
- 1440, 720, 1440, 720, 1, 0, 1, 1, 0, 1, 1, RES_1440_720 },
- { "1440x720swuni", N_("1440 x 720 DPI Unidirectional"),
- 1440, 720, 1440, 720, 1, 0, 1, 1, 1, 1, 1, RES_1440_720 },
- { "1440x720hq2", N_("1440 x 720 DPI Highest Quality"),
- 1440, 720, 1440, 720, 1, 0, 2, 1, 1, 1, 1, RES_1440_720 },
+static const escp2_densities_t c3pl_pigment_densities =
+{ 2.4, 1.2, 0.60, 0.600, 0.512, 0.512, 0.512, 0.0 };
- { "2880x720sw", N_("2880 x 720 DPI"),
- 2880, 720, 2880, 720, 1, 0, 1, 1, 0, 1, 1, RES_2880_720},
- { "2880x720swuni", N_("2880 x 720 DPI Unidirectional"),
- 2880, 720, 2880, 720, 1, 0, 1, 1, 1, 1, 1, RES_2880_720},
+static const escp2_densities_t c3pl_pigment_c66_densities =
+{ 2.8, 1.4, 0.70, 0.600, 0.512, 0.512, 0.512, 0.0 };
- { "1440x1440sw", N_("1440 x 1440 DPI"),
- 1440, 1440, 1440, 1440, 1, 0, 1, 1, 1, 1, 1, RES_1440_1440},
- { "1440x1440hq2", N_("1440 x 1440 DPI Highest Quality"),
- 1440, 1440, 1440, 1440, 1, 0, 2, 1, 1, 1, 1, RES_1440_1440},
+static const escp2_densities_t c3pl_densities =
+{ 2.6, 1.3, 0.65, 0.730, 0.7, 0.91, 0.455, 0.0 };
- { "2880x1440sw", N_("2880 x 1440 DPI"),
- 2880, 1440, 2880, 1440, 1, 0, 1, 1, 1, 1, 1, RES_2880_1440},
+static const escp2_densities_t p3pl_densities =
+{ 4.0, 2.0, 1.00, 0.815, 0.788, 0.821, 0.680, 0.340 };
- { "", "", 0, 0, 0, 0, 0, 0, 0, 0, 1, -1 }
-};
+static const escp2_densities_t p1_5pl_densities =
+{ 2.8, 1.4, 1.00, 1.000, 0.869, 0.942, 0.471, 0.500 };
-static const res_t pro_reslist[] =
-{
- { "360x90dpi", N_("360 x 90 DPI Fast Economy Draft"),
- 360, 90, 360, 90, 0, 0, 1, 1, 0, 1, 1, RES_120_M },
+static const escp2_densities_t c2pl_densities =
+{ 2.0, 1.0, 0.5, 0.650, 0.650, 0.0, 0.650, 0.325 };
- { "360x120dpi", N_("360 x 120 DPI Economy Draft"),
- 360, 120, 360, 120, 0, 0, 1, 1, 0, 3, 1, RES_120_M },
+static const escp2_densities_t c1_8pl_densities =
+{ 2.3, 1.15, 0.57, 0.650, 0.650, 0.0, 0.650, 0.360 };
- { "180dpi", N_("180 DPI Economy Draft"),
- 180, 180, 180, 180, 0, 0, 1, 1, 0, 1, 1, RES_180_M },
+static const escp2_densities_t sc1500_densities =
+{ 2.6, 1.3, 1.3, 0.631, 0.0, 0.0, 0.0, 0.0 };
- { "360x240dpi", N_("360 x 240 DPI Draft"),
- 360, 240, 360, 240, 0, 0, 1, 1, 0, 3, 2, RES_180_M },
+static const escp2_densities_t sc440_densities =
+{ 4.0, 2.0, 1.0, 0.900, 0.45, 0.0, 0.0, 0.0 };
- { "360x180dpi", N_("360 x 180 DPI Draft"),
- 360, 180, 360, 180, 0, 0, 1, 1, 0, 1, 1, RES_180_M },
+static const escp2_densities_t sc480_densities =
+{ 2.8, 1.4, 0.7, 0.710, 0.710, 0.546, 0.0, 0.0 };
- { "360mw", N_("360 DPI Interleave"),
- 360, 360, 360, 360, 0, 1, 1, 1, 0, 1, 1, RES_360_M },
- { "360mwuni", N_("360 DPI Interleave Unidirectional"),
- 360, 360, 360, 360, 0, 1, 1, 1, 1, 1, 1, RES_360_M },
- { "360dpi", N_("360 DPI"),
- 360, 360, 360, 360, 0, 0, 1, 1, 0, 1, 1, RES_360_M },
- { "360uni", N_("360 DPI Unidirectional"),
- 360, 360, 360, 360, 0, 0, 1, 1, 1, 1, 1, RES_360_M },
- { "360fol", N_("360 DPI Full Overlap"),
- 360, 360, 360, 360, 0, 2, 1, 1, 0, 1, 1, RES_360_M },
- { "360foluni", N_("360 DPI Full Overlap Unidirectional"),
- 360, 360, 360, 360, 0, 2, 1, 1, 1, 1, 1, RES_360_M },
- { "360fol2", N_("360 DPI FOL2"),
- 360, 360, 360, 360, 0, 4, 1, 1, 0, 1, 1, RES_360_M },
- { "360fol2uni", N_("360 DPI FOL2 Unidirectional"),
- 360, 360, 360, 360, 0, 4, 1, 1, 1, 1, 1, RES_360_M },
- { "360mw2", N_("360 DPI MW2"),
- 360, 360, 360, 360, 0, 5, 1, 1, 0, 1, 1, RES_360_M },
- { "360mw2uni", N_("360 DPI MW2 Unidirectional"),
- 360, 360, 360, 360, 0, 5, 1, 1, 1, 1, 1, RES_360_M },
+static const escp2_densities_t sc660_densities =
+{ 4.0, 2.0, 1.0, 0.646, 0.323, 0.0, 0.0, 0.0 };
- { "720x360dpi", N_("720 x 360 DPI"),
- 720, 360, 720, 360, 0, 0, 1, 1, 0, 2, 1, RES_720_360_M },
- { "720x360uni", N_("720 x 360 DPI Unidirectional"),
- 720, 360, 720, 360, 0, 0, 1, 1, 1, 2, 1, RES_720_360_M },
- { "720x360mw", N_("720 x 360 DPI Interleave"),
- 720, 360, 720, 360, 0, 1, 1, 1, 0, 2, 1, RES_720_360_M },
- { "720x360mwuni", N_("720 x 360 DPI Interleave Unidirectional"),
- 720, 360, 720, 360, 0, 1, 1, 1, 1, 2, 1, RES_720_360_M },
- { "720x360fol", N_("720 x 360 DPI FOL"),
- 720, 360, 720, 360, 0, 2, 1, 1, 0, 2, 1, RES_720_360_M },
- { "720x360foluni", N_("720 x 360 DPI FOL Unidirectional"),
- 720, 360, 720, 360, 0, 2, 1, 1, 1, 2, 1, RES_720_360_M },
- { "720x360fol2", N_("720 x 360 DPI FOL2"),
- 720, 360, 720, 360, 0, 4, 1, 1, 0, 2, 1, RES_720_360_M },
- { "720x360fol2uni", N_("720 x 360 DPI FOL2 Unidirectional"),
- 720, 360, 720, 360, 0, 4, 1, 1, 1, 2, 1, RES_720_360_M },
- { "720x360mw2", N_("720 x 360 DPI MW2"),
- 720, 360, 720, 360, 0, 5, 1, 1, 0, 2, 1, RES_720_360_M },
- { "720x360mw2uni", N_("720 x 360 DPI MW2 Unidirectional"),
- 720, 360, 720, 360, 0, 5, 1, 1, 1, 2, 1, RES_720_360_M },
+static const escp2_densities_t sc980_densities =
+{ 2.6, 1.3, 0.65, 0.511, 0.49, 0.637, 0.455, 0.0 };
- { "720mw", N_("720 DPI Interleave"),
- 720, 720, 720, 720, 0, 1, 1, 1, 0, 1, 1, RES_720_M },
- { "720mwuni", N_("720 DPI Interleave Unidirectional"),
- 720, 720, 720, 720, 0, 1, 1, 1, 1, 1, 1, RES_720_M },
- { "720fol", N_("720 DPI Full Overlap"),
- 720, 720, 720, 720, 0, 2, 1, 1, 0, 1, 1, RES_720_M },
- { "720foluni", N_("720 DPI Full Overlap Unidirectional"),
- 720, 720, 720, 720, 0, 2, 1, 1, 1, 1, 1, RES_720_M },
- { "720fourp", N_("720 DPI Four Pass"),
- 720, 720, 720, 720, 0, 3, 1, 1, 0, 1, 1, RES_720_M },
- { "720fourpuni", N_("720 DPI Four Pass Unidirectional"),
- 720, 720, 720, 720, 0, 3, 1, 1, 1, 1, 1, RES_720_M },
+static const escp2_densities_t sp700_densities =
+{ 2.6, 1.3, 1.3, 0.775, 0.55, 0.0, 0.0, 0.0 };
- { "1440x720mw", N_("1440 x 720 DPI Interleave"),
- 1440, 720, 1440, 720, 0, 1, 1, 1, 0, 1, 1, RES_1440_720_M },
- { "1440x720mwuni", N_("1440 x 720 DPI Interleave Unidirectional"),
- 1440, 720, 1440, 720, 0, 1, 1, 1, 1, 1, 1, RES_1440_720_M },
- { "1440x720fol", N_("1440 x 720 DPI FOL"),
- 1440, 720, 1440, 720, 0, 2, 1, 1, 0, 1, 1, RES_1440_720_M },
- { "1440x720foluni", N_("1440 x 720 DPI FOL Unidirectional"),
- 1440, 720, 1440, 720, 0, 2, 1, 1, 1, 1, 1, RES_1440_720_M },
- { "1440x720fourp", N_("1440 x 720 DPI Four Pass"),
- 1440, 720, 1440, 720, 0, 3, 1, 1, 0, 1, 1, RES_1440_720_M },
- { "1440x720fourpuni", N_("1440 x 720 DPI Four Pass Unidirectional"),
- 1440, 720, 1440, 720, 0, 3, 1, 1, 1, 1, 1, RES_1440_720_M },
+static const escp2_densities_t sp2000_densities =
+{ 2.6, 1.3, 0.65, 0.852, 0.438, 0.219, 0.0, 0.0 };
- { "2880x720mw", N_("2880 x 720 DPI Interleave"),
- 2880, 720, 2880, 720, 0, 1, 1, 1, 0, 1, 1, RES_2880_720_M },
- { "2880x720mwuni", N_("2880 x 720 DPI Interleave Unidirectional"),
- 2880, 720, 2880, 720, 0, 1, 1, 1, 1, 1, 1, RES_2880_720_M },
- { "2880x720fol", N_("2880 x 720 DPI FOL"),
- 2880, 720, 2880, 720, 0, 2, 1, 1, 0, 1, 1, RES_2880_720_M },
- { "2880x720foluni", N_("2880 x 720 DPI FOL Unidirectional"),
- 2880, 720, 2880, 720, 0, 2, 1, 1, 1, 1, 1, RES_2880_720_M },
- { "2880x720fourp", N_("2880 x 720 DPI Four Pass"),
- 2880, 720, 2880, 720, 0, 3, 1, 1, 0, 1, 1, RES_2880_720_M },
- { "2880x720fourpuni", N_("2880 x 720 DPI Four Pass Unidirectional"),
- 2880, 720, 2880, 720, 0, 3, 1, 1, 1, 1, 1, RES_2880_720_M },
+static const escp2_densities_t spro_dye_densities =
+{ 2.6, 1.3, 1.3, 0.775, 0.388, 0.275, 0.0, 0.0 };
- { "1440x1440mw", N_("1440 x 1440 DPI Interleave"),
- 1440, 1440, 1440, 1440, 0, 1, 1, 1, 0, 1, 1, RES_1440_1440_M },
- { "1440x1440mwuni", N_("1440 x 1440 DPI Interleave Unidirectional"),
- 1440, 1440, 1440, 1440, 0, 1, 1, 1, 1, 1, 1, RES_1440_1440_M },
- { "1440x1440fol", N_("1440 x 1440 DPI FOL"),
- 1440, 1440, 1440, 1440, 0, 2, 1, 1, 0, 1, 1, RES_1440_1440_M },
- { "1440x1440foluni", N_("1440 x 1440 DPI FOL Unidirectional"),
- 1440, 1440, 1440, 1440, 0, 2, 1, 1, 1, 1, 1, RES_1440_1440_M },
- { "1440x1440fourp", N_("1440 x 1440 DPI Four Pass"),
- 1440, 1440, 1440, 1440, 0, 3, 1, 1, 0, 1, 1, RES_1440_1440_M },
- { "1440x1440fourpuni", N_("1440 x 1440 DPI Four Pass Unidirectional"),
- 1440, 1440, 1440, 1440, 0, 3, 1, 1, 1, 1, 1, RES_1440_1440_M },
+static const escp2_densities_t spro_pigment_densities =
+{ 3.0, 1.5, 0.78, 0.775, 0.388, 0.194, 0.0, 0.0 };
- { "2880x1440mw", N_("2880 x 1440 DPI Interleave"),
- 2880, 1440, 2880, 1440, 0, 1, 1, 1, 0, 1, 1, RES_2880_1440_M },
- { "2880x1440mwuni", N_("2880 x 1440 DPI Interleave Unidirectional"),
- 2880, 1440, 2880, 1440, 0, 1, 1, 1, 1, 1, 1, RES_2880_1440_M },
- { "2880x1440fol", N_("2880 x 1440 DPI FOL"),
- 2880, 1440, 2880, 1440, 0, 2, 1, 1, 0, 1, 1, RES_2880_1440_M },
- { "2880x1440foluni", N_("2880 x 1440 DPI FOL Unidirectional"),
- 2880, 1440, 2880, 1440, 0, 2, 1, 1, 1, 1, 1, RES_2880_1440_M },
- { "2880x1440fourp", N_("2880 x 1440 DPI Four Pass"),
- 2880, 1440, 2880, 1440, 0, 3, 1, 1, 0, 1, 1, RES_2880_1440_M },
- { "2880x1440fourpuni", N_("2880 x 1440 DPI Four Pass Unidirectional"),
- 2880, 1440, 2880, 1440, 0, 3, 1, 1, 1, 1, 1, RES_2880_1440_M },
+static const escp2_densities_t spro10000_densities =
+{ 2.6, 1.3, 0.65, 0.431, 0.216, 0.392, 0.0, 0.0 };
- { "", "", 0, 0, 0, 0, 0, 0, 0, 0, 1, -1 }
-};
static const input_slot_t standard_roll_feed_input_slots[] =
{
@@ -4204,16 +286,18 @@ static const input_slot_t standard_roll_feed_input_slots[] =
N_("Standard"),
0,
0,
- { "IR\002\000\000\001EX\006\000\000\000\000\000\005\000", 16 },
- { "IR\002\000\000\000", 6}
+ 0,
+ { 16, "IR\002\000\000\001EX\006\000\000\000\000\000\005\000" },
+ { 6, "IR\002\000\000\000"}
},
{
"Roll",
N_("Roll Feed"),
- 1,
0,
- { "IR\002\000\000\001EX\006\000\000\000\000\000\005\001", 16 },
- { "IR\002\000\000\002", 6 }
+ 1,
+ ROLL_FEED_DONT_EJECT,
+ { 16, "IR\002\000\000\001EX\006\000\000\000\000\000\005\001" },
+ { 6, "IR\002\000\000\002" }
}
};
@@ -4230,24 +314,27 @@ static const input_slot_t cutter_roll_feed_input_slots[] =
N_("Standard"),
0,
0,
- { "IR\002\000\000\001EX\006\000\000\000\000\000\005\000", 16 },
- { "IR\002\000\000\000", 6}
+ 0,
+ { 16, "IR\002\000\000\001EX\006\000\000\000\000\000\005\000" },
+ { 6, "IR\002\000\000\000"}
},
{
"RollCutPage",
N_("Roll Feed (cut each page)"),
+ 0,
1,
- 1,
- { "IR\002\000\000\001EX\006\000\000\000\000\000\005\001", 16 },
- { "IR\002\000\000\002", 6 }
+ ROLL_FEED_CUT_ALL,
+ { 16, "IR\002\000\000\001EX\006\000\000\000\000\000\005\001" },
+ { 6, "IR\002\000\000\002" }
},
{
"RollCutNone",
N_("Roll Feed (do not cut)"),
- 1,
0,
- { "IR\002\000\000\001EX\006\000\000\000\000\000\005\001", 16 },
- { "IR\002\000\000\002", 6 }
+ 1,
+ ROLL_FEED_DONT_EJECT,
+ { 16, "IR\002\000\000\001EX\006\000\000\000\000\000\005\001" },
+ { 6, "IR\002\000\000\002" }
}
};
@@ -4257,6 +344,107 @@ static const input_slot_list_t cutter_roll_feed_input_slot_list =
sizeof(cutter_roll_feed_input_slots) / sizeof(const input_slot_t)
};
+static const input_slot_t cd_cutter_roll_feed_input_slots[] =
+{
+ {
+ "Standard",
+ N_("Standard"),
+ 0,
+ 0,
+ 0,
+ { 23, "IR\002\000\000\001EX\006\000\000\000\000\000\005\000PP\003\000\000\001\377" },
+ { 6, "IR\002\000\000\000"}
+ },
+ {
+ "Manual",
+ N_("Manual Feed"),
+ 0,
+ 0,
+ 0,
+ { 36, "PM\002\000\000\000IR\002\000\000\001EX\006\000\000\000\000\000\005\000FP\003\000\000\000\000PP\003\000\000\002\001" },
+ { 6, "IR\002\000\000\000"}
+ },
+ {
+ "CD",
+ N_("Print to CD"),
+ 1,
+ 0,
+ 0,
+ { 36, "PM\002\000\000\000IR\002\000\000\001EX\006\000\000\000\000\000\005\000FP\003\000\000\000\000PP\003\000\000\002\001" },
+ { 6, "IR\002\000\000\000"}
+ },
+ {
+ "RollCutPage",
+ N_("Roll Feed (cut each page)"),
+ 0,
+ 1,
+ ROLL_FEED_CUT_ALL,
+ { 23, "IR\002\000\000\001EX\006\000\000\000\000\000\005\001PP\003\000\000\001\377" },
+ { 6, "IR\002\000\000\002" }
+ },
+ {
+ "RollCutNone",
+ N_("Roll Feed (do not cut)"),
+ 0,
+ 1,
+ ROLL_FEED_DONT_EJECT,
+ { 23, "IR\002\000\000\001EX\006\000\000\000\000\000\005\001PP\003\000\000\001\377" },
+ { 6, "IR\002\000\000\002" }
+ }
+};
+
+static const input_slot_list_t cd_cutter_roll_feed_input_slot_list =
+{
+ cd_cutter_roll_feed_input_slots,
+ sizeof(cd_cutter_roll_feed_input_slots) / sizeof(const input_slot_t)
+};
+
+static const input_slot_t cd_roll_feed_input_slots[] =
+{
+ {
+ "Standard",
+ N_("Standard"),
+ 0,
+ 0,
+ 0,
+ { 23, "IR\002\000\000\001EX\006\000\000\000\000\000\005\000PP\003\000\000\001\377" },
+ { 6, "IR\002\000\000\000"}
+ },
+ {
+ "Manual",
+ N_("Manual Feed"),
+ 0,
+ 0,
+ 0,
+ { 36, "PM\002\000\000\000IR\002\000\000\001EX\006\000\000\000\000\000\005\000FP\003\000\000\000\000PP\003\000\000\002\001" },
+ { 6, "IR\002\000\000\000"}
+ },
+ {
+ "CD",
+ N_("Print to CD"),
+ 1,
+ 0,
+ 0,
+ { 36, "PM\002\000\000\000IR\002\000\000\001EX\006\000\000\000\000\000\005\000FP\003\000\000\000\000PP\003\000\000\002\001" },
+ { 6, "IR\002\000\000\000"}
+ },
+ {
+ "Roll",
+ N_("Roll Feed"),
+ 0,
+ 1,
+ ROLL_FEED_DONT_EJECT,
+ { 23, "IR\002\000\000\001EX\006\000\000\000\000\000\005\001PP\003\000\000\001\377" },
+ { 6, "IR\002\000\000\002" }
+ }
+};
+
+static const input_slot_list_t cd_roll_feed_input_slot_list =
+{
+ cd_roll_feed_input_slots,
+ sizeof(cd_roll_feed_input_slots) / sizeof(const input_slot_t)
+};
+
static const input_slot_t pro_roll_feed_input_slots[] =
{
{
@@ -4264,16 +452,18 @@ static const input_slot_t pro_roll_feed_input_slots[] =
N_("Standard"),
0,
0,
- { "PP\003\000\000\002\000", 7 },
- { "", 0 }
+ 0,
+ { 7, "PP\003\000\000\002\000" },
+ { 0, "" }
},
{
"Roll",
N_("Roll Feed"),
+ 0,
1,
0,
- { "PP\003\000\000\003\000", 7 },
- { "", 0 }
+ { 7, "PP\003\000\000\003\000" },
+ { 0, "" }
}
};
@@ -4283,46 +473,50 @@ static const input_slot_list_t pro_roll_feed_input_slot_list =
sizeof(pro_roll_feed_input_slots) / sizeof(const input_slot_t)
};
-static const input_slot_t sp5000_input_slots[] =
+static const input_slot_t spro5000_input_slots[] =
{
{
"CutSheet1",
N_("Cut Sheet Bin 1"),
0,
0,
- { "PP\003\000\000\001\001", 7 },
- { "", 0 }
+ 0,
+ { 7, "PP\003\000\000\001\001" },
+ { 0, "" }
},
{
"CutSheet2",
N_("Cut Sheet Bin 2"),
0,
0,
- { "PP\003\000\000\002\001", 7 },
- { "", 0 }
+ 0,
+ { 7, "PP\003\000\000\002\001" },
+ { 0, "" }
},
{
"CutSheetAuto",
N_("Cut Sheet Autoselect"),
0,
0,
- { "PP\003\000\000\001\377", 7 },
- { "", 0 }
+ 0,
+ { 7, "PP\003\000\000\001\377" },
+ { 0, "" }
},
{
"ManualSelect",
N_("Manual Selection"),
0,
0,
- { "PP\003\000\000\002\001", 7 },
- { "", 0 }
+ 0,
+ { 7, "PP\003\000\000\002\001" },
+ { 0, "" }
}
};
-static const input_slot_list_t sp5000_input_slot_list =
+static const input_slot_list_t spro5000_input_slot_list =
{
- sp5000_input_slots,
- sizeof(sp5000_input_slots) / sizeof(const input_slot_t)
+ spro5000_input_slots,
+ sizeof(spro5000_input_slots) / sizeof(const input_slot_t)
};
static const input_slot_list_t default_input_slot_list =
@@ -4331,983 +525,1318 @@ static const input_slot_list_t default_input_slot_list =
0,
};
-static const init_sequence_t new_init_sequence =
+static const stp_raw_t new_init_sequence =
{
- "\0\0\0\033\001@EJL 1284.4\n@EJL \n\033@", 29
+ 29, "\0\0\0\033\001@EJL 1284.4\n@EJL \n\033@"
};
-static const init_sequence_t je_deinit_sequence =
+static const stp_raw_t je_deinit_sequence =
{
- "JE\001\000\000", 5
+ 5, "JE\001\000\000"
};
#define INCH(x) (72 * x)
-const escp2_stp_printer_t stp_escp2_model_capabilities[] =
+static const quality_t standard_qualities[] =
+{
+ { "FastEconomy", N_("Fast Economy"), 360, 120, 0, 0, 360, 90 },
+ { "Economy", N_("Economy"), 360, 240, 0, 0, 360, 180 },
+ { "Draft", N_("Draft"), 360, 360, 0, 0, 360, 360 },
+ { "Standard", N_("Standard"), 0, 0, 0, 0, 720, 360 },
+ { "High", N_("High"), 0, 0, 0, 0, 720, 720 },
+ { "Photo", N_("Photo"), 0, 0, 1440, 720, 1440, 720 },
+ { "HighPhoto", N_("Super Photo"), 0, 0, 2880, 2880, 2880, 1440 },
+ { "UltraPhoto", N_("Ultra Photo"), 0, 0, 2880, 2880, 2880, 2880 },
+ { "Best", N_("Best"), 720, 360, 0, 0, -1, -1 },
+};
+
+static const quality_list_t standard_quality_list =
+{
+ standard_qualities,
+ sizeof(standard_qualities) / sizeof(quality_t)
+};
+
+#define DECLARE_CHANNEL_LIST(name) \
+static const channel_name_t name##_channel_name_list = \
+{ \
+ #name, \
+ sizeof(name##_channel_names) / sizeof(const char *), \
+ name##_channel_names \
+}
+
+static const char *standard_channel_names[] =
+{
+ N_("Black"),
+ N_("Cyan"),
+ N_("Magenta"),
+ N_("Yellow")
+};
+
+DECLARE_CHANNEL_LIST(standard);
+
+static const char *photo_channel_names[] =
+{
+ N_("Black"),
+ N_("Cyan"),
+ N_("Magenta"),
+ N_("Yellow"),
+ N_("Light Cyan"),
+ N_("Light Magenta"),
+};
+
+DECLARE_CHANNEL_LIST(photo);
+
+static const char *sp2200_channel_names[] =
+{
+ N_("Black"),
+ N_("Cyan"),
+ N_("Magenta"),
+ N_("Yellow"),
+ N_("Light Cyan"),
+ N_("Light Magenta"),
+ N_("Light Black"),
+};
+
+DECLARE_CHANNEL_LIST(sp2200);
+
+static const char *pm_950c_channel_names[] =
+{
+ N_("Black"),
+ N_("Cyan"),
+ N_("Magenta"),
+ N_("Yellow"),
+ N_("Light Cyan"),
+ N_("Light Magenta"),
+ N_("Dark Yellow"),
+};
+
+DECLARE_CHANNEL_LIST(pm_950c);
+
+static const char *sp960_channel_names[] =
+{
+ N_("Black"),
+ N_("Cyan"),
+ N_("Magenta"),
+ N_("Yellow"),
+ N_("Light Cyan"),
+ N_("Light Magenta"),
+ N_("Black"),
+};
+
+DECLARE_CHANNEL_LIST(sp960);
+
+static const char *r800_channel_names[] =
+{
+ N_("Yellow"),
+ N_("Magenta"),
+ N_("Cyan"),
+ N_("Matte Black"),
+ N_("Photo Black"),
+ N_("Red"),
+ N_("Blue"),
+ N_("Gloss Optimizer"),
+};
+
+DECLARE_CHANNEL_LIST(r800);
+
+const stpi_escp2_printer_t stpi_escp2_model_capabilities[] =
{
/* FIRST GENERATION PRINTERS */
/* 0: Stylus Color */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_1998 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 15, 1, 4, 15, 1, 4, 15, 1, 4,
- 360, 720, 720, 14400, -1, 720, 720, 90, 90,
- INCH(17 / 2), INCH(44), INCH(2), INCH(4),
- 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- g1_dotsizes, g1_densities, &simple_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 15, 1, 4, 15, 1, 4, 15, 1, 4, 4,
+ 360, 14400, -1, 720, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(17 / 2), INCH(44), INCH(2), INCH(2),
+ 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ g1_dotsizes, g1_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_720dpi_reslist, &stpi_escp2_standard_inkgroup,
standard_bits, standard_base_res, &default_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ NULL, &standard_channel_name_list
},
/* 1: Stylus Color 400/500 */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 48, 1, 3, 48, 1, 3,
- 360, 720, 720, 14400, -1, 720, 720, 90, 90,
- INCH(17 / 2), INCH(44), INCH(2), INCH(4),
- 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- g2_dotsizes, g1_densities, &simple_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 4,
+ 360, 14400, -1, 720, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(17 / 2), INCH(44), INCH(2), INCH(2),
+ 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ g2_dotsizes, g1_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_sc500_reslist, &stpi_escp2_standard_inkgroup,
standard_bits, standard_base_res, &default_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ NULL, &standard_channel_name_list
},
/* 2: Stylus Color 1500 */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 360, 720, 720, 14400, -1, 720, 720, 90, 90,
- INCH(17), INCH(44), INCH(2), INCH(4),
- 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- g1_dotsizes, sc1500_densities, &simple_inks,
- &standard_paper_list, standard_reslist, &cmy_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 4,
+ 360, 14400, -1, 720, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(17), INCH(44), INCH(2), INCH(2),
+ 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ g1_dotsizes, sc1500_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_sc500_reslist, &stpi_escp2_cmy_inkgroup,
standard_bits, standard_base_res, &standard_roll_feed_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ NULL, &standard_channel_name_list
},
/* 3: Stylus Color 600 */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 32, 1, 4, 32, 1, 4, 32, 1, 4,
- 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, 8, 9, 0, 0, 8, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 8,
- sc600_dotsizes, g3_densities, &simple_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 32, 1, 4, 32, 1, 4, 32, 1, 4, 4,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 8,
+ INCH(17 / 2), INCH(44), INCH(2), INCH(2),
+ 8, 9, 0, 30, 8, 9, 0, 30, 8, 9, 0, 0, 8, 9, 0, 0, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ sc600_dotsizes, g3_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_g3_reslist, &stpi_escp2_standard_inkgroup,
standard_bits, g3_base_res, &default_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ NULL, &standard_channel_name_list
},
/* 4: Stylus Color 800 */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 64, 1, 2, 64, 1, 2, 64, 1, 2,
- 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, 8, 9, 0, 0, 8, 9, 0, 0,
- 0, 1, 4, 0, 0, 0, 0,
- g3_dotsizes, g3_densities, &simple_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 64, 1, 2, 64, 1, 2, 64, 1, 2, 4,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 4, 0, 0, 0, 0,
+ INCH(17 / 2), INCH(44), INCH(2), INCH(2),
+ 8, 9, 9, 40, 8, 9, 9, 40, 8, 9, 0, 0, 8, 9, 0, 0, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ g3_dotsizes, g3_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_g3_reslist, &stpi_escp2_standard_inkgroup,
standard_bits, g3_base_res, &default_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ NULL, &standard_channel_name_list
},
/* 5: Stylus Color 850 */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 64, 1, 2, 64, 1, 2, 64, 1, 2,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 4, 0, 0, 0, 0,
- g3_dotsizes, g3_densities, &simple_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 64, 1, 2, 64, 1, 2, 64, 1, 2, 4,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 4, 0, 0, 0, 0,
+ INCH(17 / 2), INCH(44), INCH(2), INCH(2),
+ 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ g3_dotsizes, g3_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_g3_reslist, &stpi_escp2_standard_inkgroup,
standard_bits, g3_base_res, &default_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ NULL, &standard_channel_name_list
},
/* 6: Stylus Color 1520 */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 64, 1, 2, 64, 1, 2, 64, 1, 2,
- 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, 8, 9, 0, 0, 8, 9, 0, 0,
- 0, 1, 4, 0, 0, 0, 0,
- g3_dotsizes, g3_densities, &simple_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 64, 1, 2, 64, 1, 2, 64, 1, 2, 4,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 4, 0, 0, 0, 0,
+ INCH(17), INCH(44), INCH(2), INCH(2),
+ 8, 9, 9, 40, 8, 9, 9, 40, 8, 9, 0, 0, 8, 9, 0, 0, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ g3_dotsizes, g3_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_g3_reslist, &stpi_escp2_standard_inkgroup,
standard_bits, g3_base_res, &standard_roll_feed_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ NULL, &standard_channel_name_list
},
/* SECOND GENERATION PRINTERS */
/* 7: Stylus Photo 700 */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 32, 1, 4, 32, 1, 4, 32, 1, 4,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 8,
- photo_dotsizes, photo_densities, &simple_inks,
- &standard_paper_list, standard_reslist, &photo_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 32, 1, 4, 32, 1, 4, 32, 1, 4, 6,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 8,
+ INCH(17 / 2), INCH(44), INCH(2), INCH(2),
+ 9, 9, 0, 30, 9, 9, 0, 30, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ sp700_dotsizes, sp700_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_g3_reslist, &stpi_escp2_photo_gen1_inkgroup,
standard_bits, g3_base_res, &default_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ NULL, &photo_channel_name_list
},
/* 8: Stylus Photo EX */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 32, 1, 4, 32, 1, 4, 32, 1, 4,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 8,
- photo_dotsizes, photo_densities, &simple_inks,
- &standard_paper_list, standard_reslist, &photo_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_NO | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 32, 1, 4, 32, 1, 4, 32, 1, 4, 6,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 8,
+ INCH(118 / 10), INCH(44), INCH(2), INCH(2),
+ 9, 9, 0, 30, 9, 9, 0, 30, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ sp700_dotsizes, sp700_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_g3_reslist, &stpi_escp2_photo_gen1_inkgroup,
standard_bits, g3_base_res, &default_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ NULL, &photo_channel_name_list
},
/* 9: Stylus Photo */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 32, 1, 4, 32, 1, 4, 32, 1, 4,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 8,
- photo_dotsizes, photo_densities, &simple_inks,
- &standard_paper_list, standard_reslist, &photo_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 32, 1, 4, 32, 1, 4, 32, 1, 4, 6,
+ 360, 14400, -1, 720, 720, 90, 90, 0, 1, 0, 0, 0, 0, 8,
+ INCH(17 / 2), INCH(44), INCH(2), INCH(2),
+ 9, 9, 0, 30, 9, 9, 0, 30, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ sp700_dotsizes, sp700_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_g3_720dpi_reslist, &stpi_escp2_photo_gen1_inkgroup,
standard_bits, g3_base_res, &default_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ NULL, &photo_channel_name_list
},
/* THIRD GENERATION PRINTERS */
/* 10: Stylus Color 440/460 */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_1999 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 21, 1, 4, 21, 1, 4, 21, 1, 4,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 8,
- sc440_dotsizes, sc440_densities, &simple_inks,
- &standard_paper_list, no_interleave_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 21, 1, 4, 21, 1, 4, 21, 1, 4, 4,
+ 360, 14400, -1, 720, 720, 90, 90, 0, 1, 0, 0, 0, 0, 8,
+ INCH(17 / 2), INCH(44), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 1, 15, 0, 0,
+ sc440_dotsizes, sc440_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_g3_720dpi_reslist, &stpi_escp2_standard_inkgroup,
standard_bits, standard_base_res, &default_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ NULL, &standard_channel_name_list
},
/* 11: Stylus Color 640 */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_1999 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 32, 1, 4, 32, 1, 4, 32, 1, 4,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 8,
- sc640_dotsizes, sc440_densities, &simple_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 32, 1, 4, 32, 1, 4, 32, 1, 4, 4,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 8,
+ INCH(17 / 2), INCH(44), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 1, 15, 0, 0,
+ sc640_dotsizes, sc440_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_sc640_reslist, &stpi_escp2_standard_inkgroup,
standard_bits, standard_base_res, &default_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ NULL, &standard_channel_name_list
},
/* 12: Stylus Color 740/Stylus Scan 2000/Stylus Scan 2500 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_1999 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 144, 1, 1, 144, 1, 1,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- c6pl_dotsizes, c6pl_densities, &variable_6pl_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 48, 1, 3, 144, 1, 1, 144, 1, 1, 4,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(17 / 2), INCH(44), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c6pl_dotsizes, c6pl_densities, &stpi_escp2_variable_6pl_drops,
+ stpi_escp2_1440dpi_reslist, &stpi_escp2_standard_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ NULL, &standard_channel_name_list
},
/* 13: Stylus Color 900 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_1999 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 96, 1, 2, 192, 1, 1, 192, 1, 1,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- c3pl_dotsizes, c3pl_densities, &variable_3pl_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 96, 1, 2, 192, 1, 1, 192, 1, 1, 4,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(17 / 2), INCH(44), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c3pl_dotsizes, c3pl_densities, &stpi_escp2_variable_3pl_drops,
+ stpi_escp2_1440dpi_reslist, &stpi_escp2_standard_inkgroup,
variable_bits, stc900_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
/* 14: Stylus Photo 750 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_1999 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 48, 1, 3, 48, 1, 3,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- c6pl_dotsizes, c6pl_densities, &variable_6pl_inks,
- &standard_paper_list, standard_reslist, &photo_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 48, 1, 3, 48, 1, 3, 48, 1, 3, 6,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(17 / 2), INCH(44), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c6pl_dotsizes, c6pl_densities, &stpi_escp2_variable_6pl_drops,
+ stpi_escp2_1440dpi_reslist, &stpi_escp2_photo_gen1_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &photo_channel_name_list
},
/* 15: Stylus Photo 1200 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_1999 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 48, 1, 3, 48, 1, 3,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- c6pl_dotsizes, c6pl_densities, &variable_6pl_inks,
- &standard_paper_list, standard_reslist, &photo_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 48, 1, 3, 48, 1, 3, 48, 1, 3, 6,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(13), INCH(44), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c6pl_dotsizes, c6pl_densities, &stpi_escp2_variable_6pl_drops,
+ stpi_escp2_1440dpi_reslist, &stpi_escp2_photo_gen1_inkgroup,
variable_bits, variable_base_res, &standard_roll_feed_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &photo_channel_name_list
},
/* 16: Stylus Color 860 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_1999 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 144, 1, 1, 144, 1, 1,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- c4pl_dotsizes, c4pl_densities, &variable_4pl_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 48, 1, 3, 144, 1, 1, 144, 1, 1, 4,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(17 / 2), INCH(44), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c4pl_dotsizes, c4pl_densities, &stpi_escp2_variable_1440_4pl_drops,
+ stpi_escp2_1440dpi_reslist, &stpi_escp2_standard_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
/* 17: Stylus Color 1160 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_1999 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 144, 1, 1, 144, 1, 1,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- c4pl_dotsizes, c4pl_densities, &variable_4pl_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 48, 1, 3, 144, 1, 1, 144, 1, 1, 4,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(13), INCH(44), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c4pl_dotsizes, c4pl_densities, &stpi_escp2_variable_1440_4pl_drops,
+ stpi_escp2_1440dpi_reslist, &stpi_escp2_standard_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
/* 18: Stylus Color 660 */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_1999 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 32, 1, 4, 32, 1, 4, 32, 1, 4,
- 360, 720, 720, 14400, -1, 1440, 720, 90, 90,
- INCH(17 / 2), INCH(44), INCH(2), INCH(4),
- 9, 9, 9, 9, 9, 9, 9, 26, 9, 9, 9, 0, 9, 9, 9, 0,
- 0, 1, 0, 0, 0, 0, 8,
- sc660_dotsizes,sc660_densities, &simple_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 32, 1, 4, 32, 1, 4, 32, 1, 4, 4,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 8,
+ INCH(17 / 2), INCH(44), INCH(2), INCH(2),
+ 9, 9, 9, 9, 9, 9, 9, 26, 9, 9, 9, 0, 9, 9, 9, 0, -1, -1, 0, 0,
+ 1, 15, 0, 0,
+ sc660_dotsizes, sc660_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_sc640_reslist, &stpi_escp2_standard_inkgroup,
standard_bits, standard_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
/* 19: Stylus Color 760 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_1999 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 144, 1, 1, 144, 1, 1,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- c4pl_dotsizes, c4pl_densities, &variable_4pl_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 48, 1, 3, 144, 1, 1, 144, 1, 1, 4,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(17 / 2), INCH(44), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c4pl_dotsizes, c4pl_densities, &stpi_escp2_variable_1440_4pl_drops,
+ stpi_escp2_1440dpi_reslist, &stpi_escp2_standard_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
/* 20: Stylus Photo 720 (Australia) */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_1999 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 32, 1, 4, 32, 1, 4, 32, 1, 4,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- sc720_dotsizes, c6pl_densities, &variable_6pl_inks,
- &standard_paper_list, standard_reslist, &photo_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 32, 1, 4, 32, 1, 4, 32, 1, 4, 6,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(17 / 2), INCH(44), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ sp720_dotsizes, c6pl_densities, &stpi_escp2_variable_6pl_drops,
+ stpi_escp2_1440dpi_reslist, &stpi_escp2_photo_gen1_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &photo_channel_name_list
},
/* 21: Stylus Color 480 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 15, 15, 3, 48, 48, 3, 48, 48, 3,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, -99, 0, 0,
- sc480_dotsizes, sc480_densities, &variable_x80_6pl_inks,
- &standard_paper_list, standard_reslist, &x80_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_YES |
+ MODEL_PACKET_MODE_YES),
+ 15, 15, 3, 48, 48, 3, 48, 48, 3, 4,
+ 360, 14400, 360, 720, 720, 90, 90, 0, 1, 0, 0, -99, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ sc480_dotsizes, sc480_densities, &stpi_escp2_variable_x80_6pl_drops,
+ stpi_escp2_720dpi_soft_reslist, &stpi_escp2_x80_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
/* 22: Stylus Photo 870/875 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 48, 1, 3, 48, 1, 3,
- 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, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 97, 0, 0, 0,
- c4pl_dotsizes, c4pl_densities, &variable_4pl_inks,
- &standard_paper_list, standard_reslist, &photo_inklist,
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 48, 1, 3, 48, 1, 3, 48, 1, 3, 6,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 97, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c4pl_dotsizes, c4pl_densities, &stpi_escp2_variable_1440_4pl_drops,
+ stpi_escp2_1440dpi_reslist, &stpi_escp2_photo_gen2_inkgroup,
variable_bits, variable_base_res, &standard_roll_feed_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &photo_channel_name_list
},
/* 23: Stylus Photo 1270 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 48, 1, 3, 48, 1, 3,
- 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, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 97, 0, 0, 0,
- c4pl_dotsizes, c4pl_densities, &variable_4pl_inks,
- &standard_paper_list, standard_reslist, &photo_inklist,
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 48, 1, 3, 48, 1, 3, 48, 1, 3, 6,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 97, 0, 0, 0,
+ INCH(13), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c4pl_dotsizes, c4pl_densities, &stpi_escp2_variable_1440_4pl_drops,
+ stpi_escp2_1440dpi_reslist, &stpi_escp2_photo_gen2_inkgroup,
variable_bits, variable_base_res, &standard_roll_feed_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &photo_channel_name_list
},
/* 24: Stylus Color 3000 */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_1998 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 64, 1, 2, 64, 1, 2, 64, 1, 2,
- 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, 8, 9, 0, 0, 8, 9, 0, 0,
- 0, 1, 4, 0, 0, 0, 0,
- g3_dotsizes, g3_densities, &simple_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 64, 1, 2, 64, 1, 2, 64, 1, 2, 4,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 4, 0, 0, 0, 0,
+ INCH(17), INCH(44), INCH(2), INCH(2),
+ 8, 9, 9, 40, 8, 9, 9, 40, 8, 9, 0, 0, 8, 9, 0, 0, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ g3_dotsizes, g3_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_g3_reslist, &stpi_escp2_standard_inkgroup,
standard_bits, g3_base_res, &standard_roll_feed_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ NULL, &standard_channel_name_list
},
/* 25: Stylus Color 670 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 32, 1, 4, 64, 1, 2, 64, 1, 2,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- sc670_dotsizes, c6pl_densities, &variable_6pl_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 32, 1, 4, 64, 1, 2, 64, 1, 2, 4,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ sc670_dotsizes, c6pl_densities, &stpi_escp2_variable_6pl_drops,
+ stpi_escp2_1440dpi_reslist, &stpi_escp2_standard_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
/* 26: Stylus Photo 2000P */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 144, 1, 1, 144, 1, 1,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- sp2000_dotsizes, sp2000_densities, &variable_pigment_inks,
- &standard_paper_list, standard_reslist, &photo_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 48, 1, 3, 144, 1, 1, 144, 1, 1, 6,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(13), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 2, 15, 0, 0,
+ sp2000_dotsizes, sp2000_densities, &stpi_escp2_variable_2000p_drops,
+ stpi_escp2_1440dpi_reslist, &stpi_escp2_photo_pigment_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &photo_channel_name_list
},
/* 27: Stylus Pro 5000 */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 64, 1, 2, 64, 1, 2, 64, 1, 2,
- 360, 720, 720, 14400, -1, 1440, 720, 90, 90,
- INCH(13), INCH(44), INCH(2), INCH(4),
- 9, 9, 0, 30, 9, 9, 0, 30, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 4,
- sp5000_dotsizes, photo_densities, &simple_inks,
- &standard_paper_list, sp5000_reslist, &photo_inklist,
- standard_bits, g3_base_res, &sp5000_input_slot_list,
- NULL, NULL
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 64, 1, 2, 64, 1, 2, 64, 1, 2, 6,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 4,
+ INCH(13), INCH(44), INCH(2), INCH(2),
+ 9, 9, 0, 30, 9, 9, 0, 30, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ spro5000_dotsizes, sp700_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_1440dpi_reslist, &stpi_escp2_photo_gen1_inkgroup,
+ standard_bits, g3_base_res, &spro5000_input_slot_list,
+ &standard_quality_list, NULL, NULL,
+ NULL, &photo_channel_name_list
},
/* 28: Stylus Pro 7000 */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_PRO | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 360, 1440, 1440, 14400, -1, 1440, 720, 90, 90,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 6,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
INCH(24), INCH(1200), INCH(7), INCH(7),
- 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 9, 9, 9, 9, 9, 9,
- 0, 1, 0, 0, 0, 0, 0,
- spro_dye_dotsizes, spro_dye_densities, &simple_inks,
- &standard_paper_list, pro_reslist, &photo_inklist,
+ 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 9, 9, 9, 9, 9, 9, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ spro_dye_dotsizes, spro_dye_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_pro_reslist, &stpi_escp2_photo_gen1_inkgroup,
standard_bits, pro_base_res, &pro_roll_feed_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ &stpi_escp2_pro7000_printer_weave_list, &photo_channel_name_list
},
/* 29: Stylus Pro 7500 */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_PRO | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_YES |
- MODEL_FAST_360_NO),
- 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 360, 1440, 1440, 14400, -1, 1440, 720, 90, 90,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_YES | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 6,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
INCH(24), INCH(1200), INCH(7), INCH(7),
- 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 9, 9, 9, 9, 9, 9,
- 0, 1, 0, 0, 0, 0, 0,
- spro_pigment_dotsizes, spro_pigment_densities, &simple_inks,
- &standard_paper_list, pro_reslist, &photo_inklist,
+ 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 9, 9, 9, 9, 9, 9, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ spro_pigment_dotsizes, spro_pigment_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_pro_reslist, &stpi_escp2_photo_pigment_inkgroup,
standard_bits, pro_base_res, &pro_roll_feed_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ &stpi_escp2_pro7500_printer_weave_list, &photo_channel_name_list
},
/* 30: Stylus Pro 9000 */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_PRO | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 360, 1440, 1440, 14400, -1, 1440, 720, 90, 90,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 6,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
INCH(44), INCH(1200), INCH(7), INCH(7),
- 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 9, 9, 9, 9, 9, 9,
- 0, 1, 0, 0, 0, 0, 0,
- spro_dye_dotsizes, spro_dye_densities, &simple_inks,
- &standard_paper_list, pro_reslist, &photo_inklist,
+ 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 9, 9, 9, 9, 9, 9, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ spro_dye_dotsizes, spro_dye_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_pro_reslist, &stpi_escp2_photo_gen1_inkgroup,
standard_bits, pro_base_res, &pro_roll_feed_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ &stpi_escp2_pro7000_printer_weave_list, &photo_channel_name_list
},
/* 31: Stylus Pro 9500 */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_PRO | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_YES |
- MODEL_FAST_360_NO),
- 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 360, 1440, 1440, 14400, -1, 1440, 720, 90, 90,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_YES | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 6,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
INCH(44), INCH(1200), INCH(7), INCH(7),
- 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 9, 9, 9, 9, 9, 9,
- 0, 1, 0, 0, 0, 0, 0,
- spro_pigment_dotsizes, spro_pigment_densities, &simple_inks,
- &standard_paper_list, pro_reslist, &photo_inklist,
+ 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 9, 9, 9, 9, 9, 9, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ spro_pigment_dotsizes, spro_pigment_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_pro_reslist, &stpi_escp2_photo_pigment_inkgroup,
standard_bits, pro_base_res, &pro_roll_feed_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ &stpi_escp2_pro7500_printer_weave_list, &photo_channel_name_list
},
/* 32: Stylus Color 777/680 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 144, 1, 1, 144, 1, 1,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- c4pl_dotsizes, sc680_densities, &variable_680_4pl_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 48, 1, 3, 144, 1, 1, 144, 1, 1, 4,
+ 360, 14400, -1, 2880, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c4pl_dotsizes, c4pl_2880_densities, &stpi_escp2_variable_2880_4pl_drops,
+ stpi_escp2_2880dpi_reslist, &stpi_escp2_standard_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
/* 33: Stylus Color 880/83/C60 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 144, 1, 1, 144, 1, 1,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- c4pl_dotsizes, c4pl_densities, &variable_4pl_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 48, 1, 3, 144, 1, 1, 144, 1, 1, 4,
+ 360, 14400, -1, 2880, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c4pl_dotsizes, c4pl_2880_densities, &stpi_escp2_variable_2880_4pl_drops,
+ stpi_escp2_2880dpi_reslist, &stpi_escp2_standard_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
/* 34: Stylus Color 980 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 96, 1, 2, 192, 1, 1, 192, 1, 1,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 192, 1, 0, 0, 0, 0, 0,
- c3pl_dotsizes, sc980_densities, &variable_3pl_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 96, 1, 2, 192, 1, 1, 192, 1, 1, 4,
+ 360, 14400, -1, 2880, 720, 90, 90, 38, 1, 0, 0, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c3pl_dotsizes, sc980_densities, &stpi_escp2_variable_3pl_drops,
+ stpi_escp2_2880dpi_reslist, &stpi_escp2_standard_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
/* 35: Stylus Photo 780/790/810/820 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 48, 1, 3, 48, 1, 3,
- 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, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 55, 0, 0, 0,
- c4pl_dotsizes, c4pl_densities, &variable_4pl_inks,
- &sp780_paper_list, standard_reslist, &photo_inklist,
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 48, 1, 3, 48, 1, 3, 48, 1, 3, 6,
+ 360, 14400, -1, 2880, 720, 90, 90, 0, 1, 0, 55, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c4pl_dotsizes, c4pl_2880_densities, &stpi_escp2_variable_2880_4pl_drops,
+ stpi_escp2_2880dpi_reslist, &stpi_escp2_photo_gen2_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &photo_channel_name_list
},
- /* 36: Stylus Photo 785/890/895/915 */
+ /* 36: Stylus Photo 785/890/895/915/935 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 48, 1, 3, 48, 1, 3,
- 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, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 55, 0, 0, 0,
- c4pl_dotsizes, c4pl_densities, &variable_4pl_inks,
- &standard_paper_list, standard_reslist, &photo_inklist,
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 48, 1, 3, 48, 1, 3, 48, 1, 3, 6,
+ 360, 14400, -1, 2880, 720, 90, 90, 0, 1, 0, 55, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c4pl_dotsizes, c4pl_2880_densities, &stpi_escp2_variable_2880_4pl_drops,
+ stpi_escp2_2880dpi_reslist, &stpi_escp2_photo_gen2_inkgroup,
variable_bits, variable_base_res, &standard_roll_feed_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &photo_channel_name_list
},
/* 37: Stylus Photo 1280/1290 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 48, 1, 3, 48, 1, 3,
- 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, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 55, 0, 0, 0,
- c4pl_dotsizes, c4pl_densities, &variable_4pl_inks,
- &standard_paper_list, standard_reslist, &photo_inklist,
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 48, 1, 3, 48, 1, 3, 48, 1, 3, 6,
+ 360, 14400, -1, 2880, 720, 90, 90, 0, 1, 0, 55, 0, 0, 0,
+ INCH(13), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c4pl_dotsizes, c4pl_2880_densities, &stpi_escp2_variable_2880_4pl_drops,
+ stpi_escp2_2880dpi_reslist, &stpi_escp2_photo_gen2_inkgroup,
variable_bits, variable_base_res, &standard_roll_feed_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &photo_channel_name_list
},
/* 38: Stylus Color 580 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 15, 15, 3, 48, 48, 3, 48, 48, 3,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, -99, 0, 0,
- sc480_dotsizes, sc480_densities, &variable_x80_6pl_inks,
- &standard_paper_list, standard_reslist, &x80_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_YES |
+ MODEL_PACKET_MODE_YES),
+ 15, 15, 3, 48, 48, 3, 48, 48, 3, 4,
+ 360, 14400, 360, 1440, 720, 90, 90, 0, 1, 0, 0, -99, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ sc480_dotsizes, sc480_densities, &stpi_escp2_variable_x80_6pl_drops,
+ stpi_escp2_1440dpi_reslist, &stpi_escp2_x80_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
/* 39: Stylus Color Pro XL */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 16, 1, 4, 16, 1, 4, 16, 1, 4,
- 360, 720, 720, 14400, -1, 720, 720, 90, 90,
- INCH(13), INCH(1200), INCH(2), INCH(4),
- 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- g1_dotsizes, g1_densities, &simple_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 16, 1, 4, 16, 1, 4, 16, 1, 4, 4,
+ 360, 14400, -1, 720, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(13), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ g1_dotsizes, g1_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_720dpi_reslist, &stpi_escp2_standard_inkgroup,
standard_bits, standard_base_res, &default_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ NULL, &standard_channel_name_list
},
/* 40: Stylus Pro 5500 */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_PRO | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_YES |
- MODEL_FAST_360_NO),
- 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 360, 1440, 1440, 14400, -1, 1440, 720, 90, 90,
- INCH(13), INCH(1200), INCH(2), INCH(4),
- 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- spro_pigment_dotsizes, spro_pigment_densities, &simple_inks,
- &standard_paper_list, pro_reslist, &photo_inklist,
- standard_bits, pro_base_res, &sp5000_input_slot_list,
- NULL, NULL
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_YES | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 6,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(13), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ spro_pigment_dotsizes, spro_pigment_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_pro_reslist, &stpi_escp2_photo_pigment_inkgroup,
+ standard_bits, pro_base_res, &spro5000_input_slot_list,
+ &standard_quality_list, NULL, NULL,
+ &stpi_escp2_pro7500_printer_weave_list, &photo_channel_name_list
},
/* 41: Stylus Pro 10000 */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_PRO | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_YES |
- MODEL_FAST_360_NO),
- 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 360, 1440, 1440, 14400, -1, 1440, 720, 90, 90,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_YES | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 6,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
INCH(44), INCH(1200), INCH(7), INCH(7),
- 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 9, 9, 9, 9, 9, 9,
- 0, 1, 0, 0, 0, 0, 0,
- spro10000_dotsizes, spro10000_densities, &spro10000_inks,
- &standard_paper_list, pro_reslist, &photo_inklist,
+ 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 9, 9, 9, 9, 9, 9, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ spro10000_dotsizes, spro10000_densities, &stpi_escp2_spro10000_drops,
+ stpi_escp2_pro_reslist, &stpi_escp2_photo_gen2_inkgroup,
variable_bits, pro_base_res, &pro_roll_feed_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ &stpi_escp2_pro7000_printer_weave_list, &photo_channel_name_list
},
/* 42: Stylus C20SX/C20UX */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 15, 15, 3, 48, 48, 3, 48, 48, 3,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, -99, 0, 0,
- sc480_dotsizes, sc480_densities, &variable_x80_6pl_inks,
- &standard_paper_list, standard_reslist, &x80_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_YES |
+ MODEL_PACKET_MODE_YES),
+ 15, 15, 3, 48, 48, 3, 48, 48, 3, 4,
+ 360, 14400, -1, 720, 720, 90, 90, 0, 1, 0, 0, -99, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ sc480_dotsizes, sc480_densities, &stpi_escp2_variable_x80_6pl_drops,
+ stpi_escp2_720dpi_soft_reslist, &stpi_escp2_x80_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
/* 43: Stylus C40SX/C40UX/C41SX/C41UX/C42SX/C42UX */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 15, 15, 3, 48, 48, 3, 48, 48, 3,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, -99, 0, 0,
- sc480_dotsizes, sc480_densities, &variable_x80_6pl_inks,
- &standard_paper_list, standard_reslist, &x80_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_YES |
+ MODEL_PACKET_MODE_YES),
+ 15, 15, 3, 48, 48, 3, 48, 48, 3, 4,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, -99, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ sc480_dotsizes, sc480_densities, &stpi_escp2_variable_x80_6pl_drops,
+ stpi_escp2_1440dpi_reslist, &stpi_escp2_x80_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
/* 44: Stylus C70/C80 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 60, 60, 2, 180, 180, 2, 180, 180, 2,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, -240, 0, 0,
- c3pl_pigment_dotsizes, c3pl_pigment_densities, &variable_3pl_pigment_inks,
- &c80_paper_list, standard_reslist, &c80_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 60, 60, 2, 180, 180, 2, 180, 180, 2, 4,
+ 360, 14400, -1, 2880, 1440, 360, 180, 0, 1, 0, 0, -240, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 4, 15, 0, 0,
+ c3pl_pigment_dotsizes, c3pl_pigment_densities, &stpi_escp2_variable_3pl_pigment_drops,
+ stpi_escp2_2880_1440dpi_reslist, &stpi_escp2_c80_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
/* 45: Stylus Color Pro */
{
(MODEL_VARIABLE_NO | MODEL_COMMAND_1998 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 16, 1, 4, 16, 1, 4, 16, 1, 4,
- 360, 720, 720, 14400, -1, 720, 720, 90, 90,
- INCH(17 / 2), INCH(44), INCH(2), INCH(4),
- 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- g1_dotsizes, g1_densities, &simple_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_NO),
+ 16, 1, 4, 16, 1, 4, 16, 1, 4, 4,
+ 360, 14400, -1, 720, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(17 / 2), INCH(44), INCH(2), INCH(2),
+ 9, 9, 9, 40, 9, 9, 9, 40, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 1, 7, 0, 0,
+ g1_dotsizes, g1_densities, &stpi_escp2_simple_drops,
+ stpi_escp2_720dpi_reslist, &stpi_escp2_standard_inkgroup,
standard_bits, standard_base_res, &default_input_slot_list,
- NULL, NULL
+ &standard_quality_list, NULL, NULL,
+ NULL, &standard_channel_name_list
},
/* 46: Stylus Photo 950/960 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO |
- MODEL_FAST_360_YES),
- 96, 1, 2, 96, 1, 2, 24, 1, 1,
- 360, 720, 720, 14400, -1, 2880, 1440, 360, 180,
- INCH(17 / 2), INCH(1200), INCH(2), INCH(4),
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 190, 0, 0, 0,
- c2pl_dotsizes, c2pl_densities, &variable_2pl_inks,
- &sp950_paper_list, escp950_reslist, &f360_photo_inklist,
- stp950_bits, stp950_base_res, &cutter_roll_feed_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_YES |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 96, 96, 2, 96, 96, 2, 24, 24, 1, 6,
+ 360, 14400, -1, 2880, 1440, 360, 180, 0, 1, 0, 190, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 204, 191, 0, 0,
+ 4, 15, 0, 0,
+ c2pl_dotsizes, c2pl_densities, &stpi_escp2_variable_2pl_drops,
+ stpi_escp2_superfine_reslist, &stpi_escp2_f360_photo_inkgroup,
+ stp950_bits, stp950_base_res, &cd_cutter_roll_feed_input_slot_list,
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &sp960_channel_name_list
},
/* 47: Stylus Photo 2100/2200 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO |
- MODEL_FAST_360_YES),
- 96, 1, 2, 96, 1, 2, 192, 1, 1,
- 360, 720, 720, 14400, -1, 2880, 1440, 360, 180,
- INCH(13), INCH(1200), INCH(2), INCH(4),
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 190, 0, 0, 0,
- c4pl_pigment_dotsizes, c4pl_pigment_densities, &variable_4pl_pigment_inks,
- &standard_paper_list, escp2200_reslist, &f360_photo7_inklist,
- ultrachrome_bits, ultrachrome_base_res, &cutter_roll_feed_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_YES |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 96, 96, 2, 96, 96, 2, 192, 192, 1, 7,
+ 360, 14400, -1, 2880, 1440, 360, 180, 0, 1, 0, 190, 0, 0, 0,
+ INCH(13), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, 204, 191, 0, 0,
+ 4, 15, 0, 0,
+ c4pl_pigment_dotsizes, c4pl_pigment_densities, &stpi_escp2_variable_ultrachrome_drops,
+ stpi_escp2_superfine_reslist, &stpi_escp2_f360_ultrachrome_inkgroup,
+ ultrachrome_bits, ultrachrome_base_res, &cd_cutter_roll_feed_input_slot_list,
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &sp2200_channel_name_list
},
/* 48: Stylus Pro 7600 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_PRO | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_YES |
- MODEL_FAST_360_NO),
- 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 360, 2880, 2880, 14400, -1, 2880, 1440, 360, 180,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_YES | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 7,
+ 360, 14400, -1, 2880, 1440, 360, 180, 0, 1, 0, 0, 0, 0, 0,
INCH(24), INCH(1200), INCH(7), INCH(7),
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- spro_c4pl_pigment_dotsizes, c4pl_pigment_densities, &variable_4pl_pigment_inks,
- &standard_paper_list, pro_reslist, &photo7_inklist,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ spro_c4pl_pigment_dotsizes, c4pl_pigment_densities, &stpi_escp2_variable_ultrachrome_drops,
+ stpi_escp2_pro_reslist, &stpi_escp2_ultrachrome_inkgroup,
ultrachrome_bits, pro_base_res, &pro_roll_feed_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ &stpi_escp2_pro7600_printer_weave_list, &photo_channel_name_list
},
/* 49: Stylus Pro 9600 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_PRO | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_YES |
- MODEL_FAST_360_NO),
- 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 360, 2880, 2880, 14400, -1, 2880, 1440, 360, 180,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_YES | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 7,
+ 360, 14400, -1, 2880, 1440, 360, 180, 0, 1, 0, 0, 0, 0, 0,
INCH(44), INCH(1200), INCH(7), INCH(7),
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- spro_c4pl_pigment_dotsizes, c4pl_pigment_densities, &variable_4pl_pigment_inks,
- &standard_paper_list, pro_reslist, &photo7_inklist,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ spro_c4pl_pigment_dotsizes, c4pl_pigment_densities, &stpi_escp2_variable_ultrachrome_drops,
+ stpi_escp2_pro_reslist, &stpi_escp2_ultrachrome_inkgroup,
ultrachrome_bits, pro_base_res, &pro_roll_feed_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ &stpi_escp2_pro7600_printer_weave_list, &photo_channel_name_list
},
/* 50: Stylus Photo 825/830 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 48, 1, 3, 48, 1, 3,
- 360, 720, 720, 14400, -1, 2880, 1440, 90, 90,
- INCH(17 / 2), INCH(1200), INCH(2), INCH(4),
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 190, 0, 0, 0,
- c4pl_dotsizes, c4pl_densities, &variable_4pl_inks,
- &sp780_paper_list, standard_reslist, &photo_inklist,
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 48, 1, 3, 48, 1, 3, 48, 1, 3, 6,
+ 360, 14400, -1, 2880, 1440, 90, 90, 0, 1, 0, 55, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c4pl_dotsizes, c4pl_2880_densities, &stpi_escp2_variable_2880_4pl_drops,
+ stpi_escp2_2880_1440dpi_reslist, &stpi_escp2_photo_gen2_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &photo_channel_name_list
},
/* 51: Stylus Photo 925 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 48, 1, 3, 48, 1, 3,
- 360, 720, 720, 14400, -1, 2880, 1440, 90, 90,
- INCH(17 / 2), INCH(1200), INCH(2), INCH(4),
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 190, 0, 0, 0,
- c4pl_dotsizes, c4pl_densities, &variable_4pl_inks,
- &standard_paper_list, standard_reslist, &photo_inklist,
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 48, 1, 3, 48, 1, 3, 48, 1, 3, 6,
+ 360, 14400, -1, 2880, 1440, 90, 90, 0, 1, 0, 55, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c4pl_dotsizes, c4pl_2880_densities, &stpi_escp2_variable_2880_4pl_drops,
+ stpi_escp2_2880_1440dpi_reslist, &stpi_escp2_photo_gen2_inkgroup,
variable_bits, variable_base_res, &cutter_roll_feed_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &photo_channel_name_list
},
/* 52: Stylus Color C62 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 144, 1, 1, 144, 1, 1,
- 360, 720, 720, 14400, -1, 2880, 1440, 90, 90,
- INCH(17 / 2), INCH(1200), INCH(2), INCH(4),
- 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- c4pl_dotsizes, c4pl_densities, &variable_4pl_inks,
- &standard_paper_list, standard_reslist, &standard_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 48, 1, 3, 144, 1, 1, 144, 1, 1, 4,
+ 360, 14400, -1, 2880, 1440, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c4pl_dotsizes, c4pl_2880_densities, &stpi_escp2_variable_2880_4pl_drops,
+ stpi_escp2_2880_1440dpi_reslist, &stpi_escp2_standard_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
/* 53: Japanese PM-950C */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO |
- MODEL_FAST_360_YES),
- 96, 1, 2, 96, 1, 2, 96, 1, 2,
- 360, 720, 720, 14400, -1, 2880, 1440, 360, 180,
- INCH(17 / 2), INCH(1200), INCH(2), INCH(4),
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 190, 0, 0, 0,
- c2pl_dotsizes, c2pl_densities, &variable_2pl_inks,
- &sp950_paper_list, escp950_reslist, &f360_photo7_japan_inklist,
- stp950_bits, stp950_base_res, &standard_roll_feed_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_YES |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 96, 96, 2, 96, 96, 2, 24, 24, 1, 6,
+ 360, 14400, -1, 2880, 1440, 360, 180, 0, 1, 0, 190, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 204, 191, 0, 0,
+ 4, 15, 0, 0,
+ c2pl_dotsizes, c2pl_densities, &stpi_escp2_variable_2pl_drops,
+ stpi_escp2_superfine_reslist, &stpi_escp2_f360_photo7_japan_inkgroup,
+ stp950_bits, stp950_base_res, &cd_cutter_roll_feed_input_slot_list,
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &pm_950c_channel_name_list
},
/* 54: Stylus Photo EX3 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_1999 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 32, 1, 4, 32, 1, 4, 32, 1, 4,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, 0, 0, 0,
- sc720_dotsizes, c6pl_densities, &variable_6pl_inks,
- &standard_paper_list, standard_reslist, &photo_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 32, 1, 4, 32, 1, 4, 32, 1, 4, 6,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, 0, 0, 0,
+ INCH(13), INCH(44), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ sp720_dotsizes, c6pl_densities, &stpi_escp2_variable_6pl_drops,
+ stpi_escp2_1440dpi_reslist, &stpi_escp2_photo_gen1_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &photo_channel_name_list
},
/* 55: Stylus C82/CX-5200 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 59, 60, 2, 180, 180, 2, 180, 180, 2,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, -240, 0, 0,
- c3pl_pigment_dotsizes, c3pl_pigment_densities, &variable_3pl_pigment_inks,
- &c80_paper_list, standard_reslist, &c80_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 59, 60, 2, 180, 180, 2, 180, 180, 2, 4,
+ 360, 14400, -1, 2880, 1440, 360, 180, 0, 1, 0, 0, -240, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 4, 15, 0, 0,
+ c3pl_pigment_dotsizes, c3pl_pigment_densities, &stpi_escp2_variable_3pl_pigment_drops,
+ stpi_escp2_2880_1440dpi_reslist, &stpi_escp2_c82_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
/* 56: Stylus C50 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 15, 15, 3, 48, 48, 3, 48, 48, 3,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, -99, 0, 0,
- c4pl_dotsizes, c4pl_densities, &variable_4pl_inks,
- &standard_paper_list, standard_reslist, &x80_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 15, 15, 3, 48, 48, 3, 48, 48, 3, 4,
+ 360, 14400, -1, 1440, 720, 90, 90, 0, 1, 0, 0, -99, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c4pl_dotsizes, c4pl_densities, &stpi_escp2_variable_x80_6pl_drops,
+ stpi_escp2_1440dpi_reslist, &stpi_escp2_x80_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
/* 57: Japanese PM-970C */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO |
- MODEL_FAST_360_YES),
- 180, 180, 2, 360, 360, 1, 360, 360, 1,
- 360, 720, 720, 14400, -1, 2880, 1440, 720, 360,
- INCH(17 / 2), INCH(1200), INCH(2), INCH(4),
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 190, 0, 0, 0,
- c1_8pl_dotsizes, c2pl_densities, &variable_2pl_inks,
- &sp950_paper_list, c1_8pl_reslist, &f360_photo7_japan_inklist,
- c1_8_bits, c1_8_base_res, &standard_roll_feed_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_YES |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 180, 180, 2, 360, 360, 1, 360, 360, 1, 6,
+ 360, 14400, -1, 2880, 2880, 720, 360, 0, 1, 0, 190, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 4, 15, 0, 0,
+ c1_8pl_dotsizes, c1_8pl_densities, &stpi_escp2_variable_2pl_drops,
+ stpi_escp2_superfine_reslist, &stpi_escp2_f360_photo7_japan_inkgroup,
+ c1_8_bits, c1_8_base_res, &cutter_roll_feed_input_slot_list,
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &pm_950c_channel_name_list
},
/* 58: Japanese PM-930C */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_NO |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 90, 90, 2, 90, 90, 2, 90, 90, 2,
- 360, 720, 720, 14400, -1, 2880, 1440, 720, 360,
- INCH(17 / 2), INCH(1200), INCH(2), INCH(4),
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 190, 0, 0, 0,
- c1_8pl_dotsizes, c2pl_densities, &variable_2pl_inks,
- &sp950_paper_list, c1_8pl_reslist, &photo_inklist,
- c1_8_bits, c1_8_base_res, &standard_roll_feed_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
- },
- /* 59: Stylus C43SX/C43UX/C44SX/C44UX (WRONG -- Really entry 43!) */
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 90, 90, 2, 90, 90, 2, 90, 90, 2, 6,
+ 360, 14400, -1, 2880, 2880, 720, 360, 0, 1, 0, 190, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 4, 15, 0, 0,
+ c1_8pl_dotsizes, c1_8pl_densities, &stpi_escp2_variable_2pl_drops,
+ stpi_escp2_superfine_reslist, &stpi_escp2_photo_gen2_inkgroup,
+ c1_8_bits, c1_8_base_res, &cutter_roll_feed_input_slot_list,
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &photo_channel_name_list
+ },
+ /* 59: Stylus C43SX/C43UX/C44SX/C44UX (WRONG -- see 43!) */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 15, 15, 3, 48, 48, 3, 48, 48, 3,
- 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, 9, 9, 0, 0, 9, 9, 0, 0,
- 0, 1, 0, 0, -99, 0, 0,
- sc480_dotsizes, sc480_densities, &variable_x80_6pl_inks,
- &standard_paper_list, standard_reslist, &x80_inklist,
+ MODEL_XZEROMARGIN_NO | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_YES |
+ MODEL_PACKET_MODE_YES),
+ 15, 15, 3, 48, 48, 3, 48, 48, 3, 4,
+ 360, 14400, -1, 2880, 720, 90, 90, 0, 1, 0, 0, -99, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 3, 15, 0, 0,
+ c4pl_dotsizes, c4pl_densities, &stpi_escp2_variable_x80_6pl_drops,
+ stpi_escp2_1440dpi_reslist, &stpi_escp2_x80_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
- /* 60: Stylus C83/C84 */
+ /* 60: Stylus C84 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 59, 60, 2, 180, 180, 2, 180, 180, 2,
- 360, 720, 720, 14400, -1, 2880, 1440, 360, 180,
- INCH(17 / 2), INCH(1200), INCH(2), INCH(4),
- 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 125, -240, 0, 0,
- c3pl_pigment_dotsizes, c3pl_pigment_densities, &variable_3pl_pigment_inks,
- &c80_paper_list, standard_reslist, &c80_inklist,
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 59, 60, 2, 180, 180, 2, 180, 180, 2, 4,
+ 360, 14400, -1, 2880, 1440, 360, 180, 0, 1, 0, 0, -240, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 4, 15, 0, 0,
+ c3pl_pigment_dotsizes, c3pl_pigment_densities, &stpi_escp2_variable_3pl_pigment_drops,
+ stpi_escp2_2880_1440dpi_reslist, &stpi_escp2_c82_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
- /* 61: Stylus C63/C64 */
+ /* 61: Stylus Color C63/C64 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_NO | MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 29, 30, 3, 90, 90, 3, 90, 90, 3,
- 360, 720, 720, 14400, -1, 2880, 1440, 360, 180,
- INCH(17 / 2), INCH(1200), INCH(2), INCH(4),
- 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 125, -180, 0, 0,
- c3pl_pigment_dotsizes, c3pl_pigment_densities, &variable_3pl_pigment_inks,
- &c80_paper_list, standard_reslist, &c64_inklist,
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 29, 30, 3, 90, 90, 3, 90, 90, 3, 4,
+ 360, 14400, -1, 2880, 1440, 360, 120, 0, 1, 0, 0, -180, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 4, 15, 0, 0,
+ c3pl_pigment_dotsizes, c3pl_pigment_densities, &stpi_escp2_variable_3pl_pigment_drops,
+ stpi_escp2_2880_1440dpi_reslist, &stpi_escp2_c64_inkgroup,
variable_bits, variable_base_res, &default_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
/* 62: Stylus Photo 900 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 48, 1, 3, 48, 1, 3, 48, 1, 3,
- 360, 720, 720, 14400, -1, 2880, 1440, 90, 90,
- INCH(17 / 2), INCH(1200), INCH(2), INCH(4),
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 125, 0, 0, 0,
- c4pl_dotsizes, c4pl_densities, &variable_4pl_inks,
- &standard_paper_list, standard_reslist, &photo_inklist,
- variable_bits, variable_base_res, &cutter_roll_feed_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 48, 1, 3, 48, 1, 3, 48, 1, 3, 6,
+ 360, 14400, -1, 2880, 720, 90, 90, 0, 1, 0, 55, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 399, 394, 595, 842,
+ 3, 15, 0, 0,
+ c4pl_dotsizes, c4pl_2880_densities, &stpi_escp2_variable_2880_4pl_drops,
+ stpi_escp2_2880dpi_reslist, &stpi_escp2_photo_gen2_inkgroup,
+ variable_bits, variable_base_res, &cd_roll_feed_input_slot_list,
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &photo_channel_name_list
},
/* 63: Stylus Photo R300 */
{
(MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
- MODEL_ROLLFEED_YES | MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO |
- MODEL_FAST_360_NO),
- 90, 1, 3, 90, 1, 3, 90, 1, 3,
- 360, 720, 720, 14400, -1, 2880, 1440, 90, 90,
- INCH(17 / 2), INCH(1200), INCH(2), INCH(4),
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 0, 125, 0, 0, 0,
- p3pl_dotsizes, p3pl_densities, &variable_3pl_pmg_inks,
- &standard_paper_list, standard_reslist, &photo_inklist,
- variable_bits, variable_base_res, &cutter_roll_feed_input_slot_list,
- &new_init_sequence, &je_deinit_sequence
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 90, 1, 3, 90, 1, 3, 90, 1, 3, 6,
+ 360, 14400, -1, 2880, 1440, 360, 120, 0, 1, 0, 190, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 204, 191, 595, 842,
+ 4, 15, 0, 0,
+ p3pl_dotsizes, p3pl_densities, &stpi_escp2_variable_3pl_pmg_drops,
+ stpi_escp2_superfine_reslist, &stpi_escp2_photo_gen3_inkgroup,
+ variable_bits, variable_base_res, &cd_roll_feed_input_slot_list,
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &photo_channel_name_list
+ },
+ /* 64: PM-G800/Stylus Photo R800 */
+ {
+ (MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 180, 1, 2, 180, 1, 2, 180, 1, 2, 8,
+ 360, 14400, -1, 2880, 2880, 360, 180, 0, 1, 0, 190, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 204, 191, 595, 842,
+ 4, 15, 0, 0,
+ p1_5pl_dotsizes, p1_5pl_densities, &stpi_escp2_variable_1_5pl_drops,
+ stpi_escp2_superfine_reslist, &stpi_escp2_cmykrb_inkgroup,
+ variable_bits, c1_5_base_res, &cd_roll_feed_input_slot_list,
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &r800_channel_name_list
+ },
+ /* 65: Stylus Photo CX4600 */
+ {
+ (MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 90, 1, 3, 90, 1, 3, 90, 1, 3, 6,
+ 360, 14400, -1, 2880, 1440, 360, 120, 0, 1, 0, 190, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 204, 191, 595, 842,
+ 4, 15, 0, 0,
+ p3pl_dotsizes, p3pl_densities, &stpi_escp2_variable_3pl_pmg_drops,
+ stpi_escp2_superfine_reslist, &stpi_escp2_cx3650_inkgroup,
+ variable_bits, variable_base_res, &default_input_slot_list,
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &photo_channel_name_list
+ },
+ /* 66: Stylus Color C65/C66 */
+ {
+ (MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 29, 30, 3, 90, 90, 3, 90, 90, 3, 4,
+ 360, 14400, -1, 2880, 1440, 360, 120, 0, 1, 0, 0, -180, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 4, 15, 0, 0,
+ c3pl_pigment_dotsizes, c3pl_pigment_c66_densities, &stpi_escp2_variable_3pl_pigment_c66_drops,
+ stpi_escp2_2880_1440dpi_reslist, &stpi_escp2_c64_inkgroup,
+ variable_bits, variable_base_res, &default_input_slot_list,
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
+ },
+ /* 67: Stylus Photo R1800 */
+ {
+ (MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 180, 1, 2, 180, 1, 2, 180, 1, 2, 8,
+ 360, 14400, -1, 2880, 2880, 360, 180, 0, 1, 0, 190, 0, 0, 0,
+ INCH(13), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 204, 191, 595, 842,
+ 4, 15, 0, 0,
+ p1_5pl_dotsizes, p1_5pl_densities, &stpi_escp2_variable_1_5pl_drops,
+ stpi_escp2_superfine_reslist, &stpi_escp2_cmykrb_inkgroup,
+ variable_bits, c1_5_base_res, &cd_roll_feed_input_slot_list,
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &r800_channel_name_list
+ },
+ /* 68: PM-G820 */
+ {
+ (MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 180, 1, 2, 180, 1, 2, 180, 1, 2, 8,
+ 360, 14400, -1, 2880, 2880, 360, 180, 0, 1, 0, 190, 0, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 204, 191, 595, 842,
+ 4, 15, 0, 0,
+ p1_5pl_dotsizes, p1_5pl_densities, &stpi_escp2_variable_1_5pl_drops,
+ stpi_escp2_superfine_reslist, &stpi_escp2_photo_gen3_inkgroup,
+ variable_bits, c1_5_base_res, &cd_roll_feed_input_slot_list,
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &r800_channel_name_list
+ },
+ /* 69: Stylus C86 */
+ {
+ (MODEL_VARIABLE_YES | MODEL_COMMAND_2000 | MODEL_GRAYMODE_YES |
+ MODEL_XZEROMARGIN_YES | MODEL_VACUUM_NO | MODEL_FAST_360_NO |
+ MODEL_SEND_ZERO_ADVANCE_YES | MODEL_SUPPORTS_INK_CHANGE_NO |
+ MODEL_PACKET_MODE_YES),
+ 59, 60, 2, 180, 180, 2, 180, 180, 2, 4,
+ 360, 14400, -1, 2880, 2880, 360, 180, 0, 1, 0, 0, -240, 0, 0,
+ INCH(17 / 2), INCH(1200), INCH(2), INCH(2),
+ 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 0, 0, -1, -1, 0, 0,
+ 4, 15, 0, 0,
+ c3pl_pigment_dotsizes, c3pl_pigment_densities, &stpi_escp2_variable_3pl_pigment_drops,
+ stpi_escp2_2880_1440dpi_reslist, &stpi_escp2_c82_inkgroup,
+ variable_bits, variable_base_res, &default_input_slot_list,
+ &standard_quality_list, &new_init_sequence, &je_deinit_sequence,
+ NULL, &standard_channel_name_list
},
};
+
+const int stpi_escp2_model_limit =
+sizeof(stpi_escp2_model_capabilities) / sizeof(stpi_escp2_printer_t);
diff --git a/src/main/print-escp2.c b/src/main/print-escp2.c
index 4818a23..03f0cce 100644
--- a/src/main/print-escp2.c
+++ b/src/main/print-escp2.c
@@ -1,5 +1,5 @@
/*
- * "$Id: print-escp2.c,v 1.147.2.24 2003/12/02 01:51:00 rlk Exp $"
+ * "$Id: print-escp2.c,v 1.340 2005/06/30 00:12:14 rlk Exp $"
*
* Print plug-in EPSON ESC/P2 driver for the GIMP.
*
@@ -29,140 +29,609 @@
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#include <gimp-print/gimp-print.h>
-#include "gimp-print-internal.h"
-#include <gimp-print/gimp-print-intl-internal.h>
+#include <gutenprint/gutenprint.h>
+#include <gutenprint/gutenprint-intl-internal.h>
+#include "gutenprint-internal.h"
#include <string.h>
-#include <stdio.h>
+#include <assert.h>
+#include <math.h>
#include "print-escp2.h"
#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
-
#define OP_JOB_START 1
#define OP_JOB_PRINT 2
#define OP_JOB_END 4
-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);
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
-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)
+typedef struct
{
- if (resid < 0 || resid >= RES_N)
- return -1;
- return dotidmap[resid];
-}
+ const char *attr_name;
+ short bit_shift;
+ short bit_width;
+} escp2_printer_attr_t;
static const escp2_printer_attr_t escp2_printer_attrs[] =
{
{ "command_mode", 0, 4 },
{ "horizontal_zero_margin", 4, 1 },
- { "rollfeed", 5, 1 },
- { "variable_mode", 6, 1 },
- { "graymode", 7, 1 },
- { "vacuum", 8, 1 },
- { "fast_360", 9, 1 },
+ { "variable_mode", 5, 1 },
+ { "graymode", 6, 1 },
+ { "vacuum", 7, 1 },
+ { "fast_360", 8, 1 },
+ { "send_zero_advance", 9, 1 },
+ { "supports_ink_change", 10, 1 },
+ { "packet_mode", 11, 1 },
+};
+
+typedef struct
+{
+ unsigned count;
+ const char *name;
+} channel_count_t;
+
+static const channel_count_t escp2_channel_counts[] =
+{
+ { 1, "1" },
+ { 2, "2" },
+ { 3, "3" },
+ { 4, "4" },
+ { 5, "5" },
+ { 6, "6" },
+ { 7, "7" },
+ { 8, "8" },
+ { 9, "9" },
+ { 10, "10" },
+ { 11, "11" },
+ { 12, "12" },
+ { 13, "13" },
+ { 14, "14" },
+ { 15, "15" },
+ { 16, "16" },
+ { 17, "17" },
+ { 18, "18" },
+ { 19, "19" },
+ { 20, "20" },
+ { 21, "21" },
+ { 22, "22" },
+ { 23, "23" },
+ { 24, "24" },
+ { 25, "25" },
+ { 26, "26" },
+ { 27, "27" },
+ { 28, "28" },
+ { 29, "29" },
+ { 30, "30" },
+ { 31, "31" },
+ { 32, "32" },
+};
+
+static stp_curve_t *hue_curve_bounds = NULL;
+static int escp2_channel_counts_count =
+sizeof(escp2_channel_counts) / sizeof(channel_count_t);
+
+static const double ink_darknesses[] =
+{
+ 1.0, 0.31 / .4, 0.61 / .96, 0.08, 0.31 * 0.33 / .4, 0.61 * 0.33 / .96, 0.33, 1.0
};
#define INCH(x) (72 * x)
-static const res_t *escp2_find_resolution(int model, const stp_vars_t v,
- const char *resolution);
+static const res_t *escp2_find_resolution(const stp_vars_t *v);
+
+#define PARAMETER_INT(s) \
+{ \
+ "escp2_" #s, "escp2_" #s, N_("Advanced Printer Functionality"), NULL, \
+ STP_PARAMETER_TYPE_INT, STP_PARAMETER_CLASS_FEATURE, \
+ STP_PARAMETER_LEVEL_INTERNAL, 0, 1, -1, 1, 0 \
+}
+
+#define PARAMETER_INT_RO(s) \
+{ \
+ "escp2_" #s, "escp2_" #s, N_("Advanced Printer Functionality"), NULL, \
+ STP_PARAMETER_TYPE_INT, STP_PARAMETER_CLASS_FEATURE, \
+ STP_PARAMETER_LEVEL_INTERNAL, 0, 1, -1, 1, 1 \
+}
+
+#define PARAMETER_RAW(s) \
+{ \
+ "escp2_" #s, "escp2_" #s, N_("Advanced Printer Functionality"), NULL, \
+ STP_PARAMETER_TYPE_RAW, STP_PARAMETER_CLASS_FEATURE, \
+ STP_PARAMETER_LEVEL_INTERNAL, 0, 1, -1, 1, 0 \
+}
typedef struct
{
- int undersample;
- int denominator;
- int initial_vertical_offset;
- int min_nozzles;
- int printed_something;
- int last_color;
- const physical_subchannel_t **channels;
-} escp2_privdata_t;
-
-typedef struct escp2_init
-{
- int model;
- int output_type;
- int ydpi;
- int xdpi;
- int physical_xdpi;
- int use_softweave;
- int use_interleave;
- int page_true_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;
- int total_channels;
- int use_black_parameters;
- int use_fast_360;
- int print_op;
- const char *paper_type;
- const char *media_source;
- const escp2_inkname_t *inkname;
- const input_slot_t *input_slot;
- stp_vars_t v;
-} escp2_init_t;
+ const stp_parameter_t param;
+ double min;
+ double max;
+ double defval;
+ int color_only;
+} float_param_t;
+
+static const stp_parameter_t the_parameters[] =
+{
+#if 0
+ {
+ "AutoMode", N_("Automatic Printing Mode"), N_("Basic Output Adjustment"),
+ N_("Automatic printing mode"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+#endif
+ /*
+ * Don't check this parameter. We may offer different settings for
+ * different papers, but we need to be able to handle settings from PPD
+ * files that don't have constraints set up.
+ */
+ {
+ "Quality", N_("Print Quality"), N_("Basic Output Adjustment"),
+ N_("Print Quality"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 0, 0
+ },
+ {
+ "PageSize", N_("Page Size"), N_("Basic Printer Setup"),
+ N_("Size of the paper being printed to"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "MediaType", N_("Media Type"), N_("Basic Printer Setup"),
+ N_("Type of media (plain paper, photo paper, etc.)"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "InputSlot", N_("Media Source"), N_("Basic Printer Setup"),
+ N_("Source (input slot) of the media"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "CDInnerRadius", N_("CD Hub Size"), N_("Basic Printer Setup"),
+ N_("Print only outside of the hub of the CD, or all the way to the hole"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "CDXAdjustment", N_("CD Horizontal Fine Adjustment"), N_("Advanced Printer Setup"),
+ N_("Fine adjustment to horizontal position for CD printing"),
+ STP_PARAMETER_TYPE_DIMENSION, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_ADVANCED, 1, 1, -1, 1, 0
+ },
+ {
+ "CDYAdjustment", N_("CD Vertical Fine Adjustment"), N_("Advanced Printer Setup"),
+ N_("Fine adjustment to horizontal position for CD printing"),
+ STP_PARAMETER_TYPE_DIMENSION, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_ADVANCED, 1, 1, -1, 1, 0
+ },
+ {
+ "Resolution", N_("Resolution"), N_("Basic Printer Setup"),
+ N_("Resolution of the print"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_ADVANCED, 1, 1, -1, 1, 0
+ },
+ /*
+ * Don't check this parameter. We may offer different settings for
+ * different ink sets, but we need to be able to handle settings from PPD
+ * files that don't have constraints set up.
+ */
+ {
+ "InkType", N_("Ink Type"), N_("Advanced Printer Setup"),
+ N_("Type of ink in the printer"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_ADVANCED2, 1, 1, -1, 0, 0
+ },
+ {
+ "UseGloss", N_("Enhanced Gloss"), N_("Basic Printer Setup"),
+ N_("Add gloss enhancement"),
+ STP_PARAMETER_TYPE_BOOLEAN, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 0, 0
+ },
+ {
+ "InkSet", N_("Ink Set"), N_("Basic Printer Setup"),
+ N_("Type of ink in the printer"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "PrintingDirection", N_("Printing Direction"), N_("Advanced Output Adjustment"),
+ N_("Printing direction (unidirectional is higher quality, but slower)"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_ADVANCED1, 1, 1, -1, 1, 0
+ },
+ {
+ "FullBleed", N_("Borderless"), N_("Basic Printer Setup"),
+ N_("Print without borders"),
+ STP_PARAMETER_TYPE_BOOLEAN, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "Weave", N_("Interleave Method"), N_("Advanced Output Adjustment"),
+ N_("Interleave pattern to use"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_ADVANCED1, 1, 1, -1, 1, 0
+ },
+ {
+ "AdjustDotsize", N_("Adjust dot size as necessary"), N_("Advanced Printer Setup"),
+ N_("Adjust dot size as necessary to achieve desired density"),
+ STP_PARAMETER_TYPE_BOOLEAN, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_ADVANCED4, 1, 1, -1, 1, 0
+ },
+ {
+ "OutputOrder", N_("Output Order"), N_("Basic Printer Setup"),
+ N_("Output Order"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 0, 0, -1, 0, 0
+ },
+ {
+ "AlignmentPasses", N_("Alignment Passes"), N_("Advanced Printer Functionality"),
+ N_("Alignment Passes"),
+ STP_PARAMETER_TYPE_INT, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_INTERNAL, 0, 0, -1, 0, 0
+ },
+ {
+ "AlignmentChoices", N_("Alignment Choices"), N_("Advanced Printer Functionality"),
+ N_("Alignment Choices"),
+ STP_PARAMETER_TYPE_INT, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_INTERNAL, 0, 0, -1, 0, 0
+ },
+ {
+ "InkChange", N_("Ink change command"), N_("Advanced Printer Functionality"),
+ N_("Ink change command"),
+ STP_PARAMETER_TYPE_INT, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_INTERNAL, 0, 0, -1, 0, 0
+ },
+ {
+ "AlternateAlignmentPasses", N_("Alternate Alignment Passes"), N_("Advanced Printer Functionality"),
+ N_("Alternate Alignment Passes"),
+ STP_PARAMETER_TYPE_INT, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_INTERNAL, 0, 0, -1, 0, 0
+ },
+ {
+ "AlternateAlignmentChoices", N_("Alternate Alignment Choices"), N_("Advanced Printer Functionality"),
+ N_("Alternate Alignment Choices"),
+ STP_PARAMETER_TYPE_INT, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_INTERNAL, 0, 0, -1, 0, 0
+ },
+ {
+ "SupportsPacketMode", N_("Supports Packet Mode"), N_("Advanced Printer Functionality"),
+ N_("Alternate Alignment Choices"),
+ STP_PARAMETER_TYPE_BOOLEAN, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_INTERNAL, 0, 0, -1, 0, 0
+ },
+ {
+ "InkChannels", N_("Ink Channels"), N_("Advanced Printer Functionality"),
+ N_("Ink Channels"),
+ STP_PARAMETER_TYPE_INT, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_INTERNAL, 0, 0, -1, 0, 0
+ },
+ {
+ "ChannelNames", N_("Channel Names"), N_("Advanced Printer Functionality"),
+ N_("Channel Names"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_INTERNAL, 0, 0, -1, 0, 0
+ },
+ {
+ "PrintingMode", N_("Printing Mode"), N_("Core Parameter"),
+ N_("Printing Output Mode"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "RawChannels", N_("Raw Channels"), N_("Core Parameter"),
+ N_("Raw Channel Count"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_BASIC, 0, 1, -1, 1, 0
+ },
+ {
+ "CyanHueCurve", N_("Cyan Map"), N_("Advanced Output Control"),
+ N_("Adjust the cyan map"),
+ STP_PARAMETER_TYPE_CURVE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, 1, 1, 0
+ },
+ {
+ "MagentaHueCurve", N_("Magenta Map"), N_("Advanced Output Control"),
+ N_("Adjust the magenta map"),
+ STP_PARAMETER_TYPE_CURVE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, 2, 1, 0
+ },
+ {
+ "YellowHueCurve", N_("Yellow Map"), N_("Advanced Output Control"),
+ N_("Adjust the yellow map"),
+ STP_PARAMETER_TYPE_CURVE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, 3, 1, 0
+ },
+ {
+ "BlueHueCurve", N_("Blue Map"), N_("Advanced Output Control"),
+ N_("Adjust the blue map"),
+ STP_PARAMETER_TYPE_CURVE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, 4, 1, 0
+ },
+ {
+ "RedHueCurve", N_("Red Map"), N_("Advanced Output Control"),
+ N_("Adjust the red map"),
+ STP_PARAMETER_TYPE_CURVE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, 5, 1, 0
+ },
+ PARAMETER_INT(max_hres),
+ PARAMETER_INT(max_vres),
+ PARAMETER_INT(min_hres),
+ PARAMETER_INT(min_vres),
+ PARAMETER_INT(nozzles),
+ PARAMETER_INT(black_nozzles),
+ PARAMETER_INT(fast_nozzles),
+ PARAMETER_INT(min_nozzles),
+ PARAMETER_INT(min_black_nozzles),
+ PARAMETER_INT(min_fast_nozzles),
+ PARAMETER_INT(nozzle_separation),
+ PARAMETER_INT(black_nozzle_separation),
+ PARAMETER_INT(fast_nozzle_separation),
+ PARAMETER_INT(separation_rows),
+ PARAMETER_INT(max_paper_width),
+ PARAMETER_INT(max_paper_height),
+ PARAMETER_INT(min_paper_width),
+ PARAMETER_INT(min_paper_height),
+ PARAMETER_INT(extra_feed),
+ PARAMETER_INT(pseudo_separation_rows),
+ PARAMETER_INT(base_separation),
+ PARAMETER_INT(resolution_scale),
+ PARAMETER_INT(initial_vertical_offset),
+ PARAMETER_INT(black_initial_vertical_offset),
+ PARAMETER_INT(max_black_resolution),
+ PARAMETER_INT(zero_margin_offset),
+ PARAMETER_INT(extra_720dpi_separation),
+ PARAMETER_INT(physical_channels),
+ PARAMETER_INT(left_margin),
+ PARAMETER_INT(right_margin),
+ PARAMETER_INT(top_margin),
+ PARAMETER_INT(bottom_margin),
+ PARAMETER_INT_RO(alignment_passes),
+ PARAMETER_INT_RO(alignment_choices),
+ PARAMETER_INT_RO(alternate_alignment_passes),
+ PARAMETER_INT_RO(alternate_alignment_choices),
+ PARAMETER_INT(cd_x_offset),
+ PARAMETER_INT(cd_y_offset),
+ PARAMETER_INT(cd_page_width),
+ PARAMETER_INT(cd_page_height),
+ PARAMETER_RAW(preinit_sequence),
+ PARAMETER_RAW(postinit_remote_sequence)
+};
+
+static const int the_parameter_count =
+sizeof(the_parameters) / sizeof(const stp_parameter_t);
+
+static const float_param_t float_parameters[] =
+{
+ {
+ {
+ "CyanDensity", N_("Cyan Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the cyan balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 1, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "MagentaDensity", N_("Magenta Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the magenta balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 2, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "YellowDensity", N_("Yellow Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the yellow balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 3, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "BlackDensity", N_("Black Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the black balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 0, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "RedDensity", N_("Red Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the red balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 4, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "BlueDensity", N_("Blue Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the blue balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 5, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "GlossLimit", N_("Gloss Level"), N_("Output Level Adjustment"),
+ N_("Adjust the gloss level"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 6, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "LightCyanTransition", N_("Light Cyan Transition"), N_("Advanced Ink Adjustment"),
+ N_("Light Cyan Transition"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, -1, 1, 0
+ }, 0.0, 5.0, 1.0, 1
+ },
+ {
+ {
+ "LightMagentaTransition", N_("Light Magenta Transition"), N_("Advanced Ink Adjustment"),
+ N_("Light Magenta Transition"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, -1, 1, 0
+ }, 0.0, 5.0, 1.0, 1
+ },
+ {
+ {
+ "DarkYellowTransition", N_("Dark Yellow Transition"), N_("Advanced Ink Adjustment"),
+ N_("Dark Yellow Transition"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, -1, 1, 0
+ }, 0.0, 5.0, 1.0, 1
+ },
+ {
+ {
+ "GrayTransition", N_("Gray Transition"), N_("Advanced Ink Adjustment"),
+ N_("Gray Transition"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, -1, 1, 0
+ }, 0.0, 5.0, 1.0, 1
+ },
+ {
+ {
+ "Gray3Transition", N_("Dark Gray Transition"), N_("Advanced Ink Adjustment"),
+ N_("Dark Gray Transition"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, -1, 1, 0
+ }, 0.0, 5.0, 1.0, 1
+ },
+ {
+ {
+ "Gray2Transition", N_("Mid Gray Transition"), N_("Advanced Ink Adjustment"),
+ N_("Medium Gray Transition"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, -1, 1, 0
+ }, 0.0, 5.0, 1.0, 1
+ },
+ {
+ {
+ "Gray1Transition", N_("Light Gray Transition"), N_("Advanced Ink Adjustment"),
+ N_("Light Gray Transition"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, -1, 1, 0
+ }, 0.0, 5.0, 1.0, 1
+ },
+ {
+ {
+ "MultiChannelLimit", N_("Red and Blue Ink Usage"), N_("Advanced Ink Adjustment"),
+ N_("Amount of red and blue ink to use"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, -1, 1, 0
+ }, 0.0, 1.0, 1.0, 1
+ },
+};
+static const int float_parameter_count =
+sizeof(float_parameters) / sizeof(const float_param_t);
+
+
+static escp2_privdata_t *
+get_privdata(stp_vars_t *v)
+{
+ return (escp2_privdata_t *) stp_get_component_data(v, "Driver");
+}
+
+static model_featureset_t
+escp2_get_cap(const stp_vars_t *v, escp2_model_option_t feature)
+{
+ int model = stp_get_model_id(v);
+ if (feature < 0 || feature >= MODEL_LIMIT)
+ return (model_featureset_t) -1;
+ else
+ {
+ model_featureset_t featureset =
+ (((1ul << escp2_printer_attrs[feature].bit_width) - 1ul) <<
+ escp2_printer_attrs[feature].bit_shift);
+ return stpi_escp2_model_capabilities[model].flags & featureset;
+ }
+}
static int
-escp2_has_cap(int model, escp2_model_option_t feature,
- model_featureset_t class, const stp_vars_t v)
+escp2_has_cap(const stp_vars_t *v, escp2_model_option_t feature,
+ model_featureset_t class)
{
+ int model = stp_get_model_id(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 ((stp_escp2_model_capabilities[model].flags & featureset)==class);
+ (((1ul << escp2_printer_attrs[feature].bit_width) - 1ul) <<
+ escp2_printer_attrs[feature].bit_shift);
+ if ((stpi_escp2_model_capabilities[model].flags & featureset) == class)
+ return 1;
+ else
+ return 0;
}
}
-#define DEF_SIMPLE_ACCESSOR(f, t) \
-static t \
-escp2_##f(int model, const stp_vars_t v) \
+#define DEF_SIMPLE_ACCESSOR(f, t) \
+static inline t \
+escp2_##f(const stp_vars_t *v) \
+{ \
+ if (stp_check_int_parameter(v, "escp2_" #f, STP_PARAMETER_ACTIVE)) \
+ return stp_get_int_parameter(v, "escp2_" #f); \
+ else \
+ { \
+ int model = stp_get_model_id(v); \
+ return (stpi_escp2_model_capabilities[model].f); \
+ } \
+}
+
+#define DEF_RAW_ACCESSOR(f, t) \
+static inline t \
+escp2_##f(const stp_vars_t *v) \
+{ \
+ if (stp_check_raw_parameter(v, "escp2_" #f, STP_PARAMETER_ACTIVE)) \
+ return stp_get_raw_parameter(v, "escp2_" #f); \
+ else \
+ { \
+ int model = stp_get_model_id(v); \
+ return (stpi_escp2_model_capabilities[model].f); \
+ } \
+}
+
+#define DEF_COMPOSITE_ACCESSOR(f, t) \
+static inline t \
+escp2_##f(const stp_vars_t *v) \
{ \
- return (stp_escp2_model_capabilities[model].f); \
+ int model = stp_get_model_id(v); \
+ return (stpi_escp2_model_capabilities[model].f); \
}
-#define DEF_INTERLEAVE_ACCESSOR(f, t) \
-static t \
-escp2_##f(int model, const stp_vars_t v) \
-{ \
- const res_t *res = escp2_find_resolution(model, v, stp_get_resolution(v)); \
- if (res && !(res->softweave)) \
- return (stp_escp2_model_capabilities[model].m_##f); \
- else \
- return (stp_escp2_model_capabilities[model].f); \
+#define DEF_ROLL_ACCESSOR(f, t) \
+static inline t \
+escp2_##f(const stp_vars_t *v, int rollfeed) \
+{ \
+ if (stp_check_int_parameter(v, "escp2_" #f, STP_PARAMETER_ACTIVE)) \
+ return stp_get_int_parameter(v, "escp2_" #f); \
+ else \
+ { \
+ int model = stp_get_model_id(v); \
+ const res_t *res = escp2_find_resolution(v); \
+ if (res && !(res->softweave)) \
+ { \
+ if (rollfeed) \
+ return (stpi_escp2_model_capabilities[model].m_roll_##f); \
+ else \
+ return (stpi_escp2_model_capabilities[model].m_##f); \
+ } \
+ else \
+ { \
+ if (rollfeed) \
+ return (stpi_escp2_model_capabilities[model].roll_##f); \
+ else \
+ return (stpi_escp2_model_capabilities[model].f); \
+ } \
+ } \
}
DEF_SIMPLE_ACCESSOR(max_hres, int)
@@ -183,148 +652,371 @@ 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(cd_x_offset, int)
+DEF_SIMPLE_ACCESSOR(cd_y_offset, int)
+DEF_SIMPLE_ACCESSOR(cd_page_width, int)
+DEF_SIMPLE_ACCESSOR(cd_page_height, int)
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(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(extra_720dpi_separation, int)
-DEF_SIMPLE_ACCESSOR(paperlist, const paperlist_t *)
-DEF_SIMPLE_ACCESSOR(reslist, const res_t *)
-DEF_SIMPLE_ACCESSOR(inklist, const inklist_t *)
-DEF_SIMPLE_ACCESSOR(input_slots, const input_slot_list_t *)
-DEF_SIMPLE_ACCESSOR(preinit_sequence, const init_sequence_t *)
-DEF_SIMPLE_ACCESSOR(postinit_remote_sequence, const init_sequence_t *)
-
-DEF_INTERLEAVE_ACCESSOR(left_margin, unsigned)
-DEF_INTERLEAVE_ACCESSOR(right_margin, unsigned)
-DEF_INTERLEAVE_ACCESSOR(top_margin, unsigned)
-DEF_INTERLEAVE_ACCESSOR(bottom_margin, unsigned)
-DEF_INTERLEAVE_ACCESSOR(roll_left_margin, unsigned)
-DEF_INTERLEAVE_ACCESSOR(roll_right_margin, unsigned)
-DEF_INTERLEAVE_ACCESSOR(roll_top_margin, unsigned)
-DEF_INTERLEAVE_ACCESSOR(roll_bottom_margin, unsigned)
+DEF_SIMPLE_ACCESSOR(physical_channels, int)
+DEF_SIMPLE_ACCESSOR(alignment_passes, int)
+DEF_SIMPLE_ACCESSOR(alignment_choices, int)
+DEF_SIMPLE_ACCESSOR(alternate_alignment_passes, int)
+DEF_SIMPLE_ACCESSOR(alternate_alignment_choices, int)
+DEF_COMPOSITE_ACCESSOR(printer_weaves, const printer_weave_list_t *)
+
+DEF_ROLL_ACCESSOR(left_margin, unsigned)
+DEF_ROLL_ACCESSOR(right_margin, unsigned)
+DEF_ROLL_ACCESSOR(top_margin, unsigned)
+DEF_ROLL_ACCESSOR(bottom_margin, unsigned)
+
+DEF_RAW_ACCESSOR(preinit_sequence, const stp_raw_t *)
+DEF_RAW_ACCESSOR(postinit_remote_sequence, const stp_raw_t *)
+
+DEF_COMPOSITE_ACCESSOR(reslist, const res_t *const *)
+DEF_COMPOSITE_ACCESSOR(inkgroup, const inkgroup_t *)
+DEF_COMPOSITE_ACCESSOR(input_slots, const input_slot_list_t *)
+DEF_COMPOSITE_ACCESSOR(quality_list, const quality_list_t *)
+DEF_COMPOSITE_ACCESSOR(channel_names, const channel_name_t *)
+
+static const channel_count_t *
+get_channel_count_by_name(const char *name)
+{
+ int i;
+ for (i = 0; i < escp2_channel_counts_count; i++)
+ if (strcmp(name, escp2_channel_counts[i].name) == 0)
+ return &(escp2_channel_counts[i]);
+ return NULL;
+}
+
+static const channel_count_t *
+get_channel_count_by_number(unsigned count)
+{
+ int i;
+ for (i = 0; i < escp2_channel_counts_count; i++)
+ if (count == escp2_channel_counts[i].count)
+ return &(escp2_channel_counts[i]);
+ return NULL;
+}
static int
-reslist_count(const res_t *rt)
+escp2_ink_type(const stp_vars_t *v, int resid)
{
- int i = 0;
- while (rt->hres)
+ if (stp_check_int_parameter(v, "escp2_ink_type", STP_PARAMETER_ACTIVE))
+ return stp_get_int_parameter(v, "escp2_ink_type");
+ else
{
- i++;
- rt++;
+ int model = stp_get_model_id(v);
+ return stpi_escp2_model_capabilities[model].dot_sizes[resid];
+ }
+}
+
+static double
+escp2_density(const stp_vars_t *v, int resid)
+{
+ if (stp_check_float_parameter(v, "escp2_density", STP_PARAMETER_ACTIVE))
+ return stp_get_float_parameter(v, "escp2_density");
+ else
+ {
+ int model = stp_get_model_id(v);
+ return stpi_escp2_model_capabilities[model].densities[resid];
}
- return i;
}
static int
-escp2_ink_type(int model, int resid, const stp_vars_t v)
+escp2_bits(const stp_vars_t *v, int resid)
{
- int dotid = resid2dotid(resid);
- return stp_escp2_model_capabilities[model].dot_sizes[dotid];
+ if (stp_check_int_parameter(v, "escp2_bits", STP_PARAMETER_ACTIVE))
+ return stp_get_int_parameter(v, "escp2_bits");
+ else
+ {
+ int model = stp_get_model_id(v);
+ return stpi_escp2_model_capabilities[model].bits[resid];
+ }
}
static double
-escp2_density(int model, int resid, const stp_vars_t v)
+escp2_base_res(const stp_vars_t *v, int resid)
{
- int dotid = resid2dotid(resid);
- return stp_escp2_model_capabilities[model].densities[dotid];
+ if (stp_check_float_parameter(v, "escp2_base_res", STP_PARAMETER_ACTIVE))
+ return stp_get_float_parameter(v, "escp2_base_res");
+ else
+ {
+ int model = stp_get_model_id(v);
+ return stpi_escp2_model_capabilities[model].base_resolutions[resid];
+ }
}
-static double
-escp2_bits(int model, int resid, const stp_vars_t v)
+static const escp2_dropsize_t *
+escp2_dropsizes(const stp_vars_t *v, int resid)
{
- int dotid = resid2dotid(resid);
- return stp_escp2_model_capabilities[model].bits[dotid];
+ int model = stp_get_model_id(v);
+ const escp2_drop_list_t *drops = stpi_escp2_model_capabilities[model].drops;
+ return (*drops)[resid];
}
-static double
-escp2_base_res(int model, int resid, const stp_vars_t v)
+static const inklist_t *
+escp2_inklist(const stp_vars_t *v)
{
- int dotid = resid2dotid(resid);
- return stp_escp2_model_capabilities[model].base_resolutions[dotid];
+ int model = stp_get_model_id(v);
+ int i;
+ const char *ink_list_name = NULL;
+ const inkgroup_t *inkgroup = stpi_escp2_model_capabilities[model].inkgroup;
+
+ if (stp_check_string_parameter(v, "InkSet", STP_PARAMETER_ACTIVE))
+ ink_list_name = stp_get_string_parameter(v, "InkSet");
+ if (ink_list_name)
+ {
+ for (i = 0; i < inkgroup->n_inklists; i++)
+ {
+ if (strcmp(ink_list_name, inkgroup->inklists[i]->name) == 0)
+ return inkgroup->inklists[i];
+ }
+ }
+ return inkgroup->inklists[0];
}
-static const escp2_variable_inkset_t *
-escp2_inks(int model, int resid, int inkset, const stp_vars_t v)
+static const shade_t *
+escp2_shades(const stp_vars_t *v, int channel)
{
- const escp2_variable_inklist_t *inks =
- stp_escp2_model_capabilities[model].inks;
- resid /= 2;
- return (*inks)[inkset][resid];
+ const inklist_t *inklist = escp2_inklist(v);
+ return &((*inklist->shades)[channel]);
}
-static const paper_t *
-get_media_type(int model, const char *name, const stp_vars_t v)
+static const paperlist_t *
+escp2_paperlist(const stp_vars_t *v)
+{
+ const inklist_t *inklist = escp2_inklist(v);
+ if (inklist)
+ return inklist->papers;
+ else
+ return NULL;
+}
+
+static int
+using_automatic_settings(const stp_vars_t *v, auto_mode_t mode)
+{
+ int is_raw = 0;
+ if (stp_get_string_parameter(v, "InputImageType") &&
+ strcmp(stp_get_string_parameter(v, "InputImageType"), "Raw") == 0)
+ is_raw = 1;
+ switch (mode)
+ {
+ case AUTO_MODE_QUALITY:
+ if (stp_check_string_parameter(v, "Quality", STP_PARAMETER_ACTIVE) &&
+ strcmp(stp_get_string_parameter(v, "Quality"), "None") != 0 &&
+ !is_raw)
+ return 1;
+ else
+ return 0;
+#if 0
+ case AUTO_MODE_FULL_AUTO:
+ if (stp_check_string_parameter(v, "AutoMode", STP_PARAMETER_ACTIVE) &&
+ strcmp(stp_get_string_parameter(v, "AutoMode"), "None") != 0 &&
+ !is_raw)
+ return 1;
+ else
+ return 0;
+#endif
+ case AUTO_MODE_MANUAL:
+ if (!stp_check_string_parameter(v, "Quality", STP_PARAMETER_ACTIVE) ||
+ strcmp(stp_get_string_parameter(v, "Quality"), "None") == 0 ||
+ is_raw)
+ return 1;
+ else
+ return 0;
+ }
+ return 0;
+}
+
+static int
+compute_internal_resid(int hres, int vres)
{
+ static const int resolutions[RES_N] =
+ {
+ 0,
+ 360 * 360,
+ 720 * 360,
+ 720 * 720,
+ 1440 * 720,
+ 1440 * 1440,
+ 2880 * 1440,
+ 2880 * 2880,
+ };
+ int total_resolution = hres * vres;
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++)
+ for (i = 0; i < RES_N; i++)
{
- if (!strcmp(name, p->papers[i].name))
- return &(p->papers[i]);
+ if (total_resolution < resolutions[i])
+ return i - 1;
}
- return NULL;
+ return RES_N - 1;
}
static int
-escp2_has_advanced_command_set(int model, const stp_vars_t v)
+compute_resid(const res_t *res)
{
- 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));
+ return compute_internal_resid(res->hres, res->vres);
}
static int
-escp2_use_extended_commands(int model, const stp_vars_t v, int use_softweave)
+compute_printed_resid(const res_t *res)
{
- return (escp2_has_cap(model, MODEL_COMMAND, MODEL_COMMAND_PRO, v) ||
- (escp2_has_cap(model, MODEL_VARIABLE_DOT, MODEL_VARIABLE_YES, v) &&
- use_softweave));
+ return compute_internal_resid(res->printed_hres, res->printed_vres);
}
-static char *
-c_strdup(const char *s)
+static const input_slot_t *
+get_input_slot(const stp_vars_t *v)
{
- char *ret = stp_malloc(strlen(s) + 1);
- strcpy(ret, s);
- return ret;
+ int i;
+ const char *input_slot = stp_get_string_parameter(v, "InputSlot");
+ if (input_slot && strlen(input_slot) > 0)
+ {
+ const input_slot_list_t *slots = escp2_input_slots(v);
+ if (slots)
+ {
+ for (i = 0; i < slots->n_input_slots; i++)
+ {
+ if (slots->slots[i].name &&
+ strcmp(input_slot, slots->slots[i].name) == 0)
+ {
+ return &(slots->slots[i]);
+ break;
+ }
+ }
+ }
+ }
+ return NULL;
+}
+
+static const printer_weave_t *
+get_printer_weave(const stp_vars_t *v)
+{
+ int i;
+ const printer_weave_list_t *p = escp2_printer_weaves(v);
+ if (p)
+ {
+ const char *name = stp_get_string_parameter(v, "Weave");
+ int printer_weave_count = p->n_printer_weaves;
+ if (name)
+ {
+ for (i = 0; i < printer_weave_count; i++)
+ {
+ if (!strcmp(name, p->printer_weaves[i].name))
+ return &(p->printer_weaves[i]);
+ }
+ }
+ }
+ return NULL;
+}
+
+static int
+use_printer_weave(const stp_vars_t *v)
+{
+ const res_t *res = escp2_find_resolution(v);
+ if (!res)
+ return 1;
+ else if (!(res->softweave))
+ return 1;
+ else if (res->printer_weave)
+ return 1;
+ else
+ return 0;
+}
+
+
+static const paper_t *
+get_media_type(const stp_vars_t *v)
+{
+ int i;
+ const paperlist_t *p = escp2_paperlist(v);
+ if (p)
+ {
+ const char *name = stp_get_string_parameter(v, "MediaType");
+ int paper_type_count = p->paper_count;
+ if (name)
+ {
+ for (i = 0; i < paper_type_count; i++)
+ {
+ if (!strcmp(name, p->papers[i].name))
+ return &(p->papers[i]);
+ }
+ }
+ }
+ return NULL;
+}
+
+static int
+verify_resolution_by_paper_type(const stp_vars_t *v, const res_t *res)
+{
+ const paper_t *paper = get_media_type(v);
+ if (paper)
+ {
+ switch (paper->paper_class)
+ {
+ case PAPER_PLAIN:
+ if (res->printed_vres > 720 || res->hres > 720)
+ return 0;
+ break;
+ case PAPER_GOOD:
+ if (res->printed_vres < 180 || res->hres < 360 ||
+ res->printed_vres > 720 || res->hres > 1440)
+ return 0;
+ break;
+ case PAPER_PHOTO:
+ if (res->printed_vres < 360 ||
+ (res->hres < 720 && res->hres < escp2_max_hres(v)))
+ return 0;
+ break;
+ case PAPER_PREMIUM_PHOTO:
+ if (res->printed_vres < 720 ||
+ (res->hres < 720 && res->hres < escp2_max_hres(v)))
+ return 0;
+ break;
+ case PAPER_TRANSPARENCY:
+ if (res->printed_vres < 360 || res->hres < 360 ||
+ res->printed_vres > 720 || res->hres > 720)
+ return 0;
+ break;
+ }
+ }
+ return 1;
}
static int
-verify_resolution(const res_t *res, int model, const stp_vars_t v)
+verify_resolution(const stp_vars_t *v, const res_t *res)
{
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) &&
+ (escp2_base_separation(v) / escp2_nozzle_separation(v));
+ int nozzles = escp2_nozzles(v);
+ if (escp2_ink_type(v, compute_printed_resid(res)) != -1 &&
+ res->vres <= escp2_max_vres(v) &&
+ res->hres <= escp2_max_hres(v) &&
+ res->vres >= escp2_min_vres(v) &&
+ res->hres >= escp2_min_hres(v) &&
(nozzles == 1 ||
((res->vres / nozzle_width) * nozzle_width) == res->vres))
{
int xdpi = res->hres;
- int physical_xdpi = escp2_base_res(model, res->resid, v);
+ int physical_xdpi = escp2_base_res(v, compute_resid(res));
int horizontal_passes, oversample;
if (physical_xdpi > xdpi)
physical_xdpi = xdpi;
horizontal_passes = xdpi / physical_xdpi;
- oversample = horizontal_passes * res->vertical_passes
- * res->vertical_oversample;
+ oversample = horizontal_passes * res->vertical_passes;
if (horizontal_passes < 1)
horizontal_passes = 1;
if (oversample < 1)
oversample = 1;
- if (((horizontal_passes * res->vertical_passes) <= 8) &&
+ if (((horizontal_passes * res->vertical_passes) <= STP_MAX_WEAVE) &&
(! res->softweave || (nozzles > 1 && nozzles > oversample)))
return 1;
}
@@ -332,1574 +1024,2075 @@ verify_resolution(const res_t *res, int model, const stp_vars_t v)
}
static int
-verify_papersize(const stp_papersize_t pt, int model, const stp_vars_t v)
+printer_supports_rollfeed(const stp_vars_t *v)
+{
+ int i;
+ const input_slot_list_t *slots = escp2_input_slots(v);
+ for (i = 0; i < slots->n_input_slots; i++)
+ {
+ if (slots->slots[i].is_roll_feed)
+ return 1;
+ }
+ return 0;
+}
+
+static int
+printer_supports_print_to_cd(const stp_vars_t *v)
+{
+ int i;
+ const input_slot_list_t *slots = escp2_input_slots(v);
+ for (i = 0; i < slots->n_input_slots; i++)
+ {
+ if (slots->slots[i].is_cd)
+ return 1;
+ }
+ return 0;
+}
+
+static int
+verify_papersize(const stp_vars_t *v, const stp_papersize_t *pt)
{
unsigned int height_limit, width_limit;
unsigned int min_height_limit, min_width_limit;
- unsigned int pwidth = stp_papersize_get_width(pt);
- unsigned int pheight = stp_papersize_get_height(pt);
- 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);
- 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)))
+ width_limit = escp2_max_paper_width(v);
+ height_limit = escp2_max_paper_height(v);
+ min_width_limit = escp2_min_paper_width(v);
+ min_height_limit = escp2_min_paper_height(v);
+ if (strlen(pt->name) > 0 &&
+ pt->width <= width_limit && pt->height <= height_limit &&
+ (pt->height >= min_height_limit || pt->height == 0) &&
+ (pt->width >= min_width_limit || pt->width == 0) &&
+ (pt->width == 0 || pt->height > 0 || printer_supports_rollfeed(v)))
return 1;
else
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 */
+static int
+verify_inktype(const stp_vars_t *v, const escp2_inkname_t *inks)
{
- int i;
- stp_param_t *valptrs;
- int model = stp_printer_get_model(printer);
- const stp_vars_t v = stp_printer_get_printvars(printer);
+ if (inks->inkset == INKSET_EXTENDED)
+ return 0;
+ else
+ return 1;
+}
- if (count == NULL)
- return (NULL);
+static const char *
+get_default_inktype(const stp_vars_t *v)
+{
+ const inklist_t *ink_list = escp2_inklist(v);
+ const paper_t *paper_type = get_media_type(v);
+ if (!ink_list)
+ return NULL;
+ if (!paper_type)
+ {
+ const paperlist_t *p = escp2_paperlist(v);
+ if (p)
+ paper_type = &(p->papers[0]);
+ }
+ if (paper_type && paper_type->preferred_ink_type)
+ return paper_type->preferred_ink_type;
+ else if (escp2_has_cap(v, MODEL_FAST_360, MODEL_FAST_360_YES) &&
+ stp_check_string_parameter(v, "Resolution", STP_PARAMETER_ACTIVE))
+ {
+ const res_t *res = escp2_find_resolution(v);
+ if (res)
+ {
+ int resid = compute_printed_resid(res);
+ if (res->vres == 360 && res->hres == escp2_base_res(v, resid))
+ {
+ int i;
+ for (i = 0; i < ink_list->n_inks; i++)
+ if (strcmp(ink_list->inknames[i]->name, "CMYK") == 0)
+ return ink_list->inknames[i]->name;
+ }
+ }
+ }
+ return ink_list->inknames[0]->name;
+}
- *count = 0;
- if (name == NULL)
- return (NULL);
+static const escp2_inkname_t *
+get_inktype(const stp_vars_t *v)
+{
+ const char *ink_type = stp_get_string_parameter(v, "InkType");
+ const inklist_t *ink_list = escp2_inklist(v);
+ int i;
- if (strcmp(name, "PageSize") == 0)
- {
- int papersizes = stp_known_papersizes();
- valptrs = stp_malloc(sizeof(stp_param_t) * papersizes);
- *count = 0;
+ if (!ink_type || strcmp(ink_type, "None") == 0 ||
+ (ink_list && ink_list->n_inks == 1) ||
+ !using_automatic_settings(v, AUTO_MODE_MANUAL))
+ ink_type = get_default_inktype(v);
- for (i = 0; i < papersizes; i++)
+ if (ink_type && ink_list)
{
- const stp_papersize_t pt = stp_get_papersize_by_index(i);
- if (verify_papersize(pt, model, v))
+ for (i = 0; i < ink_list->n_inks; i++)
{
- valptrs[*count].name = c_strdup(stp_papersize_get_name(pt));
- valptrs[*count].text = c_strdup(stp_papersize_get_text(pt));
- (*count)++;
+ if (strcmp(ink_type, ink_list->inknames[i]->name) == 0)
+ return ink_list->inknames[i];
}
}
-
- return (valptrs);
- }
- else if (strcmp(name, "Resolution") == 0)
- {
- const res_t *res = escp2_reslist(model, v);
- valptrs = stp_malloc(sizeof(stp_param_t) * reslist_count(res));
- *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)
- {
- const inklist_t *inks = escp2_inklist(model, v);
- int ninktypes = inks->n_inks;
- if (ninktypes == 0)
- {
- *count = 0;
- return NULL;
- }
- valptrs = stp_malloc(sizeof(stp_param_t) * ninktypes);
- for (i = 0; i < ninktypes; i++)
- {
- valptrs[i].name = c_strdup(inks->inknames[i]->name);
- valptrs[i].text = c_strdup(_(inks->inknames[i]->text));
- }
- *count = ninktypes;
- 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);
- if (nmediatypes == 0)
- {
- *count = 0;
- return NULL;
- }
- 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)
- {
- const input_slot_list_t *slots = escp2_input_slots(model, v);
- int ninputslots = slots->n_input_slots;
- if (ninputslots == 0)
- {
- valptrs = NULL;
- *count = 0;
- return NULL;
- }
- valptrs = stp_malloc(sizeof(stp_param_t) * ninputslots);
- for (i = 0; i < ninputslots; i++)
+ /*
+ * If we couldn't find anything, try again with the default ink type.
+ * This may mean duplicate work, but that's cheap enough.
+ */
+ ink_type = get_default_inktype(v);
+ for (i = 0; i < ink_list->n_inks; i++)
{
- valptrs[i].name = c_strdup(slots->slots[i].name);
- valptrs[i].text = c_strdup(_(slots->slots[i].text));
+ if (strcmp(ink_type, ink_list->inknames[i]->name) == 0)
+ return ink_list->inknames[i];
}
- *count = ninputslots;
- return valptrs;
- }
- else
- return (NULL);
+ return NULL;
}
-static const res_t *
-escp2_find_resolution(int model, const stp_vars_t v, const char *resolution)
+static const paper_adjustment_t *
+get_media_adjustment(const stp_vars_t *v)
{
- const res_t *res;
- if (!resolution || !strcmp(resolution, ""))
- return NULL;
- for (res = escp2_reslist(model, v);;res++)
+ const paper_t *pt = get_media_type(v);
+ const inklist_t *ink_list = escp2_inklist(v);
+ if (pt && ink_list && ink_list->paper_adjustments)
{
- if (!strcmp(resolution, res->name))
- return res;
- else if (!strcmp(res->name, ""))
- return NULL;
+ const paper_adjustment_list_t *adjlist = ink_list->paper_adjustments;
+ const char *paper_name = pt->name;
+ int i;
+ for (i = 0; i < adjlist->paper_count; i++)
+ {
+ if (strcmp(paper_name, adjlist->papers[i].name) == 0)
+ return &(adjlist->papers[i]);
+ }
}
+ return NULL;
}
+
/*
- * 'escp2_imageable_area()' - Return the imageable area of the page.
+ * 'escp2_parameters()' - Return the parameter values for the given parameter.
*/
+static stp_parameter_list_t
+escp2_list_parameters(const stp_vars_t *v)
+{
+ stp_parameter_list_t *ret = stp_parameter_list_create();
+ int i;
+ for (i = 0; i < the_parameter_count; i++)
+ stp_parameter_list_add_param(ret, &(the_parameters[i]));
+ for (i = 0; i < float_parameter_count; i++)
+ stp_parameter_list_add_param(ret, &(float_parameters[i].param));
+ return ret;
+}
+
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 */
+fill_transition_parameters(stp_parameter_t *description)
{
- int width, height; /* Size of page */
- int rollfeed = 0; /* Roll feed selected */
- int model = stp_printer_get_model(printer);
- const char *input_slot = stp_get_media_source(v);
+ description->is_active = 1;
+ description->bounds.dbl.lower = 0;
+ description->bounds.dbl.upper = 5.0;
+ description->deflt.dbl = 1.0;
+}
- if (input_slot && strlen(input_slot) > 0)
+static void
+set_density_parameter(const stp_vars_t *v,
+ stp_parameter_t *description,
+ int color)
+{
+ description->is_active = 0;
+ if (stp_get_string_parameter(v, "PrintingMode") &&
+ strcmp(stp_get_string_parameter(v, "PrintingMode"), "BW") != 0 &&
+ using_automatic_settings(v, AUTO_MODE_MANUAL))
{
- int i;
- const input_slot_list_t *slots = escp2_input_slots(model, v);
- for (i = 0; i < slots->n_input_slots; i++)
+ const escp2_inkname_t *ink_name = get_inktype(v);
+ if (ink_name &&
+ ink_name->channel_set->channel_count > color &&
+ ink_name->channel_set->channels[color])
+ description->is_active = 1;
+ }
+}
+
+static void
+set_hue_map_parameter(const stp_vars_t *v,
+ stp_parameter_t *description,
+ int color)
+{
+ description->is_active = 0;
+ description->deflt.curve = hue_curve_bounds;
+ description->bounds.curve = stp_curve_create_copy(hue_curve_bounds);
+ if (stp_get_string_parameter(v, "PrintingMode") &&
+ strcmp(stp_get_string_parameter(v, "PrintingMode"), "BW") != 0 &&
+ using_automatic_settings(v, AUTO_MODE_MANUAL))
+ {
+ const escp2_inkname_t *ink_name = get_inktype(v);
+ if (ink_name &&
+ ink_name->channel_set->channel_count > color &&
+ ink_name->channel_set->channels[color] &&
+ ink_name->channel_set->channels[color]->hue_curve &&
+ ink_name->channel_set->channels[color]->hue_curve->curve)
{
- if (slots->slots[i].name &&
- strcmp(input_slot, slots->slots[i].name) == 0)
- {
- rollfeed = slots->slots[i].is_roll_feed;
- break;
- }
+ if (!ink_name->channel_set->channels[color]->hue_curve->curve_impl)
+ ink_name->channel_set->channels[color]->hue_curve->curve_impl =
+ stp_curve_create_from_string
+ (ink_name->channel_set->channels[color]->hue_curve->curve);
+ description->deflt.curve =
+ ink_name->channel_set->channels[color]->hue_curve->curve_impl;
+ description->is_active = 1;
}
}
+}
- stp_default_media_size(printer, v, &width, &height);
+static void
+set_gray_transition_parameter(const stp_vars_t *v,
+ stp_parameter_t *description,
+ int expected_channels)
+{
+ const escp2_inkname_t *ink_name = get_inktype(v);
+ description->is_active = 0;
+ if (ink_name && ink_name->channel_set->channels[STP_ECOLOR_K] &&
+ (ink_name->channel_set->channels[STP_ECOLOR_K]->n_subchannels ==
+ expected_channels) &&
+ using_automatic_settings(v, AUTO_MODE_MANUAL))
+ fill_transition_parameters(description);
+}
- if (rollfeed)
+static void
+set_color_transition_parameter(const stp_vars_t *v,
+ stp_parameter_t *description,
+ int color)
+{
+ description->is_active = 0;
+ if (stp_get_string_parameter(v, "PrintingMode") &&
+ strcmp(stp_get_string_parameter(v, "PrintingMode"), "BW") != 0 &&
+ using_automatic_settings(v, AUTO_MODE_MANUAL))
{
- *left = escp2_roll_left_margin(model, v);
- *right = width - escp2_roll_right_margin(model, v);
- *top = height - escp2_roll_top_margin(model, v);
- *bottom = escp2_roll_bottom_margin(model, v);
+ const escp2_inkname_t *ink_name = get_inktype(v);
+ if (ink_name &&
+ ink_name->channel_set->channel_count == 4 &&
+ ink_name->channel_set->channels[color] &&
+ ink_name->channel_set->channels[color]->n_subchannels == 2)
+ fill_transition_parameters(description);
}
- else
+}
+
+static const res_t *
+find_default_resolution(const stp_vars_t *v, int desired_hres, int desired_vres,
+ int strict)
+{
+ const res_t *const *res = escp2_reslist(v);
+ int i = 0;
+ if (desired_hres < 0)
{
- *left = escp2_left_margin(model, v);
- *right = width - escp2_right_margin(model, v);
- *top = height - escp2_top_margin(model, v);
- *bottom = escp2_bottom_margin(model, v);
+ while (res[i])
+ i++;
+ i--;
+ while (i >= 0)
+ {
+ if (verify_resolution(v, res[i]) &&
+ verify_resolution_by_paper_type(v, res[i]))
+ return res[i];
+ i--;
+ }
+ }
+ i = 0;
+ while (res[i])
+ {
+ if (verify_resolution(v, res[i]) &&
+ verify_resolution_by_paper_type(v, res[i]) &&
+ res[i]->vres >= desired_vres && res[i]->hres >= desired_hres &&
+ res[i]->vres <= 2 * desired_vres && res[i]->hres <= 2 * desired_hres)
+ return res[i];
+ i++;
}
+#if 0
+ if (!strict) /* Try again to find a match */
+ {
+ i = 0;
+ while (res[i])
+ {
+ if (verify_resolution(v, res[i]) &&
+ res[i]->vres >= desired_vres &&
+ res[i]->hres >= desired_hres &&
+ res[i]->vres <= 2 * desired_vres &&
+ res[i]->hres <= 2 * desired_hres)
+ return res[i];
+ i++;
+ }
+ }
+#endif
+ return NULL;
}
-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)
+static const res_t *
+find_resolution_from_quality(const stp_vars_t *v, const char *quality,
+ int strict)
{
- 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);
+ int i;
+ const quality_list_t *quals = escp2_quality_list(v);
+ for (i = 0; i < quals->n_quals; i++)
+ {
+ const quality_t *q = &(quals->qualities[i]);
+ if (strcmp(quality, q->name) == 0 &&
+ (q->min_vres == 0 || escp2_min_vres(v) <= q->min_vres) &&
+ (q->min_hres == 0 || escp2_min_hres(v) <= q->min_hres) &&
+ (q->max_vres == 0 || escp2_max_vres(v) >= q->max_vres) &&
+ (q->max_hres == 0 || escp2_max_hres(v) >= q->max_hres))
+ {
+ return find_default_resolution(v, q->desired_hres, q->desired_vres,
+ strict);
+ }
+ }
+ return NULL;
}
-static const char *
-escp2_default_parameters(const stp_printer_t printer,
- const char *ppd_file,
- const char *name)
+static void
+escp2_parameters(const stp_vars_t *v, const char *name,
+ stp_parameter_t *description)
{
- int i;
- int model = stp_printer_get_model(printer);
- const stp_vars_t v = stp_printer_get_printvars(printer);
+ int i;
+ description->p_type = STP_PARAMETER_TYPE_INVALID;
if (name == NULL)
- return NULL;
- if (strcmp(name, "PageSize") == 0)
+ return;
+
+ for (i = 0; i < float_parameter_count; i++)
+ if (strcmp(name, float_parameters[i].param.name) == 0)
+ {
+ stp_fill_parameter_settings(description,
+ &(float_parameters[i].param));
+ description->deflt.dbl = float_parameters[i].defval;
+ description->bounds.dbl.upper = float_parameters[i].max;
+ description->bounds.dbl.lower = float_parameters[i].min;
+ break;
+ }
+
+ for (i = 0; i < the_parameter_count; i++)
+ if (strcmp(name, the_parameters[i].name) == 0)
+ {
+ stp_fill_parameter_settings(description, &(the_parameters[i]));
+ break;
+ }
+
+ description->deflt.str = NULL;
+ if (strcmp(name, "AutoMode") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ stp_string_list_add_string(description->bounds.str, "None",
+ _("Full Manual Control"));
+ stp_string_list_add_string(description->bounds.str, "Auto",
+ _("Automatic Setting Control"));
+ description->deflt.str = "None"; /* so CUPS and Foomatic don't break */
+ }
+ else if (strcmp(name, "PageSize") == 0)
{
int papersizes = stp_known_papersizes();
- for (i = 0; i < papersizes; i++)
+ const input_slot_t *slot = get_input_slot(v);
+ description->bounds.str = stp_string_list_create();
+ if (slot && slot->is_cd)
+ {
+ stp_string_list_add_string
+ (description->bounds.str, "CD5Inch", _("CD - 5 inch"));
+ stp_string_list_add_string
+ (description->bounds.str, "CD3Inch", _("CD - 3 inch"));
+ }
+ else
+ {
+ for (i = 0; i < papersizes; i++)
+ {
+ const stp_papersize_t *pt = stp_get_papersize_by_index(i);
+ if (verify_papersize(v, pt))
+ stp_string_list_add_string(description->bounds.str,
+ pt->name, pt->text);
+ }
+ }
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
+ else if (strcmp(name, "CDInnerRadius") == 0)
+ {
+ const input_slot_t *slot = get_input_slot(v);
+ description->bounds.str = stp_string_list_create();
+ if (printer_supports_print_to_cd(v) && (!slot || (slot && slot->is_cd)))
+ {
+ stp_string_list_add_string
+ (description->bounds.str, "None", _("Normal"));
+ stp_string_list_add_string
+ (description->bounds.str, "Small", _("Print To Hub"));
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
+ else
+ description->is_active = 0;
+ }
+ else if (strcmp(name, "CDXAdjustment") == 0 ||
+ strcmp(name, "CDYAdjustment") == 0)
+ {
+ const input_slot_t *slot = get_input_slot(v);
+ if (printer_supports_print_to_cd(v) && (!slot || (slot && slot->is_cd)))
{
- const stp_papersize_t pt = stp_get_papersize_by_index(i);
- if (verify_papersize(pt, model, v))
- return (stp_papersize_get_name(pt));
+ description->bounds.dimension.lower = -15;
+ description->bounds.dimension.upper = 15;
+ description->deflt.dimension = 0;
}
- return NULL;
+ else
+ description->is_active = 0;
+ }
+ else if (strcmp(name, "Quality") == 0)
+ {
+ const quality_list_t *quals = escp2_quality_list(v);
+ int has_standard_quality = 0;
+ description->bounds.str = stp_string_list_create();
+ stp_string_list_add_string(description->bounds.str, "None",
+ _("Manual Control"));
+ for (i = 0; i < quals->n_quals; i++)
+ {
+ const quality_t *q = &(quals->qualities[i]);
+ if (((q->min_vres == 0 || escp2_min_vres(v) <= q->min_vres) &&
+ (q->min_hres == 0 || escp2_min_hres(v) <= q->min_hres) &&
+ (q->max_vres == 0 || escp2_max_vres(v) >= q->max_vres) &&
+ (q->max_hres == 0 || escp2_max_hres(v) >= q->max_hres)) &&
+ (find_resolution_from_quality(v, q->name, 1) ||
+ (!stp_check_string_parameter(v, "MediaType",
+ STP_PARAMETER_ACTIVE))))
+ stp_string_list_add_string(description->bounds.str, q->name,
+ _(q->text));
+ if (strcmp(q->name, "Standard") == 0)
+ has_standard_quality = 1;
+ }
+ if (has_standard_quality)
+ description->deflt.str = "Standard";
+ else
+ description->deflt.str = "None";
}
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(model, v);
- while (res->hres)
+ const res_t *const *res = escp2_reslist(v);
+ const res_t *defval = find_default_resolution(v, 720, 360, 0);
+ description->bounds.str = stp_string_list_create();
+ i = 0;
+ while (res[i])
{
- if (res->vres >= 360 && res->hres >= 360 &&
- verify_resolution(res, model, v))
- return (res->name);
- res++;
+ if (verify_resolution(v, res[i]) &&
+ (using_automatic_settings(v, AUTO_MODE_MANUAL) ||
+ !stp_check_string_parameter(v, "MediaType",
+ STP_PARAMETER_ACTIVE) ||
+ verify_resolution_by_paper_type(v, res[i])))
+ stp_string_list_add_string(description->bounds.str,
+ res[i]->name, _(res[i]->text));
+ i++;
}
- return NULL;
+ if (defval)
+ description->deflt.str = defval->name;
+ else
+ description->deflt.str = res[0]->name;
+ if (!using_automatic_settings(v, AUTO_MODE_MANUAL))
+ description->is_active = 0;
}
else if (strcmp(name, "InkType") == 0)
{
- const inklist_t *inks = escp2_inklist(model, v);
- return inks->inknames[0]->name;
+ const inklist_t *inks = escp2_inklist(v);
+ int ninktypes = inks->n_inks;
+ description->bounds.str = stp_string_list_create();
+ if (ninktypes > 1)
+ {
+ stp_string_list_add_string(description->bounds.str, "None",
+ _("Standard"));
+ for (i = 0; i < ninktypes; i++)
+ if (verify_inktype(v, inks->inknames[i]))
+ stp_string_list_add_string(description->bounds.str,
+ inks->inknames[i]->name,
+ _(inks->inknames[i]->text));
+ description->deflt.str = "None";
+ }
+ if (ninktypes <= 1 || !using_automatic_settings(v, AUTO_MODE_MANUAL))
+ description->is_active = 0;
+ }
+ else if (strcmp(name, "InkSet") == 0)
+ {
+ const inkgroup_t *inks = escp2_inkgroup(v);
+ int ninklists = inks->n_inklists;
+ description->bounds.str = stp_string_list_create();
+ if (ninklists > 1)
+ {
+ int has_default_choice = 0;
+ for (i = 0; i < ninklists; i++)
+ {
+ stp_string_list_add_string(description->bounds.str,
+ inks->inklists[i]->name,
+ _(inks->inklists[i]->text));
+ if (strcmp(inks->inklists[i]->name, "None") == 0)
+ has_default_choice = 1;
+ }
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ if (!using_automatic_settings(v, AUTO_MODE_MANUAL) &&
+ has_default_choice)
+ description->is_active = 0;
+ }
+ else
+ description->is_active = 0;
}
else if (strcmp(name, "MediaType") == 0)
{
- const paperlist_t *p = escp2_paperlist(model, v);
- return (p->papers[0].name);
+ const paperlist_t *p = escp2_paperlist(v);
+ int nmediatypes = p->paper_count;
+ description->bounds.str = stp_string_list_create();
+ if (nmediatypes)
+ {
+ for (i = 0; i < nmediatypes; i++)
+ stp_string_list_add_string(description->bounds.str,
+ p->papers[i].name,
+ _(p->papers[i].text));
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
+ else
+ description->is_active = 0;
}
else if (strcmp(name, "InputSlot") == 0)
{
- const input_slot_list_t *slots = escp2_input_slots(model, v);
- if (slots->n_input_slots)
- return slots->slots[0].name;
- return NULL;
+ const input_slot_list_t *slots = escp2_input_slots(v);
+ int ninputslots = slots->n_input_slots;
+ description->bounds.str = stp_string_list_create();
+ if (ninputslots)
+ {
+ for (i = 0; i < ninputslots; i++)
+ stp_string_list_add_string(description->bounds.str,
+ slots->slots[i].name,
+ _(slots->slots[i].text));
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
+ else
+ description->is_active = 0;
+ }
+ else if (strcmp(name, "PrintingDirection") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ stp_string_list_add_string
+ (description->bounds.str, "None", _("Automatic"));
+ stp_string_list_add_string
+ (description->bounds.str, "Bidirectional", _("Bidirectional"));
+ stp_string_list_add_string
+ (description->bounds.str, "Unidirectional", _("Unidirectional"));
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ if (!using_automatic_settings(v, AUTO_MODE_MANUAL))
+ description->is_active = 0;
+ }
+ else if (strcmp(name, "Weave") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ if (escp2_has_cap(v, MODEL_COMMAND, MODEL_COMMAND_PRO))
+ {
+ const res_t *res = escp2_find_resolution(v);
+ const printer_weave_list_t *printer_weaves = escp2_printer_weaves(v);
+ int nprinter_weaves = 0;
+ if (use_printer_weave(v) && (!res || res->printer_weave))
+ nprinter_weaves = printer_weaves->n_printer_weaves;
+ if (nprinter_weaves)
+ {
+ stp_string_list_add_string(description->bounds.str, "None",
+ _("Standard"));
+ for (i = 0; i < nprinter_weaves; i++)
+ stp_string_list_add_string(description->bounds.str,
+ printer_weaves->printer_weaves[i].name,
+ _(printer_weaves->printer_weaves[i].text));
+ }
+ else
+ description->is_active = 0;
+ }
+ else
+ {
+ stp_string_list_add_string
+ (description->bounds.str, "None", _("Standard"));
+ stp_string_list_add_string
+ (description->bounds.str, "Alternate", _("Alternate Fill"));
+ stp_string_list_add_string
+ (description->bounds.str, "Ascending", _("Ascending Fill"));
+ stp_string_list_add_string
+ (description->bounds.str, "Descending", _("Descending Fill"));
+ stp_string_list_add_string
+ (description->bounds.str, "Ascending2X", _("Ascending Double"));
+ stp_string_list_add_string
+ (description->bounds.str, "Staggered", _("Nearest Neighbor Avoidance"));
+ }
+ if (description->is_active)
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ if (!using_automatic_settings(v, AUTO_MODE_MANUAL))
+ description->is_active = 0;
+ }
+ else if (strcmp(name, "OutputOrder") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ description->deflt.str = "Reverse";
+ }
+ else if (strcmp(name, "FullBleed") == 0)
+ {
+ const input_slot_t *slot = get_input_slot(v);
+ if (slot && slot->is_cd)
+ description->is_active = 0;
+ else if (escp2_has_cap(v, MODEL_XZEROMARGIN, MODEL_XZEROMARGIN_YES))
+ description->deflt.boolean = 0;
+ else
+ description->is_active = 0;
+ }
+ else if (strcmp(name, "AdjustDotsize") == 0)
+ {
+ description->deflt.boolean = 0;
+ if (!using_automatic_settings(v, AUTO_MODE_MANUAL))
+ description->is_active = 0;
+ }
+ else if (strcmp(name, "CyanDensity") == 0)
+ set_density_parameter(v, description, STP_ECOLOR_C);
+ else if (strcmp(name, "MagentaDensity") == 0)
+ set_density_parameter(v, description, STP_ECOLOR_M);
+ else if (strcmp(name, "YellowDensity") == 0)
+ set_density_parameter(v, description, STP_ECOLOR_Y);
+ else if (strcmp(name, "BlackDensity") == 0)
+ set_density_parameter(v, description, STP_ECOLOR_K);
+ else if (strcmp(name, "RedDensity") == 0)
+ set_density_parameter(v, description, XCOLOR_R);
+ else if (strcmp(name, "BlueDensity") == 0)
+ set_density_parameter(v, description, XCOLOR_B);
+ else if (strcmp(name, "CyanHueCurve") == 0)
+ set_hue_map_parameter(v, description, STP_ECOLOR_C);
+ else if (strcmp(name, "MagentaHueCurve") == 0)
+ set_hue_map_parameter(v, description, STP_ECOLOR_M);
+ else if (strcmp(name, "YellowHueCurve") == 0)
+ set_hue_map_parameter(v, description, STP_ECOLOR_Y);
+ else if (strcmp(name, "RedHueCurve") == 0)
+ set_hue_map_parameter(v, description, XCOLOR_R);
+ else if (strcmp(name, "BlueHueCurve") == 0)
+ set_hue_map_parameter(v, description, XCOLOR_B);
+ else if (strcmp(name, "UseGloss") == 0)
+ {
+ const escp2_inkname_t *ink_name = get_inktype(v);
+ if (ink_name && ink_name->channel_set->aux_channel_count > 0)
+ description->is_active = 1;
+ else
+ description->is_active = 0;
+ }
+ else if (strcmp(name, "GlossLimit") == 0)
+ {
+ const escp2_inkname_t *ink_name = get_inktype(v);
+ if (ink_name && ink_name->channel_set->aux_channel_count > 0)
+ description->is_active = 1;
+ else
+ description->is_active = 0;
+ }
+ else if (strcmp(name, "GrayTransition") == 0)
+ set_gray_transition_parameter(v, description, 2);
+ else if (strcmp(name, "Gray1Transition") == 0 ||
+ strcmp(name, "Gray2Transition") == 0 ||
+ strcmp(name, "Gray3Transition") == 0)
+ set_gray_transition_parameter(v, description, 4);
+ else if (strcmp(name, "LightCyanTransition") == 0)
+ set_color_transition_parameter(v, description, STP_ECOLOR_C);
+ else if (strcmp(name, "LightMagentaTransition") == 0)
+ set_color_transition_parameter(v, description, STP_ECOLOR_M);
+ else if (strcmp(name, "DarkYellowTransition") == 0)
+ set_color_transition_parameter(v, description, STP_ECOLOR_Y);
+ else if (strcmp(name, "AlignmentPasses") == 0)
+ {
+ description->deflt.integer = escp2_alignment_passes(v);
+ }
+ else if (strcmp(name, "AlignmentChoices") == 0)
+ {
+ description->deflt.integer = escp2_alignment_choices(v);
+ }
+ else if (strcmp(name, "SupportsInkChange") == 0)
+ {
+ description->deflt.integer =
+ escp2_has_cap(v, MODEL_SUPPORTS_INK_CHANGE,
+ MODEL_SUPPORTS_INK_CHANGE_YES);
+ }
+ else if (strcmp(name, "AlternateAlignmentPasses") == 0)
+ {
+ description->deflt.integer = escp2_alternate_alignment_passes(v);
+ }
+ else if (strcmp(name, "AlternateAlignmentChoices") == 0)
+ {
+ description->deflt.integer = escp2_alternate_alignment_choices(v);
+ }
+ else if (strcmp(name, "InkChannels") == 0)
+ {
+ description->deflt.integer = escp2_physical_channels(v);
+ }
+ else if (strcmp(name, "ChannelNames") == 0)
+ {
+ const channel_name_t *channel_names = escp2_channel_names(v);
+ description->bounds.str = stp_string_list_create();
+ for (i = 0; i < channel_names->count; i++)
+ stp_string_list_add_string
+ (description->bounds.str,
+ channel_names->names[i], channel_names->names[i]);
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
+ else if (strcmp(name, "SupportsPacketMode") == 0)
+ {
+ description->deflt.integer =
+ escp2_has_cap(v, MODEL_PACKET_MODE, MODEL_PACKET_MODE_YES);
+ }
+ else if (strcmp(name, "PrintingMode") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ stp_string_list_add_string
+ (description->bounds.str, "Color", _("Color"));
+ stp_string_list_add_string
+ (description->bounds.str, "BW", _("Black and White"));
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
+ else if (strcmp(name, "RawChannels") == 0)
+ {
+ const inklist_t *inks = escp2_inklist(v);
+ int ninktypes = inks->n_inks;
+ description->bounds.str = stp_string_list_create();
+ if (ninktypes > 1)
+ {
+ stp_string_list_add_string(description->bounds.str, "None", "None");
+ for (i = 0; i < ninktypes; i++)
+ if (inks->inknames[i]->inkset == INKSET_EXTENDED)
+ {
+ const channel_count_t *ch =
+ (get_channel_count_by_number
+ (inks->inknames[i]->channel_set->channel_count));
+ stp_string_list_add_string(description->bounds.str,
+ ch->name, ch->name);
+ }
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
+ if (ninktypes <= 1)
+ description->is_active = 0;
+ }
+ else if (strcmp(name, "MultiChannelLimit") == 0)
+ {
+ if (stp_get_string_parameter(v, "PrintingMode") &&
+ strcmp(stp_get_string_parameter(v, "PrintingMode"), "BW") != 0 &&
+ using_automatic_settings(v, AUTO_MODE_MANUAL))
+ {
+ const escp2_inkname_t *ink_name = get_inktype(v);
+ if (ink_name && ink_name->inkset == INKSET_CMYKRB)
+ description->is_active = 1;
+ }
+ else
+ description->is_active = 0;
}
- else
- return (NULL);
}
-static void
-escp2_describe_resolution(const stp_printer_t printer,
- const char *resolution, int *x, int *y)
+static const res_t *
+escp2_find_resolution(const stp_vars_t *v)
{
- int model = stp_printer_get_model(printer);
- stp_vars_t v = stp_printer_get_printvars(printer);
- const res_t *res = escp2_reslist(model, v);
- while (res->hres)
+ const char *resolution;
+ if (stp_check_string_parameter(v, "Quality", STP_PARAMETER_ACTIVE))
{
- if (!strcmp(resolution, res->name) &&
- verify_resolution(res, model, v))
+ const res_t *default_res =
+ find_resolution_from_quality(v, stp_get_string_parameter(v, "Quality"),
+ 0);
+ if (default_res)
{
- *x = res->external_hres;
- *y = res->external_vres;
- return;
+ stp_dprintf(STP_DBG_ESCP2, v,
+ "Setting resolution to %s from quality %s\n",
+ default_res->name,
+ stp_get_string_parameter(v, "Quality"));
+ return default_res;
}
- res++;
+ else
+ stp_dprintf(STP_DBG_ESCP2, v, "Unable to map quality %s\n",
+ stp_get_string_parameter(v, "Quality"));
}
- *x = -1;
- *y = -1;
+ resolution = stp_get_string_parameter(v, "Resolution");
+ if (resolution)
+ {
+ const res_t *const *res = escp2_reslist(v);
+ int i = 0;
+ while (res[i])
+ {
+ if (!strcmp(resolution, res[i]->name))
+ return res[i];
+ else if (!strcmp(res[i]->name, ""))
+ return NULL;
+ i++;
+ }
+ }
+ return NULL;
+}
+
+static inline int
+imax(int a, int b)
+{
+ if (a > b)
+ return a;
+ else
+ return b;
}
static void
-escp2_reset_printer(const escp2_init_t *init)
+internal_imageable_area(const stp_vars_t *v, int use_paper_margins,
+ int *left, int *right, int *bottom, int *top)
{
- /*
- * Magic initialization string that's needed to take printer out of
- * packet mode.
- */
- const init_sequence_t *inits = escp2_preinit_sequence(init->model, init->v);
- if (inits)
- stp_zfwrite(inits->data, inits->length, 1, init->v);
+ int width, height; /* Size of page */
+ int rollfeed = 0; /* Roll feed selected */
+ int cd = 0; /* CD selected */
+ const char *media_size = stp_get_string_parameter(v, "PageSize");
+ int left_margin = 0;
+ int right_margin = 0;
+ int bottom_margin = 0;
+ int top_margin = 0;
+ const stp_papersize_t *pt = NULL;
+ const input_slot_t *input_slot = NULL;
+
+ if (media_size && use_paper_margins)
+ pt = stp_get_papersize_by_name(media_size);
+
+ input_slot = get_input_slot(v);
+ if (input_slot)
+ {
+ cd = input_slot->is_cd;
+ rollfeed = input_slot->is_roll_feed;
+ }
- stp_puts("\033@", init->v); /* ESC/P2 reset */
+ stp_default_media_size(v, &width, &height);
+ if (cd)
+ {
+ left_margin = 0;
+ right_margin = 0;
+ bottom_margin = 0;
+ top_margin = 0;
+ }
+ else
+ {
+ if (pt)
+ {
+ left_margin = pt->left;
+ right_margin = pt->right;
+ bottom_margin = pt->bottom;
+ top_margin = pt->top;
+ }
+
+ left_margin = imax(left_margin, escp2_left_margin(v, rollfeed));
+ right_margin = imax(right_margin, escp2_right_margin(v, rollfeed));
+ bottom_margin = imax(bottom_margin, escp2_bottom_margin(v, rollfeed));
+ top_margin = imax(top_margin, escp2_top_margin(v, rollfeed));
+ }
+ *left = left_margin;
+ *right = width - right_margin;
+ *top = top_margin;
+ *bottom = height - bottom_margin;
+ if (!cd &&
+ escp2_has_cap(v, MODEL_XZEROMARGIN, MODEL_XZEROMARGIN_YES) &&
+ stp_get_boolean_parameter(v, "FullBleed"))
+ {
+ *left -= 80 / (360 / 72); /* 80 per the Epson manual */
+ *right += 80 / (360 / 72); /* 80 per the Epson manual */
+ *bottom += escp2_nozzles(v) * escp2_nozzle_separation(v) * 72 /
+ escp2_base_separation(v);
+ }
}
+/*
+ * 'escp2_imageable_area()' - Return the imageable area of the page.
+ */
+
static void
-print_remote_param(const stp_vars_t v, const char *param, const char *value)
+escp2_imageable_area(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 */
{
- unsigned bytes = 2 + strlen(param) + strlen(value);
- stp_zprintf(v, "\033(R%c%c%c%s:%s", (bytes & 0xff), ((bytes >> 8) & 0xff), 0,
- param, value);
- stp_zprintf(v, "\033%c%c%c", 0, 0, 0);
+ internal_imageable_area(v, 1, left, right, bottom, top);
}
static void
-print_remote_int_param(const stp_vars_t v, const char *param, int value)
+escp2_limit(const stp_vars_t *v, /* I */
+ int *width, int *height,
+ int *min_width, int *min_height)
{
- char buf[64];
- (void) snprintf(buf, 64, "%d", value);
- print_remote_param(v, param, buf);
+ *width = escp2_max_paper_width(v);
+ *height = escp2_max_paper_height(v);
+ *min_width = escp2_min_paper_width(v);
+ *min_height = escp2_min_paper_height(v);
}
static void
-print_remote_float_param(const stp_vars_t v, const char *param, double value)
+escp2_describe_resolution(const stp_vars_t *v, int *x, int *y)
{
- char buf[64];
- (void) snprintf(buf, 64, "%f", value);
- print_remote_param(v, param, buf);
+ const res_t *res = escp2_find_resolution(v);
+ if (res && verify_resolution(v, res))
+ {
+ *x = res->printed_hres;
+ *y = res->printed_vres;
+ return;
+ }
+ *x = -1;
+ *y = -1;
}
-static void
-escp2_set_remote_sequence(const escp2_init_t *init)
-{
- /* Magic remote mode commands, whatever they do */
-
- if (stp_debug_level & STP_DBG_MARK_FILE)
- {
- print_remote_param(init->v, "Package", PACKAGE);
- print_remote_param(init->v, "Version", VERSION);
- print_remote_param(init->v, "Release Date", RELEASE_DATE);
- print_remote_param(init->v, "Driver", stp_get_driver(init->v));
- print_remote_param(init->v, "Resolution", stp_get_resolution(init->v));
- print_remote_param(init->v, "Media Size", stp_get_media_size(init->v));
- print_remote_param(init->v, "Media Type", stp_get_media_type(init->v));
- print_remote_param(init->v, "Media Source", stp_get_media_source(init->v));
- print_remote_param(init->v, "Ink Type", stp_get_ink_type(init->v));
- print_remote_param(init->v, "Dither", stp_get_dither_algorithm(init->v));
- print_remote_int_param(init->v, "Output Type", stp_get_output_type(init->v));
- print_remote_int_param(init->v, "Orientation", stp_get_orientation(init->v));
- print_remote_int_param(init->v, "Left", stp_get_left(init->v));
- print_remote_int_param(init->v, "Top", stp_get_top(init->v));
- print_remote_int_param(init->v, "Image Type", stp_get_image_type(init->v));
- print_remote_int_param(init->v, "Page Width", stp_get_page_width(init->v));
- print_remote_int_param(init->v, "Page Height", stp_get_page_height(init->v));
- print_remote_int_param(init->v, "Input Model", stp_get_input_color_model(init->v));
- print_remote_int_param(init->v, "Output Model", stp_get_output_color_model(init->v));
- print_remote_float_param(init->v, "Brightness", stp_get_brightness(init->v));
- print_remote_float_param(init->v, "Scaling", stp_get_scaling(init->v));
- print_remote_float_param(init->v, "Gamma", stp_get_gamma(init->v));
- print_remote_float_param(init->v, "App Gamma", stp_get_app_gamma(init->v));
- print_remote_float_param(init->v, "Contrast", stp_get_contrast(init->v));
- print_remote_float_param(init->v, "Cyan", stp_get_cyan(init->v));
- print_remote_float_param(init->v, "Magenta", stp_get_magenta(init->v));
- print_remote_float_param(init->v, "Yellow", stp_get_yellow(init->v));
- print_remote_float_param(init->v, "Saturation", stp_get_saturation(init->v));
- print_remote_float_param(init->v, "Density", stp_get_density(init->v));
- print_remote_int_param(init->v, "Model", init->model);
- print_remote_int_param(init->v, "Output_type", init->output_type);
- print_remote_int_param(init->v, "Ydpi", init->ydpi);
- print_remote_int_param(init->v, "Xdpi", init->xdpi);
- print_remote_int_param(init->v, "Physical_xdpi", init->physical_xdpi);
- print_remote_int_param(init->v, "Use_softweave", init->use_softweave);
- print_remote_int_param(init->v, "Use_interleave", init->use_interleave);
- print_remote_int_param(init->v, "Page_true_height", init->page_true_height);
- print_remote_int_param(init->v, "Page_width", init->page_width);
- print_remote_int_param(init->v, "Page_top", init->page_top);
- print_remote_int_param(init->v, "Page_bottom", init->page_bottom);
- print_remote_int_param(init->v, "Nozzles", init->nozzles);
- print_remote_int_param(init->v, "Nozzle_separation", init->nozzle_separation);
- print_remote_int_param(init->v, "Horizontal_passes", init->horizontal_passes);
- print_remote_int_param(init->v, "Vertical_passes", init->vertical_passes);
- print_remote_int_param(init->v, "Vertical_oversample", init->vertical_oversample);
- print_remote_int_param(init->v, "Bits", init->bits);
- print_remote_int_param(init->v, "Unidirectional", init->unidirectional);
- print_remote_int_param(init->v, "Resid", init->resid);
- print_remote_int_param(init->v, "Initial_vertical_offset", init->initial_vertical_offset);
- print_remote_int_param(init->v, "Total_channels", init->total_channels);
- print_remote_int_param(init->v, "Use_black_parameters", init->use_black_parameters);
- print_remote_int_param(init->v, "Use_fast_360", init->use_fast_360);
- print_remote_param(init->v, "Ink name", init->inkname->name);
- print_remote_int_param(init->v, " is_color", init->inkname->is_color);
- print_remote_int_param(init->v, " inkset", init->inkname->inkset);
- stp_puts("\033@", init->v);
- }
- if (escp2_has_advanced_command_set(init->model, init->v) || init->input_slot)
- {
- 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))
- {
- 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 (escp2_has_advanced_command_set(init->model, init->v))
- {
- 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%c%c", 3, 0, 0, 0260, 0xff);
- }
- if (init->input_slot)
+static const char *
+escp2_describe_output(const stp_vars_t *v)
+{
+ const char *printing_mode = stp_get_string_parameter(v, "PrintingMode");
+ const char *input_image_type = stp_get_string_parameter(v, "InputImageType");
+ if (input_image_type && strcmp(input_image_type, "Raw") == 0)
+ return "Raw";
+ else if (printing_mode && strcmp(printing_mode, "BW") == 0)
+ return "Grayscale";
+ else
+ {
+ const escp2_inkname_t *ink_type = get_inktype(v);
+ if (ink_type)
{
- int divisor = escp2_base_separation(init->model, init->v) / 360;
- int height = init->page_true_height * 5 / divisor;
- if (init->input_slot->init_sequence.length)
- stp_zfwrite(init->input_slot->init_sequence.data,
- init->input_slot->init_sequence.length, 1, init->v);
- switch (init->input_slot->roll_feed_cut_flags)
+ switch (ink_type->inkset)
{
- case ROLL_FEED_CUT_ALL:
- stp_zprintf(init->v, "JS%c%c%c%c", 2, 0, 0, 0);
- stp_zprintf(init->v, "CO%c%c%c%c%c%c%c%c%c%c",
- 8, 0, 0, 0, 1, 0, 0, 0, 0, 0);
- stp_zprintf(init->v, "CO%c%c%c%c%c%c%c%c%c%c",
- 8, 0, 0, 0, 0, 0,
- height & 0xff, (height >> 8) & 0xff,
- (height >> 16) & 0xff, (height >> 24) & 0xff);
- break;
- case ROLL_FEED_CUT_LAST:
- stp_zprintf(init->v, "CO%c%c%c%c%c%c%c%c%c%c",
- 8, 0, 0, 0, 1, 0, 0, 0, 0, 0);
- stp_zprintf(init->v, "CO%c%c%c%c%c%c%c%c%c%c",
- 8, 0, 0, 0, 2, 0,
- height & 0xff, (height >> 8) & 0xff,
- (height >> 16) & 0xff, (height >> 24) & 0xff);
- break;
+ case INKSET_CMYKRB:
+ case INKSET_CMYK:
+ case INKSET_CcMmYK:
+ case INKSET_CcMmYyK:
+ case INKSET_CcMmYKk:
default:
+ if (ink_type->channel_set->channels[0])
+ return "KCMY";
+ else
+ return "CMY";
break;
}
}
-
- /* Exit remote mode */
- stp_zprintf(init->v, "\033%c%c%c", 0, 0, 0);
+ else
+ return "CMYK";
}
}
-static void
-escp2_set_graphics_mode(const escp2_init_t *init)
+static int
+escp2_has_advanced_command_set(const stp_vars_t *v)
{
- stp_zfwrite("\033(G\001\000\001", 6, 1, init->v);
+ return (escp2_has_cap(v, MODEL_COMMAND, MODEL_COMMAND_PRO) ||
+ escp2_has_cap(v, MODEL_COMMAND, MODEL_COMMAND_1999) ||
+ escp2_has_cap(v, MODEL_COMMAND, MODEL_COMMAND_2000));
}
-static void
-escp2_set_resolution(const escp2_init_t *init)
+static int
+escp2_use_extended_commands(const stp_vars_t *v, int use_softweave)
{
- if (escp2_use_extended_commands(init->model, 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);
+ return (escp2_has_cap(v, MODEL_COMMAND, MODEL_COMMAND_PRO) ||
+ (escp2_has_cap(v, MODEL_VARIABLE_DOT, MODEL_VARIABLE_YES) &&
+ use_softweave));
}
-static void
-escp2_set_color(const escp2_init_t *init)
+static int
+set_raw_ink_type(stp_vars_t *v)
{
- if (init->use_fast_360)
- stp_zprintf(init->v, "\033(K\002%c%c%c", 0, 0, 3);
- else 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->use_black_parameters ? 1 : 2));
-}
+ const inklist_t *inks = escp2_inklist(v);
+ int ninktypes = inks->n_inks;
+ int i;
+ const char *channel_name = stp_get_string_parameter(v, "RawChannels");
+ const channel_count_t *count;
+ if (!channel_name)
+ return 0;
+ count = get_channel_count_by_name(channel_name);
+ if (!count)
+ return 0;
-static void
-escp2_set_interleave(const escp2_init_t *init)
-{
- stp_zprintf(init->v, "\033(i\001%c%c", 0, init->use_interleave);
+ /*
+ * If we're using raw printer output, we dummy up the appropriate inkset.
+ */
+ for (i = 0; i < ninktypes; i++)
+ if (inks->inknames[i]->inkset == INKSET_EXTENDED &&
+ (inks->inknames[i]->channel_set->channel_count == count->count))
+ {
+ stp_dprintf(STP_DBG_INK, v, "Changing ink type from %s to %s\n",
+ stp_get_string_parameter(v, "InkType") ?
+ stp_get_string_parameter(v, "InkType") : "NULL",
+ inks->inknames[i]->name);
+ stp_set_string_parameter(v, "InkType", inks->inknames[i]->name);
+ stp_set_int_parameter(v, "STPIRawChannels", count->count);
+ return 1;
+ }
+ stp_eprintf
+ (v, _("This printer does not support raw printer output at depth %d\n"),
+ count->count);
+ return 0;
}
static void
-escp2_set_printhead_speed(const escp2_init_t *init)
+adjust_density_and_ink_type(stp_vars_t *v, stp_image_t *image)
{
- if (init->unidirectional)
+ escp2_privdata_t *pd = get_privdata(v);
+ const paper_adjustment_t *pt = pd->paper_adjustment;
+ double paper_density = .8;
+ int o_resid = compute_printed_resid(pd->res);
+
+ if (pt)
+ paper_density = pt->base_density;
+
+ if (!stp_check_float_parameter(v, "Density", STP_PARAMETER_DEFAULTED))
{
- 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);
+ stp_set_float_parameter_active(v, "Density", STP_PARAMETER_ACTIVE);
+ stp_set_float_parameter(v, "Density", 1.0);
}
- 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_true_height / 72;
- if (escp2_use_extended_commands(init->model, 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);
-}
+ stp_scale_float_parameter
+ (v, "Density", paper_density * escp2_density(v, o_resid));
+ pd->drop_size = escp2_ink_type(v, o_resid);
+ pd->ink_resid = o_resid;
-static void
-escp2_set_margins(const escp2_init_t *init)
-{
- int left = init->ydpi * (init->page_true_height - init->page_bottom) / 72;
- int top = init->ydpi * (init->page_true_height - init->page_top) / 72;
-
- top += init->initial_vertical_offset;
- if (escp2_use_extended_commands(init->model, init->v, init->use_softweave))
+ /*
+ * If density is greater than 1, try to find the dot size from a lower
+ * resolution that will let us print. This allows use of high ink levels
+ * on special paper types that need a lot of ink.
+ */
+ if (stp_get_float_parameter(v, "Density") > 1.0)
{
- if (escp2_has_cap(init->model,MODEL_COMMAND,MODEL_COMMAND_2000,init->v)||
- escp2_has_cap(init->model,MODEL_COMMAND,MODEL_COMMAND_PRO,init->v))
- stp_zprintf(init->v, "\033(c\010%c%c%c%c%c%c%c%c%c", 0,
- top & 0xff, (top >> 8) & 0xff,
- (top >> 16) & 0xff, (top >> 24) & 0xff,
- left & 0xff, (left >> 8) & 0xff,
- (left >> 16) & 0xff, (left >> 24) & 0xff);
+ if (stp_check_int_parameter(v, "escp2_ink_type", STP_PARAMETER_ACTIVE) ||
+ stp_check_int_parameter(v, "escp2_density", STP_PARAMETER_ACTIVE) ||
+ stp_check_int_parameter(v, "escp2_bits", STP_PARAMETER_ACTIVE) ||
+ (stp_check_boolean_parameter(v, "AdjustDotsize",
+ STP_PARAMETER_ACTIVE) &&
+ ! stp_get_boolean_parameter(v, "AdjustDotsize")))
+ {
+ stp_set_float_parameter(v, "Density", 1.0);
+ }
else
- stp_zprintf(init->v, "\033(c\004%c%c%c%c%c", 0,
- top & 0xff, top >> 8, left & 0xff, left >> 8);
+ {
+ double density = stp_get_float_parameter(v, "Density");
+ int resid = o_resid;
+ int xresid = resid;
+ double xdensity = density;
+ while (density > 1.0 && resid >= RES_360)
+ {
+ int tresid = xresid - 1;
+ int bits_now = escp2_bits(v, resid);
+ double density_now = escp2_density(v, resid);
+ int bits_then = escp2_bits(v, tresid);
+ double density_then = escp2_density(v, tresid);
+ int drop_size_then = escp2_ink_type(v, tresid);
+
+ /*
+ * If we would change the number of bits in the ink type,
+ * don't try this. Some resolutions require using a certain
+ * number of bits!
+ */
+
+ if (bits_now != bits_then || density_then <= 0.0 ||
+ drop_size_then == -1)
+ break;
+ xdensity = density * density_then / density_now / 2;
+ xresid = tresid;
+
+ /*
+ * If we wouldn't get a significant improvement by changing the
+ * resolution, don't waste the effort trying.
+ */
+ if (density / xdensity > 1.001)
+ {
+ density = xdensity;
+ resid = tresid;
+ }
+ }
+ pd->drop_size = escp2_ink_type(v, resid);
+ pd->ink_resid = resid;
+ if (density > 1.0)
+ density = 1.0;
+ stp_set_float_parameter(v, "Density", density);
+ }
}
- else
- stp_zprintf(init->v, "\033(c\004%c%c%c%c%c", 0,
- top & 0xff, top >> 8, left & 0xff, left >> 8);
}
static void
-escp2_set_form_factor(const escp2_init_t *init)
+adjust_print_quality(stp_vars_t *v, stp_image_t *image)
{
- if (escp2_has_advanced_command_set(init->model, init->v))
- {
- int page_width = init->page_width * init->ydpi / 72;
- int page_height = init->page_true_height * init->ydpi / 72;
+ escp2_privdata_t *pd = get_privdata(v);
+ stp_curve_t *adjustment = NULL;
+ const paper_adjustment_t *pt;
+ double k_upper = 1.0;
+ double k_lower = 0;
+ double k_transition = 1.0;
- 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;
+ /*
+ * Compute the LUT. For now, it's 8 bit, but that may eventually
+ * sometimes change.
+ */
- 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));
+ pt = pd->paper_adjustment;
+ if (pt)
+ {
+ k_lower = pt->k_lower;
+ k_upper = pt->k_upper;
+ k_transition = pt->k_transition;
+ stp_set_default_float_parameter(v, "CyanDensity", 1.0);
+ stp_scale_float_parameter(v, "CyanDensity", pt->cyan);
+ stp_set_default_float_parameter(v, "MagentaDensity", 1.0);
+ stp_scale_float_parameter(v, "MagentaDensity", pt->magenta);
+ stp_set_default_float_parameter(v, "YellowDensity", 1.0);
+ stp_scale_float_parameter(v, "YellowDensity", pt->yellow);
+ stp_set_default_float_parameter(v, "BlackDensity", 1.0);
+ stp_scale_float_parameter(v, "BlackDensity", pt->black);
+ stp_set_default_float_parameter(v, "Saturation", 1.0);
+ stp_scale_float_parameter(v, "Saturation", pt->saturation);
+ stp_set_default_float_parameter(v, "Gamma", 1.0);
+ stp_scale_float_parameter(v, "Gamma", pt->gamma);
}
-}
-static void
-escp2_set_printhead_resolution(const escp2_init_t *init)
-{
- if (escp2_use_extended_commands(init->model, init->v, init->use_softweave))
- {
- int xres;
- int yres;
- int scale = escp2_resolution_scale(init->model, init->v);
- xres = scale / init->physical_xdpi;
+ if (!stp_check_float_parameter(v, "GCRLower", STP_PARAMETER_ACTIVE))
+ stp_set_default_float_parameter(v, "GCRLower", k_lower);
+ if (!stp_check_float_parameter(v, "GCRUpper", STP_PARAMETER_ACTIVE))
+ stp_set_default_float_parameter(v, "GCRUpper", k_upper);
+ if (!stp_check_float_parameter(v, "BlackTrans", STP_PARAMETER_ACTIVE))
+ stp_set_default_float_parameter(v, "BlackTrans", k_transition);
- if (escp2_has_cap(init->model, MODEL_COMMAND, MODEL_COMMAND_PRO,
- init->v) && !init->use_softweave)
- yres = scale / init->ydpi;
- else
- yres = (init->nozzle_separation * scale /
- escp2_base_separation(init->model, init->v));
- /* Magic resolution cookie */
- stp_zprintf(init->v, "\033(D%c%c%c%c%c%c", 4, 0,
- scale % 256, scale / 256, yres, xres);
+ if (!stp_check_curve_parameter(v, "HueMap", STP_PARAMETER_ACTIVE) &&
+ pt->hue_adjustment)
+ {
+ adjustment = stp_curve_create_from_string(pt->hue_adjustment);
+ stp_set_curve_parameter(v, "HueMap", adjustment);
+ stp_set_curve_parameter_active(v, "HueMap", STP_PARAMETER_ACTIVE);
+ stp_curve_destroy(adjustment);
+ }
+ if (!stp_check_curve_parameter(v, "SatMap", STP_PARAMETER_ACTIVE) &&
+ pt->sat_adjustment)
+ {
+ adjustment = stp_curve_create_from_string(pt->sat_adjustment);
+ stp_set_curve_parameter(v, "SatMap", adjustment);
+ stp_set_curve_parameter_active(v, "SatMap", STP_PARAMETER_ACTIVE);
+ stp_curve_destroy(adjustment);
+ }
+ if (!stp_check_curve_parameter(v, "LumMap", STP_PARAMETER_ACTIVE) &&
+ pt->lum_adjustment)
+ {
+ adjustment = stp_curve_create_from_string(pt->lum_adjustment);
+ stp_set_curve_parameter(v, "LumMap", adjustment);
+ stp_set_curve_parameter_active(v, "LumMap", STP_PARAMETER_ACTIVE);
+ stp_curve_destroy(adjustment);
}
}
-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_interleave(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 int
+count_channels(const escp2_inkname_t *inks, int use_aux_channels)
+{
+ int answer = 0;
+ int i;
+ for (i = 0; i < inks->channel_set->channel_count; i++)
+ if (inks->channel_set->channels[i])
+ answer += inks->channel_set->channels[i]->n_subchannels;
+ if (use_aux_channels)
+ for (i = 0; i < inks->channel_set->aux_channel_count; i++)
+ if (inks->channel_set->aux_channels[i])
+ answer += inks->channel_set->aux_channels[i]->n_subchannels;
+ return answer;
}
-static void
-escp2_deinit_printer(const escp2_init_t *init)
+static int
+compute_channel_count(const escp2_inkname_t *ink_type, int channel_limit,
+ int use_aux_channels)
{
- stp_puts("\033@", init->v); /* ESC/P2 reset */
- if (escp2_has_advanced_command_set(init->model, init->v) || init->input_slot)
+ int i;
+ int physical_channels = 0;
+ for (i = 0; i < channel_limit; i++)
{
- const init_sequence_t *deinit =
- escp2_postinit_remote_sequence(init->model, init->v);
- stp_zprintf(init->v, /* Enter remote mode */
- "\033(R\010%c%cREMOTE1", 0, 0);
- if (init->input_slot && init->input_slot->deinit_sequence.length)
- stp_zfwrite(init->input_slot->deinit_sequence.data,
- init->input_slot->deinit_sequence.length, 1, init->v);
- /* Load settings from NVRAM */
- stp_zprintf(init->v, "LD%c%c", 0, 0);
-
- /* Magic deinit sequence reported by Simone Falsini */
- if (deinit)
- stp_zfwrite(deinit->data, deinit->length, 1, init->v);
- /* Exit remote mode */
- stp_zprintf(init->v, "\033%c%c%c", 0, 0, 0);
-
+ const ink_channel_t *channel = ink_type->channel_set->channels[i];
+ if (channel)
+ physical_channels += channel->n_subchannels;
}
+ if (use_aux_channels)
+ for (i = 0; i < ink_type->channel_set->aux_channel_count; i++)
+ if (ink_type->channel_set->aux_channels[i])
+ physical_channels += ink_type->channel_set->aux_channels[i]->n_subchannels;
+ return physical_channels;
}
-static void
-adjust_print_quality(const escp2_init_t *init, void *dither,
- double **lum_adjustment, double **sat_adjustment,
- double **hue_adjustment)
+static double
+get_double_param(const stp_vars_t *v, const char *param)
{
- const paper_t *pt;
- const stp_vars_t nv = init->v;
- int i;
- const escp2_variable_inkset_t *inks;
- double k_upper, k_lower;
- double paper_k_upper;
- int ink_spread;
- /*
- * Compute the LUT. For now, it's 8 bit, but that may eventually
- * sometimes change.
- */
- k_lower = init->inkname->k_lower;
- k_upper = init->inkname->k_upper;
+ if (param && stp_check_float_parameter(v, param, STP_PARAMETER_ACTIVE))
+ return stp_get_float_parameter(v, param);
+ else
+ return 1.0;
+}
- pt = get_media_type(init->model, stp_get_media_type(nv), nv);
- if (pt)
+static void
+setup_inks(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ int i, j;
+ const escp2_dropsize_t *drops;
+ const escp2_inkname_t *ink_type = pd->inkname;
+ const paper_adjustment_t *paper = pd->paper_adjustment;
+ double multi_channel_limit = 1.0;
+ int gloss_channel = -1;
+ double gloss_scale = get_double_param(v, "Density");
+
+ drops = escp2_dropsizes(v, pd->ink_resid);
+ stp_init_debug_messages(v);
+ if (stp_check_float_parameter(v, "MultiChannelLimit",
+ STP_PARAMETER_DEFAULTED))
+ multi_channel_limit =
+ stp_get_float_parameter(v, "MultiChannelLimit");
+ for (i = 0; i < pd->logical_channels; i++)
{
- stp_set_density(nv, stp_get_density(nv) * pt->base_density);
- if (init->total_channels >= 5)
+ const ink_channel_t *channel = ink_type->channel_set->channels[i];
+ if (channel && channel->n_subchannels > 0)
{
- 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);
+ int hue_curve_found = 0;
+ const char *param = channel->subchannels[0].channel_density;
+ const shade_t *shades = escp2_shades(v, i);
+ double userval = get_double_param(v, param);
+ if (shades->n_shades < channel->n_subchannels)
+ {
+ stp_erprintf("Not enough shades!\n");
+ }
+ if (strcmp(param, "BlackDensity") == 0)
+ stp_channel_set_black_channel(v, i);
+ else if (strcmp(param, "GlossDensity") == 0)
+ {
+ gloss_scale *= get_double_param(v, param);
+ gloss_channel = i;
+ }
+ stp_dither_set_inks(v, i, 1.0, ink_darknesses[i % 8],
+ channel->n_subchannels, shades->shades,
+ drops->numdropsizes, drops->dropsizes);
+ for (j = 0; j < channel->n_subchannels; j++)
+ {
+ const char *subparam =
+ channel->subchannels[j].subchannel_scale;
+ double scale = userval * get_double_param(v, subparam);
+ scale *= get_double_param(v, "Density");
+ stp_channel_set_density_adjustment(v, i, j, scale);
+ if (paper)
+ stp_channel_set_cutoff_adjustment(v, i, j,
+ paper->subchannel_cutoff);
+ }
+ if (channel->hue_curve && channel->hue_curve->curve_name)
+ {
+ char *hue_curve_name;
+ const stp_curve_t *curve = NULL;
+ stp_asprintf(&hue_curve_name, "%sHueCurve",
+ channel->hue_curve->curve_name);
+ curve = stp_get_curve_parameter(v, hue_curve_name);
+ if (curve)
+ {
+ stp_channel_set_curve(v, i, curve);
+ hue_curve_found = 1;
+ }
+ stp_free(hue_curve_name);
+ }
+ if (channel->hue_curve && !hue_curve_found)
+ {
+ if (!channel->hue_curve->curve_impl)
+ channel->hue_curve->curve_impl =
+ stp_curve_create_from_string(channel->hue_curve->curve);
+ if (channel->hue_curve->curve_impl)
+ {
+ stp_curve_t *curve_tmp =
+ stp_curve_create_copy(channel->hue_curve->curve_impl);
+ (void) stp_curve_rescale(curve_tmp,
+ sqrt(1.0 / stp_get_float_parameter(v, "Gamma")),
+ STP_CURVE_COMPOSE_EXPONENTIATE,
+ STP_CURVE_BOUNDS_RESCALE);
+ stp_channel_set_curve(v, i, curve_tmp);
+ stp_curve_destroy(curve_tmp);
+ }
+ }
}
- 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;
- paper_k_upper = pt->k_upper;
- 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;
- paper_k_upper = .5;
- k_upper *= .5;
- }
- stp_set_density(nv, stp_get_density(nv) *
- escp2_density(init->model, init->resid, nv));
- if (stp_get_density(nv) > 1.0)
- stp_set_density(nv, 1.0);
- if (init->output_type == OUTPUT_GRAY)
- stp_set_gamma(nv, stp_get_gamma(nv) / .8);
- stp_compute_lut(nv, 256);
-
- 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(init->model, init->resid, init->inkname->inkset, 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 * paper_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 (init->ydpi > escp2_max_vres(init->model, nv))
- ink_spread++;
- if (init->bits > 1)
- ink_spread++;
- stp_dither_set_ink_spread(dither, ink_spread);
- break;
- }
- stp_dither_set_density(dither, stp_get_density(nv));
- if (init->inkname->lum_adjustment)
- {
- *lum_adjustment = stp_malloc(sizeof(double) * 49);
- for (i = 0; i < 49; i++)
+ }
+ if (pd->use_aux_channels)
+ {
+ int base_count = pd->logical_channels;
+ for (i = 0; i < ink_type->channel_set->aux_channel_count; i++)
{
- (*lum_adjustment)[i] = init->inkname->lum_adjustment[i];
- if (pt && pt->lum_adjustment)
- (*lum_adjustment)[i] *= pt->lum_adjustment[i];
+ const ink_channel_t *channel =
+ ink_type->channel_set->aux_channels[i];
+ if (channel && channel->n_subchannels > 0)
+ {
+ int ch = i + base_count;
+ const char *param = channel->subchannels[0].channel_density;
+ const shade_t *shades = escp2_shades(v, ch);
+ double userval = get_double_param(v, param);
+ if (shades->n_shades < channel->n_subchannels)
+ {
+ stp_erprintf("Not enough shades!\n");
+ }
+ if (strcmp(param, "GlossDensity") == 0)
+ {
+ gloss_scale *= get_double_param(v, param);
+ stp_channel_set_gloss_channel(v, ch);
+ stp_channel_set_gloss_limit(v, gloss_scale);
+ }
+ stp_dither_set_inks(v, ch, 1.0, ink_darknesses[ch % 8],
+ channel->n_subchannels, shades->shades,
+ drops->numdropsizes, drops->dropsizes);
+ for (j = 0; j < channel->n_subchannels; j++)
+ {
+ const char *subparam =
+ channel->subchannels[j].subchannel_scale;
+ double scale = userval * get_double_param(v, subparam);
+ scale *= get_double_param(v, "Density");
+ stp_channel_set_density_adjustment(v, ch, j, scale);
+ if (paper)
+ stp_channel_set_cutoff_adjustment(v, ch, j,
+ paper->subchannel_cutoff);
+ }
+ if (channel->hue_curve)
+ {
+ stp_curve_t *curve_tmp =
+ stp_curve_create_copy(channel->hue_curve->curve_impl);
+ (void) stp_curve_rescale(curve_tmp,
+ sqrt(1.0 / stp_get_float_parameter(v, "Gamma")),
+ STP_CURVE_COMPOSE_EXPONENTIATE,
+ STP_CURVE_BOUNDS_RESCALE);
+ stp_channel_set_curve(v, ch, curve_tmp);
+ stp_curve_destroy(curve_tmp);
+ }
+ }
}
}
- if (init->inkname->sat_adjustment)
+ stp_flush_debug_messages(v);
+}
+
+static void
+setup_head_offset(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ int i;
+ int channel_id = 0;
+ int channel_limit = pd->logical_channels;
+ const escp2_inkname_t *ink_type = pd->inkname;
+ if (pd->channels_in_use > pd->logical_channels)
+ channel_limit = pd->channels_in_use;
+ pd->head_offset = stp_zalloc(sizeof(int) * channel_limit);
+ for (i = 0; i < pd->logical_channels; i++)
{
- *sat_adjustment = stp_malloc(sizeof(double) * 49);
- for (i = 0; i < 49; i++)
+ const ink_channel_t *channel = ink_type->channel_set->channels[i];
+ if (channel)
{
- (*sat_adjustment)[i] = init->inkname->sat_adjustment[i];
- if (pt && pt->sat_adjustment)
- (*sat_adjustment)[i] *= pt->sat_adjustment[i];
+ int j;
+ for (j = 0; j < channel->n_subchannels; j++)
+ {
+ pd->head_offset[channel_id] =
+ channel->subchannels[j].head_offset;
+ channel_id++;
+ }
}
}
- if (init->inkname->hue_adjustment)
+ if (pd->use_aux_channels)
{
- *hue_adjustment = stp_malloc(sizeof(double) * 49);
- for (i = 0; i < 49; i++)
+ for (i = 0; i < ink_type->channel_set->aux_channel_count; i++)
{
- (*hue_adjustment)[i] = init->inkname->hue_adjustment[i];
- if (pt && pt->hue_adjustment)
- (*hue_adjustment)[i] += pt->hue_adjustment[i];
+ const ink_channel_t *channel = ink_type->channel_set->aux_channels[i];
+ if (channel)
+ {
+ int j;
+ for (j = 0; j < channel->n_subchannels; j++)
+ {
+ pd->head_offset[channel_id] =
+ channel->subchannels[j].head_offset;
+ channel_id++;
+ }
+ }
}
}
+ if (pd->physical_channels == 1)
+ pd->head_offset[0] = 0;
+ pd->max_head_offset = 0;
+ if (pd->physical_channels > 1)
+ for (i = 0; i < pd->channels_in_use; i++)
+ {
+ pd->head_offset[i] = pd->head_offset[i] * pd->res->vres /
+ escp2_base_separation(v);
+ if (pd->head_offset[i] > pd->max_head_offset)
+ pd->max_head_offset = pd->head_offset[i];
+ }
}
-static int
-count_channels(const escp2_inkname_t *inks)
+static void
+setup_misc(stp_vars_t *v)
{
- int answer = 0;
- int i;
- for (i = 0; i < NCOLORS; i++)
- if (inks->channels[i])
- answer += inks->channels[i]->n_subchannels;
- return answer;
+ escp2_privdata_t *pd = get_privdata(v);
+ pd->input_slot = get_input_slot(v);
+ pd->paper_type = get_media_type(v);
+ pd->paper_adjustment = get_media_adjustment(v);
+ pd->ink_group = escp2_inkgroup(v);
+ pd->init_sequence = escp2_preinit_sequence(v);
+ pd->deinit_sequence = escp2_postinit_remote_sequence(v);
+ pd->advanced_command_set = escp2_has_advanced_command_set(v);
+ pd->command_set = escp2_get_cap(v, MODEL_COMMAND);
+ pd->variable_dots = escp2_has_cap(v, MODEL_VARIABLE_DOT, MODEL_VARIABLE_YES);
+ pd->has_vacuum = escp2_has_cap(v, MODEL_VACUUM, MODEL_VACUUM_YES);
+ pd->has_graymode = escp2_has_cap(v, MODEL_GRAYMODE, MODEL_GRAYMODE_YES);
+ pd->base_separation = escp2_base_separation(v);
+ pd->resolution_scale = escp2_resolution_scale(v);
+ pd->use_extended_commands =
+ escp2_use_extended_commands(v, pd->res->softweave);
}
-static const escp2_inkname_t *
-get_inktype(const stp_printer_t printer, const stp_vars_t v, int model)
+static void
+allocate_channels(stp_vars_t *v, int line_length)
{
- const char *ink_type = stp_get_ink_type(v);
- const inklist_t *ink_list = escp2_inklist(model, v);
+ escp2_privdata_t *pd = get_privdata(v);
+ const escp2_inkname_t *ink_type = pd->inkname;
int i;
+ int channel_id = 0;
- for (i = 0; i < ink_list->n_inks; i++)
+ pd->cols = stp_zalloc(sizeof(unsigned char *) * pd->channels_in_use);
+ pd->channels =
+ stp_zalloc(sizeof(physical_subchannel_t *) * pd->channels_in_use);
+
+ for (i = 0; i < pd->logical_channels; i++)
{
- if (strcmp(ink_type, ink_list->inknames[i]->name) == 0)
- return ink_list->inknames[i];
+ const ink_channel_t *channel = ink_type->channel_set->channels[i];
+ if (channel)
+ {
+ int j;
+ for (j = 0; j < channel->n_subchannels; j++)
+ {
+ pd->cols[channel_id] = stp_zalloc(line_length);
+ pd->channels[channel_id] = &(channel->subchannels[j]);
+ stp_dither_add_channel(v, pd->cols[channel_id], i, j);
+ channel_id++;
+ }
+ }
}
- ink_type = escp2_default_parameters(printer, NULL, "InkType");
- for (i = 0; i < ink_list->n_inks; i++)
+ if (pd->use_aux_channels && ink_type->channel_set->aux_channel_count > 0)
{
- if (strcmp(ink_type, ink_list->inknames[i]->name) == 0)
- return ink_list->inknames[i];
+ for (i = 0; i < ink_type->channel_set->aux_channel_count; i++)
+ {
+ const ink_channel_t *channel = ink_type->channel_set->aux_channels[i];
+ int j;
+ for (j = 0; j < channel->n_subchannels; j++)
+ {
+ pd->cols[channel_id] = stp_zalloc(line_length);
+ pd->channels[channel_id] = &(channel->subchannels[j]);
+ stp_dither_add_channel(v, pd->cols[channel_id],
+ i + pd->logical_channels, j);
+ channel_id++;
+ }
+ }
}
- return NULL;
+ stp_set_string_parameter(v, "STPIOutputType", escp2_describe_output(v));
}
-static const physical_subchannel_t default_black_subchannels[] =
+static unsigned
+gcd(unsigned a, unsigned b)
{
- { 0, 0, 0 }
-};
+ unsigned tmp;
+ if (b > a)
+ {
+ tmp = a;
+ a = b;
+ b = tmp;
+ }
+ while (1)
+ {
+ tmp = a % b;
+ if (tmp == 0)
+ return b;
+ a = b;
+ b = tmp;
+ }
+}
-static const ink_channel_t default_black_channels =
+static unsigned
+lcm(unsigned a, unsigned b)
{
- default_black_subchannels, 1
-};
+ if (a == b)
+ return a;
+ else
+ return a * b / gcd(a, b);
+}
-static const escp2_inkname_t default_black_ink =
+static int
+adjusted_vertical_resolution(const res_t *res)
{
- NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL,
- {
- &default_black_channels, NULL, NULL, NULL
- }
-};
+ if (res->vres >= 720)
+ return res->vres;
+ else if (res->hres >= 720) /* Special case 720x360 */
+ return 720;
+ else if (res->vres % 90 == 0)
+ return res->vres;
+ else
+ return lcm(res->hres, res->vres);
+}
static int
-setup_ink_types(const escp2_inkname_t *ink_type,
- escp2_privdata_t *privdata,
- unsigned char **cols,
- int *head_offset,
- stp_dither_data_t *dt,
- int channel_limit,
- int line_length)
+adjusted_horizontal_resolution(const res_t *res)
{
- int i;
- int channels_in_use = 0;
- for (i = 0; i < channel_limit; i++)
- {
- const ink_channel_t *channel = ink_type->channels[i];
- if (channel)
- {
- int j;
- for (j = 0; j < channel->n_subchannels; j++)
- {
- cols[channels_in_use] = stp_zalloc(line_length);
- privdata->channels[channels_in_use] = &(channel->channels[j]);
- stp_add_channel(dt, cols[channels_in_use], i, j);
- head_offset[channels_in_use] = channel->channels[j].head_offset;
- channels_in_use++;
- }
- }
- }
- return channels_in_use;
+ if (res->vres % 90 == 0)
+ return res->hres;
+ else
+ return lcm(res->hres, res->vres);
}
-/*
- * 'escp2_print()' - Print an image to an EPSON printer.
- */
static void
-escp2_do_print(const stp_printer_t printer, /* I - Model */
- stp_image_t *image, /* I - Image to print */
- const stp_vars_t v,
- int print_op)
-{
- unsigned char *cmap = stp_get_cmap(v);
- int model = stp_printer_get_model(printer);
- int output_type = stp_get_output_type(v);
- int orientation = stp_get_orientation(v);
- int top = stp_get_top(v);
- int left = stp_get_left(v);
+setup_resolution(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ const res_t *res = escp2_find_resolution(v);
+ int resid = compute_resid(res);
- int i;
- int y; /* Looping vars */
-
- const res_t *res;
- int xdpi;
- int ydpi; /* Resolution */
- int physical_ydpi;
- int physical_xdpi;
- int undersample;
- int resid;
-
- 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, /* Height of page */
- page_true_height; /* True height of page */
- int 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 */
- int 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 image_height,
- image_width,
- image_bpp;
-
- int nozzles;
- int nozzle_separation;
- int horizontal_passes;
-
- int bits;
- void * weave;
- void * dither;
- stp_vars_t nv = stp_allocate_copy(v);
- escp2_init_t init;
- int max_vres;
- unsigned char **cols;
- int *head_offset;
- int max_head_offset;
- double *lum_adjustment = NULL;
- double *sat_adjustment = NULL;
- double *hue_adjustment = NULL;
- escp2_privdata_t privdata;
- stp_dither_data_t *dt;
- const escp2_inkname_t *ink_type;
- int total_channels;
- int channels_in_use;
- int channel_limit;
- const char *input_slot = stp_get_media_source(v);
-
- if (!stp_get_verified(nv))
- {
- stp_eprintf(nv, "Print options not verified; cannot print.\n");
- return;
- }
+ int vertical = adjusted_vertical_resolution(res);
+ int horizontal = adjusted_horizontal_resolution(res);
- privdata.undersample = 1;
- privdata.denominator = 1;
- privdata.initial_vertical_offset = 0;
- privdata.printed_something = 0;
- privdata.last_color = -1;
- stp_set_driver_data(nv, &privdata);
+ pd->res = res;
+ pd->physical_xdpi = escp2_base_res(v, resid);
+ if (pd->physical_xdpi > pd->res->hres)
+ pd->physical_xdpi = pd->res->hres;
- ink_type = get_inktype(printer, nv, model);
- total_channels = count_channels(ink_type);
- if (output_type != OUTPUT_GRAY && output_type != OUTPUT_MONOCHROME &&
- !ink_type->is_color)
+ if (escp2_use_extended_commands(v, pd->res->softweave))
+ {
+ pd->unit_scale = escp2_max_hres(v);
+ pd->horizontal_units = horizontal;
+ pd->micro_units = horizontal;
+ }
+ else
{
- output_type = OUTPUT_GRAY;
- stp_set_output_type(nv, OUTPUT_GRAY);
+ pd->unit_scale = 3600;
+ if (pd->res->hres <= 720)
+ pd->micro_units = vertical;
+ else
+ pd->micro_units = horizontal;
+ pd->horizontal_units = vertical;
}
+ if (escp2_has_cap(v, MODEL_COMMAND, MODEL_COMMAND_1999) &&
+ escp2_has_cap(v, MODEL_VARIABLE_DOT, MODEL_VARIABLE_NO))
+ pd->micro_units = 1440;
+ pd->vertical_units = vertical;
+ pd->page_management_units = vertical;
+ pd->printing_resolution = escp2_base_res(v, resid);
+}
- /*
- * Figure out the output resolution...
- */
- res = escp2_find_resolution(model, nv, stp_get_resolution(nv));
- if (res->softweave)
- max_vres = escp2_max_vres(model, nv);
+static void
+setup_softweave_parameters(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ pd->horizontal_passes = pd->res->printed_hres / pd->physical_xdpi;
+ if (pd->physical_channels == 1 &&
+ (pd->res->vres >=
+ (escp2_base_separation(v) / escp2_black_nozzle_separation(v))) &&
+ (escp2_max_black_resolution(v) < 0 ||
+ pd->res->vres <= escp2_max_black_resolution(v)) &&
+ escp2_black_nozzles(v))
+ pd->use_black_parameters = 1;
+ else
+ pd->use_black_parameters = 0;
+ if (pd->use_fast_360)
+ {
+ pd->nozzles = escp2_fast_nozzles(v);
+ pd->nozzle_separation = escp2_fast_nozzle_separation(v);
+ pd->min_nozzles = escp2_min_fast_nozzles(v);
+ }
+ else if (pd->use_black_parameters)
+ {
+ pd->nozzles = escp2_black_nozzles(v);
+ pd->nozzle_separation = escp2_black_nozzle_separation(v);
+ pd->min_nozzles = escp2_min_black_nozzles(v);
+ }
else
- max_vres = escp2_base_resolution(model, nv);
- xdpi = res->hres;
- ydpi = res->vres;
- resid = res->resid;
- undersample = res->vertical_undersample;
- privdata.undersample = res->vertical_undersample;
- privdata.denominator = res->vertical_denominator;
-
- physical_xdpi = escp2_base_res(model, resid, nv);
- if (physical_xdpi > xdpi)
- physical_xdpi = xdpi;
-
- physical_ydpi = ydpi;
- if (ydpi > max_vres)
- physical_ydpi = max_vres;
-
- bits = escp2_bits(model, resid, nv);
-
- /*
- * Compute the output size...
- */
- image->init(image);
- image_height = image->height(image);
- image_width = image->width(image);
-
- 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,
- stp_get_scaling(nv), image_width, image_height,
- image, &orientation, &page_width, &page_height,
- &out_width, &out_height, &left, &top);
+ {
+ pd->nozzles = escp2_nozzles(v);
+ pd->nozzle_separation = escp2_nozzle_separation(v);
+ pd->min_nozzles = escp2_min_nozzles(v);
+ }
+}
+static void
+setup_printer_weave_parameters(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ pd->horizontal_passes = 1;
+ pd->nozzles = 1;
+ pd->nozzle_separation = 1;
+ pd->min_nozzles = 1;
+ pd->use_black_parameters = 0;
+}
+
+static void
+setup_head_parameters(stp_vars_t *v)
+{
+ escp2_privdata_t *pd = get_privdata(v);
/*
- * Recompute the image height and width. If the image has been
- * rotated, these will change from previously.
+ * Set up the output channels
*/
- image_height = image->height(image);
- image_width = image->width(image);
- stp_default_media_size(printer, nv, &n, &page_true_height);
-
- /*
- * Convert image size to printer resolution...
- */
-
- out_width = xdpi * out_width / 72;
- out_height = ydpi * out_height / 72;
- length = (out_width + 7) / 8;
-
- left = physical_ydpi * undersample * left / 72 / res->vertical_denominator;
+ if (strcmp(stp_get_string_parameter(v, "PrintingMode"), "BW") == 0)
+ pd->logical_channels = 1;
+ else
+ pd->logical_channels = pd->inkname->channel_set->channel_count;
- /*
- * Adjust for zero-margin printing...
- */
+ pd->physical_channels =
+ compute_channel_count(pd->inkname, pd->logical_channels,
+ pd->use_aux_channels);
+ if (pd->physical_channels == 0)
+ {
+ pd->inkname = &stpi_escp2_default_black_inkset;
+ pd->physical_channels =
+ compute_channel_count(pd->inkname, pd->logical_channels,
+ pd->use_aux_channels);
+ }
- if (escp2_has_cap(model, MODEL_XZEROMARGIN, MODEL_XZEROMARGIN_YES, nv))
+ pd->use_printer_weave = use_printer_weave(v);
+ if (pd->use_printer_weave)
{
- /*
- * 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 / res->vertical_denominator;
+ pd->printer_weave = get_printer_weave(v);
+ if (pd->res->softweave && pd->printer_weave && pd->printer_weave->value == 0)
+ pd->printer_weave = NULL;
}
- /*
- * Set up the output channels
- */
- cols = stp_zalloc(sizeof(unsigned char *) * total_channels);
- privdata.channels =
- stp_zalloc(sizeof(physical_subchannel_t *) * total_channels);
- head_offset = stp_zalloc(sizeof(int) * total_channels);
-
- memset(head_offset, 0, sizeof(head_offset));
- channel_limit = NCOLORS;
- if (output_type == OUTPUT_GRAY || output_type == OUTPUT_MONOCHROME)
- channel_limit = 1;
-
- dt = stp_create_dither_data();
-
- channels_in_use = setup_ink_types(ink_type, &privdata, cols, head_offset,
- dt, channel_limit, length * bits);
- if (channels_in_use == 0)
- {
- ink_type = &default_black_ink;
- channels_in_use = setup_ink_types(ink_type, &privdata, cols, head_offset,
- dt, channel_limit, length * bits);
- }
- if (channels_in_use == 1)
- head_offset[0] = 0;
- if (escp2_has_cap(model, MODEL_FAST_360, MODEL_FAST_360_YES, nv) &&
- (ink_type->inkset == INKSET_CMYK || channels_in_use == 1) &&
- xdpi == 360 && ydpi == 360)
- init.use_fast_360 = 1;
+ if (escp2_has_cap(v, MODEL_FAST_360, MODEL_FAST_360_YES) &&
+ (pd->inkname->inkset == INKSET_CMYK || pd->physical_channels == 1) &&
+ pd->res->hres == pd->physical_xdpi && pd->res->vres == 360)
+ pd->use_fast_360 = 1;
else
- init.use_fast_360 = 0;
+ pd->use_fast_360 = 0;
/*
* Set up the printer-specific parameters (weaving)
*/
- if (res->softweave)
+ if (pd->use_printer_weave)
+ setup_printer_weave_parameters(v);
+ else
+ setup_softweave_parameters(v);
+ pd->separation_rows = escp2_separation_rows(v);
+ pd->pseudo_separation_rows = escp2_pseudo_separation_rows(v);
+ pd->extra_720dpi_separation = escp2_extra_720dpi_separation(v);
+
+ if (pd->horizontal_passes == 0)
+ pd->horizontal_passes = 1;
+
+ setup_head_offset(v);
+
+ if (strcmp(stp_get_string_parameter(v, "PrintingMode"), "BW") == 0 &&
+ pd->physical_channels == 1)
{
- horizontal_passes = xdpi / physical_xdpi;
- if ((output_type == OUTPUT_GRAY || output_type == OUTPUT_MONOCHROME) &&
- channels_in_use == 1 &&
- (ydpi >= (escp2_base_separation(model, nv) /
- escp2_black_nozzle_separation(model, nv))) &&
- (escp2_max_black_resolution(model, nv) < 0 ||
- ydpi <= escp2_max_black_resolution(model, nv)) &&
- escp2_black_nozzles(model, nv))
- init.use_black_parameters = 1;
+ if (pd->use_black_parameters)
+ pd->initial_vertical_offset =
+ escp2_black_initial_vertical_offset(v) * pd->page_management_units /
+ escp2_base_separation(v);
else
- init.use_black_parameters = 0;
- if (init.use_fast_360)
+ pd->initial_vertical_offset = pd->head_offset[0] +
+ (escp2_initial_vertical_offset(v) *
+ pd->page_management_units / escp2_base_separation(v));
+ }
+ else
+ pd->initial_vertical_offset =
+ escp2_initial_vertical_offset(v) * pd->page_management_units /
+ escp2_base_separation(v);
+
+ pd->printing_initial_vertical_offset = 0;
+ pd->bitwidth = escp2_bits(v, compute_printed_resid(pd->res));
+}
+
+static void
+setup_page(stp_vars_t *v)
+{
+ int n;
+ escp2_privdata_t *pd = get_privdata(v);
+ const input_slot_t *input_slot = get_input_slot(v);
+ int extra_left = 0;
+ int extra_top = 0;
+ const char *inner_radius_name = stp_get_string_parameter(v, "CDInnerRadius");
+ int hub_size = 43; /* 43 mm standard CD hub */
+
+ if (inner_radius_name && strcmp(inner_radius_name, "Small") == 0)
+ hub_size = 16; /* 15 mm prints to the hole - play it
+ safe and print 16 mm */
+
+ stp_default_media_size(v, &n, &(pd->page_true_height));
+ internal_imageable_area(v, 0, &pd->page_left, &pd->page_right,
+ &pd->page_bottom, &pd->page_top);
+
+ if (input_slot && input_slot->is_cd && escp2_cd_x_offset(v) > 0)
+ {
+ int left_center = escp2_cd_x_offset(v) +
+ stp_get_dimension_parameter(v, "CDXAdjustment");
+ int top_center = escp2_cd_y_offset(v) +
+ stp_get_dimension_parameter(v, "CDYAdjustment");
+ extra_top = top_center - (pd->page_bottom / 2);
+ extra_left = left_center - (pd->page_right / 2);
+ pd->cd_inner_radius = hub_size * pd->micro_units * 10 / 254 / 2;
+ pd->cd_outer_radius = pd->page_right * pd->micro_units / 72 / 2;
+ pd->cd_x_offset =
+ ((pd->page_right / 2) - stp_get_left(v)) * pd->micro_units / 72;
+ pd->cd_y_offset =
+ ((pd->page_bottom / 2) - stp_get_top(v)) * pd->micro_units / 72;
+ if (escp2_cd_page_height(v))
{
- nozzles = escp2_fast_nozzles(model, nv);
- nozzle_separation = escp2_fast_nozzle_separation(model, nv);
- privdata.min_nozzles = escp2_min_fast_nozzles(model, nv);
+ pd->page_right = escp2_cd_page_width(v);
+ pd->page_bottom = escp2_cd_page_height(v);
+ pd->page_true_height = escp2_cd_page_height(v);
}
- else if (init.use_black_parameters)
+ }
+
+ pd->page_right += extra_left + 1;
+ pd->page_width = pd->page_right - pd->page_left;
+ pd->image_left = stp_get_left(v) - pd->page_left + extra_left;
+ pd->image_width = stp_get_width(v);
+ pd->image_scaled_width = pd->image_width * pd->res->hres / 72;
+ pd->image_printed_width = pd->image_width * pd->res->printed_hres / 72;
+ pd->image_left_position = pd->image_left * pd->micro_units / 72;
+
+
+ pd->page_bottom += extra_top + 1;
+ pd->page_true_height += extra_top + 1;
+ pd->page_height = pd->page_bottom - pd->page_top;
+ pd->image_top = stp_get_top(v) - pd->page_top + extra_top;
+ pd->image_height = stp_get_height(v);
+ pd->image_scaled_height = pd->image_height * pd->res->vres / 72;
+ pd->image_printed_height = pd->image_height * pd->res->printed_vres / 72;
+
+ if (input_slot && input_slot->roll_feed_cut_flags)
+ {
+ pd->page_true_height += 4; /* Empirically-determined constants */
+ pd->page_top += 2;
+ pd->page_bottom += 2;
+ pd->image_top += 2;
+ pd->page_height += 2;
+ }
+}
+
+static void
+set_mask(unsigned char *cd_mask, int x_center, int scaled_x_where,
+ int limit, int expansion, int invert)
+{
+ int clear_val = invert ? 255 : 0;
+ int set_val = invert ? 0 : 255;
+ int bytesize = 8 / expansion;
+ int byteextra = bytesize - 1;
+ int first_x_on = x_center - scaled_x_where;
+ int first_x_off = x_center + scaled_x_where;
+ if (first_x_on < 0)
+ first_x_on = 0;
+ if (first_x_on > limit)
+ first_x_on = limit;
+ if (first_x_off < 0)
+ first_x_off = 0;
+ if (first_x_off > limit)
+ first_x_off = limit;
+ first_x_on += byteextra;
+ if (first_x_off > (first_x_on - byteextra))
+ {
+ int first_x_on_byte = first_x_on / bytesize;
+ int first_x_on_mod = expansion * (byteextra - (first_x_on % bytesize));
+ int first_x_on_extra = ((1 << first_x_on_mod) - 1) ^ clear_val;
+ int first_x_off_byte = first_x_off / bytesize;
+ int first_x_off_mod = expansion * (byteextra - (first_x_off % bytesize));
+ int first_x_off_extra = ((1 << 8) - (1 << first_x_off_mod)) ^ clear_val;
+ if (first_x_off_byte < first_x_on_byte)
{
- nozzles = escp2_black_nozzles(model, nv);
- nozzle_separation = escp2_black_nozzle_separation(model, nv);
- privdata.min_nozzles = escp2_min_black_nozzles(model, nv);
+ /* This can happen, if 6 or fewer points are turned on */
+ cd_mask[first_x_on_byte] = first_x_on_extra & first_x_off_extra;
}
else
{
- nozzles = escp2_nozzles(model, nv);
- nozzle_separation = escp2_nozzle_separation(model, nv);
- privdata.min_nozzles = escp2_min_nozzles(model, nv);
+ if (first_x_on_extra != clear_val)
+ cd_mask[first_x_on_byte - 1] = first_x_on_extra;
+ if (first_x_off_byte > first_x_on_byte)
+ memset(cd_mask + first_x_on_byte, set_val,
+ first_x_off_byte - first_x_on_byte);
+ if (first_x_off_extra != clear_val)
+ cd_mask[first_x_off_byte] = first_x_off_extra;
}
- init.nozzle_separation = nozzle_separation;
- nozzle_separation =
- nozzle_separation * ydpi / escp2_base_separation(model, nv);
}
- else
+}
+
+static int
+escp2_print_data(stp_vars_t *v, stp_image_t *image)
+{
+ escp2_privdata_t *pd = get_privdata(v);
+ int errdiv = stp_image_height(image) / pd->image_printed_height;
+ int errmod = stp_image_height(image) % pd->image_printed_height;
+ int errval = 0;
+ int errlast = -1;
+ int errline = 0;
+ int y;
+ double outer_r_sq = 0;
+ double inner_r_sq = 0;
+ int x_center = pd->cd_x_offset * pd->res->printed_hres / pd->micro_units;
+ unsigned char *cd_mask = NULL;
+ if (pd->cd_outer_radius > 0)
{
- horizontal_passes = xdpi / escp2_base_resolution(model, nv);
- nozzles = 1;
- privdata.min_nozzles = 1;
- nozzle_separation = 1;
- init.nozzle_separation = nozzle_separation;
- init.use_black_parameters = 0;
+ cd_mask = stp_malloc(1 + (pd->image_printed_width + 7) / 8);
+ outer_r_sq = (double) pd->cd_outer_radius * (double) pd->cd_outer_radius;
+ inner_r_sq = (double) pd->cd_inner_radius * (double) pd->cd_inner_radius;
}
- init.nozzles = nozzles;
- if (horizontal_passes == 0)
- horizontal_passes = 1;
+ for (y = 0; y < pd->image_printed_height; y ++)
+ {
+ int duplicate_line = 1;
+ unsigned zero_mask;
- max_head_offset = 0;
- if (channels_in_use > 1)
- for (i = 0; i < total_channels; i++)
- {
- head_offset[i] = head_offset[i] * ydpi/escp2_base_separation(model,nv);
- if (head_offset[i] > max_head_offset)
- max_head_offset = head_offset[i];
- }
+ if (errline != errlast)
+ {
+ errlast = errline;
+ duplicate_line = 0;
+ if (stp_color_get_row(v, image, errline, &zero_mask))
+ return 2;
+ }
- /*
- * Send ESC/P2 initialization commands...
- */
- 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.physical_xdpi = physical_xdpi;
- init.use_softweave = res->softweave;
- init.use_interleave = res->interleave;
- init.page_true_height = page_true_height;
- init.page_width = page_width;
- init.page_top = page_top;
- if (init.output_type == OUTPUT_GRAY && channels_in_use == 1)
- {
- if (init.use_black_parameters)
- 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 =
- head_offset[0] +
- (escp2_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) * 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 = res->vertical_passes;
- init.vertical_oversample = res->vertical_oversample;
- init.unidirectional = res->unidirectional;
- init.resid = resid;
- init.bits = bits;
- init.paper_type = stp_get_media_type(nv);
- init.media_source = stp_get_media_source(nv);
- init.v = nv;
- init.inkname = ink_type;
- init.total_channels = total_channels;
-
- init.input_slot = NULL;
- if (input_slot && strlen(input_slot) > 0)
- {
- const input_slot_list_t *slots = escp2_input_slots(model, v);
- for (i = 0; i < slots->n_input_slots; i++)
+ if (cd_mask)
{
- if (slots->slots[i].name &&
- strcmp(input_slot, slots->slots[i].name) == 0)
+ int y_distance_from_center =
+ pd->cd_outer_radius - (y * pd->micro_units / pd->res->printed_vres);
+ if (y_distance_from_center < 0)
+ y_distance_from_center = -y_distance_from_center;
+ memset(cd_mask, 0, (pd->image_printed_width + 7) / 8);
+ if (y_distance_from_center < pd->cd_outer_radius)
{
- init.input_slot = &(slots->slots[i]);
- break;
+ double y_sq = (double) y_distance_from_center *
+ (double) y_distance_from_center;
+ int x_where = sqrt(outer_r_sq - y_sq) + .5;
+ int scaled_x_where = x_where * pd->res->printed_hres / pd->micro_units;
+ set_mask(cd_mask, x_center, scaled_x_where,
+ pd->image_printed_width, 1, 0);
+ if (y_distance_from_center < pd->cd_inner_radius)
+ {
+ x_where = sqrt(inner_r_sq - y_sq) + .5;
+ scaled_x_where = x_where * pd->res->printed_hres / pd->micro_units;
+ set_mask(cd_mask, x_center, scaled_x_where,
+ pd->image_printed_width, 1, 1);
+ }
}
}
+
+ stp_dither(v, y, duplicate_line, zero_mask, cd_mask);
+
+ stp_write_weave(v, pd->cols);
+ errval += errmod;
+ errline += errdiv;
+ if (errval >= pd->image_printed_height)
+ {
+ errval -= pd->image_printed_height;
+ errline ++;
+ }
}
- if (init.input_slot && init.input_slot->roll_feed_cut_flags)
+ if (cd_mask)
+ stp_free(cd_mask);
+ return 1;
+}
+
+static int
+escp2_print_page(stp_vars_t *v, stp_image_t *image)
+{
+ int status;
+ int i;
+ escp2_privdata_t *pd = get_privdata(v);
+ int out_channels; /* Output bytes per pixel */
+ int line_width = (pd->image_printed_width + 7) / 8 * pd->bitwidth;
+ int weave_pattern = STP_WEAVE_ZIGZAG;
+ if (stp_check_string_parameter(v, "Weave", STP_PARAMETER_ACTIVE))
{
- init.page_true_height += 4;
- init.page_top += 2;
- init.page_bottom += 2;
- top += 2;
- page_height += 2;
+ const char *weave = stp_get_string_parameter(v, "Weave");
+ if (strcmp(weave, "Alternate") == 0)
+ weave_pattern = STP_WEAVE_ZIGZAG;
+ else if (strcmp(weave, "Ascending") == 0)
+ weave_pattern = STP_WEAVE_ASCENDING;
+ else if (strcmp(weave, "Descending") == 0)
+ weave_pattern = STP_WEAVE_DESCENDING;
+ else if (strcmp(weave, "Ascending2X") == 0)
+ weave_pattern = STP_WEAVE_ASCENDING_2X;
+ else if (strcmp(weave, "Staggered") == 0)
+ weave_pattern = STP_WEAVE_STAGGERED;
}
- if (print_op & OP_JOB_START)
- escp2_init_printer(&init);
- if (print_op & OP_JOB_PRINT)
- {
+ stp_initialize_weave
+ (v,
+ pd->nozzles,
+ pd->nozzle_separation * pd->res->vres / escp2_base_separation(v),
+ pd->horizontal_passes,
+ pd->res->vertical_passes,
+ 1,
+ pd->channels_in_use,
+ pd->bitwidth,
+ pd->image_printed_width,
+ pd->image_printed_height,
+ pd->image_top * pd->res->vres / 72,
+ (pd->page_height + escp2_extra_feed(v)) * pd->res->vres / 72,
+ pd->head_offset,
+ weave_pattern,
+ stpi_escp2_flush_pass,
+ FILLFUNC,
+ PACKFUNC,
+ COMPUTEFUNC);
+
+ stp_dither_init(v, image, pd->image_printed_width, pd->res->printed_hres,
+ pd->res->printed_vres);
+ allocate_channels(v, line_width);
+ adjust_print_quality(v, image);
+ out_channels = stp_color_init(v, image, 65536);
+
+/* stpi_dither_set_expansion(v, pd->res->hres / pd->res->printed_hres); */
+
+ setup_inks(v);
+
+ status = escp2_print_data(v, image);
+ stp_image_conclude(image);
+ stp_flush_all(v);
+ stpi_escp2_terminate_page(v);
- /*
- * Allocate memory for the raster data...
- */
-
- weave = stp_initialize_weave(nozzles, nozzle_separation,
- horizontal_passes, res->vertical_passes,
- res->vertical_oversample, total_channels,
- bits,
- out_width, out_height,
- 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);
-
- stp_set_output_color_model(nv, COLOR_MODEL_CMY);
- image_bpp = image->bpp(image);
- colorfunc = stp_choose_colorfunc(output_type, image_bpp, cmap,
- &out_bpp, nv);
-
- in = stp_zalloc(image_width * image_bpp);
- out = stp_zalloc(image_width * out_bpp * 2);
-
- errdiv = image_height / out_height;
- errmod = image_height % out_height;
- errval = 0;
- errlast = -1;
- errline = 0;
-
- 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);
+ /*
+ * Cleanup...
+ */
+ for (i = 0; i < pd->channels_in_use; i++)
+ if (pd->cols[i])
+ stp_free(pd->cols[i]);
+ stp_free(pd->cols);
+ stp_free(pd->channels);
+ return status;
+}
- adjust_print_quality(&init, dither,
- &lum_adjustment, &sat_adjustment, &hue_adjustment);
+/*
+ * 'escp2_print()' - Print an image to an EPSON printer.
+ */
+static int
+escp2_do_print(stp_vars_t *v, stp_image_t *image, int print_op)
+{
+ int status = 1;
- /*
- * Let the user know what we're doing...
- */
+ escp2_privdata_t *pd;
- image->progress_init(image);
+ if (!stp_verify(v))
+ {
+ stp_eprintf(v, _("Print options not verified; cannot print.\n"));
+ return 0;
+ }
+ stp_image_init(image);
- QUANT(0);
- for (y = 0; y < out_height; y ++)
- {
- int duplicate_line = 1;
- int zero_mask;
- if ((y & 63) == 0)
- image->note_progress(image, y, out_height);
+ if (strcmp(stp_get_string_parameter(v, "InputImageType"), "Raw") == 0 &&
+ !set_raw_ink_type(v))
+ return 0;
- 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,
- sat_adjustment);
- }
- QUANT(1);
+ pd = (escp2_privdata_t *) stp_zalloc(sizeof(escp2_privdata_t));
+ pd->printed_something = 0;
+ pd->last_color = -1;
+ pd->last_pass_offset = 0;
+ pd->last_pass = -1;
+ pd->send_zero_pass_advance =
+ escp2_has_cap(v, MODEL_SEND_ZERO_ADVANCE, MODEL_SEND_ZERO_ADVANCE_YES);
+ stp_allocate_component_data(v, "Driver", NULL, NULL, pd);
+
+ pd->inkname = get_inktype(v);
+ if (stp_check_boolean_parameter(v, "UseGloss", STP_PARAMETER_ACTIVE) &&
+ stp_get_boolean_parameter(v, "UseGloss"))
+ pd->use_aux_channels = 1;
+ else
+ pd->use_aux_channels = 0;
+ pd->channels_in_use = count_channels(pd->inkname, pd->use_aux_channels);
- stp_dither(out, y, dither, dt, duplicate_line, zero_mask);
- QUANT(2);
+ setup_resolution(v);
+ setup_head_parameters(v);
+ setup_page(v);
+ setup_misc(v);
- 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);
-
- /*
- * Cleanup...
- */
- stp_destroy_weave(weave);
- stp_free_dither(dither);
- stp_free_lut(nv);
- stp_free(in);
- stp_free(out);
- if (hue_adjustment)
- stp_free(hue_adjustment);
- if (sat_adjustment)
- stp_free(sat_adjustment);
- if (lum_adjustment)
- stp_free(lum_adjustment);
- if (!privdata.printed_something)
- stp_putc('\n', nv);
- stp_puts("\014", nv); /* Eject page */
- }
+ adjust_density_and_ink_type(v, image);
+ if (print_op & OP_JOB_START)
+ stpi_escp2_init_printer(v);
+ if (print_op & OP_JOB_PRINT)
+ status = escp2_print_page(v, image);
if (print_op & OP_JOB_END)
- escp2_deinit_printer(&init);
-
- stp_free_dither_data(dt);
- for (i = 0; i < total_channels; i++)
- if (cols[i])
- stp_free((unsigned char *) cols[i]);
- stp_free(cols);
- stp_free(head_offset);
- stp_free(privdata.channels);
-
-#ifdef QUANTIFY
- print_timers(nv);
-#endif
- stp_free_vars(nv);
+ stpi_escp2_deinit_printer(v);
+
+ stp_free(pd->head_offset);
+ stp_free(pd);
+
+ return status;
}
-static void
-escp2_print(const stp_printer_t printer, /* I - Model */
- stp_image_t *image, /* I - Image to print */
- const stp_vars_t v)
+static int
+escp2_print(const stp_vars_t *v, stp_image_t *image)
{
+ stp_vars_t *nv = stp_vars_create_copy(v);
int op = OP_JOB_PRINT;
- if (stp_get_job_mode(v) == STP_JOB_MODE_PAGE)
+ int status;
+ if (!stp_get_string_parameter(v, "JobMode") ||
+ strcmp(stp_get_string_parameter(v, "JobMode"), "Page") == 0)
op = OP_JOB_START | OP_JOB_PRINT | OP_JOB_END;
- escp2_do_print(printer, image, v, op);
+ stp_prune_inactive_options(nv);
+ status = escp2_do_print(nv, image, op);
+ stp_vars_destroy(nv);
+ return status;
}
static int
-escp2_job_start(const stp_printer_t printer, /* I - Model */
- stp_image_t *image, /* I - Image to print */
- const stp_vars_t v)
+escp2_job_start(const stp_vars_t *v, stp_image_t *image)
{
- if (!stp_get_verified(v))
- return 0;
- if (stp_get_job_mode(v) != STP_JOB_MODE_JOB)
- return 0;
- escp2_do_print(printer, image, v, OP_JOB_START);
- return 1;
+ stp_vars_t *nv = stp_vars_create_copy(v);
+ int status;
+ stp_prune_inactive_options(nv);
+ status = escp2_do_print(nv, image, OP_JOB_START);
+ stp_vars_destroy(nv);
+ return status;
}
static int
-escp2_job_end(const stp_printer_t printer, /* I - Model */
- stp_image_t *image, /* I - Image to print */
- const stp_vars_t v)
+escp2_job_end(const stp_vars_t *v, stp_image_t *image)
{
- if (!stp_get_verified(v))
- return 0;
- if (stp_get_job_mode(v) != STP_JOB_MODE_JOB)
- return 0;
- escp2_do_print(printer, image, v, OP_JOB_END);
- return 1;
+ stp_vars_t *nv = stp_vars_create_copy(v);
+ int status;
+ stp_prune_inactive_options(nv);
+ status = escp2_do_print(nv, image, OP_JOB_END);
+ stp_vars_destroy(nv);
+ return status;
}
-const stp_printfuncs_t stp_escp2_printfuncs =
+static const stp_printfuncs_t print_escp2_printfuncs =
{
+ escp2_list_parameters,
escp2_parameters,
stp_default_media_size,
escp2_imageable_area,
escp2_limit,
escp2_print,
- escp2_default_parameters,
escp2_describe_resolution,
+ escp2_describe_output,
stp_verify_printer_params,
escp2_job_start,
escp2_job_end
};
-static void
-set_vertical_position(stp_softweave_t *sw, stp_pass_t *pass, int model,
- const stp_vars_t v)
-{
- escp2_privdata_t *pd = (escp2_privdata_t *) stp_get_driver_data(v);
- int advance = pass->logicalpassstart - sw->last_pass_offset -
- (escp2_separation_rows(model, v) - 1);
- advance *= pd->undersample;
- 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_use_extended_commands(model, v, sw->jets > 1))
- stp_zprintf(v, "\033(v%c%c%c%c%c%c", 4, 0, a0, a1, a2, a3);
- else
- stp_zprintf(v, "\033(v%c%c%c%c", 2, 0, a0, a1);
- sw->last_pass_offset = pass->logicalpassstart;
- }
-}
+static stp_family_t print_escp2_module_data =
+ {
+ &print_escp2_printfuncs,
+ NULL
+ };
-static void
-set_color(stp_softweave_t *sw, stp_pass_t *pass, int model, const stp_vars_t v,
- int color)
+
+static int
+print_escp2_module_init(void)
{
- escp2_privdata_t *pd = (escp2_privdata_t *) stp_get_driver_data(v);
- if (pd->last_color != color &&
- ! escp2_use_extended_commands(model, v, sw->jets > 1))
- {
- int ncolor = pd->channels[color]->color;
- int density = pd->channels[color]->density;
- if (density >= 0)
- stp_zprintf(v, "\033(r%c%c%c%c", 2, 0, density, ncolor);
- else
- stp_zprintf(v, "\033r%c", ncolor);
- pd->last_color = color;
- }
+ hue_curve_bounds = stp_curve_create_from_string
+ ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+ "<sequence count=\"2\" lower-bound=\"0\" upper-bound=\"1\">\n"
+ "1 1\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>");
+ return stp_family_register(print_escp2_module_data.printer_list);
}
-static void
-set_horizontal_position(stp_softweave_t *sw, stp_pass_t *pass, int model,
- const stp_vars_t v, int hoffset, int ydpi,
- int xdpi, int vertical_subpass)
-{
- int microoffset = vertical_subpass & (sw->horizontal_weave - 1);
- escp2_privdata_t *pd = (escp2_privdata_t *) stp_get_driver_data(v);
- if (!escp2_has_advanced_command_set(model, v) &&
- (xdpi <= escp2_base_resolution(model, v) ||
- escp2_max_hres(model, v) < 1440))
- {
- int 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_YES, v)))
- {
- int pos = ((hoffset * xdpi * pd->denominator / 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
- {
- int pos = ((hoffset * escp2_max_hres(model, v) * pd->denominator / ydpi)+
- microoffset);
- if (pos > 0)
- stp_zprintf(v, "\033(\\%c%c%c%c%c%c", 4, 0, 160, 5,
- pos & 255, pos >> 8);
- }
-}
-static void
-send_print_command(stp_softweave_t *sw, stp_pass_t *pass, int model, int color,
- int lwidth, const stp_vars_t v, int hoffset, int ydpi,
- int xdpi, int physical_xdpi, int nlines)
-{
- 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_extra_720dpi_separation(model, v))
- ygap *= escp2_extra_720dpi_separation(model, v);
- 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_NO, v))
- {
- int ygap = 3600 / ydpi;
- int xgap = 3600 / physical_xdpi;
- if (escp2_extra_720dpi_separation(model, v))
- ygap *= escp2_extra_720dpi_separation(model, v);
- else if (escp2_pseudo_separation_rows(model, v) > 0)
- ygap *= escp2_pseudo_separation_rows(model, v);
- else
- ygap *= escp2_separation_rows(model, v);
- stp_zprintf(v, "\033.%c%c%c%c%c%c", COMPRESSION, ygap, xgap,
- nlines, lwidth & 255, (lwidth >> 8) & 255);
- }
- else
- {
- escp2_privdata_t *pd = (escp2_privdata_t *) stp_get_driver_data(v);
- int ncolor = pd->channels[color]->color;
- int nwidth = sw->bitwidth * ((lwidth + 7) / 8);
- if (pd->channels[color]->density >= 0)
- ncolor |= (pd->channels[color]->density << 4);
- 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);
- }
+static int
+print_escp2_module_exit(void)
+{
+ return stp_family_unregister(print_escp2_module_data.printer_list);
}
-static void
-send_extra_data(stp_softweave_t *sw, stp_vars_t v, int extralines, int lwidth)
-{
- int k, l;
- int bytes_to_fill = sw->bitwidth * ((lwidth + 7) / 8);
- int full_blocks = bytes_to_fill / 128;
- int leftover = bytes_to_fill % 128;
- int total_bytes = extralines * (full_blocks + 1) * 2;
- unsigned char *buf = stp_malloc(total_bytes);
- total_bytes = 0;
- for (k = 0; k < extralines; k++)
- {
- for (l = 0; l < full_blocks; l++)
- {
- buf[total_bytes++] = 129;
- buf[total_bytes++] = 0;
- }
- if (leftover == 1)
- {
- buf[total_bytes++] = 1;
- buf[total_bytes++] = 0;
- }
- else if (leftover > 0)
- {
- buf[total_bytes++] = 257 - leftover;
- buf[total_bytes++] = 0;
- }
- }
- stp_zfwrite((const char *) buf, total_bytes, 1, v);
- stp_free(buf);
-}
-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;
-
- 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)
- {
- 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(sw, pass, model, v);
- set_color(sw, pass, model, v, j);
- set_horizontal_position(sw, pass, model, v, hoffset, ydpi, xdpi,
- vertical_subpass);
- send_print_command(sw, pass, model, j, lwidth, v, hoffset, ydpi,
- xdpi, physical_xdpi, nlines);
-
- /*
- * Send the data
- */
- stp_zfwrite((const char *)bufs[0].v[j], lineoffs[0].v[j], 1, v);
- if (extralines)
- send_extra_data(sw, v, extralines, lwidth);
- stp_putc('\r', v);
- pd->printed_something = 1;
- }
- lineoffs[0].v[j] = 0;
- linecount[0].v[j] = 0;
- }
+/* Module header */
+#define stp_module_version print_escp2_LTX_stp_module_version
+#define stp_module_data print_escp2_LTX_stp_module_data
+
+stp_module_version_t stp_module_version = {0, 0};
+
+stp_module_t stp_module_data =
+ {
+ "escp2",
+ VERSION,
+ "Epson family driver",
+ STP_MODULE_CLASS_FAMILY,
+ NULL,
+ print_escp2_module_init,
+ print_escp2_module_exit,
+ (void *) &print_escp2_module_data
+ };
- sw->last_pass = pass->pass;
- pass->pass = -1;
-}
diff --git a/src/main/print-escp2.h b/src/main/print-escp2.h
index f289f95..2e0df38 100644
--- a/src/main/print-escp2.h
+++ b/src/main/print-escp2.h
@@ -1,5 +1,5 @@
/*
- * "$Id: print-escp2.h,v 1.7.4.9 2003/12/02 01:51:00 rlk Exp $"
+ * "$Id: print-escp2.h,v 1.94 2005/06/14 02:49:10 rlk Exp $"
*
* Print plug-in EPSON ESC/P2 driver for the GIMP.
*
@@ -21,6 +21,20 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+#ifndef GUTENPRINT_INTERNAL_ESCP2_H
+#define GUTENPRINT_INTERNAL_ESCP2_H
+
+/*
+ * Maximum number of channels in a printer. If Epson comes out with an
+ * 8-head printer, this needs to be increased.
+ */
+#define PHYSICAL_CHANNEL_LIMIT 8
+#define MAX_DROP_SIZES 3
+
+#define XCOLOR_R (STP_NCOLORS + 0)
+#define XCOLOR_B (STP_NCOLORS + 1)
+#define XCOLOR_GLOSS (STP_NCOLORS + 2)
+
/*
* Printer capabilities.
*
@@ -31,6 +45,222 @@ typedef unsigned long model_cap_t;
typedef unsigned long model_featureset_t;
+#define RES_LOW 0
+#define RES_360 1
+#define RES_720_360 2
+#define RES_720 3
+#define RES_1440_720 4
+#define RES_2880_720 5
+#define RES_2880_1440 6
+#define RES_2880_2880 7
+#define RES_N 8
+
+/*
+ ****************************************************************
+ * *
+ * DROP SIZES *
+ * *
+ ****************************************************************
+ */
+
+typedef struct
+{
+ const char *listname;
+ short numdropsizes;
+ const double dropsizes[MAX_DROP_SIZES];
+} escp2_dropsize_t;
+
+typedef const escp2_dropsize_t *const escp2_drop_list_t[RES_N];
+
+/*
+ ****************************************************************
+ * *
+ * PAPERS *
+ * *
+ ****************************************************************
+ */
+
+typedef struct
+{
+ const char *name;
+ float base_density;
+ float subchannel_cutoff;
+ float k_transition;
+ float k_lower;
+ float k_upper;
+ float cyan;
+ float magenta;
+ float yellow;
+ float black;
+ float saturation;
+ float gamma;
+ const char *hue_adjustment;
+ const char *lum_adjustment;
+ const char *sat_adjustment;
+} paper_adjustment_t;
+
+typedef struct
+{
+ const char *listname;
+ short paper_count;
+ const paper_adjustment_t *papers;
+} paper_adjustment_list_t;
+
+typedef enum
+{
+ PAPER_PLAIN = 0x01,
+ PAPER_GOOD = 0x02,
+ PAPER_PHOTO = 0x04,
+ PAPER_PREMIUM_PHOTO = 0x08,
+ PAPER_TRANSPARENCY = 0x10
+} paper_class_t;
+
+typedef struct
+{
+ const char *name;
+ const char *text;
+ paper_class_t paper_class;
+ short paper_feed_sequence;
+ short platen_gap;
+ short feed_adjustment;
+ short vacuum_intensity;
+ short paper_thickness;
+ const char *preferred_ink_type;
+ const char *preferred_ink_set;
+} paper_t;
+
+typedef struct
+{
+ const char *listname;
+ short paper_count;
+ const paper_t *papers;
+} paperlist_t;
+
+
+/*
+ ****************************************************************
+ * *
+ * RESOLUTIONS *
+ * *
+ ****************************************************************
+ */
+
+typedef struct
+{
+ const char *name;
+ const char *text;
+ short hres;
+ short vres;
+ short printed_hres;
+ short printed_vres;
+ short softweave;
+ short printer_weave;
+ short vertical_passes;
+} res_t;
+
+
+/*
+ ****************************************************************
+ * *
+ * INKS *
+ * *
+ ****************************************************************
+ */
+
+typedef struct
+{
+ short color;
+ short subchannel;
+ short head_offset;
+ const char *channel_density;
+ const char *subchannel_scale;
+} physical_subchannel_t;
+
+typedef struct
+{
+ const char *curve_name;
+ const char *curve;
+ stp_curve_t *curve_impl;
+} hue_curve_t;
+
+typedef struct
+{
+ const char *listname;
+ const physical_subchannel_t *subchannels;
+ short n_subchannels;
+ hue_curve_t *hue_curve;
+} ink_channel_t;
+
+typedef enum
+{
+ INKSET_CMYK = 0,
+ INKSET_CcMmYK = 1,
+ INKSET_CcMmYyK = 2,
+ INKSET_CcMmYKk = 3,
+ INKSET_QUADTONE = 4,
+ INKSET_CMYKRB = 5,
+ INKSET_EXTENDED = 6
+} inkset_id_t;
+
+typedef struct
+{
+ const char *name;
+ const ink_channel_t *const *channels;
+ const ink_channel_t *const *aux_channels;
+ short channel_count;
+ short aux_channel_count;
+} channel_set_t;
+
+typedef struct
+{
+ const char *name;
+ const char *text;
+ inkset_id_t inkset;
+ const channel_set_t *channel_set;
+} escp2_inkname_t;
+
+typedef struct
+{
+ int n_shades;
+ const double shades[PHYSICAL_CHANNEL_LIMIT];
+} shade_t;
+
+typedef shade_t shade_set_t[PHYSICAL_CHANNEL_LIMIT];
+
+typedef struct
+{
+ const char *name;
+ const char *text;
+ const escp2_inkname_t *const *inknames;
+ const paperlist_t *papers;
+ const paper_adjustment_list_t *paper_adjustments;
+ const shade_set_t *shades;
+ short n_inks;
+} inklist_t;
+
+typedef struct
+{
+ const char *listname;
+ const inklist_t *const *inklists;
+ short n_inklists;
+} inkgroup_t;
+
+typedef struct
+{
+ const char *listname;
+ int count;
+ const char *const *names;
+} channel_name_t;
+
+
+/*
+ ****************************************************************
+ * *
+ * MISCELLANEOUS *
+ * *
+ ****************************************************************
+ */
+
/*
* For each printer, we can select from a variety of dot sizes.
* For single dot size printers, the available sizes are usually 0,
@@ -48,105 +278,85 @@ typedef unsigned long model_featureset_t;
* An entry of -1 in a slot means that this resolution is not available.
*/
-typedef int escp2_dot_size_t[13];
+typedef short escp2_dot_size_t[RES_N];
/*
* Choose the number of bits to use at each resolution.
*/
-typedef int escp2_bits_t[13];
+typedef short escp2_bits_t[RES_N];
/*
* Choose the base resolution to use at each resolution.
*/
-typedef int escp2_base_resolutions_t[13];
+typedef short escp2_base_resolutions_t[RES_N];
/*
* Specify the base density for each available resolution.
* This obviously depends upon the dot size.
*/
-typedef double escp2_densities_t[13];
+typedef float escp2_densities_t[RES_N];
-/*
- * 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.
- */
+#define ROLL_FEED_CUT_ALL (1)
+#define ROLL_FEED_CUT_LAST (2)
+#define ROLL_FEED_DONT_EJECT (4)
-#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
-
-typedef struct escp2_variable_ink
+typedef struct
{
- 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];
+ const char *name;
+ const char *text;
+ short is_cd;
+ short is_roll_feed;
+ unsigned roll_feed_cut_flags;
+ const stp_raw_t init_sequence;
+ const stp_raw_t deinit_sequence;
+} input_slot_t;
-typedef const escp2_variable_inkset_t *escp2_variable_inklist_t[][RES_N / 2];
+typedef struct
+{
+ const input_slot_t *slots;
+ size_t n_input_slots;
+} input_slot_list_t;
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;
+ short min_hres;
+ short min_vres;
+ short max_hres;
+ short max_vres;
+ short desired_hres;
+ short desired_vres;
+} quality_t;
typedef struct
{
- int paper_count;
- const paper_t *papers;
-} paperlist_t;
+ const quality_t *qualities;
+ size_t n_quals;
+} quality_list_t;
+typedef enum
+{
+ AUTO_MODE_QUALITY,
+ AUTO_MODE_MANUAL
+} auto_mode_t;
+
+typedef struct
+{
+ const char *name;
+ const char *text;
+ short value;
+} printer_weave_t;
+
+typedef struct
+{
+ const char *name;
+ size_t n_printer_weaves;
+ const printer_weave_t *printer_weaves;
+} printer_weave_list_t;
#define MODEL_COMMAND_MASK 0xful /* What general command set does */
#define MODEL_COMMAND_1998 0x0ul
@@ -158,160 +368,90 @@ typedef struct
#define MODEL_XZEROMARGIN_NO 0x00ul /* zero margin mode? */
#define MODEL_XZEROMARGIN_YES 0x10ul /* (print to edge of the paper) */
-#define MODEL_ROLLFEED_MASK 0x20ul /* Does this printer support */
-#define MODEL_ROLLFEED_NO 0x00ul /* a roll feed? */
-#define MODEL_ROLLFEED_YES 0x20ul
-
-#define MODEL_VARIABLE_DOT_MASK 0x40ul /* Does this printer support var */
+#define MODEL_VARIABLE_DOT_MASK 0x20ul /* Does this printer support var */
#define MODEL_VARIABLE_NO 0x00ul /* dot size printing? The newest */
-#define MODEL_VARIABLE_YES 0x40ul /* printers support multiple modes */
+#define MODEL_VARIABLE_YES 0x20ul /* printers support multiple modes */
-#define MODEL_GRAYMODE_MASK 0x80ul /* Does this printer support special */
+#define MODEL_GRAYMODE_MASK 0x40ul /* Does this printer support special */
#define MODEL_GRAYMODE_NO 0x00ul /* fast black printing? */
-#define MODEL_GRAYMODE_YES 0x80ul
+#define MODEL_GRAYMODE_YES 0x40ul
-#define MODEL_VACUUM_MASK 0x100ul
-#define MODEL_VACUUM_NO 0x000ul
-#define MODEL_VACUUM_YES 0x100ul
+#define MODEL_VACUUM_MASK 0x80ul
+#define MODEL_VACUUM_NO 0x00ul
+#define MODEL_VACUUM_YES 0x80ul
-#define MODEL_FAST_360_MASK 0x200ul
+#define MODEL_FAST_360_MASK 0x100ul
#define MODEL_FAST_360_NO 0x000ul
-#define MODEL_FAST_360_YES 0x200ul
+#define MODEL_FAST_360_YES 0x100ul
+
+#define MODEL_SEND_ZERO_ADVANCE_MASK 0x200ul
+#define MODEL_SEND_ZERO_ADVANCE_NO 0x000ul
+#define MODEL_SEND_ZERO_ADVANCE_YES 0x200ul
+
+#define MODEL_SUPPORTS_INK_CHANGE_MASK 0x400ul
+#define MODEL_SUPPORTS_INK_CHANGE_NO 0x000ul
+#define MODEL_SUPPORTS_INK_CHANGE_YES 0x400ul
+
+#define MODEL_PACKET_MODE_MASK 0x800ul
+#define MODEL_PACKET_MODE_NO 0x000ul
+#define MODEL_PACKET_MODE_YES 0x800ul
typedef enum
{
MODEL_COMMAND,
MODEL_XZEROMARGIN,
- MODEL_ROLLFEED,
MODEL_VARIABLE_DOT,
MODEL_GRAYMODE,
MODEL_VACUUM,
MODEL_FAST_360,
+ MODEL_SEND_ZERO_ADVANCE,
+ MODEL_SUPPORTS_INK_CHANGE,
+ MODEL_PACKET_MODE,
MODEL_LIMIT
} escp2_model_option_t;
-typedef struct
-{
- const char *attr_name;
- int shift;
- int bits;
-} escp2_printer_attr_t;
-
-typedef struct
-{
- const char *name;
- const char *text;
- int hres;
- int vres;
- int external_hres;
- int external_vres;
- int softweave;
- int interleave;
- int vertical_passes;
- int vertical_oversample;
- int unidirectional;
- int vertical_undersample;
- int vertical_denominator;
- int resid;
-} res_t;
-
-typedef struct
-{
- int color;
- int density;
- int head_offset;
-} physical_subchannel_t;
-
-typedef struct
-{
- const physical_subchannel_t *channels;
- int n_subchannels;
-} ink_channel_t;
-
-typedef enum
-{
- INKSET_CMYK = 0,
- INKSET_CcMmYK = 1,
- INKSET_CcMmYyK = 2,
- INKSET_CcMmYKk = 3,
- INKSET_PIEZO_QUADTONE = 4
-} inkset_id_t;
-
-typedef struct
-{
- const char *name;
- const char *text;
- int is_color;
- inkset_id_t inkset;
- double k_lower;
- double k_upper;
- const double *lum_adjustment;
- const double *hue_adjustment;
- const double *sat_adjustment;
- const ink_channel_t *channels[NCOLORS];
-} escp2_inkname_t;
-
-typedef struct
-{
- const escp2_inkname_t *const *inknames;
- size_t n_inks;
-} inklist_t;
-
-#define ROLL_FEED_CUT_ALL (1)
-#define ROLL_FEED_CUT_LAST (2)
-
-typedef struct
-{
- const char *data;
- size_t length;
-} init_sequence_t;
-
-typedef struct
-{
- const char *name;
- const char *text;
- int is_roll_feed;
- unsigned roll_feed_cut_flags;
- init_sequence_t init_sequence;
- init_sequence_t deinit_sequence;
-} input_slot_t;
-
-typedef struct
-{
- const input_slot_t *slots;
- size_t n_input_slots;
-} input_slot_list_t;
-
typedef struct escp2_printer
{
model_cap_t flags; /* Bitmask of flags, see above */
/*****************************************************************************/
/* Basic head configuration */
- 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 fast_nozzles; /* Number of fast nozzles */
- int min_fast_nozzles; /* # of fast nozzles (may be extra) */
- int fast_nozzle_separation; /* Separation between rows */
+ short nozzles; /* Number of nozzles per color */
+ short min_nozzles; /* Minimum number of nozzles per color */
+ short nozzle_separation; /* Separation between rows, in 1/360" */
+ short black_nozzles; /* Number of black nozzles (may be extra) */
+ short min_black_nozzles; /* # of black nozzles (may be extra) */
+ short black_nozzle_separation; /* Separation between rows */
+ short fast_nozzles; /* Number of fast nozzles */
+ short min_fast_nozzles; /* # of fast nozzles (may be extra) */
+ short fast_nozzle_separation; /* Separation between rows */
+ short physical_channels; /* Number of ink channels */
/*****************************************************************************/
/* Print head resolution */
- int base_separation; /* Basic unit of row separation */
- int base_resolution; /* Base hardware line 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 */
+ short base_separation; /* Basic unit of row separation */
+ short resolution_scale; /* Scaling factor for ESC(D command */
+ short 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;
+ short max_hres;
+ short max_vres;
+ short min_hres;
+ short min_vres;
+ /* Miscellaneous printer-specific data */
+ short extra_feed; /* Extra distance the paper can be spaced */
+ /* beyond the bottom margin, in 1/360". */
+ /* (maximum useful value is */
+ /* nozzles * nozzle_separation) */
+ short separation_rows; /* Some printers require funky spacing */
+ /* arguments in softweave mode. */
+ short pseudo_separation_rows;/* Some printers require funky */
+ /* spacing arguments in printer_weave mode */
+
+ short zero_margin_offset; /* Offset to use to achieve */
+ /* zero-margin printing */
+ short initial_vertical_offset;
+ short black_initial_vertical_offset;
+ short extra_720dpi_separation;
/*****************************************************************************/
/* Paper size limits */
int max_paper_width; /* Maximum paper width, in points */
@@ -322,58 +462,247 @@ typedef struct escp2_printer
/* Borders */
/* SHEET FED: */
/* 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 */
- /* Printer interleave: */
- 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 */
+ short left_margin; /* Left margin, points */
+ short right_margin; /* Right margin, points */
+ short top_margin; /* Absolute top margin, points */
+ short bottom_margin; /* Absolute bottom margin, points */
+ /* Printer weave: */
+ short m_left_margin; /* Left margin, points */
+ short m_right_margin; /* Right margin, points */
+ short m_top_margin; /* Absolute top margin, points */
+ short m_bottom_margin; /* Absolute bottom margin, points */
/* ROLL FEED: */
/* Softweave: */
- int roll_left_margin; /* Left margin, points */
- int roll_right_margin; /* Right margin, points */
- int roll_top_margin; /* Absolute top margin, points */
- int roll_bottom_margin; /* Absolute bottom margin, points */
- /* Printer interleave: */
- int m_roll_left_margin; /* Left margin, points */
- int m_roll_right_margin; /* Right margin, points */
- int m_roll_top_margin; /* Absolute top margin, points */
- int m_roll_bottom_margin; /* Absolute bottom margin, points */
+ short roll_left_margin; /* Left margin, points */
+ short roll_right_margin; /* Right margin, points */
+ short roll_top_margin; /* Absolute top margin, points */
+ short roll_bottom_margin; /* Absolute bottom margin, points */
+ /* Printer weave: */
+ short m_roll_left_margin; /* Left margin, points */
+ short m_roll_right_margin; /* Right margin, points */
+ short m_roll_top_margin; /* Absolute top margin, points */
+ short m_roll_bottom_margin; /* Absolute bottom margin, points */
+ /* Print directly to CD */
+ short cd_x_offset; /* Center of CD (horizontal offset) */
+ short cd_y_offset; /* Center of CD (vertical offset) */
+ short cd_page_width; /* Width of "page" when printing to CD */
+ short cd_page_height; /* Height of "page" when printing to CD */
/*****************************************************************************/
- /* Miscellaneous printer-specific data */
- 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 interleave 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 */
- int initial_vertical_offset;
- int black_initial_vertical_offset;
- int extra_720dpi_separation;
-
+ /* Parameters for escputil */
+ short alignment_passes;
+ short alignment_choices;
+ short alternate_alignment_passes;
+ short alternate_alignment_choices;
/*****************************************************************************/
- 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 short *dot_sizes; /* Vector of dot sizes for resolutions */
+ const float *densities; /* List of densities for each printer */
+ const escp2_drop_list_t *drops; /* Drop sizes */
/*****************************************************************************/
- const paperlist_t *paperlist;
- const res_t *reslist;
- const inklist_t *inklist;
+ const res_t *const *reslist;
+ const inkgroup_t *inkgroup;
/*****************************************************************************/
- const int *bits;
- const int *base_resolutions;
+ const short *bits;
+ const short *base_resolutions;
const input_slot_list_t *input_slots;
/*****************************************************************************/
- const init_sequence_t *preinit_sequence;
- const init_sequence_t *postinit_remote_sequence;
-} escp2_stp_printer_t;
+ const quality_list_t *quality_list;
+ const stp_raw_t *preinit_sequence;
+ const stp_raw_t *postinit_remote_sequence;
+/*****************************************************************************/
+ const printer_weave_list_t *const printer_weaves;
+ const channel_name_t *channel_names;
+} stpi_escp2_printer_t;
+
+extern const stpi_escp2_printer_t stpi_escp2_model_capabilities[];
+extern const int stpi_escp2_model_limit;
+
+extern const escp2_drop_list_t stpi_escp2_simple_drops;
+extern const escp2_drop_list_t stpi_escp2_spro10000_drops;
+extern const escp2_drop_list_t stpi_escp2_variable_1_5pl_drops;
+extern const escp2_drop_list_t stpi_escp2_variable_2pl_drops;
+extern const escp2_drop_list_t stpi_escp2_variable_3pl_drops;
+extern const escp2_drop_list_t stpi_escp2_variable_3pl_pigment_drops;
+extern const escp2_drop_list_t stpi_escp2_variable_3pl_pigment_c66_drops;
+extern const escp2_drop_list_t stpi_escp2_variable_3pl_pmg_drops;
+extern const escp2_drop_list_t stpi_escp2_variable_1440_4pl_drops;
+extern const escp2_drop_list_t stpi_escp2_variable_ultrachrome_drops;
+extern const escp2_drop_list_t stpi_escp2_variable_2880_4pl_drops;
+extern const escp2_drop_list_t stpi_escp2_variable_6pl_drops;
+extern const escp2_drop_list_t stpi_escp2_variable_2000p_drops;
+extern const escp2_drop_list_t stpi_escp2_variable_x80_6pl_drops;
+
+extern const paperlist_t stpi_escp2_standard_paper_list;
+extern const paperlist_t stpi_escp2_durabrite_paper_list;
+extern const paperlist_t stpi_escp2_durabrite2_paper_list;
+extern const paperlist_t stpi_escp2_ultrachrome_paper_list;
+extern const paperlist_t stpi_escp2_r800_paper_list;
+
+extern const paper_adjustment_list_t stpi_escp2_standard_paper_adjustment_list;
+extern const paper_adjustment_list_t stpi_escp2_durabrite_paper_adjustment_list;
+extern const paper_adjustment_list_t stpi_escp2_durabrite2_paper_adjustment_list;
+extern const paper_adjustment_list_t stpi_escp2_photo_paper_adjustment_list;
+extern const paper_adjustment_list_t stpi_escp2_photo2_paper_adjustment_list;
+extern const paper_adjustment_list_t stpi_escp2_photo3_paper_adjustment_list;
+extern const paper_adjustment_list_t stpi_escp2_sp960_paper_adjustment_list;
+extern const paper_adjustment_list_t stpi_escp2_ultrachrome_photo_paper_adjustment_list;
+extern const paper_adjustment_list_t stpi_escp2_ultrachrome_matte_paper_adjustment_list;
+extern const paper_adjustment_list_t stpi_escp2_r800_photo_paper_adjustment_list;
+extern const paper_adjustment_list_t stpi_escp2_r800_matte_paper_adjustment_list;
+
+extern const res_t *const stpi_escp2_superfine_reslist[];
+extern const res_t *const stpi_escp2_no_printer_weave_reslist[];
+extern const res_t *const stpi_escp2_pro_reslist[];
+extern const res_t *const stpi_escp2_sp5000_reslist[];
+extern const res_t *const stpi_escp2_720dpi_reslist[];
+extern const res_t *const stpi_escp2_720dpi_soft_reslist[];
+extern const res_t *const stpi_escp2_g3_720dpi_reslist[];
+extern const res_t *const stpi_escp2_1440dpi_reslist[];
+extern const res_t *const stpi_escp2_2880dpi_reslist[];
+extern const res_t *const stpi_escp2_2880_1440dpi_reslist[];
+extern const res_t *const stpi_escp2_g3_reslist[];
+extern const res_t *const stpi_escp2_sc500_reslist[];
+extern const res_t *const stpi_escp2_sc640_reslist[];
+
+extern const inkgroup_t stpi_escp2_cmy_inkgroup;
+extern const inkgroup_t stpi_escp2_standard_inkgroup;
+extern const inkgroup_t stpi_escp2_c80_inkgroup;
+extern const inkgroup_t stpi_escp2_c82_inkgroup;
+extern const inkgroup_t stpi_escp2_c64_inkgroup;
+extern const inkgroup_t stpi_escp2_f360_inkgroup;
+extern const inkgroup_t stpi_escp2_cx3650_inkgroup;
+extern const inkgroup_t stpi_escp2_x80_inkgroup;
+extern const inkgroup_t stpi_escp2_photo_gen1_inkgroup;
+extern const inkgroup_t stpi_escp2_photo_gen2_inkgroup;
+extern const inkgroup_t stpi_escp2_photo_gen3_inkgroup;
+extern const inkgroup_t stpi_escp2_photo_pigment_inkgroup;
+extern const inkgroup_t stpi_escp2_photo7_japan_inkgroup;
+extern const inkgroup_t stpi_escp2_ultrachrome_inkgroup;
+extern const inkgroup_t stpi_escp2_f360_photo_inkgroup;
+extern const inkgroup_t stpi_escp2_f360_photo7_japan_inkgroup;
+extern const inkgroup_t stpi_escp2_f360_ultrachrome_inkgroup;
+extern const inkgroup_t stpi_escp2_cmykrb_inkgroup;
+
+extern const escp2_inkname_t stpi_escp2_default_black_inkset;
+
+extern const printer_weave_list_t stpi_escp2_standard_printer_weave_list;
+extern const printer_weave_list_t stpi_escp2_sp2200_printer_weave_list;
+extern const printer_weave_list_t stpi_escp2_pro7000_printer_weave_list;
+extern const printer_weave_list_t stpi_escp2_pro7500_printer_weave_list;
+extern const printer_weave_list_t stpi_escp2_pro7600_printer_weave_list;
-extern const escp2_stp_printer_t stp_escp2_model_capabilities[];
+typedef struct
+{
+ /* Basic print head parameters */
+ int nozzles; /* Number of nozzles */
+ int min_nozzles; /* Fewest nozzles we're allowed to use */
+ int nozzle_separation; /* Nozzle separation, in dots */
+ int *head_offset; /* Head offset (for C80-type printers) */
+ int max_head_offset; /* Largest head offset */
+ int page_management_units; /* Page management units (dpi) */
+ int vertical_units; /* Vertical units (dpi) */
+ int horizontal_units; /* Horizontal units (dpi) */
+ int micro_units; /* Micro-units for horizontal positioning */
+ int unit_scale; /* Scale factor for units */
+ int send_zero_pass_advance; /* Send explicit command for zero advance */
+
+ /* Ink parameters */
+ int bitwidth; /* Number of bits per ink drop */
+ int drop_size; /* ID of the drop size we're using */
+ int ink_resid; /* Array index for the drop set we're using */
+ const escp2_inkname_t *inkname; /* Description of the ink set */
+ int use_aux_channels; /* Use gloss channel */
+
+ /* Ink channels */
+ int logical_channels; /* Number of logical ink channels (e.g.CMYK) */
+ int physical_channels; /* Number of physical channels (e.g. CcMmYK) */
+ int channels_in_use; /* Number of channels we're using
+ FIXME merge with physical_channels! */
+ unsigned char **cols; /* Output dithered data */
+ const physical_subchannel_t **channels; /* Description of each channel */
+
+ /* Miscellaneous printer control */
+ int use_black_parameters; /* Can we use (faster) black head parameters */
+ int use_fast_360; /* Can we use fast 360 DPI 4 color mode */
+ int advanced_command_set; /* Uses one of the advanced command sets */
+ int use_extended_commands; /* Do we use the extended commands? */
+ const input_slot_t *input_slot; /* Input slot description */
+ const paper_t *paper_type; /* Paper type */
+ const paper_adjustment_t *paper_adjustment; /* Paper adjustments */
+ const inkgroup_t *ink_group; /* Which set of inks */
+ const stp_raw_t *init_sequence; /* Initialization sequence */
+ const stp_raw_t *deinit_sequence; /* De-initialization sequence */
+ model_featureset_t command_set; /* Which command set this printer supports */
+ int variable_dots; /* Print supports variable dot sizes */
+ int has_vacuum; /* Printer supports vacuum command */
+ int has_graymode; /* Printer supports fast grayscale mode */
+ int base_separation; /* Basic unit of separation */
+ int resolution_scale; /* Scale factor for ESC(D command */
+ int printing_resolution; /* Printing resolution for this resolution */
+ int separation_rows; /* Row separation scaling */
+ int pseudo_separation_rows; /* Special row separation for some printers */
+ int extra_720dpi_separation; /* Special separation needed at 720 DPI */
+
+ /* weave parameters */
+ int horizontal_passes; /* Number of horizontal passes required
+ to print a complete row */
+ int physical_xdpi; /* Horizontal distance between dots in pass */
+ const res_t *res; /* Description of the printing resolution */
+ const printer_weave_t *printer_weave; /* Printer weave parameters */
+ int use_printer_weave; /* Use the printer weaving mechanism */
+
+ /* page parameters */ /* Indexed from top left */
+ int page_left; /* Left edge of page (points) */
+ int page_right; /* Right edge of page (points) */
+ int page_top; /* Top edge of page (points) */
+ int page_bottom; /* Bottom edge of page (points) */
+ int page_width; /* Page width (points) */
+ int page_height; /* Page height (points) */
+ int page_true_height; /* Physical page height (points) */
+ int cd_x_offset; /* CD X offset (micro units) */
+ int cd_y_offset; /* CD Y offset (micro units) */
+ int cd_outer_radius; /* CD radius (micro units) */
+ int cd_inner_radius; /* CD radius (micro units) */
+
+ /* Image parameters */ /* Indexed from top left */
+ int image_height; /* Height of printed region (points) */
+ int image_width; /* Width of printed region (points) */
+ int image_top; /* First printed row (points) */
+ int image_left; /* Left edge of image (points) */
+ int image_scaled_width; /* Width of physical printed region (dots) */
+ int image_printed_width; /* Width of printed region (dots) */
+ int image_scaled_height; /* Height of physical printed region (dots) */
+ int image_printed_height; /* Height of printed region (dots) */
+ int image_left_position; /* Left dot position of image */
+
+ /* Transitory state */
+ int printed_something; /* Have we actually printed anything? */
+ int initial_vertical_offset; /* Vertical offset for C80-type printers */
+ int printing_initial_vertical_offset; /* Vertical offset, for print cmd */
+ int last_color; /* Last color we printed */
+ int last_pass_offset; /* Starting row of last pass we printed */
+ int last_pass; /* Last pass printed */
+
+} escp2_privdata_t;
+
+extern void stpi_escp2_init_printer(stp_vars_t *v);
+extern void stpi_escp2_deinit_printer(stp_vars_t *v);
+extern void stpi_escp2_flush_pass(stp_vars_t *v, int passno,
+ int vertical_subpass);
+extern void stpi_escp2_terminate_page(stp_vars_t *v);
+
+#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
+
+#endif /* GUTENPRINT_INTERNAL_ESCP2_H */
+/*
+ * End of "$Id: print-escp2.h,v 1.94 2005/06/14 02:49:10 rlk Exp $".
+ */
diff --git a/src/main/print-lexmark.c b/src/main/print-lexmark.c
index 018d5ba..64d4075 100644
--- a/src/main/print-lexmark.c
+++ b/src/main/print-lexmark.c
@@ -1,5 +1,6 @@
+
/*
- * "$Id: print-lexmark.c,v 1.65.2.9 2003/10/16 11:51:10 rlk Exp $"
+ * "$Id: print-lexmark.c,v 1.149 2005/05/08 03:10:38 rlk Exp $"
*
* Print plug-in Lexmark driver for the GIMP.
*
@@ -57,21 +58,34 @@
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#include <gimp-print/gimp-print.h>
-#include "gimp-print-internal.h"
-#include <gimp-print/gimp-print-intl-internal.h>
+#include <gutenprint/gutenprint.h>
+#include <gutenprint/gutenprint-intl-internal.h>
+#include "gutenprint-internal.h"
#include <string.h>
#ifdef DEBUG
#include <stdio.h>
#endif
+#define STP_ECOLOR_LC 4
+#define STP_ECOLOR_LM 5
+#define STP_ECOLOR_LY 6
#define false 0
#define true 1
-#define max(a, b) ((a > b) ? a : b)
+#define max(a, b) ((a > b) ? (a) : (b))
#define INCH(x) (72 * x)
+static const stp_dotsize_t single_dotsize[] =
+{
+ { 0x1, 1.0 }
+};
+
+static const stp_shade_t photo_dither_shades[] =
+{
+ { 1.0000, 1, single_dotsize },
+ { 0.3333, 1, single_dotsize },
+};
typedef enum Lex_model { m_lex7500, m_z52=10052, m_z42=10042, m_3200=3200 } Lex_model;
@@ -80,7 +94,7 @@ typedef enum Lex_model { m_lex7500, m_z52=10052, m_z42=10042, m_3200=3200 } Le
typedef union { /* Offsets from the start of each line */
unsigned long v[NCHANNELS]; /* (really pass) */
- struct { /* IMPORTANT: order corresponds to ECOLOR_* */
+ struct { /* IMPORTANT: order corresponds to STP_ECOLOR_* */
unsigned long k;
unsigned long c;
unsigned long m;
@@ -93,7 +107,7 @@ typedef union { /* Offsets from the start of each line */
typedef union { /* Base pointers for each pass */
unsigned char *v[NCHANNELS];
- struct { /* IMPORTANT: order corresponds to ECOLOR_* */
+ struct { /* IMPORTANT: order corresponds to STP_ECOLOR_* */
unsigned char *k;
unsigned char *c;
unsigned char *m;
@@ -114,19 +128,17 @@ typedef struct testdata {
char *input_line;
} testdata;
-const stp_vars_t *dbgfileprn;
+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);
+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, lexmark_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);
+flush_pass(stp_vars_t *v, int passno, int vertical_subpass);
/*** resolution specific parameters */
#define DPI300 0
@@ -166,219 +178,50 @@ flush_pass(stp_softweave_t *sw, int passno, int model, int width,
#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 */
-};
+static const char standard_sat_adjustment[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* B */
+/* B */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* M */
+/* M */ "1.00 0.95 0.90 0.90 0.90 0.90 0.90 0.90 " /* R */
+/* R */ "0.90 0.95 0.95 1.00 1.00 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* G */
+/* G */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char standard_lum_adjustment[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "0.65 0.67 0.70 0.72 0.77 0.80 0.82 0.85 " /* B */
+/* B */ "0.87 0.86 0.82 0.79 0.79 0.82 0.85 0.88 " /* M */
+/* M */ "0.92 0.95 0.96 0.97 0.97 0.97 0.96 0.96 " /* R */
+/* R */ "0.96 0.97 0.97 0.98 0.99 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 0.97 0.95 0.94 0.93 0.92 0.90 0.86 " /* G */
+/* G */ "0.79 0.76 0.71 0.68 0.68 0.68 0.68 0.66 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char standard_hue_adjustment[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"-6\" upper-bound=\"6\">\n"
+/* C */ "0.00 0.06 0.10 0.10 0.06 -.01 -.09 -.17 " /* B */
+/* B */ "-.25 -.33 -.38 -.38 -.36 -.34 -.34 -.34 " /* M */
+/* M */ "-.34 -.34 -.36 -.40 -.50 -.40 -.30 -.20 " /* R */
+/* R */ "-.12 -.07 -.04 -.02 0.00 0.00 0.00 0.00 " /* Y */
+/* Y */ "0.00 0.00 0.00 -.05 -.10 -.15 -.22 -.24 " /* G */
+/* G */ "-.26 -.30 -.33 -.28 -.25 -.20 -.13 -.06 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
/* Codes for possible ink-tank combinations.
@@ -417,6 +260,119 @@ static const double plain_paper_lum_adjustment[49] =
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) */
+static const stp_parameter_t the_parameters[] =
+{
+ {
+ "PageSize", N_("Page Size"), N_("Basic Printer Setup"),
+ N_("Size of the paper being printed to"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "MediaType", N_("Media Type"), N_("Basic Printer Setup"),
+ N_("Type of media (plain paper, photo paper, etc.)"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "InputSlot", N_("Media Source"), N_("Basic Printer Setup"),
+ N_("Source (input slot) of the media"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "Resolution", N_("Resolution"), N_("Basic Printer Setup"),
+ N_("Resolution and quality of the print"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "InkType", N_("Ink Type"), N_("Advanced Printer Setup"),
+ N_("Type of ink in the printer"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "InkChannels", N_("Ink Channels"), N_("Advanced Printer Functionality"),
+ N_("Ink Channels"),
+ STP_PARAMETER_TYPE_INT, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_INTERNAL, 0, 0, -1, 0, 0
+ },
+ {
+ "PrintingMode", N_("Printing Mode"), N_("Core Parameter"),
+ N_("Printing Output Mode"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+};
+
+static const int the_parameter_count =
+sizeof(the_parameters) / sizeof(const stp_parameter_t);
+
+typedef struct
+{
+ const stp_parameter_t param;
+ double min;
+ double max;
+ double defval;
+ int color_only;
+} float_param_t;
+
+static const float_param_t float_parameters[] =
+{
+ {
+ {
+ "CyanDensity", N_("Cyan Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the cyan balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 1, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "MagentaDensity", N_("Magenta Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the magenta balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 2, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "YellowDensity", N_("Yellow Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the yellow balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 3, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "BlackDensity", N_("Black Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the black balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 0, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "LightCyanTransition", N_("Light Cyan Transition"), N_("Advanced Ink Adjustment"),
+ N_("Light Cyan Transition"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, -1, 1, 0
+ }, 0.0, 5.0, 1.0, 1
+ },
+ {
+ {
+ "LightMagentaTransition", N_("Light Magenta Transition"), N_("Advanced Ink Adjustment"),
+ N_("Light Magenta Transition"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, -1, 1, 0
+ }, 0.0, 5.0, 1.0, 1
+ },
+};
+
+static const int float_parameter_count =
+sizeof(float_parameters) / sizeof(const float_param_t);
+
/* returns the offset of the first jet when printing in the other direction */
static int get_lr_shift(int mode)
{
@@ -508,7 +464,6 @@ 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 */
@@ -522,7 +477,7 @@ typedef struct
{
const char *name;
const char *text;
- lexmark_inkparam_t ink_parameter[4];
+ lexmark_inkparam_t ink_parameter[2];
} lexmark_inkname_t;
@@ -551,9 +506,9 @@ typedef struct {
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;
+ const char *lum_adjustment;
+ const char *hue_adjustment;
+ const char *sat_adjustment;
} lexmark_cap_t;
@@ -644,30 +599,20 @@ static const lexmark_inkname_t ink_types_z52[] =
* 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 }}},
+ {{ 1, COLOR_MODE_K, 208, 324, 0, 10, head_offset_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 }}},
+ {{ 1, COLOR_MODE_K, 208, 324, 0, 10, head_offset_cmyk }, /* we ignor CMY, use black */
+ { 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 }}},
+ {{ 1, COLOR_MODE_K, 192/3, 0, 0, 10, head_offset_cCmMyk },
+ { 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 }}},
+ {{ 1, COLOR_MODE_K, 208, 324, 0, 10, head_offset_cCmMyk },
+ { 5, COLOR_MODE_CcMcY, 192/3, 0, 0, 10, head_offset_cCmMyk }}}, /* we ignor CMY, use black */
{ "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 }}},
+ {{ 1, COLOR_MODE_K, 208, 324, 0, 10, head_offset_cmyk },
+ { 1, COLOR_MODE_K, 208, 324, 0, 10, head_offset_cmyk }}},
{ NULL, NULL }
};
@@ -724,25 +669,17 @@ static const lexmark_inkname_t ink_types_3200[] =
* 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 }}},
+ {{ 1, COLOR_MODE_K, 208, 20, 0, 12, head_offset_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 }}},
+ {{ 1, COLOR_MODE_K, 208, 20, 0, 12, head_offset_cmyk }, /* we ignor CMY, use black */
+ { 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 }}},
+ {{ 1, COLOR_MODE_K, 192/3, 0, 0, 12, head_offset_cCmMyk },
+ { 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 }}},
+ {{ 1, COLOR_MODE_K, 208, 20, 0, 12, head_offset_cCmMyk }, /* we ignor CMY, use black */
+ { 5, COLOR_MODE_CcMcY, 192/3, 0, 0, 12, head_offset_cCmMyk }}},
{ NULL, NULL }
};
@@ -841,6 +778,17 @@ 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 */
+ int hoffset;
+ int model;
+ int width;
+ int ydpi;
+ int xdpi;
+ int physical_xdpi;
+ int last_pass_offset;
+ int jets;
+ int bitwidth;
+ int ncolors;
+ int horizontal_weave;
unsigned char *outbuf;
} lexm_privdata_weave;
@@ -897,9 +845,9 @@ typedef struct
int feed_adjustment;
int vacuum_intensity;
int paper_thickness;
- const double *hue_adjustment;
- const double *lum_adjustment;
- const double *sat_adjustment;
+ const char *hue_adjustment;
+ const char *lum_adjustment;
+ const char *sat_adjustment;
} paper_t;
@@ -908,70 +856,83 @@ static const paper_t lexmark_paper_list[] =
{
{ "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},
+ 1, 1.0, 0x6b, 0x1a, 0x01,
+ standard_hue_adjustment, standard_lum_adjustment, standard_sat_adjustment},
{ "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},
+ 1, 1.0, 0x6d, 0x00, 0x01,
+ standard_hue_adjustment, standard_lum_adjustment, standard_sat_adjustment},
{ "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},
+ 1.0, 1.0, 0x6d, 0x00, 0x02,
+ standard_hue_adjustment, standard_lum_adjustment, standard_sat_adjustment},
{ "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},
+ 1, 1.0, 0x6b, 0x1a, 0x01,
+ standard_hue_adjustment, standard_lum_adjustment, standard_sat_adjustment},
{ "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},
+ 1, 1.0, 0x00, 0x00, 0x02,
+ standard_hue_adjustment, standard_sat_adjustment, standard_sat_adjustment},
{ "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},
+ 1, 1.0, 0x6b, 0x1a, 0x01,
+ standard_hue_adjustment, standard_lum_adjustment, standard_sat_adjustment},
{ "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},
+ 1, 1.0, 0x6b, 0x1a, 0x01,
+ standard_hue_adjustment, standard_lum_adjustment, standard_sat_adjustment},
{ "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},
+ 1, 1.0, 0x67, 0x00, 0x02,
+ standard_hue_adjustment, standard_lum_adjustment, standard_sat_adjustment},
{ "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, NULL, NULL, NULL},
+ 1, 1.0, 0x80, 0x00, 0x02,
+ standard_hue_adjustment, standard_lum_adjustment, standard_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},
+ 1.0, 1.0, 0x80, 0x00, 0x02,
+ standard_hue_adjustment, standard_lum_adjustment, standard_sat_adjustment},
{ "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},
+ 1.0, 1.0, 0x6b, 0x1a, 0x01,
+ standard_hue_adjustment, standard_lum_adjustment, standard_sat_adjustment},
{ "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 },
+ 1, 1.0, 0x80, 0x00, 0x02,
+ standard_hue_adjustment, standard_lum_adjustment, standard_sat_adjustment},
{ "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},
+ 1, 1.0, 0x6b, 0x1a, 0x01,
+ standard_hue_adjustment, standard_lum_adjustment, standard_sat_adjustment},
};
static const int paper_type_count = sizeof(lexmark_paper_list) / sizeof(paper_t);
static const lexmark_inkname_t *
-lexmark_get_ink_type(const char *name, int output_type, const lexmark_cap_t * caps)
+lexmark_get_ink_type(const char *name, int printing_color, const lexmark_cap_t * caps)
{
- int i;
+ int i = 0;
const lexmark_inkname_t *ink_type = caps->ink_types;
- for (i=0; ((ink_type[i].name != NULL) &&
- (strcmp(name, ink_type[i].name) != 0)); i++) ;
+ if (name)
+ 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)
+lexmark_get_ink_parameter(const char *name, int printing_color, const lexmark_cap_t * caps, const stp_vars_t *nv)
{
- int i;
- const lexmark_inkname_t *ink_type = lexmark_get_ink_type(name, output_type, caps);
+ const lexmark_inkname_t *ink_type = lexmark_get_ink_type(name, printing_color, 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]);
+ return &(ink_type->ink_parameter[printing_color]);
}
@@ -979,10 +940,13 @@ 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 (name)
{
- if (!strcmp(name, lexmark_paper_list[i].name))
- return &(lexmark_paper_list[i]);
+ for (i = 0; i < paper_type_count; i++)
+ {
+ if (!strcmp(name, lexmark_paper_list[i].name))
+ return &(lexmark_paper_list[i]);
+ }
}
return NULL;
}
@@ -990,9 +954,12 @@ get_media_type(const char *name, const lexmark_cap_t * caps)
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;
+ if (name)
+ {
+ 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);
@@ -1033,13 +1000,13 @@ 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)
+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));
+ 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);
+ const char *name = pp->name;
/* built ins: */
if (!strcmp(name,"A5")) return 0x01;
if (!strcmp(name,"A4")) return 0x03;
@@ -1065,45 +1032,37 @@ lexmark_size_type(const stp_vars_t v, const lexmark_cap_t * caps)
#endif
-static int lexmark_get_phys_resolution_vertical(const stp_printer_t printer)
+static int lexmark_get_phys_resolution_vertical(int model)
{
return 600;
}
#if 0
-static int lexmark_get_phys_resolution_horizontal(const stp_printer_t printer)
+static int lexmark_get_phys_resolution_horizontal(int model)
{
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)
+*lexmark_get_resolution_para(int model, const char *resolution)
{
- const lexmark_cap_t * caps= lexmark_get_model_capabilities(stp_printer_get_model(printer));
+ const lexmark_cap_t * caps= lexmark_get_model_capabilities(model);
const lexmark_res_t *res = *(caps->res_parameters); /* get the resolution specific parameters of printer */
-
- while (res->hres)
+ if (resolution)
{
- if ((res->vres <= caps->max_ydpi) && (caps->max_ydpi != -1) &&
- (res->hres <= caps->max_xdpi) && (caps->max_xdpi != -1) &&
- (!strcmp(resolution, res->name)))
+ while (res->hres)
{
- return res;
+ if ((res->vres <= caps->max_ydpi) && (caps->max_ydpi != -1) &&
+ (res->hres <= caps->max_xdpi) && (caps->max_xdpi != -1) &&
+ (!strcmp(resolution, res->name)))
+ {
+ return res;
+ }
+ res++;
}
- res++;
}
stp_erprintf("lexmark_get_resolution_para: resolution not found (%s)\n", resolution);
return NULL;
@@ -1111,37 +1070,37 @@ static const lexmark_res_t
static int
-lexmark_print_bidirectional(const stp_printer_t printer,
- const char *resolution)
+lexmark_print_bidirectional(int model, const char *resolution)
{
- const lexmark_res_t *res_para = lexmark_get_resolution_para(printer, resolution);
+ const lexmark_res_t *res_para = lexmark_get_resolution_para(model, resolution);
return !res_para->unidirectional;
}
-static const double *
-lexmark_lum_adjustment(const lexmark_cap_t * caps, const stp_vars_t v)
+static const char *
+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)
+static const char *
+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)
+static const char *
+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)
+lexmark_describe_resolution(const stp_vars_t *v, int *x, int *y)
{
- const lexmark_res_t *res = lexmark_get_resolution_para(printer, resolution);
+ const char *resolution = stp_get_string_parameter(v, "Resolution");
+ const lexmark_res_t *res =
+ lexmark_get_resolution_para(stp_get_model_id(v), resolution);
if (res)
{
@@ -1154,8 +1113,7 @@ lexmark_describe_resolution(const stp_printer_t printer,
}
-
-static stp_param_t media_sources[] =
+static stp_param_string_t media_sources[] =
{
{ "Auto", N_("Auto Sheet Feeder") },
{ "Manual", N_("Manual with Pause") },
@@ -1167,33 +1125,78 @@ static stp_param_t media_sources[] =
* '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 */
+static stp_parameter_list_t
+lexmark_list_parameters(const stp_vars_t *v)
{
- int i;
- stp_param_t *p= 0;
- stp_param_t *valptrs= 0;
+ stp_parameter_list_t *ret = stp_parameter_list_create();
+ int i;
+ for (i = 0; i < the_parameter_count; i++)
+ stp_parameter_list_add_param(ret, &(the_parameters[i]));
+ for (i = 0; i < float_parameter_count; i++)
+ stp_parameter_list_add_param(ret, &(float_parameters[i].param));
+ return ret;
+}
+
+static const char *
+lexmark_describe_output(const stp_vars_t *v)
+{
+ int printing_color = 0;
+ int model = stp_get_model_id(v);
+ const lexmark_cap_t *caps = lexmark_get_model_capabilities(model);
+ const char *print_mode = stp_get_string_parameter(v, "PrintingMode");
+ const char *ink_type = stp_get_string_parameter(v, "InkType");
+ const lexmark_inkparam_t *ink_parameter;
+
+ if (!print_mode || strcmp(print_mode, "Color") == 0)
+ printing_color = 1;
+
+ ink_parameter = lexmark_get_ink_parameter(ink_type, printing_color, caps, v);
- const lexmark_cap_t * caps= lexmark_get_model_capabilities(stp_printer_get_model(printer));
+ if (ink_parameter->used_colors == COLOR_MODE_K ||
+ caps->inks == LEXMARK_INK_K || !printing_color)
+ return "Grayscale";
+ else if (!(ink_parameter->used_colors & COLOR_MODE_K))
+ return "CMY";
+ else
+ return "CMYK";
+}
- if (count == NULL)
- return (NULL);
+static void
+lexmark_parameters(const stp_vars_t *v, const char *name,
+ stp_parameter_t *description)
+{
+ int i;
- *count = 0;
+ const lexmark_cap_t * caps= lexmark_get_model_capabilities(stp_get_model_id(v));
+ description->p_type = STP_PARAMETER_TYPE_INVALID;
if (name == NULL)
- return (NULL);
+ return;
+
+ for (i = 0; i < float_parameter_count; i++)
+ if (strcmp(name, float_parameters[i].param.name) == 0)
+ {
+ stp_fill_parameter_settings(description,
+ &(float_parameters[i].param));
+ description->deflt.dbl = float_parameters[i].defval;
+ description->bounds.dbl.upper = float_parameters[i].max;
+ description->bounds.dbl.lower = float_parameters[i].min;
+ return;
+ }
+
+ for (i = 0; i < the_parameter_count; i++)
+ if (strcmp(name, the_parameters[i].name) == 0)
+ {
+ stp_fill_parameter_settings(description, &(the_parameters[i]));
+ break;
+ }
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_zalloc(sizeof(stp_param_t) * papersizes);
- *count = 0;
+ description->bounds.str = stp_string_list_create();
width_limit = caps->max_paper_width;
height_limit = caps->max_paper_height;
@@ -1201,186 +1204,153 @@ lexmark_parameters(const stp_printer_t printer, /* I - Printer model */
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))
+ const stp_papersize_t *pt = stp_get_papersize_by_index(i);
+ if (strlen(pt->name) > 0 &&
+ pt->width <= width_limit && pt->height <= height_limit &&
+ (pt->height >= min_height_limit || pt->height == 0) &&
+ (pt->width >= min_width_limit || pt->width == 0))
{
- valptrs[*count].name = c_strdup(stp_papersize_get_name(pt));
- valptrs[*count].text = c_strdup(stp_papersize_get_text(pt));
- (*count)++;
+ if (stp_string_list_count(description->bounds.str) == 0)
+ description->deflt.str = pt->name;
+ stp_string_list_add_string(description->bounds.str,
+ pt->name, pt->text);
}
}
- return (valptrs);
}
else if (strcmp(name, "Resolution") == 0)
{
- int c= 0;
const lexmark_res_t *res;
+ description->bounds.str = stp_string_list_create();
res = *(caps->res_parameters); /* get resolution specific parameters of printer */
- for (i=0; res[i].hres; i++); /* get number of entries */
- valptrs = stp_zalloc(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));
+ if (stp_string_list_count(description->bounds.str) == 0)
+ description->deflt.str = res->name;
+ stp_string_list_add_string(description->bounds.str,
+ res->name, _(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_zalloc(sizeof(stp_param_t) * i);
-
- *count = 0;
+ description->bounds.str = stp_string_list_create();
+ description->deflt.str = caps->ink_types[0].name;
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;
+ stp_string_list_add_string(description->bounds.str,
+ caps->ink_types[i].name,
+ _(caps->ink_types[i].text));
}
else if (strcmp(name, "MediaType") == 0)
{
- int nmediatypes = paper_type_count;
- valptrs = stp_zalloc(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;
+ description->bounds.str = stp_string_list_create();
+ description->deflt.str = lexmark_paper_list[0].name;
+ for (i = 0; i < paper_type_count; i++)
+ stp_string_list_add_string(description->bounds.str,
+ lexmark_paper_list[i].name,
+ _(lexmark_paper_list[i].text));
}
else if (strcmp(name, "InputSlot") == 0)
{
- *count = 3;
- p = media_sources;
- }
- else
- return (NULL);
-
- valptrs = stp_zalloc(*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));
+ description->bounds.str = stp_string_list_create();
+ description->deflt.str = media_sources[0].name;
+ for (i = 0; i < sizeof(media_sources) / sizeof(stp_param_string_t); i++)
+ stp_string_list_add_string(description->bounds.str,
+ media_sources[i].name,
+ _(media_sources[i].name));
}
-
- return (valptrs);
+ else if (strcmp(name, "InkChannels") == 0)
+ {
+ if (caps->inks & LEXMARK_INK_CcMmYyK)
+ description->deflt.integer = 7;
+ else if (caps->inks & LEXMARK_INK_CcMmYK)
+ description->deflt.integer = 6;
+ else if (caps->inks & LEXMARK_INK_CMYK)
+ description->deflt.integer = 4;
+ else if (caps->inks & LEXMARK_INK_CMY)
+ description->deflt.integer = 3;
+ else
+ description->deflt.integer = 1;
+ description->bounds.integer.lower = -1;
+ description->bounds.integer.upper = -1;
+ }
+ else if (strcmp(name, "PrintingMode") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ stp_string_list_add_string
+ (description->bounds.str, "Color", _("Color"));
+ stp_string_list_add_string
+ (description->bounds.str, "BW", _("Black and White"));
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
}
-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);
+/*
+ * 'lexmark_imageable_area()' - Return the imageable area of the page.
+ */
- if (strcmp(name, "PageSize") == 0)
- {
- unsigned int height_limit, width_limit;
- unsigned int min_height_limit, min_width_limit;
- int papersizes = stp_known_papersizes();
+static void
+internal_imageable_area(const stp_vars_t *v, /* I */
+ int use_paper_margins,
+ 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 */
+ int left_margin = 0;
+ int right_margin = 0;
+ int bottom_margin = 0;
+ int top_margin = 0;
+ const char *media_size = stp_get_string_parameter(v, "PageSize");
+ const stp_papersize_t *pt = NULL;
+ const lexmark_cap_t *caps =
+ lexmark_get_model_capabilities(stp_get_model_id(v));
- 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;
+ if (media_size && use_paper_margins)
+ pt = stp_get_papersize_by_name(media_size);
- 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);
+ stp_default_media_size(v, &width, &length);
+ if (pt)
+ {
+ left_margin = pt->left;
+ right_margin = pt->right;
+ bottom_margin = pt->bottom;
+ top_margin = pt->top;
+ }
+ left_margin = max(left_margin, caps->border_left);
+ right_margin = max(right_margin, caps->border_right);
+ top_margin = max(top_margin, caps->border_top);
+ bottom_margin = max(bottom_margin, caps->border_bottom);
+
+ *left = left_margin;
+ *right = width - right_margin;
+ *top = top_margin;
+ *bottom = length - bottom_margin;
}
-
-/*
- * '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 */
+lexmark_imageable_area(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;
+ internal_imageable_area(v, 1, left, right, bottom, top);
}
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)
+lexmark_limit(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));
+ const lexmark_cap_t * caps= lexmark_get_model_capabilities(stp_get_model_id(v));
*width = caps->max_paper_width;
*height = caps->max_paper_height;
*min_width = caps->min_paper_width;
@@ -1390,8 +1360,8 @@ lexmark_limit(const stp_printer_t printer, /* I - Printer model */
static int
-lexmark_init_printer(const stp_vars_t v, const lexmark_cap_t * caps,
- int output_type,
+lexmark_init_printer(const stp_vars_t *v, const lexmark_cap_t * caps,
+ int printing_color,
const char *source_str,
int xdpi, int ydpi,
int page_width, int page_height,
@@ -1473,7 +1443,7 @@ lexmark_init_printer(const stp_vars_t v, const lexmark_cap_t * caps,
return 1;
}
-static void lexmark_deinit_printer(const stp_vars_t v, const lexmark_cap_t * caps)
+static void lexmark_deinit_printer(const stp_vars_t *v, const lexmark_cap_t * caps)
{
switch(caps->model) {
@@ -1540,7 +1510,7 @@ static void lexmark_deinit_printer(const stp_vars_t v, const lexmark_cap_t * cap
/* 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)
+static void paper_shift(const stp_vars_t *v, int offset, const lexmark_cap_t * caps)
{
switch(caps->model) {
case m_z52:
@@ -1595,17 +1565,15 @@ lexmark_advance_buffer(unsigned char *buf, int len, int num)
}
#endif
-
-static int
-clean_color(unsigned char *line, int len)
+static double
+get_double_param(stp_vars_t *v, const char *param)
{
- return 0;
+ if (param && stp_check_float_parameter(v, param, STP_PARAMETER_ACTIVE))
+ return stp_get_float_parameter(v, param);
+ else
+ return 1.0;
}
-
-
-
-
/**********************************************************
* lexmark_print() - Print an image to a LEXMARK printer.
**********************************************************/
@@ -1616,27 +1584,23 @@ clean_color(unsigned char *line, int len)
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)
+static int
+lexmark_do_print(stp_vars_t *v, stp_image_t *image)
{
- int i;
+ int status = 1;
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 */
+ int page_width, /* Width of page */
page_height, /* Length of page */
+ page_left,
+ page_top,
+ page_right,
+ page_bottom,
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 */
+ out_channels, /* Output bytes per pixel */
length, /* Length of raster data in bytes*/
buf_length, /* Length of raster data buffer (dmt) */
errdiv, /* Error dividend */
@@ -1644,13 +1608,10 @@ lexmark_print(const stp_printer_t printer, /* I - Model */
errval, /* Current error value */
errline, /* Current raster line */
errlast; /* Last raster line loaded */
- stp_convert_t colorfunc = 0; /* Color conversion function... */
- int zero_mask;
+ unsigned zero_mask;
int image_height,
- image_width,
- image_bpp;
+ image_width;
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;
@@ -1660,8 +1621,11 @@ lexmark_print(const stp_printer_t printer, /* I - Model */
double k_lower, k_upper;
int physical_xdpi = 0;
int physical_ydpi = 0;
+ int i;
- double lum_adjustment[49], sat_adjustment[49], hue_adjustment[49];
+ stp_curve_t *lum_adjustment = NULL;
+ stp_curve_t *hue_adjustment = NULL;
+ stp_curve_t *sat_adjustment = NULL;
/* weave parameters */
lexmark_linebufs_t cols;
@@ -1669,61 +1633,52 @@ lexmark_print(const stp_printer_t printer, /* I - Model */
int horizontal_passes;
int ncolors;
lexm_privdata_weave privdata;
- void * weave = NULL;
- stp_dither_data_t *dt;
lexmark_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);
+ int model = stp_get_model_id(v);
+ const char *resolution = stp_get_string_parameter(v, "Resolution");
+ const char *media_type = stp_get_string_parameter(v, "MediaType");
+ const char *media_source = stp_get_string_parameter(v, "InputSlot");
+ const char *print_mode = stp_get_string_parameter(v, "PrintingMode");
+ int printing_color = 0;
+ const char *ink_type = stp_get_string_parameter(v, "InkType");
+ int top = stp_get_top(v);
+ int left = stp_get_left(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 lexmark_res_t *res_para_ptr =
+ lexmark_get_resolution_para(model, 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);
+ const lexmark_inkparam_t *ink_parameter;
+ stp_prune_inactive_options(v);
#ifdef DEBUG
dbgfileprn = lex_open_tmp_file(); /* open file with xx */
#endif
- if (ink_parameter == NULL)
+ if (!stp_verify(v))
{
- stp_eprintf(nv, "Illegal Ink Type specified; cannot print.\n");
- return;
+ stp_eprintf(v, "Print options not verified; cannot print.\n");
+ return 0;
}
+ if (strcmp(print_mode, "Color") == 0)
+ printing_color = 1;
- if (!stp_get_verified(nv))
+ ink_parameter = lexmark_get_ink_parameter(ink_type, printing_color, caps, v);
+
+ if (ink_parameter == NULL)
{
- stp_eprintf(nv, "Print options not verified; cannot print.\n");
- return;
+ stp_eprintf(v, "Illegal Ink Type specified; cannot print.\n");
+ return 0;
}
-
- /*
- * 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);
-
+ stp_image_init(image);
source= lexmark_source_type(media_source,caps);
@@ -1732,20 +1687,16 @@ lexmark_print(const stp_printer_t printer, /* I - Model */
*/
if ((ink_parameter->used_colors == COLOR_MODE_K) ||
- ((caps->inks == LEXMARK_INK_K) &&
- output_type != OUTPUT_MONOCHROME))
+ (caps->inks == LEXMARK_INK_K))
{
- output_type = OUTPUT_GRAY;
- stp_set_output_type(nv, OUTPUT_GRAY);
+ printing_color = 0;
+ stp_set_string_parameter(v, "PrintingMode", "BW");
}
- 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;
@@ -1757,8 +1708,7 @@ lexmark_print(const stp_printer_t printer, /* I - Model */
* Figure out the output resolution...
*/
- lexmark_describe_resolution(printer,
- resolution, &xdpi,&ydpi);
+ stp_describe_resolution(v, &xdpi, &ydpi);
#ifdef DEBUG
stp_erprintf("lexmark: resolution=%dx%d\n",xdpi,ydpi);
#endif
@@ -1766,19 +1716,19 @@ lexmark_print(const stp_printer_t printer, /* I - Model */
switch (res_para_ptr->resid) {
case DPI300:
physical_xdpi = 300;
- physical_ydpi = lexmark_get_phys_resolution_vertical(printer);
+ physical_ydpi = lexmark_get_phys_resolution_vertical(model);
break;
case DPI600:
physical_xdpi = 600;
- physical_ydpi = lexmark_get_phys_resolution_vertical(printer);
+ physical_ydpi = lexmark_get_phys_resolution_vertical(model);
break;
case DPI1200:
case DPItest:
physical_xdpi = 1200;
- physical_ydpi = lexmark_get_phys_resolution_vertical(printer);
+ physical_ydpi = lexmark_get_phys_resolution_vertical(model);
break;
default:
- return;
+ return 0;
break;
}
/* adapt the density */
@@ -1808,12 +1758,10 @@ densityDivisor /= 1.2;
if (!strcmp(resolution+(strlen(resolution)-3),"DMT") &&
- (caps->features & LEXMARK_CAP_DMT) &&
- stp_get_output_type(nv) != OUTPUT_MONOCHROME &&
- output_type != OUTPUT_MONOCHROME) {
+ (caps->features & LEXMARK_CAP_DMT)) {
use_dmt= 1;
#ifdef DEBUG
- stp_erprintf("lexmark: using drop modulation technology\n");
+ stpi_erprintf("lexmark: using drop modulation technology\n");
#endif
}
@@ -1821,36 +1769,32 @@ densityDivisor /= 1.2;
* Compute the output size...
*/
- lexmark_imageable_area(printer, nv, &page_left, &page_right,
- &page_bottom, &page_top);
+ out_width = stp_get_width(v);
+ out_height = stp_get_height(v);
- 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);
+ internal_imageable_area(v, 0, &page_left, &page_right,
+ &page_bottom, &page_top);
+ left -= page_left;
+ top -= page_top;
+ page_width = page_right - page_left;
+ page_height = page_bottom - page_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_height = stp_image_height(image);
+ image_width = stp_image_width(image);
+ stp_default_media_size(v, &n, &page_true_height);
+ lxm3200_linetoeject = (page_true_height * 1200) / 72;
- image->progress_init(image);
-
- if (!lexmark_init_printer(nv, caps, output_type,
+ if (!lexmark_init_printer(v, caps, printing_color,
media_source,
xdpi, ydpi, page_width, page_height,
top,left,use_dmt))
- return;
+ return 0;
/*
* Convert image size to printer resolution...
@@ -1938,6 +1882,15 @@ densityDivisor /= 1.2;
cols.p.M = stp_zalloc(buf_length+10);
}
+ if (cols.p.k)
+ {
+ if (cols.p.c)
+ stp_set_string_parameter(v, "STPIOutputType", "KCMY");
+ else
+ stp_set_string_parameter(v, "STPIOutputType", "Grayscale");
+ }
+ else
+ stp_set_string_parameter(v, "STPIOutputType", "CMY");
#ifdef DEBUG
stp_erprintf("lexmark: driver will use colors ");
@@ -1953,44 +1906,56 @@ densityDivisor /= 1.2;
/* initialize soft weaveing */
privdata.ink_parameter = ink_parameter;
- privdata.bidirectional = lexmark_print_bidirectional(printer, resolution);
+ privdata.bidirectional = lexmark_print_bidirectional(model, resolution);
privdata.outbuf = stp_malloc((((((pass_length/8)*11))+40) * out_width)+2000);
- stp_set_driver_data(nv, &privdata);
+ privdata.direction = 0;
+ stp_allocate_component_data(v, "Driver", NULL, NULL, &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,
- ((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 */
-
-
-
+ stp_initialize_weave(v,
+ 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,
+ ((top * ydpi) / 72)+(((caps->offset_top_border+add_top_offset)*ydpi)
+ /caps->y_raster_res),
+ (page_height * ydpi) / 72,
+ (const int *) lexmark_head_offset(ydpi, ink_type, caps, ink_parameter, &lineoff_buffer),
+ STP_WEAVE_ZIGZAG, /* weave_strategy */
+ flush_pass,
+ stp_fill_uncompressed, /* fill_start */
+ stp_pack_uncompressed, /* pack */
+ stp_compute_uncompressed_linewidth); /* compute_linewidth */
+ privdata.last_pass_offset = 0;
+ privdata.jets = pass_length;
+ privdata.ncolors = ncolors;
+ privdata.horizontal_weave = horizontal_passes;
+
+
+ if (!stp_check_float_parameter(v, "Density", STP_PARAMETER_DEFAULTED))
+ {
+ stp_set_float_parameter_active(v, "Density", STP_PARAMETER_ACTIVE);
+ stp_set_float_parameter(v, "Density", 1.0);
+ }
#ifdef DEBUG
- stp_erprintf("density is %f\n",stp_get_density(nv));
+ stp_erprintf("density is %f\n",stp_get_parameter(v, "Density"));
#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);
+ stp_erprintf("density is %f and will be changed to %f (%f)\n",
+ stp_get_float_parameter(v, "Density"),
+ stp_get_float_parameter(v, "Density") / 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);
-
+ stp_scale_float_parameter(v, "Density", 1.0 / densityDivisor);
/*
@@ -2002,84 +1967,130 @@ densityDivisor /= 1.2;
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);
+ stp_scale_float_parameter(v, "Density", media->base_density);
+ stp_scale_float_parameter(v, "Cyan", media->p_cyan);
+ stp_scale_float_parameter(v, "Magenta", media->p_magenta);
+ stp_scale_float_parameter(v, "Yellow", media->p_yellow);
k_lower *= media->k_lower_scale;
k_upper = media->k_upper;
}
else
{
- stp_set_density(nv, stp_get_density(nv) * .8);
+ stp_scale_float_parameter(v, "Density", .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);
+ if (stp_get_float_parameter(v, "Density") > 1.0)
+ stp_set_float_parameter(v, "Density", 1.0);
#ifdef DEBUG
- stp_erprintf("density is %f\n",stp_get_density(nv));
+ stp_erprintf("density is %f\n",stp_get_float_parameter(v, "Density"));
#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);
+ if (!stp_check_float_parameter(v, "GCRLower", STP_PARAMETER_ACTIVE))
+ stp_set_default_float_parameter(v, "GCRLower", k_lower);
+ if (!stp_check_float_parameter(v, "GCRUpper", STP_PARAMETER_ACTIVE))
+ stp_set_default_float_parameter(v, "GCRUpper", k_upper);
+ stp_dither_init(v, image, out_width, xdpi, ydpi);
/*
- 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);*/
+ stpi_dither_set_black_lower(dither, .8 / ((1 << (use_dmt+1)) - 1));*/
+ /*stpi_dither_set_black_levels(dither, 0.5, 0.5, 0.5);
+ stpi_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));
+ {
+ stp_dither_set_inks_full(v, STP_ECOLOR_C, 2, photo_dither_shades, 1.0,
+ 0.31 / .5);
+ }
if (cols.p.M)
- stp_dither_set_light_ink(dither, ECOLOR_M, .3333, stp_get_density(nv));
+ {
+ stp_dither_set_inks_full(v, STP_ECOLOR_M, 2, photo_dither_shades, 1.0,
+ 0.61 / .97);
+ }
if (cols.p.Y)
- stp_dither_set_light_ink(dither, ECOLOR_Y, .3333, stp_get_density(nv));
+ {
+ stp_dither_set_inks_full(v, STP_ECOLOR_Y, 2, photo_dither_shades, 1.0,
+ 0.08);
+ }
}
- 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));
+ stp_channel_set_density_adjustment(v, STP_ECOLOR_K, 0,
+ get_double_param(v, "BlackDensity") *
+ get_double_param(v, "Density"));
+ stp_channel_set_density_adjustment(v, STP_ECOLOR_C, 0,
+ get_double_param(v, "CyanDensity") *
+ get_double_param(v, "Density"));
+ stp_channel_set_density_adjustment(v, STP_ECOLOR_M, 0,
+ get_double_param(v, "MagentaDensity") *
+ get_double_param(v, "Density"));
+ stp_channel_set_density_adjustment(v, STP_ECOLOR_Y, 0,
+ get_double_param(v, "YellowDensity") *
+ get_double_param(v, "Density"));
+ if (!use_dmt) {
+ if (cols.p.C)
+ {
+ stp_channel_set_density_adjustment
+ (v, STP_ECOLOR_C, 1, (get_double_param(v, "CyanDensity") *
+ get_double_param(v, "LightCyanTransition") *
+ get_double_param(v, "Density")));
+ }
+ if (cols.p.M)
+ {
+ stp_channel_set_density_adjustment
+ (v, STP_ECOLOR_M, 1, (get_double_param(v, "MagentaDensity") *
+ get_double_param(v, "LightMagentaTransition") *
+ get_double_param(v, "Density")));
+ }
+ if (cols.p.Y)
+ {
+ stp_channel_set_density_adjustment
+ (v, STP_ECOLOR_Y, 1, (get_double_param(v, "YellowDensity") *
+ get_double_param(v, "LightYellowTransition") *
+ get_double_param(v, "Density")));
+ }
+ }
/*
* Output the page...
*/
+ if (!stp_check_curve_parameter(v, "HueMap", STP_PARAMETER_ACTIVE) &&
+ media->hue_adjustment)
+ {
+ hue_adjustment = stp_read_and_compose_curves
+ (lexmark_hue_adjustment(caps, v),
+ media ? media->hue_adjustment : NULL, STP_CURVE_COMPOSE_ADD, 384);
+ stp_set_curve_parameter(v, "HueMap", hue_adjustment);
+ stp_curve_destroy(hue_adjustment);
+ }
+ if (!stp_check_curve_parameter(v, "LumMap", STP_PARAMETER_ACTIVE) &&
+ media->lum_adjustment)
+ {
+ lum_adjustment = stp_read_and_compose_curves
+ (lexmark_lum_adjustment(caps, v),
+ media ? media->lum_adjustment : NULL, STP_CURVE_COMPOSE_MULTIPLY, 384);
+ stp_set_curve_parameter(v, "LumMap", lum_adjustment);
+ stp_curve_destroy(lum_adjustment);
+ }
+ if (!stp_check_curve_parameter(v, "SatMap", STP_PARAMETER_ACTIVE) &&
+ media->sat_adjustment)
+ {
+ sat_adjustment = stp_read_and_compose_curves
+ (lexmark_sat_adjustment(caps, v),
+ media ? media->sat_adjustment : NULL, STP_CURVE_COMPOSE_MULTIPLY, 384);
+ stp_set_curve_parameter(v, "SatMap", sat_adjustment);
+ stp_curve_destroy(sat_adjustment);
+ }
- in = stp_zalloc(image_width * image_bpp);
- out = stp_zalloc(image_width * out_bpp * 2);
+ out_channels = stp_color_init(v, image, 65536);
/* calculate the memory we need for one line of the printer image (hopefully we are right) */
#ifdef DEBUG
@@ -2092,91 +2103,46 @@ densityDivisor /= 1.2;
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))
+ if (cols.p.k)
{
- 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];
- }
+ stp_dither_add_channel(v, cols.p.k, STP_ECOLOR_K, 0);
+ stp_channel_set_black_channel(v, STP_ECOLOR_K);
}
-
-
- dt = stp_create_dither_data();
- stp_add_channel(dt, cols.p.k, ECOLOR_K, 0);
- stp_add_channel(dt, cols.p.c, ECOLOR_C, 0);
- stp_add_channel(dt, cols.p.C, ECOLOR_C, 1);
- stp_add_channel(dt, cols.p.m, ECOLOR_M, 0);
- stp_add_channel(dt, cols.p.M, ECOLOR_M, 1);
- stp_add_channel(dt, cols.p.y, ECOLOR_Y, 0);
- stp_add_channel(dt, cols.p.Y, ECOLOR_Y, 1);
-
- for (y = 0; y < out_height; y ++) /* go through every pixle line of image */
+ if (cols.p.c)
+ stp_dither_add_channel(v, cols.p.c, STP_ECOLOR_C, 0);
+ if (cols.p.C)
+ stp_dither_add_channel(v, cols.p.C, STP_ECOLOR_C, 1);
+ if (cols.p.m)
+ stp_dither_add_channel(v, cols.p.m, STP_ECOLOR_M, 0);
+ if (cols.p.M)
+ stp_dither_add_channel(v, cols.p.M, STP_ECOLOR_M, 1);
+ if (cols.p.y)
+ stp_dither_add_channel(v, cols.p.y, STP_ECOLOR_Y, 0);
+ if (cols.p.Y)
+ stp_dither_add_channel(v, cols.p.Y, STP_ECOLOR_Y, 1);
+ privdata.hoffset = left;
+ privdata.ydpi = ydpi;
+ privdata.model = model;
+ privdata.width = out_width;
+ privdata.xdpi = xdpi;
+ privdata.physical_xdpi = physical_xdpi;
+
+ for (y = 0; y < out_height; y ++)
{
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
+ if (stp_color_get_row(v, image, errline, &zero_mask))
+ {
+ status = 2;
+ break;
+ }
}
- /* stp_erprintf("Let's dither %d %d %d\n", ((y)), buf_length, length);*/
- if (doTestPrint == 0) {
- stp_dither(out, y, dither, dt, 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, (unsigned char **)cols.v);
+ stp_dither(v, y, duplicate_line, zero_mask, NULL);
+ stp_write_weave(v, (unsigned char **)cols.v);
errval += errmod;
errline += errdiv;
@@ -2185,68 +2151,59 @@ densityDivisor /= 1.2;
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);
-
- stp_free_dither_data(dt);
-
- if (doTestPrint == 0) {
- stp_free_dither(dither);
- }
+ stp_image_conclude(image);
+ stp_flush_all(v);
+ lexmark_deinit_printer(v, caps);
/*
* 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);
-
-
+ for (i = 0; i < NCHANNELS; i++)
+ if (cols.v[i])
+ stp_free(cols.v[i]);
#ifdef DEBUG
lex_tmp_file_deinit(dbgfileprn);
#endif
- stp_free_vars(nv);
+ return status;
+}
+
+static int
+lexmark_print(const stp_vars_t *v, stp_image_t *image)
+{
+ int status;
+ stp_vars_t *nv = stp_vars_create_copy(v);
+ stp_prune_inactive_options(nv);
+ status = lexmark_do_print(nv, image);
+ stp_vars_destroy(nv);
+ return status;
}
-const stp_printfuncs_t stp_lexmark_printfuncs =
+static const stp_printfuncs_t print_lexmark_printfuncs =
{
+ lexmark_list_parameters,
lexmark_parameters,
stp_default_media_size,
lexmark_imageable_area,
lexmark_limit,
lexmark_print,
- lexmark_default_parameters,
lexmark_describe_resolution,
+ lexmark_describe_output,
stp_verify_printer_params,
- stp_start_job,
- stp_end_job
+ NULL,
+ NULL
};
+
/* lexmark_init_line
This method is printer type dependent code.
@@ -2468,7 +2425,7 @@ typedef struct Lexmark_head_colors {
static int
-lexmark_write(const stp_vars_t v, /* I - Print file or command */
+lexmark_write(const stp_vars_t *v, /* I - Print file or command */
unsigned char *prnBuf, /* mem block to buffer output */
int *paperShift,
int direction,
@@ -2725,9 +2682,9 @@ lexmark_write(const stp_vars_t v, /* I - Print file or command */
#ifdef DEBUG
-const stp_vars_t lex_open_tmp_file() {
+const stp_vars_t *lex_open_tmp_file() {
int i;
- const stp_vars_t ofile;
+ const stp_vars_t *ofile;
char tmpstr[256];
stp_erprintf(" create file !\n");
@@ -2744,17 +2701,17 @@ const stp_vars_t lex_open_tmp_file() {
if (ofile == NULL)
{
stp_erprintf("Can't create file !\n");
- exit(2);
+ stp_abort();
}
return ofile;
}
-void lex_tmp_file_deinit(const stp_vars_t file) {
+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) {
+const stp_vars_t *lex_write_tmp_file(const stp_vars_t *ofile, void *data,int length) {
fwrite(data, 1, length, ofile);
}
@@ -2763,22 +2720,26 @@ const stp_vars_t lex_write_tmp_file(const stp_vars_t ofile, void *data,int lengt
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)
+flush_pass(stp_vars_t *v, int passno, 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);
+ stp_lineoff_t *lineoffs = stp_get_lineoffsets_by_pass(v, passno);
+ stp_lineactive_t *lineactive = stp_get_lineactive_by_pass(v, passno);
+ const stp_linebufs_t *bufs = stp_get_linebases_by_pass(v, passno);
+ stp_pass_t *pass = stp_get_pass_by_pass(v, passno);
+ stp_linecount_t *linecount = stp_get_linecount_by_pass(v, passno);
+ lexm_privdata_weave *pd =
+ (lexm_privdata_weave *) stp_get_component_data(v, "Driver");
+ int width = pd->width;
+ int hoffset = pd->hoffset;
+ int model = pd->model;
+ int xdpi = pd->xdpi;
+ int ydpi = pd->ydpi;
+ int physical_xdpi = pd->physical_xdpi;
+ int lwidth = (width + (pd->horizontal_weave - 1)) / pd->horizontal_weave;
+ int microoffset = vertical_subpass & (pd->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},
@@ -2786,15 +2747,13 @@ flush_pass(stp_softweave_t *sw, int passno, int model, int width,
{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\n",
- passno, sw->ncolors, width, lwidth, /*linecount[0].p.k, linecount[0].p.m,*/ sw->bitwidth);
- stp_erprintf("microoffset %d, vertical_subpass %d, sw->horizontal_weave %d\n", microoffset,vertical_subpass, sw->horizontal_weave);
+ stp_erprintf(" passno %i, pd->ncolors %i, width %d, lwidth %d, linecount k % d, linecount m % d, bitwidth %d\n",
+ passno, pd->ncolors, width, lwidth, /*linecount[0].p.k, linecount[0].p.m,*/ pd->bitwidth);
+ stp_erprintf("microoffset %d, vertical_subpass %d, pd->horizontal_weave %d\n", microoffset,vertical_subpass, pd->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: last_pass_offset %d, logicalpassstart %d\n", pd->last_pass_offset, pass->logicalpassstart);
stp_erprintf("Lexmark: vertical adapt: caps->y_raster_res %d, ydpi %d, \n", caps->y_raster_res, ydpi);
#endif
@@ -2827,14 +2786,14 @@ flush_pass(stp_softweave_t *sw, int passno, int model, int width,
break;
}
/* calculate paper shift and adapt actual resoution to physical positioning resolution */
- paperShift = (pass->logicalpassstart - sw->last_pass_offset) * (caps->y_raster_res/ydpi);
+ paperShift = (pass->logicalpassstart - pd->last_pass_offset) * (caps->y_raster_res/ydpi);
+
-
/*** do we have to print something with the color cartridge ? ***/
- if ((ECOLOR_C < sw->ncolors) && (lineactive[0].v[ECOLOR_C] > 0))
+ if ((STP_ECOLOR_C < pd->ncolors) && (lineactive[0].v[STP_ECOLOR_C] > 0))
{
- head_colors[0].line = bufs[0].v[ECOLOR_C];
- head_colors[0].used_jets = linecount[0].v[ECOLOR_C];
+ head_colors[0].line = bufs[0].v[STP_ECOLOR_C];
+ head_colors[0].used_jets = linecount[0].v[STP_ECOLOR_C];
}
else
{
@@ -2842,10 +2801,10 @@ flush_pass(stp_softweave_t *sw, int passno, int model, int width,
head_colors[0].used_jets = 0;
}
- if ((ECOLOR_M < sw->ncolors) && (lineactive[0].v[ECOLOR_M] > 0))
+ if ((STP_ECOLOR_M < pd->ncolors) && (lineactive[0].v[STP_ECOLOR_M] > 0))
{
- head_colors[1].line = bufs[0].v[ECOLOR_M];
- head_colors[1].used_jets = linecount[0].v[ECOLOR_M];
+ head_colors[1].line = bufs[0].v[STP_ECOLOR_M];
+ head_colors[1].used_jets = linecount[0].v[STP_ECOLOR_M];
}
else
{
@@ -2853,10 +2812,10 @@ flush_pass(stp_softweave_t *sw, int passno, int model, int width,
head_colors[1].used_jets = 0;
}
- if ((ECOLOR_Y < sw->ncolors) && (lineactive[0].v[ECOLOR_Y] > 0))
+ if ((STP_ECOLOR_Y < pd->ncolors) && (lineactive[0].v[STP_ECOLOR_Y] > 0))
{
- head_colors[2].line = bufs[0].v[ECOLOR_Y];
- head_colors[2].used_jets = linecount[0].v[ECOLOR_Y];
+ head_colors[2].line = bufs[0].v[STP_ECOLOR_Y];
+ head_colors[2].used_jets = linecount[0].v[STP_ECOLOR_Y];
}
else
{
@@ -2871,13 +2830,13 @@ flush_pass(stp_softweave_t *sw, int passno, int model, int width,
#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 */
+ lexmark_write(v, /* I - Print file or command */
+ pd->outbuf,/*unsigned char *prnBuf, mem block to buffer output */
&paperShift, /* int *paperShift, */
- privdata_weave->direction, /* int direction, */
- sw->jets, /* num of inks to print */
+ pd->direction, /* int direction, */
+ pd->jets, /* num of inks to print */
caps, /* const lexmark_cap_t * caps, I - Printer model */
- privdata_weave->ink_parameter,
+ pd->ink_parameter,
xdpi, /* int xresolution, */
2, /* yCount,*/
head_colors, /* Lexmark_head_colors *head_colors, */
@@ -2887,21 +2846,21 @@ flush_pass(stp_softweave_t *sw, int passno, int model, int width,
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;
+ if (pd->bidirectional)
+ pd->direction = (pd->direction +1) & 1;
}
-
+
/*** do we have to print somthing with black or photo cartridge ? ***/
/* we print with the photo or black cartidge */
- if (sw->jets != 208)
+ if (pd->jets != 208)
{
/* we have photo or black cartridge */
- if ((ECOLOR_LC < sw->ncolors) && (lineactive[0].v[ECOLOR_LC] > 0))
+ if ((STP_ECOLOR_LC < pd->ncolors) && (lineactive[0].v[STP_ECOLOR_LC] > 0))
{
- head_colors[0].line = bufs[0].v[ECOLOR_LC];
- head_colors[0].used_jets = linecount[0].v[ECOLOR_LC];
+ head_colors[0].line = bufs[0].v[STP_ECOLOR_LC];
+ head_colors[0].used_jets = linecount[0].v[STP_ECOLOR_LC];
}
else
{
@@ -2909,10 +2868,10 @@ flush_pass(stp_softweave_t *sw, int passno, int model, int width,
head_colors[0].used_jets = 0;
}
- if ((ECOLOR_LM < sw->ncolors) && (lineactive[0].v[ECOLOR_LM] > 0))
+ if ((STP_ECOLOR_LM < pd->ncolors) && (lineactive[0].v[STP_ECOLOR_LM] > 0))
{
- head_colors[1].line = bufs[0].v[ECOLOR_LM];
- head_colors[1].used_jets = linecount[0].v[ECOLOR_LM];
+ head_colors[1].line = bufs[0].v[STP_ECOLOR_LM];
+ head_colors[1].used_jets = linecount[0].v[STP_ECOLOR_LM];
}
else
{
@@ -2920,10 +2879,10 @@ flush_pass(stp_softweave_t *sw, int passno, int model, int width,
head_colors[1].used_jets = 0;
}
- if ((ECOLOR_K < sw->ncolors) && (lineactive[0].v[ECOLOR_K] > 0))
+ if ((STP_ECOLOR_K < pd->ncolors) && (lineactive[0].v[STP_ECOLOR_K] > 0))
{
- head_colors[2].line = bufs[0].v[ECOLOR_K];
- head_colors[2].used_jets = linecount[0].v[ECOLOR_K];
+ head_colors[2].line = bufs[0].v[STP_ECOLOR_K];
+ head_colors[2].used_jets = linecount[0].v[STP_ECOLOR_K];
}
else
{
@@ -2933,13 +2892,13 @@ flush_pass(stp_softweave_t *sw, int passno, int model, int width,
}
else
{
- if ((ECOLOR_K < sw->ncolors) && (lineactive[0].v[ECOLOR_K] > 0))
+ if ((STP_ECOLOR_K < pd->ncolors) && (lineactive[0].v[STP_ECOLOR_K] > 0))
{
/* we have black cartridge; we have to print with all 208 jets at once */
- head_colors[0].line = bufs[0].v[ECOLOR_K];
- head_colors[0].used_jets = linecount[0].v[ECOLOR_K];
+ head_colors[0].line = bufs[0].v[STP_ECOLOR_K];
+ head_colors[0].used_jets = linecount[0].v[STP_ECOLOR_K];
head_colors[0].head_nozzle_start = 0;
- head_colors[0].head_nozzle_end = sw->jets/2;
+ head_colors[0].head_nozzle_end = pd->jets/2;
head_colors[2].line = NULL;
head_colors[2].used_jets = 0;
head_colors[2].head_nozzle_start = 0;
@@ -2949,7 +2908,7 @@ flush_pass(stp_softweave_t *sw, int passno, int model, int width,
head_colors[1].head_nozzle_start = 0;
head_colors[1].head_nozzle_end = 0;
}
- else
+ else
{
head_colors[2].line = NULL;
head_colors[2].used_jets = 0;
@@ -2967,14 +2926,14 @@ flush_pass(stp_softweave_t *sw, int passno, int model, int width,
}
if ((head_colors[0].line != 0) || (head_colors[1].line != 0) || (head_colors[2].line != 0)) {
-
- lexmark_write(nv, /* I - Print file or command */
- privdata_weave->outbuf,/*unsigned char *prnBuf, mem block to buffer output */
+
+ lexmark_write(v, /* I - Print file or command */
+ pd->outbuf,/*unsigned char *prnBuf, mem block to buffer output */
&paperShift, /* int *paperShift, */
- privdata_weave->direction, /* int direction, */
- sw->jets, /* num of inks to print */
+ pd->direction, /* int direction, */
+ pd->jets, /* num of inks to print */
caps, /* const lexmark_cap_t * caps, I - Printer model */
- privdata_weave->ink_parameter,
+ pd->ink_parameter,
xdpi, /* int xresolution, */
2, /* yCount,*/
head_colors, /* Lexmark_head_colors *head_colors, */
@@ -2984,16 +2943,16 @@ flush_pass(stp_softweave_t *sw, int passno, int model, int width,
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)
+ if (pd->bidirectional)
{
- privdata_weave->direction = (privdata_weave->direction +1) & 1;
+ pd->direction = (pd->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));
+ pd->last_pass_offset = pass->logicalpassstart - (paperShift / (caps->y_raster_res/ydpi));
}
- for (j = 0; j < sw->ncolors; j++)
+ for (j = 0; j < pd->ncolors; j++)
{
lineoffs[0].v[j] = 0;
linecount[0].v[j] = 0;
@@ -3003,8 +2962,6 @@ flush_pass(stp_softweave_t *sw, int passno, int model, int width,
stp_erprintf("lexmark_write finished\n");
#endif
- sw->last_pass = pass->pass;
- pass->pass = -1;
}
@@ -3030,7 +2987,7 @@ static void testprint(testdata *td)
/* 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);
+ td->input_line = (char *)stp_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) {
@@ -3049,16 +3006,16 @@ static void testprint(testdata *td)
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 */
+ linebufs.v[icol] = (char *)stp_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 */
+ linebufs.v[icol] = (char *)stp_malloc((td->x+7)/8); /* allocate the color */
}
} else {
td->cols = 1;
- linebufs.v[0] = (char *)malloc((td->x+7)/8); /* allocate the color */
+ linebufs.v[0] = (char *)stp_malloc((td->x+7)/8); /* allocate the color */
}
} else {
stp_erprintf("can't open file !\n");
@@ -3100,3 +3057,43 @@ static void readtestprintline(testdata *td, lexmark_linebufs_t *linebufs)
}
#endif
+
+
+static stp_family_t print_lexmark_module_data =
+ {
+ &print_lexmark_printfuncs,
+ NULL
+ };
+
+static int
+print_lexmark_module_init(void)
+{
+ return stp_family_register(print_lexmark_module_data.printer_list);
+}
+
+
+static int
+print_lexmark_module_exit(void)
+{
+ return stp_family_unregister(print_lexmark_module_data.printer_list);
+}
+
+
+/* Module header */
+#define stp_module_version print_lexmark_LTX_stp_module_version
+#define stp_module_data print_lexmark_LTX_stp_module_data
+
+stp_module_version_t stp_module_version = {0, 0};
+
+stp_module_t stp_module_data =
+ {
+ "lexmark",
+ VERSION,
+ "Lexmark family driver",
+ STP_MODULE_CLASS_FAMILY,
+ NULL,
+ print_lexmark_module_init,
+ print_lexmark_module_exit,
+ (void *) &print_lexmark_module_data
+ };
+
diff --git a/src/main/print-list.c b/src/main/print-list.c
new file mode 100644
index 0000000..f3d0a4b
--- /dev/null
+++ b/src/main/print-list.c
@@ -0,0 +1,711 @@
+/*
+ * "$Id: print-list.c,v 1.23 2005/06/30 02:11:49 rlk Exp $"
+ *
+ * Gutenprint list functions. A doubly-linked list implementation,
+ * with callbacks for freeing, sorting, and retrieving nodes by name
+ * or long name.
+ *
+ * Copyright 2002 Roger Leigh (rleigh@debian.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.
+ */
+
+/*
+ * This file must include only standard C header files. The core code must
+ * compile on generic platforms that don't support glib, gimp, etc.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+/** The internal representation of an stp_list_item_t list node. */
+struct stp_list_item
+{
+ void *data; /*!< Data */
+ struct stp_list_item *prev; /*!< Previous node */
+ struct stp_list_item *next; /*!< Next node */
+};
+
+/** The internal representation of an stp_list_t list. */
+struct stp_list
+{
+ int index_cache; /*!< Cached node index */
+ struct stp_list_item *start; /*!< Start node */
+ struct stp_list_item *end; /*!< End node */
+ struct stp_list_item *index_cache_node; /*!< Cached node (for index) */
+ int length; /*!< Number of nodes */
+ stp_node_freefunc freefunc; /*!< Callback to free node data */
+ stp_node_copyfunc copyfunc; /*!< Callback to copy node */
+ stp_node_namefunc namefunc; /*!< Callback to get node name */
+ stp_node_namefunc long_namefunc; /*!< Callback to get node long name */
+ stp_node_sortfunc sortfunc; /*!< Callback to compare (sort) nodes */
+ char *name_cache; /*!< Cached name */
+ struct stp_list_item *name_cache_node; /*!< Cached node (for name) */
+ char *long_name_cache; /*!< Cached long name */
+ struct stp_list_item *long_name_cache_node; /*!< Cached node (for long name) */
+};
+
+/**
+ * Cache a list node by its short name.
+ * @param list the list to use.
+ * @param name the short name.
+ * @param cache the node to cache.
+ */
+static void
+set_name_cache(stp_list_t *list,
+ const char *name,
+ stp_list_item_t *cache)
+{
+ if (list->name_cache)
+ stp_free(list->name_cache);
+ list->name_cache = NULL;
+ if (name)
+ list->name_cache = stp_strdup(name);
+ list->name_cache_node = cache;
+}
+
+/**
+ * Cache a list node by its long name.
+ * @param list the list to use.
+ * @param long_name the long name.
+ * @param cache the node to cache.
+ */
+static void
+set_long_name_cache(stp_list_t *list,
+ const char *long_name,
+ stp_list_item_t *cache)
+{
+ if (list->long_name_cache)
+ stp_free(list->long_name_cache);
+ list->long_name_cache = NULL;
+ if (long_name)
+ list->long_name_cache = stp_strdup(long_name);
+ list->long_name_cache_node = cache;
+}
+
+/**
+ * Clear cached nodes.
+ * @param list the list to use.
+ */
+static inline void
+clear_cache(stp_list_t *list)
+{
+ list->index_cache = 0;
+ list->index_cache_node = NULL;
+ set_name_cache(list, NULL, NULL);
+ set_long_name_cache(list, NULL, NULL);
+}
+
+void
+stp_list_node_free_data (void *item)
+{
+ stp_free(item);
+ stp_deprintf(STP_DBG_LIST, "stp_list_node_free_data destructor\n");
+}
+
+/** Check the validity of a list. */
+#define check_list(List) assert(List != NULL)
+
+/* List head functions.
+ * These functions operate on the list as a whole, and not the
+ * individual nodes in a list. */
+
+/* create a new list */
+stp_list_t *
+stp_list_create(void)
+{
+ stp_list_t *list =
+ stp_malloc(sizeof(stp_list_t));
+
+ /* initialise an empty list */
+ list->index_cache = 0;
+ list->length = 0;
+ list->start = NULL;
+ list->end = NULL;
+ list->index_cache_node = NULL;
+ list->freefunc = NULL;
+ list->namefunc = NULL;
+ list->long_namefunc = NULL;
+ list->sortfunc = NULL;
+ list->copyfunc = NULL;
+ list->name_cache = NULL;
+ list->name_cache_node = NULL;
+ list->long_name_cache = NULL;
+ list->long_name_cache_node = NULL;
+
+ stp_deprintf(STP_DBG_LIST, "stp_list_head constructor\n");
+ return list;
+}
+
+stp_list_t *
+stp_list_copy(const stp_list_t *list)
+{
+ stp_list_t *ret;
+ stp_node_copyfunc copyfunc = stp_list_get_copyfunc(list);
+ stp_list_item_t *item = list->start;
+
+ check_list(list);
+
+ ret = stp_list_create();
+ stp_list_set_copyfunc(ret, stp_list_get_copyfunc(list));
+ /* If we use default (shallow) copy, we can't free the elements of it */
+ if (stp_list_get_copyfunc(list))
+ stp_list_set_freefunc(ret, stp_list_get_freefunc(list));
+ stp_list_set_namefunc(ret, stp_list_get_namefunc(list));
+ stp_list_set_long_namefunc(ret, stp_list_get_long_namefunc(list));
+ stp_list_set_sortfunc(ret, stp_list_get_sortfunc(list));
+ while (item)
+ {
+ void *data = item->data;
+ if (copyfunc)
+ stp_list_item_create (ret, NULL, (*copyfunc)(data));
+ else
+ stp_list_item_create(ret, NULL, data);
+ item = stp_list_item_next(item);
+ }
+ return ret;
+}
+
+/* free a list, freeing all child nodes first */
+int
+stp_list_destroy(stp_list_t *list)
+{
+ stp_list_item_t *cur;
+ stp_list_item_t *next;
+
+ check_list(list);
+ clear_cache(list);
+ cur = list->start;
+ while(cur)
+ {
+ next = cur->next;
+ stp_list_item_destroy(list, cur);
+ cur = next;
+ }
+ stp_deprintf(STP_DBG_LIST, "stp_list_head destructor\n");
+ stp_free(list);
+
+ return 0;
+}
+
+int
+stp_list_get_length(const stp_list_t *list)
+{
+ check_list(list);
+ return list->length;
+}
+
+/* find a node */
+
+/* get the first node in the list */
+
+stp_list_item_t *
+stp_list_get_start(const stp_list_t *list)
+{
+ return list->start;
+}
+
+/* get the last node in the list */
+
+stp_list_item_t *
+stp_list_get_end(const stp_list_t *list)
+{
+ return list->end;
+}
+
+static stp_list_t *
+deconst_list(const stp_list_t *list)
+{
+ return (stp_list_t *) list;
+}
+
+/* get the node by its place in the list */
+stp_list_item_t *
+stp_list_get_item_by_index(const stp_list_t *list, int idx)
+{
+ stp_list_item_t *node = NULL;
+ stp_list_t *ulist = deconst_list(list);
+ int i; /* current index */
+ int d = 0; /* direction of list traversal, 0=forward */
+ int c = 0; /* use cache? */
+ check_list(list);
+
+ if (idx >= list->length)
+ return NULL;
+
+ /* see if using the cache is worthwhile */
+ if (list->index_cache)
+ {
+ if (idx < (list->length/2))
+ {
+ if (idx > abs(idx - list->index_cache))
+ c = 1;
+ else
+ d = 0;
+ }
+ else
+ {
+ if (list->length - 1 - idx >
+ abs (list->length - 1 - idx - list->index_cache))
+ c = 1;
+ else
+ d = 1;
+ }
+ }
+
+
+ if (c) /* use the cached index and node */
+ {
+ if (idx > list->index_cache) /* forward */
+ d = 0;
+ else /* backward */
+ d = 1;
+ i = list->index_cache;
+ node = list->index_cache_node;
+ }
+ else /* start from one end of the list */
+ {
+ if (d)
+ {
+ i = list->length - 1;
+ node = list->end;
+ }
+ else
+ {
+ i = 0;
+ node = list->start;
+ }
+ }
+
+ while (node && i != idx)
+ {
+ if (d)
+ {
+ i--;
+ node = node->prev;
+ }
+ else
+ {
+ i++;
+ node = node->next;
+ }
+ }
+
+ /* update cache */
+ ulist->index_cache = i;
+ ulist->index_cache_node = node;
+
+ return node;
+}
+
+/**
+ * Find an item in a list by its name.
+ * This internal helper is not optimised to use any caching.
+ * @param list the list to use.
+ * @param name the name to find.
+ * @returns a pointer to the list item, or NULL if the name is
+ * invalid or the list is empty.
+ */
+static stp_list_item_t *
+stp_list_get_item_by_name_internal(const stp_list_t *list, const char *name)
+{
+ stp_list_item_t *node = list->start;
+ while (node && strcmp(name, list->namefunc(node->data)))
+ {
+ node = node->next;
+ }
+ return node;
+}
+
+/* get the first node with name; requires a callback function to
+ read data */
+stp_list_item_t *
+stp_list_get_item_by_name(const stp_list_t *list, const char *name)
+{
+ stp_list_item_t *node = NULL;
+ stp_list_t *ulist = deconst_list(list);
+ check_list(list);
+
+ if (!list->namefunc)
+ return NULL;
+
+ if (list->name_cache && name && list->name_cache_node)
+ {
+ const char *new_name;
+ node = list->name_cache_node;
+ /* Is this the item we've cached? */
+ if (strcmp(name, list->name_cache) == 0 &&
+ strcmp(name, list->namefunc(node->data)) == 0)
+ return node;
+
+ /* If not, check the next item in case we're searching the list */
+ node = node->next;
+ if (node)
+ {
+ new_name = list->namefunc(node->data);
+ if (strcmp(name, new_name) == 0)
+ {
+ set_name_cache(ulist, new_name, node);
+ return node;
+ }
+ }
+ /* If not, check the index cache */
+ node = list->index_cache_node;
+ if (node)
+ {
+ new_name = list->namefunc(node->data);
+ if (strcmp(name, new_name) == 0)
+ {
+ set_name_cache(ulist, new_name, node);
+ return node;
+ }
+ }
+ }
+
+ node = stp_list_get_item_by_name_internal(list, name);
+
+ if (node)
+ set_name_cache(ulist, name, node);
+
+ return node;
+}
+
+
+/**
+ * Find an item in a list by its long name.
+ * This internal helper is not optimised to use any caching.
+ * @param list the list to use.
+ * @param long_name the long name to find.
+ * @returns a pointer to the list item, or NULL if the long name is
+ * invalid or the list is empty.
+ */
+static stp_list_item_t *
+stp_list_get_item_by_long_name_internal(const stp_list_t *list,
+ const char *long_name)
+{
+ stp_list_item_t *node = list->start;
+ while (node && strcmp(long_name, list->long_namefunc(node->data)))
+ {
+ node = node->next;
+ }
+ return node;
+}
+
+/* get the first node with long_name; requires a callack function to
+ read data */
+stp_list_item_t *
+stp_list_get_item_by_long_name(const stp_list_t *list, const char *long_name)
+{
+ stp_list_item_t *node = NULL;
+ stp_list_t *ulist = deconst_list(list);
+ check_list(list);
+
+ if (!list->long_namefunc)
+ return NULL;
+
+ if (list->long_name_cache && long_name && list->long_name_cache_node)
+ {
+ const char *new_long_name;
+ node = list->long_name_cache_node;
+ /* Is this the item we've cached? */
+ if (strcmp(long_name, list->long_name_cache) == 0 &&
+ strcmp(long_name, list->long_namefunc(node->data)) == 0)
+ return node;
+
+ /* If not, check the next item in case we're searching the list */
+ node = node->next;
+ if (node)
+ {
+ new_long_name = list->long_namefunc(node->data);
+ if (strcmp(long_name, new_long_name) == 0)
+ {
+ set_long_name_cache(ulist, new_long_name, node);
+ return node;
+ }
+ }
+ /* If not, check the index cache */
+ node = list->index_cache_node;
+ if (node)
+ {
+ new_long_name = list->long_namefunc(node->data);
+ if (strcmp(long_name, new_long_name) == 0)
+ {
+ set_long_name_cache(ulist, new_long_name, node);
+ return node;
+ }
+ }
+ }
+
+ node = stp_list_get_item_by_long_name_internal(list, long_name);
+
+ if (node)
+ set_long_name_cache(ulist, long_name, node);
+
+ return node;
+}
+
+
+/* callback for freeing data */
+void
+stp_list_set_freefunc(stp_list_t *list, stp_node_freefunc freefunc)
+{
+ check_list(list);
+ list->freefunc = freefunc;
+}
+
+stp_node_freefunc
+stp_list_get_freefunc(const stp_list_t *list)
+{
+ check_list(list);
+ return list->freefunc;
+}
+
+/* callback for copying data */
+void
+stp_list_set_copyfunc(stp_list_t *list, stp_node_copyfunc copyfunc)
+{
+ check_list(list);
+ list->copyfunc = copyfunc;
+}
+
+stp_node_copyfunc
+stp_list_get_copyfunc(const stp_list_t *list)
+{
+ check_list(list);
+ return list->copyfunc;
+}
+
+/* callback for getting data name */
+void
+stp_list_set_namefunc(stp_list_t *list, stp_node_namefunc namefunc)
+{
+ check_list(list);
+ list->namefunc = namefunc;
+}
+
+stp_node_namefunc
+stp_list_get_namefunc(const stp_list_t *list)
+{
+ check_list(list);
+ return list->namefunc;
+}
+
+/* callback for getting data long_name */
+void
+stp_list_set_long_namefunc(stp_list_t *list, stp_node_namefunc long_namefunc)
+{
+ check_list(list);
+ list->long_namefunc = long_namefunc;
+}
+
+stp_node_namefunc
+stp_list_get_long_namefunc(const stp_list_t *list)
+{
+ check_list(list);
+ return list->long_namefunc;
+}
+
+/* callback for sorting nodes */
+void
+stp_list_set_sortfunc(stp_list_t *list, stp_node_sortfunc sortfunc)
+{
+ check_list(list);
+ list->sortfunc = sortfunc;
+}
+
+stp_node_sortfunc
+stp_list_get_sortfunc(const stp_list_t *list)
+{
+ check_list(list);
+ return list->sortfunc;
+}
+
+
+/* list item functions */
+
+/* these functions operate on individual nodes in a list */
+
+/*
+ * create a new node in list, before next (may be null e.g. if sorting
+ * next is calculated automatically, else defaults to end). Must be
+ * initialised with data (null nodes are disallowed). The
+ * stp_list_item_t type can not exist unless it is associated with an
+ * stp_list_t list head.
+ */
+int
+stp_list_item_create(stp_list_t *list,
+ stp_list_item_t *next,
+ const void *data)
+{
+ stp_list_item_t *ln; /* list node to add */
+ stp_list_item_t *lnn; /* list node next */
+
+ check_list(list);
+
+ clear_cache(list);
+
+ ln = stp_malloc(sizeof(stp_list_item_t));
+ ln->prev = ln->next = NULL;
+
+ if (data)
+ ln->data = (void *) data;
+ else
+ {
+ stp_free(ln);
+ return 1;
+ }
+
+ if (list->sortfunc)
+ {
+ /* set np to the previous node (before the insertion */
+ lnn = list->end;
+ while (lnn)
+ {
+ if (list->sortfunc(lnn->data, ln->data) <= 0)
+ break;
+ lnn = lnn->prev;
+ }
+ }
+#if 0
+ /*
+ * This code #ifdef'ed out by Robert Krawitz on April 3, 2004.
+ * Setting a debug variable should not result in taking a materially
+ * different code path.
+ */
+ else if (stpi_get_debug_level() & STPI_DBG_LIST)
+ {
+ if (next)
+ {
+ lnn = list->start;
+ while (lnn)
+ {
+ if (lnn == next)
+ break;
+ lnn = lnn->prev;
+ }
+ }
+ else
+ lnn = NULL;
+ }
+#endif
+ else
+ lnn = next;
+
+ /* got lnp; now insert the new ln */
+
+ /* set next */
+ ln->next = lnn;
+
+ if (!ln->prev) /* insert at start of list */
+ {
+ if (list->start) /* list not empty */
+ ln->prev = list->end;
+ else
+ list->start = ln;
+ list->end = ln;
+ }
+
+ /* set prev (already set if at start of list) */
+
+ if (!ln->prev && ln->next) /* insert at end of list */
+ ln->prev = ln->next->prev;
+
+ if (list->start == ln->next) /* prev was old end */
+ {
+ list->start = ln;
+ }
+
+ /* set next->prev */
+ if (ln->next)
+ ln->next->prev = ln;
+
+ /* set prev->next */
+ if (ln->prev)
+ ln->prev->next = ln;
+
+ /* increment reference count */
+ list->length++;
+
+ stp_deprintf(STP_DBG_LIST, "stp_list_node constructor\n");
+ return 0;
+}
+
+/* remove a node from list */
+int
+stp_list_item_destroy(stp_list_t *list, stp_list_item_t *item)
+{
+ check_list(list);
+
+ clear_cache(list);
+ /* decrement reference count */
+ list->length--;
+
+ if (list->freefunc)
+ list->freefunc((void *) item->data);
+ if (item->prev)
+ item->prev->next = item->next;
+ else
+ list->start = item->next;
+ if (item->next)
+ item->next->prev = item->prev;
+ else
+ list->end = item->prev;
+ stp_free(item);
+
+ stp_deprintf(STP_DBG_LIST, "stp_list_node destructor\n");
+ return 0;
+}
+
+/* get previous node */
+stp_list_item_t *
+stp_list_item_prev(const stp_list_item_t *item)
+{
+ return item->prev;
+}
+
+/* get next node */
+stp_list_item_t *
+stp_list_item_next(const stp_list_item_t *item)
+{
+ return item->next;
+}
+
+/* get data for node */
+void *
+stp_list_item_get_data(const stp_list_item_t *item)
+{
+ return item->data;
+}
+
+/* set data for node */
+int
+stp_list_item_set_data(stp_list_item_t *item, void *data)
+{
+ if (data)
+ {
+ item->data = data;
+ return 0;
+ }
+ return 1; /* return error if data was NULL */
+}
diff --git a/src/main/print-olympus.c b/src/main/print-olympus.c
new file mode 100644
index 0000000..f879fba
--- /dev/null
+++ b/src/main/print-olympus.c
@@ -0,0 +1,2099 @@
+/*
+ * "$Id: print-olympus.c,v 1.55 2005/07/01 09:56:12 m0m Exp $"
+ *
+ * Print plug-in Olympus driver for the GIMP.
+ *
+ * Copyright 2003 Michael Mraka (Michael.Mraka@linux.cz)
+ *
+ * The plug-in is based on the code of the RAW 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <string.h>
+#include <stdio.h>
+
+#ifdef __GNUC__
+#define inline __inline__
+#endif
+
+#define OLYMPUS_INTERLACE_NONE 0
+#define OLYMPUS_INTERLACE_LINE 1
+#define OLYMPUS_INTERLACE_PLANE 2
+
+#define OLYMPUS_FEATURE_NONE 0x00000000
+#define OLYMPUS_FEATURE_FULL_WIDTH 0x00000001
+#define OLYMPUS_FEATURE_FULL_HEIGHT 0x00000002
+#define OLYMPUS_FEATURE_BLOCK_ALIGN 0x00000004
+#define OLYMPUS_FEATURE_BORDERLESS 0x00000008
+#define OLYMPUS_FEATURE_WHITE_BORDER 0x00000010
+
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+
+static const char *zero = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
+
+typedef struct
+{
+ const char *output_type;
+ int output_channels;
+ const char *name;
+ const char *channel_order;
+} ink_t;
+
+typedef struct {
+ const ink_t *item;
+ size_t n_items;
+} ink_list_t;
+
+typedef struct {
+ const char* name;
+ int xdpi;
+ int ydpi;
+} olymp_resolution_t;
+
+typedef struct {
+ const olymp_resolution_t *item;
+ size_t n_items;
+} olymp_resolution_list_t;
+
+typedef struct {
+ const char* name;
+ const char* text;
+ int width_pt;
+ int height_pt;
+ int border_pt_left;
+ int border_pt_right;
+ int border_pt_top;
+ int border_pt_bottom;
+} olymp_pagesize_t;
+
+typedef struct {
+ const olymp_pagesize_t *item;
+ size_t n_items;
+} olymp_pagesize_list_t;
+
+typedef struct {
+ const char* res_name;
+ const char* pagesize_name;
+ int width_px;
+ int height_px;
+} olymp_printsize_t;
+
+typedef struct {
+ const olymp_printsize_t *item;
+ size_t n_items;
+} olymp_printsize_list_t;
+
+
+typedef struct {
+ const char *name;
+ const char *text;
+ const stp_raw_t seq;
+} laminate_t;
+
+typedef struct {
+ const laminate_t *item;
+ size_t n_items;
+} laminate_list_t;
+
+typedef struct
+{
+ int xdpi, ydpi;
+ int xsize, ysize;
+ char plane;
+ int block_min_x, block_min_y;
+ int block_max_x, block_max_y;
+ const char* pagesize;
+ const laminate_t* laminate;
+} olympus_privdata_t;
+
+static olympus_privdata_t privdata;
+
+typedef struct /* printer specific parameters */
+{
+ int model; /* printer model number from printers.xml*/
+ const ink_list_t *inks;
+ const olymp_resolution_list_t *resolution;
+ const olymp_pagesize_list_t *pages;
+ const olymp_printsize_list_t *printsize;
+ int interlacing; /* color interlacing scheme */
+ int block_size;
+ int features;
+ void (*printer_init_func)(stp_vars_t *);
+ void (*printer_end_func)(stp_vars_t *);
+ void (*plane_init_func)(stp_vars_t *);
+ void (*plane_end_func)(stp_vars_t *);
+ void (*block_init_func)(stp_vars_t *);
+ void (*block_end_func)(stp_vars_t *);
+ const char *adj_cyan; /* default color adjustment */
+ const char *adj_magenta;
+ const char *adj_yellow;
+ const laminate_list_t *laminate;
+} olympus_cap_t;
+
+
+static const olympus_cap_t* olympus_get_model_capabilities(int model);
+static const laminate_t* olympus_get_laminate_pattern(stp_vars_t *v);
+
+
+static const ink_t cmy_inks[] =
+{
+ { "CMY", 3, "CMY", "\1\2\3" },
+};
+
+static const ink_list_t cmy_ink_list =
+{
+ cmy_inks, sizeof(cmy_inks) / sizeof(ink_t)
+};
+
+static const ink_t ymc_inks[] =
+{
+ { "CMY", 3, "CMY", "\3\2\1" },
+};
+
+static const ink_list_t ymc_ink_list =
+{
+ ymc_inks, sizeof(ymc_inks) / sizeof(ink_t)
+};
+
+static const ink_t rgb_inks[] =
+{
+ { "RGB", 3, "RGB", "\1\2\3" },
+};
+
+static const ink_list_t rgb_ink_list =
+{
+ rgb_inks, sizeof(rgb_inks) / sizeof(ink_t)
+};
+
+static const ink_t bgr_inks[] =
+{
+ { "RGB", 3, "RGB", "\3\2\1" },
+};
+
+static const ink_list_t bgr_ink_list =
+{
+ bgr_inks, sizeof(bgr_inks) / sizeof(ink_t)
+};
+
+
+/* Olympus P-10 */
+static const olymp_resolution_t res_320dpi[] =
+{
+ { "320x320", 320, 320},
+};
+
+static const olymp_resolution_list_t res_320dpi_list =
+{
+ res_320dpi, sizeof(res_320dpi) / sizeof(olymp_resolution_t)
+};
+
+static const olymp_pagesize_t p10_page[] =
+{
+ { "w288h432", "4 x 6", -1, -1, 0, 0, 16, 0}, /* 4x6" */
+ { "B7", "3.5 x 5", -1, -1, 0, 0, 4, 0}, /* 3.5x5" */
+ { "Custom", NULL, -1, -1, 28, 28, 48, 48},
+};
+
+static const olymp_pagesize_list_t p10_page_list =
+{
+ p10_page, sizeof(p10_page) / sizeof(olymp_pagesize_t)
+};
+
+static const olymp_printsize_t p10_printsize[] =
+{
+ { "320x320", "w288h432", 1280, 1848},
+ { "320x320", "B7", 1144, 1591},
+ { "320x320", "Custom", 1280, 1848},
+};
+
+static const olymp_printsize_list_t p10_printsize_list =
+{
+ p10_printsize, sizeof(p10_printsize) / sizeof(olymp_printsize_t)
+};
+
+static void p10_printer_init_func(stp_vars_t *v)
+{
+ stp_zfwrite("\033R\033M\033S\2\033N\1\033D\1\033Y", 1, 15, v);
+ stp_zfwrite((privdata.laminate->seq).data, 1,
+ (privdata.laminate->seq).bytes, v); /* laminate */
+ stp_zfwrite("\033Z\0", 1, 3, v);
+}
+
+static void p10_printer_end_func(stp_vars_t *v)
+{
+ stp_zfwrite("\033P", 1, 2, v);
+}
+
+static void p10_block_init_func(stp_vars_t *v)
+{
+ stp_zprintf(v, "\033T%c", privdata.plane);
+ stp_put16_le(privdata.block_min_x, v);
+ stp_put16_le(privdata.block_min_y, v);
+ stp_put16_le(privdata.block_max_x + 1, v);
+ stp_put16_le(privdata.block_max_y + 1, v);
+}
+
+static const laminate_t p10_laminate[] =
+{
+ {"Coated", N_("Coated"), {1, "\x00"}},
+ {"None", N_("None"), {1, "\x02"}},
+};
+
+static const laminate_list_t p10_laminate_list =
+{
+ p10_laminate, sizeof(p10_laminate) / sizeof(laminate_t)
+};
+
+
+/* Olympus P-200 series */
+static const olymp_pagesize_t p200_page[] =
+{
+ { "ISOB7", "80x125mm", -1, -1, 16, 17, 33, 33},
+ { "Custom", NULL, -1, -1, 16, 17, 33, 33},
+};
+
+static const olymp_pagesize_list_t p200_page_list =
+{
+ p200_page, sizeof(p200_page) / sizeof(olymp_pagesize_t)
+};
+
+static const olymp_printsize_t p200_printsize[] =
+{
+ { "320x320", "ISOB7", 960, 1280},
+ { "320x320", "Custom", 960, 1280},
+};
+
+static const olymp_printsize_list_t p200_printsize_list =
+{
+ p200_printsize, sizeof(p200_printsize) / sizeof(olymp_printsize_t)
+};
+
+static void p200_printer_init_func(stp_vars_t *v)
+{
+ stp_zfwrite("S000001\0S010001\1", 1, 16, v);
+}
+
+static void p200_plane_init_func(stp_vars_t *v)
+{
+ stp_zprintf(v, "P0%d9999", 3 - privdata.plane+1 );
+ stp_put32_be(privdata.xsize * privdata.ysize, v);
+}
+
+static void p200_printer_end_func(stp_vars_t *v)
+{
+ stp_zprintf(v, "P000001\1");
+}
+
+static const char p200_adj_any[] =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"nowrap\" type=\"spline\" gamma=\"0\">\n"
+ "<sequence count=\"33\" lower-bound=\"0\" upper-bound=\"1\">\n"
+ "0.000000 0.039216 0.078431 0.117647 0.152941 0.192157 0.231373 0.266667\n"
+ "0.301961 0.341176 0.376471 0.411765 0.447059 0.482353 0.513725 0.549020\n"
+ "0.580392 0.615686 0.647059 0.678431 0.709804 0.741176 0.768627 0.796078\n"
+ "0.827451 0.854902 0.878431 0.905882 0.929412 0.949020 0.972549 0.988235\n"
+ "1.000000\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n";
+
+
+/* Olympus P-300 series */
+static const olymp_resolution_t p300_res[] =
+{
+ { "306x306", 306, 306},
+ { "153x153", 153, 153},
+};
+
+static const olymp_resolution_list_t p300_res_list =
+{
+ p300_res, sizeof(p300_res) / sizeof(olymp_resolution_t)
+};
+
+static const olymp_pagesize_t p300_page[] =
+{
+ { "A6", NULL, -1, -1, 28, 28, 48, 48},
+ { "Custom", NULL, -1, -1, 28, 28, 48, 48},
+};
+
+static const olymp_pagesize_list_t p300_page_list =
+{
+ p300_page, sizeof(p300_page) / sizeof(olymp_pagesize_t)
+};
+
+static const olymp_printsize_t p300_printsize[] =
+{
+ { "306x306", "A6", 1024, 1376},
+ { "153x153", "A6", 512, 688},
+ { "306x306", "Custom", 1024, 1376},
+ { "153x153", "Custom", 1024, 1376},
+};
+
+static const olymp_printsize_list_t p300_printsize_list =
+{
+ p300_printsize, sizeof(p300_printsize) / sizeof(olymp_printsize_t)
+};
+
+static void p300_printer_init_func(stp_vars_t *v)
+{
+ stp_zfwrite("\033\033\033C\033N\1\033F\0\1\033MS\xff\xff\xff"
+ "\033Z", 1, 19, v);
+ stp_put16_be(privdata.xdpi, v);
+ stp_put16_be(privdata.ydpi, v);
+}
+
+static void p300_plane_end_func(stp_vars_t *v)
+{
+ const char *c = "CMY";
+ stp_zprintf(v, "\033\033\033P%cS", c[privdata.plane-1]);
+ stp_deprintf(STP_DBG_OLYMPUS, "olympus: p300_plane_end_func: %c\n",
+ c[privdata.plane-1]);
+}
+
+static void p300_block_init_func(stp_vars_t *v)
+{
+ const char *c = "CMY";
+ stp_zprintf(v, "\033\033\033W%c", c[privdata.plane-1]);
+ stp_put16_be(privdata.block_min_y, v);
+ stp_put16_be(privdata.block_min_x, v);
+ stp_put16_be(privdata.block_max_y, v);
+ stp_put16_be(privdata.block_max_x, v);
+
+ stp_deprintf(STP_DBG_OLYMPUS, "olympus: p300_block_init_func: %d-%dx%d-%d\n",
+ privdata.block_min_x, privdata.block_max_x,
+ privdata.block_min_y, privdata.block_max_y);
+}
+
+static const char p300_adj_cyan[] =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"nowrap\" type=\"spline\" gamma=\"0\">\n"
+ "<sequence count=\"32\" lower-bound=\"0\" upper-bound=\"1\">\n"
+ "0.078431 0.211765 0.250980 0.282353 0.309804 0.333333 0.352941 0.368627\n"
+ "0.388235 0.403922 0.427451 0.443137 0.458824 0.478431 0.498039 0.513725\n"
+ "0.529412 0.545098 0.556863 0.576471 0.592157 0.611765 0.627451 0.647059\n"
+ "0.666667 0.682353 0.701961 0.713725 0.725490 0.729412 0.733333 0.737255\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n";
+
+static const char p300_adj_magenta[] =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"nowrap\" type=\"spline\" gamma=\"0\">\n"
+ "<sequence count=\"32\" lower-bound=\"0\" upper-bound=\"1\">\n"
+ "0.047059 0.211765 0.250980 0.278431 0.305882 0.333333 0.349020 0.364706\n"
+ "0.380392 0.396078 0.415686 0.435294 0.450980 0.466667 0.482353 0.498039\n"
+ "0.513725 0.525490 0.541176 0.556863 0.572549 0.592157 0.611765 0.631373\n"
+ "0.650980 0.670588 0.694118 0.705882 0.721569 0.741176 0.745098 0.756863\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n";
+
+static const char p300_adj_yellow[] =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"nowrap\" type=\"spline\" gamma=\"0\">\n"
+ "<sequence count=\"32\" lower-bound=\"0\" upper-bound=\"1\">\n"
+ "0.047059 0.117647 0.203922 0.250980 0.274510 0.301961 0.321569 0.337255\n"
+ "0.352941 0.364706 0.380392 0.396078 0.407843 0.423529 0.439216 0.450980\n"
+ "0.466667 0.482353 0.498039 0.513725 0.533333 0.552941 0.572549 0.596078\n"
+ "0.615686 0.635294 0.650980 0.666667 0.682353 0.690196 0.701961 0.713725\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n";
+
+
+/* Olympus P-400 series */
+static const olymp_resolution_t res_314dpi[] =
+{
+ { "314x314", 314, 314},
+};
+
+static const olymp_resolution_list_t res_314dpi_list =
+{
+ res_314dpi, sizeof(res_314dpi) / sizeof(olymp_resolution_t)
+};
+
+static const olymp_pagesize_t p400_page[] =
+{
+ { "A4", NULL, -1, -1, 22, 22, 54, 54},
+ { "c8x10", "A5 wide", -1, -1, 58, 59, 84, 85},
+ { "C6", "2 Postcards (A4)", -1, -1, 9, 9, 9, 9},
+ { "Custom", NULL, -1, -1, 22, 22, 54, 54},
+};
+
+static const olymp_pagesize_list_t p400_page_list =
+{
+ p400_page, sizeof(p400_page) / sizeof(olymp_pagesize_t)
+};
+
+static const olymp_printsize_t p400_printsize[] =
+{
+ { "314x314", "A4", 2400, 3200},
+ { "314x314", "c8x10", 2000, 2400},
+ { "314x314", "C6", 1328, 1920},
+ { "314x314", "Custom", 2400, 3200},
+};
+
+static const olymp_printsize_list_t p400_printsize_list =
+{
+ p400_printsize, sizeof(p400_printsize) / sizeof(olymp_printsize_t)
+};
+
+static void p400_printer_init_func(stp_vars_t *v)
+{
+ int wide = (strcmp(privdata.pagesize, "c8x10") == 0
+ || strcmp(privdata.pagesize, "C6") == 0);
+
+ stp_zprintf(v, "\033ZQ"); stp_zfwrite(zero, 1, 61, v);
+ stp_zprintf(v, "\033FP"); stp_zfwrite(zero, 1, 61, v);
+ stp_zprintf(v, "\033ZF");
+ stp_putc((wide ? '\x40' : '\x00'), v); stp_zfwrite(zero, 1, 60, v);
+ stp_zprintf(v, "\033ZS");
+ if (wide)
+ {
+ stp_put16_be(privdata.ysize, v);
+ stp_put16_be(privdata.xsize, v);
+ }
+ else
+ {
+ stp_put16_be(privdata.xsize, v);
+ stp_put16_be(privdata.ysize, v);
+ }
+ stp_zfwrite(zero, 1, 57, v);
+ stp_zprintf(v, "\033ZP"); stp_zfwrite(zero, 1, 61, v);
+}
+
+static void p400_plane_init_func(stp_vars_t *v)
+{
+ stp_zprintf(v, "\033ZC"); stp_zfwrite(zero, 1, 61, v);
+}
+
+static void p400_plane_end_func(stp_vars_t *v)
+{
+ stp_zprintf(v, "\033P"); stp_zfwrite(zero, 1, 62, v);
+}
+
+static void p400_block_init_func(stp_vars_t *v)
+{
+ int wide = (strcmp(privdata.pagesize, "c8x10") == 0
+ || strcmp(privdata.pagesize, "C6") == 0);
+
+ stp_zprintf(v, "\033Z%c", '3' - privdata.plane + 1);
+ if (wide)
+ {
+ stp_put16_be(privdata.ysize - privdata.block_max_y - 1, v);
+ stp_put16_be(privdata.xsize - privdata.block_max_x - 1, v);
+ stp_put16_be(privdata.block_max_y - privdata.block_min_y + 1, v);
+ stp_put16_be(privdata.block_max_x - privdata.block_min_x + 1, v);
+ }
+ else
+ {
+ stp_put16_be(privdata.block_min_x, v);
+ stp_put16_be(privdata.block_min_y, v);
+ stp_put16_be(privdata.block_max_x - privdata.block_min_x + 1, v);
+ stp_put16_be(privdata.block_max_y - privdata.block_min_y + 1, v);
+ }
+ stp_zfwrite(zero, 1, 53, v);
+}
+
+static const char p400_adj_cyan[] =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"nowrap\" type=\"spline\" gamma=\"0\">\n"
+ "<sequence count=\"32\" lower-bound=\"0\" upper-bound=\"1\">\n"
+ "0.003922 0.031373 0.058824 0.090196 0.125490 0.156863 0.184314 0.219608\n"
+ "0.250980 0.278431 0.309804 0.341176 0.376471 0.403922 0.439216 0.470588\n"
+ "0.498039 0.517647 0.533333 0.545098 0.564706 0.576471 0.596078 0.615686\n"
+ "0.627451 0.647059 0.658824 0.678431 0.690196 0.705882 0.721569 0.737255\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n";
+
+static const char p400_adj_magenta[] =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"nowrap\" type=\"spline\" gamma=\"0\">\n"
+ "<sequence count=\"32\" lower-bound=\"0\" upper-bound=\"1\">\n"
+ "0.003922 0.031373 0.062745 0.098039 0.125490 0.156863 0.188235 0.215686\n"
+ "0.250980 0.282353 0.309804 0.345098 0.376471 0.407843 0.439216 0.470588\n"
+ "0.501961 0.521569 0.549020 0.572549 0.592157 0.619608 0.643137 0.662745\n"
+ "0.682353 0.713725 0.737255 0.756863 0.784314 0.807843 0.827451 0.850980\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n";
+
+static const char p400_adj_yellow[] =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"nowrap\" type=\"spline\" gamma=\"0\">\n"
+ "<sequence count=\"32\" lower-bound=\"0\" upper-bound=\"1\">\n"
+ "0.003922 0.027451 0.054902 0.090196 0.121569 0.156863 0.184314 0.215686\n"
+ "0.250980 0.282353 0.309804 0.345098 0.372549 0.400000 0.435294 0.466667\n"
+ "0.498039 0.525490 0.552941 0.580392 0.607843 0.631373 0.658824 0.678431\n"
+ "0.698039 0.725490 0.760784 0.784314 0.811765 0.839216 0.866667 0.890196\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n";
+
+
+/* Olympus P-440 series */
+static const olymp_pagesize_t p440_page[] =
+{
+ { "A4", NULL, -1, -1, 10, 9, 54, 54},
+ { "c8x10", "A5 wide", -1, -1, 58, 59, 72, 72},
+ { "C6", "2 Postcards (A4)", -1, -1, 9, 9, 9, 9},
+ { "w255h581", "A6 wide", -1, -1, 25, 25, 25, 24},
+ { "Custom", NULL, -1, -1, 22, 22, 54, 54},
+};
+
+static const olymp_pagesize_list_t p440_page_list =
+{
+ p440_page, sizeof(p440_page) / sizeof(olymp_pagesize_t)
+};
+
+static const olymp_printsize_t p440_printsize[] =
+{
+ { "314x314", "A4", 2508, 3200},
+ { "314x314", "c8x10", 2000, 2508},
+ { "314x314", "C6", 1328, 1920},
+ { "314x314", "w255h581", 892, 2320},
+ { "314x314", "Custom", 2508, 3200},
+};
+
+static const olymp_printsize_list_t p440_printsize_list =
+{
+ p440_printsize, sizeof(p440_printsize) / sizeof(olymp_printsize_t)
+};
+
+static void p440_printer_init_func(stp_vars_t *v)
+{
+ int wide = ! (strcmp(privdata.pagesize, "A4") == 0
+ || strcmp(privdata.pagesize, "Custom") == 0);
+
+ stp_zprintf(v, "\033FP"); stp_zfwrite(zero, 1, 61, v);
+ stp_zprintf(v, "\033Y");
+ stp_zfwrite((privdata.laminate->seq).data, 1,
+ (privdata.laminate->seq).bytes, v); /* laminate */
+ stp_zfwrite(zero, 1, 61, v);
+ stp_zprintf(v, "\033FC"); stp_zfwrite(zero, 1, 61, v);
+ stp_zprintf(v, "\033ZF");
+ stp_putc((wide ? '\x40' : '\x00'), v); stp_zfwrite(zero, 1, 60, v);
+ stp_zprintf(v, "\033N\1"); stp_zfwrite(zero, 1, 61, v);
+ stp_zprintf(v, "\033ZS");
+ if (wide)
+ {
+ stp_put16_be(privdata.ysize, v);
+ stp_put16_be(privdata.xsize, v);
+ }
+ else
+ {
+ stp_put16_be(privdata.xsize, v);
+ stp_put16_be(privdata.ysize, v);
+ }
+ stp_zfwrite(zero, 1, 57, v);
+ if (strcmp(privdata.pagesize, "C6") == 0)
+ {
+ stp_zprintf(v, "\033ZC"); stp_zfwrite(zero, 1, 61, v);
+ }
+}
+
+static void p440_printer_end_func(stp_vars_t *v)
+{
+ stp_zprintf(v, "\033P"); stp_zfwrite(zero, 1, 62, v);
+}
+
+static void p440_block_init_func(stp_vars_t *v)
+{
+ int wide = ! (strcmp(privdata.pagesize, "A4") == 0
+ || strcmp(privdata.pagesize, "Custom") == 0);
+
+ stp_zprintf(v, "\033ZT");
+ if (wide)
+ {
+ stp_put16_be(privdata.ysize - privdata.block_max_y - 1, v);
+ stp_put16_be(privdata.xsize - privdata.block_max_x - 1, v);
+ stp_put16_be(privdata.block_max_y - privdata.block_min_y + 1, v);
+ stp_put16_be(privdata.block_max_x - privdata.block_min_x + 1, v);
+ }
+ else
+ {
+ stp_put16_be(privdata.block_min_x, v);
+ stp_put16_be(privdata.block_min_y, v);
+ stp_put16_be(privdata.block_max_x - privdata.block_min_x + 1, v);
+ stp_put16_be(privdata.block_max_y - privdata.block_min_y + 1, v);
+ }
+ stp_zfwrite(zero, 1, 53, v);
+}
+
+static void p440_block_end_func(stp_vars_t *v)
+{
+ int pad = (64 - (((privdata.block_max_x - privdata.block_min_x + 1)
+ * (privdata.block_max_y - privdata.block_min_y + 1) * 3) % 64)) % 64;
+ stp_deprintf(STP_DBG_OLYMPUS,
+ "olympus: max_x %d min_x %d max_y %d min_y %d\n",
+ privdata.block_max_x, privdata.block_min_x,
+ privdata.block_max_y, privdata.block_min_y);
+ stp_deprintf(STP_DBG_OLYMPUS, "olympus: olympus-p440 padding=%d\n", pad);
+ stp_zfwrite(zero, 1, pad, v);
+}
+
+
+/* Canon CP-100 series */
+static const olymp_pagesize_t cpx00_page[] =
+{
+ { "Postcard", "Postcard 148x100mm", -1, -1, 13, 13, 16, 18},
+ { "w253h337", "CP_L 89x119mm", -1, -1, 13, 13, 15, 15},
+ { "w244h155", "Card 54x86mm", -1, -1, 15, 15, 13, 13},
+ { "Custom", NULL, -1, -1, 13, 13, 16, 18},
+};
+
+static const olymp_pagesize_list_t cpx00_page_list =
+{
+ cpx00_page, sizeof(cpx00_page) / sizeof(olymp_pagesize_t)
+};
+
+static const olymp_printsize_t cpx00_printsize[] =
+{
+ { "314x314", "Postcard", 1232, 1808},
+ { "314x314", "w253h337", 1100, 1456},
+ { "314x314", "w244h155", 1040, 672},
+ { "314x314", "Custom", 1232, 1808},
+};
+
+static const olymp_printsize_list_t cpx00_printsize_list =
+{
+ cpx00_printsize, sizeof(cpx00_printsize) / sizeof(olymp_printsize_t)
+};
+
+static void cpx00_printer_init_func(stp_vars_t *v)
+{
+ char pg = (strcmp(privdata.pagesize, "Postcard") == 0 ? '\1' :
+ (strcmp(privdata.pagesize, "w253h337") == 0 ? '\2' :
+ (strcmp(privdata.pagesize, "w244h155") == 0 ? '\3' :
+ (strcmp(privdata.pagesize, "w283h566") == 0 ? '\4' :
+ '\1' ))));
+
+ stp_put16_be(0x4000, v);
+ stp_putc('\0', v);
+ stp_putc(pg, v);
+ stp_zfwrite(zero, 1, 8, v);
+}
+
+static void cpx00_plane_init_func(stp_vars_t *v)
+{
+ stp_put16_be(0x4001, v);
+ stp_put16_le(3 - privdata.plane, v);
+ stp_put32_le(privdata.xsize * privdata.ysize, v);
+ stp_zfwrite(zero, 1, 4, v);
+}
+
+static const char cpx00_adj_cyan[] =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"nowrap\" type=\"spline\" gamma=\"0\">\n"
+ "<sequence count=\"32\" lower-bound=\"0\" upper-bound=\"1\">\n"
+ "0.000000 0.035294 0.070588 0.101961 0.117647 0.168627 0.180392 0.227451\n"
+ "0.258824 0.286275 0.317647 0.341176 0.376471 0.411765 0.427451 0.478431\n"
+ "0.505882 0.541176 0.576471 0.611765 0.654902 0.678431 0.705882 0.737255\n"
+ "0.764706 0.792157 0.811765 0.839216 0.862745 0.894118 0.909804 0.925490\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n";
+
+static const char cpx00_adj_magenta[] =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"nowrap\" type=\"spline\" gamma=\"0\">\n"
+ "<sequence count=\"32\" lower-bound=\"0\" upper-bound=\"1\">\n"
+ "0.011765 0.019608 0.035294 0.047059 0.054902 0.101961 0.133333 0.156863\n"
+ "0.192157 0.235294 0.274510 0.321569 0.360784 0.403922 0.443137 0.482353\n"
+ "0.521569 0.549020 0.584314 0.619608 0.658824 0.705882 0.749020 0.792157\n"
+ "0.831373 0.890196 0.933333 0.964706 0.988235 0.992157 0.992157 0.996078\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n";
+
+static const char cpx00_adj_yellow[] =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"nowrap\" type=\"spline\" gamma=\"0\">\n"
+ "<sequence count=\"32\" lower-bound=\"0\" upper-bound=\"1\">\n"
+ "0.003922 0.015686 0.015686 0.023529 0.027451 0.054902 0.094118 0.129412\n"
+ "0.180392 0.219608 0.250980 0.286275 0.317647 0.341176 0.388235 0.427451\n"
+ "0.470588 0.509804 0.552941 0.596078 0.627451 0.682353 0.768627 0.796078\n"
+ "0.890196 0.921569 0.949020 0.968627 0.984314 0.992157 0.992157 1.000000\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n";
+
+
+/* Canon CP-220 series */
+static const olymp_pagesize_t cp220_page[] =
+{
+ { "Postcard", "Postcard 148x100mm", -1, -1, 13, 13, 16, 18},
+ { "w253h337", "CP_L 89x119mm", -1, -1, 13, 13, 15, 15},
+ { "w244h155", "Card 54x86mm", -1, -1, 15, 15, 13, 13},
+ { "w283h566", "Wide 200x100mm", -1, -1, 13, 13, 20, 20},
+ { "Custom", NULL, -1, -1, 13, 13, 16, 18},
+};
+
+static const olymp_pagesize_list_t cp220_page_list =
+{
+ cp220_page, sizeof(cp220_page) / sizeof(olymp_pagesize_t)
+};
+
+static const olymp_printsize_t cp220_printsize[] =
+{
+ { "314x314", "Postcard", 1232, 1808},
+ { "314x314", "w253h337", 1100, 1456},
+ { "314x314", "w244h155", 1040, 672},
+ { "314x314", "w283h566", 1232, 2416},
+ { "314x314", "Custom", 1232, 1808},
+};
+
+static const olymp_printsize_list_t cp220_printsize_list =
+{
+ cp220_printsize, sizeof(cp220_printsize) / sizeof(olymp_printsize_t)
+};
+
+
+/* Sony UP-DP10 */
+static const olymp_resolution_t updp10_res[] =
+{
+ { "300x300", 300, 300},
+};
+
+static const olymp_resolution_list_t updp10_res_list =
+{
+ updp10_res, sizeof(updp10_res) / sizeof(olymp_resolution_t)
+};
+
+static const olymp_pagesize_t updp10_page[] =
+{
+ { "w288h432", "UPC-10P23 (2:3)", -1, -1, 12, 12, 18, 18},
+ { "w288h387", "UPC-10P34 (3:4)", -1, -1, 12, 12, 16, 16},
+ { "w288h432", "UPC-10S01 (Sticker)", -1, -1, 12, 12, 18, 18},
+ { "Custom", NULL, -1, -1, 12, 12, 0, 0},
+};
+
+static const olymp_pagesize_list_t updp10_page_list =
+{
+ updp10_page, sizeof(updp10_page) / sizeof(olymp_pagesize_t)
+};
+
+static const olymp_printsize_t updp10_printsize[] =
+{
+ { "300x300", "w288h432", 1200, 1800},
+ { "300x300", "w288h387", 1200, 1600},
+ { "300x300", "Custom", 1200, 1800},
+};
+
+static const olymp_printsize_list_t updp10_printsize_list =
+{
+ updp10_printsize, sizeof(updp10_printsize) / sizeof(olymp_printsize_t)
+};
+
+static void updp10_printer_init_func(stp_vars_t *v)
+{
+ stp_zfwrite("\x98\xff\xff\xff\xff\xff\xff\xff"
+ "\x14\x00\x00\x00\x1b\x15\x00\x00"
+ "\x00\x0d\x00\x00\x00\x00\x00\xc7"
+ "\x00\x00\x00\x00", 1, 28, v);
+ stp_put16_be(privdata.xsize, v);
+ stp_put16_be(privdata.ysize, v);
+ stp_put32_le(privdata.xsize*privdata.ysize*3+11, v);
+ stp_zfwrite("\x1b\xea\x00\x00\x00\x00", 1, 6, v);
+ stp_put32_be(privdata.xsize*privdata.ysize*3, v);
+ stp_zfwrite("\x00", 1, 1, v);
+}
+
+static void updp10_printer_end_func(stp_vars_t *v)
+{
+ stp_zfwrite("\x12\x00\x00\x00\x1b\xe1\x00\x00"
+ "\x00\xb0\x00\x00\04", 1, 13, v);
+ stp_zfwrite((privdata.laminate->seq).data, 1,
+ (privdata.laminate->seq).bytes, v); /*laminate pattern*/
+ stp_zfwrite("\x00\x00\x00\x00" , 1, 4, v);
+ stp_put16_be(privdata.ysize, v);
+ stp_put16_be(privdata.xsize, v);
+ stp_zfwrite("\xff\xff\xff\xff\x09\x00\x00\x00"
+ "\x1b\xee\x00\x00\x00\x02\x00\x00"
+ "\x01\x07\x00\x00\x00\x1b\x0a\x00"
+ "\x00\x00\x00\x00\xfd\xff\xff\xff"
+ "\xff\xff\xff\xff\xf8\xff\xff\xff"
+ , 1, 40, v);
+}
+
+static const laminate_t updp10_laminate[] =
+{
+ {"Glossy", N_("Glossy"), {1, "\x00"}},
+ {"Texture", N_("Texture"), {1, "\x08"}},
+ {"Matte", N_("Matte"), {1, "\x0c"}},
+};
+
+static const laminate_list_t updp10_laminate_list =
+{
+ updp10_laminate, sizeof(updp10_laminate) / sizeof(laminate_t)
+};
+
+static const char updp10_adj_cyan[] =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"nowrap\" type=\"spline\" gamma=\"0\">\n"
+ "<sequence count=\"33\" lower-bound=\"0\" upper-bound=\"1\">\n"
+ "0.113725 0.188235 0.247059 0.286275 0.317647 0.345098 0.368627 0.384314\n"
+ "0.400000 0.407843 0.423529 0.439216 0.450980 0.466667 0.482353 0.498039\n"
+ "0.509804 0.525490 0.545098 0.560784 0.580392 0.596078 0.619608 0.643137\n"
+ "0.662745 0.686275 0.709804 0.729412 0.756863 0.780392 0.811765 0.843137\n"
+ "1.000000\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n";
+
+static const char updp10_adj_magenta[] =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"nowrap\" type=\"spline\" gamma=\"0\">\n"
+ "<sequence count=\"33\" lower-bound=\"0\" upper-bound=\"1\">\n"
+ "0.105882 0.211765 0.286275 0.333333 0.364706 0.388235 0.403922 0.415686\n"
+ "0.427451 0.439216 0.450980 0.462745 0.478431 0.494118 0.505882 0.521569\n"
+ "0.537255 0.552941 0.568627 0.584314 0.600000 0.619608 0.643137 0.662745\n"
+ "0.682353 0.709804 0.733333 0.760784 0.792157 0.823529 0.858824 0.890196\n"
+ "1.000000\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n";
+
+static const char updp10_adj_yellow[] =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<gutenprint>\n"
+ "<curve wrap=\"nowrap\" type=\"spline\" gamma=\"0\">\n"
+ "<sequence count=\"33\" lower-bound=\"0\" upper-bound=\"1\">\n"
+ "0.101961 0.160784 0.196078 0.227451 0.243137 0.254902 0.266667 0.286275\n"
+ "0.309804 0.337255 0.368627 0.396078 0.423529 0.443137 0.462745 0.478431\n"
+ "0.501961 0.517647 0.537255 0.556863 0.576471 0.596078 0.619608 0.643137\n"
+ "0.666667 0.690196 0.709804 0.737255 0.760784 0.780392 0.796078 0.803922\n"
+ "1.000000\n"
+ "</sequence>\n"
+ "</curve>\n"
+ "</gutenprint>\n";
+
+
+/* Fujifilm CX-400 */
+static const olymp_resolution_t cx400_res[] =
+{
+ { "317x316", 317, 316},
+};
+
+static const olymp_resolution_list_t cx400_res_list =
+{
+ cx400_res, sizeof(cx400_res) / sizeof(olymp_resolution_t)
+};
+
+static const olymp_pagesize_t cx400_page[] =
+{
+ { "w288h432", NULL, -1, -1, 23, 23, 28, 28},
+ { "w288h387", "4x5 3/8 (Digital Camera 3:4)", -1, -1, 23, 23, 27, 26},
+ { "w288h504", NULL, -1, -1, 23, 23, 23, 22},
+ { "Custom", NULL, -1, -1, 0, 0, 0, 0},
+};
+
+static const olymp_pagesize_list_t cx400_page_list =
+{
+ cx400_page, sizeof(cx400_page) / sizeof(olymp_pagesize_t)
+};
+
+static const olymp_printsize_t cx400_printsize[] =
+{
+ { "317x316", "w288h387", 1268, 1658},
+ { "317x316", "w288h432", 1268, 1842},
+ { "317x316", "w288h504", 1268, 2208},
+ { "317x316", "Custom", 1268, 1842},
+};
+
+static const olymp_printsize_list_t cx400_printsize_list =
+{
+ cx400_printsize, sizeof(cx400_printsize) / sizeof(olymp_printsize_t)
+};
+
+static void cx400_printer_init_func(stp_vars_t *v)
+{
+ char pg = '\0';
+ const char *pname = "XXXXXX";
+
+ stp_deprintf(STP_DBG_OLYMPUS,
+ "olympus: fuji driver %s\n", stp_get_driver(v));
+ if (strcmp(stp_get_driver(v),"fujifilm-cx400") == 0)
+ pname = "NX1000";
+ else if (strcmp(stp_get_driver(v),"fujifilm-cx550") == 0)
+ pname = "QX200\0";
+
+ stp_zfwrite("FUJIFILM", 1, 8, v);
+ stp_zfwrite(pname, 1, 6, v);
+ stp_putc('\0', v);
+ stp_put16_le(privdata.xsize, v);
+ stp_put16_le(privdata.ysize, v);
+ if (strcmp(privdata.pagesize,"w288h504") == 0)
+ pg = '\x0d';
+ else if (strcmp(privdata.pagesize,"w288h432") == 0)
+ pg = '\x0c';
+ else if (strcmp(privdata.pagesize,"w288h387") == 0)
+ pg = '\x0b';
+ stp_putc(pg, v);
+ stp_zfwrite("\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00"
+ "\x00\x00\x2d\x00\x00\x00\x00", 1, 19, v);
+ stp_zfwrite("FUJIFILM", 1, 8, v);
+ stp_zfwrite(pname, 1, 6, v);
+ stp_putc('\1', v);
+}
+
+static const olymp_resolution_t all_resolutions[] =
+{
+ { "306x306", 306, 306},
+ { "153x153", 153, 153},
+ { "314x314", 314, 314},
+ { "300x300", 300, 300},
+ { "317x316", 317, 316},
+ { "320x320", 320, 320},
+};
+
+static const olymp_resolution_list_t all_res_list =
+{
+ all_resolutions, sizeof(all_resolutions) / sizeof(olymp_resolution_t)
+};
+
+static const olympus_cap_t olympus_model_capabilities[] =
+{
+ { /* Olympus P-10 */
+ 2,
+ &rgb_ink_list,
+ &res_320dpi_list,
+ &p10_page_list,
+ &p10_printsize_list,
+ OLYMPUS_INTERLACE_PLANE,
+ 1848,
+ OLYMPUS_FEATURE_FULL_WIDTH | OLYMPUS_FEATURE_FULL_HEIGHT,
+ &p10_printer_init_func, &p10_printer_end_func,
+ NULL, NULL,
+ &p10_block_init_func, NULL,
+ NULL, NULL, NULL, /* color profile/adjustment is built into printer */
+ &p10_laminate_list,
+ },
+ { /* Olympus P-200 */
+ 4,
+ &ymc_ink_list,
+ &res_320dpi_list,
+ &p200_page_list,
+ &p200_printsize_list,
+ OLYMPUS_INTERLACE_PLANE,
+ 1280,
+ OLYMPUS_FEATURE_FULL_WIDTH | OLYMPUS_FEATURE_BLOCK_ALIGN,
+ &p200_printer_init_func, &p200_printer_end_func,
+ &p200_plane_init_func, NULL,
+ NULL, NULL,
+ p200_adj_any, p200_adj_any, p200_adj_any,
+ NULL,
+ },
+ { /* Olympus P-300 */
+ 0,
+ &ymc_ink_list,
+ &p300_res_list,
+ &p300_page_list,
+ &p300_printsize_list,
+ OLYMPUS_INTERLACE_PLANE,
+ 16,
+ OLYMPUS_FEATURE_FULL_WIDTH | OLYMPUS_FEATURE_BLOCK_ALIGN,
+ &p300_printer_init_func, NULL,
+ NULL, &p300_plane_end_func,
+ &p300_block_init_func, NULL,
+ p300_adj_cyan, p300_adj_magenta, p300_adj_yellow,
+ NULL,
+ },
+ { /* Olympus P-400 */
+ 1,
+ &ymc_ink_list,
+ &res_314dpi_list,
+ &p400_page_list,
+ &p400_printsize_list,
+ OLYMPUS_INTERLACE_PLANE,
+ 180,
+ OLYMPUS_FEATURE_FULL_WIDTH | OLYMPUS_FEATURE_FULL_HEIGHT,
+ &p400_printer_init_func, NULL,
+ &p400_plane_init_func, &p400_plane_end_func,
+ &p400_block_init_func, NULL,
+ p400_adj_cyan, p400_adj_magenta, p400_adj_yellow,
+ NULL,
+ },
+ { /* Olympus P-440 */
+ 3,
+ &bgr_ink_list,
+ &res_314dpi_list,
+ &p440_page_list,
+ &p440_printsize_list,
+ OLYMPUS_INTERLACE_NONE,
+ 128,
+ OLYMPUS_FEATURE_FULL_WIDTH | OLYMPUS_FEATURE_FULL_HEIGHT,
+ &p440_printer_init_func, &p440_printer_end_func,
+ NULL, NULL,
+ &p440_block_init_func, &p440_block_end_func,
+ NULL, NULL, NULL, /* color profile/adjustment is built into printer */
+ &p10_laminate_list,
+ },
+ { /* Canon CP-100, CP-200, CP-300 */
+ 1000,
+ &ymc_ink_list,
+ &res_314dpi_list,
+ &cpx00_page_list,
+ &cpx00_printsize_list,
+ OLYMPUS_INTERLACE_PLANE,
+ 1808,
+ OLYMPUS_FEATURE_FULL_WIDTH | OLYMPUS_FEATURE_FULL_HEIGHT
+ | OLYMPUS_FEATURE_BORDERLESS | OLYMPUS_FEATURE_WHITE_BORDER,
+ &cpx00_printer_init_func, NULL,
+ &cpx00_plane_init_func, NULL,
+ NULL, NULL,
+ cpx00_adj_cyan, cpx00_adj_magenta, cpx00_adj_yellow,
+ NULL,
+ },
+ { /* Canon CP-220, CP-330, SELPHY CP-400, SELPHY CP-500, SELPHY CP-600 */
+ 1001,
+ &ymc_ink_list,
+ &res_314dpi_list,
+ &cp220_page_list,
+ &cp220_printsize_list,
+ OLYMPUS_INTERLACE_PLANE,
+ 1808,
+ OLYMPUS_FEATURE_FULL_WIDTH | OLYMPUS_FEATURE_FULL_HEIGHT
+ | OLYMPUS_FEATURE_BORDERLESS | OLYMPUS_FEATURE_WHITE_BORDER,
+ &cpx00_printer_init_func, NULL,
+ &cpx00_plane_init_func, NULL,
+ NULL, NULL,
+ cpx00_adj_cyan, cpx00_adj_magenta, cpx00_adj_yellow,
+ NULL,
+ },
+ { /* Sony UP-DP10 */
+ 2000,
+ &cmy_ink_list,
+ &updp10_res_list,
+ &updp10_page_list,
+ &updp10_printsize_list,
+ OLYMPUS_INTERLACE_NONE,
+ 1800,
+ OLYMPUS_FEATURE_FULL_WIDTH | OLYMPUS_FEATURE_FULL_HEIGHT
+ | OLYMPUS_FEATURE_BORDERLESS,
+ &updp10_printer_init_func, &updp10_printer_end_func,
+ NULL, NULL,
+ NULL, NULL,
+ updp10_adj_cyan, updp10_adj_magenta, updp10_adj_yellow,
+ &updp10_laminate_list,
+ },
+ { /* Fujifilm Printpix CX-400 */
+ 3000,
+ &rgb_ink_list,
+ &cx400_res_list,
+ &cx400_page_list,
+ &cx400_printsize_list,
+ OLYMPUS_INTERLACE_NONE,
+ 2208,
+ OLYMPUS_FEATURE_FULL_WIDTH | OLYMPUS_FEATURE_FULL_HEIGHT
+ | OLYMPUS_FEATURE_BORDERLESS,
+ &cx400_printer_init_func, NULL,
+ NULL, NULL,
+ NULL, NULL,
+ NULL, NULL, NULL, /* color profile/adjustment is built into printer */
+ NULL,
+ },
+ { /* Fujifilm Printpix CX-550 */
+ 3001,
+ &rgb_ink_list,
+ &cx400_res_list,
+ &cx400_page_list,
+ &cx400_printsize_list,
+ OLYMPUS_INTERLACE_NONE,
+ 2208,
+ OLYMPUS_FEATURE_FULL_WIDTH | OLYMPUS_FEATURE_FULL_HEIGHT
+ | OLYMPUS_FEATURE_BORDERLESS,
+ &cx400_printer_init_func, NULL,
+ NULL, NULL,
+ NULL, NULL,
+ NULL, NULL, NULL, /* color profile/adjustment is built into printer */
+ NULL,
+ },
+};
+
+static const stp_parameter_t the_parameters[] =
+{
+ {
+ "PageSize", N_("Page Size"), N_("Basic Printer Setup"),
+ N_("Size of the paper being printed to"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "MediaType", N_("Media Type"), N_("Basic Printer Setup"),
+ N_("Type of media (plain paper, photo paper, etc.)"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "InputSlot", N_("Media Source"), N_("Basic Printer Setup"),
+ N_("Source (input slot) of the media"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "Resolution", N_("Resolution"), N_("Basic Printer Setup"),
+ N_("Resolution and quality of the print"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "InkType", N_("Ink Type"), N_("Advanced Printer Setup"),
+ N_("Type of ink in the printer"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "Laminate", N_("Laminate Pattern"), N_("Advanced Printer Setup"),
+ N_("Laminate Pattern"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 0, -1, 1, 0
+ },
+ {
+ "Borderless", N_("Borderless"), N_("Advanced Printer Setup"),
+ N_("Print without borders"),
+ STP_PARAMETER_TYPE_BOOLEAN, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 0, -1, 1, 0
+ },
+ {
+ "PrintingMode", N_("Printing Mode"), N_("Core Parameter"),
+ N_("Printing Output Mode"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+};
+
+static int the_parameter_count =
+sizeof(the_parameters) / sizeof(const stp_parameter_t);
+
+typedef struct
+{
+ const stp_parameter_t param;
+ double min;
+ double max;
+ double defval;
+ int color_only;
+} float_param_t;
+
+static const float_param_t float_parameters[] =
+{
+ {
+ {
+ "CyanDensity", N_("Cyan Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the cyan balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 1, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "MagentaDensity", N_("Magenta Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the magenta balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 2, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "YellowDensity", N_("Yellow Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the yellow balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 3, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "BlackDensity", N_("Black Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the black balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 0, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+};
+
+static const int float_parameter_count =
+sizeof(float_parameters) / sizeof(const float_param_t);
+
+static const olympus_cap_t* olympus_get_model_capabilities(int model)
+{
+ int i;
+ int models = sizeof(olympus_model_capabilities) / sizeof(olympus_cap_t);
+
+ for (i=0; i<models; i++)
+ {
+ if (olympus_model_capabilities[i].model == model)
+ return &(olympus_model_capabilities[i]);
+ }
+ stp_deprintf(STP_DBG_OLYMPUS,
+ "olympus: model %d not found in capabilities list.\n", model);
+ return &(olympus_model_capabilities[0]);
+}
+
+static const laminate_t* olympus_get_laminate_pattern(stp_vars_t *v)
+{
+ const char *lpar = stp_get_string_parameter(v, "Laminate");
+ const olympus_cap_t *caps = olympus_get_model_capabilities(
+ stp_get_model_id(v));
+ const laminate_list_t *llist = caps->laminate;
+ const laminate_t *l = NULL;
+ int i;
+
+ for (i = 0; i < llist->n_items; i++)
+ {
+ l = &(llist->item[i]);
+ if (strcmp(l->name, lpar) == 0)
+ break;
+ }
+ return l;
+}
+
+static void
+olympus_printsize(const stp_vars_t *v,
+ int *width,
+ int *height)
+{
+ int i;
+ const char *page = stp_get_string_parameter(v, "PageSize");
+ const char *resolution = stp_get_string_parameter(v, "Resolution");
+ const olympus_cap_t *caps = olympus_get_model_capabilities(
+ stp_get_model_id(v));
+ const olymp_printsize_list_t *p = caps->printsize;
+
+ for (i = 0; i < p->n_items; i++)
+ {
+ if (strcmp(p->item[i].res_name,resolution) == 0 &&
+ strcmp(p->item[i].pagesize_name,page) == 0)
+ {
+ *width = p->item[i].width_px;
+ *height = p->item[i].height_px;
+ return;
+ }
+ }
+ stp_erprintf("olympus_printsize: printsize not found (%s, %s)\n",
+ page, resolution);
+}
+
+static int
+olympus_feature(const olympus_cap_t *caps, int feature)
+{
+ return ((caps->features & feature) == feature);
+}
+
+static stp_parameter_list_t
+olympus_list_parameters(const stp_vars_t *v)
+{
+ stp_parameter_list_t *ret = stp_parameter_list_create();
+ int i;
+
+ for (i = 0; i < the_parameter_count; i++)
+ stp_parameter_list_add_param(ret, &(the_parameters[i]));
+ for (i = 0; i < float_parameter_count; i++)
+ stp_parameter_list_add_param(ret, &(float_parameters[i].param));
+ return ret;
+}
+
+static void
+olympus_parameters(const stp_vars_t *v, const char *name,
+ stp_parameter_t *description)
+{
+ int i;
+ const olympus_cap_t *caps = olympus_get_model_capabilities(
+ stp_get_model_id(v));
+
+ description->p_type = STP_PARAMETER_TYPE_INVALID;
+ if (name == NULL)
+ return;
+
+ description->deflt.str = NULL;
+ for (i = 0; i < float_parameter_count; i++)
+ if (strcmp(name, float_parameters[i].param.name) == 0)
+ {
+ stp_fill_parameter_settings(description,
+ &(float_parameters[i].param));
+ description->deflt.dbl = float_parameters[i].defval;
+ description->bounds.dbl.upper = float_parameters[i].max;
+ description->bounds.dbl.lower = float_parameters[i].min;
+ }
+
+ for (i = 0; i < the_parameter_count; i++)
+ if (strcmp(name, the_parameters[i].name) == 0)
+ {
+ stp_fill_parameter_settings(description, &(the_parameters[i]));
+ break;
+ }
+ if (strcmp(name, "PageSize") == 0)
+ {
+ int default_specified = 0;
+ const olymp_pagesize_list_t *p = caps->pages;
+ const char* text;
+
+ description->bounds.str = stp_string_list_create();
+ for (i = 0; i < p->n_items; i++)
+ {
+ const stp_papersize_t *pt = stp_get_papersize_by_name(
+ p->item[i].name);
+
+ text = (p->item[i].text ? p->item[i].text : pt->text);
+ stp_string_list_add_string(description->bounds.str,
+ p->item[i].name, text);
+ if (! default_specified && pt && pt->width > 0 && pt->height > 0)
+ {
+ description->deflt.str = p->item[i].name;
+ default_specified = 1;
+ }
+ }
+ if (!default_specified)
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
+ else if (strcmp(name, "MediaType") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ description->is_active = 0;
+ }
+ else if (strcmp(name, "InputSlot") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ description->is_active = 0;
+ }
+ else if (strcmp(name, "Resolution") == 0)
+ {
+ char res_text[24];
+ const olymp_resolution_list_t *r = caps->resolution;
+
+ description->bounds.str = stp_string_list_create();
+ for (i = 0; i < r->n_items; i++)
+ {
+ sprintf(res_text, "%s DPI", r->item[i].name);
+ stp_string_list_add_string(description->bounds.str,
+ r->item[i].name, _(res_text));
+ }
+ if (r->n_items < 1)
+ description->is_active = 0;
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
+ else if (strcmp(name, "InkType") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ for (i = 0; i < caps->inks->n_items; i++)
+ stp_string_list_add_string(description->bounds.str,
+ caps->inks->item[i].name, caps->inks->item[i].name);
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ if (caps->inks->n_items < 2)
+ description->is_active = 0;
+ }
+ else if (strcmp(name, "Laminate") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ if (caps->laminate)
+ {
+ const laminate_list_t *llist = caps->laminate;
+
+ for (i = 0; i < llist->n_items; i++)
+ {
+ const laminate_t *l = &(llist->item[i]);
+ stp_string_list_add_string(description->bounds.str,
+ l->name, l->text);
+ }
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ description->is_active = 1;
+ }
+ }
+ else if (strcmp(name, "Borderless") == 0)
+ {
+ if (olympus_feature(caps, OLYMPUS_FEATURE_BORDERLESS))
+ description->is_active = 1;
+ }
+ else if (strcmp(name, "PrintingMode") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ stp_string_list_add_string
+ (description->bounds.str, "Color", _("Color"));
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
+ else
+ description->is_active = 0;
+}
+
+
+static void
+olympus_imageable_area(const stp_vars_t *v,
+ int *left,
+ int *right,
+ int *bottom,
+ int *top)
+{
+ int width, height;
+ int i;
+ const char *page = stp_get_string_parameter(v, "PageSize");
+ const stp_papersize_t *pt = stp_get_papersize_by_name(page);
+ const olympus_cap_t *caps = olympus_get_model_capabilities(
+ stp_get_model_id(v));
+ const olymp_pagesize_list_t *p = caps->pages;
+
+ for (i = 0; i < p->n_items; i++)
+ {
+ if (strcmp(p->item[i].name,pt->name) == 0)
+ {
+/*
+ if (p->item[i].width_pt >= 0)
+ stp_set_page_width(v, p->item[i].width_pt);
+ if (p->item[i].height_pt >= 0)
+ stp_set_page_height(v, p->item[i].height_pt);
+*/
+
+ stp_default_media_size(v, &width, &height);
+
+
+ if (olympus_feature(caps, OLYMPUS_FEATURE_BORDERLESS)
+ && stp_get_boolean_parameter(v, "Borderless"))
+ {
+ *left = 0;
+ *top = 0;
+ *right = width;
+ *bottom = height;
+ }
+ else
+ {
+ *left = p->item[i].border_pt_left;
+ *top = p->item[i].border_pt_top;
+ *right = width - p->item[i].border_pt_right;
+ *bottom = height - p->item[i].border_pt_bottom;
+ }
+ break;
+ }
+ }
+}
+
+static void
+olympus_limit(const stp_vars_t *v, /* I */
+ int *width, int *height,
+ int *min_width, int *min_height)
+{
+ *width = 65535;
+ *height = 65535;
+ *min_width = 1;
+ *min_height = 1;
+}
+
+static void
+olympus_describe_resolution(const stp_vars_t *v, int *x, int *y)
+{
+ const char *resolution = stp_get_string_parameter(v, "Resolution");
+ int i;
+
+ *x = -1;
+ *y = -1;
+ if (resolution)
+ {
+ for (i = 0; i < all_res_list.n_items; i++)
+ {
+ if (strcmp(resolution, all_res_list.item[i].name) == 0)
+ {
+ *x = all_res_list.item[i].xdpi;
+ *y = all_res_list.item[i].ydpi;
+ }
+ }
+ }
+ return;
+}
+
+static const char *
+olympus_describe_output(const stp_vars_t *v)
+{
+ return "CMY";
+}
+
+static unsigned short *
+olympus_get_cached_output(stp_vars_t *v,
+ stp_image_t *image,
+ unsigned short **cache,
+ int line, int size)
+{
+ unsigned zero_mask;
+
+ stp_deprintf(STP_DBG_OLYMPUS, "olympus: get row %d", line);
+ if (cache[line] == NULL)
+ {
+ stp_deprintf(STP_DBG_OLYMPUS, " (calling stp_color_get_row())\n");
+ if (!stp_color_get_row(v, image, line, &zero_mask))
+ {
+ cache[line] = stp_malloc(size);
+ memcpy(cache[line], stp_channel_get_output(v), size);
+ }
+ }
+ else
+ {
+ stp_deprintf(STP_DBG_OLYMPUS, " (cached)\n");
+ }
+ return cache[line];
+}
+
+/*
+ * olympus_print()
+ */
+static int
+olympus_do_print(stp_vars_t *v, stp_image_t *image)
+{
+ int i, j;
+ int y, min_y, max_y; /* Looping vars */
+ int min_x, max_x;
+ int out_channels, out_bytes;
+ unsigned short *final_out = NULL;
+ unsigned char *char_out = NULL;
+ unsigned short *real_out = NULL;
+ unsigned short *err_out = NULL;
+ unsigned short **rows = NULL; /* "cache" of rows read from image */
+ int char_out_width;
+ int status = 1;
+ int ink_channels = 1;
+ const char *ink_order = NULL;
+ stp_curve_t *adjustment = NULL;
+
+ int r_errdiv, r_errmod;
+ int r_errval = 0;
+ int r_errlast = -1;
+ int r_errline = 0;
+ int c_errdiv, c_errmod;
+ int c_errval = 0;
+ int c_errlast = -1;
+ int c_errcol = 0;
+
+ const int model = stp_get_model_id(v);
+ const char *ink_type = stp_get_string_parameter(v, "InkType");
+ const olympus_cap_t *caps = olympus_get_model_capabilities(model);
+ int max_print_px_width, max_print_px_height;
+ int xdpi, ydpi; /* Resolution */
+
+ /* image in pixels */
+ int image_px_width;
+ int image_px_height;
+
+ /* output in 1/72" */
+ int out_pt_width = stp_get_width(v);
+ int out_pt_height = stp_get_height(v);
+ int out_pt_left = stp_get_left(v);
+ int out_pt_top = stp_get_top(v);
+
+ /* output in pixels */
+ int out_px_width, out_px_height;
+ int out_px_left, out_px_right, out_px_top, out_px_bottom;
+
+ /* page in 1/72" */
+ int page_pt_width = stp_get_page_width(v);
+ int page_pt_height = stp_get_page_height(v);
+ int page_pt_left = 0;
+ int page_pt_right = 0;
+ int page_pt_top = 0;
+ int page_pt_bottom = 0;
+
+ /* page w/out borders in pixels (according to selected dpi) */
+ int print_px_width;
+ int print_px_height;
+
+ int pl;
+ unsigned char *zeros = NULL;
+
+ if (!stp_verify(v))
+ {
+ stp_eprintf(v, _("Print options not verified; cannot print.\n"));
+ return 0;
+ }
+
+ stp_image_init(image);
+ image_px_width = stp_image_width(image);
+ image_px_height = stp_image_height(image);
+
+ stp_describe_resolution(v, &xdpi, &ydpi);
+ olympus_printsize(v, &max_print_px_width, &max_print_px_height);
+
+ privdata.pagesize = stp_get_string_parameter(v, "PageSize");
+ if (caps->laminate)
+ privdata.laminate = olympus_get_laminate_pattern(v);
+
+ if (olympus_feature(caps, OLYMPUS_FEATURE_WHITE_BORDER))
+ stp_default_media_size(v, &page_pt_right, &page_pt_bottom);
+ else
+ olympus_imageable_area(v, &page_pt_left, &page_pt_right,
+ &page_pt_bottom, &page_pt_top);
+
+ print_px_width = MIN(max_print_px_width,
+ (page_pt_right - page_pt_left) * xdpi / 72);
+ print_px_height = MIN(max_print_px_height,
+ (page_pt_bottom - page_pt_top) * ydpi / 72);
+ out_px_width = out_pt_width * xdpi / 72;
+ out_px_height = out_pt_height * ydpi / 72;
+
+
+ /* if image size is close enough to output size send out original size */
+ if (out_px_width - image_px_width > -5
+ && out_px_width - image_px_width < 5
+ && out_px_height - image_px_height > -5
+ && out_px_height - image_px_height < 5)
+ {
+ out_px_width = image_px_width;
+ out_px_height = image_px_height;
+ }
+
+ out_px_width = MIN(out_px_width, print_px_width);
+ out_px_height = MIN(out_px_height, print_px_height);
+ out_px_left = MIN(((out_pt_left - page_pt_left) * xdpi / 72),
+ print_px_width - out_px_width);
+ out_px_top = MIN(((out_pt_top - page_pt_top) * ydpi / 72),
+ print_px_height - out_px_height);
+ out_px_right = out_px_left + out_px_width;
+ out_px_bottom = out_px_top + out_px_height;
+
+
+ stp_deprintf(STP_DBG_OLYMPUS,
+ "paper (pt) %d x %d\n"
+ "image (px) %d x %d\n"
+ "image (pt) %d x %d\n"
+ "* out (pt) %d x %d\n"
+ "* out (px) %d x %d\n"
+ "* left x top (pt) %d x %d\n"
+ "* left x top (px) %d x %d\n"
+ "border (pt) (%d - %d) = %d x (%d - %d) = %d\n"
+ "printable pixels (px) %d x %d\n"
+ "res (dpi) %d x %d\n",
+ page_pt_width, page_pt_height,
+ image_px_width, image_px_height,
+ image_px_width * 72 / xdpi, image_px_height * 72 / ydpi,
+ out_pt_width, out_pt_height,
+ out_px_width, out_px_height,
+ out_pt_left, out_pt_top,
+ out_px_left, out_px_top,
+ page_pt_right, page_pt_left, page_pt_right - page_pt_left,
+ page_pt_bottom, page_pt_top, page_pt_bottom - page_pt_top,
+ print_px_width, print_px_height,
+ xdpi, ydpi
+ );
+
+ privdata.xdpi = xdpi;
+ privdata.ydpi = ydpi;
+ privdata.xsize = print_px_width;
+ privdata.ysize = print_px_height;
+
+ stp_set_string_parameter(v, "STPIOutputType", "CMY");
+
+ if (caps->adj_cyan &&
+ !stp_check_curve_parameter(v, "CyanCurve", STP_PARAMETER_ACTIVE))
+ {
+ adjustment = stp_curve_create_from_string(caps->adj_cyan);
+ stp_set_curve_parameter(v, "CyanCurve", adjustment);
+ stp_set_curve_parameter_active(v, "CyanCurve", STP_PARAMETER_ACTIVE);
+ stp_curve_destroy(adjustment);
+ }
+ if (caps->adj_magenta &&
+ !stp_check_curve_parameter(v, "MagentaCurve", STP_PARAMETER_ACTIVE))
+ {
+ adjustment = stp_curve_create_from_string(caps->adj_magenta);
+ stp_set_curve_parameter(v, "MagentaCurve", adjustment);
+ stp_set_curve_parameter_active(v, "MagentaCurve", STP_PARAMETER_ACTIVE);
+ stp_curve_destroy(adjustment);
+ }
+ if (caps->adj_yellow &&
+ !stp_check_curve_parameter(v, "YellowCurve", STP_PARAMETER_ACTIVE))
+ {
+ adjustment = stp_curve_create_from_string(caps->adj_yellow);
+ stp_set_curve_parameter(v, "YellowCurve", adjustment);
+ stp_set_curve_parameter_active(v, "YellowCurve", STP_PARAMETER_ACTIVE);
+ stp_curve_destroy(adjustment);
+ }
+
+ if (ink_type)
+ {
+ for (i = 0; i < caps->inks->n_items; i++)
+ if (strcmp(ink_type, caps->inks->item[i].name) == 0)
+ {
+ stp_set_string_parameter(v, "STPIOutputType",
+ caps->inks->item[i].output_type);
+ ink_channels = caps->inks->item[i].output_channels;
+ ink_order = caps->inks->item[i].channel_order;
+ break;
+ }
+ }
+
+ stp_channel_reset(v);
+ for (i = 0; i < ink_channels; i++)
+ stp_channel_add(v, i, 0, 1.0);
+
+ out_channels = stp_color_init(v, image, 65536);
+
+#if 0
+ if (out_channels != ink_channels && out_channels != 1 && ink_channels != 1)
+ {
+ stp_eprintf(v, "Internal error! Output channels or input channels must be 1\n");
+ return 0;
+ }
+#endif
+
+ rows = stp_zalloc(image_px_height * sizeof(unsigned short *));
+ err_out = stp_malloc(print_px_width * ink_channels * 2);
+ if (out_channels != ink_channels)
+ final_out = stp_malloc(print_px_width * ink_channels * 2);
+
+ stp_set_float_parameter(v, "Density", 1.0);
+
+ if (ink_type &&
+ (strcmp(ink_type, "RGB") == 0 || strcmp(ink_type, "BGR") == 0))
+ {
+ zeros = stp_malloc(ink_channels * print_px_width + 1);
+ (void) memset(zeros, '\xff', ink_channels * print_px_width + 1);
+ }
+ else
+ zeros = stp_zalloc(ink_channels * print_px_width + 1);
+
+ out_bytes = (caps->interlacing == OLYMPUS_INTERLACE_PLANE ? 1 : ink_channels);
+
+ /* printer init */
+ if (caps->printer_init_func)
+ {
+ stp_deprintf(STP_DBG_OLYMPUS, "olympus: caps->printer_init\n");
+ (*(caps->printer_init_func))(v);
+ }
+
+ if (olympus_feature(caps, OLYMPUS_FEATURE_FULL_HEIGHT))
+ {
+ min_y = 0;
+ max_y = print_px_height - 1;
+ }
+ else if (olympus_feature(caps, OLYMPUS_FEATURE_BLOCK_ALIGN))
+ {
+ min_y = out_px_top - (out_px_top % caps->block_size);
+ /* floor to multiple of block_size */
+ max_y = (out_px_bottom - 1) + (caps->block_size - 1)
+ - ((out_px_bottom - 1) % caps->block_size);
+ /* ceil to multiple of block_size */
+ }
+ else
+ {
+ min_y = out_px_top;
+ max_y = out_px_bottom - 1;
+ }
+
+ if (olympus_feature(caps, OLYMPUS_FEATURE_FULL_WIDTH))
+ {
+ min_x = 0;
+ max_x = print_px_width - 1;
+ }
+ else
+ {
+ min_x = out_px_left;
+ max_x = out_px_right;
+ }
+
+ r_errdiv = image_px_height / out_px_height;
+ r_errmod = image_px_height % out_px_height;
+ c_errdiv = image_px_width / out_px_width;
+ c_errmod = image_px_width % out_px_width;
+
+ for (pl = 0; pl < (caps->interlacing == OLYMPUS_INTERLACE_PLANE
+ ? ink_channels : 1); pl++)
+ {
+ r_errval = 0;
+ r_errlast = -1;
+ r_errline = 0;
+
+ privdata.plane = ink_order[pl];
+ stp_deprintf(STP_DBG_OLYMPUS, "olympus: plane %d\n", privdata.plane);
+
+ /* plane init */
+ if (caps->plane_init_func)
+ {
+ stp_deprintf(STP_DBG_OLYMPUS, "olympus: caps->plane_init\n");
+ (*(caps->plane_init_func))(v);
+ }
+
+ for (y = min_y; y <= max_y; y++)
+ {
+ unsigned short *out;
+ int duplicate_line = 1;
+/* unsigned zero_mask; */
+
+ if (((y - min_y) % caps->block_size) == 0)
+ {
+ /* block init */
+ privdata.block_min_y = y;
+ privdata.block_min_x = min_x;
+ privdata.block_max_y = MIN(y + caps->block_size - 1, max_y);
+ privdata.block_max_x = max_x;
+
+ if (caps->block_init_func)
+ {
+ stp_deprintf(STP_DBG_OLYMPUS,
+ "olympus: caps->block_init\n");
+ (*(caps->block_init_func))(v);
+ }
+ }
+
+ if (y < out_px_top || y >= out_px_bottom)
+ stp_zfwrite((char *) zeros, out_bytes, print_px_width, v);
+ else
+ {
+ if (olympus_feature(caps, OLYMPUS_FEATURE_FULL_WIDTH)
+ && out_px_left > 0)
+ {
+ stp_zfwrite((char *) zeros, out_bytes, out_px_left, v);
+ /* stp_erprintf("left %d ", out_px_left); */
+ }
+
+#if 0
+ if (r_errline != r_errlast)
+ {
+ r_errlast = r_errline;
+ duplicate_line = 0;
+
+ /* stp_erprintf("r_errline %d, ", r_errline); */
+ if (stp_color_get_row(v, image, r_errline, &zero_mask))
+ {
+ status = 2;
+ break;
+ }
+ }
+
+ out = stp_channel_get_output(v);
+#endif
+ if (r_errline != r_errlast)
+ {
+ r_errlast = r_errline;
+ duplicate_line = 0;
+ }
+
+ out = olympus_get_cached_output(v, image, rows, r_errline,
+ image_px_width * ink_channels * 2);
+ if (out == NULL)
+ {
+ status = 2;
+ break;
+ }
+
+ c_errval = 0;
+ c_errlast = -1;
+ c_errcol = 0;
+ for (i = 0; i < out_px_width; i++)
+ {
+ if (c_errcol != c_errlast)
+ c_errlast = c_errcol;
+ for (j = 0; j < ink_channels; j++)
+ err_out[i * ink_channels + j] =
+ out[c_errcol * ink_channels + ink_order[j]-1];
+
+ c_errval += c_errmod;
+ c_errcol += c_errdiv;
+ if (c_errval >= out_px_width)
+ {
+ c_errval -= out_px_width;
+ c_errcol ++;
+ }
+ }
+
+ real_out = err_out;
+ if (out_channels != ink_channels)
+ {
+ real_out = final_out;
+ if (out_channels < ink_channels)
+ {
+ for (i = 0; i < out_px_width; i++)
+ {
+ for (j = 0; j < ink_channels; j++)
+ final_out[i * ink_channels + j] = err_out[i];
+ }
+ }
+ else
+ {
+ for (i = 0; i < out_px_width; i++)
+ {
+ int avg = 0;
+ for (j = 0; j < out_channels; j++)
+ avg += err_out[i * out_channels + j];
+ final_out[i] = avg / out_channels;
+ }
+ }
+ }
+ char_out = (unsigned char *) real_out;
+ char_out_width = (caps->interlacing == OLYMPUS_INTERLACE_PLANE ?
+ out_px_width : out_px_width * out_channels);
+ for (i = 0; i < char_out_width; i++)
+ {
+ if (caps->interlacing == OLYMPUS_INTERLACE_PLANE)
+ j = i * ink_channels + pl;
+ else if (caps->interlacing == OLYMPUS_INTERLACE_LINE)
+ j = (i % out_px_width) + (i / out_px_width);
+ else /* OLYMPUS_INTERLACE_NONE */
+ j = i;
+
+ char_out[i] = real_out[j] / 257;
+ }
+
+ stp_zfwrite((char *) real_out, 1, char_out_width, v);
+ /* stp_erprintf("data %d ", out_px_width); */
+ if (olympus_feature(caps, OLYMPUS_FEATURE_FULL_WIDTH)
+ && out_px_right < print_px_width)
+ {
+ stp_zfwrite((char *) zeros, out_bytes,
+ print_px_width - out_px_right, v);
+ /* stp_erprintf("right %d ", print_px_width-out_px_right); */
+ }
+ /* stp_erprintf("\n"); */
+
+ r_errval += r_errmod;
+ r_errline += r_errdiv;
+ if (r_errval >= out_px_height)
+ {
+ r_errval -= out_px_height;
+ r_errline ++;
+ }
+ }
+
+ if (y == privdata.block_max_y)
+ {
+ /* block end */
+ if (caps->block_end_func)
+ {
+ stp_deprintf(STP_DBG_OLYMPUS, "olympus: caps->block_end\n");
+ (*(caps->block_end_func))(v);
+ }
+ }
+ }
+
+ /* plane end */
+ if (caps->plane_end_func) {
+ stp_deprintf(STP_DBG_OLYMPUS, "olympus: caps->plane_end\n");
+ (*(caps->plane_end_func))(v);
+ }
+ }
+
+ /* printer end */
+ if (caps->printer_end_func)
+ {
+ stp_deprintf(STP_DBG_OLYMPUS, "olympus: caps->printer_end\n");
+ (*(caps->printer_end_func))(v);
+ }
+ stp_image_conclude(image);
+ if (final_out)
+ stp_free(final_out);
+ if (err_out)
+ stp_free(err_out);
+ if (zeros)
+ stp_free(zeros);
+ if (rows)
+ {
+ for (i = 0; i <image_px_height; i++)
+ stp_free(rows[i]);
+ stp_free(rows);
+ }
+ return status;
+}
+
+static int
+olympus_print(const stp_vars_t *v, stp_image_t *image)
+{
+ int status;
+ stp_vars_t *nv = stp_vars_create_copy(v);
+ stp_prune_inactive_options(nv);
+ status = olympus_do_print(nv, image);
+ stp_vars_destroy(nv);
+ return status;
+}
+
+static const stp_printfuncs_t print_olympus_printfuncs =
+{
+ olympus_list_parameters,
+ olympus_parameters,
+ stp_default_media_size,
+ olympus_imageable_area,
+ olympus_limit,
+ olympus_print,
+ olympus_describe_resolution,
+ olympus_describe_output,
+ stp_verify_printer_params,
+ NULL,
+ NULL
+};
+
+
+
+
+static stp_family_t print_olympus_module_data =
+ {
+ &print_olympus_printfuncs,
+ NULL
+ };
+
+
+static int
+print_olympus_module_init(void)
+{
+ return stp_family_register(print_olympus_module_data.printer_list);
+}
+
+
+static int
+print_olympus_module_exit(void)
+{
+ return stp_family_unregister(print_olympus_module_data.printer_list);
+}
+
+
+/* Module header */
+#define stp_module_version print_olympus_LTX_stp_module_version
+#define stp_module_data print_olympus_LTX_stp_module_data
+
+stp_module_version_t stp_module_version = {0, 0};
+
+stp_module_t stp_module_data =
+ {
+ "olympus",
+ VERSION,
+ "Olympus family driver",
+ STP_MODULE_CLASS_FAMILY,
+ NULL,
+ print_olympus_module_init,
+ print_olympus_module_exit,
+ (void *) &print_olympus_module_data
+ };
+
diff --git a/src/main/print-papers.c b/src/main/print-papers.c
new file mode 100644
index 0000000..1164c27
--- /dev/null
+++ b/src/main/print-papers.c
@@ -0,0 +1,422 @@
+/*
+ * "$Id: print-papers.c,v 1.35 2004/09/17 18:38:25 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, gtk, etc.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <math.h>
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#include <string.h>
+#include <stdlib.h>
+
+static stp_list_t *paper_list = NULL;
+
+static void
+stpi_paper_freefunc(void *item)
+{
+ stp_papersize_t *paper = (stp_papersize_t *) (item);
+ STP_SAFE_FREE(paper->name);
+ STP_SAFE_FREE(paper->text);
+ STP_SAFE_FREE(paper->comment);
+ STP_SAFE_FREE(paper);
+}
+
+static const char *
+stpi_paper_namefunc(const void *item)
+{
+ const stp_papersize_t *paper = (const stp_papersize_t *) (item);
+ return paper->name;
+}
+
+static const char *
+stpi_paper_long_namefunc(const void *item)
+{
+ const stp_papersize_t *paper = (const stp_papersize_t *) (item);
+ return paper->text;
+}
+
+static int
+stpi_paper_list_init(void)
+{
+ if (paper_list)
+ stp_list_destroy(paper_list);
+ paper_list = stp_list_create();
+ stp_list_set_freefunc(paper_list, stpi_paper_freefunc);
+ stp_list_set_namefunc(paper_list, stpi_paper_namefunc);
+ stp_list_set_long_namefunc(paper_list, stpi_paper_long_namefunc);
+ /* stp_list_set_sortfunc(stpi_paper_sortfunc); */
+
+ return 0;
+}
+
+static inline void
+check_paperlist(void)
+{
+ if (paper_list == NULL)
+ {
+ stp_xml_parse_file_named("papers.xml");
+ if (paper_list == NULL)
+ {
+ stp_erprintf("No papers found: is STP_MODULE_PATH correct?\n");
+ stpi_paper_list_init();
+ }
+ }
+}
+
+static int
+stpi_paper_create(stp_papersize_t *p)
+{
+ stp_list_item_t *paper_item;
+
+ if (paper_list == NULL)
+ {
+ stpi_paper_list_init();
+ stp_deprintf(STP_DBG_PAPER,
+ "stpi_paper_create(): initialising paper_list...\n");
+ }
+
+ /* Check the paper does not already exist */
+ paper_item = stp_list_get_start(paper_list);
+ while (paper_item)
+ {
+ const stp_papersize_t *ep =
+ (const stp_papersize_t *) stp_list_item_get_data(paper_item);
+ if (ep && !strcmp(p->name, ep->name))
+ {
+ stpi_paper_freefunc(p);
+ return 1;
+ }
+ paper_item = stp_list_item_next(paper_item);
+ }
+
+ /* Add paper to list */
+ stp_list_item_create(paper_list, NULL, (void *) p);
+
+ return 0;
+}
+
+static int
+stpi_paper_destroy(stp_papersize_t *p)
+{
+ stp_list_item_t *paper_item;
+ check_paperlist();
+
+ /* Check if paper exists */
+ paper_item = stp_list_get_start(paper_list);
+ while (paper_item)
+ {
+ const stp_papersize_t *ep = (const stp_papersize_t *)
+ stp_list_item_get_data(paper_item);
+ if (ep && !strcmp(p->name, ep->name))
+ {
+ stp_list_item_destroy (paper_list, paper_item);
+ return 0;
+ }
+ paper_item = stp_list_item_next(paper_item);
+ }
+ /* Paper did not exist */
+ return 1;
+}
+
+
+int
+stp_known_papersizes(void)
+{
+ check_paperlist();
+ return stp_list_get_length(paper_list);
+}
+
+const stp_papersize_t *
+stp_get_papersize_by_name(const char *name)
+{
+ stp_list_item_t *paper;
+
+ check_paperlist();
+ paper = stp_list_get_item_by_name(paper_list, name);
+ if (!paper)
+ return NULL;
+ else
+ return (const stp_papersize_t *) stp_list_item_get_data(paper);
+}
+
+const stp_papersize_t *
+stp_get_papersize_by_index(int idx)
+{
+ stp_list_item_t *paper;
+
+ check_paperlist();
+ paper = stp_list_get_item_by_index(paper_list, idx);
+ if (!paper)
+ return NULL;
+ else
+ return (const stp_papersize_t *) stp_list_item_get_data(paper);
+}
+
+static int
+paper_size_mismatch(int l, int w, const stp_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_papersize_t *ref = NULL;
+ const stp_papersize_t *val = NULL;
+ int i;
+ int sizes = stp_known_papersizes();
+ for (i = 0; i < sizes; i++)
+ {
+ val = stp_get_papersize_by_index(i);
+
+ if (val->width == w && val->height == l)
+ return val;
+ else
+ {
+ int myscore = paper_size_mismatch(l, w, val);
+ if (myscore < score && myscore < 20)
+ {
+ ref = val;
+ score = myscore;
+ }
+ }
+ }
+ return ref;
+}
+
+void
+stp_default_media_size(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 char *page_size = stp_get_string_parameter(v, "PageSize");
+ const stp_papersize_t *papersize = NULL;
+ if (page_size)
+ papersize = stp_get_papersize_by_name(page_size);
+ if (!papersize)
+ {
+ *width = 1;
+ *height = 1;
+ }
+ else
+ {
+ *width = papersize->width;
+ *height = papersize->height;
+ }
+ if (*width == 0)
+ *width = 612;
+ if (*height == 0)
+ *height = 792;
+ }
+}
+
+/*
+ * Process the <paper> node.
+ */
+static stp_papersize_t *
+stp_xml_process_paper(stp_mxml_node_t *paper) /* The paper node */
+{
+ stp_mxml_node_t *prop; /* Temporary node pointer */
+ const char *stmp; /* Temporary string */
+ /* props[] (unused) is the correct tag sequence */
+ /* const char *props[] =
+ {
+ "name",
+ "description",
+ "width",
+ "height",
+ "left",
+ "right",
+ "bottom",
+ "top",
+ "unit",
+ NULL
+ };*/
+ stp_papersize_t *outpaper; /* Generated paper */
+ int
+ id = 0, /* Check id is present */
+ name = 0, /* Check name is present */
+ height = 0, /* Check height is present */
+ width = 0, /* Check width is present */
+ left = 0, /* Check left is present */
+ right = 0, /* Check right is present */
+ bottom = 0, /* Check bottom is present */
+ top = 0, /* Check top is present */
+ unit = 0; /* Check unit is present */
+
+ if (stp_get_debug_level() & STP_DBG_XML)
+ {
+ stmp = stp_mxmlElementGetAttr(paper, (const char*) "name");
+ stp_erprintf("stp_xml_process_paper: name: %s\n", stmp);
+ }
+
+ outpaper = stp_zalloc(sizeof(stp_papersize_t));
+ if (!outpaper)
+ return NULL;
+
+ outpaper->name = stp_strdup(stp_mxmlElementGetAttr(paper, "name"));
+
+ outpaper->top = 0;
+ outpaper->left = 0;
+ outpaper->bottom = 0;
+ outpaper->right = 0;
+ if (outpaper->name)
+ id = 1;
+
+ prop = paper->child;
+ while(prop)
+ {
+ if (prop->type == STP_MXML_ELEMENT)
+ {
+ const char *prop_name = prop->value.element.name;
+
+ if (!strcmp(prop_name, "description"))
+ {
+ outpaper->text = stp_strdup(stp_mxmlElementGetAttr(prop, "value"));
+ name = 1;
+ }
+ if (!strcmp(prop_name, "comment"))
+ outpaper->comment = stp_strdup(stp_mxmlElementGetAttr(prop, "value"));
+ if (!strcmp(prop_name, "width"))
+ {
+ stmp = stp_mxmlElementGetAttr(prop, "value");
+ if (stmp)
+ {
+ outpaper->width = stp_xmlstrtoul(stmp);
+ width = 1;
+ }
+ }
+ if (!strcmp(prop_name, "height"))
+ {
+ stmp = stp_mxmlElementGetAttr(prop, "value");
+ if (stmp)
+ {
+ outpaper->height = stp_xmlstrtoul(stmp);
+ height = 1;
+ }
+ }
+ if (!strcmp(prop_name, "left"))
+ {
+ stmp = stp_mxmlElementGetAttr(prop, "value");
+ outpaper->left = stp_xmlstrtoul(stmp);
+ left = 1;
+ }
+ if (!strcmp(prop_name, "right"))
+ {
+ stmp = stp_mxmlElementGetAttr(prop, "value");
+ outpaper->right = stp_xmlstrtoul(stmp);
+ right = 1;
+ }
+ if (!strcmp(prop_name, "bottom"))
+ {
+ stmp = stp_mxmlElementGetAttr(prop, "value");
+ outpaper->bottom = stp_xmlstrtoul(stmp);
+ bottom = 1;
+ }
+ if (!strcmp(prop_name, "top"))
+ {
+ stmp = stp_mxmlElementGetAttr(prop, "value");
+ outpaper->top = stp_xmlstrtoul(stmp);
+ top = 1;
+ }
+ if (!strcmp(prop_name, "unit"))
+ {
+ stmp = stp_mxmlElementGetAttr(prop, "value");
+ if (stmp)
+ {
+ if (!strcmp(stmp, "english"))
+ outpaper->paper_unit = PAPERSIZE_ENGLISH_STANDARD;
+ else if (!strcmp(stmp, "english-extended"))
+ outpaper->paper_unit = PAPERSIZE_ENGLISH_EXTENDED;
+ else if (!strcmp(stmp, "metric"))
+ outpaper->paper_unit = PAPERSIZE_METRIC_STANDARD;
+ else if (!strcmp(stmp, "metric-extended"))
+ outpaper->paper_unit = PAPERSIZE_METRIC_EXTENDED;
+ /* Default unit */
+ else
+ outpaper->paper_unit = PAPERSIZE_METRIC_EXTENDED;
+ unit = 1;
+ }
+ }
+ }
+ prop = prop->next;
+ }
+ if (id && name && width && height && unit) /* Margins are optional */
+ return outpaper;
+ stp_free(outpaper);
+ outpaper = NULL;
+ return NULL;
+}
+
+/*
+ * Parse the <paperdef> node.
+ */
+static int
+stp_xml_process_paperdef(stp_mxml_node_t *paperdef, const char *file) /* The paperdef node */
+{
+ stp_mxml_node_t *paper; /* paper node pointer */
+ stp_papersize_t *outpaper; /* Generated paper */
+
+ paper = paperdef->child;
+ while (paper)
+ {
+ if (paper->type == STP_MXML_ELEMENT)
+ {
+ const char *paper_name = paper->value.element.name;
+ if (!strcmp(paper_name, "paper"))
+ {
+ outpaper = stp_xml_process_paper(paper);
+ if (outpaper)
+ stpi_paper_create(outpaper);
+ }
+ }
+ paper = paper->next;
+ }
+ return 1;
+}
+
+void
+stpi_init_paper(void)
+{
+ stp_register_xml_parser("paperdef", stp_xml_process_paperdef);
+}
diff --git a/src/main/print-pcl.c b/src/main/print-pcl.c
index 5d3751f..4f558b8 100644
--- a/src/main/print-pcl.c
+++ b/src/main/print-pcl.c
@@ -1,5 +1,5 @@
/*
- * "$Id: print-pcl.c,v 1.47.4.13 2004/06/09 10:29:58 davehill Exp $"
+ * "$Id: print-pcl.c,v 1.138 2005/05/08 03:10:39 rlk Exp $"
*
* Print plug-in HP PCL driver for the GIMP.
*
@@ -30,9 +30,9 @@
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#include <gimp-print/gimp-print.h>
-#include "gimp-print-internal.h"
-#include <gimp-print/gimp-print-intl-internal.h>
+#include <gutenprint/gutenprint.h>
+#include <gutenprint/gutenprint-intl-internal.h>
+#include "gutenprint-internal.h"
#include <stdio.h>
#include <string.h>
@@ -43,10 +43,24 @@
/*
* Local functions...
*/
-static void pcl_mode0(const stp_vars_t, unsigned char *, unsigned char *,
- int, int);
-static void pcl_mode2(const stp_vars_t, unsigned char *, unsigned char *,
- int, int);
+static void pcl_mode0(stp_vars_t *, unsigned char *, int, int);
+static void pcl_mode2(stp_vars_t *, unsigned char *, int, int);
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+
+typedef struct
+{
+ int do_blank;
+ int blank_lines;
+ unsigned char *comp_buf;
+ void (*writefunc)(stp_vars_t *, unsigned char *, int, int); /* PCL output function */
+ int do_cret;
+ int do_cretb;
+ int do_6color;
+ int height;
+ int duplex;
+ int tumble;
+ int use_crd;
+} pcl_privdata_t;
/*
* Generic define for a name/value set
@@ -61,6 +75,17 @@ typedef struct
int p1;
} pcl_t;
+static const stp_dotsize_t single_dotsize[] =
+{
+ { 0x1, 1.0 }
+};
+
+static const stp_shade_t photo_dither_shades[] =
+{
+ { 1.0000, 1, single_dotsize },
+ { 0.3333, 1, single_dotsize },
+};
+
/*
* Media size to PCL media size code table
*
@@ -236,17 +261,20 @@ static const pcl_t pcl_resolutions[] =
#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)
+pcl_describe_resolution(const stp_vars_t *v, int *x, int *y)
{
int i;
- for (i = 0; i < NUM_RESOLUTIONS; i++)
+ const char *resolution = stp_get_string_parameter(v, "Resolution");
+ if (resolution)
{
- if (!strcmp(resolution, pcl_resolutions[i].pcl_name))
+ for (i = 0; i < NUM_RESOLUTIONS; i++)
{
- *x = pcl_resolutions[i].p0;
- *y = pcl_resolutions[i].p1;
- return;
+ if (!strcmp(resolution, pcl_resolutions[i].pcl_name))
+ {
+ *x = pcl_resolutions[i].p0;
+ *y = pcl_resolutions[i].p1;
+ return;
+ }
}
}
*x = -1;
@@ -276,12 +304,9 @@ typedef struct {
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 */
+ const short *paper_sizes; /* Paper sizes */
+ const short *paper_types; /* Paper types */
+ const short *paper_sources; /* Paper sources */
} pcl_cap_t;
#define PCL_COLOR_NONE 0
@@ -299,6 +324,7 @@ typedef struct {
#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 */
+#define PCL_PRINTER_DUPLEX 128 /* Printer can have duplexer */
/*
* FIXME - the 520 shouldn't be lumped in with the 500 as it supports
@@ -312,6 +338,317 @@ typedef struct {
* PCL reference guide 2.0, Nov 1999".
*/
+static const short emptylist[] =
+{
+ -1
+};
+
+static const short standard_papersizes[] =
+{
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_STATEMENT,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A4,
+ -1,
+};
+
+static const short letter_only_papersizes[] =
+{
+ PCL_PAPERSIZE_LETTER,
+ -1
+};
+
+static const short letter_a4_papersizes[] =
+{
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_LETTER,
+ -1
+};
+
+static const short dj340_papersizes[] =
+{
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A4,
+ -1,
+};
+
+static const short dj400_papersizes[] =
+{
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_JIS_B5,
+ -1,
+};
+
+static const short dj500_papersizes[] =
+{
+/* 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,
+};
+
+static const short dj540_papersizes[] =
+{
+ 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,
+};
+
+static const short dj600_papersizes[] =
+{
+ PCL_PAPERSIZE_EXECUTIVE,
+ PCL_PAPERSIZE_LETTER,
+ PCL_PAPERSIZE_LEGAL,
+ PCL_PAPERSIZE_A4,
+ PCL_PAPERSIZE_A5,
+ 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,
+};
+
+static const short dj1220_papersizes[] =
+{
+ 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,
+};
+
+static const short dj1100_papersizes[] =
+{
+ 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,
+};
+
+static const short dj1200_papersizes[] =
+{
+ /* 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,
+};
+
+static const short dj2000_papersizes[] =
+{
+ 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,
+};
+
+static const short dj2500_papersizes[] =
+{
+ 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,
+};
+
+static const short ljsmall_papersizes[] =
+{
+ 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,
+};
+
+static const short ljbig_papersizes[] =
+{
+ 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,
+};
+
+static const short basic_papertypes[] =
+{
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ -1,
+};
+
+static const short new_papertypes[] =
+{
+ PCL_PAPERTYPE_PLAIN,
+ PCL_PAPERTYPE_BOND,
+ PCL_PAPERTYPE_PREMIUM,
+ PCL_PAPERTYPE_GLOSSY,
+ PCL_PAPERTYPE_TRANS,
+ PCL_PAPERTYPE_QPHOTO,
+ PCL_PAPERTYPE_QTRANS,
+ -1,
+};
+
+static const short laserjet_papersources[] =
+{
+ 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 short dj340_papersources[] =
+{
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_340_PCSF,
+ PCL_PAPERSOURCE_340_DCSF,
+ -1,
+};
+
+static const short dj_papersources[] =
+{
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_DJ_TRAY,
+ -1,
+};
+
+static const short dj2500_papersources[] =
+{
+ PCL_PAPERSOURCE_STANDARD,
+ PCL_PAPERSOURCE_MANUAL,
+ PCL_PAPERSOURCE_DJ_AUTO,
+ PCL_PAPERSOURCE_DJ_TRAY,
+ PCL_PAPERSOURCE_DJ_TRAY2,
+ PCL_PAPERSOURCE_DJ_OPTIONAL,
+ -1,
+};
+
+static const short standard_papersources[] =
+{
+ PCL_PAPERSOURCE_STANDARD,
+ -1
+};
+
static const pcl_cap_t pcl_model_capabilities[] =
{
/* Default/unknown printer - assume laserjet */
@@ -323,175 +660,88 @@ static const pcl_cap_t pcl_model_capabilities[] =
{12, 12, 10, 10}, /* A4 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 */
- },
+ standard_papersizes,
+ emptylist,
+ emptylist,
},
/* DesignJet 230/430 (monochrome ) */
{ 10230,
36 * 72, 150 * 12 * 72, /* 150ft in roll mode, 64" in sheet */
- 830 * 72 / 100, 583 * 72 / 100, /* 8.3" wide min in sheet mode */
+ 826 * 72 / 100, 583 * 72 / 100, /* 8.3" wide min in sheet mode */
PCL_RES_300_300 | PCL_RES_600_600,
{49, 49, 15, 15},
{49, 49, 15, 15},
PCL_COLOR_NONE,
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,
- },
+ letter_a4_papersizes,
+ basic_papertypes,
+ standard_papersources,
},
/* DesignJet 250C/450C/455CA/488CA */
/* The "CA" versions have a "software RIP" but are the same hardware */
{ 10250,
36 * 72, 150 * 12 * 72, /* 150ft in roll mode, 64" in sheet */
- 830 * 72 / 100, 583 * 72 / 100, /* 8.3" wide min in sheet mode */
+ 826 * 72 / 100, 583 * 72 / 100, /* 8.3" wide min in sheet mode */
PCL_RES_300_300 | PCL_RES_600_600_MONO,
{49, 49, 15, 15},
{49, 49, 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,
- },
+ letter_a4_papersizes,
+ basic_papertypes,
+ standard_papersources,
},
/* DesignJet 700 (monochrome) */
{ 10700,
36 * 72, 150 * 12 * 72, /* 150ft in roll mode, 64" in sheet */
- 830 * 72 / 100, 583 * 72 / 100, /* 8.3" wide min in sheet mode */
+ 826 * 72 / 100, 583 * 72 / 100, /* 8.3" wide min in sheet mode */
PCL_RES_300_300 | PCL_RES_600_600,
{30, 30, 15, 15}, /* These margins are for sheet mode FIX */
{30, 30, 15, 15},
PCL_COLOR_NONE,
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,
- },
+ letter_a4_papersizes,
+ basic_papertypes,
+ standard_papersources,
},
/* DesignJet 750C */
{ 10750,
36 * 72, 150 * 12 * 72, /* 150ft in roll mode, 64" in sheet */
- 830 * 72 / 100, 583 * 72 / 100, /* 8.3" wide min in sheet mode */
+ 826 * 72 / 100, 583 * 72 / 100, /* 8.3" wide min in sheet mode */
PCL_RES_300_300 | PCL_RES_600_600_MONO,
{30, 30, 15, 15}, /* These margins are for roll mode FIX */
{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,
- },
+ letter_a4_papersizes,
+ basic_papertypes,
+ standard_papersources,
},
/* DesignJet 2000C/2500C (36" wide) */
{ 12500, /* Deskjet 2500 already has "2500" */
36 * 72, 150 * 12 * 72, /* 150ft in roll mode, 64" in sheet */
- 830 * 72 / 100, 583 * 72 / 100, /* 8.3" wide min in sheet mode */
+ 826 * 72 / 100, 583 * 72 / 100, /* 8.3" wide min in sheet mode */
PCL_RES_300_300 | PCL_RES_600_600_MONO,
{49, 49, 15, 15}, /* Check/Fix */
{49, 49, 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,
- },
+ letter_a4_papersizes,
+ basic_papertypes,
+ standard_papersources,
},
/* DesignJet 3000C/3500C (54" wide) */
{ 13500, /* Deskjet 2500 already has "2500" */
54 * 72, 150 * 12 * 72, /* 150ft in roll mode, 64" in sheet */
- 830 * 72 / 100, 583 * 72 / 100, /* 8.3" wide min in sheet mode */
+ 826 * 72 / 100, 583 * 72 / 100, /* 8.3" wide min in sheet mode */
PCL_RES_300_300 | PCL_RES_600_600_MONO,
{49, 49, 15, 15}, /* Check/Fix */
{49, 49, 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,
- },
+ letter_a4_papersizes,
+ basic_papertypes,
+ standard_papersources,
},
/* Deskjet 340 */
{ 340,
@@ -502,28 +752,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
{6, 48, 10, 11}, /* from bpd07933.pdf */
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,
- },
+ dj340_papersizes,
+ basic_papertypes,
+ dj340_papersources,
},
/* Deskjet 400 */
{ 400,
@@ -534,24 +765,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
{7, 41, 10, 10}, /* Check/Fix */
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 */
- },
+ dj400_papersizes,
+ basic_papertypes,
+ emptylist,
},
/* Deskjet 500, 520. Lexmark 4076 */
{ 500,
@@ -562,29 +778,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
{7, 41, 10, 10}, /* Check/Fix */
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,
- },
+ dj500_papersizes,
+ basic_papertypes,
+ dj_papersources,
},
/* Deskjet 500C */
{ 501,
@@ -595,27 +791,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
{7, 33, 10, 10}, /* Check/Fix */
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,
- },
+ dj500_papersizes,
+ basic_papertypes,
+ dj_papersources,
},
/* Deskjet 540C */
{ 540,
@@ -627,36 +805,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
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,
- },
+ dj540_papersizes,
+ basic_papertypes,
+ dj_papersources,
},
/* Deskjet 550C, 560C */
{ 550,
@@ -667,29 +818,11 @@ static const pcl_cap_t pcl_model_capabilities[] =
{5, 33, 10, 10},
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,
- },
+ dj340_papersizes,
+ basic_papertypes,
+ dj_papersources,
},
/* Deskjet 600/600C */
{ 600,
@@ -701,32 +834,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
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 */
- },
+ dj600_papersizes,
+ basic_papertypes,
+ emptylist,
},
/* Deskjet 6xx series */
{ 601,
@@ -738,33 +848,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
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,
- },
+ dj600_papersizes,
+ basic_papertypes,
+ emptylist,
},
/* Deskjet 69x series (Photo Capable) */
{ 690,
@@ -776,33 +862,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
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,
- },
+ dj600_papersizes,
+ basic_papertypes,
+ emptylist,
},
/* Deskjet 850/855/870/890 (C-RET) */
{ 800,
@@ -814,33 +876,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
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,
- },
+ dj600_papersizes,
+ basic_papertypes,
+ emptylist,
},
/* Deskjet 810C, 812C, 840C, 842C, 845C, 895C (C-RET) */
{ 840,
@@ -852,33 +890,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
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,
- },
+ dj600_papersizes,
+ basic_papertypes,
+ emptylist,
},
/* Deskjet 900 series, 1220C, PhotoSmart P1000/P1100 */
{ 900,
@@ -889,33 +903,10 @@ static const pcl_cap_t pcl_model_capabilities[] =
{5, 33, 10, 10}, /* Oliver Vecernik */
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 */
- },
+ PCL_PRINTER_CUSTOM_SIZE | PCL_PRINTER_BLANKLINE | PCL_PRINTER_DUPLEX,
+ dj600_papersizes,
+ basic_papertypes,
+ emptylist,
},
/* Deskjet 1220C (or other large format 900) */
{ 901,
@@ -927,46 +918,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
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 */
- },
+ dj1220_papersizes,
+ basic_papertypes,
+ emptylist,
},
/* Deskjet 1100C, 1120C */
{ 1100,
@@ -978,45 +932,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
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,
- },
+ dj1100_papersizes,
+ basic_papertypes,
+ dj_papersources,
},
/* Deskjet 1200C */
{ 1200,
@@ -1028,32 +946,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
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,
- },
+ dj1200_papersizes,
+ basic_papertypes,
+ dj_papersources,
},
/* Deskjet 1600C */
{ 1600,
@@ -1065,32 +960,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
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,
- },
+ dj1200_papersizes,
+ basic_papertypes,
+ dj_papersources,
},
/* Deskjet 2000 */
{ 2000,
@@ -1102,39 +974,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
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,
- },
+ dj2000_papersizes,
+ new_papertypes,
+ dj_papersources,
},
/* Deskjet 2500 */
{ 2500,
@@ -1146,44 +988,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
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,
- },
+ dj2500_papersizes,
+ new_papertypes,
+ dj2500_papersources,
},
/* LaserJet II series */
{ 2,
@@ -1194,30 +1001,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
{12, 12, 10, 10}, /* Check/Fix */
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,
- },
+ ljsmall_papersizes,
+ emptylist,
+ laserjet_papersources,
},
/* LaserJet IIP (TIFF but no blankline) */
{ 21,
@@ -1228,30 +1014,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
{12, 12, 10, 10}, /* Check/Fix */
PCL_COLOR_NONE,
PCL_PRINTER_LJ | PCL_PRINTER_TIFF,
- {
- 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,
- },
+ ljsmall_papersizes,
+ emptylist,
+ laserjet_papersources,
},
/* LaserJet III series */
{ 3,
@@ -1262,30 +1027,9 @@ static const pcl_cap_t pcl_model_capabilities[] =
{12, 12, 10, 10}, /* Check/Fix */
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,
- },
+ ljsmall_papersizes,
+ emptylist,
+ laserjet_papersources,
},
/* LaserJet 4L */
{ 4,
@@ -1296,32 +1040,11 @@ static const pcl_cap_t pcl_model_capabilities[] =
{12, 12, 10, 10}, /* Check/Fix */
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,
- },
+ ljsmall_papersizes,
+ emptylist,
+ laserjet_papersources,
},
- /* LaserJet 4V, 4Si */
+ /* LaserJet 4V */
{ 5,
13 * 72, 19 * 72,
1, 1, /* Min paper size */
@@ -1330,37 +1053,23 @@ static const pcl_cap_t pcl_model_capabilities[] =
{12, 12, 10, 10}, /* Check/Fix */
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,
- },
+ ljbig_papersizes,
+ emptylist,
+ laserjet_papersources,
+ },
+ /* LaserJet 4Si */
+ { 51,
+ 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},
+ {12, 12, 10, 10}, /* Check/Fix */
+ PCL_COLOR_NONE,
+ PCL_PRINTER_LJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE |
+ PCL_PRINTER_DUPLEX,
+ ljbig_papersizes,
+ emptylist,
+ laserjet_papersources,
},
/* LaserJet 4 series (except as above), 5 series, 6 series */
{ 6,
@@ -1370,31 +1079,11 @@ static const pcl_cap_t pcl_model_capabilities[] =
{12, 12, 18, 18},
{12, 12, 10, 10}, /* Check/Fix */
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,
- },
+ PCL_PRINTER_LJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE |
+ PCL_PRINTER_DUPLEX,
+ ljsmall_papersizes,
+ emptylist,
+ laserjet_papersources,
},
/* LaserJet 5Si */
{ 7,
@@ -1404,201 +1093,179 @@ static const pcl_cap_t pcl_model_capabilities[] =
{12, 12, 18, 18},
{12, 12, 10, 10}, /* Check/Fix */
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,
- },
+ PCL_PRINTER_LJ | PCL_PRINTER_NEW_ERG | PCL_PRINTER_TIFF | PCL_PRINTER_BLANKLINE |
+ PCL_PRINTER_DUPLEX,
+ ljbig_papersizes,
+ emptylist,
+ laserjet_papersources,
},
};
-static const double sat_adjustment[49] =
+static const char standard_sat_adjustment[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* B */
+/* B */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* M */
+/* M */ "1.00 0.95 0.90 0.90 0.90 0.90 0.90 0.90 " /* R */
+/* R */ "0.90 0.95 0.95 1.00 1.00 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* G */
+/* G */ "1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char standard_lum_adjustment[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"0\" upper-bound=\"4\">\n"
+/* C */ "0.65 0.67 0.70 0.72 0.77 0.80 0.82 0.85 " /* B */
+/* B */ "0.87 0.86 0.82 0.79 0.79 0.82 0.85 0.88 " /* M */
+/* M */ "0.92 0.95 0.96 0.97 0.97 0.97 0.96 0.96 " /* R */
+/* R */ "0.96 0.97 0.97 0.98 0.99 1.00 1.00 1.00 " /* Y */
+/* Y */ "1.00 0.97 0.95 0.94 0.93 0.92 0.90 0.86 " /* G */
+/* G */ "0.79 0.76 0.71 0.68 0.68 0.68 0.68 0.66 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const char standard_hue_adjustment[] =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<gutenprint>\n"
+"<curve wrap=\"wrap\" type=\"linear\" gamma=\"0\">\n"
+"<sequence count=\"48\" lower-bound=\"-6\" upper-bound=\"6\">\n"
+/* C */ "0.00 0.06 0.10 0.10 0.06 -.01 -.09 -.17 " /* B */
+/* B */ "-.25 -.33 -.38 -.38 -.36 -.34 -.34 -.34 " /* M */
+/* M */ "-.34 -.34 -.36 -.40 -.50 -.40 -.30 -.20 " /* R */
+/* R */ "-.12 -.07 -.04 -.02 0.00 0.00 0.00 0.00 " /* Y */
+/* Y */ "0.00 0.00 0.00 -.05 -.10 -.15 -.22 -.24 " /* G */
+/* G */ "-.26 -.30 -.33 -.28 -.25 -.20 -.13 -.06 " /* C */
+"</sequence>\n"
+"</curve>\n"
+"</gutenprint>\n";
+
+static const stp_parameter_t the_parameters[] =
{
- 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 */
+ {
+ "PageSize", N_("Page Size"), N_("Basic Printer Setup"),
+ N_("Size of the paper being printed to"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "MediaType", N_("Media Type"), N_("Basic Printer Setup"),
+ N_("Type of media (plain paper, photo paper, etc.)"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "InputSlot", N_("Media Source"), N_("Basic Printer Setup"),
+ N_("Source (input slot) of the media"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "Resolution", N_("Resolution"), N_("Basic Printer Setup"),
+ N_("Resolution and quality of the print"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "InkType", N_("Ink Type"), N_("Advanced Printer Setup"),
+ N_("Type of ink in the printer"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "InkChannels", N_("Ink Channels"), N_("Advanced Printer Functionality"),
+ N_("Ink Channels"),
+ STP_PARAMETER_TYPE_INT, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_INTERNAL, 0, 0, -1, 0, 0
+ },
+ {
+ "PrintingMode", N_("Printing Mode"), N_("Core Parameter"),
+ N_("Printing Output Mode"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "Duplex", N_("Double-Sided Printing"), N_("Basic Printer Setup"),
+ N_("Duplex/Tumble Setting"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
};
-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 int the_parameter_count =
+sizeof(the_parameters) / sizeof(const stp_parameter_t);
-static const double hue_adjustment[49] =
+typedef struct
+{
+ const stp_parameter_t param;
+ double min;
+ double max;
+ double defval;
+ int color_only;
+} float_param_t;
+
+static const float_param_t float_parameters[] =
{
- 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 */
+ {
+ {
+ "CyanDensity", N_("Cyan Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the cyan balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 1, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "MagentaDensity", N_("Magenta Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the magenta balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 2, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "YellowDensity", N_("Yellow Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the yellow balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 3, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "BlackDensity", N_("Black Balance"), N_("Output Level Adjustment"),
+ N_("Adjust the black balance"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED, 0, 1, 0, 1, 0
+ }, 0.0, 2.0, 1.0, 1
+ },
+ {
+ {
+ "LightCyanTransition", N_("Light Cyan Transition"), N_("Advanced Ink Adjustment"),
+ N_("Light Cyan Transition"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, -1, 1, 0
+ }, 0.0, 5.0, 1.0, 1
+ },
+ {
+ {
+ "LightMagentaTransition", N_("Light Magenta Transition"), N_("Advanced Ink Adjustment"),
+ N_("Light Magenta Transition"),
+ STP_PARAMETER_TYPE_DOUBLE, STP_PARAMETER_CLASS_OUTPUT,
+ STP_PARAMETER_LEVEL_ADVANCED4, 0, 1, -1, 1, 0
+ }, 0.0, 5.0, 1.0, 1
+ },
};
+static const int float_parameter_count =
+sizeof(float_parameters) / sizeof(const float_param_t);
+
/*
* Convert a name into it's option value
*/
@@ -1680,14 +1347,19 @@ static const char * pcl_val_to_text(int code, /* I: Code */
}
static const double dot_sizes[] = { 0.5, 0.832, 1.0 };
-static const stp_simple_dither_range_t variable_dither_ranges[] =
+static const double dot_sizes_cret[] = { 1.0, 1.0, 1.0 };
+
+static const stp_dotsize_t variable_dotsizes[] =
+{
+ { 0x1, 0.5 },
+ { 0x2, 0.67 },
+ { 0x3, 1.0 }
+};
+
+static const stp_shade_t variable_shades[] =
{
- { 0.152, 0x1, 1 },
- { 0.255, 0x2, 1 },
- { 0.38, 0x3, 1 },
- { 0.5, 0x1, 0 },
- { 0.67, 0x2, 0 },
- { 1.0, 0x3, 0 }
+ { 0.38, 3, variable_dotsizes },
+ { 1.0, 3, variable_dotsizes }
};
/*
@@ -1708,14 +1380,6 @@ pcl_get_model_capabilities(int model) /* I: Model */
return &(pcl_model_capabilities[0]);
}
-static char *
-c_strdup(const char *s)
-{
- char *ret = stp_malloc(strlen(s) + 1);
- strcpy(ret, s);
- return ret;
-}
-
/*
* Convert Media size name into PCL media code for printer
*/
@@ -1733,7 +1397,7 @@ static int pcl_convert_media_size(const char *media_size, /* I: Media size strin
*/
media_code = pcl_string_to_val(media_size, pcl_media_sizes,
- sizeof(pcl_media_sizes) / sizeof(pcl_t));
+ NUM_PRINTER_PAPER_SIZES);
stp_deprintf(STP_DBG_PCL, "Media Size: %s, Code: %d\n", media_size, media_code);
@@ -1745,7 +1409,7 @@ static int pcl_convert_media_size(const char *media_size, /* I: Media size strin
caps = pcl_get_model_capabilities(model);
for (i=0; (i<NUM_PRINTER_PAPER_SIZES) && (caps->paper_sizes[i] != -1); i++) {
- if (media_code == caps->paper_sizes[i])
+ if (media_code == (int) caps->paper_sizes[i])
return(media_code); /* Is supported */
}
@@ -1758,19 +1422,32 @@ static int pcl_convert_media_size(const char *media_size, /* I: Media size strin
}
-static stp_param_t ink_types[] =
+static const stp_param_string_t ink_types[] =
{
{ "CMYK", N_ ("Color + Black Cartridges") },
{ "Photo", N_ ("Color + Photo Cartridges") }
};
+/*
+ * Duplex support - modes available
+ * Note that the internal names MUST match those in cups/genppd.c else the
+ * PPD files will not be generated correctly
+ */
+
+static const stp_param_string_t duplex_types[] =
+{
+ { "None", N_ ("Off") },
+ { "DuplexNoTumble", N_ ("Long Edge (Standard)") },
+ { "DuplexTumble", N_ ("Short Edge (Flip)") }
+};
+#define NUM_DUPLEX (sizeof (duplex_types) / sizeof (stp_param_string_t))
/*
* 'pcl_papersize_valid()' - Is the paper size valid for this printer.
*/
static const int
-pcl_papersize_valid(const stp_papersize_t pt,
+pcl_papersize_valid(const stp_papersize_t *pt,
int model)
{
@@ -1783,8 +1460,8 @@ pcl_papersize_valid(const stp_papersize_t pt,
== PCL_PRINTER_CUSTOM_SIZE);
#endif
- unsigned int pwidth = stp_papersize_get_width(pt);
- unsigned int pheight = stp_papersize_get_height(pt);
+ unsigned int pwidth = pt->width;
+ unsigned int pheight = pt->height;
/*
* This function decides whether a paper size is allowed for the
@@ -1799,14 +1476,14 @@ pcl_papersize_valid(const stp_papersize_t pt,
* Is it a valid name?
*/
- if (strlen(stp_papersize_get_name(pt)) <= 0)
+ if (strlen(pt->name) <= 0)
return(0);
/*
* Is it a recognised supported name?
*/
- if (pcl_convert_media_size(stp_papersize_get_name(pt), model) != -1)
+ if (pcl_convert_media_size(pt->name, model) != -1)
return(1);
/*
@@ -1834,24 +1511,29 @@ pcl_papersize_valid(const stp_papersize_t pt,
* '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 */
+static stp_parameter_list_t
+pcl_list_parameters(const stp_vars_t *v)
+{
+ stp_parameter_list_t *ret = stp_parameter_list_create();
+ int i;
+ for (i = 0; i < the_parameter_count; i++)
+ stp_parameter_list_add_param(ret, &(the_parameters[i]));
+ for (i = 0; i < float_parameter_count; i++)
+ stp_parameter_list_add_param(ret, &(float_parameters[i].param));
+ return ret;
+}
+
+static void
+pcl_parameters(const stp_vars_t *v, const char *name,
+ stp_parameter_t *description)
{
- int model = stp_printer_get_model(printer);
+ int model = stp_get_model_id(v);
int i;
- stp_param_t *valptrs;
const pcl_cap_t *caps;
-
- if (count == NULL)
- return (NULL);
-
- *count = 0;
+ description->p_type = STP_PARAMETER_TYPE_INVALID;
if (name == NULL)
- return (NULL);
+ return;
stp_deprintf(STP_DBG_PCL, "pcl_parameters(): Name = %s\n", name);
@@ -1869,370 +1551,502 @@ pcl_parameters(const stp_printer_t printer,/* I - Printer model */
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);
+ for (i = 0; i < float_parameter_count; i++)
+ if (strcmp(name, float_parameters[i].param.name) == 0)
+ {
+ stp_fill_parameter_settings(description,
+ &(float_parameters[i].param));
+ description->deflt.dbl = float_parameters[i].defval;
+ description->bounds.dbl.upper = float_parameters[i].max;
+ description->bounds.dbl.lower = float_parameters[i].min;
+ }
+
+ for (i = 0; i < the_parameter_count; i++)
+ if (strcmp(name, the_parameters[i].name) == 0)
+ {
+ stp_fill_parameter_settings(description, &(the_parameters[i]));
+ break;
+ }
+ description->deflt.str = NULL;
+
if (strcmp(name, "PageSize") == 0)
{
int papersizes = stp_known_papersizes();
- valptrs = stp_malloc(sizeof(stp_param_t) * papersizes);
- *count = 0;
+ description->bounds.str = stp_string_list_create();
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)++;
- }
- }
+ const stp_papersize_t *pt = stp_get_papersize_by_index(i);
+ if (strlen(pt->name) > 0 && pcl_papersize_valid(pt, model))
+ stp_string_list_add_string(description->bounds.str,
+ pt->name, pt->text);
}
- return (valptrs);
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
}
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++)
+ description->bounds.str = stp_string_list_create();
+ if (caps->paper_types[0] != -1)
{
- 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)++;
+ for (i=0; (i < NUM_PRINTER_PAPER_TYPES) && (caps->paper_types[i] != -1); i++)
+ stp_string_list_add_string(description->bounds.str,
+ pcl_val_to_string(caps->paper_types[i],
+ pcl_media_types,
+ NUM_PRINTER_PAPER_TYPES),
+ pcl_val_to_text(caps->paper_types[i],
+ pcl_media_types,
+ NUM_PRINTER_PAPER_TYPES));
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
}
- return(valptrs);
- }
+ else
+ description->is_active = 0;
}
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++)
+ description->bounds.str = stp_string_list_create();
+ if (caps->paper_sources[0] != -1)
{
- 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)++;
+ for (i=0; (i < NUM_PRINTER_PAPER_SOURCES) && (caps->paper_sources[i] != -1); i++)
+ stp_string_list_add_string(description->bounds.str,
+ pcl_val_to_string(caps->paper_sources[i],
+ pcl_media_sources,
+ NUM_PRINTER_PAPER_SOURCES),
+ pcl_val_to_text(caps->paper_sources[i],
+ pcl_media_sources,
+ NUM_PRINTER_PAPER_SOURCES));
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
}
- return(valptrs);
- }
+ else
+ description->is_active = 0;
}
else if (strcmp(name, "Resolution") == 0)
{
- *count = 0;
- valptrs = stp_malloc(sizeof(stp_param_t) * NUM_RESOLUTIONS);
+ description->bounds.str = stp_string_list_create();
+ description->deflt.str = NULL;
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);
+ {
+ if (pcl_resolutions[i].pcl_code >= PCL_RES_300_300 &&
+ description->deflt.str == NULL)
+ description->deflt.str =
+ pcl_val_to_string(pcl_resolutions[i].pcl_code,
+ pcl_resolutions, NUM_RESOLUTIONS);
+ stp_string_list_add_string
+ (description->bounds.str,
+ pcl_val_to_string(pcl_resolutions[i].pcl_code,
+ pcl_resolutions, NUM_RESOLUTIONS),
+ pcl_val_to_text(pcl_resolutions[i].pcl_code,
+ pcl_resolutions, NUM_RESOLUTIONS));
+ }
+ if (description->deflt.str == NULL)
+ stp_erprintf("No default resolution set!\n");
}
else if (strcmp(name, "InkType") == 0)
{
+ description->bounds.str = stp_string_list_create();
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);
+ description->deflt.str = ink_types[0].name;
+ stp_string_list_add_string(description->bounds.str,
+ ink_types[0].name,_(ink_types[0].text));
+ stp_string_list_add_string(description->bounds.str,
+ ink_types[1].name,_(ink_types[1].text));
}
else
- return(NULL);
+ description->is_active = 0;
}
- 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);
+ else if (strcmp(name, "Duplex") == 0)
+ {
+ int offer_duplex=0;
- stp_deprintf(STP_DBG_PCL, "pcl_default_parameters(): Name = %s\n", name);
+ description->bounds.str = stp_string_list_create();
- caps = pcl_get_model_capabilities(model);
+/*
+ * Don't offer the Duplex/Tumble options if the JobMode parameter is
+ * set to "Page" Mode.
+ * "Page" mode is set by the Gimp Plugin, which only outputs one page at a
+ * time, so Duplex/Tumble is meaningless.
+ */
- 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, "Normal Margins: top = %d, bottom = %d, left = %d, right = %d\n",
- caps->normal_margins.top_margin, caps->normal_margins.bottom_margin,
- caps->normal_margins.left_margin, caps->normal_margins.right_margin);
- stp_deprintf(STP_DBG_PCL, "A4 Margins: top = %d, bottom = %d, left = %d, right = %d\n",
- caps->a4_margins.top_margin, caps->a4_margins.bottom_margin,
- caps->a4_margins.left_margin, caps->a4_margins.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 (stp_get_string_parameter(v, "JobMode"))
+ offer_duplex = strcmp(stp_get_string_parameter(v, "JobMode"), "Page");
+ else
+ offer_duplex=1;
- 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 (offer_duplex)
{
- if (caps->paper_types[0] == -1)
- {
- return (NULL);
- }
+ if (caps->stp_printer_type & PCL_PRINTER_DUPLEX)
+ {
+ description->deflt.str = duplex_types[0].name;
+ for (i=0; i < NUM_DUPLEX; i++)
+ {
+ stp_string_list_add_string(description->bounds.str,
+ duplex_types[i].name,_(duplex_types[i].text));
+ }
+ }
else
- {
- return (pcl_val_to_string(caps->paper_types[0], pcl_media_types,
- NUM_PRINTER_PAPER_TYPES));
- }
+ description->is_active = 0; /* Not supported by printer */
}
- else if (strcmp(name, "InputSlot") == 0)
- {
- if (caps->paper_sources[0] == -1)
- {
- return (NULL);
- }
+ else
+ description->is_active = 0; /* Not in "Job" mode */
+ }
+ else if (strcmp(name, "CyanDensity") == 0 ||
+ strcmp(name, "MagentaDensity") == 0 ||
+ strcmp(name, "YellowDensity") == 0 ||
+ strcmp(name, "BlackDensity") == 0)
+ {
+ if (caps->color_type != PCL_COLOR_NONE &&
+ stp_check_string_parameter(v, "PrintingMode", STP_PARAMETER_DEFAULTED) &&
+ strcmp(stp_get_string_parameter(v, "PrintingMode"), "Color") == 0)
+ description->is_active = 1;
else
- {
- return (pcl_val_to_string(caps->paper_sources[0], pcl_media_sources,
- NUM_PRINTER_PAPER_SOURCES));
- }
+ description->is_active = 0;
}
- else if (strcmp(name, "Resolution") == 0)
+ else if (strcmp(name, "LightCyanTransition") == 0 ||
+ strcmp(name, "LightMagentaTransition") == 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;
+ if (caps->color_type & PCL_COLOR_CMYKcm &&
+ stp_check_string_parameter(v, "PrintingMode", STP_PARAMETER_DEFAULTED) &&
+ strcmp(stp_get_string_parameter(v, "PrintingMode"), "Color") == 0)
+ description->is_active = 1;
+ else
+ description->is_active = 0;
}
- else if (strcmp(name, "InkType") == 0)
+ else if (strcmp(name, "InkChannels") == 0)
{
if (caps->color_type & PCL_COLOR_CMYKcm)
- {
- return (ink_types[0].name);
- }
+ description->deflt.integer = 6;
+ else if (caps->color_type == PCL_COLOR_NONE)
+ description->deflt.integer = 1;
else
- return(NULL);
+ description->deflt.integer = 4;
+ description->bounds.integer.lower = -1;
+ description->bounds.integer.upper = -1;
+ }
+ else if (strcmp(name, "PrintingMode") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ if (caps->color_type != PCL_COLOR_NONE)
+ stp_string_list_add_string
+ (description->bounds.str, "Color", _("Color"));
+ stp_string_list_add_string
+ (description->bounds.str, "BW", _("Black and White"));
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
}
- 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 */
+internal_imageable_area(const stp_vars_t *v, /* I */
+ int use_paper_margins,
+ 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 */
int pcl_media_size; /* Converted media size */
- const char *media_size; /* Media size string */
- stp_papersize_t pp;
+ const char *media_size = stp_get_string_parameter(v, "PageSize");
+ const stp_papersize_t *pp = NULL;
+ int left_margin = 0;
+ int right_margin = 0;
+ int bottom_margin = 0;
+ int top_margin = 0;
- caps = pcl_get_model_capabilities(stp_printer_get_model(printer));
+ caps = pcl_get_model_capabilities(stp_get_model_id(v));
- stp_default_media_size(printer, v, &width, &height);
+ stp_default_media_size(v, &width, &height);
/* If we are using A4 paper, then the margins are different than any
* other paper size. This is because HP wanted to have the same printable
* width for A4 as for letter. Go figure.
*/
- 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
+ if (!media_size)
media_size = "";
+ if (strlen(media_size) == 0 &&
+ ((pp = stp_get_papersize_by_size(stp_get_page_height(v),
+ stp_get_page_width(v))) != NULL))
+ media_size = pp->name;
stp_deprintf(STP_DBG_PCL, "pcl_imageable_area(): media_size: '%s'\n",
- media_size);
+ media_size);
- pcl_media_size = pcl_convert_media_size(media_size,
- stp_printer_get_model(printer));
+ pcl_media_size = pcl_convert_media_size(media_size, stp_get_model_id(v));
+ if (media_size)
+ pp = stp_get_papersize_by_name(media_size);
+ if (pp && use_paper_margins)
+ {
+ left_margin = pp->left;
+ right_margin = pp->right;
+ bottom_margin = pp->bottom;
+ top_margin = pp->top;
+ }
if (pcl_media_size == PCL_PAPERSIZE_A4)
{
- *left = caps->a4_margins.left_margin;
- *right = width - caps->a4_margins.right_margin;
- *top = height - caps->a4_margins.top_margin;
- *bottom = caps->a4_margins.bottom_margin;
+ left_margin = MAX(left_margin, caps->a4_margins.left_margin);
+ right_margin = MAX(right_margin, caps->a4_margins.right_margin);
+ top_margin = MAX(top_margin, caps->a4_margins.top_margin);
+ bottom_margin = MAX(bottom_margin, caps->a4_margins.bottom_margin);
}
else
{
- *left = caps->normal_margins.left_margin;
- *right = width - caps->normal_margins.right_margin;
- *top = height - caps->normal_margins.top_margin;
- *bottom = caps->normal_margins.bottom_margin;
+ left_margin = MAX(left_margin, caps->normal_margins.left_margin);
+ right_margin = MAX(right_margin, caps->normal_margins.right_margin);
+ top_margin = MAX(top_margin, caps->normal_margins.top_margin);
+ bottom_margin = MAX(bottom_margin, caps->normal_margins.bottom_margin);
}
+ *left = left_margin;
+ *right = width - right_margin;
+ *top = top_margin;
+ *bottom = height - bottom_margin;
}
static void
-pcl_limit(const stp_printer_t printer, /* I - Printer model */
- const stp_vars_t v, /* I */
+pcl_imageable_area(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 */
+{
+ internal_imageable_area(v, 1, left, right, bottom, top);
+}
+
+static void
+pcl_limit(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));
+ const pcl_cap_t *caps= pcl_get_model_capabilities(stp_get_model_id(v));
*width = caps->custom_max_width;
*height = caps->custom_max_height;
*min_width = caps->custom_min_width;
*min_height = caps->custom_min_height;
}
+static const char *
+pcl_describe_output(const stp_vars_t *v)
+{
+ int printing_color = 0;
+ int model = stp_get_model_id(v);
+ const pcl_cap_t *caps = pcl_get_model_capabilities(model);
+ const char *print_mode = stp_get_string_parameter(v, "PrintingMode");
+ int xdpi, ydpi;
+
+ pcl_describe_resolution(v, &xdpi, &ydpi);
+ if (!print_mode || strcmp(print_mode, "Color") == 0)
+ printing_color = 1;
+ if (((caps->resolutions & PCL_RES_600_600_MONO) == PCL_RES_600_600_MONO) &&
+ printing_color && xdpi == 600 && ydpi == 600)
+ printing_color = 0;
+ if (printing_color)
+ {
+ if ((caps->color_type & PCL_COLOR_CMY) == PCL_COLOR_CMY)
+ return "CMY";
+ else
+ return "CMYK";
+ }
+ else
+ return "Grayscale";
+}
+
/*
* '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)
+pcl_printfunc(stp_vars_t *v)
+{
+ pcl_privdata_t *pd = (pcl_privdata_t *) stp_get_component_data(v, "Driver");
+ int do_blank = pd->do_blank;
+ unsigned char *black = stp_dither_get_channel(v, STP_ECOLOR_K, 0);
+ unsigned char *cyan = stp_dither_get_channel(v, STP_ECOLOR_C, 0);
+ unsigned char *lcyan = stp_dither_get_channel(v, STP_ECOLOR_C, 1);
+ unsigned char *magenta = stp_dither_get_channel(v, STP_ECOLOR_M, 0);
+ unsigned char *lmagenta = stp_dither_get_channel(v, STP_ECOLOR_M, 1);
+ unsigned char *yellow = stp_dither_get_channel(v, STP_ECOLOR_Y, 0);
+ int len_c = stp_dither_get_last_position(v, STP_ECOLOR_C, 0);
+ int len_lc = stp_dither_get_last_position(v, STP_ECOLOR_C, 1);
+ int len_m = stp_dither_get_last_position(v, STP_ECOLOR_M, 0);
+ int len_lm = stp_dither_get_last_position(v, STP_ECOLOR_M, 1);
+ int len_y = stp_dither_get_last_position(v, STP_ECOLOR_Y, 0);
+ int len_k = stp_dither_get_last_position(v, STP_ECOLOR_K, 0);
+ int is_blank = (do_blank && (len_c == -1) && (len_lc == -1) &&
+ (len_m == -1) && (len_lm == -1) && (len_y == -1) &&
+ (len_k == -1));
+ int height = pd->height;
+ const char *print_mode = stp_get_string_parameter(v, "PrintingMode");
+
+ if (is_blank && (pd->blank_lines != 0)) /* repeated blank line */
+ {
+ pd->blank_lines++;
+ }
+ else /* Not blank, or is first one */
+ {
+ if (! is_blank)
+ {
+ if (pd->blank_lines > 1) /* Output accumulated lines */
+ {
+ pd->blank_lines--; /* correct for one already output */
+ stp_deprintf(STP_DBG_PCL, "Blank Lines = %d\n", pd->blank_lines);
+ stp_zprintf(v, "\033*b%dY", pd->blank_lines);
+ pd->blank_lines=0;
+ }
+ else;
+ }
+ else
+ {
+ pd->blank_lines++;
+ }
+
+ if (pd->do_cret)
+ {
+ /*
+ * 4-level (CRet) dithers...
+ */
+ if (strcmp(print_mode, "BW") == 0)
+ {
+ (*(pd->writefunc))(v, black + height / 2, height / 2, 0);
+ (*(pd->writefunc))(v, black, height / 2, 1);
+ }
+ else
+ {
+ if(pd->do_cretb)
+ {
+ /* (*(pd->writefunc))(v, black + height / 2, 0, 0); */
+ (*(pd->writefunc))(v, black, height/2, 0);
+ }
+ else
+ {
+ (*(pd->writefunc))(v, black + height / 2, height / 2, 0);
+ (*(pd->writefunc))(v, black, height / 2, 0);
+ }
+ (*(pd->writefunc))(v, cyan + height / 2, height / 2, 0);
+ (*(pd->writefunc))(v, cyan, height / 2, 0);
+ (*(pd->writefunc))(v, magenta + height / 2, height / 2, 0);
+ (*(pd->writefunc))(v, magenta, height / 2, 0);
+ (*(pd->writefunc))(v, yellow + height / 2, height / 2, 0);
+ if (pd->do_6color)
+ {
+ (*(pd->writefunc))(v, yellow, height / 2, 0);
+ (*(pd->writefunc))(v, lcyan + height / 2, height / 2, 0);
+ (*(pd->writefunc))(v, lcyan, height / 2, 0);
+ (*(pd->writefunc))(v, lmagenta + height / 2, height / 2, 0);
+ (*(pd->writefunc))(v, lmagenta, height / 2, 1); /* Last plane set on light magenta */
+ }
+ else
+ (*(pd->writefunc))(v, yellow, height / 2, 1); /* Last plane set on yellow */
+ }
+ }
+ else
+ {
+ /*
+ * Standard 2-level dithers...
+ */
+
+ if (strcmp(print_mode, "BW") == 0)
+ {
+ (*(pd->writefunc))(v, black, height, 1);
+ }
+ else
+ {
+ if (black != NULL)
+ (*(pd->writefunc))(v, black, height, 0);
+ (*(pd->writefunc))(v, cyan, height, 0);
+ (*(pd->writefunc))(v, magenta, height, 0);
+ if (pd->do_6color)
+ {
+ (*(pd->writefunc))(v, yellow, height, 0);
+ (*(pd->writefunc))(v, lcyan, height, 0);
+ (*(pd->writefunc))(v, lmagenta, height, 1); /* Last plane set on light magenta */
+ }
+ else
+ (*(pd->writefunc))(v, yellow, height, 1); /* Last plane set on yellow */
+ }
+ }
+ }
+}
+
+static double
+get_double_param(stp_vars_t *v, const char *param)
+{
+ if (param && stp_check_float_parameter(v, param, STP_PARAMETER_ACTIVE))
+ return stp_get_float_parameter(v, param);
+ else
+ return 1.0;
+}
+
+static int
+pcl_do_print(stp_vars_t *v, stp_image_t *image)
{
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);
+ pcl_privdata_t privdata;
+ int status = 1;
+ int model = stp_get_model_id(v);
+ const char *resolution = stp_get_string_parameter(v, "Resolution");
+ const char *media_size = stp_get_string_parameter(v, "PageSize");
+ const char *media_type = stp_get_string_parameter(v, "MediaType");
+ const char *media_source = stp_get_string_parameter(v, "InputSlot");
+ const char *ink_type = stp_get_string_parameter(v, "InkType");
+ const char *print_mode = stp_get_string_parameter(v, "PrintingMode");
+ const char *duplex_mode = stp_get_string_parameter(v, "Duplex");
+ int page_number = stp_get_int_parameter(v, "PageNumber");
+ int printing_color = 0;
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 */
+ unsigned char *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 */
+ int page_width, /* Width of page */
page_height, /* Height of page */
+ page_left,
+ page_top,
+ page_right,
+ page_bottom,
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 */
+ out_channels, /* Output bytes per pixel */
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 *, unsigned char *,
- int, int); /* PCL output function */
+ unsigned zero_mask;
int image_height,
- image_width,
- image_bpp;
- void * dither;
+ image_width;
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 */
- stp_dither_data_t *dt;
- unsigned char *comp_buf; /* Scratch buffer for pcl_mode2 */
+ int planes = 3; /* # of output planes */
+ int pcl_media_size; /* PCL media size code */
+ const double *dot_sizes_use;
+ const stp_papersize_t *pp;
int the_top_margin, /* Corrected top margin */
the_left_margin; /* Corrected left margin */
+ stp_curve_t *lum_adjustment;
+ stp_curve_t *hue_adjustment;
+ double density;
- if (!stp_get_verified(nv))
+ if (!stp_verify(v))
{
- stp_eprintf(nv, "Print options not verified; cannot print.\n");
- return;
+ stp_eprintf(v, "Print options not verified; cannot print.\n");
+ return 0;
}
+ if (strcmp(print_mode, "Color") == 0)
+ printing_color = 1;
caps = pcl_get_model_capabilities(model);
@@ -2240,10 +2054,9 @@ pcl_print(const stp_printer_t printer, /* I - 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);
+ stp_image_init(image);
+ image_height = stp_image_height(image);
+ image_width = stp_image_width(image);
/*
* Figure out the output resolution...
@@ -2251,122 +2064,83 @@ pcl_print(const stp_printer_t printer, /* I - Model */
xdpi = 0;
ydpi = 0;
- for (i = 0; i < NUM_RESOLUTIONS; i++)
+ if (resolution)
{
- if (!strcmp(resolution, pcl_resolutions[i].pcl_name))
+ for (i = 0; i < NUM_RESOLUTIONS; i++)
{
- xdpi = pcl_resolutions[i].p0;
- ydpi = pcl_resolutions[i].p1;
- break;
+ 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;
+ return 0;
/*
* 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)
+ printing_color && 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_string_parameter(v, "PrintingMode", "BW");
+ printing_color = 0;
}
- 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 &&
+ privdata.do_cret = (xdpi >= 300 &&
+ ((caps->color_type & PCL_COLOR_CMYK4) == PCL_COLOR_CMYK4));
+ privdata.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;
+ printing_color);
+ if (privdata.do_cretb){
+ privdata.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);
+ stp_deprintf(STP_DBG_PCL, "privdata.do_cret = %d\n", privdata.do_cret);
+ stp_deprintf(STP_DBG_PCL, "privdata.do_cretb = %d\n", privdata.do_cretb);
- do_6color = (strcmp(ink_type, "Photo") == 0);
- stp_deprintf(STP_DBG_PCL, "do_6color = %d\n", do_6color);
+ if (ink_type)
+ privdata.do_6color = (strcmp(ink_type, "Photo") == 0);
+ else
+ privdata.do_6color = 0;
+
+ stp_deprintf(STP_DBG_PCL, "privdata.do_6color = %d\n", privdata.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);
+ out_width = stp_get_width(v);
+ out_height = stp_get_height(v);
- /*
- * Let the user know what we're doing...
- */
+ internal_imageable_area(v, 0, &page_left, &page_right,
+ &page_bottom, &page_top);
+ left -= page_left;
+ top -= page_top;
+ page_width = page_right - page_left;
+ page_height = page_bottom - page_top;
- image->progress_init(image);
+ image_height = stp_image_height(image);
+ image_width = stp_image_width(image);
/*
- * Send PCL initialization commands...
+ * Set media size here because it is needed by the margin calculation code.
*/
- 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
+ if (!media_size)
media_size = "";
+ if (strlen(media_size) == 0 &&
+ ((pp = stp_get_papersize_by_size(stp_get_page_height(v),
+ stp_get_page_width(v))) != NULL))
+ media_size = pp->name;
pcl_media_size = pcl_convert_media_size(media_size, model);
@@ -2385,48 +2159,90 @@ pcl_print(const stp_printer_t printer, /* I - Model */
pcl_media_size = PCL_PAPERSIZE_CUSTOM; /* Custom */
}
- stp_zprintf(v, "\033&l%dA", pcl_media_size);
+ stp_deprintf(STP_DBG_PCL, "Duplex: %s, Page_Number: %d\n", duplex_mode, page_number);
+ privdata.duplex=0;
+ privdata.tumble=0;
- stp_puts("\033&l0L", v); /* Turn off perforation skip */
- stp_puts("\033&l0E", v); /* Reset top margin to 0 */
+ /*
+ * Duplex
+ */
+
+ if (duplex_mode)
+ {
+ if (caps->stp_printer_type & PCL_PRINTER_DUPLEX)
+ {
+ if ((strcmp(duplex_mode, "DuplexTumble") == 0) || (strcmp(duplex_mode, "DuplexNoTumble") == 0))
+ privdata.duplex=1;
+ if ((strcmp(duplex_mode, "DuplexTumble") == 0))
+ privdata.tumble=1;
+ }
+ else
+ stp_erprintf("pcl: cannot duplex on this hardware.\n");
+ }
+
+ /*
+ * Send PCL initialization commands...
+ */
+
+ if ((privdata.duplex == 0) || ((page_number & 1) == 0))
+ {
+ int pcl_media_type, /* PCL media type code */
+ pcl_media_source; /* PCL media source code */
+
+ stp_deprintf(STP_DBG_PCL, "Normal init\n");
+
+ if (privdata.do_cretb)
+ stp_puts("\033*rbC", v); /* End raster graphics */
+ stp_puts("\033E", v); /* PCL reset */
+ if (privdata.do_cretb)
+ stp_zprintf(v, "\033%%-12345X@PJL ENTER LANGUAGE=PCL3GUI\n");
+
+ stp_puts("\033&l6D\033&k12H",v); /* 6 lines per inch, 10 chars per inch */
+ stp_puts("\033&l0O",v); /* Portrait */
+
+ stp_zprintf(v, "\033&l%dA", pcl_media_size); /* Set media size we calculated above */
+ stp_zprintf(v, "\033&l%dP", stp_get_page_height(v) / 12);
+ /* Length of "forms" in "lines" */
+ 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));
+ if (media_source && 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);
+ 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) {
+ 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);
- }
- }
+ 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));
+ if (media_type && 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);
+ 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;
- }
+ 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
@@ -2434,61 +2250,100 @@ pcl_print(const stp_printer_t printer, /* I - Model */
*
*/
- 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;
+ if (privdata.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) */
+ 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 */
+ 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 */
+ }
}
- 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 */
+/*
+ * Duplex
+ */
+
+ if (privdata.duplex)
+ stp_zprintf(v,"\033&l%dS", privdata.duplex + privdata.tumble);
+ }
+ else
+ {
+ stp_deprintf(STP_DBG_PCL, "Back face init\n");
+ stp_puts("\033&a2G", v);
+ }
+
+/*
+ * See if we need to use the CRD (Configure Raster Data) command, because we're
+ * doing something interesting on a DeskJet.
+ * (I hate long complicated if statements, the compiler will sort it out!).
+ */
+
+ privdata.use_crd = 0;
+ if ((caps->stp_printer_type & PCL_PRINTER_DJ) == PCL_PRINTER_DJ)
+ {
+ if (xdpi != ydpi) /* Different X and Y Resolutions */
+ privdata.use_crd = 1;
+ if (privdata.do_cret) /* Resolution Enhancement */
+ privdata.use_crd = 1;
+ if (privdata.do_6color) /* Photo Ink printing */
+ privdata.use_crd = 1;
+ if (privdata.duplex) /* Duplexing */
+ privdata.use_crd = 1;
}
- }
- if ((xdpi != ydpi) || (do_cret) || (do_6color))
+ if (privdata.use_crd)
/* Set resolution using CRD */
{
+/*
+ * If duplexing on a CRD printer, we need to use the (re)load media command.
+ */
+
+ if (privdata.duplex)
+ stp_puts("\033&l-2H",v); /* Load media */
+
/*
* 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 (printing_color)
if ((caps->color_type & PCL_COLOR_CMY) == PCL_COLOR_CMY)
planes = 3;
else
- if (do_6color)
+ if (privdata.do_6color)
planes = 6;
else
planes = 4;
@@ -2499,62 +2354,25 @@ pcl_print(const stp_printer_t printer, /* I - Model */
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 != 3) { /* Black resolution */
+ stp_send_command(v, "", "HHH", xdpi, ydpi, (privdata.do_cretb || !privdata.do_cret) ? 2 : 4);
}
- 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 != 1) { /* Cyan, magenta, yellow resolutions */
+ stp_send_command(v, "", "HHH", xdpi, ydpi, privdata.do_cret ? 4 : 2);
+ stp_send_command(v, "", "HHH", xdpi, ydpi, privdata.do_cret ? 4 : 2);
+ stp_send_command(v, "", "HHH", xdpi, ydpi, privdata.do_cret ? 4 : 2);
}
- if (planes == 6)
+ if (planes == 6) /* LC, LM resolutions */
{
- 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);
+ stp_send_command(v, "", "HHH", xdpi, ydpi, privdata.do_cret ? 4 : 2);
+ stp_send_command(v, "", "HHH", xdpi, ydpi, privdata.do_cret ? 4 : 2);
}
}
else
{
stp_zprintf(v, "\033*t%dR", xdpi); /* Simple resolution */
- if (output_type != OUTPUT_GRAY && output_type != OUTPUT_MONOCHROME)
+ if (printing_color)
{
if ((caps->color_type & PCL_COLOR_CMY) == PCL_COLOR_CMY)
stp_puts("\033*r-3U", v); /* Simple CMY color */
@@ -2595,7 +2413,7 @@ pcl_print(const stp_printer_t printer, /* I - Model */
stp_deprintf(STP_DBG_PCL, "left %d margin %d top %d margin %d width %d height %d\n",
left, the_left_margin, top, the_top_margin, out_width, out_height);
- if (!do_cretb) {
+ if (!privdata.do_cretb) {
stp_zprintf(v, "\033&a%dH", 10 * left); /* Set left raster position */
stp_zprintf(v, "\033&a%dV", 10 * (top + the_top_margin));
/* Set top raster position */
@@ -2603,7 +2421,7 @@ pcl_print(const stp_printer_t printer, /* I - Model */
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)
+ if (privdata.do_cretb)
{
/* Move to top left of printed area */
stp_zprintf(v, "\033*p%dY", (top + the_top_margin)*4); /* Measured in dots. */
@@ -2615,13 +2433,13 @@ pcl_print(const stp_printer_t printer, /* I - Model */
* Allocate memory for the raster data...
*/
- height = (out_width + 7) / 8;
- if (do_cret)
- height *= 2;
+ privdata.height = (out_width + 7) / 8;
+ if (privdata.do_cret)
+ privdata.height *= 2;
- if (output_type == OUTPUT_GRAY || output_type == OUTPUT_MONOCHROME)
+ if (!printing_color)
{
- black = stp_malloc(height);
+ black = stp_malloc(privdata.height);
cyan = NULL;
magenta = NULL;
yellow = NULL;
@@ -2630,18 +2448,18 @@ pcl_print(const stp_printer_t printer, /* I - Model */
}
else
{
- cyan = stp_malloc(height);
- magenta = stp_malloc(height);
- yellow = stp_malloc(height);
+ cyan = stp_malloc(privdata.height);
+ magenta = stp_malloc(privdata.height);
+ yellow = stp_malloc(privdata.height);
if ((caps->color_type & PCL_COLOR_CMY) == PCL_COLOR_CMY)
black = NULL;
else
- black = stp_malloc(height);
- if (do_6color)
+ black = stp_malloc(privdata.height);
+ if (privdata.do_6color)
{
- lcyan = stp_malloc(height);
- lmagenta = stp_malloc(height);
+ lcyan = stp_malloc(privdata.height);
+ lmagenta = stp_malloc(privdata.height);
}
else
{
@@ -2650,248 +2468,176 @@ pcl_print(const stp_printer_t printer, /* I - Model */
}
}
+ if (black)
+ {
+ if (cyan)
+ stp_set_string_parameter(v, "STPIOutputType", "KCMY");
+ else
+ stp_set_string_parameter(v, "STPIOutputType", "Grayscale");
+ }
+ else
+ stp_set_string_parameter(v, "STPIOutputType", "CMY");
+
/* Allocate buffer for pcl_mode2 tiff compression */
#ifndef PCL_DEBUG_DISABLE_COMPRESSION
if ((caps->stp_printer_type & PCL_PRINTER_TIFF) == PCL_PRINTER_TIFF)
{
- comp_buf = stp_malloc((height + 128 + 7) * 129 / 128);
- writefunc = pcl_mode2;
+ privdata.comp_buf = stp_malloc((privdata.height + 128 + 7) * 129 / 128);
+ privdata.writefunc = pcl_mode2;
}
else
#endif
{
- comp_buf = NULL;
- writefunc = pcl_mode0;
+ privdata.comp_buf = NULL;
+ privdata.writefunc = pcl_mode0;
}
- /*
- * 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);
+ if (!stp_check_float_parameter(v, "GCRLower", STP_PARAMETER_ACTIVE))
+ stp_set_default_float_parameter(v, "GCRLower", .3);
+ if (!stp_check_float_parameter(v, "GCRUpper", STP_PARAMETER_ACTIVE))
+ stp_set_default_float_parameter(v, "GCRUpper", .999);
#endif
+ stp_dither_init(v, image, out_width, xdpi, ydpi);
+
+ if (black)
+ {
+ stp_dither_add_channel(v, black, STP_ECOLOR_K, 0);
+ stp_channel_set_black_channel(v, STP_ECOLOR_K);
+ }
+ if (cyan)
+ stp_dither_add_channel(v, cyan, STP_ECOLOR_C, 0);
+ if (lcyan)
+ stp_dither_add_channel(v, lcyan, STP_ECOLOR_C, 1);
+ if (magenta)
+ stp_dither_add_channel(v, magenta, STP_ECOLOR_M, 0);
+ if (lmagenta)
+ stp_dither_add_channel(v, lmagenta, STP_ECOLOR_M, 1);
+ if (yellow)
+ stp_dither_add_channel(v, yellow, STP_ECOLOR_Y, 0);
/* Ensure that density does not exceed 1.0 */
- stp_deprintf(STP_DBG_PCL, "Density: %f\n", stp_get_density(nv));
- if (stp_get_density(nv) > 1.0)
- stp_set_density(nv, 1.0);
+ if (!stp_check_float_parameter(v, "Density", STP_PARAMETER_DEFAULTED))
+ {
+ stp_set_float_parameter_active(v, "Density", STP_PARAMETER_ACTIVE);
+ stp_set_float_parameter(v, "Density", 1.0);
+ }
- if (do_cret) /* 4-level printing for 800/1120 */
+ stp_deprintf(STP_DBG_PCL, "Density: %f\n", stp_get_float_parameter(v, "Density"));
+ if (stp_get_float_parameter(v, "Density") > 1.0)
+ stp_set_float_parameter(v, "Density", 1.0);
+ density = stp_get_float_parameter(v, "Density");
+
+ if (privdata.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));
+ stp_dither_set_inks_simple(v, STP_ECOLOR_Y, 3, dot_sizes_use, 1.0, 0.08);
+ if (!privdata.do_cretb)
+ stp_dither_set_inks_simple(v, STP_ECOLOR_K, 3, dot_sizes_use, 1.0, 1.0);
-/* 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 */
+ /* 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 */
+ if (privdata.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));
+ stp_dither_set_inks_full(v, STP_ECOLOR_C, 6, variable_shades, 1.0,
+ 0.31 / .5);
+ stp_dither_set_inks_full(v, STP_ECOLOR_M, 6, variable_shades, 1.0,
+ 0.61 / .97);
}
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));
+ stp_dither_set_inks_simple(v, STP_ECOLOR_C, 3, dot_sizes_use, 1.0,
+ 0.31 / .5);
+ stp_dither_set_inks_simple(v, STP_ECOLOR_M, 3, dot_sizes_use, 1.0,
+ 0.61 / .7);
}
}
- 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));
+ else if (privdata.do_6color)
+ {
+ /* Set light inks for 6 colour printers.
+ Numbers copied from print-escp2.c */
+ stp_dither_set_inks_full(v, STP_ECOLOR_C, 2, photo_dither_shades, 1.0,
+ 0.31 / .5);
+ stp_dither_set_inks_full(v, STP_ECOLOR_M, 2, photo_dither_shades, 1.0,
+ 0.61 / .7);
}
+ if (black)
+ stp_channel_set_density_adjustment(v, STP_ECOLOR_K, 0,
+ get_double_param(v, "BlackDensity") *
+ get_double_param(v, "Density"));
+ if (cyan)
+ stp_channel_set_density_adjustment(v, STP_ECOLOR_C, 0,
+ get_double_param(v, "CyanDensity") *
+ get_double_param(v, "Density"));
+ if (magenta)
+ stp_channel_set_density_adjustment(v, STP_ECOLOR_M, 0,
+ get_double_param(v, "MagentaDensity") *
+ get_double_param(v, "Density"));
+ if (yellow)
+ stp_channel_set_density_adjustment(v, STP_ECOLOR_Y, 0,
+ get_double_param(v, "YellowDensity") *
+ get_double_param(v, "Density"));
+ if (lcyan)
+ stp_channel_set_density_adjustment
+ (v, STP_ECOLOR_C, 1, (get_double_param(v, "CyanDensity") *
+ get_double_param(v, "LightCyanTransition") *
+ get_double_param(v, "Density")));
+ if (lmagenta)
+ stp_channel_set_density_adjustment
+ (v, STP_ECOLOR_M, 1, (get_double_param(v, "MagentaDensity") *
+ get_double_param(v, "LightMagentaTransition") *
+ get_double_param(v, "Density")));
+
- switch (stp_get_image_type(nv))
+ if (!stp_check_curve_parameter(v, "HueMap", STP_PARAMETER_ACTIVE))
{
- 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;
+ hue_adjustment = stp_curve_create_from_string(standard_hue_adjustment);
+ stp_set_curve_parameter(v, "HueMap", hue_adjustment);
+ stp_curve_destroy(hue_adjustment);
+ }
+ if (!stp_check_curve_parameter(v, "LumMap", STP_PARAMETER_ACTIVE))
+ {
+ lum_adjustment = stp_curve_create_from_string(standard_lum_adjustment);
+ stp_curve_destroy(lum_adjustment);
}
- stp_dither_set_density(dither, stp_get_density(nv));
- in = stp_zalloc(image_width * image_bpp);
- out = stp_zalloc(image_width * out_bpp * 2);
+ out_channels = stp_color_init(v, image, 65536);
errdiv = image_height / out_height;
errmod = image_height % out_height;
errval = 0;
errlast = -1;
errline = 0;
- blank_lines = 0;
- is_blank = 0;
+ privdata.blank_lines = 0;
#ifndef PCL_DEBUG_DISABLE_BLANKLINE_REMOVAL
- do_blank = ((caps->stp_printer_type & PCL_PRINTER_BLANKLINE) ==
- PCL_PRINTER_BLANKLINE);
+ privdata.do_blank = ((caps->stp_printer_type & PCL_PRINTER_BLANKLINE) ==
+ PCL_PRINTER_BLANKLINE);
#else
- do_blank = 0;
+ privdata.do_blank = 0;
#endif
-
- dt = stp_create_dither_data();
- if (black)
- stp_add_channel(dt, black, ECOLOR_K, 0);
- if (cyan)
- stp_add_channel(dt, cyan, ECOLOR_C, 0);
- if (lcyan)
- stp_add_channel(dt, lcyan, ECOLOR_C, 1);
- if (magenta)
- stp_add_channel(dt, magenta, ECOLOR_M, 0);
- if (lmagenta)
- stp_add_channel(dt, lmagenta, ECOLOR_M, 1);
- if (yellow)
- stp_add_channel(dt, yellow, ECOLOR_Y, 0);
+ stp_allocate_component_data(v, "Driver", NULL, NULL, &privdata);
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, dt, duplicate_line, zero_mask);
-
- len_c = stp_dither_get_last_position(dither, ECOLOR_C, 0);
- len_lc = stp_dither_get_last_position(dither, ECOLOR_C, 1);
- len_m = stp_dither_get_last_position(dither, ECOLOR_M, 0);
- len_lm = stp_dither_get_last_position(dither, ECOLOR_M, 1);
- len_y = stp_dither_get_last_position(dither, ECOLOR_Y, 0);
- len_k = stp_dither_get_last_position(dither, ECOLOR_K, 0);
-
-/*
- * 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, comp_buf, black + height / 2, height / 2, 0);
- (*writefunc)(v, comp_buf, black, height / 2, 1);
- }
- else
- {
- if(do_cretb)
- {
-/* (*writefunc)(v, comp_buf, black + height / 2, 0, 0); */
- (*writefunc)(v, comp_buf, black, height/2, 0);
- }
- else
- {
- (*writefunc)(v, comp_buf, black + height / 2, height / 2, 0);
- (*writefunc)(v, comp_buf, black, height / 2, 0);
- }
- (*writefunc)(v, comp_buf, cyan + height / 2, height / 2, 0);
- (*writefunc)(v, comp_buf, cyan, height / 2, 0);
- (*writefunc)(v, comp_buf, magenta + height / 2, height / 2, 0);
- (*writefunc)(v, comp_buf, magenta, height / 2, 0);
- (*writefunc)(v, comp_buf, yellow + height / 2, height / 2, 0);
- if (do_6color)
- {
- (*writefunc)(v, comp_buf, yellow, height / 2, 0);
- (*writefunc)(v, comp_buf, lcyan + height / 2, height / 2, 0);
- (*writefunc)(v, comp_buf, lcyan, height / 2, 0);
- (*writefunc)(v, comp_buf, lmagenta + height / 2, height / 2, 0);
- (*writefunc)(v, comp_buf, lmagenta, height / 2, 1); /* Last plane set on light magenta */
- }
- else
- (*writefunc)(v, comp_buf, 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, comp_buf, black, height, 1);
- }
- else
- {
- if (black != NULL)
- (*writefunc)(v, comp_buf, black, height, 0);
- (*writefunc)(v, comp_buf, cyan, height, 0);
- (*writefunc)(v, comp_buf, magenta, height, 0);
- if (do_6color)
- {
- (*writefunc)(v, comp_buf, yellow, height, 0);
- (*writefunc)(v, comp_buf, lcyan, height, 0);
- (*writefunc)(v, comp_buf, lmagenta, height, 1); /* Last plane set on light magenta */
- }
- else
- (*writefunc)(v, comp_buf, yellow, height, 1); /* Last plane set on yellow */
- }
- }
+ if (stp_color_get_row(v, image, errline, &zero_mask))
+ {
+ status = 2;
+ break;
+ }
}
-
+ stp_dither(v, y, duplicate_line, zero_mask, NULL);
+ pcl_printfunc(v);
+ stp_deprintf(STP_DBG_PCL,"pcl_print: y = %d, line = %d, val = %d, mod = %d, height = %d\n",
+ y, errline, errval, errmod, out_height);
errval += errmod;
errline += errdiv;
if (errval >= out_height)
@@ -2903,28 +2649,20 @@ pcl_print(const stp_printer_t printer, /* I - Model */
/* Output trailing blank lines (may not be required?) */
- if (blank_lines > 1)
+ if (privdata.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;
+ privdata.blank_lines--; /* correct for one already output */
+ stp_deprintf(STP_DBG_PCL, "Blank Lines = %d\n", privdata.blank_lines);
+ stp_zprintf(v, "\033*b%dY", privdata.blank_lines);
+ privdata.blank_lines=0;
}
- image->progress_conclude(image);
-
- stp_free_dither_data(dt);
- stp_free_dither(dither);
-
+ stp_image_conclude(image);
/*
* Cleanup...
*/
- stp_free_lut(nv);
- stp_free(in);
- stp_free(out);
-
if (black != NULL)
stp_free(black);
if (cyan != NULL)
@@ -2939,35 +2677,50 @@ pcl_print(const stp_printer_t printer, /* I - Model */
stp_free(lmagenta);
}
- if (comp_buf != NULL)
- stp_free(comp_buf);
+ if (privdata.comp_buf != NULL)
+ stp_free(privdata.comp_buf);
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)
+ if ((privdata.duplex == 1) && ((page_number & 1) == 0))
+ stp_puts("\014", v); /* Form feed */
+ else
{
- stp_zprintf(v, "\033%%-12345X\n");
+ stp_puts("\033&l0H", v); /* Eject page */
+ if (privdata.do_cretb)
+ stp_zprintf(v, "\033%%-12345X\n");
+ stp_puts("\033E", v); /* PCL reset */
}
- stp_puts("\033E", v); /* PCL reset */
- stp_free_vars(nv);
+ return status;
}
-const stp_printfuncs_t stp_pcl_printfuncs =
+static int
+pcl_print(const stp_vars_t *v, stp_image_t *image)
{
+ int status;
+ stp_vars_t *nv = stp_vars_create_copy(v);
+ stp_prune_inactive_options(nv);
+ status = pcl_do_print(nv, image);
+ stp_vars_destroy(nv);
+ return status;
+}
+
+static const stp_printfuncs_t print_pcl_printfuncs =
+{
+ pcl_list_parameters,
pcl_parameters,
stp_default_media_size,
pcl_imageable_area,
pcl_limit,
pcl_print,
- pcl_default_parameters,
pcl_describe_resolution,
+ pcl_describe_output,
stp_verify_printer_params,
- stp_start_job,
- stp_end_job
+ NULL,
+ NULL
};
@@ -2976,8 +2729,7 @@ const stp_printfuncs_t stp_pcl_printfuncs =
*/
static void
-pcl_mode0(const stp_vars_t v, /* I - Print file or command */
- unsigned char *comp_buf, /* I - scratch buffer (not used) */
+pcl_mode0(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 */
@@ -2992,15 +2744,17 @@ pcl_mode0(const stp_vars_t v, /* I - Print file or command */
*/
static void
-pcl_mode2(const stp_vars_t v, /* I - Print file or command */
- unsigned char *comp_buf, /* I - Scratch Buffer */
+pcl_mode2(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 */
{
+ pcl_privdata_t *privdata =
+ (pcl_privdata_t *) stp_get_component_data(v, "Driver");
+ unsigned char *comp_buf = privdata->comp_buf;
unsigned char *comp_ptr; /* Current slot in buffer */
- stp_pack_tiff(line, height, comp_buf, &comp_ptr);
+ stp_pack_tiff(v, line, height, comp_buf, &comp_ptr, NULL, NULL);
/*
* Send a line of raster graphics...
@@ -3009,3 +2763,44 @@ pcl_mode2(const stp_vars_t v, /* I - Print file or command */
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);
}
+
+
+static stp_family_t print_pcl_module_data =
+ {
+ &print_pcl_printfuncs,
+ NULL
+ };
+
+
+static int
+print_pcl_module_init(void)
+{
+ return stp_family_register(print_pcl_module_data.printer_list);
+}
+
+
+static int
+print_pcl_module_exit(void)
+{
+ return stp_family_unregister(print_pcl_module_data.printer_list);
+}
+
+
+/* Module header */
+#define stp_module_version print_pcl_LTX_stp_module_version
+#define stp_module_data print_pcl_LTX_stp_module_data
+
+stp_module_version_t stp_module_version = {0, 0};
+
+stp_module_t stp_module_data =
+ {
+ "pcl",
+ VERSION,
+ "PCL family driver",
+ STP_MODULE_CLASS_FAMILY,
+ NULL,
+ print_pcl_module_init,
+ print_pcl_module_exit,
+ (void *) &print_pcl_module_data
+ };
+
diff --git a/src/main/print-ps.c b/src/main/print-ps.c
index 3f37cff..6157db2 100644
--- a/src/main/print-ps.c
+++ b/src/main/print-ps.c
@@ -1,5 +1,5 @@
/*
- * "$Id: print-ps.c,v 1.26.2.7 2004/06/13 14:33:55 rlk Exp $"
+ * "$Id: print-ps.c,v 1.79 2004/09/17 18:38:26 rleigh Exp $"
*
* Print plug-in Adobe PostScript driver for the GIMP.
*
@@ -29,17 +29,19 @@
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#include <gimp-print/gimp-print.h>
-#include "gimp-print-internal.h"
-#include <gimp-print/gimp-print-intl-internal.h>
+#include <gutenprint/gutenprint.h>
+#include <gutenprint/gutenprint-intl-internal.h>
+#include "gutenprint-internal.h"
#include <time.h>
#include <string.h>
+#ifdef HAVE_LIMITS_H
#include <limits.h>
+#endif
#include <stdio.h>
#ifdef _MSC_VER
-#define strncasecmp(s,t,n) _strnicmp(s,t,n)
-#define strcasecmp(s,t) _stricmp(s,t)
+#define strncasecmp(s,t,n) _strnicmp(s,t,n)
+#define strcasecmp(s,t) _stricmp(s,t)
#endif
/*
@@ -54,46 +56,91 @@ 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 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 *);
-
-static char *
-c_strdup(const char *s)
+static const stp_parameter_t the_parameters[] =
{
- char *ret = stp_malloc(strlen(s) + 1);
- strcpy(ret, s);
- return ret;
-}
+ {
+ "PageSize", N_("Page Size"), N_("Basic Printer Setup"),
+ N_("Size of the paper being printed to"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "MediaType", N_("Media Type"), N_("Basic Printer Setup"),
+ N_("Type of media (plain paper, photo paper, etc.)"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "InputSlot", N_("Media Source"), N_("Basic Printer Setup"),
+ N_("Source (input slot) of the media"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "Resolution", N_("Resolution"), N_("Basic Printer Setup"),
+ N_("Resolution and quality of the print"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "InkType", N_("Ink Type"), N_("Advanced Printer Setup"),
+ N_("Type of ink in the printer"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "PPDFile", N_("PPDFile"), N_("Basic Printer Setup"),
+ N_("PPD File"),
+ STP_PARAMETER_TYPE_FILE, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "PrintingMode", N_("Printing Mode"), N_("Core Parameter"),
+ N_("Printing Output Mode"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+};
+
+static const int the_parameter_count =
+sizeof(the_parameters) / sizeof(const stp_parameter_t);
/*
* 'ps_parameters()' - Return the parameter values for the given parameter.
*/
-static stp_param_t * /* O - Parameter values */
-ps_parameters_internal(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 */
+static stp_parameter_list_t
+ps_list_parameters(const stp_vars_t *v)
+{
+ stp_parameter_list_t *ret = stp_parameter_list_create();
+ int i;
+ for (i = 0; i < the_parameter_count; i++)
+ stp_parameter_list_add_param(ret, &(the_parameters[i]));
+ return ret;
+}
+
+static void
+ps_parameters_internal(const stp_vars_t *v, const char *name,
+ stp_parameter_t *description)
{
int i;
char line[1024],
lname[255],
loption[255],
*ltext;
- stp_param_t *valptrs;
-
-
- if (count == NULL)
- return (NULL);
+ const char *ppd_file = stp_get_file_parameter(v, "PPDFile");
+ description->p_type = STP_PARAMETER_TYPE_INVALID;
+ description->deflt.str = 0;
- *count = 0;
+ if (name == NULL)
+ return;
- if (ppd_file == NULL || name == NULL)
- return (NULL);
-
- if (ps_ppd_file == NULL || strcmp(ps_ppd_file, ppd_file) != 0)
+ if (ppd_file != NULL && strlen(ppd_file) > 0 &&
+ (ps_ppd_file == NULL || strcmp(ps_ppd_file, ppd_file) != 0))
{
if (ps_ppd != NULL)
fclose(ps_ppd);
@@ -106,34 +153,49 @@ ps_parameters_internal(const stp_printer_t printer, /* I - Printer model */
ps_ppd_file = ppd_file;
}
+ for (i = 0; i < the_parameter_count; i++)
+ if (strcmp(name, the_parameters[i].name) == 0)
+ {
+ stp_fill_parameter_settings(description, &(the_parameters[i]));
+ break;
+ }
+
+ if (strcmp(name, "PrintingMode") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ stp_string_list_add_string
+ (description->bounds.str, "Color", _("Color"));
+ stp_string_list_add_string
+ (description->bounds.str, "BW", _("Black and White"));
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ return;
+ }
+
if (ps_ppd == NULL)
{
if (strcmp(name, "PageSize") == 0)
{
int papersizes = stp_known_papersizes();
- valptrs = stp_zalloc(sizeof(stp_param_t) * papersizes);
- *count = 0;
+ description->bounds.str = stp_string_list_create();
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 = c_strdup(stp_papersize_get_name(pt));
- valptrs[*count].text = c_strdup(stp_papersize_get_text(pt));
- (*count)++;
- }
+ const stp_papersize_t *pt = stp_get_papersize_by_index(i);
+ if (strlen(pt->name) > 0)
+ stp_string_list_add_string
+ (description->bounds.str, pt->name, pt->text);
}
- return (valptrs);
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ description->is_active = 1;
}
else
- return (NULL);
+ description->is_active = 0;
+ return;
}
rewind(ps_ppd);
- *count = 0;
-
- /* FIXME -- need to use realloc */
- valptrs = stp_zalloc(100 * sizeof(stp_param_t));
+ description->bounds.str = stp_string_list_create();
while (fgets(line, sizeof(line), ps_ppd) != NULL)
{
@@ -150,116 +212,25 @@ ps_parameters_internal(const stp_printer_t printer, /* I - Printer model */
else
ltext = loption;
- valptrs[(*count)].name = c_strdup(loption);
- valptrs[(*count)].text = c_strdup(ltext);
- (*count) ++;
+ stp_string_list_add_string(description->bounds.str, loption, ltext);
}
}
- if (*count == 0)
- {
- stp_free(valptrs);
- return (NULL);
- }
+ if (stp_string_list_count(description->bounds.str) > 0)
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
else
- return (valptrs);
-}
-
-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 */
-{
- stp_param_t *answer;
- setlocale(LC_ALL, "C");
- answer = ps_parameters_internal(printer, ppd_file, name, count);
- setlocale(LC_ALL, "");
- return answer;
-}
-
-static const char *
-ps_default_parameters_internal(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 c_strdup(loption);
- }
- }
-
- if (strcmp(name, "Resolution") == 0)
- {
- return "default";
- }
-
- return NULL;
+ description->is_active = 0;
+ return;
}
-static const char *
-ps_default_parameters(const stp_printer_t printer,
- const char *ppd_file,
- const char *name)
+static void
+ps_parameters(const stp_vars_t *v, const char *name,
+ stp_parameter_t *description)
{
- const char *answer;
setlocale(LC_ALL, "C");
- answer = ps_default_parameters_internal(printer, ppd_file, name);
+ ps_parameters_internal(v, name, description);
setlocale(LC_ALL, "");
- return answer;
}
/*
@@ -267,22 +238,23 @@ ps_default_parameters(const stp_printer_t printer,
*/
static void
-ps_media_size_internal(const stp_printer_t printer, /* I - Printer model */
- const stp_vars_t v, /* I */
+ps_media_size_internal(const stp_vars_t *v, /* I */
int *width, /* O - Width in points */
int *height) /* O - Height in points */
{
char *dimensions; /* Dimensions of media size */
+ const char *pagesize = stp_get_string_parameter(v, "PageSize");
+ const char *ppd_file_name = stp_get_file_parameter(v, "PPDFile");
float fwidth, fheight;
+ if (!pagesize)
+ pagesize = "";
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);
+ "ps_media_size(%d, \'%s\', \'%s\', %p, %p)\n",
+ stp_get_model_id(v), ppd_file_name, pagesize,
+ (void *) width, (void *) height);
- if ((dimensions = ppd_find(stp_get_ppd_file(v), "PaperDimension",
- stp_get_media_size(v), NULL))
+ if ((dimensions = ppd_find(ppd_file_name, "PaperDimension", pagesize, NULL))
!= NULL)
{
sscanf(dimensions, "%f%f", &fwidth, &fheight);
@@ -292,17 +264,14 @@ ps_media_size_internal(const stp_printer_t printer, /* I - Printer model */
dimensions, fwidth, fheight, *width, *height);
}
else
- stp_default_media_size(printer, v, width, height);
+ stp_default_media_size(v, width, height);
}
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 */
+ps_media_size(const stp_vars_t *v, int *width, int *height)
{
setlocale(LC_ALL, "C");
- ps_media_size_internal(printer, v, width, height);
+ ps_media_size_internal(v, width, height);
setlocale(LC_ALL, "");
}
@@ -311,8 +280,7 @@ ps_media_size(const stp_printer_t printer, /* I - Printer model */
*/
static void
-ps_imageable_area_internal(const stp_printer_t printer, /* I - Printer model */
- const stp_vars_t v, /* I */
+ps_imageable_area_internal(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 */
@@ -323,10 +291,14 @@ ps_imageable_area_internal(const stp_printer_t printer, /* I - Printer model */
fright,
fbottom,
ftop;
-
-
- if ((area = ppd_find(stp_get_ppd_file(v), "ImageableArea",
- stp_get_media_size(v), NULL))
+ int width, height;
+ const char *pagesize = stp_get_string_parameter(v, "PageSize");
+ if (!pagesize)
+ pagesize = "";
+ ps_media_size(v, &width, &height);
+
+ if ((area = ppd_find(stp_get_file_parameter(v, "PPDFile"),
+ "ImageableArea", pagesize, NULL))
!= NULL)
{
stp_dprintf(STP_DBG_PS, v, "area = \'%s\'\n", area);
@@ -334,42 +306,41 @@ ps_imageable_area_internal(const stp_printer_t printer, /* I - Printer model */
{
*left = (int)fleft;
*right = (int)fright;
- *bottom = (int)fbottom;
- *top = (int)ftop;
+ *bottom = height - (int)fbottom;
+ *top = height - (int)ftop;
}
else
*left = *right = *bottom = *top = 0;
+ stp_dprintf(STP_DBG_PS, v, "l %d r %d b %d t %d h %d w %d\n",
+ *left, *right, *bottom, *top, width, height);
}
else
{
- stp_default_media_size(printer, v, right, top);
*left = 18;
- *right -= 18;
- *top -= 36;
- *bottom = 36;
+ *right = width - 18;
+ *top = 36;
+ *bottom = height - 36;
}
}
static void
-ps_imageable_area(const stp_printer_t printer, /* I - Printer model */
- const stp_vars_t v, /* I */
+ps_imageable_area(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 */
{
setlocale(LC_ALL, "C");
- ps_imageable_area_internal(printer, v, left, right, bottom, top);
+ ps_imageable_area_internal(v, left, right, bottom, top);
setlocale(LC_ALL, "");
}
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)
+ps_limit(const stp_vars_t *v, /* I */
+ int *width,
+ int *height,
+ int *min_width,
+ int *min_height)
{
*width = INT_MAX;
*height = INT_MAX;
@@ -381,49 +352,54 @@ ps_limit(const stp_printer_t printer, /* I - Printer model */
* This is really bogus...
*/
static void
-ps_describe_resolution_internal(const stp_printer_t printer,
- const char *resolution, int *x, int *y)
+ps_describe_resolution_internal(const stp_vars_t *v, int *x, int *y)
{
+ const char *resolution = stp_get_string_parameter(v, "Resolution");
*x = -1;
*y = -1;
- sscanf(resolution, "%dx%d", x, y);
+ if (resolution)
+ sscanf(resolution, "%dx%d", x, y);
return;
}
static void
-ps_describe_resolution(const stp_printer_t printer,
- const char *resolution, int *x, int *y)
+ps_describe_resolution(const stp_vars_t *v, int *x, int *y)
{
setlocale(LC_ALL, "C");
- ps_describe_resolution_internal(printer, resolution, x, y);
+ ps_describe_resolution_internal(v, x, y);
setlocale(LC_ALL, "");
}
+static const char *
+ps_describe_output(const stp_vars_t *v)
+{
+ const char *print_mode = stp_get_string_parameter(v, "PrintingMode");
+ if (print_mode && strcmp(print_mode, "Color") == 0)
+ return "RGB";
+ else
+ return "Whitescale";
+}
+
/*
* 'ps_print()' - Print an image to a PostScript printer.
*/
-static void
-ps_print_internal(const stp_printer_t printer, /* I - Model (Level 1 or 2) */
- stp_image_t *image, /* I - Image to print */
- const stp_vars_t v)
+static int
+ps_print_internal(const stp_vars_t *v, stp_image_t *image)
{
- 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 status = 1;
+ int model = stp_get_model_id(v);
+ const char *ppd_file = stp_get_file_parameter(v, "PPDFile");
+ const char *resolution = stp_get_string_parameter(v, "Resolution");
+ const char *media_size = stp_get_string_parameter(v, "PageSize");
+ const char *media_type = stp_get_string_parameter(v, "MediaType");
+ const char *media_source = stp_get_string_parameter(v, "InputSlot");
+ const char *print_mode = stp_get_string_parameter(v, "PrintingMode");
+ unsigned short *out = NULL;
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 */
@@ -432,12 +408,11 @@ ps_print_internal(const stp_printer_t printer, /* I - Model (Level 1 or 2) */
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_channels, /* 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;
+ unsigned zero_mask;
char *command; /* PostScript command */
const char *temp; /* Temporary string pointer */
int order, /* Order of command */
@@ -449,54 +424,41 @@ ps_print_internal(const stp_printer_t printer, /* I - Model (Level 1 or 2) */
int order;
} commands[4];
int image_height,
- image_width,
- image_bpp;
- stp_vars_t nv = stp_allocate_copy(v);
-
- if (!stp_get_verified(nv))
+ image_width;
+ stp_vars_t *nv = stp_vars_create_copy(v);
+ if (!resolution)
+ resolution = "";
+ if (!media_size)
+ media_size = "";
+ if (!media_type)
+ media_type = "";
+ if (!media_source)
+ media_source = "";
+
+ stp_prune_inactive_options(nv);
+ if (!stp_verify(nv))
{
stp_eprintf(nv, "Print options not verified; cannot print.\n");
- return;
+ return 0;
}
- /*
- * 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);
+ stp_image_init(image);
/*
* 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);
+ out_width = stp_get_width(v);
+ out_height = stp_get_height(v);
- /*
- * 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...
- */
+ ps_imageable_area(nv, &page_left, &page_right, &page_bottom, &page_top);
+ left -= page_left;
+ top -= page_top;
+ page_width = page_right - page_left;
+ page_height = page_bottom - page_top;
- image->progress_init(image);
+ image_height = stp_image_height(image);
+ image_width = stp_image_width(image);
/*
* Output a standard PostScript header with DSC comments...
@@ -504,15 +466,9 @@ ps_print_internal(const stp_printer_t printer, /* I - Model (Level 1 or 2) */
curtime = time(NULL);
- if (left < 0)
- left = (page_width - out_width) / 2 + page_left;
- else
- left += page_left;
+ left += page_left;
- if (top < 0)
- top = (page_height + out_height) / 2 + page_bottom;
- else
- top = page_height - top + page_bottom;
+ top = page_height - top;
stp_dprintf(STP_DBG_PS, v,
"out_width = %d, out_height = %d\n", out_width, out_height);
@@ -523,15 +479,15 @@ ps_print_internal(const stp_printer_t printer, /* I - Model (Level 1 or 2) */
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);
+ stp_zprintf(v, "%%%%Creator: %s/Gutenprint %s (%s)\n",
+ stp_image_get_appname(image), VERSION, RELEASE_DATE);
#else
- stp_zprintf(v, "%%%%Creator: %s/Gimp-Print\n", image->get_appname(image));
+ stp_zprintf(v, "%%%%Creator: %s/Gutenprint\n", stp_image_get_appname(image));
#endif
stp_zprintf(v, "%%%%CreationDate: %s", ctime(&curtime));
stp_puts("%Copyright: 1997-2002 by Michael Sweet (mike@easysw.com) and Robert Krawitz (rlk@alum.mit.edu)\n", v);
stp_zprintf(v, "%%%%BoundingBox: %d %d %d %d\n",
- left, top - out_height, left + out_width, top);
+ 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);
@@ -652,47 +608,54 @@ ps_print_internal(const stp_printer_t printer, /* I - Model (Level 1 or 2) */
setlocale(LC_ALL, "C");
stp_zprintf(v, "%.3f %.3f scale\n",
- (double)out_width / ((double)image_width),
- (double)out_height / ((double)image_height));
+ (double)out_width / ((double)image_width),
+ (double)out_height / ((double)image_height));
setlocale(LC_ALL, "");
- in = stp_zalloc(image_width * image_bpp);
- out = stp_zalloc((image_width * out_bpp + 3) * 2);
+ stp_channel_reset(nv);
+ stp_channel_add(nv, 0, 0, 1.0);
+ if (strcmp(print_mode, "Color") == 0)
+ {
+ stp_channel_add(nv, 1, 0, 1.0);
+ stp_channel_add(nv, 2, 0, 1.0);
+ stp_set_string_parameter(nv, "STPIOutputType", "RGB");
+ }
+ else
+ stp_set_string_parameter(nv, "STPIOutputType", "Whitescale");
- stp_compute_lut(nv, 256);
+ out_channels = stp_color_init(nv, image, 256);
if (model == 0)
{
- stp_zprintf(v, "/picture %d string def\n", image_width * out_bpp);
+ stp_zprintf(v, "/picture %d string def\n", image_width * out_channels);
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
+ if (strcmp(print_mode, "Color") == 0)
stp_puts("{currentfile picture readhexstring pop} false 3 colorimage\n", v);
+ else
+ stp_puts("{currentfile picture readhexstring pop} image\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);
+ if (stp_color_get_row(nv, image, y, &zero_mask))
+ {
+ status = 2;
+ break;
+ }
- ps_hex(v, out, image_width * out_bpp);
+ out = stp_channel_get_input(nv);
+ ps_hex(v, out, image_width * out_channels);
}
}
else
{
- if (output_type == OUTPUT_GRAY || output_type == OUTPUT_MONOCHROME)
- stp_puts("/DeviceGray setcolorspace\n", v);
- else
+ if (strcmp(print_mode, "Color") == 0)
stp_puts("/DeviceRGB setcolorspace\n", v);
+ else
+ stp_puts("/DeviceGray setcolorspace\n", v);
stp_puts("<<\n", v);
stp_puts("\t/ImageType 1\n", v);
@@ -701,10 +664,10 @@ ps_print_internal(const stp_printer_t printer, /* I - Model (Level 1 or 2) */
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
+ if (strcmp(print_mode, "Color") == 0)
stp_puts("\t/Decode [ 0 1 0 1 0 1 ]\n", v);
+ else
+ stp_puts("\t/Decode [ 0 1 ]\n", v);
stp_puts("\t/DataSource currentfile /ASCII85Decode filter\n", v);
@@ -718,15 +681,15 @@ ps_print_internal(const stp_printer_t printer, /* I - Model (Level 1 or 2) */
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);
+ /* FIXME!!! */
+ if (stp_color_get_row(nv, image, y /*, out + out_offset */ , &zero_mask))
+ {
+ status = 2;
+ break;
+ }
+ out = stp_channel_get_input(nv);
- out_ps_height = out_offset + image_width * out_bpp;
+ out_ps_height = out_offset + image_width * out_channels;
if (y < (image_height - 1))
{
@@ -743,27 +706,24 @@ ps_print_internal(const stp_printer_t printer, /* I - Model (Level 1 or 2) */
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_image_conclude(image);
stp_puts("grestore\n", v);
stp_puts("showpage\n", v);
stp_puts("%%Trailer\n", v);
stp_puts("%%EOF\n", v);
- stp_free_vars(nv);
+ stp_vars_destroy(nv);
+ return status;
}
-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)
+static int
+ps_print(const stp_vars_t *v, stp_image_t *image)
{
+ int status;
setlocale(LC_ALL, "C");
- ps_print_internal(printer, image, v);
+ status = ps_print_internal(v, image);
setlocale(LC_ALL, "");
+ return status;
}
@@ -772,7 +732,7 @@ ps_print(const stp_printer_t printer, /* I - Model (Level 1 or 2) */
*/
static void
-ps_hex(const stp_vars_t v, /* I - File to print to */
+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 */
{
@@ -813,7 +773,7 @@ ps_hex(const stp_vars_t v, /* I - File to print to */
*/
static void
-ps_ascii85(const stp_vars_t v, /* I - File to print to */
+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? */
@@ -975,16 +935,58 @@ ppd_find(const char *ppd_file, /* I - Name of PPD file */
return (NULL);
}
-const stp_printfuncs_t stp_ps_printfuncs =
+static const stp_printfuncs_t print_ps_printfuncs =
{
+ ps_list_parameters,
ps_parameters,
ps_media_size,
ps_imageable_area,
ps_limit,
ps_print,
- ps_default_parameters,
ps_describe_resolution,
+ ps_describe_output,
stp_verify_printer_params,
- stp_start_job,
- stp_end_job
+ NULL,
+ NULL
};
+
+
+static stp_family_t print_ps_module_data =
+ {
+ &print_ps_printfuncs,
+ NULL
+ };
+
+
+static int
+print_ps_module_init(void)
+{
+ return stp_family_register(print_ps_module_data.printer_list);
+}
+
+
+static int
+print_ps_module_exit(void)
+{
+ return stp_family_unregister(print_ps_module_data.printer_list);
+}
+
+
+/* Module header */
+#define stp_module_version print_ps_LTX_stp_module_version
+#define stp_module_data print_ps_LTX_stp_module_data
+
+stp_module_version_t stp_module_version = {0, 0};
+
+stp_module_t stp_module_data =
+ {
+ "ps",
+ VERSION,
+ "Postscript family driver",
+ STP_MODULE_CLASS_FAMILY,
+ NULL,
+ print_ps_module_init,
+ print_ps_module_exit,
+ (void *) &print_ps_module_data
+ };
+
diff --git a/src/main/print-raw.c b/src/main/print-raw.c
new file mode 100644
index 0000000..f6353f3
--- /dev/null
+++ b/src/main/print-raw.c
@@ -0,0 +1,376 @@
+/*
+ * "$Id: print-raw.c,v 1.36 2004/09/17 18:38:26 rleigh Exp $"
+ *
+ * Print plug-in RAW 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 <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <string.h>
+#include <stdio.h>
+
+#ifdef __GNUC__
+#define inline __inline__
+#endif
+
+typedef struct
+{
+ const char *output_type;
+ int output_channels;
+ int rotate_channels;
+ const char *name;
+} ink_t;
+
+typedef struct raw_printer
+{
+ int output_bits;
+} raw_printer_t;
+
+static const raw_printer_t raw_model_capabilities[] =
+{
+ {
+ 16
+ },
+ {
+ 8
+ },
+};
+
+static const ink_t inks[] =
+{
+ { "RGB", 3, 0, "RGB" },
+ { "CMY", 3, 0, "CMY" },
+ { "KCMY", 4, 1, "CMYK" },
+ { "KCMY", 4, 0, "KCMY" },
+ { "Whitescale", 1, 0, "RGBGray" },
+ { "Grayscale", 1, 0, "CMYGray" },
+};
+
+static const int ink_count = sizeof(inks) / sizeof(ink_t);
+
+static const stp_parameter_t the_parameters[] =
+{
+ {
+ "InkType", N_("Ink Type"), N_("Advanced Printer Setup"),
+ N_("Type of ink in the printer"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_FEATURE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+ {
+ "PrintingMode", N_("Printing Mode"), N_("Core Parameter"),
+ N_("Printing Output Mode"),
+ STP_PARAMETER_TYPE_STRING_LIST, STP_PARAMETER_CLASS_CORE,
+ STP_PARAMETER_LEVEL_BASIC, 1, 1, -1, 1, 0
+ },
+};
+
+static const int the_parameter_count =
+sizeof(the_parameters) / sizeof(const stp_parameter_t);
+
+static stp_parameter_list_t
+raw_list_parameters(const stp_vars_t *v)
+{
+ stp_parameter_list_t *ret = stp_parameter_list_create();
+ int i;
+ for (i = 0; i < the_parameter_count; i++)
+ stp_parameter_list_add_param(ret, &(the_parameters[i]));
+ return ret;
+}
+
+static void
+raw_parameters(const stp_vars_t *v, const char *name,
+ stp_parameter_t *description)
+{
+ int i;
+ description->p_type = STP_PARAMETER_TYPE_INVALID;
+ if (name == NULL)
+ return;
+
+ description->deflt.str = NULL;
+ for (i = 0; i < the_parameter_count; i++)
+ if (strcmp(name, the_parameters[i].name) == 0)
+ {
+ stp_fill_parameter_settings(description, &(the_parameters[i]));
+ break;
+ }
+ if (strcmp(name, "InkType") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ for (i = 0; i < ink_count; i++)
+ stp_string_list_add_string(description->bounds.str,
+ inks[i].name, inks[i].name);
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
+ else if (strcmp(name, "PrintingMode") == 0)
+ {
+ description->bounds.str = stp_string_list_create();
+ stp_string_list_add_string
+ (description->bounds.str, "Color", _("Color"));
+ stp_string_list_add_string
+ (description->bounds.str, "BW", _("Black and White"));
+ description->deflt.str =
+ stp_string_list_param(description->bounds.str, 0)->name;
+ }
+ else
+ description->is_active = 0;
+}
+
+/*
+ * 'escp2_imageable_area()' - Return the imageable area of the page.
+ */
+
+static void
+raw_imageable_area(const stp_vars_t *v,
+ int *left,
+ int *right,
+ int *bottom,
+ int *top)
+{
+ *left = 0;
+ *top = 0;
+ *right = stp_get_page_width(v);
+ *bottom = stp_get_page_height(v);
+}
+
+static void
+raw_limit(const stp_vars_t *v, /* I */
+ int *width, int *height,
+ int *min_width, int *min_height)
+{
+ *width = 65535;
+ *height = 65535;
+ *min_width = 1;
+ *min_height = 1;
+}
+
+static void
+raw_describe_resolution(const stp_vars_t *v, int *x, int *y)
+{
+ *x = 72;
+ *y = 72;
+}
+
+static const char *
+raw_describe_output(const stp_vars_t *v)
+{
+ const char *ink_type = stp_get_string_parameter(v, "InkType");
+ if (ink_type)
+ {
+ int i;
+ for (i = 0; i < ink_count; i++)
+ if (strcmp(ink_type, inks[i].name) == 0)
+ return inks[i].output_type;
+ }
+ return "RGB";
+}
+
+/*
+ * 'escp2_print()' - Print an image to an EPSON printer.
+ */
+static int
+raw_print(const stp_vars_t *v, stp_image_t *image)
+{
+ int model = stp_get_model_id(v);
+ int width = stp_get_page_width(v);
+ int height = stp_get_page_height(v);
+ int i, j;
+ int y; /* Looping vars */
+ stp_vars_t *nv = stp_vars_create_copy(v);
+ int out_channels;
+ unsigned short *final_out = NULL;
+ int status = 1;
+ int bytes_per_channel = raw_model_capabilities[model].output_bits / 8;
+ int ink_channels = 1;
+ int rotate_output = 0;
+ const char *ink_type = stp_get_string_parameter(nv, "InkType");
+
+ stp_prune_inactive_options(nv);
+ if (!stp_verify(nv))
+ {
+ stp_eprintf(nv, _("Print options not verified; cannot print.\n"));
+ stp_vars_destroy(nv);
+ return 0;
+ }
+ if (width != stp_image_width(image) || height != stp_image_height(image))
+ {
+ stp_eprintf(nv, _("Image dimensions must match paper dimensions"));
+ stp_vars_destroy(nv);
+ return 0;
+ }
+ if (ink_type)
+ {
+ for (i = 0; i < ink_count; i++)
+ if (strcmp(ink_type, inks[i].name) == 0)
+ {
+ stp_set_string_parameter(nv, "STPIOutputType", inks[i].output_type);
+ ink_channels = inks[i].output_channels;
+ rotate_output = inks[i].rotate_channels;
+ break;
+ }
+ }
+
+ stp_set_float_parameter(nv, "Density", 1.0);
+ stp_channel_reset(nv);
+ for (i = 0; i < ink_channels; i++)
+ stp_channel_add(nv, i, 0, 1.0);
+
+ if (bytes_per_channel == 1)
+ out_channels = stp_color_init(nv, image, 256);
+ else
+ out_channels = stp_color_init(nv, image, 65536);
+
+ if (out_channels != ink_channels && out_channels != 1 && ink_channels != 1)
+ {
+ stp_eprintf(nv, "Internal error! Output channels or input channels must be 1\n");
+ stp_vars_destroy(nv);
+ return 0;
+ }
+
+ if (out_channels != ink_channels)
+ final_out = stp_malloc(width * ink_channels * 2);
+
+ for (y = 0; y < height; y++)
+ {
+ unsigned short *out;
+ unsigned short *real_out;
+ unsigned zero_mask;
+ if (stp_color_get_row(nv, image, y, &zero_mask))
+ {
+ status = 2;
+ break;
+ }
+ out = stp_channel_get_input(nv);
+ real_out = out;
+ if (rotate_output)
+ {
+ unsigned short *tmp_out = real_out;
+ for (i = 0; i < width; i++)
+ {
+ unsigned short tmp = tmp_out[0];
+ for (j = 0; j < ink_channels - 1; j++)
+ tmp_out[j] = tmp_out[j + 1];
+ tmp_out[ink_channels - 1] = tmp;
+ tmp_out += ink_channels;
+ }
+ }
+ if (out_channels != ink_channels)
+ {
+ real_out = final_out;
+ if (out_channels < ink_channels)
+ {
+ for (i = 0; i < width; i++)
+ {
+ for (j = 0; j < ink_channels; j++)
+ final_out[i * ink_channels + j] = out[i];
+ }
+ }
+ else
+ {
+ for (i = 0; i < width; i++)
+ {
+ int avg = 0;
+ for (j = 0; j < out_channels; j++)
+ avg += out[i * out_channels + j];
+ final_out[i] = avg / out_channels;
+ }
+ }
+ }
+ if (bytes_per_channel == 1)
+ {
+ unsigned char *char_out = (unsigned char *) real_out;
+ for (i = 0; i < width * ink_channels; i++)
+ char_out[i] = real_out[i] / 257;
+ }
+ stp_zfwrite((char *) real_out,
+ width * ink_channels * bytes_per_channel, 1, nv);
+ }
+ stp_image_conclude(image);
+ if (final_out)
+ stp_free(final_out);
+ stp_vars_destroy(nv);
+ return status;
+}
+
+static const stp_printfuncs_t print_raw_printfuncs =
+{
+ raw_list_parameters,
+ raw_parameters,
+ stp_default_media_size,
+ raw_imageable_area,
+ raw_limit,
+ raw_print,
+ raw_describe_resolution,
+ raw_describe_output,
+ stp_verify_printer_params,
+ NULL,
+ NULL
+};
+
+
+
+
+static stp_family_t print_raw_module_data =
+ {
+ &print_raw_printfuncs,
+ NULL
+ };
+
+
+static int
+print_raw_module_init(void)
+{
+ return stp_family_register(print_raw_module_data.printer_list);
+}
+
+
+static int
+print_raw_module_exit(void)
+{
+ return stp_family_unregister(print_raw_module_data.printer_list);
+}
+
+
+/* Module header */
+#define stp_module_version print_raw_LTX_stp_module_version
+#define stp_module_data print_raw_LTX_stp_module_data
+
+stp_module_version_t stp_module_version = {0, 0};
+
+stp_module_t stp_module_data =
+ {
+ "raw",
+ VERSION,
+ "RAW family driver",
+ STP_MODULE_CLASS_FAMILY,
+ NULL,
+ print_raw_module_init,
+ print_raw_module_exit,
+ (void *) &print_raw_module_data
+ };
diff --git a/src/main/print-util.c b/src/main/print-util.c
index 268b526..1138781 100644
--- a/src/main/print-util.c
+++ b/src/main/print-util.c
@@ -1,5 +1,5 @@
/*
- * "$Id: print-util.c,v 1.53.2.21 2004/02/16 21:08:33 rlk Exp $"
+ * "$Id: print-util.c,v 1.108 2004/09/17 18:38:26 rleigh Exp $"
*
* Print plug-in driver utility functions for the GIMP.
*
@@ -29,9 +29,9 @@
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#include <gimp-print/gimp-print.h>
-#include "gimp-print-internal.h"
-#include <gimp-print/gimp-print-intl-internal.h>
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
#include <math.h>
#include <limits.h>
#if defined(HAVE_VARARGS_H) && !defined(HAVE_STDARG_H)
@@ -42,1535 +42,244 @@
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include "generic-options.h"
#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 */
- int page_number;
- stp_job_mode_t job_mode;
- 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 */
- 0, /* Page number */
- STP_JOB_MODE_PAGE /* Job mode */
-};
-
-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 */
- 0, /* Page number */
- STP_JOB_MODE_PAGE /* Job mode */
-};
-
-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 */
- INT_MAX, /* Page number */
- STP_JOB_MODE_JOB /* Job mode */
-};
-
-stp_vars_t
-stp_allocate_vars(void)
-{
- void *retval = stp_zalloc(sizeof(stp_internal_vars_t));
- stp_copy_vars(retval, (stp_vars_t)&default_vars);
- return (retval);
-}
+ stp_outfunc_t ofunc;
+ void *odata;
+ char *data;
+ size_t bytes;
+} debug_msgbuf_t;
-#define SAFE_FREE(x) \
-do \
-{ \
- if ((x)) \
- stp_free((char *)(x)); \
- ((x)) = NULL; \
-} while (0)
+/*
+ * We cannot avoid use of the (non-ANSI) vsnprintf here; ANSI does
+ * not provide a safe, length-limited sprintf function.
+ */
-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;
- }
+#define STPI_VASPRINTF(result, bytes, format) \
+{ \
+ int current_allocation = 64; \
+ result = stp_malloc(current_allocation); \
+ while (1) \
+ { \
+ va_list args; \
+ va_start(args, format); \
+ bytes = vsnprintf(result, current_allocation, format, args); \
+ va_end(args); \
+ if (bytes >= 0 && bytes < current_allocation) \
+ break; \
+ else \
+ { \
+ stp_free (result); \
+ if (bytes < 0) \
+ current_allocation *= 2; \
+ else \
+ current_allocation = bytes + 1; \
+ result = stp_malloc(current_allocation); \
+ } \
+ } \
}
-static char *
-c_strndup(const char *s, int n)
+void
+stp_zprintf(const stp_vars_t *v, const char *format, ...)
{
- 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;
- }
+ char *result;
+ int bytes;
+ STPI_VASPRINTF(result, bytes, format);
+ (stp_get_outfunc(v))((void *)(stp_get_outdata(v)), result, bytes);
+ stp_free(result);
}
void
-stp_free_vars(stp_vars_t vv)
+stp_asprintf(char **strp, const char *format, ...)
{
- 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; \
+ char *result;
+ int bytes;
+ STPI_VASPRINTF(result, bytes, format);
+ *strp = result;
}
-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(page_number, int)
-DEF_FUNCS(job_mode, stp_job_mode_t)
-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_catprintf(char **strp, const char *format, ...)
{
- stp_internal_vars_t *v = (stp_internal_vars_t *) vv;
- v->verified = val;
+ char *result1;
+ char *result2;
+ int bytes;
+ STPI_VASPRINTF(result1, bytes, format);
+ stp_asprintf(&result2, "%s%s", *strp, result1);
+ stp_free(result1);
+ *strp = result2;
}
-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)
+stp_zfwrite(const char *buf, size_t bytes, size_t nitems, const stp_vars_t *v)
{
- 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;
- }
- }
+ (stp_get_outfunc(v))((void *)(stp_get_outdata(v)), buf, bytes * nitems);
}
void
-stp_copy_vars(stp_vars_t vd, const stp_vars_t vs)
+stp_putc(int ch, const stp_vars_t *v)
{
- 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));
+ unsigned char a = (unsigned char) ch;
+ (stp_get_outfunc(v))((void *)(stp_get_outdata(v)), (char *) &a, 1);
}
-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)
+#define BYTE(expr, byteno) (((expr) >> (8 * byteno)) & 0xff)
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 },
- { "EngineeringC", N_ ("Engineering C 17x22"),
- 1224, 1584, 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 */
- { "w1584h2160", N_ ("22x30"),
- 1584, 2160, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, /* Common watercolor paper */
- { "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 */
- { "SuperA0", N_ ("Super A0"),
- 2590, 3662, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 914mm x 1292mm */
- { "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 */
-
- { "SuperB0", N_ ("Super B0 JIS"),
- 3167, 4478, 0, 0, 0, 0, PAPERSIZE_METRIC },
- { "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 },
- { "ARCHA_trans", N_ ("ArchA Transverse"),
- 864, 648, 0, 0, 0, 0, PAPERSIZE_ENGLISH },
- { "ARCHB", N_ ("ArchB"),
- 864, 1296, 0, 0, 0, 0, PAPERSIZE_ENGLISH },
- { "ARCHB_trans", N_ ("ArchB Transverse"),
- 1296, 864, 0, 0, 0, 0, PAPERSIZE_ENGLISH },
- { "ARCHC", N_ ("ArchC"),
- 1296, 1728, 0, 0, 0, 0, PAPERSIZE_ENGLISH },
- { "ARCHC_trans", N_ ("ArchC Transverse"),
- 1728, 1296, 0, 0, 0, 0, PAPERSIZE_ENGLISH },
- { "ARCHD", N_ ("ArchD"),
- 1728, 2592, 0, 0, 0, 0, PAPERSIZE_ENGLISH },
- { "ARCHD_trans", N_ ("ArchD Transverse"),
- 2592, 1728, 0, 0, 0, 0, PAPERSIZE_ENGLISH },
- { "ARCHE", N_ ("ArchE"),
- 2592, 3456, 0, 0, 0, 0, PAPERSIZE_ENGLISH },
- { "ARCHE_trans", N_ ("ArchE Transverse"),
- 3456, 2592, 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 */
- { "w283h425", N_ ("10cm x 15cm"),
- 283, 425, 0, 0, 0, 0, PAPERSIZE_METRIC }, /* 100 x 150 mm */
- { "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 */
- { "Monarch", N_ ("Monarch Envelope"),
- 279, 540, 0, 0, 0, 0, PAPERSIZE_ENGLISH }, /* Monarch envelope (3.875 * 7.5) */
- { "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)
+stp_put16_le(unsigned short sh, const stp_vars_t *v)
{
- 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;
- if (!name)
- return NULL;
- 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]);
- if (!name)
- return NULL;
- 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;
+ stp_putc(BYTE(sh, 0), v);
+ stp_putc(BYTE(sh, 1), v);
}
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;
- if (!long_name)
- return NULL;
- 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;
- if (!driver)
- return NULL;
- 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]);
- if (!driver)
- return -1;
- 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)
+stp_put16_be(unsigned short sh, const stp_vars_t *v)
{
- return stp_dither_algorithm_name(0);
+ stp_putc(BYTE(sh, 1), v);
+ stp_putc(BYTE(sh, 0), v);
}
-int
-stp_start_job(const stp_printer_t printer,
- stp_image_t *image, const stp_vars_t v)
+void
+stp_put32_le(unsigned int in, const stp_vars_t *v)
{
- if (!stp_get_verified(v))
- return 0;
- if (stp_get_job_mode(v) == STP_JOB_MODE_JOB)
- return 1;
- else
- return 0;
+ stp_putc(BYTE(in, 0), v);
+ stp_putc(BYTE(in, 1), v);
+ stp_putc(BYTE(in, 2), v);
+ stp_putc(BYTE(in, 3), v);
}
-int
-stp_end_job(const stp_printer_t printer,
- stp_image_t *image, const stp_vars_t v)
+void
+stp_put32_be(unsigned int in, const stp_vars_t *v)
{
- if (!stp_get_verified(v))
- return 0;
- if (stp_get_job_mode(v) == STP_JOB_MODE_JOB)
- return 1;
- else
- return 0;
+ stp_putc(BYTE(in, 3), v);
+ stp_putc(BYTE(in, 2), v);
+ stp_putc(BYTE(in, 1), v);
+ stp_putc(BYTE(in, 0), v);
}
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 */
+stp_puts(const char *s, const stp_vars_t *v)
{
- *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;
+ (stp_get_outfunc(v))((void *)(stp_get_outdata(v)), s, strlen(s));
}
void
-stp_set_printer_defaults(stp_vars_t v, const stp_printer_t p,
- const char *ppd_file)
+stp_send_command(const stp_vars_t *v, const char *command,
+ const char *format, ...)
{
- 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));
-}
+ int i = 0;
+ char fchar;
+ const char *out_str;
+ unsigned short byte_count = 0;
+ va_list args;
-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)
+ if (strlen(format) > 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 parameter of type %s\n"),
- checkval, what);
- for (i = 0; i < count; i++)
+ va_start(args, format);
+ for (i = 0; i < strlen(format); i++)
{
- stp_free((void *)vptr[i].name);
- stp_free((void *)vptr[i].text);
+ switch (format[i])
+ {
+ case 'a':
+ case 'b':
+ case 'B':
+ case 'd':
+ case 'D':
+ break;
+ case 'c':
+ (void) va_arg(args, unsigned int);
+ byte_count += 1;
+ break;
+ case 'h':
+ case 'H':
+ (void) va_arg(args, unsigned int);
+ byte_count += 2;
+ break;
+ case 'l':
+ case 'L':
+ (void) va_arg(args, unsigned int);
+ byte_count += 4;
+ break;
+ case 's':
+ out_str = va_arg(args, const char *);
+ byte_count += strlen(out_str);
+ break;
+ }
}
+ va_end(args);
}
- else
- stp_eprintf(v, _("%s is not a valid parameter of type %s\n"),
- checkval, what);
- if (vptr)
- free(vptr);
- return answer;
-}
-
-#define CHECK_FLOAT_RANGE(v, component) \
-do \
-{ \
- const stp_vars_t max = stp_maximum_settings(); \
- const stp_vars_t min = stp_minimum_settings(); \
- if (stp_get_##component((v)) < stp_get_##component(min) || \
- stp_get_##component((v)) > stp_get_##component(max)) \
- { \
- answer = 0; \
- stp_eprintf(v, _("%s out of range (value %f, min %f, max %f)\n"), \
- #component, stp_get_##component(v), \
- stp_get_##component(min), stp_get_##component(max)); \
- } \
-} while (0)
-#define CHECK_INT_RANGE(v, component) \
-do \
-{ \
- const stp_vars_t max = stp_maximum_settings(); \
- const stp_vars_t min = stp_minimum_settings(); \
- if (stp_get_##component((v)) < stp_get_##component(min) || \
- stp_get_##component((v)) > stp_get_##component(max)) \
- { \
- answer = 0; \
- stp_eprintf(v, _("%s out of range (value %d, min %d, max %d)\n"), \
- #component, stp_get_##component(v), \
- stp_get_##component(min), stp_get_##component(max)); \
- } \
-} while (0)
-
-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);
+ stp_puts(command, 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
+ va_start(args, format);
+ while ((fchar = format[0]) != '\0')
{
- 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)
+ switch (fchar)
{
- answer = 0;
- stp_eprintf(v, _("Image size is not valid\n"));
+ case 'a':
+ stp_putc(byte_count, v);
+ break;
+ case 'b':
+ stp_put16_le(byte_count, v);
+ break;
+ case 'B':
+ stp_put16_be(byte_count, v);
+ break;
+ case 'd':
+ stp_put32_le(byte_count, v);
+ break;
+ case 'D':
+ stp_put32_be(byte_count, v);
+ break;
+ case 'c':
+ stp_putc(va_arg(args, unsigned int), v);
+ break;
+ case 'h':
+ stp_put16_le(va_arg(args, unsigned int), v);
+ break;
+ case 'H':
+ stp_put16_be(va_arg(args, unsigned int), v);
+ break;
+ case 'l':
+ stp_put32_le(va_arg(args, unsigned int), v);
+ break;
+ case 'L':
+ stp_put32_be(va_arg(args, unsigned int), v);
+ break;
+ case 's':
+ stp_puts(va_arg(args, const char *), v);
+ break;
}
+ format++;
}
-
- if (stp_get_top(v) < 0)
- {
- answer = 0;
- stp_eprintf(v, _("Top margin must not be less than zero\n"));
- }
-
- if (stp_get_left(v) < 0)
- {
- answer = 0;
- stp_eprintf(v, _("Left margin must not be less than zero\n"));
- }
-
- CHECK_FLOAT_RANGE(v, gamma);
- CHECK_FLOAT_RANGE(v, contrast);
- CHECK_FLOAT_RANGE(v, cyan);
- CHECK_FLOAT_RANGE(v, magenta);
- CHECK_FLOAT_RANGE(v, yellow);
- CHECK_FLOAT_RANGE(v, brightness);
- CHECK_FLOAT_RANGE(v, density);
- CHECK_FLOAT_RANGE(v, saturation);
- if (stp_get_scaling(v) > 0)
- {
- CHECK_FLOAT_RANGE(v, scaling);
- }
-
- CHECK_INT_RANGE(v, image_type);
- CHECK_INT_RANGE(v, unit);
- CHECK_INT_RANGE(v, output_type);
- CHECK_INT_RANGE(v, input_color_model);
- CHECK_INT_RANGE(v, output_color_model);
-
- 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;
-}
-
-/*
- * We cannot avoid use of the (non-ANSI) vsnprintf here; ANSI does
- * not provide a safe, length-limited sprintf function.
- */
-
-#define STP_VASPRINTF(result, bytes, format) \
-{ \
- int current_allocation = 64; \
- result = stp_malloc(current_allocation); \
- while (1) \
- { \
- va_list args; \
- va_start(args, format); \
- bytes = vsnprintf(result, current_allocation, format, args); \
- va_end(args); \
- if (bytes >= 0 && bytes < current_allocation) \
- break; \
- else \
- { \
- free (result); \
- if (bytes < 0) \
- current_allocation *= 2; \
- else \
- current_allocation = bytes + 1; \
- result = stp_malloc(current_allocation); \
- } \
- } \
-}
-
-void
-stp_zprintf(const stp_vars_t v, const char *format, ...)
-{
- char *result;
- int bytes;
- STP_VASPRINTF(result, bytes, format);
- (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));
+ va_end(args);
}
void
-stp_eprintf(const stp_vars_t v, const char *format, ...)
+stp_eprintf(const stp_vars_t *v, const char *format, ...)
{
int bytes;
if (stp_get_errfunc(v))
{
char *result;
- STP_VASPRINTF(result, bytes, format);
+ STPI_VASPRINTF(result, bytes, format);
(stp_get_errfunc(v))((void *)(stp_get_errdata(v)), result, bytes);
- free(result);
+ stp_free(result);
+ }
+ else
+ {
+ va_list args;
+ va_start(args, format);
+ vfprintf(stderr, format, args);
+ va_end(args);
}
}
@@ -1589,10 +298,10 @@ stp_erprintf(const char *format, ...)
va_end(args);
}
-unsigned long stp_debug_level = 0;
+static unsigned long stpi_debug_level = 0;
static void
-stp_init_debug(void)
+stpi_init_debug(void)
{
static int debug_initialized = 0;
if (!debug_initialized)
@@ -1601,23 +310,30 @@ stp_init_debug(void)
debug_initialized = 1;
if (dval)
{
- stp_debug_level = strtoul(dval, 0, 0);
- stp_erprintf("Gimp-Print %s %s\n", VERSION, RELEASE_DATE);
+ stpi_debug_level = strtoul(dval, 0, 0);
+ stp_erprintf("Gutenprint %s %s\n", VERSION, RELEASE_DATE);
}
}
}
+unsigned long
+stp_get_debug_level(void)
+{
+ stpi_init_debug();
+ return stpi_debug_level;
+}
+
void
-stp_dprintf(unsigned long level, const stp_vars_t v, const char *format, ...)
+stp_dprintf(unsigned long level, const stp_vars_t *v, const char *format, ...)
{
int bytes;
- stp_init_debug();
- if ((level & stp_debug_level) && stp_get_errfunc(v))
+ stpi_init_debug();
+ if ((level & stpi_debug_level) && stp_get_errfunc(v))
{
char *result;
- STP_VASPRINTF(result, bytes, format);
+ STPI_VASPRINTF(result, bytes, format);
(stp_get_errfunc(v))((void *)(stp_get_errdata(v)), result, bytes);
- free(result);
+ stp_free(result);
}
}
@@ -1626,21 +342,70 @@ stp_deprintf(unsigned long level, const char *format, ...)
{
va_list args;
va_start(args, format);
- stp_init_debug();
- if (level & stp_debug_level)
+ stpi_init_debug();
+ if (level & stpi_debug_level)
vfprintf(stderr, format, args);
va_end(args);
}
+static void
+fill_buffer_writefunc(void *priv, const char *buffer, size_t bytes)
+{
+ debug_msgbuf_t *msgbuf = (debug_msgbuf_t *) priv;
+ if (msgbuf->bytes == 0)
+ msgbuf->data = stp_malloc(bytes + 1);
+ else
+ msgbuf->data = stp_realloc(msgbuf->data, msgbuf->bytes + bytes + 1);
+ memcpy(msgbuf->data + msgbuf->bytes, buffer, bytes);
+ msgbuf->bytes += bytes;
+ msgbuf->data[msgbuf->bytes] = '\0';
+}
+
+void
+stp_init_debug_messages(stp_vars_t *v)
+{
+ int verified_flag = stp_get_verified(v);
+ debug_msgbuf_t *msgbuf = stp_malloc(sizeof(debug_msgbuf_t));
+ msgbuf->ofunc = stp_get_errfunc(v);
+ msgbuf->odata = stp_get_errdata(v);
+ msgbuf->data = NULL;
+ msgbuf->bytes = 0;
+ stp_set_errfunc((stp_vars_t *) v, fill_buffer_writefunc);
+ stp_set_errdata((stp_vars_t *) v, msgbuf);
+ stp_set_verified((stp_vars_t *) v, verified_flag);
+}
+
+void
+stp_flush_debug_messages(stp_vars_t *v)
+{
+ int verified_flag = stp_get_verified(v);
+ debug_msgbuf_t *msgbuf = (debug_msgbuf_t *)stp_get_errdata(v);
+ stp_set_errfunc((stp_vars_t *) v, msgbuf->ofunc);
+ stp_set_errdata((stp_vars_t *) v, msgbuf->odata);
+ stp_set_verified((stp_vars_t *) v, verified_flag);
+ if (msgbuf->bytes > 0)
+ {
+ stp_eprintf(v, "%s", msgbuf->data);
+ stp_free(msgbuf->data);
+ }
+ stp_free(msgbuf);
+}
+
+/* pointers to the allocation functions to use, which may be set by
+ client applications */
+void *(*stp_malloc_func)(size_t size) = malloc;
+void *(*stpi_realloc_func)(void *ptr, size_t size) = realloc;
+void (*stpi_free_func)(void *ptr) = free;
+
void *
stp_malloc (size_t size)
{
register void *memptr = NULL;
- if ((memptr = malloc (size)) == NULL)
+ if ((memptr = stp_malloc_func (size)) == NULL)
{
fputs("Virtual memory exhausted.\n", stderr);
- exit (EXIT_FAILURE);
+ stp_abort();
}
return (memptr);
}
@@ -1658,10 +423,10 @@ stp_realloc (void *ptr, size_t size)
{
register void *memptr = NULL;
- if (size > 0 && ((memptr = realloc (ptr, size)) == NULL))
+ if (size > 0 && ((memptr = stpi_realloc_func (ptr, size)) == NULL))
{
fputs("Virtual memory exhausted.\n", stderr);
- exit (EXIT_FAILURE);
+ stp_abort();
}
return (memptr);
}
@@ -1669,14 +434,14 @@ stp_realloc (void *ptr, size_t size)
void
stp_free(void *ptr)
{
- free(ptr);
+ stpi_free_func(ptr);
}
int
stp_init(void)
{
- static int stp_is_initialised = 0;
- if (!stp_is_initialised)
+ static int stpi_is_initialised = 0;
+ if (!stpi_is_initialised)
{
/* Things that are only initialised once */
/* Set up gettext */
@@ -1684,37 +449,182 @@ stp_init(void)
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, PACKAGE_LOCALE_DIR);
#endif
- stp_init_debug();
+ stpi_init_debug();
+ stp_xml_preinit();
+ stpi_init_printer();
+ stpi_init_paper();
+ stpi_init_dither();
+ /* Load modules */
+ if (stp_module_load())
+ return 1;
+ /* Load XML data */
+ if (stp_xml_init_defaults())
+ return 1;
+ /* Initialise modules */
+ if (stp_module_init())
+ return 1;
+ /* Set up defaults for core parameters */
+ stp_initialize_printer_defaults();
+ }
+
+ stpi_is_initialised = 1;
+ return 0;
+}
+
+size_t
+stp_strlen(const char *s)
+{
+ return strlen(s);
+}
+
+char *
+stp_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);
+ memcpy(ret, s, n);
+ ret[n] = 0;
+ return ret;
}
- 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;
+char *
+stp_strdup(const char *s)
+{
+ char *ret;
+ if (!s)
+ {
+ ret = stp_malloc(1);
+ ret[0] = '\0';
+ return ret;
+ }
+ else
+ return stp_strndup(s, stp_strlen(s));
+}
-void print_timers(const stp_vars_t v)
+const char *
+stp_set_output_codeset(const char *codeset)
{
- int i;
+#ifdef ENABLE_NLS
+ return (const char *)(bind_textdomain_codeset(PACKAGE, codeset));
+#else
+ return "US-ASCII";
+#endif
+}
- stp_eprintf(v, "%s", "Quantify timers:\n");
- for (i = 0; i <= quantify_high_index; i++)
+stp_curve_t *
+stp_read_and_compose_curves(const char *s1, const char *s2,
+ stp_curve_compose_t comp,
+ size_t piecewise_point_count)
+{
+ stp_curve_t *ret = NULL;
+ stp_curve_t *t1 = NULL;
+ stp_curve_t *t2 = NULL;
+ if (s1)
+ t1 = stp_curve_create_from_string(s1);
+ if (s2)
+ t2 = stp_curve_create_from_string(s2);
+ if (t1 && t2)
{
- if (quantify_counts[i] > 0)
+ if (stp_curve_is_piecewise(t1) && stp_curve_is_piecewise(t2))
{
- 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;
+ stp_curve_resample(t1, piecewise_point_count);
+ stp_curve_resample(t2, piecewise_point_count);
}
+ stp_curve_compose(&ret, t1, t2, comp, -1);
}
+ if (ret)
+ {
+ stp_curve_destroy(t1);
+ stp_curve_destroy(t2);
+ return ret;
+ }
+ else if (t1)
+ {
+ stp_curve_destroy(t2);
+ return t1;
+ }
+ else
+ return t2;
+}
+
+void
+stp_merge_printvars(stp_vars_t *user, const stp_vars_t *print)
+{
+ int i;
+ stp_parameter_list_t params = stp_get_parameter_list(print);
+ int count = stp_parameter_list_count(params);
+ for (i = 0; i < count; i++)
+ {
+ const stp_parameter_t *p = stp_parameter_list_param(params, i);
+ if (p->p_type == STP_PARAMETER_TYPE_DOUBLE &&
+ p->p_class == STP_PARAMETER_CLASS_OUTPUT &&
+ stp_check_float_parameter(print, p->name, STP_PARAMETER_DEFAULTED))
+ {
+ stp_parameter_t desc;
+ double prnval = stp_get_float_parameter(print, p->name);
+ double usrval;
+ stp_describe_parameter(print, p->name, &desc);
+ if (stp_check_float_parameter(user, p->name, STP_PARAMETER_ACTIVE))
+ usrval = stp_get_float_parameter(user, p->name);
+ else
+ usrval = desc.deflt.dbl;
+ if (strcmp(p->name, "Gamma") == 0)
+ usrval /= prnval;
+ else
+ usrval *= prnval;
+ if (usrval < desc.bounds.dbl.lower)
+ usrval = desc.bounds.dbl.lower;
+ else if (usrval > desc.bounds.dbl.upper)
+ usrval = desc.bounds.dbl.upper;
+ if (!stp_check_float_parameter(user, p->name, STP_PARAMETER_ACTIVE))
+ {
+ stp_clear_float_parameter(user, p->name);
+ stp_set_default_float_parameter(user, p->name, usrval);
+ }
+ else
+ stp_set_float_parameter(user, p->name, usrval);
+ stp_parameter_description_destroy(&desc);
+ }
+ }
+ stp_parameter_list_destroy(params);
+}
+
+stp_parameter_list_t
+stp_get_parameter_list(const stp_vars_t *v)
+{
+ stp_parameter_list_t ret = stp_parameter_list_create();
+ stp_parameter_list_t tmp_list;
+
+ tmp_list = stp_printer_list_parameters(v);
+ stp_parameter_list_append(ret, tmp_list);
+ stp_parameter_list_destroy(tmp_list);
+
+ tmp_list = stp_color_list_parameters(v);
+ stp_parameter_list_append(ret, tmp_list);
+ stp_parameter_list_destroy(tmp_list);
+
+ tmp_list = stp_dither_list_parameters(v);
+ stp_parameter_list_append(ret, tmp_list);
+ stp_parameter_list_destroy(tmp_list);
+
+ tmp_list = stp_list_generic_parameters(v);
+ stp_parameter_list_append(ret, tmp_list);
+ stp_parameter_list_destroy(tmp_list);
+
+ return ret;
+}
+
+void
+stp_abort(void)
+{
+ abort();
}
-#endif
diff --git a/src/main/print-vars.c b/src/main/print-vars.c
new file mode 100644
index 0000000..8b480de
--- /dev/null
+++ b/src/main/print-vars.c
@@ -0,0 +1,1481 @@
+/*
+ * "$Id: print-vars.c,v 1.73 2004/09/17 18:38:26 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, gtk, etc.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <math.h>
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#include <string.h>
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include "generic-options.h"
+
+typedef struct
+{
+ char *name;
+ stp_parameter_type_t typ;
+ stp_parameter_activity_t active;
+ union
+ {
+ int ival;
+ int bval;
+ double dval;
+ stp_curve_t *cval;
+ stp_array_t *aval;
+ stp_raw_t rval;
+ } value;
+} value_t;
+
+struct stp_compdata
+{
+ char *name;
+ stp_copy_data_func_t copyfunc;
+ stp_free_data_func_t freefunc;
+ void *data;
+};
+
+struct stp_vars /* Plug-in variables */
+{
+ char *driver; /* Name of printer "driver" */
+ char *color_conversion; /* Color module in use */
+ int left; /* Offset from left-upper corner, points */
+ int top; /* ... */
+ int width; /* Width of the image, points */
+ int height; /* ... */
+ int page_width; /* Width of page in points */
+ int page_height; /* Height of page in points */
+ stp_list_t *params[STP_PARAMETER_TYPE_INVALID];
+ stp_list_t *internal_data;
+ void (*outfunc)(void *data, const char *buffer, size_t bytes);
+ void *outdata;
+ void (*errfunc)(void *data, const char *buffer, size_t bytes);
+ void *errdata;
+ int verified; /* Ensure that params are OK! */
+};
+
+static int standard_vars_initialized = 0;
+
+static stp_vars_t default_vars;
+
+static void
+null_vars(void)
+{
+ stp_erprintf("Null stp_vars_t! Please report this bug.\n");
+ stp_abort();
+}
+
+static inline void
+check_vars(const stp_vars_t *v)
+{
+ if (v == NULL)
+ null_vars();
+}
+
+static const char *
+value_namefunc(const void *item)
+{
+ const value_t *v = (const value_t *) (item);
+ return v->name;
+}
+
+static void
+value_freefunc(void *item)
+{
+ value_t *v = (value_t *) (item);
+ switch (v->typ)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ case STP_PARAMETER_TYPE_FILE:
+ case STP_PARAMETER_TYPE_RAW:
+ stp_free((void *) v->value.rval.data);
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ if (v->value.cval)
+ stp_curve_destroy(v->value.cval);
+ break;
+ case STP_PARAMETER_TYPE_ARRAY:
+ stp_array_destroy(v->value.aval);
+ break;
+ default:
+ break;
+ }
+ stp_free(v->name);
+ stp_free(v);
+}
+
+static stp_list_t *
+create_vars_list(void)
+{
+ stp_list_t *ret = stp_list_create();
+ stp_list_set_freefunc(ret, value_freefunc);
+ stp_list_set_namefunc(ret, value_namefunc);
+ return ret;
+}
+
+static void
+copy_to_raw(stp_raw_t *raw, const void *data, size_t bytes)
+{
+ char *ndata = stp_malloc(bytes + 1);
+ memcpy(ndata, data, bytes);
+ ndata[bytes] = '\0';
+ raw->data = (void *) ndata;
+ raw->bytes = bytes;
+}
+
+static value_t *
+value_copy(const void *item)
+{
+ value_t *ret = stp_malloc(sizeof(value_t));
+ const value_t *v = (const value_t *) (item);
+ ret->name = stp_strdup(v->name);
+ ret->typ = v->typ;
+ ret->active = v->active;
+ switch (v->typ)
+ {
+ case STP_PARAMETER_TYPE_CURVE:
+ ret->value.cval = stp_curve_create_copy(v->value.cval);
+ break;
+ case STP_PARAMETER_TYPE_ARRAY:
+ ret->value.aval = stp_array_create_copy(v->value.aval);
+ break;
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ case STP_PARAMETER_TYPE_FILE:
+ case STP_PARAMETER_TYPE_RAW:
+ copy_to_raw(&(ret->value.rval), v->value.rval.data, v->value.rval.bytes);
+ break;
+ case STP_PARAMETER_TYPE_INT:
+ case STP_PARAMETER_TYPE_DIMENSION:
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ ret->value.ival = v->value.ival;
+ break;
+ case STP_PARAMETER_TYPE_DOUBLE:
+ ret->value.dval = v->value.dval;
+ break;
+ default:
+ break;
+ }
+ return ret;
+}
+
+static stp_list_t *
+copy_value_list(const stp_list_t *src)
+{
+ stp_list_t *ret = create_vars_list();
+ const stp_list_item_t *item = stp_list_get_start((const stp_list_t *)src);
+ while (item)
+ {
+ stp_list_item_create(ret, NULL, value_copy(stp_list_item_get_data(item)));
+ item = stp_list_item_next(item);
+ }
+ return ret;
+}
+
+static const char *
+compdata_namefunc(const void *item)
+{
+ const compdata_t *cd = (const compdata_t *) (item);
+ return cd->name;
+}
+
+static void
+compdata_freefunc(void *item)
+{
+ compdata_t *cd = (compdata_t *) (item);
+ if (cd->freefunc)
+ (cd->freefunc)(cd->data);
+ stp_free(cd->name);
+ stp_free(cd);
+}
+
+static void *
+compdata_copyfunc(const void *item)
+{
+ const compdata_t *cd = (const compdata_t *) (item);
+ if (cd->copyfunc)
+ return (cd->copyfunc)(cd->data);
+ else
+ return cd->data;
+}
+
+void
+stp_allocate_component_data(stp_vars_t *v,
+ const char *name,
+ stp_copy_data_func_t copyfunc,
+ stp_free_data_func_t freefunc,
+ void *data)
+{
+ compdata_t *cd;
+ stp_list_item_t *item;
+ check_vars(v);
+ cd = stp_malloc(sizeof(compdata_t));
+ item = stp_list_get_item_by_name(v->internal_data, name);
+ if (item)
+ stp_list_item_destroy(v->internal_data, item);
+ cd->name = stp_strdup(name);
+ cd->copyfunc = copyfunc;
+ cd->freefunc = freefunc;
+ cd->data = data;
+ stp_list_item_create(v->internal_data, NULL, cd);
+}
+
+void
+stp_destroy_component_data(stp_vars_t *v, const char *name)
+{
+ stp_list_item_t *item;
+ check_vars(v);
+ item = stp_list_get_item_by_name(v->internal_data, name);
+ if (item)
+ stp_list_item_destroy(v->internal_data, item);
+}
+
+void *
+stp_get_component_data(const stp_vars_t *v, const char *name)
+{
+ stp_list_item_t *item;
+ check_vars(v);
+ item = stp_list_get_item_by_name(v->internal_data, name);
+ if (item)
+ return ((compdata_t *) stp_list_item_get_data(item))->data;
+ else
+ return NULL;
+}
+
+static stp_list_t *
+create_compdata_list(void)
+{
+ stp_list_t *ret = stp_list_create();
+ stp_list_set_freefunc(ret, compdata_freefunc);
+ stp_list_set_namefunc(ret, compdata_namefunc);
+ return ret;
+}
+
+static stp_list_t *
+copy_compdata_list(const stp_list_t *src)
+{
+ stp_list_t *ret = create_compdata_list();
+ const stp_list_item_t *item = stp_list_get_start(src);
+ while (item)
+ {
+ stp_list_item_create(ret, NULL, compdata_copyfunc(item));
+ item = stp_list_item_next(item);
+ }
+ return ret;
+}
+
+static void
+initialize_standard_vars(void)
+{
+ if (!standard_vars_initialized)
+ {
+ int i;
+ for (i = 0; i < STP_PARAMETER_TYPE_INVALID; i++)
+ default_vars.params[i] = create_vars_list();
+ default_vars.driver = stp_strdup("ps2");
+ default_vars.color_conversion = stp_strdup("traditional");
+ default_vars.internal_data = create_compdata_list();
+ standard_vars_initialized = 1;
+ }
+}
+
+const stp_vars_t *
+stp_default_settings(void)
+{
+ initialize_standard_vars();
+ return (stp_vars_t *) &default_vars;
+}
+
+stp_vars_t *
+stp_vars_create(void)
+{
+ int i;
+ stp_vars_t *retval = stp_zalloc(sizeof(stp_vars_t));
+ initialize_standard_vars();
+ for (i = 0; i < STP_PARAMETER_TYPE_INVALID; i++)
+ retval->params[i] = create_vars_list();
+ retval->internal_data = create_compdata_list();
+ stp_vars_copy(retval, (stp_vars_t *)&default_vars);
+ return (retval);
+}
+
+void
+stp_vars_destroy(stp_vars_t *v)
+{
+ int i;
+ check_vars(v);
+ for (i = 0; i < STP_PARAMETER_TYPE_INVALID; i++)
+ stp_list_destroy(v->params[i]);
+ stp_list_destroy(v->internal_data);
+ STP_SAFE_FREE(v->driver);
+ STP_SAFE_FREE(v->color_conversion);
+ stp_free(v);
+}
+
+#define DEF_STRING_FUNCS(s, pre) \
+void \
+pre##_set_##s(stp_vars_t *v, const char *val) \
+{ \
+ check_vars(v); \
+ if (val) \
+ stp_dprintf(STP_DBG_VARS, v, "set %s to %s\n", #s, val); \
+ else \
+ stp_dprintf(STP_DBG_VARS, v, "clear %s\n", #s); \
+ if (v->s == val) \
+ return; \
+ STP_SAFE_FREE(v->s); \
+ v->s = stp_strdup(val); \
+ v->verified = 0; \
+} \
+ \
+void \
+pre##_set_##s##_n(stp_vars_t *v, const char *val, int n) \
+{ \
+ check_vars(v); \
+ if (v->s == val) \
+ return; \
+ STP_SAFE_FREE(v->s); \
+ v->s = stp_strndup(val, n); \
+ v->verified = 0; \
+} \
+ \
+const char * \
+pre##_get_##s(const stp_vars_t *v) \
+{ \
+ check_vars(v); \
+ return v->s; \
+}
+
+#define DEF_FUNCS(s, t, pre) \
+void \
+pre##_set_##s(stp_vars_t *v, t val) \
+{ \
+ check_vars(v); \
+ v->verified = 0; \
+ v->s = val; \
+} \
+ \
+t \
+pre##_get_##s(const stp_vars_t *v) \
+{ \
+ check_vars(v); \
+ return v->s; \
+}
+
+DEF_STRING_FUNCS(driver, stp)
+DEF_STRING_FUNCS(color_conversion, stp)
+DEF_FUNCS(left, int, stp)
+DEF_FUNCS(top, int, stp)
+DEF_FUNCS(width, int, stp)
+DEF_FUNCS(height, int, stp)
+DEF_FUNCS(page_width, int, stp)
+DEF_FUNCS(page_height, int, stp)
+DEF_FUNCS(outdata, void *, stp)
+DEF_FUNCS(errdata, void *, stp)
+DEF_FUNCS(outfunc, stp_outfunc_t, stp)
+DEF_FUNCS(errfunc, stp_outfunc_t, stp)
+
+void
+stp_set_verified(stp_vars_t *v, int val)
+{
+ check_vars(v);
+ v->verified = val;
+}
+
+int
+stp_get_verified(const stp_vars_t *v)
+{
+ check_vars(v);
+ return v->verified;
+}
+
+static void
+set_default_raw_parameter(stp_list_t *list, const char *parameter,
+ const char *value, size_t bytes, int typ)
+{
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (value && !item)
+ {
+ value_t *val = stp_malloc(sizeof(value_t));
+ val->name = stp_strdup(parameter);
+ val->typ = typ;
+ val->active = STP_PARAMETER_DEFAULTED;
+ stp_list_item_create(list, NULL, val);
+ copy_to_raw(&(val->value.rval), value, bytes);
+ }
+}
+
+static void
+set_raw_parameter(stp_list_t *list, const char *parameter, const char *value,
+ size_t bytes, int typ)
+{
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (value)
+ {
+ value_t *val;
+ if (item)
+ {
+ val = (value_t *) stp_list_item_get_data(item);
+ if (val->active == STP_PARAMETER_DEFAULTED)
+ val->active = STP_PARAMETER_ACTIVE;
+ stp_free((void *) val->value.rval.data);
+ }
+ else
+ {
+ val = stp_malloc(sizeof(value_t));
+ val->name = stp_strdup(parameter);
+ val->typ = typ;
+ val->active = STP_PARAMETER_ACTIVE;
+ stp_list_item_create(list, NULL, val);
+ }
+ copy_to_raw(&(val->value.rval), value, bytes);
+ }
+ else if (item)
+ stp_list_item_destroy(list, item);
+}
+
+void
+stp_set_string_parameter_n(stp_vars_t *v, const char *parameter,
+ const char *value, size_t bytes)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_STRING_LIST];
+ if (value)
+ stp_dprintf(STP_DBG_VARS, v, "stp_set_string_parameter(%s, %s)\n",
+ parameter, value);
+ else
+ stp_dprintf(STP_DBG_VARS, v, "stp_set_string_parameter(%s)\n",
+ parameter);
+ set_raw_parameter(list, parameter, value, bytes,
+ STP_PARAMETER_TYPE_STRING_LIST);
+ stp_set_verified(v, 0);
+}
+
+void
+stp_set_string_parameter(stp_vars_t *v, const char *parameter,
+ const char *value)
+{
+ int byte_count = 0;
+ if (value)
+ {
+ byte_count = strlen(value);
+ stp_dprintf(STP_DBG_VARS, v, "stp_set_string_parameter(%s, %s)\n",
+ parameter, value);
+ }
+ else
+ stp_dprintf(STP_DBG_VARS, v, "stp_set_string_parameter(%s)\n",
+ parameter);
+ stp_set_string_parameter_n(v, parameter, value, byte_count);
+ stp_set_verified(v, 0);
+}
+
+void
+stp_set_default_string_parameter_n(stp_vars_t *v, const char *parameter,
+ const char *value, size_t bytes)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_STRING_LIST];
+ set_default_raw_parameter(list, parameter, value, bytes,
+ STP_PARAMETER_TYPE_STRING_LIST);
+ stp_set_verified(v, 0);
+}
+
+void
+stp_set_default_string_parameter(stp_vars_t *v, const char *parameter,
+ const char *value)
+{
+ int byte_count = 0;
+ if (value)
+ {
+ byte_count = strlen(value);
+ stp_dprintf(STP_DBG_VARS, v,
+ "stp_set_default_string_parameter(%s, %s)\n",
+ parameter, value);
+ }
+ else
+ stp_dprintf(STP_DBG_VARS, v, "stp_set_default_string_parameter(%s)\n",
+ parameter);
+ stp_set_default_string_parameter_n(v, parameter, value, byte_count);
+ stp_set_verified(v, 0);
+}
+
+void
+stp_clear_string_parameter(stp_vars_t *v, const char *parameter)
+{
+ stp_set_string_parameter(v, parameter, NULL);
+}
+
+const char *
+stp_get_string_parameter(const stp_vars_t *v, const char *parameter)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_STRING_LIST];
+ value_t *val;
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item)
+ {
+ val = (value_t *) stp_list_item_get_data(item);
+ return val->value.rval.data;
+ }
+ else
+ return NULL;
+}
+
+void
+stp_set_raw_parameter(stp_vars_t *v, const char *parameter,
+ const void *value, size_t bytes)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_RAW];
+ set_raw_parameter(list, parameter, value, bytes, STP_PARAMETER_TYPE_RAW);
+ stp_set_verified(v, 0);
+}
+
+void
+stp_set_default_raw_parameter(stp_vars_t *v, const char *parameter,
+ const void *value, size_t bytes)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_RAW];
+ set_default_raw_parameter(list, parameter, value, bytes,
+ STP_PARAMETER_TYPE_RAW);
+ stp_set_verified(v, 0);
+}
+
+void
+stp_clear_raw_parameter(stp_vars_t *v, const char *parameter)
+{
+ stp_set_raw_parameter(v, parameter, NULL, 0);
+}
+
+const stp_raw_t *
+stp_get_raw_parameter(const stp_vars_t *v, const char *parameter)
+{
+ const stp_list_t *list = v->params[STP_PARAMETER_TYPE_RAW];
+ const value_t *val;
+ const stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item)
+ {
+ val = (const value_t *) stp_list_item_get_data(item);
+ return &(val->value.rval);
+ }
+ else
+ return NULL;
+}
+
+void
+stp_set_file_parameter(stp_vars_t *v, const char *parameter,
+ const char *value)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_FILE];
+ size_t byte_count = 0;
+ if (value)
+ byte_count = strlen(value);
+ set_raw_parameter(list, parameter, value, byte_count,
+ STP_PARAMETER_TYPE_FILE);
+ stp_set_verified(v, 0);
+}
+
+void
+stp_set_file_parameter_n(stp_vars_t *v, const char *parameter,
+ const char *value, size_t byte_count)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_FILE];
+ set_raw_parameter(list, parameter, value, byte_count,
+ STP_PARAMETER_TYPE_FILE);
+ stp_set_verified(v, 0);
+}
+
+void
+stp_set_default_file_parameter(stp_vars_t *v, const char *parameter,
+ const char *value)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_FILE];
+ size_t byte_count = 0;
+ if (value)
+ byte_count = strlen(value);
+ set_default_raw_parameter(list, parameter, value, byte_count,
+ STP_PARAMETER_TYPE_FILE);
+ stp_set_verified(v, 0);
+}
+
+void
+stp_set_default_file_parameter_n(stp_vars_t *v, const char *parameter,
+ const char *value, size_t byte_count)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_FILE];
+ set_default_raw_parameter(list, parameter, value, byte_count,
+ STP_PARAMETER_TYPE_FILE);
+ stp_set_verified(v, 0);
+}
+
+void
+stp_clear_file_parameter(stp_vars_t *v, const char *parameter)
+{
+ stp_set_file_parameter(v, parameter, NULL);
+}
+
+const char *
+stp_get_file_parameter(const stp_vars_t *v, const char *parameter)
+{
+ const stp_list_t *list = v->params[STP_PARAMETER_TYPE_FILE];
+ const value_t *val;
+ const stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item)
+ {
+ val = (const value_t *) stp_list_item_get_data(item);
+ return val->value.rval.data;
+ }
+ else
+ return NULL;
+}
+
+void
+stp_set_curve_parameter(stp_vars_t *v, const char *parameter,
+ const stp_curve_t *curve)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_CURVE];
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (curve)
+ {
+ value_t *val;
+ if (item)
+ {
+ val = (value_t *) stp_list_item_get_data(item);
+ if (val->active == STP_PARAMETER_DEFAULTED)
+ val->active = STP_PARAMETER_ACTIVE;
+ if (val->value.cval)
+ stp_curve_destroy(val->value.cval);
+ }
+ else
+ {
+ val = stp_malloc(sizeof(value_t));
+ val->name = stp_strdup(parameter);
+ val->typ = STP_PARAMETER_TYPE_CURVE;
+ val->active = STP_PARAMETER_ACTIVE;
+ stp_list_item_create(list, NULL, val);
+ }
+ val->value.cval = stp_curve_create_copy(curve);
+ }
+ else if (item)
+ stp_list_item_destroy(list, item);
+ stp_set_verified(v, 0);
+}
+
+void
+stp_set_default_curve_parameter(stp_vars_t *v, const char *parameter,
+ const stp_curve_t *curve)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_CURVE];
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (!item)
+ {
+ if (curve)
+ {
+ value_t *val;
+ val = stp_malloc(sizeof(value_t));
+ val->name = stp_strdup(parameter);
+ val->typ = STP_PARAMETER_TYPE_CURVE;
+ val->active = STP_PARAMETER_DEFAULTED;
+ stp_list_item_create(list, NULL, val);
+ val->value.cval = stp_curve_create_copy(curve);
+ }
+ }
+ stp_set_verified(v, 0);
+}
+
+void
+stp_clear_curve_parameter(stp_vars_t *v, const char *parameter)
+{
+ stp_set_curve_parameter(v, parameter, NULL);
+}
+
+const stp_curve_t *
+stp_get_curve_parameter(const stp_vars_t *v, const char *parameter)
+{
+ const stp_list_t *list = v->params[STP_PARAMETER_TYPE_CURVE];
+ const value_t *val;
+ const stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item)
+ {
+ val = (value_t *) stp_list_item_get_data(item);
+ return val->value.cval;
+ }
+ else
+ return NULL;
+}
+
+void
+stp_set_array_parameter(stp_vars_t *v, const char *parameter,
+ const stp_array_t *array)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_ARRAY];
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (array)
+ {
+ value_t *val;
+ if (item)
+ {
+ val = (value_t *) stp_list_item_get_data(item);
+ if (val->active == STP_PARAMETER_DEFAULTED)
+ val->active = STP_PARAMETER_ACTIVE;
+ stp_array_destroy(val->value.aval);
+ }
+ else
+ {
+ val = stp_malloc(sizeof(value_t));
+ val->name = stp_strdup(parameter);
+ val->typ = STP_PARAMETER_TYPE_ARRAY;
+ val->active = STP_PARAMETER_ACTIVE;
+ stp_list_item_create(list, NULL, val);
+ }
+ val->value.aval = stp_array_create_copy(array);
+ }
+ else if (item)
+ stp_list_item_destroy(list, item);
+ stp_set_verified(v, 0);
+}
+
+void
+stp_set_default_array_parameter(stp_vars_t *v, const char *parameter,
+ const stp_array_t *array)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_ARRAY];
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (!item)
+ {
+ if (array)
+ {
+ value_t *val;
+ val = stp_malloc(sizeof(value_t));
+ val->name = stp_strdup(parameter);
+ val->typ = STP_PARAMETER_TYPE_ARRAY;
+ val->active = STP_PARAMETER_DEFAULTED;
+ stp_list_item_create(list, NULL, val);
+ val->value.aval = stp_array_create_copy(array);
+ }
+ }
+ stp_set_verified(v, 0);
+}
+
+void
+stp_clear_array_parameter(stp_vars_t *v, const char *parameter)
+{
+ stp_set_array_parameter(v, parameter, NULL);
+}
+
+const stp_array_t *
+stp_get_array_parameter(const stp_vars_t *v, const char *parameter)
+{
+ const stp_list_t *list = v->params[STP_PARAMETER_TYPE_ARRAY];
+ const value_t *val;
+ const stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item)
+ {
+ val = (const value_t *) stp_list_item_get_data(item);
+ return val->value.aval;
+ }
+ else
+ return NULL;
+}
+
+void
+stp_set_int_parameter(stp_vars_t *v, const char *parameter, int ival)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_INT];
+ value_t *val;
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item)
+ {
+ val = (value_t *) stp_list_item_get_data(item);
+ if (val->active == STP_PARAMETER_DEFAULTED)
+ val->active = STP_PARAMETER_ACTIVE;
+ }
+ else
+ {
+ val = stp_malloc(sizeof(value_t));
+ val->name = stp_strdup(parameter);
+ val->typ = STP_PARAMETER_TYPE_INT;
+ val->active = STP_PARAMETER_ACTIVE;
+ stp_list_item_create(list, NULL, val);
+ }
+ val->value.ival = ival;
+ stp_set_verified(v, 0);
+}
+
+void
+stp_set_default_int_parameter(stp_vars_t *v, const char *parameter, int ival)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_INT];
+ value_t *val;
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (!item)
+ {
+ val = stp_malloc(sizeof(value_t));
+ val->name = stp_strdup(parameter);
+ val->typ = STP_PARAMETER_TYPE_INT;
+ val->active = STP_PARAMETER_DEFAULTED;
+ stp_list_item_create(list, NULL, val);
+ val->value.ival = ival;
+ }
+ stp_set_verified(v, 0);
+}
+
+void
+stp_clear_int_parameter(stp_vars_t *v, const char *parameter)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_INT];
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item)
+ stp_list_item_destroy(list, item);
+ stp_set_verified(v, 0);
+}
+
+int
+stp_get_int_parameter(const stp_vars_t *v, const char *parameter)
+{
+ const stp_list_t *list = v->params[STP_PARAMETER_TYPE_INT];
+ const stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item)
+ {
+ const value_t *val = (const value_t *) stp_list_item_get_data(item);
+ return val->value.ival;
+ }
+ else
+ {
+ stp_parameter_t desc;
+ stp_describe_parameter(v, parameter, &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_INT)
+ {
+ int intval = desc.deflt.integer;
+ stp_parameter_description_destroy(&desc);
+ return intval;
+ }
+ else
+ {
+ stp_parameter_description_destroy(&desc);
+ stp_erprintf
+ ("Gutenprint: Attempt to retrieve unset integer parameter %s\n",
+ parameter);
+ return 0;
+ }
+ }
+}
+
+void
+stp_set_boolean_parameter(stp_vars_t *v, const char *parameter, int ival)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_BOOLEAN];
+ value_t *val;
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item)
+ {
+ val = (value_t *) stp_list_item_get_data(item);
+ if (val->active == STP_PARAMETER_DEFAULTED)
+ val->active = STP_PARAMETER_ACTIVE;
+ }
+ else
+ {
+ val = stp_malloc(sizeof(value_t));
+ val->name = stp_strdup(parameter);
+ val->typ = STP_PARAMETER_TYPE_BOOLEAN;
+ val->active = STP_PARAMETER_ACTIVE;
+ stp_list_item_create(list, NULL, val);
+ }
+ if (ival)
+ val->value.ival = 1;
+ else
+ val->value.ival = 0;
+ stp_set_verified(v, 0);
+}
+
+void
+stp_set_default_boolean_parameter(stp_vars_t *v, const char *parameter,
+ int ival)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_BOOLEAN];
+ value_t *val;
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (!item)
+ {
+ val = stp_malloc(sizeof(value_t));
+ val->name = stp_strdup(parameter);
+ val->typ = STP_PARAMETER_TYPE_BOOLEAN;
+ val->active = STP_PARAMETER_DEFAULTED;
+ stp_list_item_create(list, NULL, val);
+ if (ival)
+ val->value.ival = 1;
+ else
+ val->value.ival = 0;
+ }
+ stp_set_verified(v, 0);
+}
+
+void
+stp_clear_boolean_parameter(stp_vars_t *v, const char *parameter)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_BOOLEAN];
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item)
+ stp_list_item_destroy(list, item);
+ stp_set_verified(v, 0);
+}
+
+int
+stp_get_boolean_parameter(const stp_vars_t *v, const char *parameter)
+{
+ const stp_list_t *list = v->params[STP_PARAMETER_TYPE_BOOLEAN];
+ const stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item)
+ {
+ const value_t *val = (const value_t *) stp_list_item_get_data(item);
+ return val->value.ival;
+ }
+ else
+ {
+ stp_parameter_t desc;
+ stp_describe_parameter(v, parameter, &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_BOOLEAN)
+ {
+ int boolean = desc.deflt.boolean;
+ stp_parameter_description_destroy(&desc);
+ return boolean;
+ }
+ else
+ {
+ stp_parameter_description_destroy(&desc);
+ stp_erprintf
+ ("Gutenprint: Attempt to retrieve unset boolean parameter %s\n",
+ parameter);
+ return 0;
+ }
+ }
+}
+
+void
+stp_set_dimension_parameter(stp_vars_t *v, const char *parameter, int ival)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_DIMENSION];
+ value_t *val;
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item)
+ {
+ val = (value_t *) stp_list_item_get_data(item);
+ if (val->active == STP_PARAMETER_DEFAULTED)
+ val->active = STP_PARAMETER_ACTIVE;
+ }
+ else
+ {
+ val = stp_malloc(sizeof(value_t));
+ val->name = stp_strdup(parameter);
+ val->typ = STP_PARAMETER_TYPE_DIMENSION;
+ val->active = STP_PARAMETER_ACTIVE;
+ stp_list_item_create(list, NULL, val);
+ }
+ val->value.ival = ival;
+ stp_set_verified(v, 0);
+}
+
+void
+stp_set_default_dimension_parameter(stp_vars_t *v, const char *parameter, int ival)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_DIMENSION];
+ value_t *val;
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (!item)
+ {
+ val = stp_malloc(sizeof(value_t));
+ val->name = stp_strdup(parameter);
+ val->typ = STP_PARAMETER_TYPE_DIMENSION;
+ val->active = STP_PARAMETER_DEFAULTED;
+ stp_list_item_create(list, NULL, val);
+ val->value.ival = ival;
+ }
+ stp_set_verified(v, 0);
+}
+
+void
+stp_clear_dimension_parameter(stp_vars_t *v, const char *parameter)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_DIMENSION];
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item)
+ stp_list_item_destroy(list, item);
+ stp_set_verified(v, 0);
+}
+
+int
+stp_get_dimension_parameter(const stp_vars_t *v, const char *parameter)
+{
+ const stp_list_t *list = v->params[STP_PARAMETER_TYPE_DIMENSION];
+ const stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item)
+ {
+ const value_t *val = (const value_t *) stp_list_item_get_data(item);
+ return val->value.ival;
+ }
+ else
+ {
+ stp_parameter_t desc;
+ stp_describe_parameter(v, parameter, &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_DIMENSION)
+ {
+ int intval = desc.deflt.integer;
+ stp_parameter_description_destroy(&desc);
+ return intval;
+ }
+ else
+ {
+ stp_parameter_description_destroy(&desc);
+ stp_erprintf
+ ("Gutenprint: Attempt to retrieve unset dimension parameter %s\n",
+ parameter);
+ return 0;
+ }
+ }
+}
+
+void
+stp_set_float_parameter(stp_vars_t *v, const char *parameter, double dval)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_DOUBLE];
+ value_t *val;
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item)
+ {
+ val = (value_t *) stp_list_item_get_data(item);
+ if (val->active == STP_PARAMETER_DEFAULTED)
+ val->active = STP_PARAMETER_ACTIVE;
+ }
+ else
+ {
+ val = stp_malloc(sizeof(value_t));
+ val->name = stp_strdup(parameter);
+ val->typ = STP_PARAMETER_TYPE_DOUBLE;
+ val->active = STP_PARAMETER_ACTIVE;
+ stp_list_item_create(list, NULL, val);
+ }
+ val->value.dval = dval;
+ stp_set_verified(v, 0);
+}
+
+void
+stp_set_default_float_parameter(stp_vars_t *v, const char *parameter,
+ double dval)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_DOUBLE];
+ value_t *val;
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (!item)
+ {
+ val = stp_malloc(sizeof(value_t));
+ val->name = stp_strdup(parameter);
+ val->typ = STP_PARAMETER_TYPE_DOUBLE;
+ val->active = STP_PARAMETER_DEFAULTED;
+ stp_list_item_create(list, NULL, val);
+ val->value.dval = dval;
+ }
+ stp_set_verified(v, 0);
+}
+
+void
+stp_clear_float_parameter(stp_vars_t *v, const char *parameter)
+{
+ stp_list_t *list = v->params[STP_PARAMETER_TYPE_DOUBLE];
+ stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item)
+ stp_list_item_destroy(list, item);
+ stp_set_verified(v, 0);
+}
+
+double
+stp_get_float_parameter(const stp_vars_t *v, const char *parameter)
+{
+ const stp_list_t *list = v->params[STP_PARAMETER_TYPE_DOUBLE];
+ const stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item)
+ {
+ const value_t *val = (value_t *) stp_list_item_get_data(item);
+ return val->value.dval;
+ }
+ else
+ {
+ stp_parameter_t desc;
+ stp_describe_parameter(v, parameter, &desc);
+ if (desc.p_type == STP_PARAMETER_TYPE_DOUBLE)
+ {
+ double dbl = desc.deflt.dbl;
+ stp_parameter_description_destroy(&desc);
+ return dbl;
+ }
+ else
+ {
+ stp_parameter_description_destroy(&desc);
+ stp_erprintf
+ ("Gutenprint: Attempt to retrieve unset float parameter %s\n",
+ parameter);
+ return 1.0;
+ }
+ }
+}
+
+void
+stp_scale_float_parameter(stp_vars_t *v, const char *parameter,
+ double scale)
+{
+ double val;
+ if (stp_check_float_parameter(v, parameter, STP_PARAMETER_DEFAULTED))
+ val = stp_get_float_parameter(v, parameter);
+ else
+ {
+ stp_parameter_t desc;
+ stp_describe_parameter(v, parameter, &desc);
+ if (desc.p_type != STP_PARAMETER_TYPE_DOUBLE)
+ {
+ stp_parameter_description_destroy(&desc);
+ return;
+ }
+ val = desc.deflt.dbl;
+ stp_parameter_description_destroy(&desc);
+ }
+ stp_set_float_parameter(v, parameter, val * scale);
+}
+
+static int
+check_parameter_generic(const stp_vars_t *v, stp_parameter_type_t p_type,
+ const char *parameter, stp_parameter_activity_t active)
+{
+ const stp_list_t *list = v->params[p_type];
+ const stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item &&
+ active <= ((const value_t *) stp_list_item_get_data(item))->active)
+ return 1;
+ else
+ return 0;
+}
+
+#define CHECK_FUNCTION(type, index) \
+int \
+stp_check_##type##_parameter(const stp_vars_t *v, const char *parameter, \
+ stp_parameter_activity_t active) \
+{ \
+ return check_parameter_generic(v, index, parameter, active); \
+}
+
+CHECK_FUNCTION(string, STP_PARAMETER_TYPE_STRING_LIST)
+CHECK_FUNCTION(file, STP_PARAMETER_TYPE_FILE)
+CHECK_FUNCTION(float, STP_PARAMETER_TYPE_DOUBLE)
+CHECK_FUNCTION(int, STP_PARAMETER_TYPE_INT)
+CHECK_FUNCTION(dimension, STP_PARAMETER_TYPE_DIMENSION)
+CHECK_FUNCTION(boolean, STP_PARAMETER_TYPE_BOOLEAN)
+CHECK_FUNCTION(curve, STP_PARAMETER_TYPE_CURVE)
+CHECK_FUNCTION(array, STP_PARAMETER_TYPE_ARRAY)
+CHECK_FUNCTION(raw, STP_PARAMETER_TYPE_RAW)
+
+static stp_parameter_activity_t
+get_parameter_active_generic(const stp_vars_t *v, stp_parameter_type_t p_type,
+ const char *parameter)
+{
+ const stp_list_t *list = v->params[p_type];
+ const stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item)
+ return ((const value_t *) stp_list_item_get_data(item))->active;
+ else
+ return 0;
+}
+
+#define GET_PARAMETER_ACTIVE_FUNCTION(type, index) \
+stp_parameter_activity_t \
+stp_get_##type##_parameter_active(const stp_vars_t *v, const char *parameter) \
+{ \
+ return get_parameter_active_generic(v, index, parameter); \
+}
+
+GET_PARAMETER_ACTIVE_FUNCTION(string, STP_PARAMETER_TYPE_STRING_LIST)
+GET_PARAMETER_ACTIVE_FUNCTION(file, STP_PARAMETER_TYPE_FILE)
+GET_PARAMETER_ACTIVE_FUNCTION(float, STP_PARAMETER_TYPE_DOUBLE)
+GET_PARAMETER_ACTIVE_FUNCTION(int, STP_PARAMETER_TYPE_INT)
+GET_PARAMETER_ACTIVE_FUNCTION(dimension, STP_PARAMETER_TYPE_DIMENSION)
+GET_PARAMETER_ACTIVE_FUNCTION(boolean, STP_PARAMETER_TYPE_BOOLEAN)
+GET_PARAMETER_ACTIVE_FUNCTION(curve, STP_PARAMETER_TYPE_CURVE)
+GET_PARAMETER_ACTIVE_FUNCTION(array, STP_PARAMETER_TYPE_ARRAY)
+GET_PARAMETER_ACTIVE_FUNCTION(raw, STP_PARAMETER_TYPE_RAW)
+
+static void
+set_parameter_active_generic(const stp_vars_t *v, stp_parameter_type_t p_type,
+ const char *parameter,
+ stp_parameter_activity_t active)
+{
+ const stp_list_t *list = v->params[p_type];
+ const stp_list_item_t *item = stp_list_get_item_by_name(list, parameter);
+ if (item && (active == STP_PARAMETER_ACTIVE ||
+ active == STP_PARAMETER_INACTIVE))
+ ((value_t *) stp_list_item_get_data(item))->active = active;
+}
+
+#define SET_PARAMETER_ACTIVE_FUNCTION(type, index) \
+void \
+stp_set_##type##_parameter_active(const stp_vars_t *v, const char *parameter, \
+ stp_parameter_activity_t active) \
+{ \
+ set_parameter_active_generic(v, index, parameter, active); \
+}
+
+SET_PARAMETER_ACTIVE_FUNCTION(string, STP_PARAMETER_TYPE_STRING_LIST)
+SET_PARAMETER_ACTIVE_FUNCTION(file, STP_PARAMETER_TYPE_FILE)
+SET_PARAMETER_ACTIVE_FUNCTION(float, STP_PARAMETER_TYPE_DOUBLE)
+SET_PARAMETER_ACTIVE_FUNCTION(int, STP_PARAMETER_TYPE_INT)
+SET_PARAMETER_ACTIVE_FUNCTION(dimension, STP_PARAMETER_TYPE_DIMENSION)
+SET_PARAMETER_ACTIVE_FUNCTION(boolean, STP_PARAMETER_TYPE_BOOLEAN)
+SET_PARAMETER_ACTIVE_FUNCTION(curve, STP_PARAMETER_TYPE_CURVE)
+SET_PARAMETER_ACTIVE_FUNCTION(array, STP_PARAMETER_TYPE_ARRAY)
+SET_PARAMETER_ACTIVE_FUNCTION(raw, STP_PARAMETER_TYPE_RAW)
+
+void
+stp_fill_parameter_settings(stp_parameter_t *desc,
+ const stp_parameter_t *param)
+{
+ if (param)
+ {
+ desc->p_type = param->p_type;
+ desc->p_level = param->p_level;
+ desc->p_class = param->p_class;
+ desc->is_mandatory = param->is_mandatory;
+ desc->is_active = param->is_active;
+ desc->channel = param->channel;
+ desc->verify_this_parameter = param->verify_this_parameter;
+ desc->read_only = param->read_only;
+ desc->name = param->name;
+ desc->text = param->text;
+ desc->category = param->category;
+ desc->help = param->help;
+ return;
+ }
+}
+
+void
+stp_vars_copy(stp_vars_t *vd, const stp_vars_t *vs)
+{
+ int i;
+
+ if (vs == vd)
+ return;
+ stp_set_driver(vd, stp_get_driver(vs));
+ stp_set_color_conversion(vd, stp_get_color_conversion(vs));
+ stp_set_left(vd, stp_get_left(vs));
+ stp_set_top(vd, stp_get_top(vs));
+ stp_set_width(vd, stp_get_width(vs));
+ stp_set_height(vd, stp_get_height(vs));
+ stp_set_page_width(vd, stp_get_page_width(vs));
+ stp_set_page_height(vd, stp_get_page_height(vs));
+ stp_set_outdata(vd, stp_get_outdata(vs));
+ stp_set_errdata(vd, stp_get_errdata(vs));
+ stp_set_outfunc(vd, stp_get_outfunc(vs));
+ stp_set_errfunc(vd, stp_get_errfunc(vs));
+ for (i = 0; i < STP_PARAMETER_TYPE_INVALID; i++)
+ {
+ stp_list_destroy(vd->params[i]);
+ vd->params[i] = copy_value_list(vs->params[i]);
+ }
+ stp_list_destroy(vd->internal_data);
+ vd->internal_data = copy_compdata_list(vs->internal_data);
+ stp_set_verified(vd, stp_get_verified(vs));
+}
+
+void
+stp_prune_inactive_options(stp_vars_t *v)
+{
+ stp_parameter_list_t params = stp_get_parameter_list(v);
+ int i;
+ for (i = 0; i < STP_PARAMETER_TYPE_INVALID; i++)
+ {
+ stp_list_t *list = v->params[i];
+ stp_list_item_t *item = stp_list_get_start(list);
+ while (item)
+ {
+ stp_list_item_t *next = stp_list_item_next(item);
+ value_t *var = (value_t *)stp_list_item_get_data(item);
+ if (var->active < STP_PARAMETER_DEFAULTED ||
+ !(stp_parameter_find(params, var->name)))
+ stp_list_item_destroy(list, item);
+ item = next;
+ }
+ }
+ stp_parameter_list_destroy(params);
+}
+
+stp_vars_t *
+stp_vars_create_copy(const stp_vars_t *vs)
+{
+ stp_vars_t *vd = stp_vars_create();
+ stp_vars_copy(vd, vs);
+ return (vd);
+}
+
+static const char *
+param_namefunc(const void *item)
+{
+ const stp_parameter_t *param = (const stp_parameter_t *)(item);
+ return param->name;
+}
+
+static const char *
+param_longnamefunc(const void *item)
+{
+ const stp_parameter_t *param = (const stp_parameter_t *) (item);
+ return param->text;
+}
+
+stp_parameter_list_t
+stp_parameter_list_create(void)
+{
+ stp_list_t *ret = stp_list_create();
+ stp_list_set_namefunc(ret, param_namefunc);
+ stp_list_set_long_namefunc(ret, param_longnamefunc);
+ return (stp_parameter_list_t) ret;
+}
+
+void
+stp_parameter_list_add_param(stp_parameter_list_t list,
+ const stp_parameter_t *item)
+{
+ stp_list_t *ilist = (stp_list_t *) list;
+ stp_list_item_create(ilist, NULL, item);
+}
+
+void
+stp_describe_parameter(const stp_vars_t *v, const char *name,
+ stp_parameter_t *description)
+{
+ description->p_type = STP_PARAMETER_TYPE_INVALID;
+/* Set these to NULL in case stpi_*_describe_parameter() doesn't */
+ description->bounds.str = NULL;
+ description->deflt.str = NULL;
+ stp_printer_describe_parameter(v, name, description);
+ if (description->p_type != STP_PARAMETER_TYPE_INVALID)
+ return;
+ stp_color_describe_parameter(v, name, description);
+ if (description->p_type != STP_PARAMETER_TYPE_INVALID)
+ return;
+ stp_dither_describe_parameter(v, name, description);
+ if (description->p_type != STP_PARAMETER_TYPE_INVALID)
+ return;
+ stpi_describe_generic_parameter(v, name, description);
+}
+
+void
+stp_parameter_description_destroy(stp_parameter_t *desc)
+{
+ switch (desc->p_type)
+ {
+ case STP_PARAMETER_TYPE_CURVE:
+ if (desc->bounds.curve)
+ stp_curve_destroy(desc->bounds.curve);
+ desc->bounds.curve = NULL;
+ break;
+ case STP_PARAMETER_TYPE_ARRAY:
+ if (desc->bounds.array)
+ stp_array_destroy(desc->bounds.array);
+ desc->bounds.array = NULL;
+ break;
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ if (desc->bounds.str)
+ stp_string_list_destroy(desc->bounds.str);
+ desc->bounds.str = NULL;
+ break;
+ default:
+ break;
+ }
+}
+
+const stp_parameter_t *
+stp_parameter_find_in_settings(const stp_vars_t *v, const char *name)
+{
+ stp_parameter_list_t param_list = stp_get_parameter_list(v);
+ const stp_parameter_t *param = stp_parameter_find(param_list, name);
+ stp_parameter_list_destroy(param_list);
+ return param;
+}
+
+size_t
+stp_parameter_list_count(stp_const_parameter_list_t list)
+{
+ const stp_list_t *ilist = (const stp_list_t *)list;
+ return stp_list_get_length(ilist);
+}
+
+const stp_parameter_t *
+stp_parameter_find(stp_const_parameter_list_t list, const char *name)
+{
+ const stp_list_t *ilist = (const stp_list_t *)list;
+ const stp_list_item_t *item = stp_list_get_item_by_name(ilist, name);
+ if (item)
+ return (const stp_parameter_t *) stp_list_item_get_data(item);
+ else
+ return NULL;
+}
+
+const stp_parameter_t *
+stp_parameter_list_param(stp_const_parameter_list_t list, size_t item)
+{
+ const stp_list_t *ilist = (const stp_list_t *)list;
+ if (item >= stp_list_get_length(ilist))
+ return NULL;
+ else
+ return (const stp_parameter_t *)
+ stp_list_item_get_data(stp_list_get_item_by_index(ilist, item));
+}
+
+void
+stp_parameter_list_destroy(stp_parameter_list_t list)
+{
+ stp_list_destroy((stp_list_t *)list);
+}
+
+stp_parameter_list_t
+stp_parameter_list_copy(stp_const_parameter_list_t list)
+{
+ stp_list_t *ret = stp_parameter_list_create();
+ int i;
+ size_t count = stp_parameter_list_count(list);
+ for (i = 0; i < count; i++)
+ stp_list_item_create(ret, NULL, stp_parameter_list_param(list, i));
+ return (stp_parameter_list_t) ret;
+}
+
+void
+stp_parameter_list_append(stp_parameter_list_t list,
+ stp_const_parameter_list_t append)
+{
+ int i;
+ stp_list_t *ilist = (stp_list_t *)list;
+ size_t count = stp_parameter_list_count(append);
+ for (i = 0; i < count; i++)
+ {
+ const stp_parameter_t *param = stp_parameter_list_param(append, i);
+ if (!stp_list_get_item_by_name(ilist, param->name))
+ stp_list_item_create(ilist, NULL, param);
+ }
+}
diff --git a/src/main/print-version.c b/src/main/print-version.c
index 22b80c5..1137d34 100644
--- a/src/main/print-version.c
+++ b/src/main/print-version.c
@@ -1,5 +1,5 @@
/*
- * "$Id: print-version.c,v 1.6 2001/09/08 17:13:48 rleigh Exp $"
+ * "$Id: print-version.c,v 1.8 2005/04/10 23:15:16 rlk Exp $"
*
* Print plug-in driver utility functions for the GIMP.
*
@@ -23,40 +23,54 @@
/*
* 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.
+ * compile on generic platforms that don't support glib, gimp, etc.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#include <gimp-print/gimp-print.h>
-#include "gimp-print-internal.h"
-#include <gimp-print/gimp-print-intl-internal.h>
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
-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 unsigned int stp_major_version = STP_MAJOR_VERSION;
+const unsigned int stp_minor_version = STP_MINOR_VERSION;
+const unsigned int stp_micro_version = STP_MICRO_VERSION;
+const unsigned int stp_current_interface = STP_CURRENT_INTERFACE;
+const unsigned int stp_binary_age = STP_BINARY_AGE;
+const unsigned int stp_interface_age = STP_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)";
+ if (required_major > STP_MAJOR_VERSION)
+ return "Gutenprint version too old (major mismatch)";
+ if (required_major < STP_MAJOR_VERSION)
+ return "Gutenprint version too new (major mismatch)";
+ if (required_minor > STP_MINOR_VERSION)
+ return "Gutenprint version too old (minor mismatch)";
+ if (required_minor < STP_MINOR_VERSION)
+ return "Gutenprint version too new (minor mismatch)";
+ if (required_micro < STP_MICRO_VERSION - STP_BINARY_AGE)
+ return "Gutenprint version too new (micro mismatch)";
+ if (required_micro > STP_MICRO_VERSION)
+ return "Gutenprint version too old (micro mismatch)";
return NULL;
}
+
+const char *
+stp_get_version(void)
+{
+ static const char *version_id = VERSION;
+ return version_id;
+}
+
+const char *
+stp_get_release_version(void)
+{
+ static const char *release_version_id = GUTENPRINT_RELEASE_VERSION;
+ return release_version_id;
+}
diff --git a/src/main/print-weave.c b/src/main/print-weave.c
index 8b0213f..498e839 100644
--- a/src/main/print-weave.c
+++ b/src/main/print-weave.c
@@ -1,7 +1,7 @@
/*
- * "$Id: print-weave.c,v 1.36.4.3 2003/12/02 01:51:00 rlk Exp $"
+ * "$Id: print-weave.c,v 1.63 2005/06/29 01:42:35 rlk Exp $"
*
- * Softweave calculator for gimp-print.
+ * Softweave calculator for Gutenprint.
*
* Copyright 2000 Charles Briscoe-Smith <cpbs@debian.org>
*
@@ -28,30 +28,18 @@
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
-#include <stdio.h>
-#include <stdlib.h>
#include <string.h>
-#include <gimp-print/gimp-print.h>
-#include "gimp-print-internal.h"
-#include <gimp-print/gimp-print-intl-internal.h>
-
-#if 0
-#define TEST_RAW
-#endif
-#if 0
-#define TEST_COOKED
-#endif
-#if 0
-#define ACCUMULATE
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
#endif
+
#if 1
#define ASSERTIONS
#endif
-#if defined(TEST_RAW) || defined(TEST_COOKED)
-#define TEST
-#endif
-
#ifdef ASSERTIONS
#define assert(x,v) \
do \
@@ -60,17 +48,13 @@ do \
{ \
stp_eprintf(v, "Assertion %s failed! file %s, line %d.\n", \
#x, __FILE__, __LINE__); \
- exit(1); \
+ stp_abort(); \
} \
} while (0)
#else
#define assert(x,v) do {} while (0)
#endif
-#ifdef TEST
-#define MAXCOLLECT (1000)
-#endif
-
static int
gcd(int x, int y)
{
@@ -87,6 +71,57 @@ gcd(int x, int y)
return y;
}
+typedef struct stpi_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_linebounds_t *linebounds; /* Starting and ending print column */
+ 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 */
+ 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 horizontal_width; /* Horizontal width, in bits */
+ int *head_offset; /* offset of printheads */
+ unsigned char *s[STP_MAX_WEAVE];
+ unsigned char *fold_buf;
+ unsigned char *comp_buf;
+ stp_weave_t wcache;
+ int rcache;
+ int vcache;
+ stp_flushfunc *flushfunc;
+ stp_fillfunc *fillfunc;
+ stp_packfunc *pack;
+ stp_compute_linewidth_func *compute_linewidth;
+} stpi_softweave_t;
+
/* RAW WEAVE */
typedef struct raw {
@@ -96,43 +131,42 @@ typedef struct raw {
int advancebasis;
int subblocksperpassblock;
int passespersubblock;
- int strategy;
- stp_vars_t v;
+ stp_weave_strategy_t strategy;
+ stp_vars_t *v;
} raw_t;
/*
* Strategy types currently defined:
*
- * 0: printer firmware weave
- * 1: zig-zag type pass block filling
- * 2: ascending pass block filling
- * 3: descending pass block filling
- * 4: ascending fill with 2x expansion
+ * 0: zig-zag type pass block filling
+ * 1: ascending pass block filling
+ * 2: descending pass block filling
+ * 3: ascending fill with 2x expansion
+ * 4: staggered zig-zag neighbour-avoidance fill
* 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
+ * In theory, strategy 0 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,
+ * neighbouring rows in neighbouring passes, strategy 4 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)
+ int separation, /* I - jet separation */
+ int jets, /* I - number of jets */
+ int oversample, /* I - oversampling factor */
+ stp_weave_strategy_t strat, /* I - weave pattern variation to use */
+ stp_vars_t *v)
{
- w->separation = S;
- w->jets = J;
- w->oversampling = H;
- w->advancebasis = J / H;
+ w->separation = separation;
+ w->jets = jets;
+ w->oversampling = oversample;
+ w->advancebasis = jets / oversample;
if (w->advancebasis == 0)
w->advancebasis++;
- w->subblocksperpassblock = gcd(S, w->advancebasis);
- w->passespersubblock = S / w->subblocksperpassblock;
+ w->subblocksperpassblock = gcd(separation, w->advancebasis);
+ w->passespersubblock = separation / w->subblocksperpassblock;
w->strategy = strat;
w->v = v;
}
@@ -151,20 +185,20 @@ calculate_raw_pass_parameters(raw_t *w, /* I - weave parameters */
* w->subblocksperpassblock / w->separation;
switch (w->strategy) {
- case 1:
+ case STP_WEAVE_ZIGZAG:
if (subpassblock * 2 < w->subblocksperpassblock)
subpassoffset = 2 * subpassblock;
else
subpassoffset = 2 * (w->subblocksperpassblock
- subpassblock) - 1;
break;
- case 2:
+ case STP_WEAVE_ASCENDING:
subpassoffset = subpassblock;
break;
- case 3:
+ case STP_WEAVE_DESCENDING:
subpassoffset = w->subblocksperpassblock - 1 - subpassblock;
break;
- case 4:
+ case STP_WEAVE_ASCENDING_2X:
if (subpassblock * 2 < w->subblocksperpassblock)
subpassoffset = 2 * subpassblock;
else
@@ -172,7 +206,7 @@ calculate_raw_pass_parameters(raw_t *w, /* I - weave parameters */
- (w->subblocksperpassblock
+ 1) / 2);
break;
- case 5:
+ case STP_WEAVE_ASCENDING_3X:
if (subpassblock * 3 < w->subblocksperpassblock)
subpassoffset = 3 * subpassblock;
else if (3 * (subpassblock - (w->subblocksperpassblock + 2) / 3)
@@ -187,7 +221,7 @@ calculate_raw_pass_parameters(raw_t *w, /* I - weave parameters */
- w->subblocksperpassblock
/ 3);
break;
- case 6:
+ case STP_WEAVE_STAGGERED:
if (subpassblock * 2 < w->subblocksperpassblock)
subpassoffset = 2 * subpassblock;
else if (subpassblock * 2 < w->subblocksperpassblock + 2)
@@ -221,27 +255,27 @@ calculate_raw_row_parameters(raw_t *w, /* I - weave parameters */
subblockoffset = row % w->subblocksperpassblock;
switch (w->strategy) {
- case 1:
+ case STP_WEAVE_ZIGZAG:
if (subblockoffset % 2 == 0)
subpassblock = subblockoffset / 2;
else
subpassblock = w->subblocksperpassblock
- (subblockoffset + 1) / 2;
break;
- case 2:
+ case STP_WEAVE_ASCENDING:
subpassblock = subblockoffset;
break;
- case 3:
+ case STP_WEAVE_DESCENDING:
subpassblock = w->subblocksperpassblock - 1 - subblockoffset;
break;
- case 4:
+ case STP_WEAVE_ASCENDING_2X:
if (subblockoffset % 2 == 0)
subpassblock = subblockoffset / 2;
else
subpassblock = (subblockoffset - 1) / 2
+ (w->subblocksperpassblock + 1) / 2;
break;
- case 5:
+ case STP_WEAVE_ASCENDING_3X:
if (subblockoffset % 3 == 0)
subpassblock = subblockoffset / 3;
else if (subblockoffset % 3 == 1)
@@ -252,14 +286,15 @@ calculate_raw_row_parameters(raw_t *w, /* I - weave parameters */
+ (w->subblocksperpassblock + 2) / 3
+ (w->subblocksperpassblock + 1) / 3;
break;
- case 6:
+ case STP_WEAVE_STAGGERED:
if (subblockoffset % 2 == 0)
subpassblock = subblockoffset / 2;
else if (subblockoffset == 1)
- subpassblock = w->subblocksperpassblock / 2;
+ subpassblock = (w->subblocksperpassblock + 1) / 2;
else
subpassblock = w->subblocksperpassblock
- (subblockoffset - 1) / 2;
+ break;
default:
subpassblock = subblockoffset;
break;
@@ -454,7 +489,7 @@ make_passmap(raw_t *w, int **map, int **starts, int first_pass_number,
}
static void
-calculate_pass_map(stp_vars_t v,
+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 */
@@ -528,7 +563,7 @@ calculate_pass_map(stp_vars_t v,
w->stagger_premap = 0;
}
- if (w->first_unused_pass > w->first_postmapped_pass) {
+ 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;
@@ -551,27 +586,27 @@ calculate_pass_map(stp_vars_t v,
}
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 */
+initialize_weave_params(int separation, /* I - jet separation */
+ int jets, /* I - number of jets */
+ int oversample, /* 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)
+ stp_weave_strategy_t 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);
+ initialize_raw_weave(&w->rw, separation, jets, oversample, strategy, v);
calculate_pass_map(v, w, pageheight, firstrow, lastrow);
}
return w;
}
-void
-stp_destroy_weave_params(void *vw)
+static void
+stpi_destroy_weave_params(void *vw)
{
cooked_t *w = (cooked_t *) vw;
@@ -583,14 +618,14 @@ stp_destroy_weave_params(void *vw)
}
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 */
+stpi_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 @ start */
+ int *ojetsused) /* O - jets used by pass */
{
cooked_t *w = (cooked_t *) vw;
int raw_pass, jet, startrow, phantomrows, jetsused;
@@ -647,865 +682,6 @@ stp_calculate_row_parameters(void *vw, /* I - weave parameters */
*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 tempin, bit, temp0, temp1;
-
- if (length <= 0)
- return;
- for (bit = 128, temp0 = 0, temp1 = 0;
- length > 0;
- length --)
- {
- tempin = *in++;
-
- if (tempin & 128)
- temp0 |= bit;
- if (tempin & 64)
- temp1 |= bit;
- bit >>= 1;
- if (tempin & 32)
- temp0 |= bit;
- if (tempin & 16)
- temp1 |= bit;
- bit >>= 1;
- if (tempin & 8)
- temp0 |= bit;
- if (tempin & 4)
- temp1 |= bit;
- bit >>= 1;
- if (tempin & 2)
- temp0 |= bit;
- if (tempin & 1)
- temp1 |= bit;
-
- if (bit > 1)
- bit >>= 1;
- else
- {
- bit = 128;
- *out0++ = temp0;
- *out1++ = temp1;
-
- temp0 = 0;
- temp1 = 0;
- }
- }
-
- if (bit < 128)
- {
- *out0++ = temp0;
- *out1++ = temp1;
- }
-}
-
-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 tempin, bit, temp0, temp1, temp2, temp3;
-
- if (length <= 0)
- return;
- for (bit = 128, temp0 = 0, temp1 = 0, temp2 = 0, temp3 = 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;
- bit >>= 1;
- if (tempin & 8)
- temp0 |= bit;
- if (tempin & 4)
- temp1 |= bit;
- if (tempin & 2)
- temp2 |= bit;
- if (tempin & 1)
- temp3 |= bit;
-
- if (bit > 1)
- bit >>= 1;
- else
- {
- bit = 128;
- *out0++ = temp0;
- *out1++ = temp1;
- *out2++ = temp2;
- *out3++ = temp3;
-
- temp0 = 0;
- temp1 = 0;
- temp2 = 0;
- temp3 = 0;
- }
- }
-
- if (bit < 128)
- {
- *out0++ = temp0;
- *out1++ = temp1;
- *out2++ = temp2;
- *out3++ = temp3;
- }
-}
-
-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;
-
- if (length <= 0)
- return;
-
- 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
*
@@ -1750,6 +926,20 @@ allocate_linecount(int count, int ncolors)
return (retval);
}
+static stp_linebounds_t *
+allocate_linebounds(int count, int ncolors)
+{
+ int i;
+ stp_linebounds_t *retval = stp_malloc(count * sizeof(stp_linebounds_t));
+ for (i = 0; i < count; i++)
+ {
+ retval[i].ncolors = ncolors;
+ retval[i].start_pos = stp_zalloc(ncolors * sizeof(int));
+ retval[i].end_pos = stp_zalloc(ncolors * sizeof(int));
+ }
+ return (retval);
+}
+
static stp_linebufs_t *
allocate_linebuf(int count, int ncolors)
{
@@ -1775,39 +965,69 @@ allocate_linebuf(int count, int ncolors)
*
* 3) line_height < physlines
*
- * 4) phys_lines >= 2 * jets * sep
+ * 4) page_height >= 2 * jets * sep
*/
-void *
-stp_initialize_weave(int jets, /* Width of print head */
+
+static void
+stpi_destroy_weave(void *vsw)
+{
+ int i, j;
+ stpi_softweave_t *sw = (stpi_softweave_t *) vsw;
+ stp_free(sw->passes);
+ if (sw->fold_buf)
+ stp_free(sw->fold_buf);
+ if (sw->comp_buf)
+ stp_free(sw->comp_buf);
+ for (i = 0; i < STP_MAX_WEAVE; 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->linecounts[i].v);
+ stp_free(sw->linebases[i].v);
+ stp_free(sw->lineactive[i].v);
+ stp_free(sw->lineoffsets[i].v);
+ stp_free(sw->linebounds[i].start_pos);
+ stp_free(sw->linebounds[i].end_pos);
+ }
+ stp_free(sw->linecounts);
+ stp_free(sw->lineactive);
+ stp_free(sw->lineoffsets);
+ stp_free(sw->linebases);
+ stp_free(sw->linebounds);
+ stp_free(sw->head_offset);
+ stpi_destroy_weave_params(sw->weaveparm);
+ stp_free(vsw);
+}
+
+void
+stp_initialize_weave(stp_vars_t *v,
+ 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 bitwidth, /* bits/pixel */
int linewidth, /* Width of a line, in pixels */
- int lineheight, /* Number of lines that will be printed */
- 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 line_count, /* Lines that will be printed */
+ int first_line, /* First line that will be printed */
+ int page_height, /* Total height of the page in rows */
+ const int *head_offset,
+ stp_weave_strategy_t weave_strategy,
+ stp_flushfunc flushfunc,
+ stp_fillfunc fillfunc,
+ stp_packfunc pack,
+ stp_compute_linewidth_func compute_linewidth)
{
int i;
int last_line, maxHeadOffset;
- stp_softweave_t *sw = stp_zalloc(sizeof (stp_softweave_t));
+ stpi_softweave_t *sw = stp_zalloc(sizeof (stpi_softweave_t));
if (jets < 1)
jets = 1;
@@ -1818,7 +1038,6 @@ stp_initialize_weave(int jets, /* Width of print head */
if (v_subsample < 1)
v_subsample = 1;
- sw->v = v;
sw->separation = sep;
sw->jets = jets;
sw->horizontal_weave = osample;
@@ -1841,7 +1060,7 @@ stp_initialize_weave(int jets, /* Width of print head */
stp_eprintf(v, "Weave error: oversample (%d) > jets (%d)\n",
sw->oversample, jets);
stp_free(sw);
- return 0;
+ return;
}
}
else
@@ -1859,7 +1078,7 @@ stp_initialize_weave(int jets, /* Width of print head */
stp_eprintf(v, "Weave error: oversample (%d) > jets (%d)\n",
sw->oversample, jets);
stp_free(sw);
- return 0;
+ return;
}
/*
@@ -1879,11 +1098,11 @@ stp_initialize_weave(int jets, /* Width of print head */
sw->virtual_jets = sw->jets;
if (maxHeadOffset > 0)
sw->virtual_jets += (maxHeadOffset + sw->separation - 1) / sw->separation;
- last_line = first_line + lineheight - 1 + maxHeadOffset;
+ last_line = first_line + line_count - 1 + maxHeadOffset;
sw->weaveparm = initialize_weave_params(sw->separation, sw->jets,
sw->oversample, first_line, last_line,
- phys_lines, weave_strategy, v);
+ page_height, 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.
@@ -1895,25 +1114,26 @@ stp_initialize_weave(int jets, /* Width of print head */
if (sw->virtual_jets > sw->jets)
sw->vmod *= (sw->virtual_jets + sw->jets - 1) / sw->jets;
- sw->bitwidth = width;
+ sw->bitwidth = bitwidth;
sw->last_pass_offset = 0;
sw->last_pass = -1;
sw->current_vertical_subpass = 0;
sw->ncolors = ncolors;
sw->linewidth = linewidth;
- sw->vertical_height = lineheight;
+ sw->vertical_height = line_count;
sw->lineoffsets = allocate_lineoff(sw->vmod, ncolors);
sw->lineactive = allocate_lineactive(sw->vmod, ncolors);
sw->linebases = allocate_linebuf(sw->vmod, ncolors);
+ sw->linebounds = allocate_linebounds(sw->vmod, ncolors);
sw->passes = stp_zalloc(sw->vmod * sizeof(stp_pass_t));
sw->linecounts = allocate_linecount(sw->vmod, ncolors);
sw->rcache = -2;
sw->vcache = -2;
- sw->fill_start = fill_start;
+ sw->fillfunc = fillfunc;
sw->compute_linewidth = compute_linewidth;
sw->pack = pack;
sw->horizontal_width =
- (sw->compute_linewidth)(sw, ((sw->linewidth + sw->horizontal_weave - 1) /
+ (sw->compute_linewidth)(v, ((sw->linewidth + sw->horizontal_weave - 1) /
sw->horizontal_weave));
sw->horizontal_width = ((sw->horizontal_width + 7) / 8);
@@ -1926,46 +1146,13 @@ stp_initialize_weave(int jets, /* Width of print head */
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->passes);
- if (sw->fold_buf)
- stp_free(sw->fold_buf);
- if (sw->comp_buf)
- stp_free(sw->comp_buf);
- for (i = 0; i < MAX_WEAVE; 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->linecounts[i].v);
- stp_free(sw->linebases[i].v);
- stp_free(sw->lineactive[i].v);
- stp_free(sw->lineoffsets[i].v);
- }
- stp_free(sw->linecounts);
- stp_free(sw->lineactive);
- stp_free(sw->lineoffsets);
- stp_free(sw->linebases);
- stp_free(sw->head_offset);
- stp_destroy_weave_params(sw->weaveparm);
- stp_free(vsw);
+ stp_allocate_component_data(v, "Weave", NULL, stpi_destroy_weave, sw);
+ return;
}
static void
-weave_parameters_by_row(const stp_softweave_t *sw, int row,
- int vertical_subpass, stp_weave_t *w)
+weave_parameters_by_row(const stp_vars_t *v, const stpi_softweave_t *sw,
+ int row, int vertical_subpass, stp_weave_t *w)
{
int jetsused;
int sub_repeat_count = vertical_subpass % sw->repeat_count;
@@ -1973,7 +1160,7 @@ weave_parameters_by_row(const stp_softweave_t *sw, int row,
* 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;
+ stpi_softweave_t *wsw = (stpi_softweave_t *) sw;
vertical_subpass /= sw->repeat_count;
if (sw->rcache == row && sw->vcache == vertical_subpass)
@@ -1986,105 +1173,131 @@ weave_parameters_by_row(const stp_softweave_t *sw, int 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);
+ stpi_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 "
+ stp_dprintf(STP_DBG_WEAVE_PARAMS, 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)
+stp_weave_parameters_by_row(const stp_vars_t *v, int row,
+ int vertical_subpass, stp_weave_t *w)
{
- weave_parameters_by_row(sw, row, vertical_subpass, w);
+ const stpi_softweave_t *sw =
+ (stpi_softweave_t *) stp_get_component_data(v, "Weave");
+ weave_parameters_by_row(v, sw, row, vertical_subpass, w);
}
static stp_lineoff_t *
-stp_get_lineoffsets(const stp_softweave_t *sw, int row, int subpass, int offset)
+stpi_get_lineoffsets(const stp_vars_t *v, const stpi_softweave_t *sw,
+ int row, int subpass, int offset)
{
stp_weave_t w;
- weave_parameters_by_row(sw, row + offset, subpass, &w);
+ weave_parameters_by_row(v, 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)
+stpi_get_lineactive(const stp_vars_t *v, const stpi_softweave_t *sw,
+ int row, int subpass, int offset)
{
stp_weave_t w;
- weave_parameters_by_row(sw, row + offset, subpass, &w);
+ weave_parameters_by_row(v, 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)
+stpi_get_linecount(const stp_vars_t *v, const stpi_softweave_t *sw,
+ int row, int subpass, int offset)
{
stp_weave_t w;
- weave_parameters_by_row(sw, row + offset, subpass, &w);
+ weave_parameters_by_row(v, 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)
+static stp_linebufs_t *
+stpi_get_linebases(const stp_vars_t *v, const stpi_softweave_t *sw,
+ int row, int subpass, int offset)
{
stp_weave_t w;
- weave_parameters_by_row(sw, row + offset, subpass, &w);
+ weave_parameters_by_row(v, sw, row + offset, subpass, &w);
return &(sw->linebases[w.pass % sw->vmod]);
}
+static stp_linebounds_t *
+stpi_get_linebounds(const stp_vars_t *v, const stpi_softweave_t *sw,
+ int row, int subpass, int offset)
+{
+ stp_weave_t w;
+ weave_parameters_by_row(v, sw, row + offset, subpass, &w);
+ return &(sw->linebounds[w.pass % sw->vmod]);
+}
+
static stp_pass_t *
-stp_get_pass_by_row(const stp_softweave_t *sw, int row, int subpass,int offset)
+stpi_get_pass_by_row(stp_vars_t *v, const stpi_softweave_t *sw,
+ int row, int subpass,int offset)
{
stp_weave_t w;
- weave_parameters_by_row(sw, row + offset, subpass, &w);
+ weave_parameters_by_row(v, 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)
+stp_get_lineoffsets_by_pass(const stp_vars_t *v, int pass)
{
+ const stpi_softweave_t *sw =
+ (stpi_softweave_t *) stp_get_component_data(v, "Weave");
return &(sw->lineoffsets[pass % sw->vmod]);
}
stp_lineactive_t *
-stp_get_lineactive_by_pass(const stp_softweave_t *sw, int pass)
+stp_get_lineactive_by_pass(const stp_vars_t *v, int pass)
{
+ const stpi_softweave_t *sw =
+ (stpi_softweave_t *) stp_get_component_data(v, "Weave");
return &(sw->lineactive[pass % sw->vmod]);
}
stp_linecount_t *
-stp_get_linecount_by_pass(const stp_softweave_t *sw, int pass)
+stp_get_linecount_by_pass(const stp_vars_t *v, int pass)
{
+ const stpi_softweave_t *sw =
+ (stpi_softweave_t *) stp_get_component_data(v, "Weave");
return &(sw->linecounts[pass % sw->vmod]);
}
const stp_linebufs_t *
-stp_get_linebases_by_pass(const stp_softweave_t *sw, int pass)
+stp_get_linebases_by_pass(const stp_vars_t *v, int pass)
{
+ const stpi_softweave_t *sw =
+ (stpi_softweave_t *) stp_get_component_data(v, "Weave");
return &(sw->linebases[pass % sw->vmod]);
}
stp_pass_t *
-stp_get_pass_by_pass(const stp_softweave_t *sw, int pass)
+stp_get_pass_by_pass(const stp_vars_t *v, int pass)
{
+ const stpi_softweave_t *sw =
+ (stpi_softweave_t *) stp_get_component_data(v, "Weave");
return &(sw->passes[pass % sw->vmod]);
}
static void
-check_linebases(stp_softweave_t *sw, int row, int cpass, int head_offset,
- int color)
+check_linebases(stp_vars_t *v, const stpi_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);
+ (stp_linebufs_t *) stpi_get_linebases(v, sw, row, cpass, head_offset);
if (!(bufs[0].v[color]))
bufs[0].v[color] =
stp_zalloc (sw->virtual_jets * sw->bitwidth * sw->horizontal_width);
@@ -2101,9 +1314,11 @@ check_linebases(stp_softweave_t *sw, int row, int cpass, int head_offset,
*/
void
-stp_fill_tiff(stp_softweave_t *sw, int row, int subpass,
+stp_fill_tiff(stp_vars_t *v, int row, int subpass,
int width, int missingstartrows, int color)
{
+ stpi_softweave_t *sw =
+ (stpi_softweave_t *) stp_get_component_data(v, "Weave");
stp_lineoff_t *lineoffs;
stp_linecount_t *linecount;
const stp_linebufs_t *bufs;
@@ -2117,7 +1332,7 @@ stp_fill_tiff(stp_softweave_t *sw, int row, int subpass,
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]);
+ bufs = stpi_get_linebases(v, sw, row, subpass, sw->head_offset[color]);
while (l < full_blocks)
{
@@ -2140,23 +1355,25 @@ stp_fill_tiff(stp_softweave_t *sw, int row, int subpass,
}
}
- lineoffs = stp_get_lineoffsets(sw, row, subpass, sw->head_offset[color]);
- linecount = stp_get_linecount(sw, row, subpass, sw->head_offset[color]);
+ lineoffs = stpi_get_lineoffsets(v, sw, row, subpass, sw->head_offset[color]);
+ linecount = stpi_get_linecount(v, 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,
+stp_fill_uncompressed(stp_vars_t *v, int row, int subpass,
int width, int missingstartrows, int color)
{
+ stpi_softweave_t *sw =
+ (stpi_softweave_t *) stp_get_component_data(v, "Weave");
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]);
+ bufs = stpi_get_linebases(v, sw, row, subpass, sw->head_offset[color]);
+ lineoffs = stpi_get_lineoffsets(v, sw, row, subpass, sw->head_offset[color]);
+ linecount = stpi_get_linecount(v, sw, row, subpass, sw->head_offset[color]);
width *= sw->bitwidth * missingstartrows;
memset(bufs[0].v[color], 0, width);
lineoffs[0].v[color] = width;
@@ -2164,7 +1381,7 @@ stp_fill_uncompressed(stp_softweave_t *sw, int row, int subpass,
}
int
-stp_compute_tiff_linewidth(const stp_softweave_t *sw, int n)
+stp_compute_tiff_linewidth(stp_vars_t *v, int n)
{
/*
* It's possible for the "compression" to actually expand the line by
@@ -2174,14 +1391,14 @@ stp_compute_tiff_linewidth(const stp_softweave_t *sw, int n)
}
int
-stp_compute_uncompressed_linewidth(const stp_softweave_t *sw, int n)
+stp_compute_uncompressed_linewidth(stp_vars_t *v, int n)
{
return (8 * ((n + 7) / 8));
}
static void
-initialize_row(stp_softweave_t *sw, int row, int width,
- unsigned char *const cols[])
+initialize_row(stp_vars_t *v, stpi_softweave_t *sw,
+ int row, int width, unsigned char *const cols[])
{
stp_weave_t w;
int i, j, jj;
@@ -2194,14 +1411,16 @@ initialize_row(stp_softweave_t *sw, int row, int width,
if (cols[j])
{
stp_lineoff_t *lineoffs =
- stp_get_lineoffsets(sw, row, i, sw->head_offset[j]);
+ stpi_get_lineoffsets(v, sw, row, i, sw->head_offset[j]);
stp_lineactive_t *lineactive =
- stp_get_lineactive(sw, row, i, sw->head_offset[j]);
+ stpi_get_lineactive(v, 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]);
+ stpi_get_linecount(v, sw, row, i, sw->head_offset[j]);
+ stp_linebounds_t *linebounds =
+ stpi_get_linebounds(v, sw, row, i, sw->head_offset[j]);
+ check_linebases(v, sw, row, i, sw->head_offset[j], j);
+ weave_parameters_by_row(v, sw, row+sw->head_offset[j], i, &w);
+ pass = stpi_get_pass_by_row(v, sw, row, i, sw->head_offset[j]);
/* initialize pass if not initialized yet */
if (pass->pass < 0)
@@ -2216,24 +1435,24 @@ initialize_row(stp_softweave_t *sw, int row, int width,
for(jj=0; jj<sw->ncolors; jj++)
{
if (lineoffs[0].v[jj] != 0)
- stp_eprintf(sw->v,
- "WARNING: pass %d subpass %d row %d: "
+ stp_eprintf(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: "
+ stp_eprintf(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;
+ linebounds[0].start_pos[jj] = INT_MAX;
+ linebounds[0].end_pos[jj] = -1;
}
}
if((linecount[0].v[j] == 0) && (w.jet > 0))
{
- (sw->fill_start)(sw, row, i, width, w.jet, j);
+ (sw->fillfunc)(v, row, i, width, w.jet, j);
}
}
}
@@ -2241,19 +1460,25 @@ initialize_row(stp_softweave_t *sw, int row, int width,
}
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)
+add_to_row(stp_vars_t *v, stpi_softweave_t *sw, int row, unsigned char *buf,
+ size_t nbytes, int color, int setactive, int h_pass)
{
+ const stp_linebufs_t *bufs =
+ stpi_get_linebases(v, sw, sw->lineno, h_pass, sw->head_offset[color]);
+ stp_lineoff_t *lineoffs =
+ stpi_get_lineoffsets(v, sw, sw->lineno, h_pass, sw->head_offset[color]);
+ stp_lineactive_t *lineactive =
+ stpi_get_lineactive(v, sw, sw->lineno, h_pass, sw->head_offset[color]);
+ stp_linecount_t *linecount =
+ stpi_get_linecount(v, sw, sw->lineno, h_pass, sw->head_offset[color]);
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",
+ stp_eprintf(v, "Buffer overflow: limit %d, actual %d, count %d\n",
sw->virtual_jets * sw->bitwidth * sw->horizontal_width,
place + nbytes, count);
- exit(1);
+ stp_abort();
}
memcpy(bufs[0].v[color] + lineoffs[0].v[color], buf, nbytes);
lineoffs[0].v[color] += nbytes;
@@ -2262,49 +1487,38 @@ add_to_row(stp_softweave_t *sw, int row, unsigned char *buf, size_t nbytes,
}
static void
-stp_flush(void *vsw, int model, int width, int hoffset,
- int ydpi, int xdpi, int physical_xdpi)
+stpi_flush_passes(stp_vars_t *v, int flushall)
{
- stp_softweave_t *sw = (stp_softweave_t *) vsw;
+ stpi_softweave_t *sw =
+ (stpi_softweave_t *) stp_get_component_data(v, "Weave");
while (1)
{
- stp_pass_t *pass = stp_get_pass_by_pass(sw, sw->last_pass + 1);
+ stp_pass_t *pass = stp_get_pass_by_pass(v, 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)
+ if (pass->pass < 0 || (!flushall && pass->physpassend >= sw->lineno))
return;
- (sw->flushfunc)(sw, pass->pass, model, width, hoffset, ydpi, xdpi,
- physical_xdpi, pass->subpass);
+ (sw->flushfunc)(v, pass->pass, pass->subpass);
+ sw->last_pass = pass->pass;
+ pass->pass = -1;
}
}
void
-stp_flush_all(void *vsw, int model, int width, int hoffset,
- int ydpi, int xdpi, int physical_xdpi)
+stp_flush_all(stp_vars_t *v)
{
- 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);
- }
+ stpi_flush_passes(v, 1);
}
static void
-finalize_row(stp_softweave_t *sw, int row, int model, int width,
- int hoffset, int ydpi, int xdpi, int physical_xdpi)
+finalize_row(stp_vars_t *v, int row)
{
+ stpi_softweave_t *sw =
+ (stpi_softweave_t *) stp_get_component_data(v, "Weave");
int i,j;
- stp_dprintf(STP_DBG_ROWS, sw->v, "Finalizing row %d...\n", row);
+ stp_dprintf(STP_DBG_ROWS, v, "Finalizing row %d...\n", row);
for (i = 0; i < sw->oversample; i++)
{
stp_weave_t w;
@@ -2312,37 +1526,32 @@ finalize_row(stp_softweave_t *sw, int row, int model, int width,
for(j=0; j<sw->ncolors; j++)
{
- lines = stp_get_linecount(sw, row, i, sw->head_offset[j]);
- lines[0].v[j]++;
+ lines = stpi_get_linecount(v, sw, row, i, sw->head_offset[j]);
+ lines[0].v[j]++;
}
- weave_parameters_by_row(sw, row, i, &w);
+ weave_parameters_by_row(v, 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",
+ stp_dprintf(STP_DBG_ROWS, 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);
- }
+ stpi_flush_passes(v, 0);
+ }
}
}
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,
- unsigned char *const cols[])
+stp_write_weave(stp_vars_t *v, unsigned char *const 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];
+ stpi_softweave_t *sw =
+ (stpi_softweave_t *) stp_get_component_data(v, "Weave");
+ int length = (sw->linewidth + 7) / 8;
+ stp_lineoff_t *lineoffs[STP_MAX_WEAVE];
+ stp_lineactive_t *lineactives[STP_MAX_WEAVE];
+ stp_linecount_t *linecounts[STP_MAX_WEAVE];
+ stp_linebounds_t *linebounds[STP_MAX_WEAVE];
+ const stp_linebufs_t *bufs[STP_MAX_WEAVE];
int xlength = (length + sw->horizontal_weave - 1) / sw->horizontal_weave;
int ylength = xlength * sw->horizontal_weave;
unsigned char *comp_ptr;
@@ -2354,30 +1563,36 @@ stp_write_weave(void * vsw,
if (!sw->fold_buf)
sw->fold_buf = stp_zalloc(sw->bitwidth * ylength);
if (!sw->comp_buf)
- sw->comp_buf = stp_zalloc(sw->bitwidth *(sw->compute_linewidth)(sw,ylength));
+ sw->comp_buf = stp_zalloc(sw->bitwidth *
+ (sw->compute_linewidth)(v,ylength));
if (sw->current_vertical_subpass == 0)
- initialize_row(sw, sw->lineno, xlength, cols);
+ initialize_row(v, sw, sw->lineno, xlength, cols);
for (j = 0; j < sw->ncolors; j++)
{
if (cols[j])
{
- const unsigned char *in;
+ const unsigned char *in;
+ int idx;
- for (i = 0; i < h_passes; i++)
- {
- if (!sw->s[i])
- sw->s[i] = stp_zalloc(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]);
- }
+ for (i = 0; i < h_passes; i++)
+ {
+ int offset = sw->head_offset[j];
+ int pass = cpass + i;
+ if (!sw->s[i])
+ sw->s[i] = stp_zalloc(sw->bitwidth *
+ (sw->compute_linewidth)(v, ylength));
+ lineoffs[i] =
+ stpi_get_lineoffsets(v, sw, sw->lineno, pass, offset);
+ linecounts[i] =
+ stpi_get_linecount(v, sw, sw->lineno, pass, offset);
+ lineactives[i] =
+ stpi_get_lineactive(v, sw, sw->lineno, pass,offset);
+ linebounds[i] =
+ stpi_get_linebounds(v, sw, sw->lineno, pass, offset);
+ bufs[i] =
+ stpi_get_linebases(v, sw, sw->lineno, pass, offset);
+ }
if (sw->bitwidth == 2)
{
@@ -2386,89 +1601,89 @@ stp_write_weave(void * vsw,
}
else
in = cols[j];
- if (h_passes > 1)
+ switch (sw->horizontal_weave)
{
- 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]);
- }
+ case 1:
+ memcpy(sw->s[0], in, length * sw->bitwidth);
+ break;
+ 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;
+ case 16:
+ stp_unpack_16(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],
+ sw->s[8], sw->s[9], sw->s[10], sw->s[11],
+ sw->s[12], sw->s[13], sw->s[14], sw->s[15]);
+ break;
}
- else
+ switch (sw->vertical_subpasses)
+ {
+ case 4:
+ for (idx = 0; idx < sw->horizontal_weave; idx++)
+ stp_split_4(length, sw->bitwidth, sw->s[idx], sw->s[idx],
+ sw->s[idx + sw->horizontal_weave],
+ sw->s[idx + sw->horizontal_weave * 2],
+ sw->s[idx + sw->horizontal_weave * 3]);
+ break;
+ case 2:
+ for (idx = 0; idx < sw->horizontal_weave; idx++)
+ stp_split_2(length, sw->bitwidth, sw->s[idx], sw->s[idx],
+ sw->s[idx + sw->horizontal_weave]);
+ 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)(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]);
+ int first, last;
+ setactive = (sw->pack)(v, sw->s[i], sw->bitwidth * xlength,
+ sw->comp_buf, &comp_ptr, &first, &last);
+ if (first < linebounds[i]->start_pos[j])
+ linebounds[i]->start_pos[j] = first;
+ if (last > linebounds[i]->end_pos[j])
+ linebounds[i]->end_pos[j] = last;
+ add_to_row(v, sw, sw->lineno, sw->comp_buf,
+ comp_ptr - sw->comp_buf, j, setactive, cpass + i);
}
}
}
sw->current_vertical_subpass++;
if (sw->current_vertical_subpass >= sw->vertical_oversample)
{
- finalize_row(sw, sw->lineno, model, width, offset, ydpi, xdpi,
- physical_xdpi);
+ finalize_row(v, sw->lineno);
sw->lineno++;
sw->current_vertical_subpass = 0;
}
}
+#if 0
+#define TEST_RAW
+#endif
+#if 0
+#define TEST_COOKED
+#endif
+#if 0
+#define ACCUMULATE
+#endif
+
+#if defined(TEST_RAW) || defined(TEST_COOKED)
+#define TEST
+#endif
+
+#ifdef TEST
+#define MAXCOLLECT (1000)
+#endif
+
#ifdef TEST_COOKED
static void
calculate_pass_parameters(cooked_t *w, /* I - weave parameters */
@@ -2614,7 +1829,7 @@ main(int ac, char *av[])
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;
+ stp_weave_strategy_t strategy =ac>7 ? atoi(av[7]) : 1;
cooked_t *weave;
int passes;
diff --git a/src/main/printers.c b/src/main/printers.c
new file mode 100644
index 0000000..e2f0f2e
--- /dev/null
+++ b/src/main/printers.c
@@ -0,0 +1,1073 @@
+/*
+ * "$Id: printers.c,v 1.75 2005/04/16 03:02:08 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 <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <math.h>
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#include <string.h>
+#include <stdlib.h>
+
+#define FMIN(a, b) ((a) < (b) ? (a) : (b))
+
+
+static void stpi_printer_freefunc(void *item);
+static const char* stpi_printer_namefunc(const void *item);
+static const char* stpi_printer_long_namefunc(const void *item);
+
+static stp_list_t *printer_list = NULL;
+
+struct stp_printer
+{
+ const char *driver;
+ char *long_name; /* Long name for UI */
+ char *family; /* Printer family */
+ char *manufacturer; /* Printer manufacturer */
+ int model; /* Model number */
+ const stp_printfuncs_t *printfuncs;
+ stp_vars_t *printvars;
+};
+
+static int
+stpi_init_printer_list(void)
+{
+ if(printer_list)
+ stp_list_destroy(printer_list);
+ printer_list = stp_list_create();
+ stp_list_set_freefunc(printer_list, stpi_printer_freefunc);
+ stp_list_set_namefunc(printer_list, stpi_printer_namefunc);
+ stp_list_set_long_namefunc(printer_list, stpi_printer_long_namefunc);
+ /* stp_list_set_sortfunc(printer_list, stpi_printer_sortfunc); */
+
+ return 0;
+}
+
+int
+stp_printer_model_count(void)
+{
+ if (printer_list == NULL)
+ {
+ stp_erprintf("No printer drivers found: "
+ "are STP_DATA_PATH and STP_MODULE_PATH correct?\n");
+ stpi_init_printer_list();
+ }
+ return stp_list_get_length(printer_list);
+}
+
+static void
+null_printer(void)
+{
+ stp_erprintf("Null stp_printer_t! Please report this bug.\n");
+ stp_abort();
+}
+
+static inline void
+check_printer(const stp_printer_t *p)
+{
+ if (p == NULL)
+ null_printer();
+}
+
+const stp_printer_t *
+stp_get_printer_by_index(int idx)
+{
+ stp_list_item_t *printer;
+ if (printer_list == NULL)
+ {
+ stp_erprintf("No printer drivers found: "
+ "are STP_DATA_PATH and STP_MODULE_PATH correct?\n");
+ stpi_init_printer_list();
+ }
+ printer = stp_list_get_item_by_index(printer_list, idx);
+ if (printer == NULL)
+ return NULL;
+ return (const stp_printer_t *) stp_list_item_get_data(printer);
+}
+
+static void
+stpi_printer_freefunc(void *item)
+{
+ stp_printer_t *printer = (stp_printer_t *) item;
+ stp_free(printer->long_name);
+ stp_free(printer->family);
+ stp_free(printer);
+}
+
+const char *
+stp_printer_get_driver(const stp_printer_t *printer)
+{
+ return printer->driver;
+}
+
+static const char *
+stpi_printer_namefunc(const void *item)
+{
+ const stp_printer_t *printer = (const stp_printer_t *) item;
+ return printer->driver;
+}
+
+const char *
+stp_printer_get_long_name(const stp_printer_t *printer)
+{
+ return printer->long_name;
+}
+
+static const char *
+stpi_printer_long_namefunc(const void *item)
+{
+ const stp_printer_t *printer = (const stp_printer_t *) item;
+ return printer->long_name;
+}
+
+const char *
+stp_printer_get_family(const stp_printer_t *printer)
+{
+ return printer->family;
+}
+
+const char *
+stp_printer_get_manufacturer(const stp_printer_t *printer)
+{
+ return printer->manufacturer;
+}
+
+int
+stp_printer_get_model(const stp_printer_t *printer)
+{
+ return printer->model;
+}
+
+static inline const stp_printfuncs_t *
+stpi_get_printfuncs(const stp_printer_t *printer)
+{
+ return printer->printfuncs;
+}
+
+const stp_vars_t *
+stp_printer_get_defaults(const stp_printer_t *printer)
+{
+ return printer->printvars;
+}
+
+
+const stp_printer_t *
+stp_get_printer_by_long_name(const char *long_name)
+{
+ stp_list_item_t *printer_item;
+ if (printer_list == NULL)
+ {
+ stp_erprintf("No printer drivers found: "
+ "are STP_DATA_PATH and STP_MODULE_PATH correct?\n");
+ stpi_init_printer_list();
+ }
+ printer_item = stp_list_get_item_by_long_name(printer_list, long_name);
+ if (!printer_item)
+ return NULL;
+ return (const stp_printer_t *) stp_list_item_get_data(printer_item);
+}
+
+const stp_printer_t *
+stp_get_printer_by_driver(const char *driver)
+{
+ stp_list_item_t *printer_item;
+ if (printer_list == NULL)
+ {
+ stp_erprintf("No printer drivers found: "
+ "are STP_DATA_PATH and STP_MODULE_PATH correct?\n");
+ stpi_init_printer_list();
+ }
+ printer_item = stp_list_get_item_by_name(printer_list, driver);
+ if (!printer_item)
+ return NULL;
+ return (const stp_printer_t *) stp_list_item_get_data(printer_item);
+}
+
+int
+stp_get_printer_index_by_driver(const char *driver)
+{
+ /* There should be no need to ever know the index! */
+ int idx = 0;
+ for (idx = 0; idx < stp_printer_model_count(); idx++)
+ {
+ const stp_printer_t *printer = stp_get_printer_by_index(idx);
+ if (!strcmp(stp_printer_get_driver(printer), driver))
+ return idx;
+ }
+ return -1;
+}
+
+const stp_printer_t *
+stp_get_printer(const stp_vars_t *v)
+{
+ return stp_get_printer_by_driver(stp_get_driver(v));
+}
+
+int
+stp_get_model_id(const stp_vars_t *v)
+{
+ const stp_printer_t *printer = stp_get_printer_by_driver(stp_get_driver(v));
+ return printer->model;
+}
+
+stp_parameter_list_t
+stp_printer_list_parameters(const stp_vars_t *v)
+{
+ const stp_printfuncs_t *printfuncs =
+ stpi_get_printfuncs(stp_get_printer(v));
+ return (printfuncs->list_parameters)(v);
+}
+
+void
+stp_printer_describe_parameter(const stp_vars_t *v, const char *name,
+ stp_parameter_t *description)
+{
+ const stp_printfuncs_t *printfuncs =
+ stpi_get_printfuncs(stp_get_printer(v));
+ (printfuncs->parameters)(v, name, description);
+}
+
+static void
+set_printer_defaults(stp_vars_t *v, int core_only)
+{
+ stp_parameter_list_t *params;
+ int count;
+ int i;
+ stp_parameter_t desc;
+ params = stp_get_parameter_list(v);
+ count = stp_parameter_list_count(params);
+ for (i = 0; i < count; i++)
+ {
+ const stp_parameter_t *p = stp_parameter_list_param(params, i);
+ if (p->is_mandatory &&
+ (!core_only || p->p_class == STP_PARAMETER_CLASS_CORE))
+ {
+ stp_describe_parameter(v, p->name, &desc);
+ switch (p->p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ stp_set_string_parameter(v, p->name, desc.deflt.str);
+ stp_set_string_parameter_active(v, p->name, STP_PARAMETER_ACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_DOUBLE:
+ stp_set_float_parameter(v, p->name, desc.deflt.dbl);
+ stp_set_float_parameter_active(v, p->name, STP_PARAMETER_ACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_INT:
+ stp_set_int_parameter(v, p->name, desc.deflt.integer);
+ stp_set_int_parameter_active(v, p->name, STP_PARAMETER_ACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_DIMENSION:
+ stp_set_dimension_parameter(v, p->name, desc.deflt.dimension);
+ stp_set_dimension_parameter_active(v, p->name, STP_PARAMETER_ACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ stp_set_boolean_parameter(v, p->name, desc.deflt.boolean);
+ stp_set_boolean_parameter_active(v, p->name, STP_PARAMETER_ACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_CURVE:
+ stp_set_curve_parameter(v, p->name, desc.deflt.curve);
+ stp_set_curve_parameter_active(v, p->name, STP_PARAMETER_ACTIVE);
+ break;
+ case STP_PARAMETER_TYPE_ARRAY:
+ stp_set_array_parameter(v, p->name, desc.deflt.array);
+ stp_set_array_parameter_active(v, p->name, STP_PARAMETER_ACTIVE);
+ break;
+ default:
+ break;
+ }
+ stp_parameter_description_destroy(&desc);
+ }
+ }
+ stp_parameter_list_destroy(params);
+}
+
+void
+stp_set_printer_defaults(stp_vars_t *v, const stp_printer_t *printer)
+{
+ stp_set_driver(v, stp_printer_get_driver(printer));
+ set_printer_defaults(v, 0);
+}
+
+void
+stp_initialize_printer_defaults(void)
+{
+ stp_list_item_t *printer_item;
+ if (printer_list == NULL)
+ {
+ stpi_init_printer_list();
+ stp_deprintf
+ (STP_DBG_PRINTERS,
+ "stpi_family_register(): initialising printer_list...\n");
+ }
+ printer_item = stp_list_get_start(printer_list);
+ while (printer_item)
+ {
+ set_printer_defaults
+ (((stp_printer_t *)(stp_list_item_get_data(printer_item)))->printvars, 1);
+ printer_item = stp_list_item_next(printer_item);
+ }
+}
+
+void
+stp_get_media_size(const stp_vars_t *v, int *width, int *height)
+{
+ const stp_printfuncs_t *printfuncs =
+ stpi_get_printfuncs(stp_get_printer(v));
+ (printfuncs->media_size)(v, width, height);
+}
+
+void
+stp_get_imageable_area(const stp_vars_t *v,
+ int *left, int *right, int *bottom, int *top)
+{
+ const stp_printfuncs_t *printfuncs =
+ stpi_get_printfuncs(stp_get_printer(v));
+ (printfuncs->imageable_area)(v, left, right, bottom, top);
+}
+
+void
+stp_get_size_limit(const stp_vars_t *v, int *max_width, int *max_height,
+ int *min_width, int *min_height)
+{
+ const stp_printfuncs_t *printfuncs =
+ stpi_get_printfuncs(stp_get_printer(v));
+ (printfuncs->limit)(v, max_width, max_height, min_width,min_height);
+}
+
+void
+stp_describe_resolution(const stp_vars_t *v, int *x, int *y)
+{
+ const stp_printfuncs_t *printfuncs =
+ stpi_get_printfuncs(stp_get_printer(v));
+ (printfuncs->describe_resolution)(v, x, y);
+}
+
+const char *
+stp_describe_output(const stp_vars_t *v)
+{
+ const stp_printfuncs_t *printfuncs =
+ stpi_get_printfuncs(stp_get_printer(v));
+ return (printfuncs->describe_output)(v);
+}
+
+int
+stp_verify(stp_vars_t *v)
+{
+ const stp_printfuncs_t *printfuncs =
+ stpi_get_printfuncs(stp_get_printer(v));
+ stp_vars_t *nv = stp_vars_create_copy(v);
+ int status;
+ stp_prune_inactive_options(nv);
+ status = (printfuncs->verify)(nv);
+ stp_set_verified(v, stp_get_verified(nv));
+ stp_vars_destroy(nv);
+ return status;
+}
+
+int
+stp_print(const stp_vars_t *v, stp_image_t *image)
+{
+ const stp_printfuncs_t *printfuncs =
+ stpi_get_printfuncs(stp_get_printer(v));
+ return (printfuncs->print)(v, image);
+}
+
+int
+stp_start_job(const stp_vars_t *v, stp_image_t *image)
+{
+ const stp_printfuncs_t *printfuncs =
+ stpi_get_printfuncs(stp_get_printer(v));
+ if (!stp_get_string_parameter(v, "JobMode") ||
+ strcmp(stp_get_string_parameter(v, "JobMode"), "Page") == 0)
+ return 1;
+ if (printfuncs->start_job)
+ return (printfuncs->start_job)(v, image);
+ else
+ return 1;
+}
+
+int
+stp_end_job(const stp_vars_t *v, stp_image_t *image)
+{
+ const stp_printfuncs_t *printfuncs =
+ stpi_get_printfuncs(stp_get_printer(v));
+ if (!stp_get_string_parameter(v, "JobMode") ||
+ strcmp(stp_get_string_parameter(v, "JobMode"), "Page") == 0)
+ return 1;
+ if (printfuncs->end_job)
+ return (printfuncs->end_job)(v, image);
+ else
+ return 1;
+}
+
+static int
+verify_string_param(const stp_vars_t *v, const char *parameter,
+ stp_parameter_t *desc, int quiet)
+{
+ stp_parameter_verify_t answer = PARAMETER_OK;
+ stp_dprintf(STP_DBG_VARS, v, " Verifying string %s\n", parameter);
+ if (desc->is_mandatory ||
+ stp_check_string_parameter(v, parameter, STP_PARAMETER_ACTIVE))
+ {
+ const char *checkval = stp_get_string_parameter(v, parameter);
+ stp_string_list_t *vptr = desc->bounds.str;
+ size_t count = 0;
+ int i;
+ stp_dprintf(STP_DBG_VARS, v, " value %s\n",
+ checkval ? checkval : "(null)");
+ if (vptr)
+ count = stp_string_list_count(vptr);
+ answer = PARAMETER_BAD;
+ if (checkval == NULL)
+ {
+ if (count == 0)
+ answer = PARAMETER_OK;
+ else
+ {
+ if (!quiet)
+ stp_eprintf(v, _("Value must be set for %s\n"), parameter);
+ answer = PARAMETER_BAD;
+ }
+ }
+ else if (count > 0)
+ {
+ for (i = 0; i < count; i++)
+ if (!strcmp(checkval, stp_string_list_param(vptr, i)->name))
+ {
+ answer = PARAMETER_OK;
+ break;
+ }
+ if (!answer && !quiet)
+ stp_eprintf(v, _("`%s' is not a valid %s\n"), checkval, parameter);
+ }
+ else if (strlen(checkval) == 0)
+ answer = PARAMETER_OK;
+ else if (!quiet)
+ stp_eprintf(v, _("`%s' is not a valid %s\n"), checkval, parameter);
+ }
+ stp_parameter_description_destroy(desc);
+ return answer;
+}
+
+static int
+verify_double_param(const stp_vars_t *v, const char *parameter,
+ stp_parameter_t *desc, int quiet)
+{
+ stp_dprintf(STP_DBG_VARS, v, " Verifying double %s\n", parameter);
+ if (desc->is_mandatory ||
+ stp_check_float_parameter(v, parameter, STP_PARAMETER_ACTIVE))
+ {
+ double checkval = stp_get_float_parameter(v, parameter);
+ if (checkval < desc->bounds.dbl.lower ||
+ checkval > desc->bounds.dbl.upper)
+ {
+ if (!quiet)
+ stp_eprintf(v, _("%s must be between %f and %f (is %f)\n"),
+ parameter, desc->bounds.dbl.lower,
+ desc->bounds.dbl.upper, checkval);
+ return PARAMETER_BAD;
+ }
+ }
+ return PARAMETER_OK;
+}
+
+static int
+verify_int_param(const stp_vars_t *v, const char *parameter,
+ stp_parameter_t *desc, int quiet)
+{
+ stp_dprintf(STP_DBG_VARS, v, " Verifying int %s\n", parameter);
+ if (desc->is_mandatory ||
+ stp_check_int_parameter(v, parameter, STP_PARAMETER_ACTIVE))
+ {
+ int checkval = stp_get_int_parameter(v, parameter);
+ if (checkval < desc->bounds.integer.lower ||
+ checkval > desc->bounds.integer.upper)
+ {
+ if (!quiet)
+ stp_eprintf(v, _("%s must be between %d and %d (is %d)\n"),
+ parameter, desc->bounds.integer.lower,
+ desc->bounds.integer.upper, checkval);
+ stp_parameter_description_destroy(desc);
+ return PARAMETER_BAD;
+ }
+ }
+ stp_parameter_description_destroy(desc);
+ return PARAMETER_OK;
+}
+
+static int
+verify_dimension_param(const stp_vars_t *v, const char *parameter,
+ stp_parameter_t *desc, int quiet)
+{
+ stp_dprintf(STP_DBG_VARS, v, " Verifying dimension %s\n", parameter);
+ if (desc->is_mandatory ||
+ stp_check_dimension_parameter(v, parameter, STP_PARAMETER_ACTIVE))
+ {
+ int checkval = stp_get_dimension_parameter(v, parameter);
+ if (checkval < desc->bounds.dimension.lower ||
+ checkval > desc->bounds.dimension.upper)
+ {
+ if (!quiet)
+ stp_eprintf(v, _("%s must be between %d and %d (is %d)\n"),
+ parameter, desc->bounds.dimension.lower,
+ desc->bounds.dimension.upper, checkval);
+ stp_parameter_description_destroy(desc);
+ return PARAMETER_BAD;
+ }
+ }
+ stp_parameter_description_destroy(desc);
+ return PARAMETER_OK;
+}
+
+static int
+verify_curve_param(const stp_vars_t *v, const char *parameter,
+ stp_parameter_t *desc, int quiet)
+{
+ stp_parameter_verify_t answer = 1;
+ stp_dprintf(STP_DBG_VARS, v, " Verifying curve %s\n", parameter);
+ if (desc->bounds.curve &&
+ (desc->is_mandatory ||
+ stp_check_curve_parameter(v, parameter, STP_PARAMETER_ACTIVE)))
+ {
+ const stp_curve_t *checkval = stp_get_curve_parameter(v, parameter);
+ if (checkval)
+ {
+ double u0, l0;
+ double u1, l1;
+ stp_curve_get_bounds(checkval, &l0, &u0);
+ stp_curve_get_bounds(desc->bounds.curve, &l1, &u1);
+ if (u0 > u1 || l0 < l1)
+ {
+ if (!quiet)
+ stp_eprintf(v, _("%s bounds must be between %f and %f\n"),
+ parameter, l1, u1);
+ answer = PARAMETER_BAD;
+ }
+ if (stp_curve_get_wrap(checkval) !=
+ stp_curve_get_wrap(desc->bounds.curve))
+ {
+ if (!quiet)
+ stp_eprintf(v, _("%s wrap mode must be %s\n"),
+ parameter,
+ (stp_curve_get_wrap(desc->bounds.curve) ==
+ STP_CURVE_WRAP_NONE) ?
+ _("no wrap") : _("wrap around"));
+ answer = PARAMETER_BAD;
+ }
+ }
+ }
+ stp_parameter_description_destroy(desc);
+ return answer;
+}
+
+stp_parameter_verify_t
+stp_verify_parameter(const stp_vars_t *v, const char *parameter,
+ int quiet)
+{
+ stp_parameter_t desc;
+ quiet = 0;
+ stp_describe_parameter(v, parameter, &desc);
+ stp_dprintf(STP_DBG_VARS, v, " Verifying %s %d %d\n", parameter,
+ desc.is_active, desc.read_only);
+ if (!desc.is_active || desc.read_only)
+ {
+ stp_parameter_description_destroy(&desc);
+ return PARAMETER_INACTIVE;
+ }
+ switch (desc.p_type)
+ {
+ case STP_PARAMETER_TYPE_STRING_LIST:
+ return verify_string_param(v, parameter, &desc, quiet);
+ case STP_PARAMETER_TYPE_DOUBLE:
+ return verify_double_param(v, parameter, &desc, quiet);
+ case STP_PARAMETER_TYPE_INT:
+ return verify_int_param(v, parameter, &desc, quiet);
+ case STP_PARAMETER_TYPE_DIMENSION:
+ return verify_dimension_param(v, parameter, &desc, quiet);
+ case STP_PARAMETER_TYPE_CURVE:
+ return verify_curve_param(v, parameter, &desc, quiet);
+ case STP_PARAMETER_TYPE_RAW:
+ case STP_PARAMETER_TYPE_FILE:
+ stp_parameter_description_destroy(&desc);
+ return PARAMETER_OK; /* No way to verify this here */
+ case STP_PARAMETER_TYPE_BOOLEAN:
+ stp_parameter_description_destroy(&desc);
+ return PARAMETER_OK; /* Booleans always OK */
+ default:
+ if (!quiet)
+ stp_eprintf(v, _("Unknown type parameter %s (%d)\n"),
+ parameter, desc.p_type);
+ stp_parameter_description_destroy(&desc);
+ return 0;
+ }
+}
+
+#define CHECK_INT_RANGE(v, component, min, max) \
+do \
+{ \
+ if (stp_get_##component((v)) < (min) || stp_get_##component((v)) > (max)) \
+ { \
+ answer = 0; \
+ stp_eprintf(v, _("%s out of range (value %d, min %d, max %d)\n"), \
+ #component, stp_get_##component(v), min, max); \
+ } \
+} while (0)
+
+#define CHECK_INT_RANGE_INTERNAL(v, component, min, max) \
+do \
+{ \
+ if (stpi_get_##component((v)) < (min) || stpi_get_##component((v)) > (max)) \
+ { \
+ answer = 0; \
+ stp_eprintf(v, _("%s out of range (value %d, min %d, max %d)\n"), \
+ #component, stpi_get_##component(v), min, max); \
+ } \
+} while (0)
+
+typedef struct
+{
+ char *data;
+ size_t bytes;
+} errbuf_t;
+
+static void
+fill_buffer_writefunc(void *priv, const char *buffer, size_t bytes)
+{
+ errbuf_t *errbuf = (errbuf_t *) priv;
+ if (errbuf->bytes == 0)
+ errbuf->data = stp_malloc(bytes + 1);
+ else
+ errbuf->data = stp_realloc(errbuf->data, errbuf->bytes + bytes + 1);
+ memcpy(errbuf->data + errbuf->bytes, buffer, bytes);
+ errbuf->bytes += bytes;
+ errbuf->data[errbuf->bytes] = '\0';
+}
+
+int
+stp_verify_printer_params(stp_vars_t *v)
+{
+ errbuf_t errbuf;
+ stp_outfunc_t ofunc = stp_get_errfunc(v);
+ void *odata = stp_get_errdata(v);
+
+ stp_parameter_list_t params;
+ int nparams;
+ int i;
+ int answer = 1;
+ int left, top, bottom, right;
+ const char *pagesize = stp_get_string_parameter(v, "PageSize");
+
+ stp_set_errfunc((stp_vars_t *) v, fill_buffer_writefunc);
+ stp_set_errdata((stp_vars_t *) v, &errbuf);
+
+ errbuf.data = NULL;
+ errbuf.bytes = 0;
+
+ if (pagesize && strlen(pagesize) > 0)
+ {
+ if (stp_verify_parameter(v, "PageSize", 0) == 0)
+ answer = 0;
+ }
+ else
+ {
+ int width, height, min_height, min_width;
+ stp_get_size_limit(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, _("Page size is not valid\n"));
+ }
+ stp_dprintf(STP_DBG_PAPER, v,
+ "page size max %d %d min %d %d actual %d %d\n",
+ width, height, min_width, min_height,
+ stp_get_page_width(v), stp_get_page_height(v));
+ }
+
+ stp_get_imageable_area(v, &left, &right, &bottom, &top);
+
+ stp_dprintf(STP_DBG_PAPER, v,
+ "page left %d top %d right %d bottom %d\n",
+ left, top, right, bottom);
+ stp_dprintf(STP_DBG_PAPER, v,
+ "requested left %d top %d width %d height %d\n",
+ stp_get_left(v), stp_get_top(v),
+ stp_get_width(v), stp_get_height(v));
+
+ if (stp_get_top(v) < top)
+ {
+ answer = 0;
+ stp_eprintf(v, _("Top margin must not be less than %d\n"), top);
+ }
+
+ if (stp_get_left(v) < left)
+ {
+ answer = 0;
+ stp_eprintf(v, _("Left margin must not be less than %d\n"), left);
+ }
+
+ if (stp_get_height(v) <= 0)
+ {
+ answer = 0;
+ stp_eprintf(v, _("Height must be greater than zero\n"));
+ }
+
+ if (stp_get_width(v) <= 0)
+ {
+ answer = 0;
+ stp_eprintf(v, _("Width must be greater than zero\n"));
+ }
+
+ if (stp_get_left(v) + stp_get_width(v) > right)
+ {
+ answer = 0;
+ stp_eprintf(v, _("Image is too wide for the page: left margin is %d, width %d, right edge is %d\n"),
+ stp_get_left(v), stp_get_width(v), right);
+ }
+
+ if (stp_get_top(v) + stp_get_height(v) > bottom)
+ {
+ answer = 0;
+ stp_eprintf(v, _("Image is too long for the page: top margin is %d, height %d, bottom edge is %d\n"),
+ stp_get_top(v), stp_get_height(v), bottom);
+ }
+
+ params = stp_get_parameter_list(v);
+ nparams = stp_parameter_list_count(params);
+ for (i = 0; i < nparams; i++)
+ {
+ const stp_parameter_t *param = stp_parameter_list_param(params, i);
+ stp_dprintf(STP_DBG_VARS, v, "Checking %s %d %d\n", param->name,
+ param->is_active, param->verify_this_parameter);
+
+ if (strcmp(param->name, "PageSize") != 0 &&
+ param->is_active && param->verify_this_parameter &&
+ stp_verify_parameter(v, param->name, 0) == 0)
+ answer = 0;
+ }
+ stp_parameter_list_destroy(params);
+ stp_set_errfunc((stp_vars_t *) v, ofunc);
+ stp_set_errdata((stp_vars_t *) v, odata);
+ stp_set_verified((stp_vars_t *) v, answer);
+ if (errbuf.bytes > 0)
+ {
+ stp_eprintf(v, "%s", errbuf.data);
+ stp_free(errbuf.data);
+ }
+ return answer;
+}
+
+int
+stp_family_register(stp_list_t *family)
+{
+ stp_list_item_t *printer_item;
+ const stp_printer_t *printer;
+
+ if (printer_list == NULL)
+ {
+ stpi_init_printer_list();
+ stp_deprintf
+ (STP_DBG_PRINTERS,
+ "stpi_family_register(): initialising printer_list...\n");
+ }
+
+ if (family)
+ {
+ printer_item = stp_list_get_start(family);
+
+ while(printer_item)
+ {
+ printer = (const stp_printer_t *) stp_list_item_get_data(printer_item);
+ if (!stp_list_get_item_by_name(printer_list,
+ stp_get_driver(printer->printvars)))
+ stp_list_item_create(printer_list, NULL, printer);
+ printer_item = stp_list_item_next(printer_item);
+ }
+ }
+
+ return 0;
+}
+
+int
+stp_family_unregister(stp_list_t *family)
+{
+ stp_list_item_t *printer_item;
+ stp_list_item_t *old_printer_item;
+ const stp_printer_t *printer;
+
+ if (printer_list == NULL)
+ {
+ stpi_init_printer_list();
+ stp_deprintf
+ (STP_DBG_PRINTERS,
+ "stpi_family_unregister(): initialising printer_list...\n");
+ }
+
+ if (family)
+ {
+ printer_item = stp_list_get_start(family);
+
+ while(printer_item)
+ {
+ printer = (const stp_printer_t *) stp_list_item_get_data(printer_item);
+ old_printer_item =
+ stp_list_get_item_by_name(printer_list,
+ stp_get_driver(printer->printvars));
+
+ if (old_printer_item)
+ stp_list_item_destroy(printer_list, old_printer_item);
+ printer_item = stp_list_item_next(printer_item);
+ }
+ }
+ return 0;
+}
+
+/*
+ * Parse the printer node, and return the generated printer. Returns
+ * NULL on failure.
+ */
+static stp_printer_t*
+stp_printer_create_from_xmltree(stp_mxml_node_t *printer, /* The printer node */
+ const char *family, /* Family name */
+ const stp_printfuncs_t *printfuncs)
+ /* Family printfuncs */
+{
+ stp_mxml_node_t *prop; /* Temporary node pointer */
+ const char *stmp; /* Temporary string */
+ stp_printer_t *outprinter; /* Generated printer */
+ int
+ driver = 0, /* Check driver */
+ long_name = 0;
+
+ outprinter = stp_zalloc(sizeof(stp_printer_t));
+ if (!outprinter)
+ return NULL;
+ outprinter->printvars = stp_vars_create();
+ if (outprinter->printvars == NULL)
+ {
+ stp_free(outprinter);
+ return NULL;
+ }
+
+ stmp = stp_mxmlElementGetAttr(printer, "driver");
+ stp_set_driver(outprinter->printvars, (const char *) stmp);
+
+ outprinter->long_name = stp_strdup(stp_mxmlElementGetAttr(printer, "name"));
+ outprinter->manufacturer = stp_strdup(stp_mxmlElementGetAttr(printer, "manufacturer"));
+ outprinter->model = stp_xmlstrtol(stp_mxmlElementGetAttr(printer, "model"));
+ outprinter->family = stp_strdup((const char *) family);
+
+ if (stp_get_driver(outprinter->printvars))
+ driver = 1;
+ if (outprinter->long_name)
+ long_name = 1;
+
+ outprinter->printfuncs = printfuncs;
+
+ prop = printer->child;
+ while (prop)
+ {
+ if (prop->type == STP_MXML_ELEMENT)
+ {
+ const char *prop_name = prop->value.element.name;
+ if (!strcmp(prop_name, "parameter"))
+ {
+ const char *p_type = stp_mxmlElementGetAttr(prop, "type");
+ const char *p_name = stp_mxmlElementGetAttr(prop, "name");
+ stp_mxml_node_t *child = prop->child;
+ if (!p_type || !p_name)
+ stp_erprintf("Bad property on driver %s\n", outprinter->driver);
+ else if (strcmp(p_type, "float") == 0)
+ {
+ if (child->type == STP_MXML_TEXT)
+ stp_set_float_parameter
+ (outprinter->printvars, p_name,
+ stp_xmlstrtod(child->value.text.string));
+ }
+ else if (strcmp(p_type, "integer") == 0)
+ {
+ if (child->type == STP_MXML_TEXT)
+ stp_set_int_parameter
+ (outprinter->printvars, p_name,
+ (int) stp_xmlstrtol(child->value.text.string));
+ }
+ else if (strcmp(p_type, "boolean") == 0)
+ {
+ if (child->type == STP_MXML_TEXT)
+ stp_set_boolean_parameter
+ (outprinter->printvars, p_name,
+ (int) stp_xmlstrtol(child->value.text.string));
+ }
+ else if (strcmp(p_type, "string") == 0)
+ {
+ if (child->type == STP_MXML_TEXT)
+ stp_set_string_parameter
+ (outprinter->printvars, p_name, child->value.text.string);
+ }
+ else if (strcmp(p_type, "curve") == 0)
+ {
+ stp_curve_t *curve = stp_curve_create_from_xmltree(child);
+ if (curve)
+ {
+ stp_set_curve_parameter(outprinter->printvars,
+ p_name, curve);
+ stp_curve_destroy(curve);
+ }
+ }
+ else if (strcmp(p_type, "array") == 0)
+ {
+ stp_array_t *array = stp_array_create_from_xmltree(child);
+ if (array)
+ {
+ stp_set_array_parameter(outprinter->printvars,
+ p_name, array);
+ stp_array_destroy(array);
+ }
+ }
+ else
+ {
+ stp_erprintf("Bad property %s type %s on driver %s\n",
+ p_name, p_type, outprinter->driver);
+ continue;
+ }
+ }
+ }
+ prop = prop->next;
+ }
+ if (driver && long_name && printfuncs)
+ {
+ if (stp_get_debug_level() & STP_DBG_XML)
+ {
+ stmp = stp_mxmlElementGetAttr(printer, "driver");
+ stp_erprintf("stp_printer_create_from_xmltree: printer: %s\n", stmp);
+ }
+ outprinter->driver = stp_get_driver(outprinter->printvars);
+ return outprinter;
+ }
+ stp_free(outprinter);
+ return NULL;
+}
+
+/*
+ * Parse the <family> node.
+ */
+static void
+stpi_xml_process_family(stp_mxml_node_t *family) /* The family node */
+{
+ stp_list_t *family_module_list = NULL; /* List of valid families */
+ stp_list_item_t *family_module_item; /* Current family */
+ const char *family_name; /* Name of family */
+ stp_mxml_node_t *printer; /* printer child node */
+ stp_module_t *family_module_data; /* Family module data */
+ stp_family_t *family_data = NULL; /* Family data */
+ int family_valid = 0; /* Is family valid? */
+ stp_printer_t *outprinter; /* Generated printer */
+
+ family_module_list = stp_module_get_class(STP_MODULE_CLASS_FAMILY);
+ if (!family_module_list)
+ return;
+
+ family_name = stp_mxmlElementGetAttr(family, "name");
+ family_module_item = stp_list_get_start(family_module_list);
+ while (family_module_item)
+ {
+ family_module_data = (stp_module_t *)
+ stp_list_item_get_data(family_module_item);
+ if (!strcmp(family_name, family_module_data->name))
+ {
+ stp_deprintf(STP_DBG_XML,
+ "stpi_xml_process_family: family module: %s\n",
+ family_module_data->name);
+ family_data = family_module_data->syms;
+ if (family_data->printer_list == NULL)
+ family_data->printer_list = stp_list_create();
+ family_valid = 1;
+ }
+ family_module_item = stp_list_item_next(family_module_item);
+ }
+
+ printer = family->child;
+ while (family_valid && printer)
+ {
+ if (printer->type == STP_MXML_ELEMENT)
+ {
+ const char *printer_name = printer->value.element.name;
+ if (!strcmp(printer_name, "printer"))
+ {
+ outprinter =
+ stp_printer_create_from_xmltree(printer, family_name,
+ family_data->printfuncs);
+ if (outprinter)
+ stp_list_item_create(family_data->printer_list, NULL,
+ outprinter);
+ }
+ }
+ printer = printer->next;
+ }
+
+ stp_list_destroy(family_module_list);
+ return;
+}
+
+/*
+ * Parse the <printdef> node.
+ */
+static int
+stpi_xml_process_printdef(stp_mxml_node_t *printdef, const char *file) /* The printdef node */
+{
+ stp_mxml_node_t *family; /* Family child node */
+
+ family = printdef->child;
+ while (family)
+ {
+ if (family->type == STP_MXML_ELEMENT)
+ {
+ const char *family_name = family->value.element.name;
+ if (!strcmp(family_name, "family"))
+ {
+ stpi_xml_process_family(family);
+ }
+ }
+ family = family->next;
+ }
+ return 1;
+}
+
+void
+stpi_init_printer(void)
+{
+ stp_register_xml_parser("printdef", stpi_xml_process_printdef);
+ stp_register_xml_preload("printers.xml");
+}
diff --git a/src/main/printers.xml b/src/main/printers.xml
index f71dba9..d80efd7 100644
--- a/src/main/printers.xml
+++ b/src/main/printers.xml
@@ -1,1991 +1,1230 @@
-# 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.2.26 2004/06/09 10:29:59 davehill Exp $"
-
-<printer name="PostScript Level 1" driver="ps">
-<color>
-<model value=0>
-<gamma value=1.000>
-<density value=1.000>
-<language value=ps>
-</printer>
-
-<printer name="PostScript Level 2" driver="ps2">
-<color>
-<model value=1>
-<gamma value=1.000>
-<density value=1.000>
-<language value=ps>
-</printer>
-
-<printer name="CANON BJC 30" driver="bjc-30">
-<color>
-<model value=30>
-<gamma value=2.000>
-<density value=0.800>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 50" driver="bjc-50">
-<color>
-<model value=4400>
-<gamma value=0.5>
-<density value=0.800>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 55" driver="bjc-55">
-<color>
-<model value=4400>
-<gamma value=0.5>
-<density value=0.800>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 80" driver="bjc-80">
-<color>
-<model value=4400>
-<gamma value=0.5>
-<density value=0.800>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 85" driver="bjc-85">
-<color>
-<model value=85>
-<gamma value=0.5>
-<density value=0.800>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 210" driver="bjc-210">
-<color>
-<model value=210>
-<gamma value=1.000>
-<density value=0.800>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 240" driver="bjc-240">
-<color>
-<model value=240>
-<gamma value=1.000>
-<density value=0.800>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 250" driver="bjc-250">
-<color>
-<model value=250>
-<gamma value=1.000>
-<density value=0.800>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 1000" driver="bjc-1000">
-<color>
-<model value=1000>
-<gamma value=1.000>
-<density value=0.800>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 2000" driver="bjc-2000">
-<color>
-<model value=2000>
-<gamma value=1.000>
-<density value=0.800>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 3000" driver="bjc-3000">
-<color>
-<model value=3000>
-<gamma value=1.000>
-<density value=0.800>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 4300" driver="bjc-4300">
-<color>
-<model value=4300>
-<gamma value=0.750>
-<density value=1.000>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 4400 photo" driver="bjc-4400">
-<color>
-<model value=4400>
-<gamma value=1.000>
-<density value=0.800>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 6000" driver="bjc-6000">
-<color>
-<model value=6000>
-<gamma value=0.750>
-<density value=1.000>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 6100" driver="bjc-6100">
-<color>
-<model value=6100>
-<gamma value=1.000>
-<density value=0.800>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 6200" driver="bjc-6200">
-<color>
-<model value=6200>
-<gamma value=0.750>
-<density value=1.000>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 6500" driver="bjc-6500">
-<color>
-<model value=6500>
-<gamma value=0.750>
-<density value=1.000>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 7000" driver="bjc-7000">
-<color>
-<model value=7000>
-<gamma value=0.600>
-<density value=0.800>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 7100" driver="bjc-7100">
-<color>
-<model value=7100>
-<gamma value=1.000>
-<density value=0.800>
-<language value=canon>
-</printer>
-
-<printer name="CANON BJC 8200" driver="bjc-8200">
-<color>
-<model value=8200>
-<gamma value=1.000>
-<density value=0.800>
-<language value=canon>
-</printer>
-
-<printer name="CANON S200" driver="bjc-s200">
-<color>
-# model number 4202 is the USB product ID of the Canon S200x
-<model value=4202>
-<language value=canon>
-</printer>
-
-<printer name="CANON S400" driver="bjc-s400">
-<color>
-<model value=3000>
-<gamma value=1.000>
-<density value=0.800>
-<language value=canon>
-</printer>
-
-<printer name="CANON S450" driver="bjc-s450">
-<color>
-<model value=6200>
-<gamma value=0.750>
-<density value=1.000>
-<language value=canon>
-</printer>
-
-<printer name="CANON S800" driver="bjc-s800">
-<color>
-<model value=8200>
-<gamma value=1.000>
-<density value=0.800>
-<language value=canon>
-</printer>
-
-<printer name="CANON S4500" driver="bjc-s4500">
-<color>
-<model value=6500>
-<gamma value=0.750>
-<density value=1.000>
-<language value=canon>
-</printer>
-
-<printer name="EPSON Stylus C20SX" driver="escp2-c20sx">
-<color>
-<model value=42>
-<gamma value=0.585>
-<density value=1.0>
-<magenta value=0.95>
-<yellow value=0.9>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C20UX" driver="escp2-c20ux">
-<color>
-<model value=42>
-<gamma value=0.585>
-<density value=1.0>
-<magenta value=0.95>
-<yellow value=0.9>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C40SX" driver="escp2-c40sx">
-<color>
-<model value=43>
-<gamma value=0.585>
-<density value=1.0>
-<magenta value=0.95>
-<yellow value=0.9>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C40UX" driver="escp2-c40ux">
-<color>
-<model value=43>
-<gamma value=0.585>
-<density value=1.0>
-<magenta value=0.95>
-<yellow value=0.9>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C41SX" driver="escp2-c41sx">
-<color>
-<model value=43>
-<gamma value=0.585>
-<density value=1.0>
-<magenta value=0.95>
-<yellow value=0.9>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C41UX" driver="escp2-c41ux">
-<color>
-<model value=43>
-<gamma value=0.585>
-<density value=1.0>
-<magenta value=0.95>
-<yellow value=0.9>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C42SX" driver="escp2-c42sx">
-<color>
-<model value=43>
-<gamma value=0.585>
-<density value=1.0>
-<magenta value=0.95>
-<yellow value=0.9>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C42UX" driver="escp2-c42ux">
-<color>
-<model value=43>
-<gamma value=0.585>
-<density value=1.0>
-<magenta value=0.95>
-<yellow value=0.9>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C43SX" driver="escp2-c43sx">
-<color>
-<model value=43>
-<gamma value=0.585>
-<density value=1.0>
-<magenta value=0.95>
-<yellow value=0.9>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C43UX" driver="escp2-c43ux">
-<color>
-<model value=43>
-<gamma value=0.585>
-<density value=1.0>
-<magenta value=0.95>
-<yellow value=0.9>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C44SX" driver="escp2-c44sx">
-<color>
-<model value=43>
-<gamma value=0.585>
-<density value=1.0>
-<magenta value=0.95>
-<yellow value=0.9>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C44UX" driver="escp2-c44ux">
-<color>
-<model value=43>
-<gamma value=0.585>
-<density value=1.0>
-<magenta value=0.95>
-<yellow value=0.9>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C50" driver="escp2-c50">
-<color>
-<model value=56>
-<gamma value=0.585>
-<density value=1.0>
-<magenta value=0.95>
-<yellow value=0.9>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C60" driver="escp2-c60">
-<color>
-<model value=33>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C61" driver="escp2-c61">
-<color>
-<model value=52>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C62" driver="escp2-c62">
-<color>
-<model value=52>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C63" driver="escp2-c63">
-<color>
-<model value=61>
-<gamma value=0.688>
-<density value=1.0>
-<cyan value=0.96>
-<magenta value=1.02>
-<yellow value=1.02>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C64" driver="escp2-c64">
-<color>
-<model value=61>
-<gamma value=0.688>
-<density value=1.0>
-<cyan value=0.96>
-<magenta value=1.02>
-<yellow value=1.02>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C70" driver="escp2-c70">
-<color>
-<model value=44>
-<gamma value=0.688>
-<density value=1.0>
-<cyan value=0.96>
-<magenta value=1.02>
-<yellow value=1.02>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C80" driver="escp2-c80">
-<color>
-<model value=44>
-<gamma value=0.688>
-<density value=1.0>
-<cyan value=0.96>
-<magenta value=1.02>
-<yellow value=1.02>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C82" driver="escp2-c82">
-<color>
-<model value=55>
-<gamma value=0.688>
-<density value=1.0>
-<cyan value=0.96>
-<magenta value=1.02>
-<yellow value=1.02>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C83" driver="escp2-c83">
-<color>
-<model value=60>
-<gamma value=0.688>
-<density value=1.0>
-<cyan value=0.96>
-<magenta value=1.02>
-<yellow value=1.02>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus C84" driver="escp2-c84">
-<color>
-<model value=60>
-<gamma value=0.688>
-<density value=1.0>
-<cyan value=0.96>
-<magenta value=1.02>
-<yellow value=1.02>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color" driver="escp2">
-<color>
-<model value=0>
-<gamma value=0.597>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color Pro" driver="escp2-pro">
-<color>
-<model value=45>
-<gamma value=0.597>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color Pro XL" driver="escp2-pro-xl">
-<color>
-<model value=39>
-<gamma value=0.597>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 400" driver="escp2-400">
-<color>
-<model value=1>
-<gamma value=0.597>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 440" driver="escp2-440">
-<color>
-<model value=10>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 460" driver="escp2-460">
-<color>
-<model value=10>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 480" driver="escp2-480">
-<color>
-<model value=21>
-<gamma value=0.585>
-<density value=1.0>
-<magenta value=0.95>
-<yellow value=0.9>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 500" driver="escp2-500">
-<color>
-<model value=1>
-<gamma value=0.597>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 580" driver="escp2-580">
-<color>
-<model value=38>
-<gamma value=0.585>
-<density value=1.0>
-<magenta value=0.95>
-<yellow value=0.9>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 600" driver="escp2-600">
-<color>
-<model value=3>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 640" driver="escp2-640">
-<color>
-<model value=11>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 660" driver="escp2-660">
-<color>
-<model value=18>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 670" driver="escp2-670">
-<color>
-<model value=25>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 680" driver="escp2-680">
-<color>
-<model value=32>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 740" driver="escp2-740">
-<color>
-<model value=12>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 760" driver="escp2-760">
-<color>
-<model value=19>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 777" driver="escp2-777">
-<color>
-<model value=32>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 800" driver="escp2-800">
-<color>
-<model value=4>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 850" driver="escp2-850">
-<color>
-<model value=5>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 860" driver="escp2-860">
-<color>
-<model value=16>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 880" driver="escp2-880">
-<color>
-<model value=33>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 83" driver="escp2-83">
-<color>
-<model value=33>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 900" driver="escp2-900">
-<color>
-<model value=13>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 980" driver="escp2-980">
-<color>
-<model value=34>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 1160" driver="escp2-1160">
-<color>
-<model value=17>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 1500" driver="escp2-1500">
-<color>
-<model value=2>
-<gamma value=0.597>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 1520" driver="escp2-1520">
-<color>
-<model value=6>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Color 3000" driver="escp2-3000">
-<color>
-<model value=24>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo" driver="escp2-photo">
-<color>
-<model value=9>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 700" driver="escp2-700">
-<color>
-<model value=7>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo EX" driver="escp2-ex">
-<color>
-<model value=8>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo EX3" driver="escp2-ex3">
-<color>
-<model value=54>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 720" driver="escp2-720">
-<color>
-<model value=20>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 750" driver="escp2-750">
-<color>
-<model value=14>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 780" driver="escp2-780">
-<color>
-<model value=35>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-# Note that the 785EPX has a roll feed holder. It's more like the 890
-# than the 780, despite the name.
-<printer name="EPSON Stylus Photo 785EPX" driver="escp2-785">
-<color>
-<model value=36>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 790" driver="escp2-790">
-<color>
-<model value=35>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 810" driver="escp2-810">
-<color>
-<model value=35>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 820" driver="escp2-820">
-<color>
-<model value=35>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 825" driver="escp2-825">
-<color>
-<model value=50>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 830" driver="escp2-830">
-<color>
-<model value=50>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 870" driver="escp2-870">
-<color>
-<model value=22>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 875" driver="escp2-875">
-<color>
-<model value=22>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 890" driver="escp2-890">
-<color>
-<model value=36>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 895" driver="escp2-895">
-<color>
-<model value=36>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 900" driver="escp2-ph900">
-<color>
-<model value=62>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 915" driver="escp2-915">
-<color>
-<model value=36>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 925" driver="escp2-925">
-<color>
-<model value=51>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 935" driver="escp2-935">
-<color>
-<model value=51>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 950" driver="escp2-950">
-<color>
-<model value=46>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 960" driver="escp2-960">
-<color>
-<model value=46>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 1200" driver="escp2-1200">
-<color>
-<model value=15>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 1270" driver="escp2-1270">
-<color>
-<model value=23>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 1280" driver="escp2-1280">
-<color>
-<model value=37>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 1290" driver="escp2-1290">
-<color>
-<model value=37>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 2000P" driver="escp2-2000">
-<color>
-<model value=26>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 2100" driver="escp2-2100">
-<color>
-<model value=47>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo 2200" driver="escp2-2200">
-<color>
-<model value=47>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo R200" driver="escp2-r200">
-<color>
-<model value=63>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo R300" driver="escp2-r300">
-<color>
-<model value=63>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo RX500" driver="escp2-rx500">
-<color>
-<model value=63>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Photo RX600" driver="escp2-rx600">
-<color>
-<model value=63>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Pro 5000" driver="escp2-5000">
-<color>
-<model value=27>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Pro 5500" driver="escp2-5500">
-<color>
-<model value=40>
-<cyan value=0.8>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Pro 7000" driver="escp2-7000">
-<color>
-<model value=28>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Pro 7500" driver="escp2-7500">
-<color>
-<model value=29>
-<cyan value=0.8>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Pro 7600" driver="escp2-7600">
-<color>
-<model value=48>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Pro 9000" driver="escp2-9000">
-<color>
-<model value=30>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Pro 9500" driver="escp2-9500">
-<color>
-<model value=31>
-<cyan value=0.8>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Pro 9600" driver="escp2-9600">
-<color>
-<model value=49>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Pro 10000" driver="escp2-10000">
-<color>
-<model value=41>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Scan 2000" driver="escp2-scan2000">
-<color>
-<model value=12>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus Scan 2500" driver="escp2-scan2500">
-<color>
-<model value=12>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus CX-3100" driver="escp2-cx3100">
-<color>
-<model value=52>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus CX-3200" driver="escp2-cx3200">
-<color>
-<model value=52>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus CX-5100" driver="escp2-cx5100">
-<color>
-<model value=55>
-<gamma value=0.688>
-<density value=1.0>
-<cyan value=0.96>
-<magenta value=1.02>
-<yellow value=1.02>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus CX-5200" driver="escp2-cx5200">
-<color>
-<model value=55>
-<gamma value=0.688>
-<density value=1.0>
-<cyan value=0.96>
-<magenta value=1.02>
-<yellow value=1.02>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus CX-5300" driver="escp2-cx5300">
-<color>
-<model value=55>
-<gamma value=0.688>
-<density value=1.0>
-<cyan value=0.96>
-<magenta value=1.02>
-<yellow value=1.02>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus CX-5400" driver="escp2-cx5400">
-<color>
-<model value=55>
-<gamma value=0.688>
-<density value=1.0>
-<cyan value=0.96>
-<magenta value=1.02>
-<yellow value=1.02>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus CX-6300" driver="escp2-cx6300">
-<color>
-<model value=60>
-<gamma value=0.688>
-<density value=1.0>
-<cyan value=0.96>
-<magenta value=1.02>
-<yellow value=1.02>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus CX-6400" driver="escp2-cx6400">
-<color>
-<model value=60>
-<gamma value=0.688>
-<density value=1.0>
-<cyan value=0.96>
-<magenta value=1.02>
-<yellow value=1.02>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus CX-8300" driver="escp2-cx8300">
-<color>
-<model value=60>
-<gamma value=0.688>
-<density value=1.0>
-<cyan value=0.96>
-<magenta value=1.02>
-<yellow value=1.02>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON Stylus CX-8400" driver="escp2-cx8400">
-<color>
-<model value=60>
-<gamma value=0.688>
-<density value=1.0>
-<cyan value=0.96>
-<magenta value=1.02>
-<yellow value=1.02>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON CL-700" driver="escp2-cl700">
-<color>
-<model value=38>
-<gamma value=0.585>
-<density value=1.0>
-<magenta value=0.95>
-<yellow value=0.9>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON CL-750" driver="escp2-cl750">
-<color>
-<model value=43>
-<gamma value=0.585>
-<density value=1.0>
-<magenta value=0.95>
-<yellow value=0.9>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON CL-760" driver="escp2-cl760">
-<color>
-<model value=56>
-<gamma value=0.585>
-<density value=1.0>
-<magenta value=0.95>
-<yellow value=0.9>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON EM-900C" driver="escp2-em900c">
-<color>
-<model value=13>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON EM-930C" driver="escp2-em930c">
-<color>
-<model value=34>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON MC-2000" driver="escp2-mc2000">
-<color>
-<model value=26>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON MC-5000" driver="escp2-mc5000">
-<color>
-<model value=40>
-<cyan value=0.8>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON MC-7000" driver="escp2-mc7000">
-<color>
-<model value=29>
-<cyan value=0.8>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON MC-9000" driver="escp2-mc9000">
-<color>
-<model value=31>
-<cyan value=0.8>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON MC-10000" driver="escp2-mc10000">
-<color>
-<model value=41>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON MJ-930C" driver="escp2-mj930c">
-<color>
-<model value=4>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON MJ-5100C" driver="escp2-mj5100c">
-<color>
-<model value=39>
-<gamma value=0.597>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON MJ-6000C" driver="escp2-mj6000c">
-<color>
-<model value=6>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON MJ-8000C" driver="escp2-mj8000c">
-<color>
-<model value=24>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-700C" driver="escp2-pm700c">
-<color>
-<model value=9>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-730C" driver="escp2-pm730c">
-<color>
-<model value=35>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-740C" driver="escp2-pm740c">
-<color>
-<model value=35>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-750C" driver="escp2-pm750c">
-<color>
-<model value=7>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-760C" driver="escp2-pm760c">
-<color>
-<model value=20>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-770C" driver="escp2-pm770c">
-<color>
-<model value=14>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-780C" driver="escp2-pm780c">
-<color>
-<model value=35>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-790PT" driver="escp2-pm790pt">
-<color>
-<model value=36>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-800C" driver="escp2-pm800c">
-<color>
-<model value=22>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-850PT" driver="escp2-pm850pt">
-<color>
-<model value=51>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-870C" driver="escp2-pm870c">
-<color>
-<model value=36>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-880C" driver="escp2-pm880c">
-<color>
-<model value=36>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-930C" driver="escp2-pm930c">
-<color>
-<model value=58>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-950C" driver="escp2-pm950c">
-<color>
-<model value=53>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-970C" driver="escp2-pm970c">
-<color>
-<model value=57>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-2000C" driver="escp2-pm2000c">
-<color>
-<model value=8>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-2200C" driver="escp2-pm2200c">
-<color>
-<model value=54>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-3000C" driver="escp2-pm3000c">
-<color>
-<model value=15>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-3300C" driver="escp2-pm3300c">
-<color>
-<model value=23>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-3500C" driver="escp2-pm3500c">
-<color>
-<model value=37>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-3700C" driver="escp2-pm3700c">
-<color>
-<model value=37>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-4000PX" driver="escp2-pm4000px">
-<color>
-<model value=47>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-5000C" driver="escp2-pm5000c">
-<color>
-<model value=27>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-7000C" driver="escp2-pm7000c">
-<color>
-<model value=28>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-9000C" driver="escp2-pm9000c">
-<color>
-<model value=30>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-10000" driver="escp2-pm10000">
-<color>
-<model value=41>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-D750" driver="escp2-pmd750">
-<color>
-<model value=63>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PM-G700" driver="escp2-pmg700">
-<color>
-<model value=63>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PX-V500" driver="escp2-pxv500">
-<color>
-<model value=61>
-<gamma value=0.688>
-<density value=1.0>
-<cyan value=0.96>
-<magenta value=1.02>
-<yellow value=1.02>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PX-7000" driver="escp2-px7000">
-<color>
-<model value=48>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="EPSON PX-9000" driver="escp2-px9000">
-<color>
-<model value=49>
-<gamma value=0.585>
-<density value=1.0>
-<language value=escp2>
-</printer>
-
-<printer name="APPLE Color StyleWriter 4100" driver="pcl-apple-4100">
-<color>
-<model value=601> # Uses 600 series driver
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="APPLE Color StyleWriter 4500" driver="pcl-apple-4500">
-<color>
-<model value=690> # Uses 690 driver
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="APPLE Color StyleWriter 6500" driver="pcl-apple-6500">
-<color>
-<model value=800> # Uses 850 driver
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 340" driver="pcl-340">
-<color>
-<model value=340>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 400" driver="pcl-400">
-<color>
-<model value=400>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 500" driver="pcl-500">
-<nocolor>
-<model value=500>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DesignJet 230" driver="pcl-desnj-230">
-<nocolor>
-<model value=10230>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DesignJet 250C" driver="pcl-desnj-250">
-<color>
-<model value=10250>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DesignJet 700" driver="pcl-desnj-700">
-<nocolor>
-<model value=10700>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DesignJet 750C" driver="pcl-750">
-<color>
-<model value=10750>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DesignJet 2500C" driver="pcl-desnj-2500">
-<color>
-<model value=12500>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DesignJet 3500C" driver="pcl-desnj-3500">
-<color>
-<model value=13500>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DesignJet 430" driver="pcl-desnj-430">
-<nocolor>
-<model value=10230>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DesignJet 450C" driver="pcl-desnj-450">
-<color>
-<model value=10250>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DesignJet 455CA" driver="pcl-desnj-455">
-<color>
-<model value=10250>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DesignJet 488CA" driver="pcl-desnj-488">
-<color>
-<model value=10250>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 500C" driver="pcl-501">
-<color>
-<model value=501>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 520" driver="pcl-520">
-<nocolor>
-<model value=500>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 540C" driver="pcl-540">
-<color>
-<model value=540>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 550C" driver="pcl-550">
-<color>
-<model value=550>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 560C" driver="pcl-560">
-<color>
-<model value=550>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 600/600C" driver="pcl-600">
-<color>
-<model value=600>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 600 series" driver="pcl-601">
-<color>
-<model value=601>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 690 series" driver="pcl-690">
-<color>
-<model value=690>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 810C" driver="pcl-810">
-<color>
-<model value=840> # Uses 840 driver
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 812C" driver="pcl-812">
-<color>
-<model value=840> # Uses 840 driver
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 840C" driver="pcl-840">
-<color>
-<model value=840> # Uses 840 driver
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 842C" driver="pcl-842">
-<color>
-<model value=840> # Uses 840 driver
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 845C" driver="pcl-845">
-<color>
-<model value=840> # Uses 840 driver
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 850C" driver="pcl-850">
-<color>
-<model value=800>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 855C" driver="pcl-855">
-<color>
-<model value=800>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 870C" driver="pcl-870">
-<color>
-<model value=800>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 890C" driver="pcl-890">
-<color>
-<model value=800>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 895C" driver="pcl-895">
-<color>
-<model value=840> # Uses 840 driver
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 900 series" driver="pcl-900">
-<color>
-<model value=900>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 1100C" driver="pcl-1100">
-<color>
-<model value=1100>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 1120C" driver="pcl-1120">
-<color>
-<model value=1100>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 1200C" driver="pcl-1200">
-<color>
-<model value=1200>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 1220C" driver="pcl-1220">
-<color>
-<model value=901> # Uses 900 series driver (large)
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 1600C" driver="pcl-1600">
-<color>
-<model value=1600>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 2000 series" driver="pcl-2000">
-<color>
-<model value=2000>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP DeskJet 2500 series" driver="pcl-2500">
-<color>
-<model value=2500>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP PhotoSmart P1000" driver="pcl-P1000">
-<color>
-<model value=900> # Uses 900 series driver
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP PhotoSmart P1100" driver="pcl-P1100">
-<color>
-<model value=900> # Uses 900 series driver
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="HP LaserJet II series" driver="pcl-2">
-<nocolor>
-<model value=2>
-<gamma value=1.000>
-<density value=1.000>
-<language value=pcl>
-</printer>
-
-<printer name="HP LaserJet IIP series" driver="pcl-2p">
-<nocolor>
-<model value=21>
-<gamma value=1.000>
-<density value=1.000>
-<language value=pcl>
-</printer>
-
-<printer name="HP LaserJet III series" driver="pcl-3">
-<nocolor>
-<model value=3>
-<gamma value=1.000>
-<density value=1.000>
-<language value=pcl>
-</printer>
-
-<printer name="HP LaserJet 4 series" driver="pcl-4">
-<nocolor>
-<model value=6>
-<gamma value=1.000>
-<density value=1.000>
-<language value=pcl>
-</printer>
-
-<printer name="HP LaserJet 4L" driver="pcl-4l">
-<nocolor>
-<model value=4>
-<gamma value=1.000>
-<density value=1.000>
-<language value=pcl>
-</printer>
-
-<printer name="HP LaserJet 4V, 4Si" driver="pcl-4v">
-<nocolor>
-<model value=5>
-<gamma value=1.000>
-<density value=1.000>
-<language value=pcl>
-</printer>
-
-<printer name="HP LaserJet 5 series" driver="pcl-5">
-<nocolor>
-<model value=6>
-<gamma value=1.000>
-<density value=1.000>
-<language value=pcl>
-</printer>
-
-<printer name="HP LaserJet 5Si" driver="pcl-5si">
-<nocolor>
-<model value=7>
-<gamma value=1.000>
-<density value=1.000>
-<language value=pcl>
-</printer>
-
-<printer name="HP LaserJet 6 series" driver="pcl-6">
-<nocolor>
-<model value=6>
-<gamma value=1.000>
-<density value=1.000>
-<language value=pcl>
-</printer>
-
-<printer name="LEXMARK 4076" driver="lexmark-4076">
-<nocolor>
-<model value=500>
-<gamma value=0.818>
-<density value=0.786>
-<language value=pcl>
-</printer>
-
-<printer name="LEXMARK Z42" driver="lexmark-z42">
-<color>
-<model value=10042>
-<gamma value=0.5>
-<density value=2.0>
-<magenta value=0.95>
-<yellow value=1.0>
-<language value=lexmark>
-</printer>
-
-<printer name="LEXMARK Z43" driver="lexmark-z43">
-<color>
-<model value=10042>
-<gamma value=0.5>
-<density value=2.0>
-<magenta value=0.95>
-<yellow value=1.0>
-<language value=lexmark>
-</printer>
-
-<printer name="LEXMARK Z52" driver="lexmark-z52">
-<color>
-<model value=10052>
-<gamma value=0.5>
-<density value=2.0>
-<magenta value=0.95>
-<yellow value=1.0>
-<language value=lexmark>
-</printer>
-
-<printer name="LEXMARK Z53" driver="lexmark-z53">
-<color>
-<model value=10052>
-<gamma value=0.5>
-<density value=2.0>
-<magenta value=0.95>
-<yellow value=1.0>
-<language value=lexmark>
-</printer>
+<?xml version="1.0"?>
+
+<!--
+ XML description of printers known to libgutenprint
+ This file was originally generated. It should be edited by hand.
+
+ "$Id: printers.xml,v 1.122 2005/06/25 21:40:27 rlk Exp $"
+-->
+
+<gutenprint xmlns="http://gimp-print.sourceforge.net/xsd/gp.xsd-1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://gimp-print.sourceforge.net/xsd/gp.xsd-1.0 gutenprint.xsd">
+ <printdef>
+ <family name="ps">
+ <printer name="PostScript Level 1" driver="ps" manufacturer="Adobe" model="0">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">1.000</parameter>
+ </printer>
+ <printer name="PostScript Level 2" driver="ps2" manufacturer="Adobe" model="1">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">1.000</parameter>
+ </printer>
+ </family>
+ <family name="canon">
+ <printer name="Canon BJC 30" driver="bjc-30" manufacturer="Canon" model="30">
+ <parameter type="float" name="Gamma">2.000</parameter>
+ <parameter type="float" name="Density">0.800</parameter>
+ </printer>
+ <printer name="Canon BJC 50" driver="bjc-50" manufacturer="Canon" model="4400">
+ <parameter type="float" name="Gamma">0.5</parameter>
+ <parameter type="float" name="Density">0.800</parameter>
+ </printer>
+ <printer name="Canon BJC 55" driver="bjc-55" manufacturer="Canon" model="4400">
+ <parameter type="float" name="Gamma">0.5</parameter>
+ <parameter type="float" name="Density">0.800</parameter>
+ </printer>
+ <printer name="Canon BJC 80" driver="bjc-80" manufacturer="Canon" model="4400">
+ <parameter type="float" name="Gamma">0.5</parameter>
+ <parameter type="float" name="Density">0.800</parameter>
+ </printer>
+ <printer name="Canon BJC 85" driver="bjc-85" manufacturer="Canon" model="85">
+ <parameter type="float" name="Gamma">0.5</parameter>
+ <parameter type="float" name="Density">0.800</parameter>
+ </printer>
+ <printer name="Canon BJC 210" driver="bjc-210" manufacturer="Canon" model="210">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">0.800</parameter>
+ </printer>
+ <printer name="Canon BJC 240" driver="bjc-240" manufacturer="Canon" model="240">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">0.800</parameter>
+ </printer>
+ <printer name="Canon BJC 250" driver="bjc-250" manufacturer="Canon" model="250">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">0.800</parameter>
+ </printer>
+ <printer name="Canon BJC 1000" driver="bjc-1000" manufacturer="Canon" model="1000">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">0.800</parameter>
+ </printer>
+ <printer name="Canon BJC 2000" driver="bjc-2000" manufacturer="Canon" model="2000">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">0.800</parameter>
+ </printer>
+ <printer name="Canon BJC 3000" driver="bjc-3000" manufacturer="Canon" model="3000">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">0.800</parameter>
+ </printer>
+ <printer name="Canon BJC 4300" driver="bjc-4300" manufacturer="Canon" model="4300">
+ <parameter type="float" name="Gamma">0.750</parameter>
+ <parameter type="float" name="Density">1.000</parameter>
+ </printer>
+ <printer name="Canon BJC 4400 photo" driver="bjc-4400" manufacturer="Canon" model="4400">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">0.800</parameter>
+ </printer>
+ <printer name="Canon BJC 6000" driver="bjc-6000" manufacturer="Canon" model="6000">
+ <parameter type="float" name="Gamma">0.750</parameter>
+ <parameter type="float" name="Density">1.000</parameter>
+ </printer>
+ <printer name="Canon BJC 6100" driver="bjc-6100" manufacturer="Canon" model="6100">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">0.800</parameter>
+ </printer>
+ <printer name="Canon BJC 6200" driver="bjc-6200" manufacturer="Canon" model="6200">
+ <parameter type="float" name="Gamma">0.750</parameter>
+ <parameter type="float" name="Density">1.000</parameter>
+ </printer>
+ <printer name="Canon BJC 6500" driver="bjc-6500" manufacturer="Canon" model="6500">
+ <parameter type="float" name="Gamma">0.750</parameter>
+ <parameter type="float" name="Density">1.000</parameter>
+ </printer>
+ <printer name="Canon BJC 7000" driver="bjc-7000" manufacturer="Canon" model="7000">
+ <parameter type="float" name="Gamma">0.600</parameter>
+ <parameter type="float" name="Density">0.800</parameter>
+ </printer>
+ <printer name="Canon BJC 7100" driver="bjc-7100" manufacturer="Canon" model="7100">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">0.800</parameter>
+ </printer>
+ <printer name="Canon BJC 8200" driver="bjc-8200" manufacturer="Canon" model="8200">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">0.800</parameter>
+ </printer>
+ <printer name="Canon S400" driver="bjc-s400" manufacturer="Canon" model="3000">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">0.800</parameter>
+ </printer>
+ <printer name="Canon S450" driver="bjc-s450" manufacturer="Canon" model="6200">
+ <parameter type="float" name="Gamma">0.750</parameter>
+ <parameter type="float" name="Density">1.000</parameter>
+ </printer>
+ <printer name="Canon S800" driver="bjc-s800" manufacturer="Canon" model="8200">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">0.800</parameter>
+ </printer>
+ <printer name="Canon S4500" driver="bjc-s4500" manufacturer="Canon" model="6500">
+ <parameter type="float" name="Gamma">0.750</parameter>
+ <parameter type="float" name="Density">1.000</parameter>
+ </printer>
+ </family>
+ <family name="escp2">
+ <printer name="EPSON Stylus C20SX" driver="escp2-c20sx" manufacturer="Epson" model="42">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C20UX" driver="escp2-c20ux" manufacturer="Epson" model="42">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C40SX" driver="escp2-c40sx" manufacturer="Epson" model="43">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C40UX" driver="escp2-c40ux" manufacturer="Epson" model="43">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C41SX" driver="escp2-c41sx" manufacturer="Epson" model="43">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C41UX" driver="escp2-c41ux" manufacturer="Epson" model="43">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C42SX" driver="escp2-c42sx" manufacturer="Epson" model="43">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C42UX" driver="escp2-c42ux" manufacturer="Epson" model="43">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C43SX" driver="escp2-c43sx" manufacturer="Epson" model="43">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C43UX" driver="escp2-c43ux" manufacturer="Epson" model="43">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C44SX" driver="escp2-c44sx" manufacturer="Epson" model="43">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C44UX" driver="escp2-c44ux" manufacturer="Epson" model="43">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C45" driver="escp2-c45" manufacturer="Epson" model="43">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C46" driver="escp2-c46" manufacturer="Epson" model="43">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C50" driver="escp2-c50" manufacturer="Epson" model="56">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C60" driver="escp2-c60" manufacturer="Epson" model="33">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C61" driver="escp2-c61" manufacturer="Epson" model="52">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C62" driver="escp2-c62" manufacturer="Epson" model="52">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C63" driver="escp2-c63" manufacturer="Epson" model="61">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C64" driver="escp2-c64" manufacturer="Epson" model="61">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C65" driver="escp2-c65" manufacturer="Epson" model="66">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C66" driver="escp2-c66" manufacturer="Epson" model="66">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C70" driver="escp2-c70" manufacturer="Epson" model="44">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C80" driver="escp2-c80" manufacturer="Epson" model="44">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C82" driver="escp2-c82" manufacturer="Epson" model="55">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C83" driver="escp2-c83" manufacturer="Epson" model="60">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C84" driver="escp2-c84" manufacturer="Epson" model="60">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C85" driver="escp2-c85" manufacturer="Epson" model="69">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus C86" driver="escp2-c86" manufacturer="Epson" model="69">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color" driver="escp2" manufacturer="Epson" model="0">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color Pro" driver="escp2-pro" manufacturer="Epson" model="45">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color Pro XL" driver="escp2-pro-xl" manufacturer="Epson" model="39">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 400" driver="escp2-400" manufacturer="Epson" model="1">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 440" driver="escp2-440" manufacturer="Epson" model="10">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 460" driver="escp2-460" manufacturer="Epson" model="10">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 480" driver="escp2-480" manufacturer="Epson" model="21">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 500" driver="escp2-500" manufacturer="Epson" model="1">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 580" driver="escp2-580" manufacturer="Epson" model="38">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 600" driver="escp2-600" manufacturer="Epson" model="3">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 640" driver="escp2-640" manufacturer="Epson" model="11">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 660" driver="escp2-660" manufacturer="Epson" model="18">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 670" driver="escp2-670" manufacturer="Epson" model="25">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 680" driver="escp2-680" manufacturer="Epson" model="32">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 740" driver="escp2-740" manufacturer="Epson" model="12">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 760" driver="escp2-760" manufacturer="Epson" model="19">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 777" driver="escp2-777" manufacturer="Epson" model="32">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 800" driver="escp2-800" manufacturer="Epson" model="4">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 850" driver="escp2-850" manufacturer="Epson" model="5">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 860" driver="escp2-860" manufacturer="Epson" model="16">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 880" driver="escp2-880" manufacturer="Epson" model="33">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 83" driver="escp2-83" manufacturer="Epson" model="33">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 900" driver="escp2-900" manufacturer="Epson" model="13">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 980" driver="escp2-980" manufacturer="Epson" model="34">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 1160" driver="escp2-1160" manufacturer="Epson" model="17">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 1500" driver="escp2-1500" manufacturer="Epson" model="2">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 1520" driver="escp2-1520" manufacturer="Epson" model="6">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Color 3000" driver="escp2-3000" manufacturer="Epson" model="24">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo" driver="escp2-photo" manufacturer="Epson" model="9">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 700" driver="escp2-700" manufacturer="Epson" model="7">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo EX" driver="escp2-ex" manufacturer="Epson" model="8">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo EX3" driver="escp2-ex3" manufacturer="Epson" model="54">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 720" driver="escp2-720" manufacturer="Epson" model="20">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 750" driver="escp2-750" manufacturer="Epson" model="14">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 780" driver="escp2-780" manufacturer="Epson" model="35">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <!--
+ Note that the 785EPX has a roll feed holder. It's more like the 890
+ than the 780, despite the name.
+ -->
+ <printer name="EPSON Stylus Photo 785EPX" driver="escp2-785" manufacturer="Epson" model="36">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 790" driver="escp2-790" manufacturer="Epson" model="35">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 810" driver="escp2-810" manufacturer="Epson" model="35">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 820" driver="escp2-820" manufacturer="Epson" model="35">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 825" driver="escp2-825" manufacturer="Epson" model="50">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 830" driver="escp2-830" manufacturer="Epson" model="50">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 870" driver="escp2-870" manufacturer="Epson" model="22">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 875" driver="escp2-875" manufacturer="Epson" model="22">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 890" driver="escp2-890" manufacturer="Epson" model="36">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 895" driver="escp2-895" manufacturer="Epson" model="36">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 900" driver="escp2-ph900" manufacturer="Epson" model="62">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 915" driver="escp2-915" manufacturer="Epson" model="36">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 925" driver="escp2-925" manufacturer="Epson" model="51">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 935" driver="escp2-935" manufacturer="Epson" model="36">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 950" driver="escp2-950" manufacturer="Epson" model="46">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 960" driver="escp2-960" manufacturer="Epson" model="46">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 1200" driver="escp2-1200" manufacturer="Epson" model="15">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 1270" driver="escp2-1270" manufacturer="Epson" model="23">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 1280" driver="escp2-1280" manufacturer="Epson" model="37">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 1290" driver="escp2-1290" manufacturer="Epson" model="37">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 2000P" driver="escp2-2000" manufacturer="Epson" model="26">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 2100" driver="escp2-2100" manufacturer="Epson" model="47">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo 2200" driver="escp2-2200" manufacturer="Epson" model="47">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo R200" driver="escp2-r200" manufacturer="Epson" model="63">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo R210" driver="escp2-r210" manufacturer="Epson" model="63">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo R300" driver="escp2-r300" manufacturer="Epson" model="63">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo R310" driver="escp2-r310" manufacturer="Epson" model="63">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo RX400" driver="escp2-rx400" manufacturer="Epson" model="63">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo RX420" driver="escp2-rx420" manufacturer="Epson" model="63">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo RX425" driver="escp2-rx425" manufacturer="Epson" model="63">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo RX430" driver="escp2-rx430" manufacturer="Epson" model="63">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo RX500" driver="escp2-rx500" manufacturer="Epson" model="63">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo RX510" driver="escp2-rx510" manufacturer="Epson" model="63">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo RX600" driver="escp2-rx600" manufacturer="Epson" model="63">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo RX620" driver="escp2-rx620" manufacturer="Epson" model="63">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo RX630" driver="escp2-rx630" manufacturer="Epson" model="63">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo R800" driver="escp2-r800" manufacturer="Epson" model="64">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Photo R1800" driver="escp2-r1800" manufacturer="Epson" model="67">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Pro 5000" driver="escp2-5000" manufacturer="Epson" model="27">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Pro 5500" driver="escp2-5500" manufacturer="Epson" model="40">
+ <parameter type="float" name="CyanGamma">0.8</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Pro 7000" driver="escp2-7000" manufacturer="Epson" model="28">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Pro 7500" driver="escp2-7500" manufacturer="Epson" model="29">
+ <parameter type="float" name="CyanGamma">0.8</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Pro 7600" driver="escp2-7600" manufacturer="Epson" model="48">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Pro 9000" driver="escp2-9000" manufacturer="Epson" model="30">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Pro 9500" driver="escp2-9500" manufacturer="Epson" model="31">
+ <parameter type="float" name="CyanGamma">0.8</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Pro 9600" driver="escp2-9600" manufacturer="Epson" model="49">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Pro 10000" driver="escp2-10000" manufacturer="Epson" model="41">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Scan 2000" driver="escp2-scan2000" manufacturer="Epson" model="12">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus Scan 2500" driver="escp2-scan2500" manufacturer="Epson" model="12">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus CX1500" driver="escp2-cx1500" manufacturer="Epson" model="43">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus CX3100" driver="escp2-cx3100" manufacturer="Epson" model="52">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus CX3200" driver="escp2-cx3200" manufacturer="Epson" model="52">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus CX3500" driver="escp2-cx3500" manufacturer="Epson" model="65">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus CX3600" driver="escp2-cx3600" manufacturer="Epson" model="65">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus CX3650" driver="escp2-cx3650" manufacturer="Epson" model="65">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus CX4600" driver="escp2-cx4600" manufacturer="Epson" model="65">
+ <parameter type="float" name="CyanGamma">0.96</parameter>
+ <parameter type="float" name="MagentaGamma">1.02</parameter>
+ <parameter type="float" name="YellowGamma">1.02</parameter>
+ <parameter type="float" name="Gamma">0.459</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus CX5100" driver="escp2-cx5100" manufacturer="Epson" model="55">
+ <parameter type="float" name="CyanGamma">0.96</parameter>
+ <parameter type="float" name="MagentaGamma">1.02</parameter>
+ <parameter type="float" name="YellowGamma">1.02</parameter>
+ <parameter type="float" name="Gamma">0.459</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus CX5200" driver="escp2-cx5200" manufacturer="Epson" model="55">
+ <parameter type="float" name="CyanGamma">0.96</parameter>
+ <parameter type="float" name="MagentaGamma">1.02</parameter>
+ <parameter type="float" name="YellowGamma">1.02</parameter>
+ <parameter type="float" name="Gamma">0.459</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus CX5300" driver="escp2-cx5300" manufacturer="Epson" model="55">
+ <parameter type="float" name="CyanGamma">0.96</parameter>
+ <parameter type="float" name="MagentaGamma">1.02</parameter>
+ <parameter type="float" name="YellowGamma">1.02</parameter>
+ <parameter type="float" name="Gamma">0.459</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus CX5400" driver="escp2-cx5400" manufacturer="Epson" model="55">
+ <parameter type="float" name="CyanGamma">0.96</parameter>
+ <parameter type="float" name="MagentaGamma">1.02</parameter>
+ <parameter type="float" name="YellowGamma">1.02</parameter>
+ <parameter type="float" name="Gamma">0.459</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus CX6300" driver="escp2-cx6300" manufacturer="Epson" model="60">
+ <parameter type="float" name="CyanGamma">0.96</parameter>
+ <parameter type="float" name="MagentaGamma">1.02</parameter>
+ <parameter type="float" name="YellowGamma">1.02</parameter>
+ <parameter type="float" name="Gamma">0.459</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus CX6400" driver="escp2-cx6400" manufacturer="Epson" model="60">
+ <parameter type="float" name="CyanGamma">0.96</parameter>
+ <parameter type="float" name="MagentaGamma">1.02</parameter>
+ <parameter type="float" name="YellowGamma">1.02</parameter>
+ <parameter type="float" name="Gamma">0.459</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus CX6500" driver="escp2-cx6500" manufacturer="Epson" model="69">
+ <parameter type="float" name="CyanGamma">0.96</parameter>
+ <parameter type="float" name="MagentaGamma">1.02</parameter>
+ <parameter type="float" name="YellowGamma">1.02</parameter>
+ <parameter type="float" name="Gamma">0.459</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus CX6600" driver="escp2-cx6600" manufacturer="Epson" model="69">
+ <parameter type="float" name="CyanGamma">0.96</parameter>
+ <parameter type="float" name="MagentaGamma">1.02</parameter>
+ <parameter type="float" name="YellowGamma">1.02</parameter>
+ <parameter type="float" name="Gamma">0.459</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus CX8300" driver="escp2-cx8300" manufacturer="Epson" model="60">
+ <parameter type="float" name="CyanGamma">0.96</parameter>
+ <parameter type="float" name="MagentaGamma">1.02</parameter>
+ <parameter type="float" name="YellowGamma">1.02</parameter>
+ <parameter type="float" name="Gamma">0.459</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON Stylus CX8400" driver="escp2-cx8400" manufacturer="Epson" model="60">
+ <parameter type="float" name="CyanGamma">0.96</parameter>
+ <parameter type="float" name="MagentaGamma">1.02</parameter>
+ <parameter type="float" name="YellowGamma">1.02</parameter>
+ <parameter type="float" name="Gamma">0.459</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON CL-700" driver="escp2-cl700" manufacturer="Epson" model="38">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON CL-750" driver="escp2-cl750" manufacturer="Epson" model="43">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON CL-760" driver="escp2-cl760" manufacturer="Epson" model="56">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">0.9</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON EM-900C" driver="escp2-em900c" manufacturer="Epson" model="13">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON EM-930C" driver="escp2-em930c" manufacturer="Epson" model="34">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON MC-2000" driver="escp2-mc2000" manufacturer="Epson" model="26">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON MC-5000" driver="escp2-mc5000" manufacturer="Epson" model="40">
+ <parameter type="float" name="CyanGamma">0.8</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON MC-7000" driver="escp2-mc7000" manufacturer="Epson" model="29">
+ <parameter type="float" name="CyanGamma">0.8</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON MC-9000" driver="escp2-mc9000" manufacturer="Epson" model="31">
+ <parameter type="float" name="CyanGamma">0.8</parameter>
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON MC-10000" driver="escp2-mc10000" manufacturer="Epson" model="41">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON MJ-930C" driver="escp2-mj930c" manufacturer="Epson" model="4">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON MJ-5100C" driver="escp2-mj5100c" manufacturer="Epson" model="39">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON MJ-6000C" driver="escp2-mj6000c" manufacturer="Epson" model="6">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON MJ-8000C" driver="escp2-mj8000c" manufacturer="Epson" model="24">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-700C" driver="escp2-pm700c" manufacturer="Epson" model="9">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-730C" driver="escp2-pm730c" manufacturer="Epson" model="35">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-740C" driver="escp2-pm740c" manufacturer="Epson" model="35">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-750C" driver="escp2-pm750c" manufacturer="Epson" model="7">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-760C" driver="escp2-pm760c" manufacturer="Epson" model="20">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-770C" driver="escp2-pm770c" manufacturer="Epson" model="14">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-780C" driver="escp2-pm780c" manufacturer="Epson" model="35">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-790PT" driver="escp2-pm790pt" manufacturer="Epson" model="36">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-800C" driver="escp2-pm800c" manufacturer="Epson" model="22">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-850PT" driver="escp2-pm850pt" manufacturer="Epson" model="51">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-870C" driver="escp2-pm870c" manufacturer="Epson" model="36">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-880C" driver="escp2-pm880c" manufacturer="Epson" model="36">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-930C" driver="escp2-pm930c" manufacturer="Epson" model="58">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-940C" driver="escp2-pm940c" manufacturer="Epson" model="58">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-950C" driver="escp2-pm950c" manufacturer="Epson" model="53">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-970C" driver="escp2-pm970c" manufacturer="Epson" model="57">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-980C" driver="escp2-pm980c" manufacturer="Epson" model="57">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-2000C" driver="escp2-pm2000c" manufacturer="Epson" model="8">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-2200C" driver="escp2-pm2200c" manufacturer="Epson" model="54">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-3000C" driver="escp2-pm3000c" manufacturer="Epson" model="15">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-3300C" driver="escp2-pm3300c" manufacturer="Epson" model="23">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-3500C" driver="escp2-pm3500c" manufacturer="Epson" model="37">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-3700C" driver="escp2-pm3700c" manufacturer="Epson" model="37">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-4000PX" driver="escp2-pm4000px" manufacturer="Epson" model="47">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-5000C" driver="escp2-pm5000c" manufacturer="Epson" model="27">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-7000C" driver="escp2-pm7000c" manufacturer="Epson" model="28">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-9000C" driver="escp2-pm9000c" manufacturer="Epson" model="30">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-10000" driver="escp2-pm10000" manufacturer="Epson" model="41">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-D750" driver="escp2-pmd750" manufacturer="Epson" model="63">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-D770" driver="escp2-pmd770" manufacturer="Epson" model="63">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-D1000" driver="escp2-pmd1000" manufacturer="Epson" model="63">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-G700" driver="escp2-pmg700" manufacturer="Epson" model="63">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-G720" driver="escp2-pmg720" manufacturer="Epson" model="63">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-G800" driver="escp2-pmg800" manufacturer="Epson" model="68">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PM-G820" driver="escp2-pmg820" manufacturer="Epson" model="68">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PX-G900" driver="escp2-pxg900" manufacturer="Epson" model="64">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PX-G920" driver="escp2-pxg920" manufacturer="Epson" model="64">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PX-G5000" driver="escp2-pxg5000" manufacturer="Epson" model="67">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PX-V500" driver="escp2-pxv500" manufacturer="Epson" model="61">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PX-V600" driver="escp2-pxv600" manufacturer="Epson" model="69">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PX-7000" driver="escp2-px7000" manufacturer="Epson" model="48">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ <printer name="EPSON PX-9000" driver="escp2-px9000" manufacturer="Epson" model="49">
+ <parameter type="float" name="Gamma">0.425</parameter>
+ <parameter type="float" name="Density">1.0</parameter>
+ </printer>
+ </family>
+ <family name="pcl">
+ <printer name="Apple Color StyleWriter 4100" driver="pcl-apple-4100" manufacturer="Apple" model="601"> <!-- Uses 600 series driver -->
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="Apple Color StyleWriter 4500" driver="pcl-apple-4500" manufacturer="Apple" model="690"> <!-- Uses 690 driver -->
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="Apple Color StyleWriter 6500" driver="pcl-apple-6500" manufacturer="Apple" model="800"> <!-- Uses 850 driver -->
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 340" driver="pcl-340" manufacturer="HP" model="340">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 400" driver="pcl-400" manufacturer="HP" model="400">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 500" driver="pcl-500" manufacturer="HP" model="500">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DesignJet 230" driver="pcl-desnj-230" manufacturer="HP" model="10230">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DesignJet 250C" driver="pcl-desnj-250" manufacturer="HP" model="10250">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DesignJet 700" driver="pcl-desnj-700" manufacturer="HP" model="10700">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DesignJet 750C" driver="pcl-750" manufacturer="HP" model="10750">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DesignJet 2500C" driver="pcl-desnj-2500" manufacturer="HP" model="12500">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DesignJet 3500C" driver="pcl-desnj-3500" manufacturer="HP" model="13500">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DesignJet 430" driver="pcl-desnj-430" manufacturer="HP" model="10230">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DesignJet 450C" driver="pcl-desnj-450" manufacturer="HP" model="10250">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DesignJet 455CA" driver="pcl-desnj-455" manufacturer="HP" model="10250">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DesignJet 488CA" driver="pcl-desnj-488" manufacturer="HP" model="10250">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 500C" driver="pcl-501" manufacturer="HP" model="501">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 520" driver="pcl-520" manufacturer="HP" model="500">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 540C" driver="pcl-540" manufacturer="HP" model="540">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 550C" driver="pcl-550" manufacturer="HP" model="550">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 560C" driver="pcl-560" manufacturer="HP" model="550">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 600/600C" driver="pcl-600" manufacturer="HP" model="600">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 600 series" driver="pcl-601" manufacturer="HP" model="601">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 690 series" driver="pcl-690" manufacturer="HP" model="690">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 810C" driver="pcl-810" manufacturer="HP" model="840"> <!-- Uses 840 driver -->
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 812C" driver="pcl-812" manufacturer="HP" model="840"> <!-- Uses 840 driver -->
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 840C" driver="pcl-840" manufacturer="HP" model="840"> <!-- Uses 840 driver -->
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 842C" driver="pcl-842" manufacturer="HP" model="840"> <!-- Uses 840 driver -->
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 845C" driver="pcl-845" manufacturer="HP" model="840"> <!-- Uses 840 driver -->
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 850C" driver="pcl-850" manufacturer="HP" model="800">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 855C" driver="pcl-855" manufacturer="HP" model="800">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 870C" driver="pcl-870" manufacturer="HP" model="800">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 890C" driver="pcl-890" manufacturer="HP" model="800">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 895C" driver="pcl-895" manufacturer="HP" model="840"> <!-- Uses 840 driver -->
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 900 series" driver="pcl-900" manufacturer="HP" model="900">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 1100C" driver="pcl-1100" manufacturer="HP" model="1100">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 1120C" driver="pcl-1120" manufacturer="HP" model="1100">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 1200C" driver="pcl-1200" manufacturer="HP" model="1200">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 1220C" driver="pcl-1220" manufacturer="HP" model="901"> <!-- Uses 900 series driver (large) -->
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 1600C" driver="pcl-1600" manufacturer="HP" model="1600">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 2000 series" driver="pcl-2000" manufacturer="HP" model="2000">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP DeskJet 2500 series" driver="pcl-2500" manufacturer="HP" model="2500">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP PhotoSmart P1000" driver="pcl-P1000" manufacturer="HP" model="900"> <!-- Uses 900 series driver -->
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP PhotoSmart P1100" driver="pcl-P1100" manufacturer="HP" model="900"> <!-- Uses 900 series driver -->
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ <printer name="HP LaserJet II series" driver="pcl-2" manufacturer="HP" model="2">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">1.000</parameter>
+ </printer>
+ <printer name="HP LaserJet IIP series" driver="pcl-2p" manufacturer="HP" model="21">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">1.000</parameter>
+ </printer>
+ <printer name="HP LaserJet III series" driver="pcl-3" manufacturer="HP" model="3">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">1.000</parameter>
+ </printer>
+ <printer name="HP LaserJet 4 series" driver="pcl-4" manufacturer="HP" model="6">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">1.000</parameter>
+ </printer>
+ <printer name="HP LaserJet 4L" driver="pcl-4l" manufacturer="HP" model="4">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">1.000</parameter>
+ </printer>
+ <printer name="HP LaserJet 4V" driver="pcl-4v" manufacturer="HP" model="5">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">1.000</parameter>
+ </printer>
+ <printer name="HP LaserJet 4Si" driver="pcl-4si" manufacturer="HP" model="51">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">1.000</parameter>
+ </printer>
+ <printer name="HP LaserJet 5 series" driver="pcl-5" manufacturer="HP" model="6">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">1.000</parameter>
+ </printer>
+ <printer name="HP LaserJet 5Si" driver="pcl-5si" manufacturer="HP" model="7">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">1.000</parameter>
+ </printer>
+ <printer name="HP LaserJet 6 series" driver="pcl-6" manufacturer="HP" model="6">
+ <parameter type="float" name="Gamma">1.000</parameter>
+ <parameter type="float" name="Density">1.000</parameter>
+ </printer>
+ <printer name="Lexmark 4076" driver="lexmark-4076" manufacturer="Lexmark" model="500">
+ <parameter type="float" name="Gamma">0.818</parameter>
+ <parameter type="float" name="Density">0.786</parameter>
+ </printer>
+ </family>
+ <family name="lexmark">
+ <printer name="Lexmark Z42" driver="lexmark-z42" manufacturer="Lexmark" model="10042">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">1.0</parameter>
+ <parameter type="float" name="Gamma">0.5</parameter>
+ <parameter type="float" name="Density">2.0</parameter>
+ </printer>
+ <printer name="Lexmark Z43" driver="lexmark-z43" manufacturer="Lexmark" model="10042">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">1.0</parameter>
+ <parameter type="float" name="Gamma">0.5</parameter>
+ <parameter type="float" name="Density">2.0</parameter>
+ </printer>
+ <printer name="Lexmark Z52" driver="lexmark-z52" manufacturer="Lexmark" model="10052">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">1.0</parameter>
+ <parameter type="float" name="Gamma">0.5</parameter>
+ <parameter type="float" name="Density">2.0</parameter>
+ </printer>
+ <printer name="Lexmark Z53" driver="lexmark-z53" manufacturer="Lexmark" model="10052">
+ <parameter type="float" name="MagentaGamma">0.95</parameter>
+ <parameter type="float" name="YellowGamma">1.0</parameter>
+ <parameter type="float" name="Gamma">0.5</parameter>
+ <parameter type="float" name="Density">2.0</parameter>
+ </printer>
+ </family>
+ <family name="olympus">
+ <printer name="Olympus P10" driver="olympus-p10" manufacturer="Olympus" model="2">
+ </printer>
+ <printer name="Olympus P200" driver="olympus-p200" manufacturer="Olympus" model="4">
+ </printer>
+ <printer name="Olympus P300" driver="olympus-p300" manufacturer="Olympus" model="0">
+ </printer>
+ <printer name="Olympus P400" driver="olympus-p400" manufacturer="Olympus" model="1">
+ </printer>
+ <printer name="Olympus P440" driver="olympus-p440" manufacturer="Olympus" model="3">
+ </printer>
+ <printer name="Canon CP100" driver="canon-cp100" manufacturer="Canon" model="1000">
+ </printer>
+ <printer name="Canon CP220" driver="canon-cp220" manufacturer="Canon" model="1001">
+ </printer>
+ <printer name="Sony UP-DP10" driver="sony-updp10" manufacturer="Sony" model="2000">
+ </printer>
+ <printer name="Fujifilm Printpix CX-400" driver="fujifilm-cx400" manufacturer="Fujifilm" model="3000">
+ </printer>
+ <printer name="Fujifilm Printpix CX-550" driver="fujifilm-cx550" manufacturer="Fujifilm" model="3001">
+ </printer>
+ </family>
+ <family name="raw">
+ <printer name="RAW DATA 16 bit" driver="raw-data-16" manufacturer="" model="0">
+ </printer>
+ <printer name="RAW DATA 8 bit" driver="raw-data-8" manufacturer="" model="1">
+ </printer>
+ </family>
+ </printdef>
+</gutenprint>
diff --git a/src/main/quickmatrix257.h b/src/main/quickmatrix257.h
deleted file mode 100644
index 8c5f9e1..0000000
--- a/src/main/quickmatrix257.h
+++ /dev/null
@@ -1,6027 +0,0 @@
-/*
- * "$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
deleted file mode 100644
index 4b1cbe2..0000000
--- a/src/main/ran.367.179.h
+++ /dev/null
@@ -1,5995 +0,0 @@
-/*
- * "$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
deleted file mode 100644
index f6dd323..0000000
--- a/src/main/ran.509.131.h
+++ /dev/null
@@ -1,6084 +0,0 @@
-/*
- * "$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/main/sequence.c b/src/main/sequence.c
new file mode 100644
index 0000000..f51a6ed
--- /dev/null
+++ b/src/main/sequence.c
@@ -0,0 +1,533 @@
+/*
+ * "$Id: sequence.c,v 1.21 2005/06/30 02:11:49 rlk Exp $"
+ *
+ * Sequence data type. This type is designed to be derived from by
+ * the curve and dither matrix types.
+ *
+ * Copyright 2002-2003 Robert Krawitz (rlk@alum.mit.edu)
+ * Copyright 2003 Roger Leigh (rleigh@debian.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 <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include <gutenprint/sequence.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <math.h>
+#ifdef sun
+#include <ieeefp.h>
+#endif
+#include <string.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <errno.h>
+#include <ctype.h>
+
+struct stp_sequence
+{
+ int recompute_range; /* Do we need to recompute the min and max? */
+ double blo; /* Lower bound */
+ double bhi; /* Upper bound */
+ double rlo; /* Lower range limit */
+ double rhi; /* Upper range limit */
+ size_t size; /* Number of points */
+ double *data; /* Array of doubles */
+ float *float_data; /* Data converted to other form */
+ long *long_data;
+ unsigned long *ulong_data;
+ int *int_data;
+ unsigned *uint_data;
+ short *short_data;
+ unsigned short *ushort_data;
+};
+
+/*
+ * We could do more sanity checks here if we want.
+ */
+static inline void
+check_sequence(const stp_sequence_t *v)
+{
+ if (v == NULL)
+ {
+ stp_erprintf("Null stp_sequence_t! Please report this bug.\n");
+ stp_abort();
+ }
+}
+
+static stp_sequence_t *
+deconst_sequence(const stp_sequence_t *sequence)
+{
+ return (stp_sequence_t *) sequence;
+}
+
+static void
+sequence_ctor(stp_sequence_t *sequence)
+{
+ sequence->rlo = sequence->blo = 0.0;
+ sequence->rhi = sequence->bhi = 1.0;
+ sequence->recompute_range = 1;
+ sequence->size = 0;
+ sequence->data = NULL;
+}
+
+stp_sequence_t *
+stp_sequence_create(void)
+{
+ stp_sequence_t *ret;
+ ret = stp_zalloc(sizeof(stp_sequence_t));
+ sequence_ctor(ret);
+ return ret;
+}
+
+static void
+invalidate_auxilliary_data(stp_sequence_t *sequence)
+{
+ STP_SAFE_FREE(sequence->float_data);
+ STP_SAFE_FREE(sequence->long_data);
+ STP_SAFE_FREE(sequence->ulong_data);
+ STP_SAFE_FREE(sequence->int_data);
+ STP_SAFE_FREE(sequence->uint_data);
+ STP_SAFE_FREE(sequence->short_data);
+ STP_SAFE_FREE(sequence->ushort_data);
+}
+
+static void
+sequence_dtor(stp_sequence_t *sequence)
+{
+ invalidate_auxilliary_data(sequence);
+ if (sequence->data)
+ stp_free(sequence->data);
+ memset(sequence, 0, sizeof(stp_sequence_t));
+}
+
+void
+stp_sequence_destroy(stp_sequence_t *sequence)
+{
+ check_sequence(sequence);
+ sequence_dtor(sequence);
+ stp_free(sequence);
+}
+
+void
+stp_sequence_copy(stp_sequence_t *dest, const stp_sequence_t *source)
+{
+ check_sequence(dest);
+ check_sequence(source);
+
+ dest->recompute_range = source->recompute_range;
+ dest->blo = source->blo;
+ dest->bhi = source->bhi;
+ dest->rlo = source->rlo;
+ dest->rhi = source->rhi;
+ dest->size = source->size;
+ dest->data = stp_zalloc(sizeof(double) * source->size);
+ memcpy(dest->data, source->data, (sizeof(double) * source->size));
+}
+
+stp_sequence_t *
+stp_sequence_create_copy(const stp_sequence_t *sequence)
+{
+ stp_sequence_t *ret;
+ check_sequence(sequence);
+ ret = stp_sequence_create();
+ stp_sequence_copy(ret, sequence);
+ return ret;
+}
+
+int
+stp_sequence_set_bounds(stp_sequence_t *sequence, double low, double high)
+{
+ check_sequence(sequence);
+ if (low > high)
+ return 0;
+ sequence->rlo = sequence->blo = low;
+ sequence->rhi = sequence->bhi = high;
+ sequence->recompute_range = 1;
+ return 1;
+}
+
+void
+stp_sequence_get_bounds(const stp_sequence_t *sequence,
+ double *low, double *high)
+{
+ check_sequence(sequence);
+ *low = sequence->blo;
+ *high = sequence->bhi;
+}
+
+
+/*
+ * Find the minimum and maximum points on the curve.
+ */
+static void
+scan_sequence_range(stp_sequence_t *sequence)
+{
+ int i;
+ sequence->rlo = sequence->bhi;
+ sequence->rhi = sequence->blo;
+ if (sequence->size)
+ for (i = 0; i < sequence->size; i++)
+ {
+ if (sequence->data[i] < sequence->rlo)
+ sequence->rlo = sequence->data[i];
+ if (sequence->data[i] > sequence->rhi)
+ sequence->rhi = sequence->data[i];
+ }
+ sequence->recompute_range = 0; /* Don't recompute unless the data changes */
+}
+
+void
+stp_sequence_get_range(const stp_sequence_t *sequence,
+ double *low, double *high)
+{
+ if (sequence->recompute_range) /* Don't recompute the range if we don't
+ need to. */
+ scan_sequence_range(deconst_sequence(sequence));
+ *low = sequence->rlo;
+ *high = sequence->rhi;
+}
+
+
+int
+stp_sequence_set_size(stp_sequence_t *sequence, size_t size)
+{
+ check_sequence(sequence);
+ if (sequence->data) /* Free old data */
+ {
+ stp_free(sequence->data);
+ sequence->data = NULL;
+ }
+ sequence->size = size;
+ sequence->recompute_range = 1; /* Always recompute on change */
+ if (size == 0)
+ return 1;
+ invalidate_auxilliary_data(sequence);
+ sequence->data = stp_zalloc(sizeof(double) * size);
+ return 1;
+}
+
+
+size_t
+stp_sequence_get_size(const stp_sequence_t *sequence)
+{
+ check_sequence(sequence);
+ return sequence->size;
+}
+
+
+
+int
+stp_sequence_set_data(stp_sequence_t *sequence,
+ size_t size, const double *data)
+{
+ check_sequence(sequence);
+ sequence->size = size;
+ if (sequence->data)
+ stp_free(sequence->data);
+ sequence->data = stp_zalloc(sizeof(double) * size);
+ memcpy(sequence->data, data, (sizeof(double) * size));
+ invalidate_auxilliary_data(sequence);
+ sequence->recompute_range = 1;
+ return 1;
+}
+
+int
+stp_sequence_set_subrange(stp_sequence_t *sequence, size_t where,
+ size_t size, const double *data)
+{
+ check_sequence(sequence);
+ if (where + size > sequence->size) /* Exceeds data size */
+ return 0;
+ memcpy(sequence->data+where, data, (sizeof(double) * size));
+ invalidate_auxilliary_data(sequence);
+ sequence->recompute_range = 1;
+ return 1;
+}
+
+
+void
+stp_sequence_get_data(const stp_sequence_t *sequence, size_t *size,
+ const double **data)
+{
+ check_sequence(sequence);
+ *size = sequence->size;
+ *data = sequence->data;
+}
+
+
+int
+stp_sequence_set_point(stp_sequence_t *sequence, size_t where,
+ double data)
+{
+ check_sequence(sequence);
+
+ if (where >= sequence->size || ! finite(data) ||
+ data < sequence->blo || data > sequence->bhi)
+ return 0;
+
+ if (sequence->recompute_range == 0 && (data < sequence->rlo ||
+ data > sequence->rhi ||
+ sequence->data[where] == sequence->rhi ||
+ sequence->data[where] == sequence->rlo))
+ sequence->recompute_range = 1;
+
+ sequence->data[where] = data;
+ invalidate_auxilliary_data(sequence);
+ return 1;
+}
+
+int
+stp_sequence_get_point(const stp_sequence_t *sequence, size_t where,
+ double *data)
+{
+ check_sequence(sequence);
+
+ if (where >= sequence->size)
+ return 0;
+ *data = sequence->data[where];
+ return 1;
+}
+
+stp_sequence_t *
+stp_sequence_create_from_xmltree(stp_mxml_node_t *da)
+{
+ const char *stmp;
+ stp_sequence_t *ret = NULL;
+ size_t point_count;
+ double low, high;
+ int i;
+
+ ret = stp_sequence_create();
+
+ /* Get curve point count */
+ stmp = stp_mxmlElementGetAttr(da, "count");
+ if (stmp)
+ {
+ point_count = (size_t) stp_xmlstrtoul(stmp);
+ if ((stp_xmlstrtol(stmp)) < 0)
+ {
+ stp_erprintf("stp_sequence_create_from_xmltree: \"count\" is less than zero\n");
+ goto error;
+ }
+ }
+ else
+ {
+ stp_erprintf("stp_sequence_create_from_xmltree: \"count\" missing\n");
+ goto error;
+ }
+ /* Get lower bound */
+ stmp = stp_mxmlElementGetAttr(da, "lower-bound");
+ if (stmp)
+ {
+ low = stp_xmlstrtod(stmp);
+ }
+ else
+ {
+ stp_erprintf("stp_sequence_create_from_xmltree: \"lower-bound\" missing\n");
+ goto error;
+ }
+ /* Get upper bound */
+ stmp = stp_mxmlElementGetAttr(da, "upper-bound");
+ if (stmp)
+ {
+ high = stp_xmlstrtod(stmp);
+ }
+ else
+ {
+ stp_erprintf("stp_sequence_create_from_xmltree: \"upper-bound\" missing\n");
+ goto error;
+ }
+
+ stp_deprintf(STP_DBG_XML,
+ "stp_sequence_create_from_xmltree: stp_sequence_set_size: %d\n",
+ point_count);
+ stp_sequence_set_size(ret, point_count);
+ stp_sequence_set_bounds(ret, low, high);
+
+ /* Now read in the data points */
+ if (point_count)
+ {
+ stp_mxml_node_t *child = da->child;
+ i = 0;
+ while (child && i < point_count)
+ {
+ if (child->type == STP_MXML_TEXT)
+ {
+ char *endptr;
+ double tmpval = strtod(child->value.text.string, &endptr);
+ if (endptr == child->value.text.string)
+ {
+ stp_erprintf
+ ("stp_sequence_create_from_xmltree: bad data %s\n",
+ child->value.text.string);
+ goto error;
+ }
+ if (! finite(tmpval)
+ || ( tmpval == 0 && errno == ERANGE )
+ || tmpval < low
+ || tmpval > high)
+ {
+ stp_erprintf("stp_sequence_create_from_xmltree: "
+ "read aborted: datum out of bounds: "
+ "%g (require %g <= x <= %g), n = %d\n",
+ tmpval, low, high, i);
+ goto error;
+ }
+ /* Datum was valid, so now add to the sequence */
+ stp_sequence_set_point(ret, i, tmpval);
+ i++;
+ child = child->next;
+ }
+ }
+ if (i < point_count)
+ {
+ stp_erprintf("stp_sequence_create_from_xmltree: "
+ "read aborted: too little data "
+ "(n=%d, needed %d)\n", i, point_count);
+ goto error;
+ }
+ }
+
+ return ret;
+
+ error:
+ stp_erprintf("stp_sequence_create_from_xmltree: error during sequence read\n");
+ if (ret)
+ stp_sequence_destroy(ret);
+ return NULL;
+}
+
+stp_mxml_node_t *
+stp_xmltree_create_from_sequence(const stp_sequence_t *seq) /* The sequence */
+{
+ size_t pointcount;
+ double low;
+ double high;
+
+ char *count;
+ char *lower_bound;
+ char *upper_bound;
+
+ stp_mxml_node_t *seqnode;
+
+ int i; /* loop counter */
+
+ pointcount = stp_sequence_get_size(seq);
+ stp_sequence_get_bounds(seq, &low, &high);
+
+ /* should count be of greater precision? */
+ stp_asprintf(&count, "%lu", (unsigned long) pointcount);
+ stp_asprintf(&lower_bound, "%g", low);
+ stp_asprintf(&upper_bound, "%g", high);
+
+ seqnode = stp_mxmlNewElement(NULL, "sequence");
+ (void) stp_mxmlElementSetAttr(seqnode, "count", count);
+ (void) stp_mxmlElementSetAttr(seqnode, "lower-bound", lower_bound);
+ (void) stp_mxmlElementSetAttr(seqnode, "upper-bound", upper_bound);
+
+ stp_free(count);
+ stp_free(lower_bound);
+ stp_free(upper_bound);
+
+ /* Write the curve points into the node content */
+ if (pointcount) /* Is there any data to write? */
+ {
+ for (i = 0; i < pointcount; i++)
+ {
+ double dval;
+ char *sval;
+
+ if ((stp_sequence_get_point(seq, i, &dval)) != 1)
+ goto error;
+
+ stp_asprintf(&sval, "%g", dval);
+ stp_mxmlNewText(seqnode, 1, sval);
+ stp_free(sval);
+ }
+ }
+ return seqnode;
+
+ error:
+ if (seqnode)
+ stp_mxmlDelete(seqnode);
+ return NULL;
+}
+
+
+/* "Overloaded" functions */
+
+#define DEFINE_DATA_SETTER(t, name) \
+int \
+stp_sequence_set_##name##_data(stp_sequence_t *sequence, \
+ size_t count, const t *data) \
+{ \
+ int i; \
+ check_sequence(sequence); \
+ if (count < 2) \
+ return 0; \
+ \
+ /* Validate the data before we commit to it. */ \
+ for (i = 0; i < count; i++) \
+ if (! finite(data[i]) || \
+ data[i] < sequence->blo || \
+ data[i] > sequence->bhi) \
+ return 0; \
+ stp_sequence_set_size(sequence, count); \
+ for (i = 0; i < count; i++) \
+ stp_sequence_set_point(sequence, i, (double) data[i]); \
+ return 1; \
+}
+
+DEFINE_DATA_SETTER(float, float)
+DEFINE_DATA_SETTER(long, long)
+DEFINE_DATA_SETTER(unsigned long, ulong)
+DEFINE_DATA_SETTER(int, int)
+DEFINE_DATA_SETTER(unsigned int, uint)
+DEFINE_DATA_SETTER(short, short)
+DEFINE_DATA_SETTER(unsigned short, ushort)
+
+#define DEFINE_DATA_ACCESSOR(t, lb, ub, name) \
+const t * \
+stp_sequence_get_##name##_data(const stp_sequence_t *sequence, size_t *count) \
+{ \
+ int i; \
+ if (sequence->blo < (double) lb || sequence->bhi > (double) ub) \
+ return NULL; \
+ if (!sequence->name##_data) \
+ { \
+ stp_sequence_t *seq = deconst_sequence(sequence); \
+ seq->name##_data = stp_zalloc(sizeof(t) * sequence->size); \
+ for (i = 0; i < sequence->size; i++) \
+ seq->name##_data[i] = (t) sequence->data[i]; \
+ } \
+ *count = sequence->size; \
+ return sequence->name##_data; \
+}
+
+#ifndef HUGE_VALF /* ISO constant, from <math.h> */
+#define HUGE_VALF 3.402823466E+38F
+#endif
+
+DEFINE_DATA_ACCESSOR(float, -HUGE_VALF, HUGE_VALF, float)
+DEFINE_DATA_ACCESSOR(long, LONG_MIN, LONG_MAX, long)
+DEFINE_DATA_ACCESSOR(unsigned long, 0, ULONG_MAX, ulong)
+DEFINE_DATA_ACCESSOR(int, INT_MIN, INT_MAX, int)
+DEFINE_DATA_ACCESSOR(unsigned int, 0, UINT_MAX, uint)
+DEFINE_DATA_ACCESSOR(short, SHRT_MIN, SHRT_MAX, short)
+DEFINE_DATA_ACCESSOR(unsigned short, 0, USHRT_MAX, ushort)
diff --git a/src/main/string-list.c b/src/main/string-list.c
new file mode 100644
index 0000000..8d7ac3c
--- /dev/null
+++ b/src/main/string-list.c
@@ -0,0 +1,157 @@
+/*
+ * "$Id: string-list.c,v 1.19 2005/06/15 01:13:41 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <string.h>
+
+static void
+free_list_element(void *item)
+{
+ stp_param_string_t *string = (stp_param_string_t *) (item);
+ stp_free((char *) string->name);
+ stp_free((char *) string->text);
+ stp_free(string);
+}
+
+static const char *
+namefunc(const void *item)
+{
+ const stp_param_string_t *string = (const stp_param_string_t *) (item);
+ return string->name;
+}
+
+static void *
+copyfunc(const void *item)
+{
+ const stp_param_string_t *string = (const stp_param_string_t *) (item);
+ stp_param_string_t *new_string = stp_malloc(sizeof(stp_param_string_t));
+ new_string->name = stp_strdup(string->name);
+ new_string->text = stp_strdup(string->text);
+ return new_string;
+}
+
+static const char *
+long_namefunc(const void *item)
+{
+ const stp_param_string_t *string = (const stp_param_string_t *) (item);
+ return string->text;
+}
+
+stp_string_list_t *
+stp_string_list_create(void)
+{
+ stp_list_t *ret = stp_list_create();
+ stp_list_set_freefunc(ret, free_list_element);
+ stp_list_set_namefunc(ret, namefunc);
+ stp_list_set_copyfunc(ret, copyfunc);
+ stp_list_set_long_namefunc(ret, long_namefunc);
+ return (stp_string_list_t *) ret;
+}
+
+void
+stp_string_list_destroy(stp_string_list_t *list)
+{
+ stp_list_destroy((stp_list_t *) list);
+}
+
+stp_param_string_t *
+stp_string_list_param(const stp_string_list_t *list, size_t element)
+{
+ stp_list_item_t *answer =
+ stp_list_get_item_by_index((const stp_list_t *)list, element);
+ if (answer)
+ return (stp_param_string_t *) stp_list_item_get_data(answer);
+ else
+ return NULL;
+}
+
+stp_param_string_t *
+stp_string_list_find(const stp_string_list_t *list, const char *name)
+{
+ stp_list_item_t *answer =
+ stp_list_get_item_by_name((const stp_list_t *)list, name);
+ if (answer)
+ return (stp_param_string_t *) stp_list_item_get_data(answer);
+ else
+ return NULL;
+}
+
+size_t
+stp_string_list_count(const stp_string_list_t *list)
+{
+ return stp_list_get_length((const stp_list_t *)list);
+}
+
+stp_string_list_t *
+stp_string_list_create_copy(const stp_string_list_t *list)
+{
+ return (stp_string_list_t *) stp_list_copy((const stp_list_t *)list);
+}
+
+stp_string_list_t *
+stp_string_list_create_from_params(const stp_param_string_t *list,
+ size_t count)
+{
+ size_t i = 0;
+ stp_string_list_t *retval = stp_string_list_create();
+ for (i = 0; i < count; i++)
+ stp_string_list_add_string(retval, list[i].name, list[i].text);
+ return retval;
+}
+
+void
+stp_string_list_add_string(stp_string_list_t *list,
+ const char *name,
+ const char *text)
+{
+ stp_param_string_t *new_string = stp_malloc(sizeof(stp_param_string_t));
+ new_string->name = stp_strdup(name);
+ new_string->text = stp_strdup(text);
+ stp_list_item_create((stp_list_t *) list, NULL, new_string);
+}
+
+void
+stp_string_list_remove_string(stp_string_list_t *list,
+ const char *name)
+{
+ stp_list_item_t *item =
+ stp_list_get_item_by_name((const stp_list_t *) list, name);
+ if (item)
+ stp_list_item_destroy((stp_list_t *) list, item);
+}
+
+int
+stp_string_list_is_present(const stp_string_list_t *list,
+ const char *value)
+{
+ if (list && value &&
+ stp_list_get_item_by_name((const stp_list_t *) list, value))
+ return 1;
+ else
+ return 0;
+}
diff --git a/src/main/util.h b/src/main/util.h
new file mode 100644
index 0000000..5b3e01b
--- /dev/null
+++ b/src/main/util.h
@@ -0,0 +1,77 @@
+/*
+ * "$Id: util.h,v 1.32 2004/09/17 18:38:27 rleigh Exp $"
+ *
+ * Gutenprint header.
+ *
+ * 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
+ */
+
+/**
+ * @file src/main/util.h
+ * @brief Utility functions (internal).
+ */
+
+/*
+ * 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 GUTENPRINT_INTERNAL_UTIL_H
+#define GUTENPRINT_INTERNAL_UTIL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef __GNUC__
+#ifndef __attribute__
+#define __attribute__(ignore)
+#endif
+#endif
+
+/**
+ * Utility functions (internal).
+ *
+ * @defgroup util_internal util-internal
+ * @{
+ */
+
+
+/*
+ * FIXME Need somewhere else to put these initialization routines
+ * which users shouldn't call.
+ */
+
+extern void stpi_init_paper(void);
+extern void stpi_init_dither(void);
+extern void stpi_init_printer(void);
+
+/** @} */
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* GUTENPRINT_INTERNAL_UTIL_H */
+/*
+ * End of "$Id: util.h,v 1.32 2004/09/17 18:38:27 rleigh Exp $".
+ */
diff --git a/src/main/xml.c b/src/main/xml.c
new file mode 100644
index 0000000..ac64537
--- /dev/null
+++ b/src/main/xml.c
@@ -0,0 +1,429 @@
+/*
+ * "$Id: xml.c,v 1.33 2004/09/17 18:38:27 rleigh Exp $"
+ *
+ * XML parser - process Gutenprint XML data with mxml.
+ *
+ * Copyright 2002-2003 Roger Leigh (rleigh@debian.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 <config.h>
+#endif
+#include <gutenprint/gutenprint.h>
+#include "gutenprint-internal.h"
+#include <gutenprint/gutenprint-intl-internal.h>
+#include <assert.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <errno.h>
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#if defined(HAVE_VARARGS_H) && !defined(HAVE_STDARG_H)
+#include <varargs.h>
+#else
+#include <stdarg.h>
+#endif
+
+typedef struct
+{
+ char *name;
+ stp_xml_parse_func parse_func;
+} stpi_xml_parse_registry;
+
+static stp_list_t *stpi_xml_registry;
+
+static stp_list_t *stpi_xml_preloads;
+
+static const char *
+xml_registry_namefunc(const void *item)
+{
+ const stpi_xml_parse_registry *xmlp = (const stpi_xml_parse_registry *) item;
+ return xmlp->name;
+}
+
+static void
+xml_registry_freefunc(void *item)
+{
+ stpi_xml_parse_registry *xmlp = (stpi_xml_parse_registry *) item;
+ stp_free(xmlp->name);
+ stp_free(xmlp);
+}
+
+static const char *
+xml_preload_namefunc(const void *item)
+{
+ return (const char *) item;
+}
+
+static void
+xml_preload_freefunc(void *item)
+{
+ stp_free(item);
+}
+
+void
+stp_register_xml_parser(const char *name, stp_xml_parse_func parse_func)
+{
+ stpi_xml_parse_registry *xmlp;
+ stp_list_item_t *item = stp_list_get_item_by_name(stpi_xml_registry, name);
+ if (item)
+ xmlp = (stpi_xml_parse_registry *) stp_list_item_get_data(item);
+ else
+ {
+ xmlp = stp_malloc(sizeof(stpi_xml_parse_registry));
+ xmlp->name = stp_strdup(name);
+ stp_list_item_create(stpi_xml_registry, NULL, xmlp);
+ }
+ xmlp->parse_func = parse_func;
+}
+
+void
+stp_unregister_xml_parser(const char *name)
+{
+ stp_list_item_t *item = stp_list_get_item_by_name(stpi_xml_registry, name);
+ if (item)
+ stp_list_item_destroy(stpi_xml_registry, item);
+}
+
+void
+stp_register_xml_preload(const char *filename)
+{
+ stp_list_item_t *item = stp_list_get_item_by_name(stpi_xml_preloads, filename);
+ if (!item)
+ {
+ char *the_filename = stp_strdup(filename);
+ stp_list_item_create(stpi_xml_preloads, NULL, the_filename);
+ }
+}
+
+void
+stp_unregister_xml_preload(const char *name)
+{
+ stp_list_item_t *item = stp_list_get_item_by_name(stpi_xml_preloads, name);
+ if (item)
+ stp_list_item_destroy(stpi_xml_preloads, item);
+}
+
+
+static void stpi_xml_process_gutenprint(stp_mxml_node_t *gutenprint, const char *file);
+
+static char *saved_lc_collate; /* Saved LC_COLLATE */
+static char *saved_lc_ctype; /* Saved LC_CTYPE */
+static char *saved_lc_numeric; /* Saved LC_NUMERIC */
+static int xml_is_initialised; /* Flag for init */
+
+void
+stp_xml_preinit(void)
+{
+ static int xml_is_preinitialized = 0;
+ if (!xml_is_preinitialized)
+ {
+ stpi_xml_registry = stp_list_create();
+ stp_list_set_freefunc(stpi_xml_registry, xml_registry_freefunc);
+ stp_list_set_namefunc(stpi_xml_registry, xml_registry_namefunc);
+ stpi_xml_preloads = stp_list_create();
+ stp_list_set_freefunc(stpi_xml_preloads, xml_preload_freefunc);
+ stp_list_set_namefunc(stpi_xml_preloads, xml_preload_namefunc);
+ }
+}
+
+/*
+ * Call before using any of the static functions in this file. All
+ * public functions should call this before using any mxml
+ * functions.
+ */
+void
+stp_xml_init(void)
+{
+ if (xml_is_initialised >= 1)
+ {
+ xml_is_initialised++;
+ return;
+ }
+
+ /* Set some locale facets to "C" */
+ saved_lc_collate = setlocale(LC_COLLATE, "C");
+ saved_lc_ctype = setlocale(LC_CTYPE, "C");
+ saved_lc_numeric = setlocale(LC_NUMERIC, "C");
+
+ xml_is_initialised = 1;
+}
+
+/*
+ * Call after using any of the static functions in this file. All
+ * public functions should call this after using any mxml functions.
+ */
+void
+stp_xml_exit(void)
+{
+ if (xml_is_initialised > 1) /* don't restore original state */
+ {
+ xml_is_initialised--;
+ return;
+ }
+ else if (xml_is_initialised < 1)
+ return;
+
+ /* Restore locale */
+ setlocale(LC_COLLATE, saved_lc_collate);
+ setlocale(LC_CTYPE, saved_lc_ctype);
+ setlocale(LC_NUMERIC, saved_lc_numeric);
+ xml_is_initialised = 0;
+}
+
+void
+stp_xml_parse_file_named(const char *name)
+{
+ stp_list_t *dir_list; /* List of directories to scan */
+ stp_list_t *file_list; /* List of XML files */
+ stp_list_item_t *item; /* Pointer to current list item */
+ if (!(dir_list = stp_list_create()))
+ return;
+ stp_list_set_freefunc(dir_list, stp_list_node_free_data);
+ if (getenv("STP_DATA_PATH"))
+ stp_path_split(dir_list, getenv("STP_DATA_PATH"));
+ else
+ stp_path_split(dir_list, PKGXMLDATADIR);
+ file_list = stp_path_search(dir_list, name);
+ stp_list_destroy(dir_list);
+ item = stp_list_get_start(file_list);
+ while (item)
+ {
+ stp_deprintf(STP_DBG_XML,
+ "stp_xml_parse_file_named: source file: %s\n",
+ (const char *) stp_list_item_get_data(item));
+ stp_xml_parse_file((const char *) stp_list_item_get_data(item));
+ item = stp_list_item_next(item);
+ }
+ stp_list_destroy(file_list);
+}
+
+
+/*
+ * Read all available XML files.
+ */
+int
+stp_xml_init_defaults(void)
+{
+ stp_list_item_t *item; /* Pointer to current list item */
+
+ stp_xml_init();
+
+ /* Parse each XML file */
+ item = stp_list_get_start(stpi_xml_preloads);
+ while (item)
+ {
+ stp_deprintf(STP_DBG_XML, "stp_xml_init_defaults: source file: %s\n",
+ (const char *) stp_list_item_get_data(item));
+ stp_xml_parse_file_named((const char *) stp_list_item_get_data(item));
+ item = stp_list_item_next(item);
+ }
+ stp_list_destroy(stpi_xml_preloads);
+
+ stp_xml_exit();
+
+ return 0;
+}
+
+
+/*
+ * Parse a single XML file.
+ */
+int
+stp_xml_parse_file(const char *file) /* File to parse */
+{
+ stp_mxml_node_t *doc;
+ stp_mxml_node_t *cur;
+ FILE *fp;
+
+ stp_deprintf(STP_DBG_XML, "stp_xml_parse_file: reading `%s'...\n", file);
+
+ fp = fopen(file, "r");
+ if (!fp)
+ {
+ stp_erprintf("stp_xml_parse_file: unable to open %s: %s\n", file,
+ strerror(errno));
+ return 1;
+ }
+
+ stp_xml_init();
+
+ doc = stp_mxmlLoadFile(NULL, fp, STP_MXML_NO_CALLBACK);
+ fclose(fp);
+
+ cur = doc->child;
+ while (cur &&
+ (cur->type != STP_MXML_ELEMENT ||
+ (strcmp(cur->value.element.name, "gutenprint") != 0 &&
+ strcmp(cur->value.element.name, "gimp-print") != 0)))
+ cur = cur->next;
+
+ if (cur == NULL || cur->type != STP_MXML_ELEMENT)
+ {
+ stp_erprintf("stp_xml_parse_file: %s: parse error\n", file);
+ stp_mxmlDelete(doc);
+ return 1;
+ }
+
+ if (strcmp(cur->value.element.name, "gutenprint") != 0 &&
+ strcmp(cur->value.element.name, "gimp-print") != 0)
+ {
+ stp_erprintf
+ ("XML file of the wrong type, root node is %s != (gutenprint || gimp-print)",
+ cur->value.element.name);
+ stp_mxmlDelete(doc);
+ return 1;
+ }
+
+ /* The XML file was read and is the right format */
+
+ stpi_xml_process_gutenprint(cur, file);
+ stp_mxmlDelete(doc);
+
+ stp_xml_exit();
+
+ return 0;
+}
+
+/*
+ * Convert a text string into an integer.
+ */
+long
+stp_xmlstrtol(const char *textval)
+{
+ long val; /* The value to return */
+ val = strtol(textval, (char **)NULL, 10);
+
+ return val;
+}
+
+/*
+ * Convert a text string into an unsigned int.
+ */
+unsigned long
+stp_xmlstrtoul(const char *textval)
+{
+ unsigned long val; /* The value to return */
+ val = strtoul(textval, (char **)NULL, 10);
+
+ return val;
+}
+
+/*
+ * Convert a text string into a double.
+ */
+double
+stp_xmlstrtod(const char *textval)
+{
+ double val; /* The value to return */
+ val = strtod(textval, (char **)NULL);
+
+ return val;
+}
+
+
+/*
+ * Find a node in an XML tree. This function takes an xmlNodePtr,
+ * followed by a NULL-terminated list of nodes which are required.
+ * For example stp_xml_get_node(myroot, "gutenprint", "dither") will
+ * return the first dither node in the tree. Additional dither nodes
+ * cannot be accessed with this function.
+ */
+stp_mxml_node_t *
+stp_xml_get_node(stp_mxml_node_t *xmlroot, ...)
+{
+ stp_mxml_node_t *child;
+ va_list ap;
+ const char *target = NULL;
+
+ va_start(ap, xmlroot);
+
+ child = xmlroot;
+ target = va_arg(ap, const char *);
+
+ while (target && child)
+ {
+ child = stp_mxmlFindElement(child, child, target, NULL, NULL, STP_MXML_DESCEND);
+ target = va_arg(ap, const char *);
+ }
+ va_end(ap);
+ return child;
+}
+
+static void
+stpi_xml_process_node(stp_mxml_node_t *node, const char *file)
+{
+ stp_list_item_t *item =
+ stp_list_get_item_by_name(stpi_xml_registry, node->value.element.name);
+ if (item)
+ {
+ stpi_xml_parse_registry *xmlp =
+ (stpi_xml_parse_registry *) stp_list_item_get_data(item);
+ (xmlp->parse_func)(node, file);
+ }
+}
+
+/*
+ * Parse the <gutenprint> root node.
+ */
+static void
+stpi_xml_process_gutenprint(stp_mxml_node_t *cur, const char *file) /* The node to parse */
+{
+ stp_mxml_node_t *child; /* Child node pointer */
+
+ child = cur->child;
+ while (child)
+ {
+ /* process nodes with corresponding parser */
+ if (child->type == STP_MXML_ELEMENT)
+ stpi_xml_process_node(child, file);
+ child = child->next;
+ }
+}
+
+/*
+ * Create a basic gutenprint XML document tree root
+ */
+stp_mxml_node_t *
+stp_xmldoc_create_generic(void)
+{
+ stp_mxml_node_t *doc;
+ stp_mxml_node_t *rootnode;
+
+ /* Create the XML tree */
+ doc = stp_mxmlNewElement(NULL, "?xml");
+ stp_mxmlElementSetAttr(doc, "version", "1.0");
+
+ rootnode = stp_mxmlNewElement(doc, "gutenprint");
+ stp_mxmlElementSetAttr
+ (rootnode, "xmlns", "http://gimp-print.sourceforge.net/xsd/gp.xsd-1.0");
+ stp_mxmlElementSetAttr
+ (rootnode, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
+ stp_mxmlElementSetAttr
+ (rootnode, "xsi:schemaLocation",
+ "http://gimp-print.sourceforge.net/xsd/gp.xsd-1.0 gutenprint.xsd");
+
+ return doc;
+}
+
+
+
diff --git a/src/printdef/Makefile.in b/src/printdef/Makefile.in
deleted file mode 100644
index 4f06fec..0000000
--- a/src/printdef/Makefile.in
+++ /dev/null
@@ -1,447 +0,0 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
-
-# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-
-DESTDIR =
-
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-
-top_builddir = ../..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
-INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-transform = @program_transform_name@
-
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_alias = @host_alias@
-host_triplet = @host@
-ALL_LINGUAS = @ALL_LINGUAS@
-AS = @AS@
-AWK = @AWK@
-BISON_PROG = @BISON_PROG@
-BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
-CATALOGS = @CATALOGS@
-CATOBJEXT = @CATOBJEXT@
-CC = @CC@
-CONVERT = @CONVERT@
-CUPS_BACKEND_BIN = @CUPS_BACKEND_BIN@
-CUPS_BIN = @CUPS_BIN@
-CUPS_CFLAGS = @CUPS_CFLAGS@
-CUPS_CONF = @CUPS_CONF@
-CUPS_CONFIG = @CUPS_CONFIG@
-CUPS_FILTER_BIN = @CUPS_FILTER_BIN@
-CUPS_INSTALL = @CUPS_INSTALL@
-CUPS_LIBS = @CUPS_LIBS@
-CUPS_MAN = @CUPS_MAN@
-CUPS_NOINST_BIN = @CUPS_NOINST_BIN@
-CUPS_PKG = @CUPS_PKG@
-CUPS_PPD_PS_LEVEL = @CUPS_PPD_PS_LEVEL@
-DATADIRNAME = @DATADIRNAME@
-DB2HTML = @DB2HTML@
-DB2PDF = @DB2PDF@
-DB2PS = @DB2PS@
-DLLTOOL = @DLLTOOL@
-DVIPDF = @DVIPDF@
-DVIPS = @DVIPS@
-ECHO = @ECHO@
-ESCPUTIL_BIN = @ESCPUTIL_BIN@
-ESCPUTIL_MAN = @ESCPUTIL_MAN@
-EXEEXT = @EXEEXT@
-FOOMATIC_3_NOINST_BIN = @FOOMATIC_3_NOINST_BIN@
-FOOMATIC_CONFIGURE = @FOOMATIC_CONFIGURE@
-FOOMATIC_INSTALL = @FOOMATIC_INSTALL@
-FOOMATIC_KITLOAD = @FOOMATIC_KITLOAD@
-FOOMATIC_NOINST_BIN = @FOOMATIC_NOINST_BIN@
-FOOMATIC_OLDIDS_NOINST_BIN = @FOOMATIC_OLDIDS_NOINST_BIN@
-FOOMATIC_PPDFILE = @FOOMATIC_PPDFILE@
-GENCAT = @GENCAT@
-GIMPPRINT_BINARY_AGE = @GIMPPRINT_BINARY_AGE@
-GIMPPRINT_CFLAGS = @GIMPPRINT_CFLAGS@
-GIMPPRINT_CURRENT_INTERFACE = @GIMPPRINT_CURRENT_INTERFACE@
-GIMPPRINT_DEPLIBS = @GIMPPRINT_DEPLIBS@
-GIMPPRINT_INTERFACE_AGE = @GIMPPRINT_INTERFACE_AGE@
-GIMPPRINT_LIBS = @GIMPPRINT_LIBS@
-GIMPPRINT_MAJOR_VERSION = @GIMPPRINT_MAJOR_VERSION@
-GIMPPRINT_MICRO_VERSION = @GIMPPRINT_MICRO_VERSION@
-GIMPPRINT_MINOR_VERSION = @GIMPPRINT_MINOR_VERSION@
-GIMPPRINT_VERSION = @GIMPPRINT_VERSION@
-GIMPTOOL = @GIMPTOOL@
-GIMPTOOL_CHECK = @GIMPTOOL_CHECK@
-GIMP_BIN = @GIMP_BIN@
-GIMP_CFLAGS = @GIMP_CFLAGS@
-GIMP_CFLAGS_NOUI = @GIMP_CFLAGS_NOUI@
-GIMP_DATA_DIR = @GIMP_DATA_DIR@
-GIMP_LIBS = @GIMP_LIBS@
-GIMP_LIBS_NOUI = @GIMP_LIBS_NOUI@
-GIMP_PLUGIN_DIR = @GIMP_PLUGIN_DIR@
-GLIBC21 = @GLIBC21@
-GMOFILES = @GMOFILES@
-GMSGFMT = @GMSGFMT@
-GNUCFLAGS = @GNUCFLAGS@
-IJS_BIN = @IJS_BIN@
-IJS_CFLAGS = @IJS_CFLAGS@
-IJS_CONFIG = @IJS_CONFIG@
-IJS_INSTALL = @IJS_INSTALL@
-IJS_LIBS = @IJS_LIBS@
-INSTOBJEXT = @INSTOBJEXT@
-INTLBISON = @INTLBISON@
-INTLLIBS = @INTLLIBS@
-INTLOBJS = @INTLOBJS@
-INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
-LEX = @LEX@
-LIBGIMPPRINT_LIBS = @LIBGIMPPRINT_LIBS@
-LIBICONV = @LIBICONV@
-LIBM = @LIBM@
-LIBREADLINE_DEPS = @LIBREADLINE_DEPS@
-LIBTOOL = @LIBTOOL@
-LIBTOOL_DEPS = @LIBTOOL_DEPS@
-LN_S = @LN_S@
-LTALLOCA = @LTALLOCA@
-LTLIBOBJS = @LTLIBOBJS@
-LT_AGE = @LT_AGE@
-LT_CURRENT = @LT_CURRENT@
-LT_RELEASE = @LT_RELEASE@
-LT_REVISION = @LT_REVISION@
-MAINT = @MAINT@
-MAINTAINER_CFLAGS = @MAINTAINER_CFLAGS@
-MAIN_BIN = @MAIN_BIN@
-MAIN_DAT = @MAIN_DAT@
-MAIN_MAN = @MAIN_MAN@
-MAIN_SCR = @MAIN_SCR@
-MAKEINFO = @MAKEINFO@
-MKINSTALLDIRS = @MKINSTALLDIRS@
-MSGFMT = @MSGFMT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PERL = @PERL@
-PLUG_IN_PATH = @PLUG_IN_PATH@
-POFILES = @POFILES@
-POSUB = @POSUB@
-PRINT_VASPRINTF = @PRINT_VASPRINTF@
-RANLIB = @RANLIB@
-RELEASE_DATE = @RELEASE_DATE@
-RM = @RM@
-SAMPLE_IMAGES = @SAMPLE_IMAGES@
-STRIP = @STRIP@
-TESTPATTERN_BIN = @TESTPATTERN_BIN@
-TEST_BIN = @TEST_BIN@
-TEXI2HTML = @TEXI2HTML@
-USER_GUIDE = @USER_GUIDE@
-USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
-USE_NLS = @USE_NLS@
-VERSION = @VERSION@
-YACC = @YACC@
-YACC_PROG = @YACC_PROG@
-cups_bindir = @cups_bindir@
-cups_conf_datadir = @cups_conf_datadir@
-cups_conf_serverbin = @cups_conf_serverbin@
-cups_conf_serverroot = @cups_conf_serverroot@
-cups_exec_prefix = @cups_exec_prefix@
-cups_prefix = @cups_prefix@
-gimp_plug_indir = @gimp_plug_indir@
-gimpprint_cflags = @gimpprint_cflags@
-gimpprint_libs = @gimpprint_libs@
-
-AUTOMAKE_OPTIONS = 1.4 gnu
-
-MAINT_CHARSET = latin1
-
-AM_CFLAGS = $(GNUCFLAGS)
-INCLUDES = @INCLUDES@
-
-LFLAGS = -i
-YFLAGS = -d
-
-noinst_PROGRAMS = printdef
-printdef_SOURCES = printdefl.l printdefy.y printdef.h
-
-DISTCLEANFILES = printdefl.c printdefy.c printdefy.h
-MAINTAINERCLEANFILES = Makefile.in
-
-EXTRA_DIST = printdefy.h
-mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
-CONFIG_HEADER = ../../config.h
-CONFIG_CLEAN_FILES =
-noinst_PROGRAMS = printdef$(EXEEXT)
-PROGRAMS = $(noinst_PROGRAMS)
-
-
-DEFS = @DEFS@ -I. -I$(srcdir) -I../..
-CPPFLAGS = @CPPFLAGS@
-LDFLAGS = @LDFLAGS@
-LIBS = @LIBS@
-printdef_OBJECTS = printdefl.$(OBJEXT) printdefy.$(OBJEXT)
-printdef_LDADD = $(LDADD)
-printdef_DEPENDENCIES =
-printdef_LDFLAGS =
-LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
-LEXLIB = @LEXLIB@
-CFLAGS = @CFLAGS@
-COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-DIST_COMMON = Makefile.am Makefile.in printdefl.c printdefy.c
-
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = tar
-GZIP_ENV = --best
-SOURCES = $(printdef_SOURCES)
-OBJECTS = $(printdef_OBJECTS)
-
-all: all-redirect
-.SUFFIXES:
-.SUFFIXES: .S .c .l .lo .o .obj .s .y
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/printdef/Makefile
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-
-mostlyclean-noinstPROGRAMS:
-
-clean-noinstPROGRAMS:
- -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
-
-distclean-noinstPROGRAMS:
-
-maintainer-clean-noinstPROGRAMS:
-
-.c.o:
- $(COMPILE) -c $<
-
-# FIXME: We should only use cygpath when building on Windows,
-# and only if it is available.
-.c.obj:
- $(COMPILE) -c `cygpath -w $<`
-
-.s.o:
- $(COMPILE) -c $<
-
-.S.o:
- $(COMPILE) -c $<
-
-mostlyclean-compile:
- -rm -f *.o core *.core
- -rm -f *.$(OBJEXT)
-
-clean-compile:
-
-distclean-compile:
- -rm -f *.tab.c
-
-maintainer-clean-compile:
-
-.c.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
-
-.s.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
-
-.S.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-distclean-libtool:
-
-maintainer-clean-libtool:
-
-printdef$(EXEEXT): $(printdef_OBJECTS) $(printdef_DEPENDENCIES)
- @rm -f printdef$(EXEEXT)
- $(LINK) $(printdef_LDFLAGS) $(printdef_OBJECTS) $(printdef_LDADD) $(LIBS)
-.l.c:
- $(LEX) $(AM_LFLAGS) $(LFLAGS) $< && mv $(LEX_OUTPUT_ROOT).c $@
-.y.c:
- $(YACC) $(AM_YFLAGS) $(YFLAGS) $< && mv y.tab.c $*.c
- if test -f y.tab.h; then \
- if cmp -s y.tab.h $*.h; then rm -f y.tab.h; else mv y.tab.h $*.h; fi; \
- else :; fi
-printdefy.h: printdefy.c
-
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- here=`pwd` && cd $(srcdir) \
- && mkid -f$$here/ID $$unique $(LISP)
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
- tags=; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
- || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
-
-mostlyclean-tags:
-
-clean-tags:
-
-distclean-tags:
- -rm -f TAGS ID
-
-maintainer-clean-tags:
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-
-subdir = src/printdef
-
-distdir: $(DISTFILES)
- @for file in $(DISTFILES); do \
- d=$(srcdir); \
- if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
- else \
- test -f $(distdir)/$$file \
- || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $$d/$$file $(distdir)/$$file || :; \
- fi; \
- done
-printdefl.o: printdefl.c printdef.h printdefy.h
-printdefy.o: printdefy.c printdef.h printdefy.h
-
-info-am:
-info: info-am
-dvi-am:
-dvi: dvi-am
-check-am: all-am
-check: check-am
-installcheck-am:
-installcheck: installcheck-am
-install-exec-am:
-install-exec: install-exec-am
-
-install-data-am:
-install-data: install-data-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-am
-uninstall-am:
-uninstall: uninstall-am
-all-am: Makefile $(PROGRAMS)
-all-redirect: all-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs:
-
-
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
- -rm -f config.cache config.log stamp-h stamp-h[0-9]*
- -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
-
-maintainer-clean-generic:
- -test -z "printdefllprintdefyhprintdefyc$(MAINTAINERCLEANFILES)" || rm -f printdefll printdefyh printdefyc $(MAINTAINERCLEANFILES)
-mostlyclean-am: mostlyclean-noinstPROGRAMS mostlyclean-compile \
- mostlyclean-libtool mostlyclean-tags \
- mostlyclean-generic
-
-mostlyclean: mostlyclean-am
-
-clean-am: clean-noinstPROGRAMS clean-compile clean-libtool clean-tags \
- clean-generic mostlyclean-am
-
-clean: clean-am
-
-distclean-am: distclean-noinstPROGRAMS distclean-compile \
- distclean-libtool distclean-tags distclean-generic \
- clean-am
- -rm -f libtool
-
-distclean: distclean-am
-
-maintainer-clean-am: maintainer-clean-noinstPROGRAMS \
- maintainer-clean-compile maintainer-clean-libtool \
- maintainer-clean-tags maintainer-clean-generic \
- distclean-am
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
-
-maintainer-clean: maintainer-clean-am
-
-.PHONY: mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \
-clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \
-mostlyclean-compile distclean-compile clean-compile \
-maintainer-clean-compile mostlyclean-libtool distclean-libtool \
-clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
-distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
-dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
-install-exec install-data-am install-data install-am install \
-uninstall-am uninstall all-redirect all-am all installdirs \
-mostlyclean-generic distclean-generic clean-generic \
-maintainer-clean-generic clean mostlyclean distclean maintainer-clean
-
-
-@SET_MAKE@
-
-printdefl.o: printdefy.o
-printdef.o: printdefy.o
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/src/printdef/printdef.h b/src/printdef/printdef.h
deleted file mode 100644
index 31bb44a..0000000
--- a/src/printdef/printdef.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * "$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.c b/src/printdef/printdefl.c
deleted file mode 100644
index c3313ad..0000000
--- a/src/printdef/printdefl.c
+++ /dev/null
@@ -1,1762 +0,0 @@
-/* A lexical scanner generated by flex */
-
-/* Scanner skeleton version:
- * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $
- */
-
-#define FLEX_SCANNER
-#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-
-#include <stdio.h>
-
-
-/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
-#ifdef c_plusplus
-#ifndef __cplusplus
-#define __cplusplus
-#endif
-#endif
-
-
-#ifdef __cplusplus
-
-#include <stdlib.h>
-#include <unistd.h>
-
-/* Use prototypes in function declarations. */
-#define YY_USE_PROTOS
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else /* ! __cplusplus */
-
-#if __STDC__
-
-#define YY_USE_PROTOS
-#define YY_USE_CONST
-
-#endif /* __STDC__ */
-#endif /* ! __cplusplus */
-
-#ifdef __TURBOC__
- #pragma warn -rch
- #pragma warn -use
-#include <io.h>
-#include <stdlib.h>
-#define YY_USE_CONST
-#define YY_USE_PROTOS
-#endif
-
-#ifdef YY_USE_CONST
-#define yyconst const
-#else
-#define yyconst
-#endif
-
-
-#ifdef YY_USE_PROTOS
-#define YY_PROTO(proto) proto
-#else
-#define YY_PROTO(proto) ()
-#endif
-
-/* Returned upon end-of-file. */
-#define YY_NULL 0
-
-/* Promotes a possibly negative, possibly signed char to an unsigned
- * integer for use as an array index. If the signed char is negative,
- * we want to instead treat it as an 8-bit unsigned char, hence the
- * double cast.
- */
-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
-
-/* Enter a start condition. This macro really ought to take a parameter,
- * but we do it the disgusting crufty way forced on us by the ()-less
- * definition of BEGIN.
- */
-#define BEGIN yy_start = 1 + 2 *
-
-/* Translate the current start state into a value that can be later handed
- * to BEGIN to return to the state. The YYSTATE alias is for lex
- * compatibility.
- */
-#define YY_START ((yy_start - 1) / 2)
-#define YYSTATE YY_START
-
-/* Action number for EOF rule of a given start state. */
-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
-
-/* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE yyrestart( yyin )
-
-#define YY_END_OF_BUFFER_CHAR 0
-
-/* Size of default input buffer. */
-#define YY_BUF_SIZE 16384
-
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-
-extern int yyleng;
-extern FILE *yyin, *yyout;
-
-#define EOB_ACT_CONTINUE_SCAN 0
-#define EOB_ACT_END_OF_FILE 1
-#define EOB_ACT_LAST_MATCH 2
-
-/* The funky do-while in the following #define is used to turn the definition
- * int a single C statement (which needs a semi-colon terminator). This
- * avoids problems with code like:
- *
- * if ( condition_holds )
- * yyless( 5 );
- * else
- * do_something_else();
- *
- * Prior to using the do-while the compiler would get upset at the
- * "else" because it interpreted the "if" statement as being all
- * done when it reached the ';' after the yyless() call.
- */
-
-/* Return all but the first 'n' matched characters back to the input stream. */
-
-#define yyless(n) \
- do \
- { \
- /* Undo effects of setting up yytext. */ \
- *yy_cp = yy_hold_char; \
- YY_RESTORE_YY_MORE_OFFSET \
- yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
- YY_DO_BEFORE_ACTION; /* set up yytext again */ \
- } \
- while ( 0 )
-
-#define unput(c) yyunput( c, yytext_ptr )
-
-/* The following is because we cannot portably get our hands on size_t
- * (without autoconf's help, which isn't available because we want
- * flex-generated scanners to compile on their own).
- */
-typedef unsigned int yy_size_t;
-
-
-struct yy_buffer_state
- {
- FILE *yy_input_file;
-
- char *yy_ch_buf; /* input buffer */
- char *yy_buf_pos; /* current position in input buffer */
-
- /* Size of input buffer in bytes, not including room for EOB
- * characters.
- */
- yy_size_t yy_buf_size;
-
- /* Number of characters read into yy_ch_buf, not including EOB
- * characters.
- */
- int yy_n_chars;
-
- /* Whether we "own" the buffer - i.e., we know we created it,
- * and can realloc() it to grow it, and should free() it to
- * delete it.
- */
- int yy_is_our_buffer;
-
- /* Whether this is an "interactive" input source; if so, and
- * if we're using stdio for input, then we want to use getc()
- * instead of fread(), to make sure we stop fetching input after
- * each newline.
- */
- int yy_is_interactive;
-
- /* Whether we're considered to be at the beginning of a line.
- * If so, '^' rules will be active on the next match, otherwise
- * not.
- */
- int yy_at_bol;
-
- /* Whether to try to fill the input buffer when we reach the
- * end of it.
- */
- int yy_fill_buffer;
-
- int yy_buffer_status;
-#define YY_BUFFER_NEW 0
-#define YY_BUFFER_NORMAL 1
- /* When an EOF's been seen but there's still some text to process
- * then we mark the buffer as YY_EOF_PENDING, to indicate that we
- * shouldn't try reading from the input source any more. We might
- * still have a bunch of tokens to match, though, because of
- * possible backing-up.
- *
- * When we actually see the EOF, we change the status to "new"
- * (via yyrestart()), so that the user can continue scanning by
- * just pointing yyin at a new input file.
- */
-#define YY_BUFFER_EOF_PENDING 2
- };
-
-static YY_BUFFER_STATE yy_current_buffer = 0;
-
-/* We provide macros for accessing buffer states in case in the
- * future we want to put the buffer states in a more general
- * "scanner state".
- */
-#define YY_CURRENT_BUFFER yy_current_buffer
-
-
-/* yy_hold_char holds the character lost when yytext is formed. */
-static char yy_hold_char;
-
-static int yy_n_chars; /* number of characters read into yy_ch_buf */
-
-
-int yyleng;
-
-/* Points to current character in buffer. */
-static char *yy_c_buf_p = (char *) 0;
-static int yy_init = 1; /* whether we need to initialize */
-static int yy_start = 0; /* start state number */
-
-/* Flag which is used to allow yywrap()'s to do buffer switches
- * instead of setting up a fresh yyin. A bit of a hack ...
- */
-static int yy_did_buffer_switch_on_eof;
-
-void yyrestart YY_PROTO(( FILE *input_file ));
-
-void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
-void yy_load_buffer_state YY_PROTO(( void ));
-YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
-void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
-void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
-void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
-#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
-
-YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
-YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
-YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
-
-static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
-static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
-static void yy_flex_free YY_PROTO(( void * ));
-
-#define yy_new_buffer yy_create_buffer
-
-#define yy_set_interactive(is_interactive) \
- { \
- if ( ! yy_current_buffer ) \
- yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
- yy_current_buffer->yy_is_interactive = is_interactive; \
- }
-
-#define yy_set_bol(at_bol) \
- { \
- if ( ! yy_current_buffer ) \
- yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
- yy_current_buffer->yy_at_bol = at_bol; \
- }
-
-#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
-
-
-#define yywrap() 1
-#define YY_SKIP_YYWRAP
-typedef unsigned char YY_CHAR;
-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
-typedef int yy_state_type;
-extern char *yytext;
-#define yytext_ptr yytext
-
-static yy_state_type yy_get_previous_state YY_PROTO(( void ));
-static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
-static int yy_get_next_buffer YY_PROTO(( void ));
-static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
-
-/* Done after the current pattern has been matched and before the
- * corresponding action - sets up yytext.
- */
-#define YY_DO_BEFORE_ACTION \
- yytext_ptr = yy_bp; \
- yyleng = (int) (yy_cp - yy_bp); \
- yy_hold_char = *yy_cp; \
- *yy_cp = '\0'; \
- yy_c_buf_p = yy_cp;
-
-#define YY_NUM_RULES 28
-#define YY_END_OF_BUFFER 29
-static yyconst short int yy_accept[133] =
- { 0,
- 0, 0, 29, 28, 25, 27, 28, 26, 28, 28,
- 21, 1, 3, 2, 28, 28, 28, 28, 28, 28,
- 28, 28, 28, 28, 28, 28, 25, 0, 26, 21,
- 0, 0, 0, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 23,
- 0, 22, 0, 22, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 0, 24, 24, 24, 15, 24, 24, 24, 24, 24,
- 24, 6, 24, 24, 24, 24, 24, 0, 24, 8,
- 24, 24, 24, 13, 24, 24, 10, 24, 24, 24,
-
- 20, 24, 0, 24, 24, 24, 7, 24, 24, 24,
- 24, 24, 17, 0, 24, 24, 19, 24, 16, 9,
- 4, 24, 5, 24, 14, 11, 24, 24, 24, 12,
- 18, 0
- } ;
-
-static yyconst int yy_ec[256] =
- { 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 2, 1, 4, 5, 1, 1, 1, 1, 1,
- 1, 1, 6, 1, 6, 7, 8, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 1, 1, 10,
- 11, 12, 1, 1, 14, 15, 16, 17, 18, 19,
- 20, 21, 22, 19, 19, 23, 24, 25, 26, 27,
- 19, 28, 29, 30, 31, 32, 33, 19, 34, 19,
- 1, 1, 1, 1, 13, 1, 14, 15, 16, 17,
-
- 18, 19, 20, 21, 22, 19, 19, 23, 24, 25,
- 26, 27, 19, 28, 29, 30, 31, 32, 33, 19,
- 34, 19, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1
- } ;
-
-static yyconst int yy_meta[35] =
- { 0,
- 1, 1, 2, 3, 1, 1, 1, 1, 4, 1,
- 1, 1, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4
- } ;
-
-static yyconst short int yy_base[136] =
- { 0,
- 0, 0, 153, 154, 150, 154, 0, 0, 142, 123,
- 28, 154, 154, 154, 0, 121, 10, 20, 134, 133,
- 25, 26, 118, 131, 130, 125, 140, 137, 0, 36,
- 112, 130, 41, 0, 116, 30, 123, 111, 113, 110,
- 108, 112, 114, 106, 113, 106, 97, 103, 102, 154,
- 102, 40, 114, 113, 101, 94, 89, 93, 88, 84,
- 91, 94, 95, 94, 93, 84, 84, 77, 76, 83,
- 80, 83, 75, 74, 0, 79, 82, 85, 67, 72,
- 73, 0, 72, 64, 65, 74, 65, 60, 59, 0,
- 74, 57, 58, 0, 71, 54, 0, 57, 64, 67,
-
- 0, 47, 61, 53, 48, 42, 0, 55, 60, 45,
- 44, 41, 0, 42, 51, 38, 0, 49, 0, 0,
- 0, 42, 154, 32, 0, 0, 31, 27, 17, 0,
- 0, 154, 58, 62, 37
- } ;
-
-static yyconst short int yy_def[136] =
- { 0,
- 132, 1, 132, 132, 132, 132, 133, 134, 132, 132,
- 132, 132, 132, 132, 135, 135, 135, 135, 135, 135,
- 135, 135, 135, 135, 135, 135, 132, 133, 134, 132,
- 132, 132, 132, 135, 135, 135, 135, 135, 135, 135,
- 135, 135, 135, 135, 135, 135, 135, 135, 135, 132,
- 132, 132, 132, 132, 135, 135, 135, 135, 135, 135,
- 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
- 132, 135, 135, 135, 135, 135, 135, 135, 135, 135,
- 135, 135, 135, 135, 135, 135, 135, 132, 135, 135,
- 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,
-
- 135, 135, 132, 135, 135, 135, 135, 135, 135, 135,
- 135, 135, 135, 132, 135, 135, 135, 135, 135, 135,
- 135, 135, 132, 135, 135, 135, 135, 135, 135, 135,
- 135, 0, 132, 132, 132
- } ;
-
-static yyconst short int yy_nxt[189] =
- { 0,
- 4, 5, 6, 7, 8, 9, 4, 10, 11, 12,
- 13, 14, 4, 15, 16, 17, 18, 15, 15, 19,
- 15, 15, 20, 21, 22, 15, 23, 15, 24, 15,
- 15, 25, 15, 26, 32, 36, 30, 38, 42, 44,
- 34, 131, 32, 37, 30, 33, 53, 39, 52, 54,
- 43, 45, 56, 33, 57, 130, 129, 33, 28, 28,
- 128, 28, 29, 127, 29, 29, 126, 125, 124, 123,
- 122, 121, 120, 119, 118, 117, 116, 115, 114, 113,
- 112, 111, 110, 109, 108, 107, 106, 105, 104, 103,
- 102, 101, 100, 99, 98, 97, 96, 95, 94, 93,
-
- 92, 91, 90, 89, 88, 87, 86, 85, 84, 83,
- 82, 81, 80, 79, 78, 77, 76, 75, 74, 73,
- 72, 54, 54, 71, 70, 69, 68, 67, 66, 65,
- 64, 63, 62, 61, 60, 59, 58, 55, 52, 51,
- 50, 27, 49, 48, 47, 46, 41, 40, 35, 31,
- 30, 27, 132, 3, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132
- } ;
-
-static yyconst short int yy_chk[189] =
- { 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 11, 17, 11, 18, 21, 22,
- 135, 129, 30, 17, 30, 11, 33, 18, 52, 33,
- 21, 22, 36, 30, 36, 128, 127, 52, 133, 133,
- 124, 133, 134, 122, 134, 134, 118, 116, 115, 114,
- 112, 111, 110, 109, 108, 106, 105, 104, 103, 102,
- 100, 99, 98, 96, 95, 93, 92, 91, 89, 88,
- 87, 86, 85, 84, 83, 81, 80, 79, 78, 77,
-
- 76, 74, 73, 72, 71, 70, 69, 68, 67, 66,
- 65, 64, 63, 62, 61, 60, 59, 58, 57, 56,
- 55, 54, 53, 51, 49, 48, 47, 46, 45, 44,
- 43, 42, 41, 40, 39, 38, 37, 35, 32, 31,
- 28, 27, 26, 25, 24, 23, 20, 19, 16, 10,
- 9, 5, 3, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 132, 132, 132, 132, 132
- } ;
-
-static yy_state_type yy_last_accepting_state;
-static char *yy_last_accepting_cpos;
-
-/* The intent behind this definition is that it'll catch
- * any uses of REJECT which flex missed.
- */
-#define REJECT reject_used_but_not_detected
-#define yymore() yymore_used_but_not_detected
-#define YY_MORE_ADJ 0
-#define YY_RESTORE_YY_MORE_OFFSET
-char *yytext;
-#line 1 "printdefl.l"
-#define INITIAL 0
-/*
- * "$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.
- */
-#line 24 "printdefl.l"
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#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;
-}
-
-#line 500 "lex.yy.c"
-
-/* Macros after this point can all be overridden by user definitions in
- * section 1.
- */
-
-#ifndef YY_SKIP_YYWRAP
-#ifdef __cplusplus
-extern "C" int yywrap YY_PROTO(( void ));
-#else
-extern int yywrap YY_PROTO(( void ));
-#endif
-#endif
-
-#ifndef YY_NO_UNPUT
-static void yyunput YY_PROTO(( int c, char *buf_ptr ));
-#endif
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen YY_PROTO(( yyconst char * ));
-#endif
-
-#ifndef YY_NO_INPUT
-#ifdef __cplusplus
-static int yyinput YY_PROTO(( void ));
-#else
-static int input YY_PROTO(( void ));
-#endif
-#endif
-
-#if YY_STACK_USED
-static int yy_start_stack_ptr = 0;
-static int yy_start_stack_depth = 0;
-static int *yy_start_stack = 0;
-#ifndef YY_NO_PUSH_STATE
-static void yy_push_state YY_PROTO(( int new_state ));
-#endif
-#ifndef YY_NO_POP_STATE
-static void yy_pop_state YY_PROTO(( void ));
-#endif
-#ifndef YY_NO_TOP_STATE
-static int yy_top_state YY_PROTO(( void ));
-#endif
-
-#else
-#define YY_NO_PUSH_STATE 1
-#define YY_NO_POP_STATE 1
-#define YY_NO_TOP_STATE 1
-#endif
-
-#ifdef YY_MALLOC_DECL
-YY_MALLOC_DECL
-#else
-#if __STDC__
-#ifndef __cplusplus
-#include <stdlib.h>
-#endif
-#else
-/* Just try to get by without declaring the routines. This will fail
- * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
- * or sizeof(void*) != sizeof(int).
- */
-#endif
-#endif
-
-/* Amount of stuff to slurp up with each read. */
-#ifndef YY_READ_BUF_SIZE
-#define YY_READ_BUF_SIZE 8192
-#endif
-
-/* Copy whatever the last rule matched to the standard output. */
-
-#ifndef ECHO
-/* This used to be an fputs(), but since the string might contain NUL's,
- * we now use fwrite().
- */
-#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
-#endif
-
-/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
- * is returned in "result".
- */
-#ifndef YY_INPUT
-#define YY_INPUT(buf,result,max_size) \
- if ( yy_current_buffer->yy_is_interactive ) \
- { \
- int c = '*', n; \
- for ( n = 0; n < max_size && \
- (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
- buf[n] = (char) c; \
- if ( c == '\n' ) \
- buf[n++] = (char) c; \
- if ( c == EOF && ferror( yyin ) ) \
- YY_FATAL_ERROR( "input in flex scanner failed" ); \
- result = n; \
- } \
- else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
- && ferror( yyin ) ) \
- YY_FATAL_ERROR( "input in flex scanner failed" );
-#endif
-
-/* No semi-colon after return; correct usage is to write "yyterminate();" -
- * we don't want an extra ';' after the "return" because that will cause
- * some compilers to complain about unreachable statements.
- */
-#ifndef yyterminate
-#define yyterminate() return YY_NULL
-#endif
-
-/* Number of entries by which start-condition stack grows. */
-#ifndef YY_START_STACK_INCR
-#define YY_START_STACK_INCR 25
-#endif
-
-/* Report a fatal error. */
-#ifndef YY_FATAL_ERROR
-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
-#endif
-
-/* Default declaration of generated scanner - a define so the user can
- * easily add parameters.
- */
-#ifndef YY_DECL
-#define YY_DECL int yylex YY_PROTO(( void ))
-#endif
-
-/* Code executed at the beginning of each rule, after yytext and yyleng
- * have been set up.
- */
-#ifndef YY_USER_ACTION
-#define YY_USER_ACTION
-#endif
-
-/* Code executed at the end of each rule. */
-#ifndef YY_BREAK
-#define YY_BREAK break;
-#endif
-
-#define YY_RULE_SETUP \
- YY_USER_ACTION
-
-YY_DECL
- {
- register yy_state_type yy_current_state;
- register char *yy_cp, *yy_bp;
- register int yy_act;
-
-#line 64 "printdefl.l"
-
-
-#line 654 "lex.yy.c"
-
- if ( yy_init )
- {
- yy_init = 0;
-
-#ifdef YY_USER_INIT
- YY_USER_INIT;
-#endif
-
- if ( ! yy_start )
- yy_start = 1; /* first start state */
-
- if ( ! yyin )
- yyin = stdin;
-
- if ( ! yyout )
- yyout = stdout;
-
- if ( ! yy_current_buffer )
- yy_current_buffer =
- yy_create_buffer( yyin, YY_BUF_SIZE );
-
- yy_load_buffer_state();
- }
-
- while ( 1 ) /* loops until end-of-file is reached */
- {
- yy_cp = yy_c_buf_p;
-
- /* Support of yytext. */
- *yy_cp = yy_hold_char;
-
- /* yy_bp points to the position in yy_ch_buf of the start of
- * the current run.
- */
- yy_bp = yy_cp;
-
- yy_current_state = yy_start;
-yy_match:
- do
- {
- register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
- if ( yy_accept[yy_current_state] )
- {
- yy_last_accepting_state = yy_current_state;
- yy_last_accepting_cpos = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 133 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- ++yy_cp;
- }
- while ( yy_base[yy_current_state] != 154 );
-
-yy_find_action:
- yy_act = yy_accept[yy_current_state];
- if ( yy_act == 0 )
- { /* have to back up */
- yy_cp = yy_last_accepting_cpos;
- yy_current_state = yy_last_accepting_state;
- yy_act = yy_accept[yy_current_state];
- }
-
- YY_DO_BEFORE_ACTION;
-
-
-do_action: /* This label is used only to access EOF actions. */
-
-
- switch ( yy_act )
- { /* beginning of action switch */
- case 0: /* must back up */
- /* undo the effects of YY_DO_BEFORE_ACTION */
- *yy_cp = yy_hold_char;
- yy_cp = yy_last_accepting_cpos;
- yy_current_state = yy_last_accepting_state;
- goto yy_find_action;
-
-case 1:
-YY_RULE_SETUP
-#line 66 "printdefl.l"
-DBG(tBEGIN) return tBEGIN;
- YY_BREAK
-case 2:
-YY_RULE_SETUP
-#line 67 "printdefl.l"
-DBG(tEND) return tEND;
- YY_BREAK
-case 3:
-YY_RULE_SETUP
-#line 68 "printdefl.l"
-DBG(ASSIGN) return ASSIGN;
- YY_BREAK
-case 4:
-YY_RULE_SETUP
-#line 69 "printdefl.l"
-DBG(PRINTER) return PRINTER;
- YY_BREAK
-case 5:
-YY_RULE_SETUP
-#line 70 "printdefl.l"
-DBG(ENDPRINTER) return ENDPRINTER;
- YY_BREAK
-case 6:
-YY_RULE_SETUP
-#line 71 "printdefl.l"
-DBG(NAME) return NAME;
- YY_BREAK
-case 7:
-YY_RULE_SETUP
-#line 72 "printdefl.l"
-DBG(DRIVER) return DRIVER;
- YY_BREAK
-case 8:
-YY_RULE_SETUP
-#line 73 "printdefl.l"
-DBG(COLOR) return COLOR;
- YY_BREAK
-case 9:
-YY_RULE_SETUP
-#line 74 "printdefl.l"
-DBG(NOCOLOR) return NOCOLOR;
- YY_BREAK
-case 10:
-YY_RULE_SETUP
-#line 75 "printdefl.l"
-DBG(MODEL) return MODEL;
- YY_BREAK
-case 11:
-YY_RULE_SETUP
-#line 76 "printdefl.l"
-DBG(LANGUAGE) return LANGUAGE;
- YY_BREAK
-case 12:
-YY_RULE_SETUP
-#line 77 "printdefl.l"
-DBG(BRIGHTNESS) return BRIGHTNESS;
- YY_BREAK
-case 13:
-YY_RULE_SETUP
-#line 78 "printdefl.l"
-DBG(GAMMA) return GAMMA;
- YY_BREAK
-case 14:
-YY_RULE_SETUP
-#line 79 "printdefl.l"
-DBG(CONTRAST) return CONTRAST;
- YY_BREAK
-case 15:
-YY_RULE_SETUP
-#line 80 "printdefl.l"
-DBG(CYAN) return CYAN;
- YY_BREAK
-case 16:
-YY_RULE_SETUP
-#line 81 "printdefl.l"
-DBG(MAGENTA) return MAGENTA;
- YY_BREAK
-case 17:
-YY_RULE_SETUP
-#line 82 "printdefl.l"
-DBG(YELLOW) return YELLOW;
- YY_BREAK
-case 18:
-YY_RULE_SETUP
-#line 83 "printdefl.l"
-DBG(SATURATION) return SATURATION;
- YY_BREAK
-case 19:
-YY_RULE_SETUP
-#line 84 "printdefl.l"
-DBG(DENSITY) return DENSITY;
- YY_BREAK
-case 20:
-YY_RULE_SETUP
-#line 85 "printdefl.l"
-DBG(VALUE) return VALUE;
- YY_BREAK
-case 21:
-YY_RULE_SETUP
-#line 87 "printdefl.l"
-yylval.ival = atoi(yytext); DBG(tINT) return tINT;
- YY_BREAK
-case 22:
-YY_RULE_SETUP
-#line 88 "printdefl.l"
-yylval.dval = strtod(yytext, NULL); DBG(tDOUBLE) return tDOUBLE;
- YY_BREAK
-case 23:
-YY_RULE_SETUP
-#line 89 "printdefl.l"
-yylval.sval = c_strdup(yytext); DBG(tSTRING) return tSTRING;
- YY_BREAK
-case 24:
-YY_RULE_SETUP
-#line 90 "printdefl.l"
-yylval.sval = c_strdup(yytext); DBG(tCLASS) return tCLASS;
- YY_BREAK
-case 25:
-YY_RULE_SETUP
-#line 91 "printdefl.l"
-DBG(whitespace1) /* Skip blanks/tabs */
- YY_BREAK
-case 26:
-YY_RULE_SETUP
-#line 92 "printdefl.l"
-DBG(comment1) /* Skip comments */
- YY_BREAK
-case 27:
-YY_RULE_SETUP
-#line 93 "printdefl.l"
-DBG(newline) mylineno++;
- YY_BREAK
-case 28:
-YY_RULE_SETUP
-#line 94 "printdefl.l"
-ECHO;
- YY_BREAK
-#line 877 "lex.yy.c"
-case YY_STATE_EOF(INITIAL):
- yyterminate();
-
- case YY_END_OF_BUFFER:
- {
- /* Amount of text matched not including the EOB char. */
- int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
-
- /* Undo the effects of YY_DO_BEFORE_ACTION. */
- *yy_cp = yy_hold_char;
- YY_RESTORE_YY_MORE_OFFSET
-
- if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
- {
- /* We're scanning a new file or input source. It's
- * possible that this happened because the user
- * just pointed yyin at a new source and called
- * yylex(). If so, then we have to assure
- * consistency between yy_current_buffer and our
- * globals. Here is the right place to do so, because
- * this is the first action (other than possibly a
- * back-up) that will match for the new input source.
- */
- yy_n_chars = yy_current_buffer->yy_n_chars;
- yy_current_buffer->yy_input_file = yyin;
- yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
- }
-
- /* Note that here we test for yy_c_buf_p "<=" to the position
- * of the first EOB in the buffer, since yy_c_buf_p will
- * already have been incremented past the NUL character
- * (since all states make transitions on EOB to the
- * end-of-buffer state). Contrast this with the test
- * in input().
- */
- if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
- { /* This was really a NUL. */
- yy_state_type yy_next_state;
-
- yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
-
- yy_current_state = yy_get_previous_state();
-
- /* Okay, we're now positioned to make the NUL
- * transition. We couldn't have
- * yy_get_previous_state() go ahead and do it
- * for us because it doesn't know how to deal
- * with the possibility of jamming (and we don't
- * want to build jamming into it because then it
- * will run more slowly).
- */
-
- yy_next_state = yy_try_NUL_trans( yy_current_state );
-
- yy_bp = yytext_ptr + YY_MORE_ADJ;
-
- if ( yy_next_state )
- {
- /* Consume the NUL. */
- yy_cp = ++yy_c_buf_p;
- yy_current_state = yy_next_state;
- goto yy_match;
- }
-
- else
- {
- yy_cp = yy_c_buf_p;
- goto yy_find_action;
- }
- }
-
- else switch ( yy_get_next_buffer() )
- {
- case EOB_ACT_END_OF_FILE:
- {
- yy_did_buffer_switch_on_eof = 0;
-
- if ( yywrap() )
- {
- /* Note: because we've taken care in
- * yy_get_next_buffer() to have set up
- * yytext, we can now set up
- * yy_c_buf_p so that if some total
- * hoser (like flex itself) wants to
- * call the scanner after we return the
- * YY_NULL, it'll still work - another
- * YY_NULL will get returned.
- */
- yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
-
- yy_act = YY_STATE_EOF(YY_START);
- goto do_action;
- }
-
- else
- {
- if ( ! yy_did_buffer_switch_on_eof )
- YY_NEW_FILE;
- }
- break;
- }
-
- case EOB_ACT_CONTINUE_SCAN:
- yy_c_buf_p =
- yytext_ptr + yy_amount_of_matched_text;
-
- yy_current_state = yy_get_previous_state();
-
- yy_cp = yy_c_buf_p;
- yy_bp = yytext_ptr + YY_MORE_ADJ;
- goto yy_match;
-
- case EOB_ACT_LAST_MATCH:
- yy_c_buf_p =
- &yy_current_buffer->yy_ch_buf[yy_n_chars];
-
- yy_current_state = yy_get_previous_state();
-
- yy_cp = yy_c_buf_p;
- yy_bp = yytext_ptr + YY_MORE_ADJ;
- goto yy_find_action;
- }
- break;
- }
-
- default:
- YY_FATAL_ERROR(
- "fatal flex scanner internal error--no action found" );
- } /* end of action switch */
- } /* end of scanning one token */
- } /* end of yylex */
-
-
-/* yy_get_next_buffer - try to read in a new buffer
- *
- * Returns a code representing an action:
- * EOB_ACT_LAST_MATCH -
- * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
- * EOB_ACT_END_OF_FILE - end of file
- */
-
-static int yy_get_next_buffer()
- {
- register char *dest = yy_current_buffer->yy_ch_buf;
- register char *source = yytext_ptr;
- register int number_to_move, i;
- int ret_val;
-
- if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
- YY_FATAL_ERROR(
- "fatal flex scanner internal error--end of buffer missed" );
-
- if ( yy_current_buffer->yy_fill_buffer == 0 )
- { /* Don't try to fill the buffer, so this is an EOF. */
- if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
- {
- /* We matched a single character, the EOB, so
- * treat this as a final EOF.
- */
- return EOB_ACT_END_OF_FILE;
- }
-
- else
- {
- /* We matched some text prior to the EOB, first
- * process it.
- */
- return EOB_ACT_LAST_MATCH;
- }
- }
-
- /* Try to read more data. */
-
- /* First move last chars to start of buffer. */
- number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
-
- for ( i = 0; i < number_to_move; ++i )
- *(dest++) = *(source++);
-
- if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
- /* don't do the read, it's not guaranteed to return an EOF,
- * just force an EOF
- */
- yy_current_buffer->yy_n_chars = yy_n_chars = 0;
-
- else
- {
- int num_to_read =
- yy_current_buffer->yy_buf_size - number_to_move - 1;
-
- while ( num_to_read <= 0 )
- { /* Not enough room in the buffer - grow it. */
-#ifdef YY_USES_REJECT
- YY_FATAL_ERROR(
-"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
-#else
-
- /* just a shorter name for the current buffer */
- YY_BUFFER_STATE b = yy_current_buffer;
-
- int yy_c_buf_p_offset =
- (int) (yy_c_buf_p - b->yy_ch_buf);
-
- if ( b->yy_is_our_buffer )
- {
- int new_size = b->yy_buf_size * 2;
-
- if ( new_size <= 0 )
- b->yy_buf_size += b->yy_buf_size / 8;
- else
- b->yy_buf_size *= 2;
-
- b->yy_ch_buf = (char *)
- /* Include room in for 2 EOB chars. */
- yy_flex_realloc( (void *) b->yy_ch_buf,
- b->yy_buf_size + 2 );
- }
- else
- /* Can't grow it, we don't own it. */
- b->yy_ch_buf = 0;
-
- if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR(
- "fatal error - scanner input buffer overflow" );
-
- yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
-
- num_to_read = yy_current_buffer->yy_buf_size -
- number_to_move - 1;
-#endif
- }
-
- if ( num_to_read > YY_READ_BUF_SIZE )
- num_to_read = YY_READ_BUF_SIZE;
-
- /* Read in more data. */
- YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
- yy_n_chars, num_to_read );
-
- yy_current_buffer->yy_n_chars = yy_n_chars;
- }
-
- if ( yy_n_chars == 0 )
- {
- if ( number_to_move == YY_MORE_ADJ )
- {
- ret_val = EOB_ACT_END_OF_FILE;
- yyrestart( yyin );
- }
-
- else
- {
- ret_val = EOB_ACT_LAST_MATCH;
- yy_current_buffer->yy_buffer_status =
- YY_BUFFER_EOF_PENDING;
- }
- }
-
- else
- ret_val = EOB_ACT_CONTINUE_SCAN;
-
- yy_n_chars += number_to_move;
- yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
- yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
-
- yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
-
- return ret_val;
- }
-
-
-/* yy_get_previous_state - get the state just before the EOB char was reached */
-
-static yy_state_type yy_get_previous_state()
- {
- register yy_state_type yy_current_state;
- register char *yy_cp;
-
- yy_current_state = yy_start;
-
- for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
- {
- register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
- if ( yy_accept[yy_current_state] )
- {
- yy_last_accepting_state = yy_current_state;
- yy_last_accepting_cpos = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 133 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- }
-
- return yy_current_state;
- }
-
-
-/* yy_try_NUL_trans - try to make a transition on the NUL character
- *
- * synopsis
- * next_state = yy_try_NUL_trans( current_state );
- */
-
-#ifdef YY_USE_PROTOS
-static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
-#else
-static yy_state_type yy_try_NUL_trans( yy_current_state )
-yy_state_type yy_current_state;
-#endif
- {
- register int yy_is_jam;
- register char *yy_cp = yy_c_buf_p;
-
- register YY_CHAR yy_c = 1;
- if ( yy_accept[yy_current_state] )
- {
- yy_last_accepting_state = yy_current_state;
- yy_last_accepting_cpos = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 133 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- yy_is_jam = (yy_current_state == 132);
-
- return yy_is_jam ? 0 : yy_current_state;
- }
-
-
-#ifndef YY_NO_UNPUT
-#ifdef YY_USE_PROTOS
-static void yyunput( int c, register char *yy_bp )
-#else
-static void yyunput( c, yy_bp )
-int c;
-register char *yy_bp;
-#endif
- {
- register char *yy_cp = yy_c_buf_p;
-
- /* undo effects of setting up yytext */
- *yy_cp = yy_hold_char;
-
- if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
- { /* need to shift things up to make room */
- /* +2 for EOB chars. */
- register int number_to_move = yy_n_chars + 2;
- register char *dest = &yy_current_buffer->yy_ch_buf[
- yy_current_buffer->yy_buf_size + 2];
- register char *source =
- &yy_current_buffer->yy_ch_buf[number_to_move];
-
- while ( source > yy_current_buffer->yy_ch_buf )
- *--dest = *--source;
-
- yy_cp += (int) (dest - source);
- yy_bp += (int) (dest - source);
- yy_current_buffer->yy_n_chars =
- yy_n_chars = yy_current_buffer->yy_buf_size;
-
- if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
- YY_FATAL_ERROR( "flex scanner push-back overflow" );
- }
-
- *--yy_cp = (char) c;
-
-
- yytext_ptr = yy_bp;
- yy_hold_char = *yy_cp;
- yy_c_buf_p = yy_cp;
- }
-#endif /* ifndef YY_NO_UNPUT */
-
-
-#ifdef __cplusplus
-static int yyinput()
-#else
-static int input()
-#endif
- {
- int c;
-
- *yy_c_buf_p = yy_hold_char;
-
- if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
- {
- /* yy_c_buf_p now points to the character we want to return.
- * If this occurs *before* the EOB characters, then it's a
- * valid NUL; if not, then we've hit the end of the buffer.
- */
- if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
- /* This was really a NUL. */
- *yy_c_buf_p = '\0';
-
- else
- { /* need more input */
- int offset = yy_c_buf_p - yytext_ptr;
- ++yy_c_buf_p;
-
- switch ( yy_get_next_buffer() )
- {
- case EOB_ACT_LAST_MATCH:
- /* This happens because yy_g_n_b()
- * sees that we've accumulated a
- * token and flags that we need to
- * try matching the token before
- * proceeding. But for input(),
- * there's no matching to consider.
- * So convert the EOB_ACT_LAST_MATCH
- * to EOB_ACT_END_OF_FILE.
- */
-
- /* Reset buffer status. */
- yyrestart( yyin );
-
- /* fall through */
-
- case EOB_ACT_END_OF_FILE:
- {
- if ( yywrap() )
- return EOF;
-
- if ( ! yy_did_buffer_switch_on_eof )
- YY_NEW_FILE;
-#ifdef __cplusplus
- return yyinput();
-#else
- return input();
-#endif
- }
-
- case EOB_ACT_CONTINUE_SCAN:
- yy_c_buf_p = yytext_ptr + offset;
- break;
- }
- }
- }
-
- c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */
- *yy_c_buf_p = '\0'; /* preserve yytext */
- yy_hold_char = *++yy_c_buf_p;
-
-
- return c;
- }
-
-
-#ifdef YY_USE_PROTOS
-void yyrestart( FILE *input_file )
-#else
-void yyrestart( input_file )
-FILE *input_file;
-#endif
- {
- if ( ! yy_current_buffer )
- yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
-
- yy_init_buffer( yy_current_buffer, input_file );
- yy_load_buffer_state();
- }
-
-
-#ifdef YY_USE_PROTOS
-void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
-#else
-void yy_switch_to_buffer( new_buffer )
-YY_BUFFER_STATE new_buffer;
-#endif
- {
- if ( yy_current_buffer == new_buffer )
- return;
-
- if ( yy_current_buffer )
- {
- /* Flush out information for old buffer. */
- *yy_c_buf_p = yy_hold_char;
- yy_current_buffer->yy_buf_pos = yy_c_buf_p;
- yy_current_buffer->yy_n_chars = yy_n_chars;
- }
-
- yy_current_buffer = new_buffer;
- yy_load_buffer_state();
-
- /* We don't actually know whether we did this switch during
- * EOF (yywrap()) processing, but the only time this flag
- * is looked at is after yywrap() is called, so it's safe
- * to go ahead and always set it.
- */
- yy_did_buffer_switch_on_eof = 1;
- }
-
-
-#ifdef YY_USE_PROTOS
-void yy_load_buffer_state( void )
-#else
-void yy_load_buffer_state()
-#endif
- {
- yy_n_chars = yy_current_buffer->yy_n_chars;
- yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
- yyin = yy_current_buffer->yy_input_file;
- yy_hold_char = *yy_c_buf_p;
- }
-
-
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
-#else
-YY_BUFFER_STATE yy_create_buffer( file, size )
-FILE *file;
-int size;
-#endif
- {
- YY_BUFFER_STATE b;
-
- b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
- if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-
- b->yy_buf_size = size;
-
- /* yy_ch_buf has to be 2 characters longer than the size given because
- * we need to put in 2 end-of-buffer characters.
- */
- b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
- if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-
- b->yy_is_our_buffer = 1;
-
- yy_init_buffer( b, file );
-
- return b;
- }
-
-
-#ifdef YY_USE_PROTOS
-void yy_delete_buffer( YY_BUFFER_STATE b )
-#else
-void yy_delete_buffer( b )
-YY_BUFFER_STATE b;
-#endif
- {
- if ( ! b )
- return;
-
- if ( b == yy_current_buffer )
- yy_current_buffer = (YY_BUFFER_STATE) 0;
-
- if ( b->yy_is_our_buffer )
- yy_flex_free( (void *) b->yy_ch_buf );
-
- yy_flex_free( (void *) b );
- }
-
-
-#ifndef YY_ALWAYS_INTERACTIVE
-#ifndef YY_NEVER_INTERACTIVE
-extern int isatty YY_PROTO(( int ));
-#endif
-#endif
-
-#ifdef YY_USE_PROTOS
-void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
-#else
-void yy_init_buffer( b, file )
-YY_BUFFER_STATE b;
-FILE *file;
-#endif
-
-
- {
- yy_flush_buffer( b );
-
- b->yy_input_file = file;
- b->yy_fill_buffer = 1;
-
-#if YY_ALWAYS_INTERACTIVE
- b->yy_is_interactive = 1;
-#else
-#if YY_NEVER_INTERACTIVE
- b->yy_is_interactive = 0;
-#else
- b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-#endif
-#endif
- }
-
-
-#ifdef YY_USE_PROTOS
-void yy_flush_buffer( YY_BUFFER_STATE b )
-#else
-void yy_flush_buffer( b )
-YY_BUFFER_STATE b;
-#endif
-
- {
- if ( ! b )
- return;
-
- b->yy_n_chars = 0;
-
- /* We always need two end-of-buffer characters. The first causes
- * a transition to the end-of-buffer state. The second causes
- * a jam in that state.
- */
- b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
- b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
-
- b->yy_buf_pos = &b->yy_ch_buf[0];
-
- b->yy_at_bol = 1;
- b->yy_buffer_status = YY_BUFFER_NEW;
-
- if ( b == yy_current_buffer )
- yy_load_buffer_state();
- }
-
-
-#ifndef YY_NO_SCAN_BUFFER
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
-#else
-YY_BUFFER_STATE yy_scan_buffer( base, size )
-char *base;
-yy_size_t size;
-#endif
- {
- YY_BUFFER_STATE b;
-
- if ( size < 2 ||
- base[size-2] != YY_END_OF_BUFFER_CHAR ||
- base[size-1] != YY_END_OF_BUFFER_CHAR )
- /* They forgot to leave room for the EOB's. */
- return 0;
-
- b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
- if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
-
- b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
- b->yy_buf_pos = b->yy_ch_buf = base;
- b->yy_is_our_buffer = 0;
- b->yy_input_file = 0;
- b->yy_n_chars = b->yy_buf_size;
- b->yy_is_interactive = 0;
- b->yy_at_bol = 1;
- b->yy_fill_buffer = 0;
- b->yy_buffer_status = YY_BUFFER_NEW;
-
- yy_switch_to_buffer( b );
-
- return b;
- }
-#endif
-
-
-#ifndef YY_NO_SCAN_STRING
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
-#else
-YY_BUFFER_STATE yy_scan_string( yy_str )
-yyconst char *yy_str;
-#endif
- {
- int len;
- for ( len = 0; yy_str[len]; ++len )
- ;
-
- return yy_scan_bytes( yy_str, len );
- }
-#endif
-
-
-#ifndef YY_NO_SCAN_BYTES
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
-#else
-YY_BUFFER_STATE yy_scan_bytes( bytes, len )
-yyconst char *bytes;
-int len;
-#endif
- {
- YY_BUFFER_STATE b;
- char *buf;
- yy_size_t n;
- int i;
-
- /* Get memory for full buffer, including space for trailing EOB's. */
- n = len + 2;
- buf = (char *) yy_flex_alloc( n );
- if ( ! buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
-
- for ( i = 0; i < len; ++i )
- buf[i] = bytes[i];
-
- buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
-
- b = yy_scan_buffer( buf, n );
- if ( ! b )
- YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
-
- /* It's okay to grow etc. this buffer, and we should throw it
- * away when we're done.
- */
- b->yy_is_our_buffer = 1;
-
- return b;
- }
-#endif
-
-
-#ifndef YY_NO_PUSH_STATE
-#ifdef YY_USE_PROTOS
-static void yy_push_state( int new_state )
-#else
-static void yy_push_state( new_state )
-int new_state;
-#endif
- {
- if ( yy_start_stack_ptr >= yy_start_stack_depth )
- {
- yy_size_t new_size;
-
- yy_start_stack_depth += YY_START_STACK_INCR;
- new_size = yy_start_stack_depth * sizeof( int );
-
- if ( ! yy_start_stack )
- yy_start_stack = (int *) yy_flex_alloc( new_size );
-
- else
- yy_start_stack = (int *) yy_flex_realloc(
- (void *) yy_start_stack, new_size );
-
- if ( ! yy_start_stack )
- YY_FATAL_ERROR(
- "out of memory expanding start-condition stack" );
- }
-
- yy_start_stack[yy_start_stack_ptr++] = YY_START;
-
- BEGIN(new_state);
- }
-#endif
-
-
-#ifndef YY_NO_POP_STATE
-static void yy_pop_state()
- {
- if ( --yy_start_stack_ptr < 0 )
- YY_FATAL_ERROR( "start-condition stack underflow" );
-
- BEGIN(yy_start_stack[yy_start_stack_ptr]);
- }
-#endif
-
-
-#ifndef YY_NO_TOP_STATE
-static int yy_top_state()
- {
- return yy_start_stack[yy_start_stack_ptr - 1];
- }
-#endif
-
-#ifndef YY_EXIT_FAILURE
-#define YY_EXIT_FAILURE 2
-#endif
-
-#ifdef YY_USE_PROTOS
-static void yy_fatal_error( yyconst char msg[] )
-#else
-static void yy_fatal_error( msg )
-char msg[];
-#endif
- {
- (void) fprintf( stderr, "%s\n", msg );
- exit( YY_EXIT_FAILURE );
- }
-
-
-
-/* Redefine yyless() so it works in section 3 code. */
-
-#undef yyless
-#define yyless(n) \
- do \
- { \
- /* Undo effects of setting up yytext. */ \
- yytext[yyleng] = yy_hold_char; \
- yy_c_buf_p = yytext + n; \
- yy_hold_char = *yy_c_buf_p; \
- *yy_c_buf_p = '\0'; \
- yyleng = n; \
- } \
- while ( 0 )
-
-
-/* Internal utility routines. */
-
-#ifndef yytext_ptr
-#ifdef YY_USE_PROTOS
-static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
-#else
-static void yy_flex_strncpy( s1, s2, n )
-char *s1;
-yyconst char *s2;
-int n;
-#endif
- {
- register int i;
- for ( i = 0; i < n; ++i )
- s1[i] = s2[i];
- }
-#endif
-
-#ifdef YY_NEED_STRLEN
-#ifdef YY_USE_PROTOS
-static int yy_flex_strlen( yyconst char *s )
-#else
-static int yy_flex_strlen( s )
-yyconst char *s;
-#endif
- {
- register int n;
- for ( n = 0; s[n]; ++n )
- ;
-
- return n;
- }
-#endif
-
-
-#ifdef YY_USE_PROTOS
-static void *yy_flex_alloc( yy_size_t size )
-#else
-static void *yy_flex_alloc( size )
-yy_size_t size;
-#endif
- {
- return (void *) malloc( size );
- }
-
-#ifdef YY_USE_PROTOS
-static void *yy_flex_realloc( void *ptr, yy_size_t size )
-#else
-static void *yy_flex_realloc( ptr, size )
-void *ptr;
-yy_size_t size;
-#endif
- {
- /* The cast to (char *) in the following accommodates both
- * implementations that use char* generic pointers, and those
- * that use void* generic pointers. It works with the latter
- * because both ANSI C and C++ allow castless assignment from
- * any pointer type to void*, and deal with argument conversions
- * as though doing an assignment.
- */
- return (void *) realloc( (char *) ptr, size );
- }
-
-#ifdef YY_USE_PROTOS
-static void yy_flex_free( void *ptr )
-#else
-static void yy_flex_free( ptr )
-void *ptr;
-#endif
- {
- free( ptr );
- }
-
-#if YY_MAIN
-int main()
- {
- yylex();
- return 0;
- }
-#endif
-#line 94 "printdefl.l"
diff --git a/src/printdef/printdefl.l b/src/printdef/printdefl.l
deleted file mode 100644
index 7c56c88..0000000
--- a/src/printdef/printdefl.l
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * "$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 <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#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.c b/src/printdef/printdefy.c
deleted file mode 100644
index 256c416..0000000
--- a/src/printdef/printdefy.c
+++ /dev/null
@@ -1,1089 +0,0 @@
-
-/* A Bison parser, made from printdefy.y
- by GNU Bison version 1.25
- */
-
-#define YYBISON 1 /* Identify Bison output. */
-
-#define tINT 258
-#define tDOUBLE 259
-#define tSTRING 260
-#define tCLASS 261
-#define tBEGIN 262
-#define tEND 263
-#define ASSIGN 264
-#define PRINTER 265
-#define NAME 266
-#define DRIVER 267
-#define COLOR 268
-#define NOCOLOR 269
-#define MODEL 270
-#define LANGUAGE 271
-#define BRIGHTNESS 272
-#define GAMMA 273
-#define CONTRAST 274
-#define CYAN 275
-#define MAGENTA 276
-#define YELLOW 277
-#define SATURATION 278
-#define DENSITY 279
-#define ENDPRINTER 280
-#define VALUE 281
-
-#line 23 "printdefy.y"
-
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#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);
-static 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;
-}
-
-#include <stdio.h>
-
-#ifndef __cplusplus
-#ifndef __STDC__
-#define const
-#endif
-#endif
-
-
-
-#define YYFINAL 98
-#define YYFLAG -32768
-#define YYNTBASE 27
-
-#define YYTRANSLATE(x) ((unsigned)(x) <= 281 ? yytranslate[x] : 48)
-
-static const char yytranslate[] = { 0,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 1, 2, 3, 4, 5,
- 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
- 26
-};
-
-#if YYDEBUG != 0
-static const short yyprhs[] = { 0,
- 0, 10, 20, 24, 28, 32, 39, 46, 53, 60,
- 67, 74, 81, 88, 95, 102, 103, 105, 107, 109,
- 111, 113, 115, 117, 119, 121, 123, 125, 127, 129,
- 131, 134, 136, 140, 143, 146
-};
-
-static const short yyrhs[] = { 7,
- 10, 11, 9, 5, 12, 9, 5, 8, 0, 7,
- 10, 12, 9, 5, 11, 9, 5, 8, 0, 7,
- 25, 8, 0, 7, 13, 8, 0, 7, 14, 8,
- 0, 7, 15, 26, 9, 3, 8, 0, 7, 16,
- 26, 9, 6, 8, 0, 7, 17, 26, 9, 4,
- 8, 0, 7, 18, 26, 9, 4, 8, 0, 7,
- 19, 26, 9, 4, 8, 0, 7, 20, 26, 9,
- 4, 8, 0, 7, 21, 26, 9, 4, 8, 0,
- 7, 22, 26, 9, 4, 8, 0, 7, 23, 26,
- 9, 4, 8, 0, 7, 24, 26, 9, 4, 8,
- 0, 0, 27, 0, 28, 0, 30, 0, 31, 0,
- 32, 0, 33, 0, 34, 0, 35, 0, 36, 0,
- 37, 0, 38, 0, 39, 0, 40, 0, 41, 0,
- 45, 44, 0, 44, 0, 43, 45, 29, 0, 43,
- 29, 0, 47, 46, 0, 42, 0
-};
-
-#endif
-
-#if YYDEBUG != 0
-static const short yyrline[] = { 0,
- 125, 128, 131, 134, 137, 140, 143, 156, 159, 162,
- 165, 168, 171, 174, 177, 181, 184, 184, 187, 187,
- 187, 187, 187, 187, 187, 188, 188, 188, 188, 188,
- 191, 191, 194, 194, 197, 197
-};
-#endif
-
-
-#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
-
-static const char * const yytname[] = { "$","error","$undefined.","tINT","tDOUBLE",
-"tSTRING","tCLASS","tBEGIN","tEND","ASSIGN","PRINTER","NAME","DRIVER","COLOR",
-"NOCOLOR","MODEL","LANGUAGE","BRIGHTNESS","GAMMA","CONTRAST","CYAN","MAGENTA",
-"YELLOW","SATURATION","DENSITY","ENDPRINTER","VALUE","printerstart","printerstartalt",
-"printerend","color","nocolor","model","language","brightness","gamma","contrast",
-"cyan","magenta","yellow","saturation","density","Empty","pstart","parg","pargs",
-"Printer","Printers", NULL
-};
-#endif
-
-static const short yyr1[] = { 0,
- 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
- 37, 38, 39, 40, 41, 42, 43, 43, 44, 44,
- 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
- 45, 45, 46, 46, 47, 47
-};
-
-static const short yyr2[] = { 0,
- 9, 9, 3, 3, 3, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 0, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 2, 1, 3, 2, 2, 1
-};
-
-static const short yydefact[] = { 16,
- 36, 0, 0, 17, 18, 0, 35, 0, 0, 34,
- 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
- 29, 30, 32, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 33,
- 31, 0, 0, 4, 5, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 6, 7, 8, 9, 10, 11, 12, 13,
- 14, 15, 0, 0, 1, 2, 0, 0
-};
-
-static const short yydefgoto[] = { 4,
- 5, 10, 11, 12, 13, 14, 15, 16, 17, 18,
- 19, 20, 21, 22, 1, 6, 23, 24, 7, 2
-};
-
-static const short yypact[] = {-32768,
--32768, 13, 6,-32768,-32768, 10,-32768, 3, -13,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768, 10, 9, 12, 11, 14, -3, -2,
- -1, 0, 1, 2, 4, 5, 7, 8, 21,-32768,
--32768, 27, 30,-32768,-32768, 28, 29, 31, 32, 33,
- 34, 35, 36, 37, 38,-32768, 24, 39, 45, 43,
- 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
- 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
- 57, 71,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768, 69, 70,-32768,-32768, 79,-32768
-};
-
-static const short yypgoto[] = {-32768,
--32768, 15,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,-32768,-32768, 68,-32768,-32768,-32768
-};
-
-
-#define YYLAST 92
-
-
-static const short yytable[] = { 27,
- 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
- 38, 39, 97, 25, 26, 8, 9, 42, 44, 3,
- 43, 45, 46, 47, 48, 49, 50, 51, 56, 52,
- 53, 57, 54, 55, 58, 69, 59, 60, 40, 61,
- 62, 63, 64, 65, 66, 67, 68, 71, 72, 70,
- 73, 74, 75, 76, 77, 78, 79, 80, 0, 0,
- 0, 93, 0, 81, 82, 83, 84, 85, 86, 87,
- 88, 89, 90, 91, 92, 94, 95, 96, 98, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 41
-};
-
-static const short yycheck[] = { 13,
- 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
- 24, 25, 0, 11, 12, 10, 7, 9, 8, 7,
- 9, 8, 26, 26, 26, 26, 26, 26, 8, 26,
- 26, 5, 26, 26, 5, 12, 9, 9, 24, 9,
- 9, 9, 9, 9, 9, 9, 9, 3, 6, 11,
- 4, 4, 4, 4, 4, 4, 4, 4, -1, -1,
- -1, 5, -1, 9, 9, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 5, 8, 8, 0, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 24
-};
-/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
-#line 3 "/usr/share/bison.simple"
-
-/* Skeleton output parser for bison,
- Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
-
- 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., 675 Mass Ave, Cambridge, MA 02139, USA. */
-
-/* As a special exception, when this file is copied by Bison into a
- Bison output file, you may use that output file without restriction.
- This special exception was added by the Free Software Foundation
- in version 1.24 of Bison. */
-
-#ifndef alloca
-#ifdef __GNUC__
-#define alloca __builtin_alloca
-#else /* not GNU C. */
-#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
-#include <alloca.h>
-#else /* not sparc */
-#if defined (MSDOS) && !defined (__TURBOC__)
-#include <malloc.h>
-#else /* not MSDOS, or __TURBOC__ */
-#if defined(_AIX)
-#include <malloc.h>
- #pragma alloca
-#else /* not MSDOS, __TURBOC__, or _AIX */
-#ifdef __hpux
-#ifdef __cplusplus
-extern "C" {
-void *alloca (unsigned int);
-};
-#else /* not __cplusplus */
-void *alloca ();
-#endif /* not __cplusplus */
-#endif /* __hpux */
-#endif /* not _AIX */
-#endif /* not MSDOS, or __TURBOC__ */
-#endif /* not sparc. */
-#endif /* not GNU C. */
-#endif /* alloca not defined. */
-
-/* This is the parser code that is written into each bison parser
- when the %semantic_parser declaration is not specified in the grammar.
- It was written by Richard Stallman by simplifying the hairy parser
- used when %semantic_parser is specified. */
-
-/* Note: there must be only one dollar sign in this file.
- It is replaced by the list of actions, each action
- as one case of the switch. */
-
-#define yyerrok (yyerrstatus = 0)
-#define yyclearin (yychar = YYEMPTY)
-#define YYEMPTY -2
-#define YYEOF 0
-#define YYACCEPT return(0)
-#define YYABORT return(1)
-#define YYERROR goto yyerrlab1
-/* Like YYERROR except do call yyerror.
- This remains here temporarily to ease the
- transition to the new meaning of YYERROR, for GCC.
- Once GCC version 2 has supplanted version 1, this can go. */
-#define YYFAIL goto yyerrlab
-#define YYRECOVERING() (!!yyerrstatus)
-#define YYBACKUP(token, value) \
-do \
- if (yychar == YYEMPTY && yylen == 1) \
- { yychar = (token), yylval = (value); \
- yychar1 = YYTRANSLATE (yychar); \
- YYPOPSTACK; \
- goto yybackup; \
- } \
- else \
- { yyerror ("syntax error: cannot back up"); YYERROR; } \
-while (0)
-
-#define YYTERROR 1
-#define YYERRCODE 256
-
-#ifndef YYPURE
-#define YYLEX yylex()
-#endif
-
-#ifdef YYPURE
-#ifdef YYLSP_NEEDED
-#ifdef YYLEX_PARAM
-#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM)
-#else
-#define YYLEX yylex(&yylval, &yylloc)
-#endif
-#else /* not YYLSP_NEEDED */
-#ifdef YYLEX_PARAM
-#define YYLEX yylex(&yylval, YYLEX_PARAM)
-#else
-#define YYLEX yylex(&yylval)
-#endif
-#endif /* not YYLSP_NEEDED */
-#endif
-
-/* If nonreentrant, generate the variables here */
-
-#ifndef YYPURE
-
-int yychar; /* the lookahead symbol */
-YYSTYPE yylval; /* the semantic value of the */
- /* lookahead symbol */
-
-#ifdef YYLSP_NEEDED
-YYLTYPE yylloc; /* location data for the lookahead */
- /* symbol */
-#endif
-
-int yynerrs; /* number of parse errors so far */
-#endif /* not YYPURE */
-
-#if YYDEBUG != 0
-int yydebug; /* nonzero means print parse trace */
-/* Since this is uninitialized, it does not stop multiple parsers
- from coexisting. */
-#endif
-
-/* YYINITDEPTH indicates the initial size of the parser's stacks */
-
-#ifndef YYINITDEPTH
-#define YYINITDEPTH 200
-#endif
-
-/* YYMAXDEPTH is the maximum size the stacks can grow to
- (effective only if the built-in stack extension method is used). */
-
-#if YYMAXDEPTH == 0
-#undef YYMAXDEPTH
-#endif
-
-#ifndef YYMAXDEPTH
-#define YYMAXDEPTH 10000
-#endif
-
-#ifndef YYPARSE_RETURN_TYPE
-#define YYPARSE_RETURN_TYPE int
-#endif
-
-/* Prevent warning if -Wstrict-prototypes. */
-#ifdef __GNUC__
-YYPARSE_RETURN_TYPE yyparse (void);
-#endif
-
-#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
-#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT)
-#else /* not GNU C or C++ */
-#ifndef __cplusplus
-
-/* This is the most reliable way to avoid incompatibilities
- in available built-in functions on various systems. */
-static void
-__yy_memcpy (to, from, count)
- char *to;
- char *from;
- int count;
-{
- register char *f = from;
- register char *t = to;
- register int i = count;
-
- while (i-- > 0)
- *t++ = *f++;
-}
-
-#else /* __cplusplus */
-
-/* This is the most reliable way to avoid incompatibilities
- in available built-in functions on various systems. */
-static void
-__yy_memcpy (char *to, char *from, int count)
-{
- register char *f = from;
- register char *t = to;
- register int i = count;
-
- while (i-- > 0)
- *t++ = *f++;
-}
-
-#endif
-#endif
-
-#line 196 "/usr/share/bison.simple"
-
-/* The user can define YYPARSE_PARAM as the name of an argument to be passed
- into yyparse. The argument should have type void *.
- It should actually point to an object.
- Grammar actions can access the variable by casting it
- to the proper pointer type. */
-
-#ifdef YYPARSE_PARAM
-#ifdef __cplusplus
-#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
-#define YYPARSE_PARAM_DECL
-#else /* not __cplusplus */
-#define YYPARSE_PARAM_ARG YYPARSE_PARAM
-#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
-#endif /* not __cplusplus */
-#else /* not YYPARSE_PARAM */
-#define YYPARSE_PARAM_ARG
-#define YYPARSE_PARAM_DECL
-#endif /* not YYPARSE_PARAM */
-
-YYPARSE_RETURN_TYPE
-yyparse(YYPARSE_PARAM_ARG)
- YYPARSE_PARAM_DECL
-{
- register int yystate;
- register int yyn;
- register short *yyssp;
- register YYSTYPE *yyvsp;
- int yyerrstatus; /* number of tokens to shift before error messages enabled */
- int yychar1 = 0; /* lookahead token as an internal (translated) token number */
-
- short yyssa[YYINITDEPTH]; /* the state stack */
- YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */
-
- short *yyss = yyssa; /* refer to the stacks thru separate pointers */
- YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */
-
-#ifdef YYLSP_NEEDED
- YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */
- YYLTYPE *yyls = yylsa;
- YYLTYPE *yylsp;
-
-#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
-#else
-#define YYPOPSTACK (yyvsp--, yyssp--)
-#endif
-
- int yystacksize = YYINITDEPTH;
-
-#ifdef YYPURE
- int yychar;
- YYSTYPE yylval;
- int yynerrs;
-#ifdef YYLSP_NEEDED
- YYLTYPE yylloc;
-#endif
-#endif
-
- YYSTYPE yyval; /* the variable used to return */
- /* semantic values from the action */
- /* routines */
-
- int yylen;
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Starting parse\n");
-#endif
-
- yystate = 0;
- yyerrstatus = 0;
- yynerrs = 0;
- yychar = YYEMPTY; /* Cause a token to be read. */
-
- /* Initialize stack pointers.
- Waste one element of value and location stack
- so that they stay on the same level as the state stack.
- The wasted elements are never initialized. */
-
- yyssp = yyss - 1;
- yyvsp = yyvs;
-#ifdef YYLSP_NEEDED
- yylsp = yyls;
-#endif
-
-/* Push a new state, which is found in yystate . */
-/* In all cases, when you get here, the value and location stacks
- have just been pushed. so pushing a state here evens the stacks. */
-yynewstate:
-
- *++yyssp = yystate;
-
- if (yyssp >= yyss + yystacksize - 1)
- {
- /* Give user a chance to reallocate the stack */
- /* Use copies of these so that the &'s don't force the real ones into memory. */
- YYSTYPE *yyvs1 = yyvs;
- short *yyss1 = yyss;
-#ifdef YYLSP_NEEDED
- YYLTYPE *yyls1 = yyls;
-#endif
-
- /* Get the current used size of the three stacks, in elements. */
- int size = yyssp - yyss + 1;
-
-#ifdef yyoverflow
- /* Each stack pointer address is followed by the size of
- the data in use in that stack, in bytes. */
-#ifdef YYLSP_NEEDED
- /* This used to be a conditional around just the two extra args,
- but that might be undefined if yyoverflow is a macro. */
- yyoverflow("parser stack overflow",
- &yyss1, size * sizeof (*yyssp),
- &yyvs1, size * sizeof (*yyvsp),
- &yyls1, size * sizeof (*yylsp),
- &yystacksize);
-#else
- yyoverflow("parser stack overflow",
- &yyss1, size * sizeof (*yyssp),
- &yyvs1, size * sizeof (*yyvsp),
- &yystacksize);
-#endif
-
- yyss = yyss1; yyvs = yyvs1;
-#ifdef YYLSP_NEEDED
- yyls = yyls1;
-#endif
-#else /* no yyoverflow */
- /* Extend the stack our own way. */
- if (yystacksize >= YYMAXDEPTH)
- {
- yyerror("parser stack overflow");
- return 2;
- }
- yystacksize *= 2;
- if (yystacksize > YYMAXDEPTH)
- yystacksize = YYMAXDEPTH;
- yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
- __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp));
- yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
- __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp));
-#ifdef YYLSP_NEEDED
- yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
- __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp));
-#endif
-#endif /* no yyoverflow */
-
- yyssp = yyss + size - 1;
- yyvsp = yyvs + size - 1;
-#ifdef YYLSP_NEEDED
- yylsp = yyls + size - 1;
-#endif
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Stack size increased to %d\n", yystacksize);
-#endif
-
- if (yyssp >= yyss + yystacksize - 1)
- YYABORT;
- }
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Entering state %d\n", yystate);
-#endif
-
- goto yybackup;
- yybackup:
-
-/* Do appropriate processing given the current state. */
-/* Read a lookahead token if we need one and don't already have one. */
-/* yyresume: */
-
- /* First try to decide what to do without reference to lookahead token. */
-
- yyn = yypact[yystate];
- if (yyn == YYFLAG)
- goto yydefault;
-
- /* Not known => get a lookahead token if don't already have one. */
-
- /* yychar is either YYEMPTY or YYEOF
- or a valid token in external form. */
-
- if (yychar == YYEMPTY)
- {
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Reading a token: ");
-#endif
- yychar = YYLEX;
- }
-
- /* Convert token to internal form (in yychar1) for indexing tables with */
-
- if (yychar <= 0) /* This means end of input. */
- {
- yychar1 = 0;
- yychar = YYEOF; /* Don't call YYLEX any more */
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Now at end of input.\n");
-#endif
- }
- else
- {
- yychar1 = YYTRANSLATE(yychar);
-
-#if YYDEBUG != 0
- if (yydebug)
- {
- fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
- /* Give the individual parser a way to print the precise meaning
- of a token, for further debugging info. */
-#ifdef YYPRINT
- YYPRINT (stderr, yychar, yylval);
-#endif
- fprintf (stderr, ")\n");
- }
-#endif
- }
-
- yyn += yychar1;
- if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
- goto yydefault;
-
- yyn = yytable[yyn];
-
- /* yyn is what to do for this token type in this state.
- Negative => reduce, -yyn is rule number.
- Positive => shift, yyn is new state.
- New state is final state => don't bother to shift,
- just return success.
- 0, or most negative number => error. */
-
- if (yyn < 0)
- {
- if (yyn == YYFLAG)
- goto yyerrlab;
- yyn = -yyn;
- goto yyreduce;
- }
- else if (yyn == 0)
- goto yyerrlab;
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- /* Shift the lookahead token. */
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
-#endif
-
- /* Discard the token being shifted unless it is eof. */
- if (yychar != YYEOF)
- yychar = YYEMPTY;
-
- *++yyvsp = yylval;
-#ifdef YYLSP_NEEDED
- *++yylsp = yylloc;
-#endif
-
- /* count tokens shifted since error; after three, turn off error status. */
- if (yyerrstatus) yyerrstatus--;
-
- yystate = yyn;
- goto yynewstate;
-
-/* Do the default action for the current state. */
-yydefault:
-
- yyn = yydefact[yystate];
- if (yyn == 0)
- goto yyerrlab;
-
-/* Do a reduction. yyn is the number of a rule to reduce with. */
-yyreduce:
- yylen = yyr2[yyn];
- if (yylen > 0)
- yyval = yyvsp[1-yylen]; /* implement default value of the action */
-
-#if YYDEBUG != 0
- if (yydebug)
- {
- int i;
-
- fprintf (stderr, "Reducing via rule %d (line %d), ",
- yyn, yyrline[yyn]);
-
- /* Print the symbols being reduced, and their result. */
- for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
- fprintf (stderr, "%s ", yytname[yyrhs[i]]);
- fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
- }
-#endif
-
-
- switch (yyn) {
-
-case 1:
-#line 126 "printdefy.y"
-{ initialize_the_printer(yyvsp[-4].sval, yyvsp[-1].sval); ;
- break;}
-case 2:
-#line 129 "printdefy.y"
-{ initialize_the_printer(yyvsp[-1].sval, yyvsp[-4].sval); ;
- break;}
-case 3:
-#line 132 "printdefy.y"
-{ output_the_printer(); ;
- break;}
-case 4:
-#line 135 "printdefy.y"
-{ thePrinter.printvars.output_type = OUTPUT_COLOR; ;
- break;}
-case 5:
-#line 138 "printdefy.y"
-{ thePrinter.printvars.output_type = OUTPUT_GRAY; ;
- break;}
-case 6:
-#line 141 "printdefy.y"
-{ thePrinter.model = yyvsp[-1].ival; ;
- break;}
-case 7:
-#line 144 "printdefy.y"
-{
- int i;
- for (i = 0; i < nprintfuncs; i++)
- {
- if (!strcmp(yyvsp[-1].sval, printfuncs[i]))
- {
- thePrinter.printvars.top = i;
- break;
- }
- }
- ;
- break;}
-case 8:
-#line 157 "printdefy.y"
-{ thePrinter.printvars.brightness = yyvsp[-1].dval; ;
- break;}
-case 9:
-#line 160 "printdefy.y"
-{ thePrinter.printvars.gamma = yyvsp[-1].dval; ;
- break;}
-case 10:
-#line 163 "printdefy.y"
-{ thePrinter.printvars.contrast = yyvsp[-1].dval; ;
- break;}
-case 11:
-#line 166 "printdefy.y"
-{ thePrinter.printvars.cyan = yyvsp[-1].dval; ;
- break;}
-case 12:
-#line 169 "printdefy.y"
-{ thePrinter.printvars.magenta = yyvsp[-1].dval; ;
- break;}
-case 13:
-#line 172 "printdefy.y"
-{ thePrinter.printvars.yellow = yyvsp[-1].dval; ;
- break;}
-case 14:
-#line 175 "printdefy.y"
-{ thePrinter.printvars.saturation = yyvsp[-1].dval; ;
- break;}
-case 15:
-#line 178 "printdefy.y"
-{ thePrinter.printvars.density = yyvsp[-1].dval; ;
- break;}
-}
- /* the action file gets copied in in place of this dollarsign */
-#line 498 "/usr/share/bison.simple"
-
- yyvsp -= yylen;
- yyssp -= yylen;
-#ifdef YYLSP_NEEDED
- yylsp -= yylen;
-#endif
-
-#if YYDEBUG != 0
- if (yydebug)
- {
- short *ssp1 = yyss - 1;
- fprintf (stderr, "state stack now");
- while (ssp1 != yyssp)
- fprintf (stderr, " %d", *++ssp1);
- fprintf (stderr, "\n");
- }
-#endif
-
- *++yyvsp = yyval;
-
-#ifdef YYLSP_NEEDED
- yylsp++;
- if (yylen == 0)
- {
- yylsp->first_line = yylloc.first_line;
- yylsp->first_column = yylloc.first_column;
- yylsp->last_line = (yylsp-1)->last_line;
- yylsp->last_column = (yylsp-1)->last_column;
- yylsp->text = 0;
- }
- else
- {
- yylsp->last_line = (yylsp+yylen-1)->last_line;
- yylsp->last_column = (yylsp+yylen-1)->last_column;
- }
-#endif
-
- /* Now "shift" the result of the reduction.
- Determine what state that goes to,
- based on the state we popped back to
- and the rule number reduced by. */
-
- yyn = yyr1[yyn];
-
- yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
- if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
- yystate = yytable[yystate];
- else
- yystate = yydefgoto[yyn - YYNTBASE];
-
- goto yynewstate;
-
-yyerrlab: /* here on detecting error */
-
- if (! yyerrstatus)
- /* If not already recovering from an error, report this error. */
- {
- ++yynerrs;
-
-#ifdef YYERROR_VERBOSE
- yyn = yypact[yystate];
-
- if (yyn > YYFLAG && yyn < YYLAST)
- {
- int size = 0;
- char *msg;
- int x, count;
-
- count = 0;
- /* Start X at -yyn if nec to avoid negative indexes in yycheck. */
- for (x = (yyn < 0 ? -yyn : 0);
- x < (sizeof(yytname) / sizeof(char *)); x++)
- if (yycheck[x + yyn] == x)
- size += strlen(yytname[x]) + 15, count++;
- msg = (char *) malloc(size + 15);
- if (msg != 0)
- {
- strcpy(msg, "parse error");
-
- if (count < 5)
- {
- count = 0;
- for (x = (yyn < 0 ? -yyn : 0);
- x < (sizeof(yytname) / sizeof(char *)); x++)
- if (yycheck[x + yyn] == x)
- {
- strcat(msg, count == 0 ? ", expecting `" : " or `");
- strcat(msg, yytname[x]);
- strcat(msg, "'");
- count++;
- }
- }
- yyerror(msg);
- free(msg);
- }
- else
- yyerror ("parse error; also virtual memory exceeded");
- }
- else
-#endif /* YYERROR_VERBOSE */
- yyerror("parse error");
- }
-
- goto yyerrlab1;
-yyerrlab1: /* here on error raised explicitly by an action */
-
- if (yyerrstatus == 3)
- {
- /* if just tried and failed to reuse lookahead token after an error, discard it. */
-
- /* return failure if at end of input */
- if (yychar == YYEOF)
- YYABORT;
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
-#endif
-
- yychar = YYEMPTY;
- }
-
- /* Else will try to reuse lookahead token
- after shifting the error token. */
-
- yyerrstatus = 3; /* Each real token shifted decrements this */
-
- goto yyerrhandle;
-
-yyerrdefault: /* current state does not do anything special for the error token. */
-
-#if 0
- /* This is wrong; only states that explicitly want error tokens
- should shift them. */
- yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/
- if (yyn) goto yydefault;
-#endif
-
-yyerrpop: /* pop the current state because it cannot handle the error token */
-
- if (yyssp == yyss) YYABORT;
- yyvsp--;
- yystate = *--yyssp;
-#ifdef YYLSP_NEEDED
- yylsp--;
-#endif
-
-#if YYDEBUG != 0
- if (yydebug)
- {
- short *ssp1 = yyss - 1;
- fprintf (stderr, "Error: state stack now");
- while (ssp1 != yyssp)
- fprintf (stderr, " %d", *++ssp1);
- fprintf (stderr, "\n");
- }
-#endif
-
-yyerrhandle:
-
- yyn = yypact[yystate];
- if (yyn == YYFLAG)
- goto yyerrdefault;
-
- yyn += YYTERROR;
- if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
- goto yyerrdefault;
-
- yyn = yytable[yyn];
- if (yyn < 0)
- {
- if (yyn == YYFLAG)
- goto yyerrpop;
- yyn = -yyn;
- goto yyreduce;
- }
- else if (yyn == 0)
- goto yyerrpop;
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Shifting error token, ");
-#endif
-
- *++yyvsp = yylval;
-#ifdef YYLSP_NEEDED
- *++yylsp = yylloc;
-#endif
-
- yystate = yyn;
- goto yynewstate;
-}
-#line 200 "printdefy.y"
-
-
-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/printdef/printdefy.h b/src/printdef/printdefy.h
deleted file mode 100644
index f0a210a..0000000
--- a/src/printdef/printdefy.h
+++ /dev/null
@@ -1,27 +0,0 @@
-#define tINT 258
-#define tDOUBLE 259
-#define tSTRING 260
-#define tCLASS 261
-#define tBEGIN 262
-#define tEND 263
-#define ASSIGN 264
-#define PRINTER 265
-#define NAME 266
-#define DRIVER 267
-#define COLOR 268
-#define NOCOLOR 269
-#define MODEL 270
-#define LANGUAGE 271
-#define BRIGHTNESS 272
-#define GAMMA 273
-#define CONTRAST 274
-#define CYAN 275
-#define MAGENTA 276
-#define YELLOW 277
-#define SATURATION 278
-#define DENSITY 279
-#define ENDPRINTER 280
-#define VALUE 281
-
-
-extern YYSTYPE yylval;
diff --git a/src/printdef/printdefy.y b/src/printdef/printdefy.y
deleted file mode 100644
index 13d4f37..0000000
--- a/src/printdef/printdefy.y
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * "$Id: printdefy.y,v 1.7.4.1 2003/10/01 20:35:27 rleigh 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 <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#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);
-static 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 <ival> tINT
-%token <dval> tDOUBLE
-%token <sval> 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/Makefile.am b/src/testpattern/Makefile.am
index addd64c..8733129 100644
--- a/src/testpattern/Makefile.am
+++ b/src/testpattern/Makefile.am
@@ -1,4 +1,4 @@
-## $Id: Makefile.am,v 1.5.4.3 2002/06/05 23:52:05 rlk Exp $
+## $Id: Makefile.am,v 1.22 2004/09/17 18:38:27 rleigh Exp $
## Copyright (C) 2000 Roger Leigh
##
## This program is free software; you can redistribute it and/or modify
@@ -23,45 +23,43 @@ AUTOMAKE_OPTIONS = 1.4 gnu
MAINT_CHARSET = latin1
+include $(top_srcdir)/scripts/global.mk
+
## Variables
-AM_CFLAGS = $(GNUCFLAGS)
-INCLUDES = @INCLUDES@ $(LIBGIMPPRINT_CFLAGS)
-LIBPRINTUT = $(top_builddir)/lib/libprintut.la
-LIBS = @LIBS@ $(INTLLIBS)
+pkgdatadir = $(datadir)/$(PACKAGE)/samples
-## Programs
+TESTS = run-testpattern run-testpattern-1
-TESTPATTERN_BIN = testpattern
-bin_PROGRAMS = @TESTPATTERN_BIN@
+## Programs
-EXTRA_PROGRAMS = testpattern
+if BUILD_TESTPATTERN
+bin_PROGRAMS = testpattern
+noinst_PROGRAMS = printers
+endif
-LFLAGS = -i
-YFLAGS = -d
+AM_LFLAGS = -i
+AM_YFLAGS = -d
testpattern_SOURCES = testpattern.c testpatterny.y testpatternl.l testpattern.h
-testpattern_LDADD = $(LIBPRINTUT) $(LIBGIMPPRINT_LIBS)
-testpattern_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
+testpattern_LDADD = $(GUTENPRINT_LIBS)
testpatternl.o: testpatterny.o
testpattern.o: testpatterny.o
-$(LIBGIMPPRINT_LIBS):
- cd ../main ; \
- $(MAKE)
+printers_LDADD = $(GUTENPRINT_LIBS)
-SAMPLE_IMAGES = testpattern.sample
-pkgdatadir = $(datadir)/$(PACKAGE)/samples
+## Data
+
+pkgdata_DATA = testpattern.sample extended.sample
-pkgdata_DATA = @SAMPLE_IMAGES@
## Clean
-MAINTAINERCLEANFILES = Makefile.in
+MAINTAINERCLEANFILES = Makefile.in testpatternl.c testpatterny.c testpatterny.h
+
+EXTRA_DIST = testpatterny.h $(pkgdata_DATA) run-testpattern run-testpattern-1
-DISTCLEANFILES = testpatternl.c testpatterny.c testpatterny.h
-EXTRA_DIST = testpatterny.h testpattern.sample
diff --git a/src/testpattern/Makefile.in b/src/testpattern/Makefile.in
index b0193ed..856b313 100644
--- a/src/testpattern/Makefile.in
+++ b/src/testpattern/Makefile.in
@@ -1,6 +1,8 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# @configure_input@
-# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -10,312 +12,492 @@
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
+@SET_MAKE@
-SHELL = @SHELL@
+# Variables
+
+
+SOURCES = printers.c $(testpattern_SOURCES)
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-
-DESTDIR =
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
-
top_builddir = ../..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-transform = @program_transform_name@
-
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
-host_alias = @host_alias@
+build_triplet = @build@
host_triplet = @host@
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(top_srcdir)/scripts/global.mk testpatternl.c testpatterny.c \
+ testpatterny.h
+@BUILD_TESTPATTERN_TRUE@bin_PROGRAMS = testpattern$(EXEEXT)
+@BUILD_TESTPATTERN_TRUE@noinst_PROGRAMS = printers$(EXEEXT)
+subdir = src/testpattern
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gimp.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/progtest.m4 \
+ $(top_srcdir)/m4/stp.m4 $(top_srcdir)/m4/stp_cups.m4 \
+ $(top_srcdir)/m4/stp_gimp.m4 $(top_srcdir)/m4/stp_option.m4 \
+ $(top_srcdir)/m4/stp_release.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
+printers_SOURCES = printers.c
+printers_OBJECTS = printers.$(OBJEXT)
+am__DEPENDENCIES_1 = $(top_builddir)/src/main/libgutenprint.la
+printers_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_testpattern_OBJECTS = testpattern.$(OBJEXT) testpatterny.$(OBJEXT) \
+ testpatternl.$(OBJEXT)
+testpattern_OBJECTS = $(am_testpattern_OBJECTS)
+testpattern_DEPENDENCIES = $(am__DEPENDENCIES_1)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS)
+LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS)
+YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS)
+LTYACCCOMPILE = $(LIBTOOL) --mode=compile $(YACC) $(YFLAGS) \
+ $(AM_YFLAGS)
+SOURCES = printers.c $(testpattern_SOURCES)
+DIST_SOURCES = printers.c $(testpattern_SOURCES)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+pkgdataDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkgdata_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+pkgdatadir = $(datadir)/$(PACKAGE)/samples
+ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
-AS = @AS@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
-BISON_PROG = @BISON_PROG@
-BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
-CATALOGS = @CATALOGS@
-CATOBJEXT = @CATOBJEXT@
+BUILD_CUPS_FALSE = @BUILD_CUPS_FALSE@
+BUILD_CUPS_PPDS_FALSE = @BUILD_CUPS_PPDS_FALSE@
+BUILD_CUPS_PPDS_TRUE = @BUILD_CUPS_PPDS_TRUE@
+BUILD_CUPS_TRUE = @BUILD_CUPS_TRUE@
+BUILD_ESCPUTIL_FALSE = @BUILD_ESCPUTIL_FALSE@
+BUILD_ESCPUTIL_TRUE = @BUILD_ESCPUTIL_TRUE@
+BUILD_FOOMATIC_3_FALSE = @BUILD_FOOMATIC_3_FALSE@
+BUILD_FOOMATIC_3_TRUE = @BUILD_FOOMATIC_3_TRUE@
+BUILD_FOOMATIC_FALSE = @BUILD_FOOMATIC_FALSE@
+BUILD_FOOMATIC_TRUE = @BUILD_FOOMATIC_TRUE@
+BUILD_GENPPD_STATIC_FALSE = @BUILD_GENPPD_STATIC_FALSE@
+BUILD_GENPPD_STATIC_TRUE = @BUILD_GENPPD_STATIC_TRUE@
+BUILD_GHOSTSCRIPT_FALSE = @BUILD_GHOSTSCRIPT_FALSE@
+BUILD_GHOSTSCRIPT_TRUE = @BUILD_GHOSTSCRIPT_TRUE@
+BUILD_GIMP2_FALSE = @BUILD_GIMP2_FALSE@
+BUILD_GIMP2_TRUE = @BUILD_GIMP2_TRUE@
+BUILD_GIMP_FALSE = @BUILD_GIMP_FALSE@
+BUILD_GIMP_TRUE = @BUILD_GIMP_TRUE@
+BUILD_LIBGUTENPRINTUI2_FALSE = @BUILD_LIBGUTENPRINTUI2_FALSE@
+BUILD_LIBGUTENPRINTUI2_TRUE = @BUILD_LIBGUTENPRINTUI2_TRUE@
+BUILD_LIBGUTENPRINTUI_FALSE = @BUILD_LIBGUTENPRINTUI_FALSE@
+BUILD_LIBGUTENPRINTUI_TRUE = @BUILD_LIBGUTENPRINTUI_TRUE@
+BUILD_MODULES_FALSE = @BUILD_MODULES_FALSE@
+BUILD_MODULES_TRUE = @BUILD_MODULES_TRUE@
+BUILD_TESTPATTERN_FALSE = @BUILD_TESTPATTERN_FALSE@
+BUILD_TESTPATTERN_TRUE = @BUILD_TESTPATTERN_TRUE@
+BUILD_TEST_FALSE = @BUILD_TEST_FALSE@
+BUILD_TEST_TRUE = @BUILD_TEST_TRUE@
+BUILD_TRANSLATED_CUPS_PPDS_FALSE = @BUILD_TRANSLATED_CUPS_PPDS_FALSE@
+BUILD_TRANSLATED_CUPS_PPDS_TRUE = @BUILD_TRANSLATED_CUPS_PPDS_TRUE@
CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
CONVERT = @CONVERT@
-CUPS_BACKEND_BIN = @CUPS_BACKEND_BIN@
-CUPS_BIN = @CUPS_BIN@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
CUPS_CFLAGS = @CUPS_CFLAGS@
-CUPS_CONF = @CUPS_CONF@
CUPS_CONFIG = @CUPS_CONFIG@
-CUPS_FILTER_BIN = @CUPS_FILTER_BIN@
-CUPS_INSTALL = @CUPS_INSTALL@
CUPS_LIBS = @CUPS_LIBS@
-CUPS_MAN = @CUPS_MAN@
-CUPS_NOINST_BIN = @CUPS_NOINST_BIN@
-CUPS_PKG = @CUPS_PKG@
+CUPS_PPDS_AT_TOP_LEVEL_FALSE = @CUPS_PPDS_AT_TOP_LEVEL_FALSE@
+CUPS_PPDS_AT_TOP_LEVEL_TRUE = @CUPS_PPDS_AT_TOP_LEVEL_TRUE@
CUPS_PPD_PS_LEVEL = @CUPS_PPD_PS_LEVEL@
-DATADIRNAME = @DATADIRNAME@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
DB2HTML = @DB2HTML@
DB2PDF = @DB2PDF@
DB2PS = @DB2PS@
-DLLTOOL = @DLLTOOL@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DIALOG = @DIALOG@
+DOXYGEN = @DOXYGEN@
DVIPDF = @DVIPDF@
DVIPS = @DVIPS@
ECHO = @ECHO@
-ESCPUTIL_BIN = @ESCPUTIL_BIN@
-ESCPUTIL_MAN = @ESCPUTIL_MAN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
EXEEXT = @EXEEXT@
-FOOMATIC_3_NOINST_BIN = @FOOMATIC_3_NOINST_BIN@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+FIND = @FIND@
FOOMATIC_CONFIGURE = @FOOMATIC_CONFIGURE@
-FOOMATIC_INSTALL = @FOOMATIC_INSTALL@
FOOMATIC_KITLOAD = @FOOMATIC_KITLOAD@
-FOOMATIC_NOINST_BIN = @FOOMATIC_NOINST_BIN@
-FOOMATIC_OLDIDS_NOINST_BIN = @FOOMATIC_OLDIDS_NOINST_BIN@
FOOMATIC_PPDFILE = @FOOMATIC_PPDFILE@
-GENCAT = @GENCAT@
-GIMPPRINT_BINARY_AGE = @GIMPPRINT_BINARY_AGE@
-GIMPPRINT_CFLAGS = @GIMPPRINT_CFLAGS@
-GIMPPRINT_CURRENT_INTERFACE = @GIMPPRINT_CURRENT_INTERFACE@
-GIMPPRINT_DEPLIBS = @GIMPPRINT_DEPLIBS@
-GIMPPRINT_INTERFACE_AGE = @GIMPPRINT_INTERFACE_AGE@
-GIMPPRINT_LIBS = @GIMPPRINT_LIBS@
-GIMPPRINT_MAJOR_VERSION = @GIMPPRINT_MAJOR_VERSION@
-GIMPPRINT_MICRO_VERSION = @GIMPPRINT_MICRO_VERSION@
-GIMPPRINT_MINOR_VERSION = @GIMPPRINT_MINOR_VERSION@
-GIMPPRINT_VERSION = @GIMPPRINT_VERSION@
+GENPPD_LIBS = @GENPPD_LIBS@
+GIMP2_CFLAGS = @GIMP2_CFLAGS@
+GIMP2_LIBS = @GIMP2_LIBS@
GIMPTOOL = @GIMPTOOL@
+GIMPTOOL2_CHECK = @GIMPTOOL2_CHECK@
GIMPTOOL_CHECK = @GIMPTOOL_CHECK@
-GIMP_BIN = @GIMP_BIN@
GIMP_CFLAGS = @GIMP_CFLAGS@
GIMP_CFLAGS_NOUI = @GIMP_CFLAGS_NOUI@
GIMP_DATA_DIR = @GIMP_DATA_DIR@
GIMP_LIBS = @GIMP_LIBS@
GIMP_LIBS_NOUI = @GIMP_LIBS_NOUI@
GIMP_PLUGIN_DIR = @GIMP_PLUGIN_DIR@
-GLIBC21 = @GLIBC21@
-GMOFILES = @GMOFILES@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_CONFIG = @GLIB_CONFIG@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
GMSGFMT = @GMSGFMT@
GNUCFLAGS = @GNUCFLAGS@
-IJS_BIN = @IJS_BIN@
+GTK2_CFLAGS = @GTK2_CFLAGS@
+GTK2_LIBS = @GTK2_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+GUTENPRINTUI2_BINARY_AGE = @GUTENPRINTUI2_BINARY_AGE@
+GUTENPRINTUI2_CFLAGS = @GUTENPRINTUI2_CFLAGS@
+GUTENPRINTUI2_CURRENT_INTERFACE = @GUTENPRINTUI2_CURRENT_INTERFACE@
+GUTENPRINTUI2_INTERFACE_AGE = @GUTENPRINTUI2_INTERFACE_AGE@
+GUTENPRINTUI2_LIBDEPS = @GUTENPRINTUI2_LIBDEPS@
+GUTENPRINTUI2_LIBS = $(top_builddir)/src/gutenprintui2/libgutenprintui2.la
+GUTENPRINTUI2_VERSION = @GUTENPRINTUI2_VERSION@
+GUTENPRINTUI_BINARY_AGE = @GUTENPRINTUI_BINARY_AGE@
+GUTENPRINTUI_CFLAGS = @GUTENPRINTUI_CFLAGS@
+GUTENPRINTUI_CURRENT_INTERFACE = @GUTENPRINTUI_CURRENT_INTERFACE@
+GUTENPRINTUI_INTERFACE_AGE = @GUTENPRINTUI_INTERFACE_AGE@
+GUTENPRINTUI_LIBDEPS = @GUTENPRINTUI_LIBDEPS@
+GUTENPRINTUI_LIBS = $(top_builddir)/src/gutenprintui/libgutenprintui.la
+GUTENPRINTUI_VERSION = @GUTENPRINTUI_VERSION@
+GUTENPRINT_BINARY_AGE = @GUTENPRINT_BINARY_AGE@
+GUTENPRINT_CFLAGS = @GUTENPRINT_CFLAGS@
+GUTENPRINT_CURRENT_INTERFACE = @GUTENPRINT_CURRENT_INTERFACE@
+GUTENPRINT_INTERFACE_AGE = @GUTENPRINT_INTERFACE_AGE@
+GUTENPRINT_LIBDEPS = @GUTENPRINT_LIBDEPS@
+
+# Libraries
+GUTENPRINT_LIBS = $(top_builddir)/src/main/libgutenprint.la
+GUTENPRINT_MAJOR_VERSION = @GUTENPRINT_MAJOR_VERSION@
+GUTENPRINT_MICRO_VERSION = @GUTENPRINT_MICRO_VERSION@
+GUTENPRINT_MINOR_VERSION = @GUTENPRINT_MINOR_VERSION@
+GUTENPRINT_VERSION = @GUTENPRINT_VERSION@
IJS_CFLAGS = @IJS_CFLAGS@
IJS_CONFIG = @IJS_CONFIG@
-IJS_INSTALL = @IJS_INSTALL@
IJS_LIBS = @IJS_LIBS@
-INSTOBJEXT = @INSTOBJEXT@
-INTLBISON = @INTLBISON@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SAMPLES_FALSE = @INSTALL_SAMPLES_FALSE@
+INSTALL_SAMPLES_TRUE = @INSTALL_SAMPLES_TRUE@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_USER_GUIDE_FALSE = @INSTALL_USER_GUIDE_FALSE@
+INSTALL_USER_GUIDE_TRUE = @INSTALL_USER_GUIDE_TRUE@
INTLLIBS = @INTLLIBS@
-INTLOBJS = @INTLOBJS@
-INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDFLAGS = @LDFLAGS@
LEX = @LEX@
-LIBGIMPPRINT_LIBS = @LIBGIMPPRINT_LIBS@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
LIBICONV = @LIBICONV@
-LIBM = @LIBM@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
LIBREADLINE_DEPS = @LIBREADLINE_DEPS@
+LIBS = $(INTLLIBS) @LIBS@
LIBTOOL = @LIBTOOL@
LIBTOOL_DEPS = @LIBTOOL_DEPS@
LN_S = @LN_S@
LTALLOCA = @LTALLOCA@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
-LT_AGE = @LT_AGE@
-LT_CURRENT = @LT_CURRENT@
-LT_RELEASE = @LT_RELEASE@
-LT_REVISION = @LT_REVISION@
MAINT = @MAINT@
MAINTAINER_CFLAGS = @MAINTAINER_CFLAGS@
-MAIN_BIN = @MAIN_BIN@
-MAIN_DAT = @MAIN_DAT@
-MAIN_MAN = @MAIN_MAN@
-MAIN_SCR = @MAIN_SCR@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
MKINSTALLDIRS = @MKINSTALLDIRS@
MSGFMT = @MSGFMT@
-OBJDUMP = @OBJDUMP@
+MSGMERGE = @MSGMERGE@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
PLUG_IN_PATH = @PLUG_IN_PATH@
-POFILES = @POFILES@
POSUB = @POSUB@
-PRINT_VASPRINTF = @PRINT_VASPRINTF@
RANLIB = @RANLIB@
RELEASE_DATE = @RELEASE_DATE@
RM = @RM@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
STRIP = @STRIP@
-TEST_BIN = @TEST_BIN@
TEXI2HTML = @TEXI2HTML@
-USER_GUIDE = @USER_GUIDE@
-USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_LEVEL3_PS_FALSE = @USE_LEVEL3_PS_FALSE@
+USE_LEVEL3_PS_TRUE = @USE_LEVEL3_PS_TRUE@
USE_NLS = @USE_NLS@
+USE_NLS_FALSE = @USE_NLS_FALSE@
+USE_NLS_TRUE = @USE_NLS_TRUE@
VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
YACC = @YACC@
-YACC_PROG = @YACC_PROG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
cups_bindir = @cups_bindir@
cups_conf_datadir = @cups_conf_datadir@
cups_conf_serverbin = @cups_conf_serverbin@
cups_conf_serverroot = @cups_conf_serverroot@
cups_exec_prefix = @cups_exec_prefix@
cups_prefix = @cups_prefix@
+cups_sbindir = @cups_sbindir@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+gimp2_plug_indir = @gimp2_plug_indir@
gimp_plug_indir = @gimp_plug_indir@
-gimpprint_cflags = @gimpprint_cflags@
-gimpprint_libs = @gimpprint_libs@
-
+gutenprint_cflags = @gutenprint_cflags@
+gutenprint_libs = @gutenprint_libs@
+gutenprintui2_cflags = @gutenprintui2_cflags@
+gutenprintui2_libs = @gutenprintui2_libs@
+gutenprintui_cflags = @gutenprintui_cflags@
+gutenprintui_libs = @gutenprintui_libs@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
AUTOMAKE_OPTIONS = 1.4 gnu
-
MAINT_CHARSET = latin1
-
-AM_CFLAGS = $(GNUCFLAGS)
-INCLUDES = @INCLUDES@ $(LIBGIMPPRINT_CFLAGS)
-LIBPRINTUT = $(top_builddir)/lib/libprintut.la
-LIBS = @LIBS@ $(INTLLIBS)
-
-TESTPATTERN_BIN = testpattern
-
-bin_PROGRAMS = @TESTPATTERN_BIN@
-
-EXTRA_PROGRAMS = testpattern
-
-LFLAGS = -i
-YFLAGS = -d
-
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(LOCAL_CPPFLAGS) $(GNUCFLAGS)
+TESTS = run-testpattern run-testpattern-1
+AM_LFLAGS = -i
+AM_YFLAGS = -d
testpattern_SOURCES = testpattern.c testpatterny.y testpatternl.l testpattern.h
-testpattern_LDADD = $(LIBPRINTUT) $(LIBGIMPPRINT_LIBS)
-testpattern_DEPENDENCIES = $(LIBGIMPPRINT_LIBS)
-
-SAMPLE_IMAGES = testpattern.sample
-
-pkgdatadir = $(datadir)/$(PACKAGE)/samples
-
-pkgdata_DATA = @SAMPLE_IMAGES@
-
-MAINTAINERCLEANFILES = Makefile.in
+testpattern_LDADD = $(GUTENPRINT_LIBS)
+printers_LDADD = $(GUTENPRINT_LIBS)
+pkgdata_DATA = testpattern.sample extended.sample
+MAINTAINERCLEANFILES = Makefile.in testpatternl.c testpatterny.c testpatterny.h
+EXTRA_DIST = testpatterny.h $(pkgdata_DATA) run-testpattern run-testpattern-1
+all: all-am
-DISTCLEANFILES = testpatternl.c testpatterny.c testpatterny.h
-EXTRA_DIST = testpatterny.h testpattern.sample
-mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
-CONFIG_HEADER = ../../config.h
-CONFIG_CLEAN_FILES =
-bin_PROGRAMS = @TESTPATTERN_BIN@
-PROGRAMS = $(bin_PROGRAMS)
-
-
-DEFS = @DEFS@ -I. -I$(srcdir) -I../..
-CPPFLAGS = @CPPFLAGS@
-LDFLAGS = @LDFLAGS@
-testpattern_OBJECTS = testpattern.$(OBJEXT) testpatterny.$(OBJEXT) \
-testpatternl.$(OBJEXT)
-testpattern_LDFLAGS =
-LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
-LEXLIB = @LEXLIB@
-CFLAGS = @CFLAGS@
-COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-DATA = $(pkgdata_DATA)
-
-DIST_COMMON = Makefile.am Makefile.in testpatternl.c testpatterny.c
-
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = tar
-GZIP_ENV = --best
-SOURCES = $(testpattern_SOURCES)
-OBJECTS = $(testpattern_OBJECTS)
-
-all: all-redirect
.SUFFIXES:
-.SUFFIXES: .S .c .l .lo .o .obj .s .y
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps src/testpattern/Makefile
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-
-mostlyclean-binPROGRAMS:
-
-clean-binPROGRAMS:
- -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
-
-distclean-binPROGRAMS:
-
-maintainer-clean-binPROGRAMS:
-
+.SUFFIXES: .c .l .lo .o .obj .y
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/scripts/global.mk $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/testpattern/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/testpattern/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
install-binPROGRAMS: $(bin_PROGRAMS)
@$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(bindir)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
@list='$(bin_PROGRAMS)'; for p in $$list; do \
- if test -f $$p; then \
- echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
- $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
else :; fi; \
done
uninstall-binPROGRAMS:
@$(NORMAL_UNINSTALL)
- list='$(bin_PROGRAMS)'; for p in $$list; do \
- rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
done
-.c.o:
- $(COMPILE) -c $<
-
-# FIXME: We should only use cygpath when building on Windows,
-# and only if it is available.
-.c.obj:
- $(COMPILE) -c `cygpath -w $<`
-
-.s.o:
- $(COMPILE) -c $<
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
-.S.o:
- $(COMPILE) -c $<
+clean-noinstPROGRAMS:
+ @list='$(noinst_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+printers$(EXEEXT): $(printers_OBJECTS) $(printers_DEPENDENCIES)
+ @rm -f printers$(EXEEXT)
+ $(LINK) $(printers_LDFLAGS) $(printers_OBJECTS) $(printers_LDADD) $(LIBS)
+testpatterny.h: testpatterny.c
+ @if test ! -f $@; then \
+ rm -f testpatterny.c; \
+ $(MAKE) testpatterny.c; \
+ else :; fi
+testpattern$(EXEEXT): $(testpattern_OBJECTS) $(testpattern_DEPENDENCIES)
+ @rm -f testpattern$(EXEEXT)
+ $(LINK) $(testpattern_LDFLAGS) $(testpattern_OBJECTS) $(testpattern_LDADD) $(LIBS)
mostlyclean-compile:
- -rm -f *.o core *.core
-rm -f *.$(OBJEXT)
-clean-compile:
-
distclean-compile:
-rm -f *.tab.c
-maintainer-clean-compile:
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printers.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testpattern.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testpatternl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testpatterny.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
.c.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
-.s.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.l.c:
+ $(LEXCOMPILE) $<
+ sed '/^#/ s|$(LEX_OUTPUT_ROOT)\.c|$@|' $(LEX_OUTPUT_ROOT).c >$@
+ rm -f $(LEX_OUTPUT_ROOT).c
-.S.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+.y.c:
+ $(YACCCOMPILE) $<
+ if test -f y.tab.h; then \
+ to=`echo "$*_H" | sed \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
+ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`; \
+ sed -e "/^#/!b" -e "s/Y_TAB_H/$$to/g" -e "s|y\.tab\.h|$*.h|" \
+ y.tab.h >$*.ht; \
+ rm -f y.tab.h; \
+ if cmp -s $*.ht $*.h; then \
+ rm -f $*.ht ;\
+ else \
+ mv $*.ht $*.h; \
+ fi; \
+ fi
+ if test -f y.output; then \
+ mv y.output $*.output; \
+ fi
+ sed '/^#/ s|y\.tab\.c|$@|' y.tab.c >$@t && mv $@t $@
+ rm -f y.tab.c
mostlyclean-libtool:
-rm -f *.lo
@@ -324,183 +506,299 @@ clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-
-maintainer-clean-libtool:
-
-testpattern$(EXEEXT): $(testpattern_OBJECTS) $(testpattern_DEPENDENCIES)
- @rm -f testpattern$(EXEEXT)
- $(LINK) $(testpattern_LDFLAGS) $(testpattern_OBJECTS) $(testpattern_LDADD) $(LIBS)
-.l.c:
- $(LEX) $(AM_LFLAGS) $(LFLAGS) $< && mv $(LEX_OUTPUT_ROOT).c $@
-.y.c:
- $(YACC) $(AM_YFLAGS) $(YFLAGS) $< && mv y.tab.c $*.c
- if test -f y.tab.h; then \
- if cmp -s y.tab.h $*.h; then rm -f y.tab.h; else mv y.tab.h $*.h; fi; \
- else :; fi
-testpatterny.h: testpatterny.c
-
-
+ -rm -f libtool
+uninstall-info-am:
install-pkgdataDATA: $(pkgdata_DATA)
@$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)
+ test -z "$(pkgdatadir)" || $(mkdir_p) "$(DESTDIR)$(pkgdatadir)"
@list='$(pkgdata_DATA)'; for p in $$list; do \
- if test -f $(srcdir)/$$p; then \
- echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkgdatadir)/$$p"; \
- $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkgdatadir)/$$p; \
- else if test -f $$p; then \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(pkgdatadir)/$$p"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(pkgdatadir)/$$p; \
- fi; fi; \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgdatadir)/$$f'"; \
+ $(pkgdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgdatadir)/$$f"; \
done
uninstall-pkgdataDATA:
@$(NORMAL_UNINSTALL)
- list='$(pkgdata_DATA)'; for p in $$list; do \
- rm -f $(DESTDIR)$(pkgdatadir)/$$p; \
+ @list='$(pkgdata_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgdatadir)/$$f"; \
done
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
tags: TAGS
-ID: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
- here=`pwd` && cd $(srcdir) \
- && mkid -f$$here/ID $$unique $(LISP)
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
- || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
-
-mostlyclean-tags:
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
-clean-tags:
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
- -rm -f TAGS ID
-
-maintainer-clean-tags:
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-
-subdir = src/testpattern
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list='$(TESTS)'; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
distdir: $(DISTFILES)
- @for file in $(DISTFILES); do \
- d=$(srcdir); \
+ $(mkdir_p) $(distdir)/../../scripts
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
if test -d $$d/$$file; then \
- cp -pr $$/$$file $(distdir)/$$file; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
- || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $$d/$$file $(distdir)/$$file || :; \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
fi; \
done
-printers.o: printers.c ../../config.h \
- ../../include/gimp-print/gimp-print.h ../../lib/libprintut.h \
- ../../lib/xmalloc.h
-testpattern.o: testpattern.c ../../config.h \
- ../../include/gimp-print/gimp-print.h testpattern.h \
- testpatterny.h
-testpatternl.o: testpatternl.c ../../config.h testpattern.h \
- testpatterny.h
-testpatterny.o: testpatterny.c ../../config.h testpattern.h \
- testpatterny.h
-
-info-am:
-info: info-am
-dvi-am:
-dvi: dvi-am
check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
check: check-am
-installcheck-am:
-installcheck: installcheck-am
-install-exec-am: install-binPROGRAMS
+all-am: Makefile $(PROGRAMS) $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)"; do \
+ test -z "$$dir" || $(mkdir_p) "$$dir"; \
+ done
+install: install-am
install-exec: install-exec-am
-
-install-data-am: install-pkgdataDATA
install-data: install-data-am
+uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-am
-uninstall-am: uninstall-binPROGRAMS uninstall-pkgdataDATA
-uninstall: uninstall-am
-all-am: Makefile $(PROGRAMS) $(DATA)
-all-redirect: all-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs:
- $(mkinstalldirs) $(DESTDIR)$(bindir) $(DESTDIR)$(pkgdatadir)
-
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
- -rm -f config.cache config.log stamp-h stamp-h[0-9]*
- -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
- -test -z "testpatternlltestpatternyhtestpatternyc$(MAINTAINERCLEANFILES)" || rm -f testpatternll testpatternyh testpatternyc $(MAINTAINERCLEANFILES)
-mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \
- mostlyclean-libtool mostlyclean-tags \
- mostlyclean-generic
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -rm -f testpatternl.c
+ -rm -f testpatterny.c
+ -rm -f testpatterny.h
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
-mostlyclean: mostlyclean-am
+clean-am: clean-binPROGRAMS clean-generic clean-libtool \
+ clean-noinstPROGRAMS mostlyclean-am
-clean-am: clean-binPROGRAMS clean-compile clean-libtool clean-tags \
- clean-generic mostlyclean-am
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
-clean: clean-am
+dvi: dvi-am
-distclean-am: distclean-binPROGRAMS distclean-compile distclean-libtool \
- distclean-tags distclean-generic clean-am
- -rm -f libtool
+dvi-am:
-distclean: distclean-am
+html: html-am
-maintainer-clean-am: maintainer-clean-binPROGRAMS \
- maintainer-clean-compile maintainer-clean-libtool \
- maintainer-clean-tags maintainer-clean-generic \
- distclean-am
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgdataDATA
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
-.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
-maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
-mostlyclean-compile distclean-compile clean-compile \
-maintainer-clean-compile mostlyclean-libtool distclean-libtool \
-clean-libtool maintainer-clean-libtool uninstall-pkgdataDATA \
-install-pkgdataDATA tags mostlyclean-tags distclean-tags clean-tags \
-maintainer-clean-tags distdir info-am info dvi-am dvi check check-am \
-installcheck-am installcheck install-exec-am install-exec \
-install-data-am install-data install-am install uninstall-am uninstall \
-all-redirect all-am all installdirs mostlyclean-generic \
-distclean-generic clean-generic maintainer-clean-generic clean \
-mostlyclean distclean maintainer-clean
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
+ uninstall-pkgdataDATA
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool \
+ clean-noinstPROGRAMS ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-binPROGRAMS install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-pkgdataDATA install-strip installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
+ uninstall-am uninstall-binPROGRAMS uninstall-info-am \
+ uninstall-pkgdataDATA
@SET_MAKE@
-testpatternl.o: testpatterny.o
-testpattern.o: testpatterny.o
+export STP_MODULE_PATH = $(top_builddir)/src/main/.libs:$(top_builddir)/src/main
+export STP_DATA_PATH = $(top_srcdir)/src/main
+
+# Rules
-$(LIBGIMPPRINT_LIBS):
- cd ../main ; \
+$(top_builddir)/src/main/libgutenprint.la:
+ cd $(top_builddir)/src/main; \
$(MAKE)
+$(top_builddir)/src/gutenprintui/libgutenprintui.la:
+ cd $(top_builddir)/src/gutenprintui; \
+ $(MAKE)
+
+$(top_builddir)/src/gutenprintui2/libgutenprintui2.la:
+ cd $(top_builddir)/src/gutenprintui2; \
+ $(MAKE)
+
+testpatternl.o: testpatterny.o
+testpattern.o: testpatterny.o
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
diff --git a/src/testpattern/extended.sample b/src/testpattern/extended.sample
new file mode 100644
index 0000000..8e9d0be
--- /dev/null
+++ b/src/testpattern/extended.sample
@@ -0,0 +1,117 @@
+# 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-2200;
+mode extended 7;
+# Resolution, or print quality
+parameter Resolution 720sw;
+# Media source (if appropriate for your printer)
+#parameter InputSlot Standard;
+# Media type (what kind of paper)
+parameter MediaType Plain;
+# ink_type
+parameter InkType "CMYK";
+# Paper size
+parameter PageSize Letter;
+# Dither algorithm
+parameter DitherAlgorithm Adaptive;
+
+# 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.08;
+# Vertical size, as fraction of paper width (defaults to 1.0)
+vsize 0.08;
+# Left margin, as fraction of paper width (defaults to 0)
+left 0.0;
+# Top margin, as fraction of paper width (defaults to 0)
+top 0.0;
+
+# 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 2.0;
+# Additional gamma correction applied to cyan, magenta, yellow, and black inks
+gamma cyan 1.0;
+gamma l_cyan 1.0;
+gamma magenta 1.0;
+gamma l_magenta 1.0;
+gamma yellow 1.0;
+gamma d_yellow 1.0;
+gamma black 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.
+level cyan 1.0;
+level magenta 1.0;
+level yellow 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 1;
+
+# Number of steps in each ramp (default 256)
+steps 256;
+
+# 0) White band
+pattern 0.0 0.0 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 1.0 ;
+# 1) C sweep
+xpattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.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 1.0 ;
+# 2) M sweep
+xpattern 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 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+# 3) Y sweep
+xpattern 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 1.0 0.0 0.0 1.0 0.0 1.0 1.0;
+# 4) K sweep
+xpattern 0.0 1.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 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+# 5) c sweep
+xpattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+# 6) m sweep
+xpattern 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 1.0 0.0 1.0 1.0 0.0 0.0 1.0;
+# 7) k sweep
+xpattern 0.0 0.0 1.0 0.0 1.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 1.0 0.0 0.0 1.0;
+# 8) CM (blue) sweep
+xpattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+# 9) CY (green) sweep
+xpattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.5 1.0;
+# 10) MY (red) sweep
+xpattern 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.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0;
+# 11) cY (yellow-green) sweep
+xpattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.5 1.0;
+# 12) cY (light green) sweep
+xpattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.25 1.0;
+# 13) mY (orange) sweep
+xpattern 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 1.0 0.0 0.5 1.0 0.0 0.5 1.0;
+# 14) mY (light red) sweep
+xpattern 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 1.0 0.0 0.75 1.0 0.0 0.25 1.0;
+# 15) cm (light blue) sweep
+xpattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.0 1.0;
+# 16) CMY (gray) sweep
+xpattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.33 1.0 0.0 0.0 1.0 0.0 0.33 1.0 0.0 0.0 1.0 0.0 0.33 1.0;
+# 17) cmY sweep
+xpattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.33 1.0 0.0 0.0 1.0 0.0 0.33 1.0 0.0 0.33 1.0;
+# 18) cmY (light gray) sweep
+xpattern 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.43 1.0 0.0 0.0 1.0 0.0 0.43 1.0 0.0 0.14 1.0;
+# 19) CMYK sweep
+xpattern 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.25 1.0;
+# 20) cmYk sweep
+xpattern 0.0 0.0 1.0 0.0 0.29 1.0 0.0 0.0 1.0 0.0 0.29 1.0 0.0 0.0 1.0 0.0 0.29 1.0 0.0 0.14 1.0;
+# 21) cmYK sweep
+xpattern 0.0 0.125 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.375 1.0 0.0 0.0 1.0 0.0 0.375 1.0 0.0 0.125 1.0;
diff --git a/src/testpattern/printers.c b/src/testpattern/printers.c
new file mode 100644
index 0000000..d9c5286
--- /dev/null
+++ b/src/testpattern/printers.c
@@ -0,0 +1,44 @@
+/*
+ * "$Id: printers.c,v 1.6 2004/09/17 18:38:27 rleigh 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 <config.h>
+#endif
+#include <stdio.h>
+#include <gutenprint/gutenprint.h>
+#include <string.h>
+
+int
+main(int argc, char **argv)
+{
+ int i;
+
+ stp_init();
+ for (i = 0; i < stp_printer_model_count(); i++)
+ {
+ const stp_printer_t *p = stp_get_printer_by_index(i);
+ if (strcmp(stp_printer_get_family(p), "ps") &&
+ strcmp(stp_printer_get_family(p), "raw"))
+ printf("%s\n", stp_printer_get_driver(p));
+ }
+ return 0;
+}
diff --git a/src/testpattern/run-testpattern b/src/testpattern/run-testpattern
new file mode 100755
index 0000000..eea5754
--- /dev/null
+++ b/src/testpattern/run-testpattern
@@ -0,0 +1,169 @@
+#!/bin/sh
+
+retval=0;
+
+if [ -z "$STP_DATA_PATH" ] ; then
+ STP_DATA_PATH=`pwd`/../main
+ export STP_DATA_PATH
+fi
+
+if [ -z "$STP_MODULE_PATH" ] ; then
+ STP_MODULE_PATH=`pwd`/../main:`pwd`/../main/.libs
+ export STP_MODULE_PATH
+fi
+
+valgrind=0
+valopts=''
+extra=''
+dontrun=
+
+set_opt() {
+ opt=`echo $1 | awk -F= '{print $1}'`
+ val=`echo $1 | awk -F= '{print $2}'`
+ extra="`printf '%s\nparameter \"%s\" \"%s\";' \"$extra\" $opt $val`"
+}
+
+set_message() {
+ the_message="`printf '%s\nmessage \"%s\";' \"$the_message\" \"$@\"`"
+}
+
+usage() {
+ echo "Usage: run-testpattern [-v|--valgrind]"
+ echo " [-p|--parameter parameter=value]"
+ echo " [-n|--dontrun]"
+ echo " [--] [printers...]"
+ exit 0;
+}
+
+set_args() {
+ while true ; do
+ case "$1" in
+ -h*|--h*) usage ;;
+ -v|--valgrind) valopts='--tool=memcheck' ; valgrind=`expr $valgrind + 1` ;;
+ -c|--cachegrind) valopts='--tool=cachegrind'; valgrind=4 ;;
+ -g|--gdb-attach) valopts='--gdb-attach=yes' ;;
+ -p|--parameter) shift; set_opt "$1" ;;
+ -n|--dontrun) dontrun=1 ;;
+ --) shift; args="$@"; return ;;
+ *) return ;;
+ esac
+ shift
+ done
+}
+
+print_one_testpattern() {
+ printer=$1
+ shift
+ stuff="$@"
+ cat <<EOF
+printer "$printer";
+$stuff
+hsize 0.1;
+vsize 0.1;
+left 0.15;
+top 0.15;
+blackline 0;
+steps 16;
+mode rgb 8;
+pattern 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 ;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 -2.0 1.0 0.0 -2.0 1.0 0.0 -2.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.1 0.3 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.3 0.7 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.1 0.999 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.3 0.999 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.5 0.999 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.1 0.3 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.3 0.7 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.1 0.999 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.3 0.999 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.5 0.999 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.75 1.0 0.0 0.75 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.75 1.0 0.0 0.75 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.25 1.0 0.0 0.25 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.25 1.0 0.0 0.25 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.0 1.0 0.0 0.1 1.0 0.0 0.1 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.0 1.0 0.0 0.1 1.0 0.0 0.1 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.75 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.75 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.25 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.25 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.1 1.0 0.0 0.0 1.0 0.0 0.1 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.1 1.0 0.0 0.0 1.0 0.0 0.1 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.75 1.0 0.0 0.75 1.0 0.0 0.0 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.75 1.0 0.0 0.75 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.25 1.0 0.0 0.25 1.0 0.0 0.0 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.25 1.0 0.0 0.25 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.1 1.0 0.0 0.1 1.0 0.0 0.0 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.1 1.0 0.0 0.1 1.0 0.0 0.0 1.0;
+end;
+EOF
+}
+
+run_testpattern() {
+ case "$valgrind" in
+ 1) valgrind $valopts -q --num-callers=100 --leak-check=yes ./testpattern -n ;;
+ 2) valgrind $valopts --num-callers=100 --show-reachable=yes --leak-resolution=high --leak-check=yes ./testpattern -n ;;
+ 3) valgrind $valopts --error-limit=no --num-callers=100 --show-reachable=yes --leak-resolution=high --leak-check=yes ./testpattern -n ;;
+ 4) valgrind $valopts ./testpattern -n ;;
+ *) ./testpattern -n ;;
+ esac
+ if [ $? -ne 0 ] ; then
+ retval=1
+ fi
+}
+
+set_args `getopt hgvp:nc "$@"`
+
+if [ -z "$args" ] ; then
+ args=`./printers`
+fi
+
+#StandardDithers="EvenTone HybridEvenTone UniTone HybridUniTone Adaptive Ordered Fast VeryFast Floyd Predithered"
+
+StandardDithers="EvenTone HybridEvenTone Adaptive Ordered Fast VeryFast Floyd Predithered"
+
+the_message=''
+
+print_all_testpatterns() {
+ if [ -z "`echo $extra |grep DitherAlgorithm`" ] ; then
+ for p in $args ; do
+ set_message "$p
+"
+ for d in $StandardDithers ; do
+ set_message " $d"
+ print_one_testpattern "$p" "`printf '%s\n' \"parameter \\\"DitherAlgorithm\\\" \\\"$d\\\";\"`" "$extra" "$the_message"
+ the_message=''
+ done
+ done
+ else
+ for p in $args ; do
+ the_message=''
+ set_message "$p"
+ print_one_testpattern "$p" "$extra" "$the_message"
+ done
+ fi
+}
+
+if [ -z "$dontrun" ] ; then
+ print_all_testpatterns | run_testpattern
+else
+ print_all_testpatterns
+fi
+
+exit $?
diff --git a/src/testpattern/run-testpattern-1 b/src/testpattern/run-testpattern-1
new file mode 100755
index 0000000..ee3af8c
--- /dev/null
+++ b/src/testpattern/run-testpattern-1
@@ -0,0 +1,286 @@
+#!/bin/sh
+
+retval=0;
+
+if [ -z "$STP_DATA_PATH" ] ; then
+ STP_DATA_PATH=`pwd`/../main
+ export STP_DATA_PATH
+fi
+
+if [ -z "$STP_MODULE_PATH" ] ; then
+ STP_MODULE_PATH=`pwd`/../main:`pwd`/../main/.libs
+ export STP_MODULE_PATH
+fi
+
+valgrind=0
+valopts=''
+extra=''
+dontrun=
+
+set_opt() {
+ opt=`echo $1 | awk -F= '{print $1}'`
+ val=`echo $1 | awk -F= '{print $2}'`
+ extra="`printf '%s\nparameter \"%s\" \"%s\";' \"$extra\" $opt $val`"
+}
+
+set_message() {
+ the_message="`printf '%s\nmessage \"%s\";' \"$the_message\" \"$@\"`"
+}
+
+usage() {
+ echo "Usage: run-testpattern [-v|--valgrind]"
+ echo " [-p|--parameter parameter=value]"
+ echo " [-n|--dontrun]"
+ echo " [--] [printers...]"
+ exit 0;
+}
+
+print_command=cat
+
+set_args() {
+ while true ; do
+ case "$1" in
+ -h*|--h*) usage ;;
+ -v|--valgrind) valopts='--tool=memcheck' ; valgrind=`expr $valgrind + 1` ;;
+ -c|--cachegrind) valopts='--skin=cachegrind'; valgrind=4 ;;
+ -g|--gdb-attach) valopts='--gdb-attach=yes' ;;
+ -p|--parameter) shift; set_opt "$1" ;;
+ -n|--dontrun) dontrun=1 ;;
+ -o|--one) print_command=run_testpattern; dontrun=1 ;;
+ --) shift; args="$@"; return ;;
+ *) return ;;
+ esac
+ shift
+ done
+}
+
+print_one_testpattern() {
+ printer=$1
+ mode=$2
+ bits=$3
+ inktype=$4
+ correction=$5
+ printingmode=$6
+ shift
+ shift
+ shift
+ shift
+ shift
+ shift
+ stuff="$@"
+ cat <<EOF
+printer "$printer";
+$stuff
+parameter "InkType" "$inktype";
+parameter "ColorCorrection" "$correction";
+parameter "PrintingMode" "$printingmode";
+parameter "DitherAlgorithm" "VeryFast";
+hsize 0.1;
+vsize 0.1;
+left 0.15;
+top 0.15;
+blackline 0;
+steps 16;
+mode $mode $bits;
+pattern 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 ;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 -2.0 1.0 0.0 -2.0 1.0 0.0 -2.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.1 0.3 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.3 0.7 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.1 0.999 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.3 0.999 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.5 0.999 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.1 0.3 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.3 0.7 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.1 0.999 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.3 0.999 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.5 0.999 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.75 1.0 0.0 0.75 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.75 1.0 0.0 0.75 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.25 1.0 0.0 0.25 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.25 1.0 0.0 0.25 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.0 1.0 0.0 0.1 1.0 0.0 0.1 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.0 1.0 0.0 0.1 1.0 0.0 0.1 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.75 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.75 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.25 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.25 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.1 1.0 0.0 0.0 1.0 0.0 0.1 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.1 1.0 0.0 0.0 1.0 0.0 0.1 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.75 1.0 0.0 0.75 1.0 0.0 0.0 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.75 1.0 0.0 0.75 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.25 1.0 0.0 0.25 1.0 0.0 0.0 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.25 1.0 0.0 0.25 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.1 1.0 0.0 0.1 1.0 0.0 0.0 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.1 1.0 0.0 0.1 1.0 0.0 0.0 1.0;
+end;
+EOF
+}
+
+print_one_raw_testpattern() {
+ printer=$1
+ mode=$2
+ bits=$3
+ inktype=$4
+ correction=$5
+ printingmode=$6
+ shift
+ shift
+ shift
+ shift
+ shift
+ shift
+ stuff="$@"
+ cat <<EOF
+printer "$printer";
+$stuff
+parameter "InkType" "$inktype";
+parameter "ColorCorrection" "$correction";
+parameter "PrintingMode" "$printingmode";
+page_size 256 256;
+blackline 0;
+steps 256;
+mode $mode $bits;
+pattern 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 ;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 -2.0 1.0 0.0 -2.0 1.0 0.0 -2.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.1 0.3 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.3 0.7 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.1 0.999 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.3 0.999 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.5 0.999 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.1 0.3 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.3 0.7 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.1 0.999 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.3 0.999 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 0.5 0.999 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.75 1.0 0.0 0.75 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.75 1.0 0.0 0.75 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.25 1.0 0.0 0.25 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.25 1.0 0.0 0.25 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.0 1.0 0.0 0.1 1.0 0.0 0.1 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.0 1.0 0.0 0.1 1.0 0.0 0.1 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.75 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.75 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.25 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.25 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.1 1.0 0.0 0.0 1.0 0.0 0.1 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.1 1.0 0.0 0.0 1.0 0.0 0.1 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.75 1.0 0.0 0.75 1.0 0.0 0.0 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.75 1.0 0.0 0.75 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.25 1.0 0.0 0.25 1.0 0.0 0.0 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.25 1.0 0.0 0.25 1.0 0.0 0.0 1.0;
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.1 1.0 0.0 0.1 1.0 0.0 0.0 1.0;
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.1 1.0 0.0 0.1 1.0 0.0 0.0 1.0;
+end;
+EOF
+}
+
+run_testpattern() {
+ case "$valgrind" in
+ 1) valgrind $valopts -q --num-callers=100 --leak-check=yes ./testpattern -n ;;
+ 2) valgrind $valopts --num-callers=100 --show-reachable=yes --leak-resolution=high --leak-check=yes ./testpattern -n ;;
+ 3) valgrind $valopts --error-limit=no --num-callers=100 --show-reachable=yes --leak-resolution=high --leak-check=yes ./testpattern -n ;;
+ 4) valgrind $valopts ./testpattern -n ;;
+ 5) LD_PRELOAD=libefence.so.0.0 ./testpattern -n ;;
+ *) ./testpattern -n ;;
+ esac
+ if [ $? -ne 0 ] ; then
+ retval=1
+ fi
+}
+
+set_args `getopt hgvp:nco "$@"`
+
+if [ -z "$args" ] ; then
+ args=`./printers`
+fi
+
+StandardBitDepths="8 16"
+StandardModes="rgb kcmy cmyk cmy gray white"
+StandardColorCorrections="None Density Desaturated Accurate Bright Uncorrected Threshold Raw Predithered"
+StandardInkTypes="CMYKRB CMYK RGB"
+StandardPrintingModes="BW Color"
+
+RawBitDepths="8 16"
+RawTypes="raw-data-8 raw-data-16"
+RawModes="rgb kcmy cmyk cmy gray white"
+RawColorCorrections="None Density Desaturated Accurate Bright Uncorrected Threshold Raw Predithered"
+RawInkTypes="CMYK RGB CMY KCMY RGBGray CMYGray"
+RawPrintingModes="Color BW"
+
+the_message=''
+
+print_all_testpatterns() {
+ for a in $RawPrintingModes ; do
+ for b in $RawInkTypes ; do
+ for c in $RawColorCorrections ; do
+ for d in $RawModes ; do
+ for e in $RawBitDepths ; do
+ set_message "$a $b $c $d $e"
+ print_one_raw_testpattern "raw-data-8" $d $e $b $c $a "$extra" "$the_message" | $print_command
+ the_message=""
+ done
+ done
+ done
+ done
+ done
+ for a in $StandardPrintingModes ; do
+ for b in $StandardInkTypes ; do
+ for c in $StandardColorCorrections ; do
+ for d in $StandardModes ; do
+ for e in $StandardBitDepths ; do
+ set_message "$a $b $c $d $e"
+ print_one_testpattern "escp2-r800" $d $e $b $c $a "$extra" "$the_message" | $print_command
+ the_message=""
+ done
+ done
+ done
+ done
+ done
+ for a in $StandardColorCorrections ; do
+ for b in $StandardBitDepths ; do
+ set_message "Color extended 8 CMYKRB $a $b"
+ print_one_testpattern "escp2-r800" "extended 8" $b CMYKRB $a Color "$extra" "$the_message" | $print_command
+ the_message=""
+ done
+ done
+}
+
+if [ -z "$dontrun" ] ; then
+ (print_all_testpatterns | run_testpattern)
+else
+ (print_all_testpatterns)
+fi
+
+exit $?
diff --git a/src/testpattern/testpattern.c b/src/testpattern/testpattern.c
index d34821f..2ebb6df 100644
--- a/src/testpattern/testpattern.c
+++ b/src/testpattern/testpattern.c
@@ -1,5 +1,5 @@
/*
- * "$Id: testpattern.c,v 1.6.4.1 2002/07/23 00:54:08 rlk Exp $"
+ * "$Id: testpattern.c,v 1.42 2004/06/08 02:51:42 rlk Exp $"
*
* Test pattern generator for Gimp-Print
*
@@ -33,11 +33,6 @@
* black and white).
*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gimp-print/gimp-print.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
@@ -48,501 +43,818 @@
extern int yyparse(void);
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 void Image_conclude(stp_image_t *image);
+static void Image_init(stp_image_t *image);
static stp_image_status_t Image_get_row(stp_image_t *image,
- unsigned char *data, int row);
+ unsigned char *data,
+ size_t byte_limit, 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,
+ Image_conclude,
NULL
};
+stp_vars_t *global_vars;
+
+double global_levels[STP_CHANNEL_LIMIT];
+double global_gammas[STP_CHANNEL_LIMIT];
+double global_gamma;
+int global_steps;
+double global_ink_limit;
+int global_noblackline;
+int global_printer_width;
+int global_printer_height;
+int global_band_height;
+int global_n_testpatterns;
+char *global_printer = NULL;
+double global_density;
+double global_xtop;
+double global_xleft;
+double global_hsize;
+double global_vsize;
+const char *global_image_type;
+int global_bit_depth;
+int global_channel_depth;
+int global_invert_data = 0;
+int global_use_raw_cmyk;
+int global_did_something;
+int global_suppress_output = 0;
+
+static testpattern_t *static_testpatterns;
+
+static size_t
+c_strlen(const char *s)
+{
+ return strlen(s);
+}
-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;
+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);
+ memcpy(ret, s, n);
+ ret[n] = 0;
+ return ret;
+ }
+}
char *
c_strdup(const char *s)
{
- int l = strlen(s);
char *ret;
- if (s[0] == '"' && s[l - 1] == '"')
+ if (!s)
{
- ret = malloc(l - 1);
- strncpy(ret, s + 1, l - 2);
- ret[l - 2] = '\0';
+ ret = stp_malloc(1);
+ ret[0] = 0;
+ return ret;
}
else
+ return c_strndup(s, c_strlen(s));
+}
+
+static void
+clear_testpattern(testpattern_t *p)
+{
+ int i;
+ for (i = 0; i < STP_CHANNEL_LIMIT; i++)
{
- ret = malloc(strlen(s) + 1);
- strcpy(ret, s);
+ p->d.p.mins[i] = 0;
+ p->d.p.vals[i] = 0;
+ p->d.p.gammas[i] = 1;
+ p->d.p.levels[i] = 0;
}
- return ret;
}
+
testpattern_t *
get_next_testpattern(void)
{
static int internal_n_testpatterns = 0;
- if (n_testpatterns == 0)
+ if (global_n_testpatterns == -1)
{
- the_testpatterns = malloc(sizeof(testpattern_t));
- n_testpatterns = internal_n_testpatterns = 1;
- return &(the_testpatterns[0]);
+ static_testpatterns = stp_malloc(sizeof(testpattern_t));
+ global_n_testpatterns = 0;
+ internal_n_testpatterns = 1;
+ clear_testpattern(&(static_testpatterns[0]));
+ return &(static_testpatterns[0]);
}
- else if (n_testpatterns >= internal_n_testpatterns)
+ else if (global_n_testpatterns + 1 >= internal_n_testpatterns)
{
internal_n_testpatterns *= 2;
- the_testpatterns =
- realloc(the_testpatterns,
- internal_n_testpatterns * sizeof(testpattern_t));
+ static_testpatterns =
+ stp_realloc(static_testpatterns,
+ internal_n_testpatterns * sizeof(testpattern_t));
}
- return &(the_testpatterns[n_testpatterns++]);
+ global_n_testpatterns++;
+ clear_testpattern(&(static_testpatterns[global_n_testpatterns]));
+ return &(static_testpatterns[global_n_testpatterns]);
}
static void
-do_help(void)
+writefunc(void *file, const char *buf, size_t bytes)
{
- 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);
+ FILE *prn = (FILE *)file;
+ if (!global_suppress_output || (file == stderr))
+ {
+ fwrite(buf, 1, bytes, prn);
+ }
}
static void
-writefunc(void *file, const char *buf, size_t bytes)
+initialize_global_parameters(void)
{
- FILE *prn = (FILE *)file;
- fwrite(buf, 1, bytes, prn);
+ int i;
+ for (i = 0; i < STP_CHANNEL_LIMIT; i++)
+ {
+ global_levels[i] = 1.0;
+ global_gammas[i] = 1.0;
+ }
+ global_gamma = 1.0;
+ global_steps = 256;
+ global_ink_limit = 1.0;
+ global_noblackline = 0;
+ global_printer_width = 0;
+ global_printer_height = 0;
+ global_band_height = 0;
+ global_n_testpatterns = -1;
+ if (global_printer)
+ free(global_printer); /* Allocated with strdup() */
+ global_printer = NULL;
+ global_density = 1.0;
+ global_xtop = 0;
+ global_xleft = 0;
+ global_hsize = 1.0;
+ global_vsize = 1.0;
+ global_bit_depth = 16;
+ global_channel_depth = 0;
+ global_image_type = "CMYK";
+ global_use_raw_cmyk = 0;
+ global_did_something = 0;
+ global_invert_data = 0;
+ if (static_testpatterns)
+ stp_free(static_testpatterns);
+ static_testpatterns = NULL;
+ if (global_vars)
+ stp_vars_destroy(global_vars);
+ global_vars = NULL;
+ if (global_printer)
+ free(global_printer); /* Allocated with strdup() */
+ global_printer = NULL;
}
-int
-main(int argc, char **argv)
+static int
+do_print(void)
{
- int c;
- stp_vars_t v;
- stp_printer_t the_printer;
- stp_papersize_t pt;
+ stp_vars_t *v;
+ const stp_printer_t *the_printer;
int left, right, top, bottom;
- const stp_printfuncs_t *printfuncs;
- int x, y, owidth;
+ int x, y;
int width, height;
+ int retval;
+ stp_parameter_list_t params;
+ int count;
+ int i;
+ char tmp[32];
- int retval = yyparse();
+ initialize_global_parameters();
+ global_vars = stp_vars_create();
+ stp_set_outfunc(global_vars, writefunc);
+ stp_set_errfunc(global_vars, writefunc);
+ stp_set_outdata(global_vars, stdout);
+ stp_set_errdata(global_vars, stderr);
+
+ retval = yyparse();
if (retval)
- return retval;
+ return retval + 1;
- 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 (!global_did_something)
+ return 1;
+
+ v = stp_vars_create();
+ the_printer = stp_get_printer_by_driver(global_printer);
if (!the_printer)
{
- the_printer = stp_get_printer_by_long_name(printer);
- if (!the_printer)
+ int j;
+ fprintf(stderr, "Unknown printer %s\nValid printers are:\n",
+ global_printer);
+ for (j = 0; j < stp_printer_model_count(); j++)
{
- 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;
+ the_printer = stp_get_printer_by_index(j);
+ fprintf(stderr, "%-16s%s\n", stp_printer_get_driver(the_printer),
+ stp_printer_get_long_name(the_printer));
}
+ return 2;
}
- stp_set_printer_defaults(v, the_printer, NULL);
+ stp_set_printer_defaults(v, the_printer);
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)
+ stp_set_string_parameter(v, "InputImageType", global_image_type);
+ sprintf(tmp, "%d", global_bit_depth);
+ stp_set_string_parameter(v, "ChannelBitDepth", tmp);
+ sprintf(tmp, "%d", global_channel_depth);
+ stp_set_string_parameter(v, "RawChannels", tmp);
+ stp_set_float_parameter(v, "Density", global_density);
+ stp_set_string_parameter(v, "Quality", "None");
+ stp_set_string_parameter(v, "ImageType", "None");
+
+ params = stp_get_parameter_list(v);
+ count = stp_parameter_list_count(params);
+ for (i = 0; i < count; i++)
{
- fprintf(stderr, "Papersize %s unknown\n", media_size);
- return 1;
+ const stp_parameter_t *p = stp_parameter_list_param(params, i);
+ const char *val = stp_get_string_parameter(global_vars, p->name);
+ if (p->p_type == STP_PARAMETER_TYPE_STRING_LIST && val && strlen(val) > 0)
+ stp_set_string_parameter(v, p->name, val);
+ stp_set_page_width(v, stp_get_page_width(global_vars));
+ stp_set_page_height(v, stp_get_page_height(global_vars));
}
+ stp_parameter_list_destroy(params);
- (printfuncs->imageable_area)(the_printer, v, &left, &right, &bottom, &top);
- (printfuncs->describe_resolution)(the_printer, stp_get_resolution(v),&x, &y);
+ stp_get_imageable_area(v, &left, &right, &bottom, &top);
+ stp_describe_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)
+ height = bottom - top;
+ top += height * global_xtop;
+ left += width * global_xleft;
+ if (global_steps > width)
+ global_steps = width;
+
+#if 0
+ width = (width / global_steps) * global_steps;
+ height = (height / global_n_testpatterns) * global_n_testpatterns;
+#endif
+ stp_set_width(v, width * global_hsize);
+ stp_set_height(v, height * global_vsize);
+
+ global_printer_width = width * x / 72;
+ global_printer_height = height * y / 72;
+
+ global_band_height = global_printer_height / global_n_testpatterns;
+ stp_set_left(v, left);
+ stp_set_top(v, top);
+
+ stp_merge_printvars(v, stp_printer_get_defaults(the_printer));
+ if (stp_print(v, &theImage) != 1)
+ return 2;
+ stp_vars_destroy(v);
+ stp_free(static_testpatterns);
+ static_testpatterns = NULL;
+ return 0;
+}
+
+int
+main(int argc, char **argv)
+{
+ int c;
+ int status;
+ while (1)
{
- stp_set_scaling(v, 100 * hsize);
- printer_width = width * x / 72;
- printer_height = vsize / hsize * height * y / 72;
+ c = getopt(argc, argv, "n");
+ if (c == -1)
+ break;
+ switch (c)
+ {
+ case 'n':
+ global_suppress_output = 1;
+ default:
+ break;
+ }
}
- else
+
+ stp_init();
+ while (1)
{
- stp_set_scaling(v, 100 * vsize);
- printer_width = hsize / vsize * width * x / 72;
- printer_height = height * y / 72;
+ status = do_print();
+ if (status != 0)
+ break;
}
+ return status - 1;
+}
- 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);
+static void
+invert_data(unsigned char *data, size_t byte_depth)
+{
+ int i;
+ size_t total_bytes;
+ total_bytes = global_printer_width * global_channel_depth * byte_depth;
+ for (i = 0; i < total_bytes; i++)
+ data[i] = 0xff ^ data[i];
+}
- 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;
+/*
+ * Emulate templates with macros -- rlk 20031014
+ */
+
+#define FILL_BLACK_FUNCTION(T, bits) \
+static void \
+fill_black_##bits(unsigned char *data, size_t len, size_t scount) \
+{ \
+ int i; \
+ T *s_data = (T *) data; \
+ unsigned black_val = global_ink_limit * ((1 << bits) - 1); \
+ if (strcmp(global_image_type, "Raw") == 0) \
+ { \
+ for (i = 0; i < (len / scount) * scount; i++) \
+ { \
+ memset(s_data, 0, sizeof(T) * global_channel_depth); \
+ s_data[0] = black_val; \
+ if (global_channel_depth == 3) \
+ { \
+ s_data[1] = black_val; \
+ s_data[2] = black_val; \
+ } \
+ else if (global_channel_depth == 5) \
+ { \
+ s_data[2] = black_val; \
+ s_data[4] = black_val; \
+ } \
+ s_data += global_channel_depth; \
+ } \
+ } \
+ else if (strcmp(global_image_type, "CMYK") == 0) \
+ { \
+ for (i = 0; i < (len / scount) * scount; i++) \
+ { \
+ memset(s_data, 0, sizeof(T) * 4); \
+ s_data[3] = black_val; \
+ s_data += 4; \
+ } \
+ } \
+ else if (strcmp(global_image_type, "KCMY") == 0) \
+ { \
+ for (i = 0; i < (len / scount) * scount; i++) \
+ { \
+ memset(s_data, 0, sizeof(T) * 4); \
+ s_data[0] = black_val; \
+ s_data += 4; \
+ } \
+ } \
+ else if (strcmp(global_image_type, "Grayscale") == 0) \
+ { \
+ for (i = 0; i < (len / scount) * scount; i++) \
+ { \
+ memset(s_data, 0, sizeof(T) * 1); \
+ s_data[0] = black_val; \
+ s_data += 1; \
+ } \
+ } \
}
+FILL_BLACK_FUNCTION(unsigned short, 16)
+FILL_BLACK_FUNCTION(unsigned char, 8)
+
static void
-fill_black(unsigned short *data, size_t len, size_t scount)
+fill_black(unsigned char *data, size_t len, size_t scount, size_t bytes)
{
- int i;
- for (i = 0; i < (len / scount) * scount; i++)
+ switch (bytes)
{
- data[3] = ink_limit * 65535;
- data += 4;
+ case 1:
+ fill_black_8(data, len, scount);
+ break;
+ case 2:
+ fill_black_16(data, len, scount);
+ break;
}
+ if (global_invert_data)
+ invert_data(data, bytes);
}
+#define FILL_WHITE_FUNCTION(T, bits) \
+static void \
+fill_white_##bits(unsigned char *data, size_t len, size_t scount) \
+{ \
+ T *s_data = (T *) data; \
+ memset(s_data, 0, sizeof(T) * global_channel_depth * \
+ ((len / scount) * scount)); \
+}
+
+FILL_WHITE_FUNCTION(unsigned short, 16)
+FILL_WHITE_FUNCTION(unsigned char, 8)
+
static void
-fill_colors(unsigned short *data, size_t len, size_t scount, testpattern_t *p)
+fill_white(unsigned char *data, size_t len, size_t scount, size_t bytes)
{
- double c_min = p->d.p.c_min == -2 ? global_c_level : p->d.p.c_min;
- double m_min = p->d.p.m_min == -2 ? global_m_level : p->d.p.m_min;
- double y_min = p->d.p.y_min == -2 ? global_y_level : p->d.p.y_min;
- double k_min = p->d.p.k_min;
- double c = p->d.p.c == -2 ? global_c_level : p->d.p.c;
- double m = p->d.p.m == -2 ? global_m_level : p->d.p.m;
- double y = p->d.p.y == -2 ? global_y_level : p->d.p.y;
- double c_gamma = p->d.p.c_gamma * global_gamma * global_c_gamma;
- double m_gamma = p->d.p.m_gamma * global_gamma * global_m_gamma;
- double y_gamma = p->d.p.y_gamma * global_gamma * global_y_gamma;
- double k_gamma = p->d.p.k_gamma * global_gamma * global_k_gamma;
- double k = p->d.p.k;
- double c_level = p->d.p.c_level == -2 ? global_c_level : p->d.p.c_level;
- double m_level = p->d.p.m_level == -2 ? global_m_level : p->d.p.m_level;
- double y_level = p->d.p.y_level == -2 ? global_y_level : p->d.p.y_level;
- double lower = p->d.p.lower;
- double upper = p->d.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++)
+ switch (bytes)
+ {
+ case 1:
+ fill_white_8(data, len, scount);
+ break;
+ case 2:
+ fill_white_16(data, len, scount);
+ break;
+ }
+ if (global_invert_data)
+ invert_data(data, bytes);
+}
+
+#define FILL_GRID_FUNCTION(T, bits) \
+static void \
+fill_grid_##bits(unsigned char *data, size_t len, size_t scount, \
+ testpattern_t *p) \
+{ \
+ int i; \
+ int xlen = (len / scount) * scount; \
+ int errdiv = (p->d.g.ticks) / (xlen - 1); \
+ int errmod = (p->d.g.ticks) % (xlen - 1); \
+ int errval = 0; \
+ int errlast = -1; \
+ int errline = 0; \
+ T *s_data = (T *) data; \
+ unsigned multiplier = (1 << bits) - 1; \
+ \
+ for (i = 0; i < xlen; i++) \
+ { \
+ if (errline != errlast) \
+ { \
+ errlast = errline; \
+ s_data[0] = multiplier; \
+ } \
+ errval += errmod; \
+ errline += errdiv; \
+ if (errval >= xlen - 1) \
+ { \
+ errval -= xlen - 1; \
+ errline++; \
+ } \
+ s_data += global_channel_depth; \
+ } \
+}
+
+FILL_GRID_FUNCTION(unsigned short, 16)
+FILL_GRID_FUNCTION(unsigned char, 8)
+
+static void
+fill_grid(unsigned char *data, size_t len, size_t scount,
+ testpattern_t *p, size_t bytes)
+{
+ switch (bytes)
+ {
+ case 1:
+ fill_grid_8(data, len, scount, p);
+ break;
+ case 2:
+ fill_grid_16(data, len, scount, p);
+ break;
+ }
+}
+
+#define FILL_COLORS_EXTENDED_FUNCTION(T, bits) \
+static void \
+fill_colors_extended_##bits(unsigned char *data, size_t len, \
+ size_t scount, testpattern_t *p) \
+{ \
+ double mins[STP_CHANNEL_LIMIT]; \
+ double vals[STP_CHANNEL_LIMIT]; \
+ double gammas[STP_CHANNEL_LIMIT]; \
+ int i; \
+ int j; \
+ int k; \
+ int pixels; \
+ int channel_limit = global_channel_depth <= 7 ? 7 : global_channel_depth; \
+ T *s_data = (T *) data; \
+ unsigned multiplier = (1 << bits) - 1; \
+ \
+ for (j = 0; j < channel_limit; j++) \
+ { \
+ mins[j] = p->d.p.mins[j] == -2 ? global_levels[j] : p->d.p.mins[j]; \
+ vals[j] = p->d.p.vals[j] == -2 ? global_levels[j] : p->d.p.vals[j]; \
+ gammas[j] = p->d.p.gammas[j] * global_gamma * global_gammas[j]; \
+ vals[j] -= mins[j]; \
+ } \
+ if (scount > len) \
+ scount = len; \
+ pixels = len / scount; \
+ for (i = 0; i < scount; i++) \
+ { \
+ double where = (double) i / ((double) scount - 1); \
+ double val = where; \
+ double xvals[STP_CHANNEL_LIMIT]; \
+ \
+ for (j = 0; j < channel_limit; j++) \
+ { \
+ xvals[j] = mins[j] + val * vals[j]; \
+ xvals[j] = pow(xvals[j], gammas[j]); \
+ xvals[j] *= global_ink_limit * multiplier; \
+ } \
+ for (k = 0; k < pixels; k++) \
+ { \
+ switch (global_channel_depth) \
+ { \
+ case 1: \
+ s_data[0] = xvals[0]; \
+ break; \
+ case 2: \
+ s_data[0] = xvals[0]; \
+ s_data[1] = xvals[4]; \
+ break; \
+ case 3: \
+ s_data[0] = xvals[1]; \
+ s_data[1] = xvals[2]; \
+ s_data[2] = xvals[3]; \
+ break; \
+ case 4: \
+ s_data[0] = xvals[0]; \
+ s_data[1] = xvals[1]; \
+ s_data[2] = xvals[2]; \
+ s_data[3] = xvals[3]; \
+ break; \
+ case 5: \
+ s_data[0] = xvals[1]; \
+ s_data[1] = xvals[5]; \
+ s_data[2] = xvals[2]; \
+ s_data[3] = xvals[6]; \
+ s_data[4] = xvals[3]; \
+ break; \
+ case 6: \
+ s_data[0] = xvals[0]; \
+ s_data[1] = xvals[1]; \
+ s_data[2] = xvals[5]; \
+ s_data[3] = xvals[2]; \
+ s_data[4] = xvals[6]; \
+ s_data[5] = xvals[3]; \
+ break; \
+ case 7: \
+ s_data[0] = xvals[0]; \
+ s_data[1] = xvals[4]; \
+ s_data[2] = xvals[1]; \
+ s_data[3] = xvals[5]; \
+ s_data[4] = xvals[2]; \
+ s_data[5] = xvals[6]; \
+ s_data[6] = xvals[3]; \
+ break; \
+ default: \
+ for (j = 0; j < global_channel_depth; j++) \
+ s_data[j] = xvals[j]; \
+ } \
+ s_data += global_channel_depth; \
+ } \
+ } \
+}
+
+FILL_COLORS_EXTENDED_FUNCTION(unsigned short, 16)
+FILL_COLORS_EXTENDED_FUNCTION(unsigned char, 8)
+
+static void
+fill_colors_extended(unsigned char *data, size_t len, size_t scount,
+ testpattern_t *p, size_t bytes)
+{
+ switch (bytes)
{
- 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++)
+ case 1:
+ fill_colors_extended_8(data, len, scount, p);
+ break;
+ case 2:
+ fill_colors_extended_16(data, len, scount, p);
+ break;
+ }
+}
+
+#define FILL_COLORS_FUNCTION(T, bits) \
+static void \
+fill_colors_##bits(unsigned char *data, size_t len, size_t scount, \
+ testpattern_t *p) \
+{ \
+ double mins[4]; \
+ double vals[4]; \
+ double gammas[4]; \
+ double levels[4]; \
+ double lower = p->d.p.lower; \
+ double upper = p->d.p.upper; \
+ int i; \
+ int j; \
+ int pixels; \
+ T *s_data = (T *) data; \
+ unsigned multiplier = (1 << bits) - 1; \
+ \
+ vals[0] = p->d.p.vals[0]; \
+ mins[0] = p->d.p.mins[0]; \
+ \
+ for (j = 1; j < 4; j++) \
+ { \
+ vals[j] = p->d.p.vals[j] == -2 ? global_levels[j] : p->d.p.vals[j]; \
+ mins[j] = p->d.p.mins[j] == -2 ? global_levels[j] : p->d.p.mins[j]; \
+ levels[j] = p->d.p.levels[j] == \
+ -2 ? global_levels[j] : p->d.p.levels[j]; \
+ } \
+ for (j = 0; j < 4; j++) \
+ { \
+ gammas[j] = p->d.p.gammas[j] * global_gamma * global_gammas[j]; \
+ vals[j] -= mins[j]; \
+ } \
+ \
+ if (scount > len) \
+ scount = len; \
+ pixels = len / scount; \
+ for (i = 0; i < scount; i++) \
+ { \
+ int k; \
+ double where = (double) i / ((double) scount - 1); \
+ double cmyv; \
+ double kv; \
+ double val = where; \
+ double xvals[4]; \
+ for (j = 0; j < 4; j++) \
+ { \
+ if (j > 0) \
+ xvals[j] = mins[j] + val * vals[j]; \
+ else \
+ xvals[j] = mins[j] + vals[j]; \
+ xvals[j] = pow(xvals[j], gammas[j]); \
+ } \
+ \
+ if (where <= lower) \
+ kv = 0; \
+ else if (where > upper) \
+ kv = where; \
+ else \
+ kv = (where - lower) * upper / (upper - lower); \
+ cmyv = vals[0] * (where - kv); \
+ xvals[0] *= kv; \
+ for (j = 1; j < 4; j++) \
+ xvals[j] += cmyv * levels[j]; \
+ for (j = 0; j < 4; j++) \
+ { \
+ if (xvals[j] > 1) \
+ xvals[j] = 1; \
+ xvals[j] *= global_ink_limit * multiplier; \
+ } \
+ for (k = 0; k < pixels; k++) \
+ { \
+ switch (global_channel_depth) \
+ { \
+ case 0: \
+ for (j = 0; j < 4; j++) \
+ s_data[j] = xvals[(j + 1) % 4]; \
+ s_data += 4; \
+ break; \
+ case 1: \
+ s_data[0] = xvals[0]; \
+ break; \
+ case 2: \
+ s_data[0] = xvals[0]; \
+ s_data[1] = 0; \
+ break; \
+ case 3: \
+ for (j = 1; j < 4; j++) \
+ s_data[j - 1] = xvals[j]; \
+ break; \
+ case 4: \
+ for (j = 0; j < 4; j++) \
+ s_data[j] = xvals[j]; \
+ break; \
+ case 6: \
+ s_data[0] = xvals[0]; \
+ s_data[1] = xvals[1]; \
+ s_data[2] = 0; \
+ s_data[3] = xvals[2]; \
+ s_data[4] = 0; \
+ s_data[5] = xvals[3]; \
+ break; \
+ case 7: \
+ for (j = 0; j < 4; j++) \
+ s_data[j * 2] = xvals[j]; \
+ for (j = 1; j < 6; j += 2) \
+ s_data[j] = 0; \
+ break; \
+ } \
+ s_data += global_channel_depth; \
+ } \
+ } \
+}
+
+FILL_COLORS_FUNCTION(unsigned short, 16)
+FILL_COLORS_FUNCTION(unsigned char, 8)
+
+static void
+fill_colors(unsigned char *data, size_t len, size_t scount,
+ testpattern_t *p, size_t bytes)
+{
+ if (strcmp(global_image_type, "RGB") == 0)
+ fill_colors_extended(data, len, scount, p, bytes);
+ else
+ {
+ switch (bytes)
{
- data[0] = cc;
- data[1] = mm;
- data[2] = yy;
- data[3] = kk;
- data += 4;
+ case 1:
+ fill_colors_8(data, len, scount, p);
+ break;
+ case 2:
+ fill_colors_16(data, len, scount, p);
+ break;
}
}
}
extern FILE *yyin;
+static void
+fill_pattern(testpattern_t *p, unsigned char *data, size_t width,
+ size_t s_count, size_t image_depth, size_t byte_depth)
+{
+ memset(data, 0, global_printer_width * image_depth * byte_depth);
+ switch (p->t)
+ {
+ case E_PATTERN:
+ fill_colors(data, width, s_count, p, byte_depth);
+ break;
+ case E_XPATTERN:
+ fill_colors_extended(data, width, s_count, p, byte_depth);
+ break;
+ case E_GRID:
+ fill_grid(data, width, s_count, p, byte_depth);
+ break;
+ default:
+ break;
+ }
+}
+
+
static stp_image_status_t
-Image_get_row(stp_image_t *image, unsigned char *data, int row)
+Image_get_row(stp_image_t *image, unsigned char *data,
+ size_t byte_limit, int row)
{
- if (the_testpatterns[0].t == E_IMAGE)
+ int depth = global_channel_depth;
+ if (static_testpatterns[0].t == E_IMAGE)
{
- testpattern_t *t = &(the_testpatterns[0]);
- int total_read = fread(data, 1, t->d.i.x * 8, yyin);
- if (total_read != t->d.i.x * 8)
+ testpattern_t *t = &(static_testpatterns[0]);
+ int total_read = fread(data, 1, t->d.i.x * depth * global_bit_depth / 8,
+ yyin);
+ if (total_read != t->d.i.x * depth * global_bit_depth / 8)
{
fprintf(stderr, "Read failed!\n");
- return STP_IMAGE_ABORT;
+ return STP_IMAGE_STATUS_ABORT;
}
+ fprintf(stderr, ".");
}
else
{
static int previous_band = -1;
- int band = row / bandheight;
- if (previous_band == -2)
+ int band = row / global_band_height;
+ if (previous_band == -1)
{
- memset(data, 0, printer_width * 4 * sizeof(unsigned short));
- fill_colors((unsigned short *)data, printer_width, levels,
- &(the_testpatterns[band]));
+ fill_pattern(&(static_testpatterns[band]), data,
+ global_printer_width, global_steps, depth,
+ global_bit_depth / 8);
previous_band = band;
+ fprintf(stderr, ".");
}
- else if (row == printer_height - 1)
+ else if (row == global_printer_height - 1)
+ fill_black(data, global_printer_width, global_steps,
+ global_bit_depth / 8);
+ else if (band >= global_n_testpatterns)
+ fill_white(data, global_printer_width, global_steps,
+ global_bit_depth / 8);
+ else if (band != previous_band && band >= 0)
{
- 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;
- }
+ fill_pattern(&(static_testpatterns[band]), data,
+ global_printer_width, global_steps, depth,
+ global_bit_depth / 8);
+ previous_band = band;
+ fprintf(stderr, ".");
}
}
- return STP_IMAGE_OK;
-}
-
-static int
-Image_bpp(stp_image_t *image)
-{
- return 8;
+ return STP_IMAGE_STATUS_OK;
}
static int
Image_width(stp_image_t *image)
{
- if (the_testpatterns[0].t == E_IMAGE)
- return the_testpatterns[0].d.i.x;
+ if (static_testpatterns[0].t == E_IMAGE)
+ return static_testpatterns[0].d.i.x;
else
- return printer_width;
+ return global_printer_width;
}
static int
Image_height(stp_image_t *image)
{
- if (the_testpatterns[0].t == E_IMAGE)
- return the_testpatterns[0].d.i.y;
+ if (static_testpatterns[0].t == E_IMAGE)
+ return static_testpatterns[0].d.i.y;
else
- return printer_height;
+ return global_printer_height;
}
static void
@@ -552,20 +864,7 @@ Image_init(stp_image_t *image)
}
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)
+Image_conclude(stp_image_t *image)
{
fprintf(stderr, "\n");
}
diff --git a/src/testpattern/testpattern.h b/src/testpattern/testpattern.h
index 679e4f4..8b288a2 100644
--- a/src/testpattern/testpattern.h
+++ b/src/testpattern/testpattern.h
@@ -1,5 +1,5 @@
/*
- * "$Id: testpattern.h,v 1.2.6.1 2002/07/23 00:54:08 rlk Exp $"
+ * "$Id: testpattern.h,v 1.15 2004/09/17 18:38:27 rleigh Exp $"
*
* Test pattern generator for Gimp-Print
*
@@ -20,33 +20,33 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gutenprint/gutenprint.h>
+
typedef struct
{
enum {
E_PATTERN,
- E_IMAGE
+ E_XPATTERN,
+ E_IMAGE,
+ E_GRID
} t;
union {
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 mins[32];
+ double vals[32];
+ double gammas[32];
+ double levels[32];
double lower;
double upper;
} p;
struct {
+ int ticks;
+ } g;
+ struct {
int x;
int y;
int bits;
@@ -61,29 +61,27 @@ typedef struct
*/
#define YY_ALWAYS_INTERACTIVE 1
-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 stp_vars_t *global_vars;
+extern double global_levels[];
+extern double global_gammas[];
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 int global_steps;
+extern double global_ink_limit;
+extern char *global_printer;
+extern double global_density;
+extern double global_xtop;
+extern double global_xleft;
+extern double global_hsize;
+extern double global_vsize;
+extern int global_noblackline;
+extern const char *global_image_type;
+extern int global_color_model;
+extern int global_bit_depth;
+extern int global_channel_depth;
+extern int global_did_something;
+extern int global_invert_data;
+
+
extern char *c_strdup(const char *s);
extern testpattern_t *get_next_testpattern(void);
@@ -93,7 +91,7 @@ typedef union yylv {
char *sval;
} YYSTYPE;
-extern YYSTYPE yylval;
+#define YYSTYPE_IS_DECLARED 1
#include "testpatterny.h"
diff --git a/src/testpattern/testpattern.sample b/src/testpattern/testpattern.sample
index 6897962..8ddeaac 100644
--- a/src/testpattern/testpattern.sample
+++ b/src/testpattern/testpattern.sample
@@ -3,32 +3,35 @@
# Printer/driver settings. Please see src/ghost/README for appropriate
# values for each of these settings
# Printer model
-printer escp2-870
+printer escp2-870;
# Resolution, or print quality
-resolution 360sw
+parameter Resolution 720sw;
# Media source (if appropriate for your printer)
-media_source Standard
+parameter InputSlot Standard;
# Media type (what kind of paper)
-media_type Photo
+parameter MediaType Photo;
# ink_type
-ink_type PhotoCMYK
+parameter InkType PhotoCMYK;
# Paper size
-media_size Letter
+parameter PageSize Letter;
# Dither algorithm
-dither_algorithm Ordered
+#parameter DitherAlgorithm Ordered;
+parameter DitherAlgorithm UniTone;
+
+mode RGB 8;
# 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
+hsize 0.33;
# Vertical size, as fraction of paper width (defaults to 1.0)
-vsize 0.33
+vsize 0.33;
# Left margin, as fraction of paper width (defaults to 0)
-left 0.66
+left 0.66;
# Top margin, as fraction of paper width (defaults to 0)
-top 0.66
+top 0.66;
# Output settings
# These settings are used as the base values for all ramps. These settings
@@ -36,133 +39,133 @@ top 0.66
# to compute the effective gamma and conversion values. All of these
# default to 1.0.
# Gamma value applied to all inks
-gamma 1.0
+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
+gamma cyan 1.0;
+gamma magenta 1.0;
+gamma yellow 1.0;
+gamma black 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
+level cyan 1.0;
+level magenta 1.0;
+level yellow 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
+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
+density 1.0;
# Do we want a thin black line between each band? (default yes)
-blackline 0
+blackline 0;
-# Number of levels in each ramp (default 256)
-levels 16
+# Number of steps in each ramp (default 256)
+steps 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
+# BLACK RAMP BLACK BLACK CYAN MAGENTA YELLOW
+# ENDPOINTS CONVERSION
+# Lower Cyan Min Min Min Min
+# Upper Magenta Max Max Max Max
+# Yellow Gamma Gamma Gamma Gamma
# 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
+pattern 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0 0.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
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 -2.0 1.0 0.0 -2.0 1.0 0.0 -2.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.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
+pattern 1.0 1.0 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.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
+pattern 0.1 0.3 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
# 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
+pattern 0.3 0.7 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
# 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
+pattern 0.1 0.999 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
# 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
+pattern 0.3 0.999 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
# 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
+pattern 0.5 0.999 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
# 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
+pattern 0.1 0.3 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
# 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
+pattern 0.3 0.7 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
# 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
+pattern 0.1 0.999 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
# 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
+pattern 0.3 0.999 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
# 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
+pattern 0.5 0.999 -2.0 -2.0 -2.0 0.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0;
# 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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.75 1.0 0.0 0.75 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
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.75 1.0 0.0 0.75 1.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.5 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
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.5 1.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.25 1.0 0.0 0.25 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
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.25 1.0 0.0 0.25 1.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.0 1.0 0.0 0.1 1.0 0.0 0.1 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
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.0 1.0 0.0 0.1 1.0 0.0 0.1 1.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 0.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.75 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
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.75 1.0 0.0 0.0 1.0 0.0 0.75 1.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 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
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 1.0 0.0 0.5 1.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.25 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
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.25 1.0 0.0 0.0 1.0 0.0 0.25 1.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.1 1.0 0.0 0.0 1.0 0.0 0.1 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
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.1 1.0 0.0 0.0 1.0 0.0 0.1 1.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0 0.0 0.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.75 1.0 0.0 0.75 1.0 0.0 0.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
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.25 1.0 0.0 0.75 1.0 0.0 0.75 1.0 0.0 0.0 1.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.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
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 1.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.25 1.0 0.0 0.25 1.0 0.0 0.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
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.75 1.0 0.0 0.25 1.0 0.0 0.25 1.0 0.0 0.0 1.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
+pattern 1.0 1.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.1 1.0 0.0 0.1 1.0 0.0 0.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
+pattern 0.0 0.0 1.0 1.0 1.0 0.0 0.9 1.0 0.0 0.1 1.0 0.0 0.1 1.0 0.0 0.0 1.0;
diff --git a/src/testpattern/testpatternl.c b/src/testpattern/testpatternl.c
index c4abf5a..6ad6563 100644
--- a/src/testpattern/testpatternl.c
+++ b/src/testpattern/testpatternl.c
@@ -1,32 +1,85 @@
-/* A lexical scanner generated by flex */
-/* Scanner skeleton version:
- * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $
- */
+#line 3 "testpatternl.c"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 31
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+/* end standard C headers. */
-/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
-#ifdef c_plusplus
-#ifndef __cplusplus
-#define __cplusplus
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
#endif
+#endif /* ! FLEXINT_H */
#ifdef __cplusplus
-#include <stdlib.h>
-#include <unistd.h>
-
-/* Use prototypes in function declarations. */
-#define YY_USE_PROTOS
-
/* The "const" storage-class-modifier is valid. */
#define YY_USE_CONST
@@ -34,34 +87,17 @@
#if __STDC__
-#define YY_USE_PROTOS
#define YY_USE_CONST
#endif /* __STDC__ */
#endif /* ! __cplusplus */
-#ifdef __TURBOC__
- #pragma warn -rch
- #pragma warn -use
-#include <io.h>
-#include <stdlib.h>
-#define YY_USE_CONST
-#define YY_USE_PROTOS
-#endif
-
#ifdef YY_USE_CONST
#define yyconst const
#else
#define yyconst
#endif
-
-#ifdef YY_USE_PROTOS
-#define YY_PROTO(proto) proto
-#else
-#define YY_PROTO(proto) ()
-#endif
-
/* Returned upon end-of-file. */
#define YY_NULL 0
@@ -76,71 +112,71 @@
* but we do it the disgusting crufty way forced on us by the ()-less
* definition of BEGIN.
*/
-#define BEGIN yy_start = 1 + 2 *
+#define BEGIN (yy_start) = 1 + 2 *
/* Translate the current start state into a value that can be later handed
* to BEGIN to return to the state. The YYSTATE alias is for lex
* compatibility.
*/
-#define YY_START ((yy_start - 1) / 2)
+#define YY_START (((yy_start) - 1) / 2)
#define YYSTATE YY_START
/* Action number for EOF rule of a given start state. */
#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
/* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE yyrestart( yyin )
+#define YY_NEW_FILE yyrestart(yyin )
#define YY_END_OF_BUFFER_CHAR 0
/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
#define YY_BUF_SIZE 16384
+#endif
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
extern int yyleng;
+
extern FILE *yyin, *yyout;
#define EOB_ACT_CONTINUE_SCAN 0
#define EOB_ACT_END_OF_FILE 1
#define EOB_ACT_LAST_MATCH 2
-/* The funky do-while in the following #define is used to turn the definition
- * int a single C statement (which needs a semi-colon terminator). This
- * avoids problems with code like:
- *
- * if ( condition_holds )
- * yyless( 5 );
- * else
- * do_something_else();
- *
- * Prior to using the do-while the compiler would get upset at the
- * "else" because it interpreted the "if" statement as being all
- * done when it reached the ';' after the yyless() call.
- */
-
-/* Return all but the first 'n' matched characters back to the input stream. */
-
+ #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
#define yyless(n) \
do \
{ \
/* Undo effects of setting up yytext. */ \
- *yy_cp = yy_hold_char; \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
YY_RESTORE_YY_MORE_OFFSET \
- yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
YY_DO_BEFORE_ACTION; /* set up yytext again */ \
} \
while ( 0 )
-#define unput(c) yyunput( c, yytext_ptr )
+#define unput(c) yyunput( c, (yytext_ptr) )
/* The following is because we cannot portably get our hands on size_t
* (without autoconf's help, which isn't available because we want
* flex-generated scanners to compile on their own).
*/
-typedef unsigned int yy_size_t;
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef unsigned int yy_size_t;
+#endif
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
struct yy_buffer_state
{
FILE *yy_input_file;
@@ -177,12 +213,16 @@ struct yy_buffer_state
*/
int yy_at_bol;
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
/* Whether to try to fill the input buffer when we reach the
* end of it.
*/
int yy_fill_buffer;
int yy_buffer_status;
+
#define YY_BUFFER_NEW 0
#define YY_BUFFER_NORMAL 1
/* When an EOF's been seen but there's still some text to process
@@ -196,23 +236,33 @@ struct yy_buffer_state
* just pointing yyin at a new input file.
*/
#define YY_BUFFER_EOF_PENDING 2
+
};
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
-static YY_BUFFER_STATE yy_current_buffer = 0;
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
/* We provide macros for accessing buffer states in case in the
* future we want to put the buffer states in a more general
* "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
*/
-#define YY_CURRENT_BUFFER yy_current_buffer
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
/* yy_hold_char holds the character lost when yytext is formed. */
static char yy_hold_char;
-
static int yy_n_chars; /* number of characters read into yy_ch_buf */
-
-
int yyleng;
/* Points to current character in buffer. */
@@ -225,108 +275,138 @@ static int yy_start = 0; /* start state number */
*/
static int yy_did_buffer_switch_on_eof;
-void yyrestart YY_PROTO(( FILE *input_file ));
+void yyrestart (FILE *input_file );
+void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE yy_create_buffer (FILE *file,int size );
+void yy_delete_buffer (YY_BUFFER_STATE b );
+void yy_flush_buffer (YY_BUFFER_STATE b );
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer );
+void yypop_buffer_state (void );
+
+static void yyensure_buffer_stack (void );
+static void yy_load_buffer_state (void );
+static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file );
-void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
-void yy_load_buffer_state YY_PROTO(( void ));
-YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
-void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
-void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
-void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
-#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
-YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
-YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
-YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size );
+YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str );
+YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len );
-static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
-static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
-static void yy_flex_free YY_PROTO(( void * ));
+void *yyalloc (yy_size_t );
+void *yyrealloc (void *,yy_size_t );
+void yyfree (void * );
#define yy_new_buffer yy_create_buffer
#define yy_set_interactive(is_interactive) \
{ \
- if ( ! yy_current_buffer ) \
- yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
- yy_current_buffer->yy_is_interactive = is_interactive; \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ yyensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer(yyin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
}
#define yy_set_bol(at_bol) \
{ \
- if ( ! yy_current_buffer ) \
- yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
- yy_current_buffer->yy_at_bol = at_bol; \
+ if ( ! YY_CURRENT_BUFFER ){\
+ yyensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer(yyin,YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
}
-#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
-
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
-#define yywrap() 1
+#define yywrap(n) 1
#define YY_SKIP_YYWRAP
+
typedef unsigned char YY_CHAR;
+
FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+
typedef int yy_state_type;
+
+extern int yylineno;
+
+int yylineno = 1;
+
extern char *yytext;
#define yytext_ptr yytext
-static yy_state_type yy_get_previous_state YY_PROTO(( void ));
-static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
-static int yy_get_next_buffer YY_PROTO(( void ));
-static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[] );
/* Done after the current pattern has been matched and before the
* corresponding action - sets up yytext.
*/
#define YY_DO_BEFORE_ACTION \
- yytext_ptr = yy_bp; \
- yyleng = (int) (yy_cp - yy_bp); \
- yy_hold_char = *yy_cp; \
+ (yytext_ptr) = yy_bp; \
+ yyleng = (size_t) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
*yy_cp = '\0'; \
- yy_c_buf_p = yy_cp;
+ (yy_c_buf_p) = yy_cp;
-#define YY_NUM_RULES 33
-#define YY_END_OF_BUFFER 34
-static yyconst short int yy_accept[187] =
+#define YY_NUM_RULES 49
+#define YY_END_OF_BUFFER 50
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static yyconst flex_int16_t yy_accept[233] =
{ 0,
- 0, 0, 34, 29, 30, 32, 33, 29, 29, 27,
- 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 30, 0, 29, 31,
- 27, 29, 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 28, 29, 28, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 20, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29, 29, 21,
- 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
-
- 29, 29, 29, 29, 29, 29, 5, 22, 26, 29,
- 29, 29, 29, 29, 29, 29, 29, 29, 29, 23,
- 11, 29, 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 9, 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 1, 6, 19, 29, 29, 29, 4, 2, 7,
- 29, 29, 25, 12, 29, 3, 8, 29, 29, 29,
- 13, 29, 29, 29, 29, 24, 29, 10, 29, 29,
- 29, 29, 29, 17, 29, 16, 14, 29, 29, 29,
- 15, 29, 29, 29, 18, 0
+ 0, 0, 50, 49, 46, 48, 49, 47, 49, 49,
+ 43, 32, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 46, 0, 47, 0, 45, 43, 45, 0, 43,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 0,
+ 44, 0, 45, 44, 45, 45, 37, 45, 45, 45,
+ 42, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+
+ 45, 45, 36, 45, 20, 45, 45, 45, 45, 44,
+ 45, 45, 34, 1, 45, 45, 45, 45, 39, 38,
+ 29, 45, 45, 45, 35, 45, 45, 45, 21, 45,
+ 45, 45, 33, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 7, 45, 45, 45, 45, 9, 22, 27,
+ 45, 45, 45, 45, 10, 45, 45, 45, 45, 45,
+ 45, 11, 23, 40, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 2, 45, 45, 45, 45, 45, 45,
+ 45, 45, 5, 45, 30, 45, 19, 45, 45, 8,
+ 45, 3, 41, 45, 45, 25, 13, 45, 45, 6,
+
+ 28, 45, 45, 45, 45, 26, 24, 12, 4, 31,
+ 14, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 15, 45, 45, 45, 45, 18, 17, 45,
+ 16, 0
} ;
-static yyconst int yy_ec[256] =
+static yyconst flex_int32_t yy_ec[256] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 2, 1, 4, 5, 1, 1, 1, 1, 1,
- 1, 1, 6, 1, 6, 7, 1, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 1, 1, 1,
- 1, 1, 1, 1, 10, 11, 12, 13, 14, 15,
- 16, 17, 18, 1, 19, 20, 21, 22, 23, 24,
- 1, 25, 26, 27, 28, 29, 30, 1, 31, 32,
- 1, 1, 1, 1, 9, 1, 10, 11, 12, 13,
-
- 14, 15, 16, 17, 18, 1, 19, 20, 21, 22,
- 23, 24, 1, 25, 26, 27, 28, 29, 30, 1,
- 31, 32, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 1, 4, 5, 1, 1, 1, 6, 1,
+ 1, 1, 7, 1, 8, 9, 1, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 1, 11, 1,
+ 1, 1, 1, 1, 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
+ 22, 29, 30, 31, 32, 33, 34, 35, 36, 37,
+ 1, 1, 1, 1, 12, 1, 13, 14, 15, 16,
+
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+ 27, 28, 22, 29, 30, 31, 32, 33, 34, 35,
+ 36, 37, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -343,127 +423,200 @@ static yyconst int yy_ec[256] =
1, 1, 1, 1, 1
} ;
-static yyconst int yy_meta[33] =
+static yyconst flex_int32_t yy_meta[38] =
{ 0,
- 1, 2, 3, 4, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1
+ 1, 1, 2, 3, 1, 1, 1, 4, 4, 4,
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4
} ;
-static yyconst short int yy_base[191] =
+static yyconst flex_int16_t yy_base[237] =
{ 0,
- 0, 0, 211, 0, 208, 212, 0, 31, 201, 29,
- 188, 198, 20, 196, 179, 18, 195, 189, 32, 32,
- 188, 178, 174, 181, 189, 0, 195, 192, 43, 0,
- 41, 187, 44, 184, 38, 171, 165, 170, 172, 179,
- 169, 171, 36, 40, 173, 158, 166, 157, 158, 163,
- 167, 43, 212, 53, 171, 170, 165, 166, 161, 148,
- 156, 151, 139, 154, 160, 158, 140, 152, 155, 150,
- 145, 135, 139, 137, 0, 127, 131, 147, 142, 136,
- 133, 124, 134, 137, 140, 135, 134, 42, 126, 0,
- 126, 124, 115, 133, 128, 114, 120, 125, 121, 116,
-
- 107, 115, 113, 119, 105, 106, 0, 0, 0, 112,
- 98, 107, 101, 105, 111, 115, 98, 108, 93, 0,
- 0, 99, 105, 100, 107, 96, 84, 105, 92, 88,
- 101, 0, 100, 89, 44, 86, 82, 79, 95, 84,
- 81, 0, 0, 0, 92, 83, 86, 0, 0, 0,
- 50, 68, 0, 0, 80, 0, 0, 83, 76, 68,
- 0, 62, 65, 68, 68, 0, 74, 0, 75, 63,
- 73, 64, 62, 0, 72, 0, 0, 57, 64, 54,
- 0, 39, 47, 32, 0, 212, 43, 73, 75, 79
+ 0, 0, 468, 469, 465, 469, 0, 0, 460, 455,
+ 29, 469, 455, 31, 32, 33, 34, 35, 40, 47,
+ 38, 42, 49, 52, 58, 54, 62, 65, 66, 69,
+ 70, 461, 458, 0, 455, 469, 73, 451, 449, 82,
+ 93, 71, 85, 79, 95, 84, 87, 96, 97, 98,
+ 101, 100, 116, 107, 102, 117, 115, 125, 108, 127,
+ 126, 128, 132, 130, 131, 141, 142, 143, 144, 157,
+ 144, 448, 160, 162, 151, 149, 164, 165, 167, 168,
+ 448, 169, 170, 171, 172, 173, 174, 181, 176, 183,
+ 185, 184, 188, 187, 193, 195, 194, 196, 197, 208,
+
+ 206, 190, 447, 213, 446, 214, 216, 217, 218, 444,
+ 220, 219, 444, 443, 222, 223, 224, 221, 442, 441,
+ 440, 240, 243, 229, 439, 226, 227, 245, 438, 246,
+ 247, 249, 437, 254, 250, 252, 256, 258, 259, 262,
+ 263, 265, 269, 268, 271, 272, 273, 436, 435, 434,
+ 275, 282, 274, 281, 433, 277, 290, 292, 293, 295,
+ 296, 432, 431, 430, 297, 298, 302, 303, 306, 307,
+ 308, 309, 312, 429, 310, 317, 311, 320, 322, 328,
+ 329, 330, 428, 331, 427, 333, 426, 335, 339, 425,
+ 337, 424, 423, 336, 338, 422, 421, 340, 347, 420,
+
+ 419, 341, 352, 353, 354, 418, 417, 416, 409, 406,
+ 362, 360, 367, 368, 370, 371, 375, 373, 376, 377,
+ 378, 380, 400, 382, 388, 379, 386, 392, 385, 389,
+ 343, 469, 412, 416, 420, 115
} ;
-static yyconst short int yy_def[191] =
+static yyconst flex_int16_t yy_def[237] =
{ 0,
- 186, 1, 186, 187, 186, 186, 188, 189, 187, 187,
- 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 187, 187, 187, 187, 187, 186, 188, 189, 190,
- 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 187, 186, 187, 187, 187, 187, 187, 187, 187,
- 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
-
- 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 187, 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 187, 187, 187, 187, 0, 186, 186, 186, 186
+ 232, 1, 232, 232, 232, 232, 233, 234, 235, 232,
+ 236, 232, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 232, 233, 234, 235, 232, 232, 236, 232, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 232,
+ 232, 232, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 232,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 0, 232, 232, 232, 232
} ;
-static yyconst short int yy_nxt[245] =
+static yyconst flex_int16_t yy_nxt[507] =
{ 0,
- 4, 5, 6, 7, 8, 9, 4, 10, 4, 4,
- 11, 12, 13, 4, 4, 14, 15, 16, 17, 18,
- 19, 4, 4, 20, 21, 4, 22, 4, 23, 24,
- 25, 4, 30, 36, 30, 32, 31, 37, 40, 41,
- 44, 46, 33, 26, 30, 45, 30, 32, 31, 55,
- 67, 56, 185, 58, 33, 69, 47, 59, 78, 70,
- 54, 110, 79, 184, 68, 183, 33, 162, 111, 151,
- 152, 182, 163, 28, 28, 29, 29, 181, 29, 30,
- 30, 180, 30, 179, 178, 177, 176, 175, 174, 173,
- 172, 171, 170, 169, 168, 167, 166, 165, 164, 161,
-
- 160, 159, 158, 157, 156, 155, 154, 153, 150, 149,
- 148, 147, 146, 145, 144, 143, 142, 141, 140, 139,
- 138, 137, 136, 135, 134, 133, 132, 131, 130, 129,
- 128, 127, 126, 125, 124, 123, 122, 121, 120, 119,
- 118, 117, 116, 115, 114, 113, 112, 109, 108, 107,
- 106, 105, 104, 103, 102, 101, 100, 99, 98, 97,
- 96, 95, 94, 93, 92, 91, 90, 89, 88, 87,
- 86, 85, 84, 83, 82, 81, 80, 56, 56, 77,
- 76, 75, 74, 73, 72, 71, 66, 65, 64, 63,
- 62, 61, 60, 57, 54, 53, 27, 52, 51, 50,
-
- 49, 48, 43, 42, 39, 38, 35, 34, 31, 27,
- 186, 3, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186
+ 4, 5, 6, 7, 8, 9, 10, 10, 4, 11,
+ 12, 13, 13, 14, 15, 16, 17, 13, 18, 19,
+ 20, 13, 21, 22, 23, 13, 13, 24, 25, 26,
+ 27, 13, 28, 29, 30, 31, 13, 39, 40, 232,
+ 232, 232, 232, 232, 46, 41, 232, 50, 232, 47,
+ 232, 43, 55, 56, 42, 232, 44, 232, 57, 48,
+ 232, 58, 232, 51, 61, 59, 232, 45, 49, 52,
+ 232, 53, 54, 232, 232, 60, 63, 232, 232, 232,
+ 62, 39, 37, 75, 64, 67, 69, 232, 65, 70,
+ 39, 40, 232, 232, 66, 232, 68, 76, 41, 72,
+
+ 73, 232, 74, 232, 232, 232, 232, 78, 232, 232,
+ 232, 81, 80, 84, 77, 232, 232, 85, 38, 79,
+ 87, 86, 83, 232, 232, 232, 90, 82, 88, 89,
+ 91, 92, 94, 232, 232, 232, 232, 97, 232, 232,
+ 232, 93, 98, 96, 99, 103, 104, 95, 102, 232,
+ 232, 232, 232, 71, 100, 108, 101, 232, 105, 232,
+ 70, 106, 107, 72, 72, 111, 110, 109, 232, 74,
+ 232, 74, 232, 232, 112, 232, 232, 232, 232, 232,
+ 232, 232, 232, 115, 232, 117, 113, 124, 121, 232,
+ 114, 232, 232, 232, 118, 232, 232, 116, 232, 123,
+
+ 128, 232, 232, 232, 232, 232, 119, 120, 126, 130,
+ 122, 131, 133, 134, 232, 137, 232, 129, 125, 127,
+ 135, 232, 232, 132, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 148, 232, 232, 136, 232, 152, 153,
+ 138, 142, 143, 146, 144, 145, 140, 141, 232, 147,
+ 139, 232, 151, 232, 232, 232, 149, 232, 232, 150,
+ 232, 157, 232, 154, 232, 158, 232, 232, 160, 155,
+ 232, 232, 156, 232, 159, 163, 232, 232, 164, 232,
+ 232, 232, 232, 232, 168, 232, 161, 162, 171, 232,
+ 232, 166, 167, 165, 169, 172, 173, 175, 232, 174,
+
+ 232, 232, 170, 232, 232, 232, 232, 176, 177, 179,
+ 232, 232, 181, 182, 232, 232, 232, 232, 232, 232,
+ 232, 178, 184, 180, 188, 232, 185, 193, 232, 192,
+ 232, 183, 186, 189, 190, 191, 232, 232, 232, 232,
+ 194, 232, 187, 232, 232, 232, 232, 232, 232, 232,
+ 201, 232, 195, 196, 205, 232, 199, 197, 198, 202,
+ 232, 232, 232, 207, 209, 206, 200, 203, 232, 210,
+ 232, 208, 204, 212, 213, 232, 232, 214, 232, 232,
+ 215, 232, 211, 232, 232, 232, 232, 232, 232, 216,
+ 232, 218, 226, 232, 232, 219, 232, 232, 217, 222,
+
+ 232, 220, 227, 221, 228, 224, 223, 231, 232, 229,
+ 225, 230, 33, 33, 232, 33, 34, 232, 34, 34,
+ 35, 35, 35, 35, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 110, 232, 232, 232, 110, 71, 232,
+ 36, 36, 32, 232, 37, 36, 32, 232, 3, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+
+ 232, 232, 232, 232, 232, 232
} ;
-static yyconst short int yy_chk[245] =
+static yyconst flex_int16_t yy_chk[507] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 8, 13, 8, 10, 10, 13, 16, 16,
- 19, 20, 10, 187, 29, 19, 29, 31, 31, 33,
- 43, 33, 184, 35, 31, 44, 20, 35, 52, 44,
- 54, 88, 52, 183, 43, 182, 54, 151, 88, 135,
- 135, 180, 151, 188, 188, 189, 189, 179, 189, 190,
- 190, 178, 190, 175, 173, 172, 171, 170, 169, 167,
- 165, 164, 163, 162, 160, 159, 158, 155, 152, 147,
-
- 146, 145, 141, 140, 139, 138, 137, 136, 134, 133,
- 131, 130, 129, 128, 127, 126, 125, 124, 123, 122,
- 119, 118, 117, 116, 115, 114, 113, 112, 111, 110,
- 106, 105, 104, 103, 102, 101, 100, 99, 98, 97,
- 96, 95, 94, 93, 92, 91, 89, 87, 86, 85,
- 84, 83, 82, 81, 80, 79, 78, 77, 76, 74,
- 73, 72, 71, 70, 69, 68, 67, 66, 65, 64,
- 63, 62, 61, 60, 59, 58, 57, 56, 55, 51,
- 50, 49, 48, 47, 46, 45, 42, 41, 40, 39,
- 38, 37, 36, 34, 32, 28, 27, 25, 24, 23,
-
- 22, 21, 18, 17, 15, 14, 12, 11, 9, 5,
- 3, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186
+ 1, 1, 1, 1, 1, 1, 1, 11, 11, 14,
+ 15, 16, 17, 18, 16, 11, 21, 18, 19, 16,
+ 22, 15, 21, 22, 14, 20, 15, 23, 22, 17,
+ 24, 23, 26, 18, 24, 23, 25, 15, 17, 19,
+ 27, 20, 20, 28, 29, 23, 25, 30, 31, 42,
+ 24, 37, 37, 42, 26, 29, 31, 44, 27, 37,
+ 40, 40, 46, 43, 28, 47, 30, 43, 40, 41,
+
+ 41, 41, 41, 45, 48, 49, 50, 45, 52, 51,
+ 55, 48, 47, 51, 44, 54, 59, 51, 236, 46,
+ 52, 51, 50, 57, 53, 56, 55, 49, 53, 54,
+ 56, 56, 57, 58, 61, 60, 62, 59, 64, 65,
+ 63, 56, 60, 58, 61, 63, 64, 57, 62, 66,
+ 67, 68, 69, 71, 61, 68, 61, 76, 65, 75,
+ 71, 66, 67, 70, 70, 75, 70, 69, 73, 73,
+ 74, 74, 77, 78, 76, 79, 80, 82, 83, 84,
+ 85, 86, 87, 79, 89, 82, 77, 89, 86, 88,
+ 78, 90, 92, 91, 83, 94, 93, 80, 102, 88,
+
+ 93, 95, 97, 96, 98, 99, 84, 85, 91, 95,
+ 87, 96, 98, 99, 101, 102, 100, 94, 90, 92,
+ 100, 104, 106, 97, 107, 108, 109, 112, 111, 118,
+ 115, 116, 117, 118, 126, 127, 101, 124, 126, 127,
+ 104, 109, 111, 116, 112, 115, 107, 108, 122, 117,
+ 106, 123, 124, 128, 130, 131, 122, 132, 135, 123,
+ 136, 132, 134, 128, 137, 134, 138, 139, 136, 130,
+ 140, 141, 131, 142, 135, 139, 144, 143, 140, 145,
+ 146, 147, 153, 151, 144, 156, 137, 138, 147, 154,
+ 152, 142, 143, 141, 145, 151, 152, 154, 157, 153,
+
+ 158, 159, 146, 160, 161, 165, 166, 156, 157, 159,
+ 167, 168, 161, 165, 169, 170, 171, 172, 175, 177,
+ 173, 158, 167, 160, 171, 176, 168, 177, 178, 176,
+ 179, 166, 169, 172, 173, 175, 180, 181, 182, 184,
+ 178, 186, 170, 188, 194, 191, 195, 189, 198, 202,
+ 188, 231, 179, 180, 195, 199, 184, 181, 182, 189,
+ 203, 204, 205, 199, 203, 198, 186, 191, 212, 204,
+ 211, 202, 194, 211, 212, 213, 214, 212, 215, 216,
+ 212, 218, 205, 217, 219, 220, 221, 226, 222, 212,
+ 224, 214, 222, 229, 227, 215, 225, 230, 213, 218,
+
+ 228, 216, 224, 217, 225, 220, 219, 230, 223, 226,
+ 221, 227, 233, 233, 210, 233, 234, 209, 234, 234,
+ 235, 235, 235, 235, 208, 207, 206, 201, 200, 197,
+ 196, 193, 192, 190, 187, 185, 183, 174, 164, 163,
+ 162, 155, 150, 149, 148, 133, 129, 125, 121, 120,
+ 119, 114, 113, 110, 105, 103, 81, 72, 39, 38,
+ 35, 33, 32, 13, 10, 9, 5, 3, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+ 232, 232, 232, 232, 232, 232, 232, 232, 232, 232,
+
+ 232, 232, 232, 232, 232, 232
} ;
static yy_state_type yy_last_accepting_state;
static char *yy_last_accepting_cpos;
+extern int yy_flex_debug;
+int yy_flex_debug = 0;
+
/* The intent behind this definition is that it'll catch
* any uses of REJECT which flex missed.
*/
@@ -473,9 +626,8 @@ static char *yy_last_accepting_cpos;
#define YY_RESTORE_YY_MORE_OFFSET
char *yytext;
#line 1 "testpatternl.l"
-#define INITIAL 0
/*
- * "$Id: testpatternl.l,v 1.2.6.1 2002/07/23 00:54:08 rlk Exp $"
+ * "$Id: testpatternl.l,v 1.16 2004/04/14 02:21:21 rlk Exp $"
*
* Test pattern generator for Gimp-Print
*
@@ -510,13 +662,46 @@ char *yytext;
int mylineno = 1;
-#if 0
-#define DBG(x) fprintf(stderr, "'%s'%s\n", yytext, #x);
-#else
-#define DBG(x)
+static char *
+c_strstrip(char *s)
+{
+ size_t len = strlen(s);
+ if (len >= 2 && ((s[0] == '"' && s[len - 1] == '"') ||
+ (s[0] == '\'' && s[len - 1] == '\'')))
+ {
+ char *sn = malloc(len - 1);
+ memcpy(sn, s + 1, len - 2);
+ sn[len - 2] = '\0';
+ return sn;
+ }
+ else
+ return (char *) s;
+}
+
+#define DBG(x) \
+do \
+ { \
+ if (getenv("STP_TESTPATTERN_DEBUG")) \
+ fprintf(stderr, "'%s' => %s\n", yytext, #x); \
+ } \
+ while (0)
+
+
+#line 691 "testpatternl.c"
+
+#define INITIAL 0
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
#endif
-#line 520 "lex.yy.c"
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
/* Macros after this point can all be overridden by user definitions in
* section 1.
@@ -524,65 +709,30 @@ int mylineno = 1;
#ifndef YY_SKIP_YYWRAP
#ifdef __cplusplus
-extern "C" int yywrap YY_PROTO(( void ));
+extern "C" int yywrap (void );
#else
-extern int yywrap YY_PROTO(( void ));
-#endif
+extern int yywrap (void );
#endif
-
-#ifndef YY_NO_UNPUT
-static void yyunput YY_PROTO(( int c, char *buf_ptr ));
#endif
+ static void yyunput (int c,char *buf_ptr );
+
#ifndef yytext_ptr
-static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+static void yy_flex_strncpy (char *,yyconst char *,int );
#endif
#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+static int yy_flex_strlen (yyconst char * );
#endif
#ifndef YY_NO_INPUT
+
#ifdef __cplusplus
-static int yyinput YY_PROTO(( void ));
+static int yyinput (void );
#else
-static int input YY_PROTO(( void ));
-#endif
-#endif
-
-#if YY_STACK_USED
-static int yy_start_stack_ptr = 0;
-static int yy_start_stack_depth = 0;
-static int *yy_start_stack = 0;
-#ifndef YY_NO_PUSH_STATE
-static void yy_push_state YY_PROTO(( int new_state ));
-#endif
-#ifndef YY_NO_POP_STATE
-static void yy_pop_state YY_PROTO(( void ));
-#endif
-#ifndef YY_NO_TOP_STATE
-static int yy_top_state YY_PROTO(( void ));
+static int input (void );
#endif
-#else
-#define YY_NO_PUSH_STATE 1
-#define YY_NO_POP_STATE 1
-#define YY_NO_TOP_STATE 1
-#endif
-
-#ifdef YY_MALLOC_DECL
-YY_MALLOC_DECL
-#else
-#if __STDC__
-#ifndef __cplusplus
-#include <stdlib.h>
-#endif
-#else
-/* Just try to get by without declaring the routines. This will fail
- * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
- * or sizeof(void*) != sizeof(int).
- */
-#endif
#endif
/* Amount of stuff to slurp up with each read. */
@@ -591,7 +741,6 @@ YY_MALLOC_DECL
#endif
/* Copy whatever the last rule matched to the standard output. */
-
#ifndef ECHO
/* This used to be an fputs(), but since the string might contain NUL's,
* we now use fwrite().
@@ -604,9 +753,10 @@ YY_MALLOC_DECL
*/
#ifndef YY_INPUT
#define YY_INPUT(buf,result,max_size) \
- if ( yy_current_buffer->yy_is_interactive ) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
{ \
- int c = '*', n; \
+ int c = '*'; \
+ size_t n; \
for ( n = 0; n < max_size && \
(c = getc( yyin )) != EOF && c != '\n'; ++n ) \
buf[n] = (char) c; \
@@ -616,9 +766,22 @@ YY_MALLOC_DECL
YY_FATAL_ERROR( "input in flex scanner failed" ); \
result = n; \
} \
- else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
- && ferror( yyin ) ) \
- YY_FATAL_ERROR( "input in flex scanner failed" );
+ else \
+ { \
+ errno=0; \
+ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(yyin); \
+ } \
+ }\
+\
+
#endif
/* No semi-colon after return; correct usage is to write "yyterminate();" -
@@ -639,12 +802,18 @@ YY_MALLOC_DECL
#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
#endif
+/* end tables serialization structures and prototypes */
+
/* Default declaration of generated scanner - a define so the user can
* easily add parameters.
*/
#ifndef YY_DECL
-#define YY_DECL int yylex YY_PROTO(( void ))
-#endif
+#define YY_DECL_IS_OURS 1
+
+extern int yylex (void);
+
+#define YY_DECL int yylex (void)
+#endif /* !YY_DECL */
/* Code executed at the beginning of each rule, after yytext and yyleng
* have been set up.
@@ -661,27 +830,29 @@ YY_MALLOC_DECL
#define YY_RULE_SETUP \
YY_USER_ACTION
+/** The main scanner function which does all the work.
+ */
YY_DECL
- {
+{
register yy_state_type yy_current_state;
register char *yy_cp, *yy_bp;
register int yy_act;
-
-#line 54 "testpatternl.l"
+
+#line 73 "testpatternl.l"
-#line 674 "lex.yy.c"
+#line 845 "testpatternl.c"
- if ( yy_init )
+ if ( (yy_init) )
{
- yy_init = 0;
+ (yy_init) = 0;
#ifdef YY_USER_INIT
YY_USER_INIT;
#endif
- if ( ! yy_start )
- yy_start = 1; /* first start state */
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
if ( ! yyin )
yyin = stdin;
@@ -689,262 +860,344 @@ YY_DECL
if ( ! yyout )
yyout = stdout;
- if ( ! yy_current_buffer )
- yy_current_buffer =
- yy_create_buffer( yyin, YY_BUF_SIZE );
+ if ( ! YY_CURRENT_BUFFER ) {
+ yyensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer(yyin,YY_BUF_SIZE );
+ }
- yy_load_buffer_state();
+ yy_load_buffer_state( );
}
while ( 1 ) /* loops until end-of-file is reached */
{
- yy_cp = yy_c_buf_p;
+ yy_cp = (yy_c_buf_p);
/* Support of yytext. */
- *yy_cp = yy_hold_char;
+ *yy_cp = (yy_hold_char);
/* yy_bp points to the position in yy_ch_buf of the start of
* the current run.
*/
yy_bp = yy_cp;
- yy_current_state = yy_start;
+ yy_current_state = (yy_start);
yy_match:
do
{
register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
if ( yy_accept[yy_current_state] )
{
- yy_last_accepting_state = yy_current_state;
- yy_last_accepting_cpos = yy_cp;
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
}
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 187 )
+ if ( yy_current_state >= 233 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
++yy_cp;
}
- while ( yy_base[yy_current_state] != 212 );
+ while ( yy_base[yy_current_state] != 469 );
yy_find_action:
yy_act = yy_accept[yy_current_state];
if ( yy_act == 0 )
{ /* have to back up */
- yy_cp = yy_last_accepting_cpos;
- yy_current_state = yy_last_accepting_state;
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
yy_act = yy_accept[yy_current_state];
}
YY_DO_BEFORE_ACTION;
-
do_action: /* This label is used only to access EOF actions. */
-
switch ( yy_act )
{ /* beginning of action switch */
case 0: /* must back up */
/* undo the effects of YY_DO_BEFORE_ACTION */
- *yy_cp = yy_hold_char;
- yy_cp = yy_last_accepting_cpos;
- yy_current_state = yy_last_accepting_state;
+ *yy_cp = (yy_hold_char);
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
goto yy_find_action;
case 1:
YY_RULE_SETUP
-#line 56 "testpatternl.l"
-DBG(C_GAMMA) return C_GAMMA;
+#line 75 "testpatternl.l"
+yylval.sval = yytext;DBG(CYAN); return CYAN;
YY_BREAK
case 2:
YY_RULE_SETUP
-#line 57 "testpatternl.l"
-DBG(M_GAMMA) return M_GAMMA;
+#line 76 "testpatternl.l"
+yylval.sval = yytext;DBG(L_CYAN); return L_CYAN;
YY_BREAK
case 3:
YY_RULE_SETUP
-#line 58 "testpatternl.l"
-DBG(Y_GAMMA) return Y_GAMMA;
+#line 77 "testpatternl.l"
+yylval.sval = yytext;DBG(MAGENTA); return MAGENTA;
YY_BREAK
case 4:
YY_RULE_SETUP
-#line 59 "testpatternl.l"
-DBG(K_GAMMA) return K_GAMMA;
+#line 78 "testpatternl.l"
+yylval.sval = yytext;DBG(L_MAGENTA); return L_MAGENTA;
YY_BREAK
case 5:
YY_RULE_SETUP
-#line 60 "testpatternl.l"
-DBG(GAMMA) return GAMMA;
+#line 79 "testpatternl.l"
+yylval.sval = yytext;DBG(YELLOW); return YELLOW;
YY_BREAK
case 6:
YY_RULE_SETUP
-#line 61 "testpatternl.l"
-DBG(C_LEVEL) return C_LEVEL;
+#line 80 "testpatternl.l"
+yylval.sval = yytext;DBG(D_YELLOW); return D_YELLOW;
YY_BREAK
case 7:
YY_RULE_SETUP
-#line 62 "testpatternl.l"
-DBG(M_LEVEL) return M_LEVEL;
+#line 81 "testpatternl.l"
+yylval.sval = yytext;DBG(BLACK); return BLACK;
YY_BREAK
case 8:
YY_RULE_SETUP
-#line 63 "testpatternl.l"
-DBG(Y_LEVEL) return Y_LEVEL;
+#line 82 "testpatternl.l"
+yylval.sval = yytext;DBG(L_BLACK); return L_BLACK;
YY_BREAK
case 9:
YY_RULE_SETUP
-#line 64 "testpatternl.l"
-DBG(LEVELS) return LEVELS;
+#line 83 "testpatternl.l"
+DBG(GAMMA); return GAMMA;
YY_BREAK
case 10:
YY_RULE_SETUP
-#line 65 "testpatternl.l"
-DBG(INK_LIMIT) return INK_LIMIT;
+#line 84 "testpatternl.l"
+DBG(LEVEL); return LEVEL;
YY_BREAK
case 11:
YY_RULE_SETUP
-#line 66 "testpatternl.l"
-DBG(WIDTH) return WIDTH;
+#line 85 "testpatternl.l"
+DBG(STEPS); return STEPS;
YY_BREAK
case 12:
YY_RULE_SETUP
-#line 67 "testpatternl.l"
-DBG(PRINTER) return PRINTER;
+#line 86 "testpatternl.l"
+DBG(INK_LIMIT); return INK_LIMIT;
YY_BREAK
case 13:
YY_RULE_SETUP
-#line 68 "testpatternl.l"
-DBG(INK_TYPE) return INK_TYPE;
+#line 87 "testpatternl.l"
+DBG(PRINTER); return PRINTER;
YY_BREAK
case 14:
YY_RULE_SETUP
-#line 69 "testpatternl.l"
-DBG(RESOLUTION) return RESOLUTION;
+#line 88 "testpatternl.l"
+DBG(PARAMETER); return PARAMETER;
YY_BREAK
case 15:
YY_RULE_SETUP
-#line 70 "testpatternl.l"
-DBG(MEDIA_SOURCE) return MEDIA_SOURCE;
+#line 89 "testpatternl.l"
+DBG(PARAMETER_INT); return PARAMETER_INT;
YY_BREAK
case 16:
YY_RULE_SETUP
-#line 71 "testpatternl.l"
-DBG(MEDIA_TYPE) return MEDIA_TYPE;
+#line 90 "testpatternl.l"
+DBG(PARAMETER); return PARAMETER;
YY_BREAK
case 17:
YY_RULE_SETUP
-#line 72 "testpatternl.l"
-DBG(MEDIA_SIZE) return MEDIA_SIZE;
+#line 91 "testpatternl.l"
+DBG(PARAMETER_FLOAT); return PARAMETER_FLOAT;
YY_BREAK
case 18:
YY_RULE_SETUP
-#line 73 "testpatternl.l"
-DBG(DITHER_ALGORITHM) return DITHER_ALGORITHM;
+#line 92 "testpatternl.l"
+DBG(PARAMETER_CURVE); return PARAMETER_CURVE;
YY_BREAK
case 19:
YY_RULE_SETUP
-#line 74 "testpatternl.l"
-DBG(DENSITY) return DENSITY;
+#line 93 "testpatternl.l"
+DBG(DENSITY); return DENSITY;
YY_BREAK
case 20:
YY_RULE_SETUP
-#line 75 "testpatternl.l"
-DBG(TOP) return TOP;
+#line 94 "testpatternl.l"
+DBG(TOP); return TOP;
YY_BREAK
case 21:
YY_RULE_SETUP
-#line 76 "testpatternl.l"
-DBG(LEFT) return LEFT;
+#line 95 "testpatternl.l"
+DBG(LEFT); return LEFT;
YY_BREAK
case 22:
YY_RULE_SETUP
-#line 77 "testpatternl.l"
-DBG(HSIZE) return HSIZE;
+#line 96 "testpatternl.l"
+DBG(HSIZE); return HSIZE;
YY_BREAK
case 23:
YY_RULE_SETUP
-#line 78 "testpatternl.l"
-DBG(VSIZE) return VSIZE;
+#line 97 "testpatternl.l"
+DBG(VSIZE); return VSIZE;
YY_BREAK
case 24:
YY_RULE_SETUP
-#line 79 "testpatternl.l"
-DBG(BLACKLINE) return BLACKLINE;
+#line 98 "testpatternl.l"
+DBG(BLACKLINE); return BLACKLINE;
YY_BREAK
case 25:
YY_RULE_SETUP
-#line 80 "testpatternl.l"
-DBG(PATTERN) return PATTERN;
+#line 99 "testpatternl.l"
+DBG(PATTERN); return PATTERN;
YY_BREAK
case 26:
YY_RULE_SETUP
-#line 81 "testpatternl.l"
-DBG(IMAGE) return IMAGE;
+#line 100 "testpatternl.l"
+DBG(XPATTERN); return XPATTERN;
YY_BREAK
case 27:
YY_RULE_SETUP
-#line 83 "testpatternl.l"
-yylval.ival = atoi(yytext); DBG(tINT) return tINT;
+#line 101 "testpatternl.l"
+DBG(IMAGE); return IMAGE;
YY_BREAK
case 28:
YY_RULE_SETUP
-#line 84 "testpatternl.l"
-yylval.dval = strtod(yytext, NULL); DBG(tDOUBLE) return tDOUBLE;
+#line 102 "testpatternl.l"
+DBG(EXTENDED); return EXTENDED;
YY_BREAK
case 29:
YY_RULE_SETUP
-#line 85 "testpatternl.l"
-yylval.sval = c_strdup(yytext); DBG(tSTRING) return tSTRING;
+#line 103 "testpatternl.l"
+DBG(GRID); return GRID;
YY_BREAK
case 30:
YY_RULE_SETUP
-#line 86 "testpatternl.l"
-DBG(whitespace1) /* Skip blanks/tabs */
+#line 104 "testpatternl.l"
+DBG(CHANNEL); return CHANNEL;
YY_BREAK
case 31:
YY_RULE_SETUP
-#line 87 "testpatternl.l"
-DBG(comment1) /* Skip comments */
+#line 105 "testpatternl.l"
+DBG(PAGESIZE); return PAGESIZE;
YY_BREAK
case 32:
YY_RULE_SETUP
-#line 88 "testpatternl.l"
-DBG(newline) mylineno++;
+#line 106 "testpatternl.l"
+DBG(SEMI); return SEMI;
YY_BREAK
case 33:
YY_RULE_SETUP
-#line 89 "testpatternl.l"
+#line 107 "testpatternl.l"
+DBG(MODE); return MODE;
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 108 "testpatternl.l"
+yylval.ival = CMYK;DBG(CMYK); return CMYK;
+ YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 109 "testpatternl.l"
+yylval.ival = CMYK;DBG(KCMY); return KCMY;
+ YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 110 "testpatternl.l"
+yylval.ival = RGB;DBG(RGB); return RGB;
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 111 "testpatternl.l"
+yylval.ival = RGB;DBG(CMY); return CMY;
+ YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 112 "testpatternl.l"
+yylval.ival = GRAY;DBG(GRAY); return GRAY;
+ YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 113 "testpatternl.l"
+yylval.ival = GRAY;DBG(GRAY); return GRAY;
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 114 "testpatternl.l"
+yylval.ival = WHITE;DBG(WHITE); return WHITE;
+ YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 115 "testpatternl.l"
+DBG(MESSAGE); return MESSAGE;
+ YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 116 "testpatternl.l"
+DBG(END); return END;
+ YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 119 "testpatternl.l"
+yylval.ival = atoi(yytext); DBG(tINT); return tINT;
+ YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 120 "testpatternl.l"
+yylval.dval = strtod(yytext, NULL); DBG(tDOUBLE); return tDOUBLE;
+ YY_BREAK
+case 45:
+/* rule 45 can match eol */
+YY_RULE_SETUP
+#line 121 "testpatternl.l"
+yylval.sval = c_strstrip(yytext); DBG(tSTRING); return tSTRING;
+ YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 122 "testpatternl.l"
+DBG(whitespace); /* Skip blanks/tabs */
+ YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 123 "testpatternl.l"
+DBG(comment); /* Skip comments */
+ YY_BREAK
+case 48:
+/* rule 48 can match eol */
+YY_RULE_SETUP
+#line 124 "testpatternl.l"
+DBG(newline); mylineno++;
+ YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 125 "testpatternl.l"
ECHO;
YY_BREAK
-#line 922 "lex.yy.c"
+#line 1175 "testpatternl.c"
case YY_STATE_EOF(INITIAL):
yyterminate();
case YY_END_OF_BUFFER:
{
/* Amount of text matched not including the EOB char. */
- int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
/* Undo the effects of YY_DO_BEFORE_ACTION. */
- *yy_cp = yy_hold_char;
+ *yy_cp = (yy_hold_char);
YY_RESTORE_YY_MORE_OFFSET
- if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
{
/* We're scanning a new file or input source. It's
* possible that this happened because the user
* just pointed yyin at a new source and called
* yylex(). If so, then we have to assure
- * consistency between yy_current_buffer and our
+ * consistency between YY_CURRENT_BUFFER and our
* globals. Here is the right place to do so, because
* this is the first action (other than possibly a
* back-up) that will match for the new input source.
*/
- yy_n_chars = yy_current_buffer->yy_n_chars;
- yy_current_buffer->yy_input_file = yyin;
- yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
}
/* Note that here we test for yy_c_buf_p "<=" to the position
@@ -954,13 +1207,13 @@ case YY_STATE_EOF(INITIAL):
* end-of-buffer state). Contrast this with the test
* in input().
*/
- if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
{ /* This was really a NUL. */
yy_state_type yy_next_state;
- yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
- yy_current_state = yy_get_previous_state();
+ yy_current_state = yy_get_previous_state( );
/* Okay, we're now positioned to make the NUL
* transition. We couldn't have
@@ -973,30 +1226,30 @@ case YY_STATE_EOF(INITIAL):
yy_next_state = yy_try_NUL_trans( yy_current_state );
- yy_bp = yytext_ptr + YY_MORE_ADJ;
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
if ( yy_next_state )
{
/* Consume the NUL. */
- yy_cp = ++yy_c_buf_p;
+ yy_cp = ++(yy_c_buf_p);
yy_current_state = yy_next_state;
goto yy_match;
}
else
{
- yy_cp = yy_c_buf_p;
+ yy_cp = (yy_c_buf_p);
goto yy_find_action;
}
}
- else switch ( yy_get_next_buffer() )
+ else switch ( yy_get_next_buffer( ) )
{
case EOB_ACT_END_OF_FILE:
{
- yy_did_buffer_switch_on_eof = 0;
+ (yy_did_buffer_switch_on_eof) = 0;
- if ( yywrap() )
+ if ( yywrap( ) )
{
/* Note: because we've taken care in
* yy_get_next_buffer() to have set up
@@ -1007,7 +1260,7 @@ case YY_STATE_EOF(INITIAL):
* YY_NULL, it'll still work - another
* YY_NULL will get returned.
*/
- yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
yy_act = YY_STATE_EOF(YY_START);
goto do_action;
@@ -1015,30 +1268,30 @@ case YY_STATE_EOF(INITIAL):
else
{
- if ( ! yy_did_buffer_switch_on_eof )
+ if ( ! (yy_did_buffer_switch_on_eof) )
YY_NEW_FILE;
}
break;
}
case EOB_ACT_CONTINUE_SCAN:
- yy_c_buf_p =
- yytext_ptr + yy_amount_of_matched_text;
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
- yy_current_state = yy_get_previous_state();
+ yy_current_state = yy_get_previous_state( );
- yy_cp = yy_c_buf_p;
- yy_bp = yytext_ptr + YY_MORE_ADJ;
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
goto yy_match;
case EOB_ACT_LAST_MATCH:
- yy_c_buf_p =
- &yy_current_buffer->yy_ch_buf[yy_n_chars];
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
- yy_current_state = yy_get_previous_state();
+ yy_current_state = yy_get_previous_state( );
- yy_cp = yy_c_buf_p;
- yy_bp = yytext_ptr + YY_MORE_ADJ;
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
goto yy_find_action;
}
break;
@@ -1049,8 +1302,7 @@ case YY_STATE_EOF(INITIAL):
"fatal flex scanner internal error--no action found" );
} /* end of action switch */
} /* end of scanning one token */
- } /* end of yylex */
-
+} /* end of yylex */
/* yy_get_next_buffer - try to read in a new buffer
*
@@ -1059,21 +1311,20 @@ case YY_STATE_EOF(INITIAL):
* EOB_ACT_CONTINUE_SCAN - continue scanning from current position
* EOB_ACT_END_OF_FILE - end of file
*/
-
-static int yy_get_next_buffer()
- {
- register char *dest = yy_current_buffer->yy_ch_buf;
- register char *source = yytext_ptr;
+static int yy_get_next_buffer (void)
+{
+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ register char *source = (yytext_ptr);
register int number_to_move, i;
int ret_val;
- if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
YY_FATAL_ERROR(
"fatal flex scanner internal error--end of buffer missed" );
- if ( yy_current_buffer->yy_fill_buffer == 0 )
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
{ /* Don't try to fill the buffer, so this is an EOF. */
- if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
{
/* We matched a single character, the EOB, so
* treat this as a final EOF.
@@ -1093,34 +1344,30 @@ static int yy_get_next_buffer()
/* Try to read more data. */
/* First move last chars to start of buffer. */
- number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
for ( i = 0; i < number_to_move; ++i )
*(dest++) = *(source++);
- if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
/* don't do the read, it's not guaranteed to return an EOF,
* just force an EOF
*/
- yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
else
{
- int num_to_read =
- yy_current_buffer->yy_buf_size - number_to_move - 1;
+ size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
while ( num_to_read <= 0 )
{ /* Not enough room in the buffer - grow it. */
-#ifdef YY_USES_REJECT
- YY_FATAL_ERROR(
-"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
-#else
/* just a shorter name for the current buffer */
- YY_BUFFER_STATE b = yy_current_buffer;
+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
int yy_c_buf_p_offset =
- (int) (yy_c_buf_p - b->yy_ch_buf);
+ (int) ((yy_c_buf_p) - b->yy_ch_buf);
if ( b->yy_is_our_buffer )
{
@@ -1133,8 +1380,7 @@ static int yy_get_next_buffer()
b->yy_ch_buf = (char *)
/* Include room in for 2 EOB chars. */
- yy_flex_realloc( (void *) b->yy_ch_buf,
- b->yy_buf_size + 2 );
+ yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 );
}
else
/* Can't grow it, we don't own it. */
@@ -1144,35 +1390,35 @@ static int yy_get_next_buffer()
YY_FATAL_ERROR(
"fatal error - scanner input buffer overflow" );
- yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+ (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
- num_to_read = yy_current_buffer->yy_buf_size -
+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
number_to_move - 1;
-#endif
+
}
if ( num_to_read > YY_READ_BUF_SIZE )
num_to_read = YY_READ_BUF_SIZE;
/* Read in more data. */
- YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
- yy_n_chars, num_to_read );
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
- yy_current_buffer->yy_n_chars = yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
}
- if ( yy_n_chars == 0 )
+ if ( (yy_n_chars) == 0 )
{
if ( number_to_move == YY_MORE_ADJ )
{
ret_val = EOB_ACT_END_OF_FILE;
- yyrestart( yyin );
+ yyrestart(yyin );
}
else
{
ret_val = EOB_ACT_LAST_MATCH;
- yy_current_buffer->yy_buffer_status =
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
YY_BUFFER_EOF_PENDING;
}
}
@@ -1180,152 +1426,137 @@ static int yy_get_next_buffer()
else
ret_val = EOB_ACT_CONTINUE_SCAN;
- yy_n_chars += number_to_move;
- yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
- yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
- yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
return ret_val;
- }
-
+}
/* yy_get_previous_state - get the state just before the EOB char was reached */
-static yy_state_type yy_get_previous_state()
- {
+ static yy_state_type yy_get_previous_state (void)
+{
register yy_state_type yy_current_state;
register char *yy_cp;
+
+ yy_current_state = (yy_start);
- yy_current_state = yy_start;
-
- for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
{
register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
if ( yy_accept[yy_current_state] )
{
- yy_last_accepting_state = yy_current_state;
- yy_last_accepting_cpos = yy_cp;
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
}
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 187 )
+ if ( yy_current_state >= 233 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
}
return yy_current_state;
- }
-
+}
/* yy_try_NUL_trans - try to make a transition on the NUL character
*
* synopsis
* next_state = yy_try_NUL_trans( current_state );
*/
-
-#ifdef YY_USE_PROTOS
-static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
-#else
-static yy_state_type yy_try_NUL_trans( yy_current_state )
-yy_state_type yy_current_state;
-#endif
- {
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
register int yy_is_jam;
- register char *yy_cp = yy_c_buf_p;
+ register char *yy_cp = (yy_c_buf_p);
register YY_CHAR yy_c = 1;
if ( yy_accept[yy_current_state] )
{
- yy_last_accepting_state = yy_current_state;
- yy_last_accepting_cpos = yy_cp;
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
}
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 187 )
+ if ( yy_current_state >= 233 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- yy_is_jam = (yy_current_state == 186);
+ yy_is_jam = (yy_current_state == 232);
return yy_is_jam ? 0 : yy_current_state;
- }
-
+}
-#ifndef YY_NO_UNPUT
-#ifdef YY_USE_PROTOS
-static void yyunput( int c, register char *yy_bp )
-#else
-static void yyunput( c, yy_bp )
-int c;
-register char *yy_bp;
-#endif
- {
- register char *yy_cp = yy_c_buf_p;
+ static void yyunput (int c, register char * yy_bp )
+{
+ register char *yy_cp;
+
+ yy_cp = (yy_c_buf_p);
/* undo effects of setting up yytext */
- *yy_cp = yy_hold_char;
+ *yy_cp = (yy_hold_char);
- if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
{ /* need to shift things up to make room */
/* +2 for EOB chars. */
- register int number_to_move = yy_n_chars + 2;
- register char *dest = &yy_current_buffer->yy_ch_buf[
- yy_current_buffer->yy_buf_size + 2];
+ register int number_to_move = (yy_n_chars) + 2;
+ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
register char *source =
- &yy_current_buffer->yy_ch_buf[number_to_move];
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
- while ( source > yy_current_buffer->yy_ch_buf )
+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
*--dest = *--source;
yy_cp += (int) (dest - source);
yy_bp += (int) (dest - source);
- yy_current_buffer->yy_n_chars =
- yy_n_chars = yy_current_buffer->yy_buf_size;
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
- if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
YY_FATAL_ERROR( "flex scanner push-back overflow" );
}
*--yy_cp = (char) c;
+ (yytext_ptr) = yy_bp;
+ (yy_hold_char) = *yy_cp;
+ (yy_c_buf_p) = yy_cp;
+}
- yytext_ptr = yy_bp;
- yy_hold_char = *yy_cp;
- yy_c_buf_p = yy_cp;
- }
-#endif /* ifndef YY_NO_UNPUT */
-
-
+#ifndef YY_NO_INPUT
#ifdef __cplusplus
-static int yyinput()
+ static int yyinput (void)
#else
-static int input()
+ static int input (void)
#endif
- {
- int c;
- *yy_c_buf_p = yy_hold_char;
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
- if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
{
/* yy_c_buf_p now points to the character we want to return.
* If this occurs *before* the EOB characters, then it's a
* valid NUL; if not, then we've hit the end of the buffer.
*/
- if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
/* This was really a NUL. */
- *yy_c_buf_p = '\0';
+ *(yy_c_buf_p) = '\0';
else
{ /* need more input */
- int offset = yy_c_buf_p - yytext_ptr;
- ++yy_c_buf_p;
+ int offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
- switch ( yy_get_next_buffer() )
+ switch ( yy_get_next_buffer( ) )
{
case EOB_ACT_LAST_MATCH:
/* This happens because yy_g_n_b()
@@ -1339,16 +1570,16 @@ static int input()
*/
/* Reset buffer status. */
- yyrestart( yyin );
+ yyrestart(yyin );
- /* fall through */
+ /*FALLTHROUGH*/
case EOB_ACT_END_OF_FILE:
{
- if ( yywrap() )
+ if ( yywrap( ) )
return EOF;
- if ( ! yy_did_buffer_switch_on_eof )
+ if ( ! (yy_did_buffer_switch_on_eof) )
YY_NEW_FILE;
#ifdef __cplusplus
return yyinput();
@@ -1358,90 +1589,92 @@ static int input()
}
case EOB_ACT_CONTINUE_SCAN:
- yy_c_buf_p = yytext_ptr + offset;
+ (yy_c_buf_p) = (yytext_ptr) + offset;
break;
}
}
}
- c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */
- *yy_c_buf_p = '\0'; /* preserve yytext */
- yy_hold_char = *++yy_c_buf_p;
-
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve yytext */
+ (yy_hold_char) = *++(yy_c_buf_p);
return c;
- }
-
-
-#ifdef YY_USE_PROTOS
-void yyrestart( FILE *input_file )
-#else
-void yyrestart( input_file )
-FILE *input_file;
-#endif
- {
- if ( ! yy_current_buffer )
- yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+}
+#endif /* ifndef YY_NO_INPUT */
- yy_init_buffer( yy_current_buffer, input_file );
- yy_load_buffer_state();
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void yyrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ yyensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer(yyin,YY_BUF_SIZE );
}
+ yy_init_buffer(YY_CURRENT_BUFFER,input_file );
+ yy_load_buffer_state( );
+}
-#ifdef YY_USE_PROTOS
-void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
-#else
-void yy_switch_to_buffer( new_buffer )
-YY_BUFFER_STATE new_buffer;
-#endif
- {
- if ( yy_current_buffer == new_buffer )
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * yypop_buffer_state();
+ * yypush_buffer_state(new_buffer);
+ */
+ yyensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
return;
- if ( yy_current_buffer )
+ if ( YY_CURRENT_BUFFER )
{
/* Flush out information for old buffer. */
- *yy_c_buf_p = yy_hold_char;
- yy_current_buffer->yy_buf_pos = yy_c_buf_p;
- yy_current_buffer->yy_n_chars = yy_n_chars;
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
}
- yy_current_buffer = new_buffer;
- yy_load_buffer_state();
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ yy_load_buffer_state( );
/* We don't actually know whether we did this switch during
* EOF (yywrap()) processing, but the only time this flag
* is looked at is after yywrap() is called, so it's safe
* to go ahead and always set it.
*/
- yy_did_buffer_switch_on_eof = 1;
- }
-
-
-#ifdef YY_USE_PROTOS
-void yy_load_buffer_state( void )
-#else
-void yy_load_buffer_state()
-#endif
- {
- yy_n_chars = yy_current_buffer->yy_n_chars;
- yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
- yyin = yy_current_buffer->yy_input_file;
- yy_hold_char = *yy_c_buf_p;
- }
-
-
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
-#else
-YY_BUFFER_STATE yy_create_buffer( file, size )
-FILE *file;
-int size;
-#endif
- {
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void yy_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size )
+{
YY_BUFFER_STATE b;
-
- b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+
+ b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
if ( ! b )
YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
@@ -1450,80 +1683,75 @@ int size;
/* yy_ch_buf has to be 2 characters longer than the size given because
* we need to put in 2 end-of-buffer characters.
*/
- b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 );
if ( ! b->yy_ch_buf )
YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
b->yy_is_our_buffer = 1;
- yy_init_buffer( b, file );
+ yy_init_buffer(b,file );
return b;
- }
+}
-
-#ifdef YY_USE_PROTOS
-void yy_delete_buffer( YY_BUFFER_STATE b )
-#else
-void yy_delete_buffer( b )
-YY_BUFFER_STATE b;
-#endif
- {
+/** Destroy the buffer.
+ * @param b a buffer created with yy_create_buffer()
+ *
+ */
+ void yy_delete_buffer (YY_BUFFER_STATE b )
+{
+
if ( ! b )
return;
- if ( b == yy_current_buffer )
- yy_current_buffer = (YY_BUFFER_STATE) 0;
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
if ( b->yy_is_our_buffer )
- yy_flex_free( (void *) b->yy_ch_buf );
-
- yy_flex_free( (void *) b );
- }
-
+ yyfree((void *) b->yy_ch_buf );
-#ifndef YY_ALWAYS_INTERACTIVE
-#ifndef YY_NEVER_INTERACTIVE
-extern int isatty YY_PROTO(( int ));
-#endif
-#endif
+ yyfree((void *) b );
+}
-#ifdef YY_USE_PROTOS
-void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
-#else
-void yy_init_buffer( b, file )
-YY_BUFFER_STATE b;
-FILE *file;
-#endif
+#ifndef __cplusplus
+extern int isatty (int );
+#endif /* __cplusplus */
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a yyrestart() or at EOF.
+ */
+ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file )
-
- {
- yy_flush_buffer( b );
+{
+ int oerrno = errno;
+
+ yy_flush_buffer(b );
b->yy_input_file = file;
b->yy_fill_buffer = 1;
-#if YY_ALWAYS_INTERACTIVE
- b->yy_is_interactive = 1;
-#else
-#if YY_NEVER_INTERACTIVE
- b->yy_is_interactive = 0;
-#else
- b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-#endif
-#endif
- }
-
-
-#ifdef YY_USE_PROTOS
-void yy_flush_buffer( YY_BUFFER_STATE b )
-#else
-void yy_flush_buffer( b )
-YY_BUFFER_STATE b;
-#endif
-
- {
- if ( ! b )
+ /* If b is the current buffer, then yy_init_buffer was _probably_
+ * called from yyrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void yy_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
return;
b->yy_n_chars = 0;
@@ -1540,29 +1768,121 @@ YY_BUFFER_STATE b;
b->yy_at_bol = 1;
b->yy_buffer_status = YY_BUFFER_NEW;
- if ( b == yy_current_buffer )
- yy_load_buffer_state();
+ if ( b == YY_CURRENT_BUFFER )
+ yy_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ yyensure_buffer_stack();
+
+ /* This block is copied from yy_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from yy_switch_to_buffer. */
+ yy_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void yypop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ yy_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ yy_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
}
+}
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void yyensure_buffer_stack (void)
+{
+ int num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1;
+ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
-#ifndef YY_NO_SCAN_BUFFER
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
-#else
-YY_BUFFER_STATE yy_scan_buffer( base, size )
-char *base;
-yy_size_t size;
-#endif
- {
- YY_BUFFER_STATE b;
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
if ( size < 2 ||
base[size-2] != YY_END_OF_BUFFER_CHAR ||
base[size-1] != YY_END_OF_BUFFER_CHAR )
/* They forgot to leave room for the EOB's. */
return 0;
- b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+ b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
if ( ! b )
YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
@@ -1576,47 +1896,42 @@ yy_size_t size;
b->yy_fill_buffer = 0;
b->yy_buffer_status = YY_BUFFER_NEW;
- yy_switch_to_buffer( b );
+ yy_switch_to_buffer(b );
return b;
- }
-#endif
-
-
-#ifndef YY_NO_SCAN_STRING
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
-#else
-YY_BUFFER_STATE yy_scan_string( yy_str )
-yyconst char *yy_str;
-#endif
- {
- int len;
- for ( len = 0; yy_str[len]; ++len )
- ;
-
- return yy_scan_bytes( yy_str, len );
- }
-#endif
-
-
-#ifndef YY_NO_SCAN_BYTES
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
-#else
-YY_BUFFER_STATE yy_scan_bytes( bytes, len )
-yyconst char *bytes;
-int len;
-#endif
- {
+}
+
+/** Setup the input buffer state to scan a string. The next call to yylex() will
+ * scan from a @e copy of @a str.
+ * @param str a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * yy_scan_bytes() instead.
+ */
+YY_BUFFER_STATE yy_scan_string (yyconst char * yy_str )
+{
+
+ return yy_scan_bytes(yy_str,strlen(yy_str) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_bytes (yyconst char * bytes, int len )
+{
YY_BUFFER_STATE b;
char *buf;
yy_size_t n;
int i;
-
+
/* Get memory for full buffer, including space for trailing EOB's. */
n = len + 2;
- buf = (char *) yy_flex_alloc( n );
+ buf = (char *) yyalloc(n );
if ( ! buf )
YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
@@ -1625,7 +1940,7 @@ int len;
buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
- b = yy_scan_buffer( buf, n );
+ b = yy_scan_buffer(buf,n );
if ( ! b )
YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
@@ -1635,78 +1950,17 @@ int len;
b->yy_is_our_buffer = 1;
return b;
- }
-#endif
-
-
-#ifndef YY_NO_PUSH_STATE
-#ifdef YY_USE_PROTOS
-static void yy_push_state( int new_state )
-#else
-static void yy_push_state( new_state )
-int new_state;
-#endif
- {
- if ( yy_start_stack_ptr >= yy_start_stack_depth )
- {
- yy_size_t new_size;
-
- yy_start_stack_depth += YY_START_STACK_INCR;
- new_size = yy_start_stack_depth * sizeof( int );
-
- if ( ! yy_start_stack )
- yy_start_stack = (int *) yy_flex_alloc( new_size );
-
- else
- yy_start_stack = (int *) yy_flex_realloc(
- (void *) yy_start_stack, new_size );
-
- if ( ! yy_start_stack )
- YY_FATAL_ERROR(
- "out of memory expanding start-condition stack" );
- }
-
- yy_start_stack[yy_start_stack_ptr++] = YY_START;
-
- BEGIN(new_state);
- }
-#endif
-
-
-#ifndef YY_NO_POP_STATE
-static void yy_pop_state()
- {
- if ( --yy_start_stack_ptr < 0 )
- YY_FATAL_ERROR( "start-condition stack underflow" );
-
- BEGIN(yy_start_stack[yy_start_stack_ptr]);
- }
-#endif
-
-
-#ifndef YY_NO_TOP_STATE
-static int yy_top_state()
- {
- return yy_start_stack[yy_start_stack_ptr - 1];
- }
-#endif
+}
#ifndef YY_EXIT_FAILURE
#define YY_EXIT_FAILURE 2
#endif
-#ifdef YY_USE_PROTOS
-static void yy_fatal_error( yyconst char msg[] )
-#else
-static void yy_fatal_error( msg )
-char msg[];
-#endif
- {
- (void) fprintf( stderr, "%s\n", msg );
+static void yy_fatal_error (yyconst char* msg )
+{
+ (void) fprintf( stderr, "%s\n", msg );
exit( YY_EXIT_FAILURE );
- }
-
-
+}
/* Redefine yyless() so it works in section 3 code. */
@@ -1715,68 +1969,145 @@ char msg[];
do \
{ \
/* Undo effects of setting up yytext. */ \
- yytext[yyleng] = yy_hold_char; \
- yy_c_buf_p = yytext + n; \
- yy_hold_char = *yy_c_buf_p; \
- *yy_c_buf_p = '\0'; \
- yyleng = n; \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ yytext[yyleng] = (yy_hold_char); \
+ (yy_c_buf_p) = yytext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ yyleng = yyless_macro_arg; \
} \
while ( 0 )
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int yyget_lineno (void)
+{
+
+ return yylineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *yyget_in (void)
+{
+ return yyin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *yyget_out (void)
+{
+ return yyout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+int yyget_leng (void)
+{
+ return yyleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *yyget_text (void)
+{
+ return yytext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void yyset_lineno (int line_number )
+{
+
+ yylineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see yy_switch_to_buffer
+ */
+void yyset_in (FILE * in_str )
+{
+ yyin = in_str ;
+}
+
+void yyset_out (FILE * out_str )
+{
+ yyout = out_str ;
+}
+
+int yyget_debug (void)
+{
+ return yy_flex_debug;
+}
+
+void yyset_debug (int bdebug )
+{
+ yy_flex_debug = bdebug ;
+}
+
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ yy_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ yypop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ yyfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
-/* Internal utility routines. */
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
#ifndef yytext_ptr
-#ifdef YY_USE_PROTOS
-static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
-#else
-static void yy_flex_strncpy( s1, s2, n )
-char *s1;
-yyconst char *s2;
-int n;
-#endif
- {
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
register int i;
- for ( i = 0; i < n; ++i )
+ for ( i = 0; i < n; ++i )
s1[i] = s2[i];
- }
+}
#endif
#ifdef YY_NEED_STRLEN
-#ifdef YY_USE_PROTOS
-static int yy_flex_strlen( yyconst char *s )
-#else
-static int yy_flex_strlen( s )
-yyconst char *s;
-#endif
- {
+static int yy_flex_strlen (yyconst char * s )
+{
register int n;
- for ( n = 0; s[n]; ++n )
+ for ( n = 0; s[n]; ++n )
;
return n;
- }
+}
#endif
-
-#ifdef YY_USE_PROTOS
-static void *yy_flex_alloc( yy_size_t size )
-#else
-static void *yy_flex_alloc( size )
-yy_size_t size;
-#endif
- {
+void *yyalloc (yy_size_t size )
+{
return (void *) malloc( size );
- }
+}
-#ifdef YY_USE_PROTOS
-static void *yy_flex_realloc( void *ptr, yy_size_t size )
-#else
-static void *yy_flex_realloc( ptr, size )
-void *ptr;
-yy_size_t size;
-#endif
- {
+void *yyrealloc (void * ptr, yy_size_t size )
+{
/* The cast to (char *) in the following accommodates both
* implementations that use char* generic pointers, and those
* that use void* generic pointers. It works with the latter
@@ -1785,23 +2116,25 @@ yy_size_t size;
* as though doing an assignment.
*/
return (void *) realloc( (char *) ptr, size );
- }
+}
-#ifdef YY_USE_PROTOS
-static void yy_flex_free( void *ptr )
-#else
-static void yy_flex_free( ptr )
-void *ptr;
-#endif
- {
- free( ptr );
- }
+void yyfree (void * ptr )
+{
+ free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
+}
-#if YY_MAIN
-int main()
- {
- yylex();
- return 0;
- }
+#define YYTABLES_NAME "yytables"
+
+#undef YY_NEW_FILE
+#undef YY_FLUSH_BUFFER
+#undef yy_set_bol
+#undef yy_new_buffer
+#undef yy_set_interactive
+#undef yytext_ptr
+#undef YY_DO_BEFORE_ACTION
+
+#ifdef YY_DECL_IS_OURS
+#undef YY_DECL_IS_OURS
+#undef YY_DECL
#endif
-#line 89 "testpatternl.l"
+#line 125 "testpatternl.l"
diff --git a/src/testpattern/testpatternl.l b/src/testpattern/testpatternl.l
index b096d4c..96eb976 100644
--- a/src/testpattern/testpatternl.l
+++ b/src/testpattern/testpatternl.l
@@ -1,5 +1,5 @@
/*
- * "$Id: testpatternl.l,v 1.2.6.1 2002/07/23 00:54:08 rlk Exp $"
+ * "$Id: testpatternl.l,v 1.16 2004/04/14 02:21:21 rlk Exp $"
*
* Test pattern generator for Gimp-Print
*
@@ -35,11 +35,30 @@
int mylineno = 1;
-#if 0
-#define DBG(x) fprintf(stderr, "'%s'%s\n", yytext, #x);
-#else
-#define DBG(x)
-#endif
+static char *
+c_strstrip(char *s)
+{
+ size_t len = strlen(s);
+ if (len >= 2 && ((s[0] == '"' && s[len - 1] == '"') ||
+ (s[0] == '\'' && s[len - 1] == '\'')))
+ {
+ char *sn = malloc(len - 1);
+ memcpy(sn, s + 1, len - 2);
+ sn[len - 2] = '\0';
+ return sn;
+ }
+ else
+ return (char *) s;
+}
+
+#define DBG(x) \
+do \
+ { \
+ if (getenv("STP_TESTPATTERN_DEBUG")) \
+ fprintf(stderr, "'%s' => %s\n", yytext, #x); \
+ } \
+ while (0)
+
%}
@@ -48,41 +67,58 @@ int mylineno = 1;
digit [0-9]
integer [-+]?{digit}+
float [-+]?{digit}+(\.{digit}+)?([eE][-+]?{digit}+)?
-string ([\"][^\"\n]+[\"])|([^ \t\n"]+)
+string ([\"][^\"]+[\"])|([a-zA-Z0-9_][-a-zA-Z0-9_]*)|([\'][^\']*[\'])
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;
-image DBG(IMAGE) return IMAGE;
+cyan yylval.sval = yytext;DBG(CYAN); return CYAN;
+l_cyan yylval.sval = yytext;DBG(L_CYAN); return L_CYAN;
+magenta yylval.sval = yytext;DBG(MAGENTA); return MAGENTA;
+l_magenta yylval.sval = yytext;DBG(L_MAGENTA); return L_MAGENTA;
+yellow yylval.sval = yytext;DBG(YELLOW); return YELLOW;
+d_yellow yylval.sval = yytext;DBG(D_YELLOW); return D_YELLOW;
+black yylval.sval = yytext;DBG(BLACK); return BLACK;
+l_black yylval.sval = yytext;DBG(L_BLACK); return L_BLACK;
+gamma DBG(GAMMA); return GAMMA;
+level DBG(LEVEL); return LEVEL;
+steps DBG(STEPS); return STEPS;
+ink_limit DBG(INK_LIMIT); return INK_LIMIT;
+printer DBG(PRINTER); return PRINTER;
+parameter DBG(PARAMETER); return PARAMETER;
+parameter_int DBG(PARAMETER_INT); return PARAMETER_INT;
+parameter_string DBG(PARAMETER); return PARAMETER;
+parameter_float DBG(PARAMETER_FLOAT); return PARAMETER_FLOAT;
+parameter_curve DBG(PARAMETER_CURVE); return PARAMETER_CURVE;
+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;
+xpattern DBG(XPATTERN); return XPATTERN;
+image DBG(IMAGE); return IMAGE;
+extended DBG(EXTENDED); return EXTENDED;
+grid DBG(GRID); return GRID;
+channel DBG(CHANNEL); return CHANNEL;
+page_size DBG(PAGESIZE); return PAGESIZE;
+; DBG(SEMI); return SEMI;
+mode DBG(MODE); return MODE;
+cmyk yylval.ival = CMYK;DBG(CMYK); return CMYK;
+kcmy yylval.ival = CMYK;DBG(KCMY); return KCMY;
+rgb yylval.ival = RGB;DBG(RGB); return RGB;
+cmy yylval.ival = RGB;DBG(CMY); return CMY;
+grey yylval.ival = GRAY;DBG(GRAY); return GRAY;
+gray yylval.ival = GRAY;DBG(GRAY); return GRAY;
+white yylval.ival = WHITE;DBG(WHITE); return WHITE;
+message DBG(MESSAGE); return MESSAGE;
+end DBG(END); return END;
+
-{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++;
+{integer} yylval.ival = atoi(yytext); DBG(tINT); return tINT;
+{float} yylval.dval = strtod(yytext, NULL); DBG(tDOUBLE); return tDOUBLE;
+{string} yylval.sval = c_strstrip(yytext); DBG(tSTRING); return tSTRING;
+{ws} DBG(whitespace); /* Skip blanks/tabs */
+#[^\n]* DBG(comment); /* Skip comments */
+\n DBG(newline); mylineno++;
diff --git a/src/testpattern/testpatterny.c b/src/testpattern/testpatterny.c
index c6d3542..073282d 100644
--- a/src/testpattern/testpatterny.c
+++ b/src/testpattern/testpatterny.c
@@ -1,41 +1,153 @@
+/* A Bison parser, made by GNU Bison 1.875d. */
-/* A Bison parser, made from testpatterny.y
- by GNU Bison version 1.25
- */
-
-#define YYBISON 1 /* Identify Bison output. */
-
-#define tINT 258
-#define tDOUBLE 259
-#define tSTRING 260
-#define C_GAMMA 261
-#define M_GAMMA 262
-#define Y_GAMMA 263
-#define K_GAMMA 264
-#define GAMMA 265
-#define C_LEVEL 266
-#define M_LEVEL 267
-#define Y_LEVEL 268
-#define LEVELS 269
-#define INK_LIMIT 270
-#define INK 271
-#define WIDTH 272
-#define PRINTER 273
-#define INK_TYPE 274
-#define RESOLUTION 275
-#define MEDIA_SOURCE 276
-#define MEDIA_TYPE 277
-#define MEDIA_SIZE 278
-#define DITHER_ALGORITHM 279
-#define DENSITY 280
-#define TOP 281
-#define LEFT 282
-#define HSIZE 283
-#define VSIZE 284
-#define BLACKLINE 285
-#define PATTERN 286
-#define IMAGE 287
+/* Skeleton parser for Yacc-like parsing with Bison,
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+ 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. */
+
+/* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+/* Written by Richard Stallman by simplifying the original so called
+ ``semantic'' parser. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output. */
+#define YYBISON 1
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 0
+
+/* Using locations. */
+#define YYLSP_NEEDED 0
+
+
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ tINT = 258,
+ tDOUBLE = 259,
+ tSTRING = 260,
+ CYAN = 261,
+ L_CYAN = 262,
+ MAGENTA = 263,
+ L_MAGENTA = 264,
+ YELLOW = 265,
+ D_YELLOW = 266,
+ BLACK = 267,
+ L_BLACK = 268,
+ GAMMA = 269,
+ LEVEL = 270,
+ STEPS = 271,
+ INK_LIMIT = 272,
+ PRINTER = 273,
+ PARAMETER = 274,
+ PARAMETER_INT = 275,
+ PARAMETER_FLOAT = 276,
+ PARAMETER_CURVE = 277,
+ DENSITY = 278,
+ TOP = 279,
+ LEFT = 280,
+ HSIZE = 281,
+ VSIZE = 282,
+ BLACKLINE = 283,
+ PATTERN = 284,
+ XPATTERN = 285,
+ EXTENDED = 286,
+ IMAGE = 287,
+ GRID = 288,
+ SEMI = 289,
+ CHANNEL = 290,
+ CMYK = 291,
+ KCMY = 292,
+ RGB = 293,
+ CMY = 294,
+ GRAY = 295,
+ WHITE = 296,
+ RAW = 297,
+ MODE = 298,
+ PAGESIZE = 299,
+ MESSAGE = 300,
+ END = 301
+ };
+#endif
+#define tINT 258
+#define tDOUBLE 259
+#define tSTRING 260
+#define CYAN 261
+#define L_CYAN 262
+#define MAGENTA 263
+#define L_MAGENTA 264
+#define YELLOW 265
+#define D_YELLOW 266
+#define BLACK 267
+#define L_BLACK 268
+#define GAMMA 269
+#define LEVEL 270
+#define STEPS 271
+#define INK_LIMIT 272
+#define PRINTER 273
+#define PARAMETER 274
+#define PARAMETER_INT 275
+#define PARAMETER_FLOAT 276
+#define PARAMETER_CURVE 277
+#define DENSITY 278
+#define TOP 279
+#define LEFT 280
+#define HSIZE 281
+#define VSIZE 282
+#define BLACKLINE 283
+#define PATTERN 284
+#define XPATTERN 285
+#define EXTENDED 286
+#define IMAGE 287
+#define GRID 288
+#define SEMI 289
+#define CHANNEL 290
+#define CMYK 291
+#define KCMY 292
+#define RGB 293
+#define CMY 294
+#define GRAY 295
+#define WHITE 296
+#define RAW 297
+#define MODE 298
+#define PAGESIZE 299
+#define MESSAGE 300
+#define END 301
+
+
+
+
+/* Copy the first part of user declarations. */
#line 23 "testpatterny.y"
@@ -54,7 +166,6 @@ extern int yylex(void);
char *quotestrip(const char *i);
char *endstrip(const char *i);
-extern int mylineno;
extern char* yytext;
static int yyerror( const char *s )
@@ -63,464 +174,925 @@ static int yyerror( const char *s )
return 0;
}
-#include <stdio.h>
+typedef struct
+{
+ const char *name;
+ int channel;
+} color_t;
+
+static color_t color_map[] =
+ {
+ { "black", 0 },
+ { "cyan", 1 },
+ { "red", 1 },
+ { "magenta", 2 },
+ { "green", 2 },
+ { "yellow", 3 },
+ { "blue", 3 },
+ { "l_black", 4 },
+ { "l_cyan", 5 },
+ { "l_magenta", 6 },
+ { "d_yellow", 4 },
+ { NULL, -1 }
+ };
+
+static int current_index = 0;
+static testpattern_t *current_testpattern;
+extern FILE *yyin;
+
+static int
+find_color(const char *name)
+{
+ int i = 0;
+ while (color_map[i].name)
+ {
+ if (strcmp(color_map[i].name, name) == 0)
+ return color_map[i].channel;
+ i++;
+ }
+ return -1;
+}
-#ifndef __cplusplus
-#ifndef __STDC__
-#define const
+
+
+/* Enabling traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
#endif
+
+/* Enabling verbose error messages. */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
#endif
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+typedef int YYSTYPE;
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
-#define YYFINAL 103
-#define YYFLAG -32768
-#define YYNTBASE 33
-
-#define YYTRANSLATE(x) ((unsigned)(x) <= 287 ? yytranslate[x] : 65)
-
-static const char yytranslate[] = { 0,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 1, 2, 3, 4, 5,
- 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
- 26, 27, 28, 29, 30, 31, 32
-};
-#if YYDEBUG != 0
-static const short yyprhs[] = { 0,
- 0, 3, 6, 9, 12, 15, 18, 21, 24, 27,
- 30, 33, 36, 39, 42, 45, 48, 51, 54, 57,
- 60, 63, 66, 69, 88, 92, 93, 95, 97, 99,
- 101, 103, 105, 107, 109, 111, 113, 115, 117, 119,
- 121, 123, 125, 127, 129, 131, 133, 135, 137, 139,
- 142, 144, 146, 149, 151, 153, 155
-};
+/* Copy the second part of user declarations. */
-static const short yyrhs[] = { 11,
- 4, 0, 12, 4, 0, 13, 4, 0, 6, 4,
- 0, 7, 4, 0, 8, 4, 0, 9, 4, 0,
- 10, 4, 0, 14, 3, 0, 15, 4, 0, 18,
- 5, 0, 19, 5, 0, 20, 5, 0, 21, 5,
- 0, 22, 5, 0, 23, 5, 0, 24, 5, 0,
- 25, 4, 0, 26, 4, 0, 27, 4, 0, 28,
- 4, 0, 29, 4, 0, 30, 3, 0, 31, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 0, 32, 3, 3,
- 0, 0, 33, 0, 34, 0, 35, 0, 36, 0,
- 37, 0, 38, 0, 39, 0, 40, 0, 41, 0,
- 42, 0, 43, 0, 44, 0, 45, 0, 46, 0,
- 47, 0, 48, 0, 49, 0, 50, 0, 51, 0,
- 52, 0, 53, 0, 54, 0, 55, 0, 60, 56,
- 0, 58, 0, 57, 0, 62, 59, 0, 58, 0,
- 60, 0, 61, 0, 62, 63, 58, 0
-};
-#endif
+/* Line 214 of yacc.c. */
+#line 245 "testpatterny.c"
-#if YYDEBUG != 0
-static const short yyrline[] = { 0,
- 87, 90, 93, 96, 99, 102, 105, 108, 111, 114,
- 117, 120, 123, 126, 129, 132, 135, 138, 141, 144,
- 147, 150, 153, 157, 183, 197, 199, 199, 199, 200,
- 200, 200, 200, 201, 201, 201, 201, 201, 201, 202,
- 202, 202, 202, 202, 203, 203, 203, 203, 203, 205,
- 205, 207, 209, 209, 211, 211, 213
-};
-#endif
+#if ! defined (yyoverflow) || YYERROR_VERBOSE
+# ifndef YYFREE
+# define YYFREE free
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# endif
-#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# define YYSTACK_ALLOC alloca
+# endif
+# else
+# if defined (alloca) || defined (_ALLOCA_H)
+# define YYSTACK_ALLOC alloca
+# else
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's `empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+# if defined (__STDC__) || defined (__cplusplus)
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# endif
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# endif
+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+
+
+#if (! defined (yyoverflow) \
+ && (! defined (__cplusplus) \
+ || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ short int yyss;
+ YYSTYPE yyvs;
+ };
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined (__GNUC__) && 1 < __GNUC__
+# define YYCOPY(To, From, Count) \
+ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+# else
+# define YYCOPY(To, From, Count) \
+ do \
+ { \
+ register YYSIZE_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (To)[yyi] = (From)[yyi]; \
+ } \
+ while (0)
+# endif
+# endif
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack) \
+ do \
+ { \
+ YYSIZE_T yynewbytes; \
+ YYCOPY (&yyptr->Stack, Stack, yysize); \
+ Stack = &yyptr->Stack; \
+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / sizeof (*yyptr); \
+ } \
+ while (0)
-static const char * const yytname[] = { "$","error","$undefined.","tINT","tDOUBLE",
-"tSTRING","C_GAMMA","M_GAMMA","Y_GAMMA","K_GAMMA","GAMMA","C_LEVEL","M_LEVEL",
-"Y_LEVEL","LEVELS","INK_LIMIT","INK","WIDTH","PRINTER","INK_TYPE","RESOLUTION",
-"MEDIA_SOURCE","MEDIA_TYPE","MEDIA_SIZE","DITHER_ALGORITHM","DENSITY","TOP",
-"LEFT","HSIZE","VSIZE","BLACKLINE","PATTERN","IMAGE","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","image","Empty","Rule","Patterns","Image","Rules",
-"Output","Thing", NULL
-};
#endif
-static const short yyr1[] = { 0,
- 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
- 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
- 53, 54, 55, 56, 57, 58, 59, 59, 59, 59,
- 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
- 59, 59, 59, 59, 59, 59, 59, 59, 59, 60,
- 60, 61, 62, 62, 63, 63, 64
-};
+#if defined (__STDC__) || defined (__cplusplus)
+ typedef signed char yysigned_char;
+#else
+ typedef short int yysigned_char;
+#endif
-static const short yyr2[] = { 0,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 18, 3, 0, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
- 1, 1, 2, 1, 1, 1, 3
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 52
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 131
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 47
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 65
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 115
+/* YYNRULES -- Number of states. */
+#define YYNSTATES 170
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
+#define YYUNDEFTOK 2
+#define YYMAXUTOK 301
+
+#define YYTRANSLATE(YYX) \
+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
+static const unsigned char yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
+ 45, 46
};
-static const short yydefact[] = { 26,
- 54, 26, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 27, 28, 29, 30,
- 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 52,
- 51, 53, 55, 56, 26, 4, 5, 6, 7, 8,
- 1, 2, 3, 9, 10, 11, 12, 13, 14, 15,
- 16, 17, 18, 19, 20, 21, 22, 23, 0, 0,
- 50, 57, 25, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,
- 0, 0, 0
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+ YYRHS. */
+static const unsigned short int yyprhs[] =
+{
+ 0, 0, 3, 5, 7, 9, 11, 13, 15, 17,
+ 19, 22, 25, 28, 31, 34, 37, 41, 43, 45,
+ 47, 49, 51, 53, 55, 58, 62, 66, 70, 74,
+ 77, 80, 83, 86, 89, 93, 95, 97, 101, 105,
+ 109, 111, 113, 115, 118, 121, 124, 127, 130, 133,
+ 137, 139, 142, 143, 145, 148, 153, 159, 161, 163,
+ 165, 168, 169, 171, 173, 175, 181, 185, 188, 191,
+ 195, 198, 202, 207, 213, 220, 222, 224, 226, 228,
+ 230, 232, 234, 236, 238, 240, 242, 244, 246, 248,
+ 250, 252, 254, 256, 258, 260, 262, 264, 266, 268,
+ 271, 273, 275, 277, 279, 282, 283, 286, 288, 289,
+ 292, 294, 296, 297, 300, 301
};
-static const short yydefgoto[] = { 27,
- 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
- 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
- 48, 49, 81, 50, 1, 52, 53, 54, 2, 55,
- 101
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yysigned_char yyrhs[] =
+{
+ 110, 0, -1, 6, -1, 7, -1, 8, -1, 9,
+ -1, 10, -1, 11, -1, 12, -1, 13, -1, 36,
+ 3, -1, 37, 3, -1, 38, 3, -1, 39, 3,
+ -1, 40, 3, -1, 41, 3, -1, 31, 3, 3,
+ -1, 49, -1, 50, -1, 51, -1, 52, -1, 53,
+ -1, 54, -1, 55, -1, 43, 56, -1, 15, 48,
+ 4, -1, 15, 3, 4, -1, 14, 48, 4, -1,
+ 14, 3, 4, -1, 14, 4, -1, 16, 3, -1,
+ 17, 4, -1, 18, 5, -1, 44, 5, -1, 44,
+ 3, 3, -1, 66, -1, 67, -1, 19, 5, 5,
+ -1, 20, 5, 3, -1, 21, 5, 4, -1, 69,
+ -1, 70, -1, 71, -1, 23, 4, -1, 24, 4,
+ -1, 25, 4, -1, 26, 4, -1, 27, 4, -1,
+ 28, 3, -1, 4, 4, 4, -1, 79, -1, 80,
+ 79, -1, -1, 80, -1, 79, 81, -1, 48, 4,
+ 4, 4, -1, 35, 3, 4, 4, 4, -1, 83,
+ -1, 84, -1, 85, -1, 86, 85, -1, -1, 86,
+ -1, 82, -1, 87, -1, 4, 4, 4, 4, 4,
+ -1, 29, 89, 88, -1, 30, 88, -1, 33, 3,
+ -1, 32, 3, 3, -1, 45, 5, -1, 45, 5,
+ 5, -1, 45, 5, 5, 5, -1, 45, 5, 5,
+ 5, 5, -1, 45, 5, 5, 5, 5, 5, -1,
+ 94, -1, 95, -1, 96, -1, 97, -1, 98, -1,
+ 99, -1, 60, -1, 61, -1, 58, -1, 59, -1,
+ 62, -1, 63, -1, 64, -1, 65, -1, 72, -1,
+ 73, -1, 74, -1, 75, -1, 76, -1, 77, -1,
+ 78, -1, 57, -1, 68, -1, 100, -1, 101, 34,
+ -1, 90, -1, 91, -1, 92, -1, 100, -1, 103,
+ 34, -1, -1, 105, 104, -1, 93, -1, -1, 107,
+ 102, -1, 105, -1, 106, -1, -1, 46, 34, -1,
+ -1, 107, 111, 108, 109, -1
};
-static const short yypact[] = {-32768,
--32768, -5, 7, 8, 22, 24, 25, 26, 27, 28,
- 30, 31, 29, 32, 33, 34, 35, 36, 37, 39,
- 40, 41, 42, 43, 45, 46,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768, 5,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 47, 48,
--32768,-32768,-32768, 50, 51, 52, 53, 54, 55, 56,
- 57, 58, 59, 60, 61, 62, 63, 64, 65,-32768,
- 70, 71,-32768
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const unsigned short int yyrline[] =
+{
+ 0, 139, 139, 139, 139, 139, 140, 140, 140, 140,
+ 143, 155, 167, 179, 191, 203, 215, 227, 227, 227,
+ 227, 227, 227, 227, 230, 233, 243, 252, 262, 271,
+ 278, 285, 292, 301, 310, 319, 319, 322, 332, 341,
+ 364, 364, 364, 366, 373, 380, 387, 394, 401, 409,
+ 424, 424, 427, 427, 430, 433, 447, 460, 460, 463,
+ 463, 466, 466, 469, 469, 472, 487, 490, 505, 516,
+ 533, 539, 546, 554, 563, 574, 574, 574, 574, 574,
+ 577, 580, 580, 580, 580, 580, 580, 581, 581, 581,
+ 581, 581, 581, 581, 582, 582, 582, 582, 582, 585,
+ 589, 589, 589, 589, 592, 596, 596, 599, 603, 603,
+ 606, 606, 609, 609, 614, 613
};
+#endif
-static const short yypgoto[] = {-32768,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
--32768,-32768,-32768,-32768, -2,-32768,-32768,-32768,-32768,-32768,
--32768
+#if YYDEBUG || YYERROR_VERBOSE
+/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "$end", "error", "$undefined", "tINT", "tDOUBLE", "tSTRING", "CYAN",
+ "L_CYAN", "MAGENTA", "L_MAGENTA", "YELLOW", "D_YELLOW", "BLACK",
+ "L_BLACK", "GAMMA", "LEVEL", "STEPS", "INK_LIMIT", "PRINTER",
+ "PARAMETER", "PARAMETER_INT", "PARAMETER_FLOAT", "PARAMETER_CURVE",
+ "DENSITY", "TOP", "LEFT", "HSIZE", "VSIZE", "BLACKLINE", "PATTERN",
+ "XPATTERN", "EXTENDED", "IMAGE", "GRID", "SEMI", "CHANNEL", "CMYK",
+ "KCMY", "RGB", "CMY", "GRAY", "WHITE", "RAW", "MODE", "PAGESIZE",
+ "MESSAGE", "END", "$accept", "COLOR", "cmykspec", "kcmyspec", "rgbspec",
+ "cmyspec", "grayspec", "whitespec", "extendedspec", "modespec",
+ "inputspec", "level", "channel_level", "gamma", "channel_gamma",
+ "global_gamma", "steps", "ink_limit", "printer", "page_size_name",
+ "page_size_custom", "page_size", "parameter_string", "parameter_int",
+ "parameter_float", "parameter", "density", "top", "left", "hsize",
+ "vsize", "blackline", "color_block1", "color_blocks1a", "color_blocks1b",
+ "color_blocks1", "color_block2a", "color_block2b", "color_block2",
+ "color_blocks2a", "color_blocks2", "color_blocks", "patvars", "pattern",
+ "xpattern", "grid", "image", "Message0", "Message1", "Message2",
+ "Message3", "Message4", "A_Message", "message", "A_Rule", "Rule",
+ "A_Pattern", "Pattern", "Patterns", "Image", "Rules", "Output", "EOF",
+ "Thing", "@1", 0
};
+#endif
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+ token YYLEX-NUM. */
+static const unsigned short int yytoknum[] =
+{
+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
+ 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
+ 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
+ 295, 296, 297, 298, 299, 300, 301
+};
+# endif
-#define YYLAST 71
-
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const unsigned char yyr1[] =
+{
+ 0, 47, 48, 48, 48, 48, 48, 48, 48, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, 56, 56,
+ 56, 56, 56, 56, 57, 58, 59, 60, 61, 62,
+ 63, 64, 65, 66, 67, 68, 68, 69, 70, 71,
+ 72, 72, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 80, 81, 81, 82, 83, 84, 85, 85, 86,
+ 86, 87, 87, 88, 88, 89, 90, 91, 92, 93,
+ 94, 95, 96, 97, 98, 99, 99, 99, 99, 99,
+ 100, 101, 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101, 101, 102,
+ 103, 103, 103, 103, 104, 105, 105, 106, 107, 107,
+ 108, 108, 109, 109, 111, 110
+};
-static const short yytable[] = { 51,
- 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
- 56, 57, 13, 14, 15, 16, 17, 18, 19, 20,
- 21, 22, 23, 24, 25, 58, 26, 59, 60, 61,
- 62, 63, 64, 66, 65, 80, 67, 68, 69, 70,
- 71, 72, 73, 74, 75, 76, 77, 78, 79, 83,
- 0, 84, 82, 85, 86, 87, 88, 89, 90, 91,
- 92, 93, 94, 95, 96, 97, 98, 99, 100, 102,
- 103
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const unsigned char yyr2[] =
+{
+ 0, 2, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2, 2, 3, 1, 1, 1,
+ 1, 1, 1, 1, 2, 3, 3, 3, 3, 2,
+ 2, 2, 2, 2, 3, 1, 1, 3, 3, 3,
+ 1, 1, 1, 2, 2, 2, 2, 2, 2, 3,
+ 1, 2, 0, 1, 2, 4, 5, 1, 1, 1,
+ 2, 0, 1, 1, 1, 5, 3, 2, 2, 3,
+ 2, 3, 4, 5, 6, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+ 1, 1, 1, 1, 2, 0, 2, 1, 0, 2,
+ 1, 1, 0, 2, 0, 4
};
-static const short yycheck[] = { 2,
- 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 4, 4, 18, 19, 20, 21, 22, 23, 24, 25,
- 26, 27, 28, 29, 30, 4, 32, 4, 4, 4,
- 4, 4, 3, 5, 4, 31, 5, 5, 5, 5,
- 5, 5, 4, 4, 4, 4, 4, 3, 3, 3,
- -1, 4, 55, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 0,
- 0
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+ STATE-NUM when YYTABLE doesn't specify something else to do. Zero
+ means the default is an error. */
+static const unsigned char yydefact[] =
+{
+ 108, 114, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 96, 83, 84, 81, 82, 85, 86, 87, 88, 35,
+ 36, 97, 40, 41, 42, 89, 90, 91, 92, 93,
+ 94, 95, 75, 76, 77, 78, 79, 80, 98, 0,
+ 109, 105, 1, 0, 29, 2, 3, 4, 5, 6,
+ 7, 8, 9, 0, 0, 0, 30, 31, 32, 0,
+ 0, 0, 43, 44, 45, 46, 47, 48, 0, 0,
+ 0, 0, 0, 0, 0, 17, 18, 19, 20, 21,
+ 22, 23, 24, 0, 33, 70, 99, 0, 107, 110,
+ 111, 112, 28, 27, 26, 25, 37, 38, 39, 0,
+ 10, 11, 12, 13, 14, 15, 34, 71, 0, 0,
+ 61, 0, 100, 101, 102, 103, 0, 106, 0, 115,
+ 16, 72, 69, 0, 61, 0, 0, 0, 52, 63,
+ 57, 58, 59, 62, 64, 67, 68, 104, 113, 73,
+ 0, 66, 0, 0, 0, 50, 53, 54, 60, 74,
+ 0, 49, 0, 0, 51, 0, 0, 55, 65, 56
};
-/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
-#line 3 "/usr/share/bison.simple"
-/* Skeleton output parser for bison,
- Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
+/* YYDEFGOTO[NTERM-NUM]. */
+static const short int yydefgoto[] =
+{
+ -1, 137, 85, 86, 87, 88, 89, 90, 91, 92,
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 138, 156, 157, 139, 140, 141, 142, 143,
+ 144, 145, 134, 122, 123, 124, 98, 42, 43, 44,
+ 45, 46, 47, 48, 49, 50, 126, 127, 99, 100,
+ 1, 101, 129, 2, 51
+};
- 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.
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+#define YYPACT_NINF -131
+static const short int yypact[] =
+{
+ -131, -14, 16, 56, 41, 25, 36, 38, 53, 66,
+ 67, 69, 70, 77, 78, 79, 81, 39, 22, 80,
+ -131, -131, -131, -131, -131, -131, -131, -131, -131, -131,
+ -131, -131, -131, -131, -131, -131, -131, -131, -131, -131,
+ -131, -131, -131, -131, -131, -131, -131, -131, -131, 54,
+ -131, 55, -131, 82, -131, -131, -131, -131, -131, -131,
+ -131, -131, -131, 85, 86, 87, -131, -131, -131, 88,
+ 89, 90, -131, -131, -131, -131, -131, -131, 92, 93,
+ 94, 95, 96, 97, 98, -131, -131, -131, -131, -131,
+ -131, -131, -131, 99, -131, 100, -131, 101, -131, 12,
+ -131, 57, -131, -131, -131, -131, -131, -131, -131, 103,
+ -131, -131, -131, -131, -131, -131, -131, 102, 105, 106,
+ 11, 108, -131, -131, -131, -131, 75, -131, 83, -131,
+ -131, 107, -131, 109, 11, 110, 112, 114, 115, -131,
+ -131, -131, -131, 26, -131, -131, -131, -131, -131, 111,
+ 116, -131, 117, 118, 119, -131, 115, -131, -131, -131,
+ 120, -131, 121, 122, -131, 123, 124, -131, -131, -131
+};
- 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.
+/* YYPGOTO[NTERM-NUM]. */
+static const short int yypgoto[] =
+{
+ -131, 52, -131, -131, -131, -131, -131, -131, -131, -131,
+ -131, -131, -131, -131, -131, -131, -131, -131, -131, -131,
+ -131, -131, -131, -131, -131, -131, -131, -131, -131, -131,
+ -131, -131, -130, -131, -131, -131, -131, -131, -13, -131,
+ -131, -5, -131, -131, -131, -131, -131, -131, -131, -131,
+ -131, -131, -131, 32, -131, -131, -131, -131, -131, -131,
+ -131, -131, -131, -131, -131
+};
- 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. */
+/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule which
+ number is the opposite. If zero, do what YYDEFACT says.
+ If YYTABLE_NINF, syntax error. */
+#define YYTABLE_NINF -1
+static const unsigned char yytable[] =
+{
+ 3, 4, 5, 6, 7, 8, 9, 10, 155, 11,
+ 12, 13, 14, 15, 16, 135, 52, 55, 56, 57,
+ 58, 59, 60, 61, 62, 93, 164, 94, 66, 17,
+ 18, 19, 55, 56, 57, 58, 59, 60, 61, 62,
+ 67, 119, 120, 68, 64, 121, 136, 55, 56, 57,
+ 58, 59, 60, 61, 62, 63, 65, 19, 69, 53,
+ 54, 136, 55, 56, 57, 58, 59, 60, 61, 62,
+ 78, 70, 71, 72, 73, 79, 80, 81, 82, 83,
+ 84, 74, 75, 76, 77, 95, 102, 97, 96, 103,
+ 104, 105, 107, 106, 108, 109, 110, 111, 112, 113,
+ 114, 115, 116, 128, 118, 117, 130, 131, 132, 147,
+ 133, 146, 149, 150, 152, 153, 159, 148, 154, 135,
+ 160, 161, 162, 163, 165, 166, 167, 168, 169, 151,
+ 158, 125
+};
-/* As a special exception, when this file is copied by Bison into a
- Bison output file, you may use that output file without restriction.
- This special exception was added by the Free Software Foundation
- in version 1.24 of Bison. */
+static const unsigned char yycheck[] =
+{
+ 14, 15, 16, 17, 18, 19, 20, 21, 138, 23,
+ 24, 25, 26, 27, 28, 4, 0, 6, 7, 8,
+ 9, 10, 11, 12, 13, 3, 156, 5, 3, 43,
+ 44, 45, 6, 7, 8, 9, 10, 11, 12, 13,
+ 4, 29, 30, 5, 3, 33, 35, 6, 7, 8,
+ 9, 10, 11, 12, 13, 3, 4, 45, 5, 3,
+ 4, 35, 6, 7, 8, 9, 10, 11, 12, 13,
+ 31, 5, 5, 4, 4, 36, 37, 38, 39, 40,
+ 41, 4, 4, 4, 3, 5, 4, 32, 34, 4,
+ 4, 4, 3, 5, 4, 3, 3, 3, 3, 3,
+ 3, 3, 3, 46, 3, 5, 3, 5, 3, 34,
+ 4, 3, 5, 4, 4, 3, 5, 34, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 134,
+ 143, 99
+};
-#ifndef alloca
-#ifdef __GNUC__
-#define alloca __builtin_alloca
-#else /* not GNU C. */
-#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
-#include <alloca.h>
-#else /* not sparc */
-#if defined (MSDOS) && !defined (__TURBOC__)
-#include <malloc.h>
-#else /* not MSDOS, or __TURBOC__ */
-#if defined(_AIX)
-#include <malloc.h>
- #pragma alloca
-#else /* not MSDOS, __TURBOC__, or _AIX */
-#ifdef __hpux
-#ifdef __cplusplus
-extern "C" {
-void *alloca (unsigned int);
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
+static const unsigned char yystos[] =
+{
+ 0, 107, 110, 14, 15, 16, 17, 18, 19, 20,
+ 21, 23, 24, 25, 26, 27, 28, 43, 44, 45,
+ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
+ 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
+ 77, 78, 94, 95, 96, 97, 98, 99, 100, 101,
+ 102, 111, 0, 3, 4, 6, 7, 8, 9, 10,
+ 11, 12, 13, 48, 3, 48, 3, 4, 5, 5,
+ 5, 5, 4, 4, 4, 4, 4, 3, 31, 36,
+ 37, 38, 39, 40, 41, 49, 50, 51, 52, 53,
+ 54, 55, 56, 3, 5, 5, 34, 32, 93, 105,
+ 106, 108, 4, 4, 4, 4, 5, 3, 4, 3,
+ 3, 3, 3, 3, 3, 3, 3, 5, 3, 29,
+ 30, 33, 90, 91, 92, 100, 103, 104, 46, 109,
+ 3, 5, 3, 4, 89, 4, 35, 48, 79, 82,
+ 83, 84, 85, 86, 87, 88, 3, 34, 34, 5,
+ 4, 88, 4, 3, 4, 79, 80, 81, 85, 5,
+ 4, 4, 4, 4, 79, 4, 4, 4, 4, 4
};
-#else /* not __cplusplus */
-void *alloca ();
-#endif /* not __cplusplus */
-#endif /* __hpux */
-#endif /* not _AIX */
-#endif /* not MSDOS, or __TURBOC__ */
-#endif /* not sparc. */
-#endif /* not GNU C. */
-#endif /* alloca not defined. */
-
-/* This is the parser code that is written into each bison parser
- when the %semantic_parser declaration is not specified in the grammar.
- It was written by Richard Stallman by simplifying the hairy parser
- used when %semantic_parser is specified. */
-
-/* Note: there must be only one dollar sign in this file.
- It is replaced by the list of actions, each action
- as one case of the switch. */
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# if defined (__STDC__) || defined (__cplusplus)
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
#define yyerrok (yyerrstatus = 0)
#define yyclearin (yychar = YYEMPTY)
-#define YYEMPTY -2
+#define YYEMPTY (-2)
#define YYEOF 0
-#define YYACCEPT return(0)
-#define YYABORT return(1)
-#define YYERROR goto yyerrlab1
-/* Like YYERROR except do call yyerror.
- This remains here temporarily to ease the
- transition to the new meaning of YYERROR, for GCC.
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror. This remains here temporarily
+ to ease the transition to the new meaning of YYERROR, for GCC.
Once GCC version 2 has supplanted version 1, this can go. */
+
#define YYFAIL goto yyerrlab
+
#define YYRECOVERING() (!!yyerrstatus)
-#define YYBACKUP(token, value) \
+
+#define YYBACKUP(Token, Value) \
do \
if (yychar == YYEMPTY && yylen == 1) \
- { yychar = (token), yylval = (value); \
- yychar1 = YYTRANSLATE (yychar); \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ yytoken = YYTRANSLATE (yychar); \
YYPOPSTACK; \
goto yybackup; \
} \
else \
- { yyerror ("syntax error: cannot back up"); YYERROR; } \
+ { \
+ yyerror ("syntax error: cannot back up");\
+ YYERROR; \
+ } \
while (0)
#define YYTERROR 1
#define YYERRCODE 256
-#ifndef YYPURE
-#define YYLEX yylex()
-#endif
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+ are run). */
-#ifdef YYPURE
-#ifdef YYLSP_NEEDED
-#ifdef YYLEX_PARAM
-#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM)
-#else
-#define YYLEX yylex(&yylval, &yylloc)
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N) \
+ ((Current).first_line = (Rhs)[1].first_line, \
+ (Current).first_column = (Rhs)[1].first_column, \
+ (Current).last_line = (Rhs)[N].last_line, \
+ (Current).last_column = (Rhs)[N].last_column)
#endif
-#else /* not YYLSP_NEEDED */
+
+/* YYLEX -- calling `yylex' with the right arguments. */
+
#ifdef YYLEX_PARAM
-#define YYLEX yylex(&yylval, YYLEX_PARAM)
+# define YYLEX yylex (YYLEX_PARAM)
#else
-#define YYLEX yylex(&yylval)
+# define YYLEX yylex ()
#endif
-#endif /* not YYLSP_NEEDED */
-#endif
-
-/* If nonreentrant, generate the variables here */
-#ifndef YYPURE
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+
+# define YYDSYMPRINT(Args) \
+do { \
+ if (yydebug) \
+ yysymprint Args; \
+} while (0)
+
+# define YYDSYMPRINTF(Title, Token, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yysymprint (stderr, \
+ Token, Value); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (0)
-int yychar; /* the lookahead symbol */
-YYSTYPE yylval; /* the semantic value of the */
- /* lookahead symbol */
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
-#ifdef YYLSP_NEEDED
-YYLTYPE yylloc; /* location data for the lookahead */
- /* symbol */
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_stack_print (short int *bottom, short int *top)
+#else
+static void
+yy_stack_print (bottom, top)
+ short int *bottom;
+ short int *top;
#endif
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (/* Nothing. */; bottom <= top; ++bottom)
+ YYFPRINTF (stderr, " %d", *bottom);
+ YYFPRINTF (stderr, "\n");
+}
-int yynerrs; /* number of parse errors so far */
-#endif /* not YYPURE */
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (0)
-#if YYDEBUG != 0
-int yydebug; /* nonzero means print parse trace */
-/* Since this is uninitialized, it does not stop multiple parsers
- from coexisting. */
-#endif
-/* YYINITDEPTH indicates the initial size of the parser's stacks */
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_reduce_print (int yyrule)
+#else
+static void
+yy_reduce_print (yyrule)
+ int yyrule;
+#endif
+{
+ int yyi;
+ unsigned int yylno = yyrline[yyrule];
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
+ yyrule - 1, yylno);
+ /* Print the symbols being reduced, and their result. */
+ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+ YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
+ YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (Rule); \
+} while (0)
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YYDSYMPRINT(Args)
+# define YYDSYMPRINTF(Title, Token, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
#ifndef YYINITDEPTH
-#define YYINITDEPTH 200
+# define YYINITDEPTH 200
#endif
-/* YYMAXDEPTH is the maximum size the stacks can grow to
- (effective only if the built-in stack extension method is used). */
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
-#if YYMAXDEPTH == 0
-#undef YYMAXDEPTH
+#if defined (YYMAXDEPTH) && YYMAXDEPTH == 0
+# undef YYMAXDEPTH
#endif
#ifndef YYMAXDEPTH
-#define YYMAXDEPTH 10000
+# define YYMAXDEPTH 10000
#endif
-#ifndef YYPARSE_RETURN_TYPE
-#define YYPARSE_RETURN_TYPE int
-#endif
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+# if defined (__GLIBC__) && defined (_STRING_H)
+# define yystrlen strlen
+# else
+/* Return the length of YYSTR. */
+static YYSIZE_T
+# if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+# else
+yystrlen (yystr)
+ const char *yystr;
+# endif
+{
+ register const char *yys = yystr;
+
+ while (*yys++ != '\0')
+ continue;
+
+ return yys - yystr - 1;
+}
+# endif
+# endif
+
+# ifndef yystpcpy
+# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+# define yystpcpy stpcpy
+# else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+ YYDEST. */
+static char *
+# if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+# else
+yystpcpy (yydest, yysrc)
+ char *yydest;
+ const char *yysrc;
+# endif
+{
+ register char *yyd = yydest;
+ register const char *yys = yysrc;
+
+ while ((*yyd++ = *yys++) != '\0')
+ continue;
+
+ return yyd - 1;
+}
+# endif
+# endif
+
+#endif /* !YYERROR_VERBOSE */
-/* Prevent warning if -Wstrict-prototypes. */
-#ifdef __GNUC__
-YYPARSE_RETURN_TYPE yyparse (void);
-#endif
-#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
-#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT)
-#else /* not GNU C or C++ */
-#ifndef __cplusplus
-/* This is the most reliable way to avoid incompatibilities
- in available built-in functions on various systems. */
+#if YYDEBUG
+/*--------------------------------.
+| Print this symbol on YYOUTPUT. |
+`--------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
+#else
static void
-__yy_memcpy (to, from, count)
- char *to;
- char *from;
- int count;
+yysymprint (yyoutput, yytype, yyvaluep)
+ FILE *yyoutput;
+ int yytype;
+ YYSTYPE *yyvaluep;
+#endif
{
- register char *f = from;
- register char *t = to;
- register int i = count;
+ /* Pacify ``unused variable'' warnings. */
+ (void) yyvaluep;
+
+ if (yytype < YYNTOKENS)
+ {
+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+# ifdef YYPRINT
+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# endif
+ }
+ else
+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
- while (i-- > 0)
- *t++ = *f++;
+ switch (yytype)
+ {
+ default:
+ break;
+ }
+ YYFPRINTF (yyoutput, ")");
}
-#else /* __cplusplus */
+#endif /* ! YYDEBUG */
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
-/* This is the most reliable way to avoid incompatibilities
- in available built-in functions on various systems. */
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yydestruct (int yytype, YYSTYPE *yyvaluep)
+#else
static void
-__yy_memcpy (char *to, char *from, int count)
+yydestruct (yytype, yyvaluep)
+ int yytype;
+ YYSTYPE *yyvaluep;
+#endif
{
- register char *f = from;
- register char *t = to;
- register int i = count;
+ /* Pacify ``unused variable'' warnings. */
+ (void) yyvaluep;
+
+ switch (yytype)
+ {
- while (i-- > 0)
- *t++ = *f++;
+ default:
+ break;
+ }
}
+
+/* Prevent warnings from -Wmissing-prototypes. */
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM);
+# else
+int yyparse ();
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void);
+#else
+int yyparse ();
#endif
-#endif
-
-#line 196 "/usr/share/bison.simple"
+#endif /* ! YYPARSE_PARAM */
+
+
+
+/* The lookahead symbol. */
+int yychar;
+
+/* The semantic value of the lookahead symbol. */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far. */
+int yynerrs;
+
-/* The user can define YYPARSE_PARAM as the name of an argument to be passed
- into yyparse. The argument should have type void *.
- It should actually point to an object.
- Grammar actions can access the variable by casting it
- to the proper pointer type. */
+
+/*----------.
+| yyparse. |
+`----------*/
#ifdef YYPARSE_PARAM
-#ifdef __cplusplus
-#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
-#define YYPARSE_PARAM_DECL
-#else /* not __cplusplus */
-#define YYPARSE_PARAM_ARG YYPARSE_PARAM
-#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
-#endif /* not __cplusplus */
-#else /* not YYPARSE_PARAM */
-#define YYPARSE_PARAM_ARG
-#define YYPARSE_PARAM_DECL
-#endif /* not YYPARSE_PARAM */
-
-YYPARSE_RETURN_TYPE
-yyparse(YYPARSE_PARAM_ARG)
- YYPARSE_PARAM_DECL
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM)
+# else
+int yyparse (YYPARSE_PARAM)
+ void *YYPARSE_PARAM;
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
{
+
register int yystate;
register int yyn;
- register short *yyssp;
+ int yyresult;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
+ /* Lookahead token as an internal (translated) token number. */
+ int yytoken = 0;
+
+ /* Three stacks and their tools:
+ `yyss': related to states,
+ `yyvs': related to semantic values,
+ `yyls': related to locations.
+
+ Refer to the stacks thru separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* The state stack. */
+ short int yyssa[YYINITDEPTH];
+ short int *yyss = yyssa;
+ register short int *yyssp;
+
+ /* The semantic value stack. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
register YYSTYPE *yyvsp;
- int yyerrstatus; /* number of tokens to shift before error messages enabled */
- int yychar1 = 0; /* lookahead token as an internal (translated) token number */
-
- short yyssa[YYINITDEPTH]; /* the state stack */
- YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */
- short *yyss = yyssa; /* refer to the stacks thru separate pointers */
- YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */
-#ifdef YYLSP_NEEDED
- YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */
- YYLTYPE *yyls = yylsa;
- YYLTYPE *yylsp;
-#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
-#else
#define YYPOPSTACK (yyvsp--, yyssp--)
-#endif
- int yystacksize = YYINITDEPTH;
+ YYSIZE_T yystacksize = YYINITDEPTH;
-#ifdef YYPURE
- int yychar;
- YYSTYPE yylval;
- int yynerrs;
-#ifdef YYLSP_NEEDED
- YYLTYPE yylloc;
-#endif
-#endif
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
- YYSTYPE yyval; /* the variable used to return */
- /* semantic values from the action */
- /* routines */
+ /* When reducing, the number of symbols on the RHS of the reduced
+ rule. */
int yylen;
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Starting parse\n");
-#endif
+ YYDPRINTF ((stderr, "Starting parse\n"));
yystate = 0;
yyerrstatus = 0;
@@ -532,96 +1104,97 @@ yyparse(YYPARSE_PARAM_ARG)
so that they stay on the same level as the state stack.
The wasted elements are never initialized. */
- yyssp = yyss - 1;
+ yyssp = yyss;
yyvsp = yyvs;
-#ifdef YYLSP_NEEDED
- yylsp = yyls;
-#endif
-/* Push a new state, which is found in yystate . */
-/* In all cases, when you get here, the value and location stacks
- have just been pushed. so pushing a state here evens the stacks. */
-yynewstate:
- *++yyssp = yystate;
+ goto yysetstate;
- if (yyssp >= yyss + yystacksize - 1)
- {
- /* Give user a chance to reallocate the stack */
- /* Use copies of these so that the &'s don't force the real ones into memory. */
- YYSTYPE *yyvs1 = yyvs;
- short *yyss1 = yyss;
-#ifdef YYLSP_NEEDED
- YYLTYPE *yyls1 = yyls;
-#endif
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+ yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. so pushing a state here evens the stacks.
+ */
+ yyssp++;
+ yysetstate:
+ *yyssp = yystate;
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ {
/* Get the current used size of the three stacks, in elements. */
- int size = yyssp - yyss + 1;
+ YYSIZE_T yysize = yyssp - yyss + 1;
#ifdef yyoverflow
- /* Each stack pointer address is followed by the size of
- the data in use in that stack, in bytes. */
-#ifdef YYLSP_NEEDED
- /* This used to be a conditional around just the two extra args,
- but that might be undefined if yyoverflow is a macro. */
- yyoverflow("parser stack overflow",
- &yyss1, size * sizeof (*yyssp),
- &yyvs1, size * sizeof (*yyvsp),
- &yyls1, size * sizeof (*yylsp),
- &yystacksize);
-#else
- yyoverflow("parser stack overflow",
- &yyss1, size * sizeof (*yyssp),
- &yyvs1, size * sizeof (*yyvsp),
- &yystacksize);
-#endif
-
- yyss = yyss1; yyvs = yyvs1;
-#ifdef YYLSP_NEEDED
- yyls = yyls1;
-#endif
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ short int *yyss1 = yyss;
+
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow ("parser stack overflow",
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+
+ &yystacksize);
+
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+ goto yyoverflowlab;
+# else
/* Extend the stack our own way. */
- if (yystacksize >= YYMAXDEPTH)
- {
- yyerror("parser stack overflow");
- return 2;
- }
+ if (YYMAXDEPTH <= yystacksize)
+ goto yyoverflowlab;
yystacksize *= 2;
- if (yystacksize > YYMAXDEPTH)
+ if (YYMAXDEPTH < yystacksize)
yystacksize = YYMAXDEPTH;
- yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
- __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp));
- yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
- __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp));
-#ifdef YYLSP_NEEDED
- yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
- __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp));
-#endif
+
+ {
+ short int *yyss1 = yyss;
+ union yyalloc *yyptr =
+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+ if (! yyptr)
+ goto yyoverflowlab;
+ YYSTACK_RELOCATE (yyss);
+ YYSTACK_RELOCATE (yyvs);
+
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
#endif /* no yyoverflow */
- yyssp = yyss + size - 1;
- yyvsp = yyvs + size - 1;
-#ifdef YYLSP_NEEDED
- yylsp = yyls + size - 1;
-#endif
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Stack size increased to %d\n", yystacksize);
-#endif
- if (yyssp >= yyss + yystacksize - 1)
+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+ (unsigned long int) yystacksize));
+
+ if (yyss + yystacksize - 1 <= yyssp)
YYABORT;
}
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Entering state %d\n", yystate);
-#endif
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
goto yybackup;
- yybackup:
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
/* Do appropriate processing given the current state. */
/* Read a lookahead token if we need one and don't already have one. */
@@ -630,460 +1203,784 @@ yynewstate:
/* First try to decide what to do without reference to lookahead token. */
yyn = yypact[yystate];
- if (yyn == YYFLAG)
+ if (yyn == YYPACT_NINF)
goto yydefault;
/* Not known => get a lookahead token if don't already have one. */
- /* yychar is either YYEMPTY or YYEOF
- or a valid token in external form. */
-
+ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
if (yychar == YYEMPTY)
{
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Reading a token: ");
-#endif
+ YYDPRINTF ((stderr, "Reading a token: "));
yychar = YYLEX;
}
- /* Convert token to internal form (in yychar1) for indexing tables with */
-
- if (yychar <= 0) /* This means end of input. */
+ if (yychar <= YYEOF)
{
- yychar1 = 0;
- yychar = YYEOF; /* Don't call YYLEX any more */
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Now at end of input.\n");
-#endif
+ yychar = yytoken = YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
}
else
{
- yychar1 = YYTRANSLATE(yychar);
-
-#if YYDEBUG != 0
- if (yydebug)
- {
- fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
- /* Give the individual parser a way to print the precise meaning
- of a token, for further debugging info. */
-#ifdef YYPRINT
- YYPRINT (stderr, yychar, yylval);
-#endif
- fprintf (stderr, ")\n");
- }
-#endif
+ yytoken = YYTRANSLATE (yychar);
+ YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc);
}
- yyn += yychar1;
- if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
goto yydefault;
-
yyn = yytable[yyn];
-
- /* yyn is what to do for this token type in this state.
- Negative => reduce, -yyn is rule number.
- Positive => shift, yyn is new state.
- New state is final state => don't bother to shift,
- just return success.
- 0, or most negative number => error. */
-
- if (yyn < 0)
+ if (yyn <= 0)
{
- if (yyn == YYFLAG)
+ if (yyn == 0 || yyn == YYTABLE_NINF)
goto yyerrlab;
yyn = -yyn;
goto yyreduce;
}
- else if (yyn == 0)
- goto yyerrlab;
if (yyn == YYFINAL)
YYACCEPT;
/* Shift the lookahead token. */
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
-#endif
+ YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
/* Discard the token being shifted unless it is eof. */
if (yychar != YYEOF)
yychar = YYEMPTY;
*++yyvsp = yylval;
-#ifdef YYLSP_NEEDED
- *++yylsp = yylloc;
-#endif
- /* count tokens shifted since error; after three, turn off error status. */
- if (yyerrstatus) yyerrstatus--;
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
yystate = yyn;
goto yynewstate;
-/* Do the default action for the current state. */
-yydefault:
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
yyn = yydefact[yystate];
if (yyn == 0)
goto yyerrlab;
+ goto yyreduce;
+
-/* Do a reduction. yyn is the number of a rule to reduce with. */
+/*-----------------------------.
+| yyreduce -- Do a reduction. |
+`-----------------------------*/
yyreduce:
+ /* yyn is the number of a rule to reduce with. */
yylen = yyr2[yyn];
- if (yylen > 0)
- yyval = yyvsp[1-yylen]; /* implement default value of the action */
-#if YYDEBUG != 0
- if (yydebug)
+ /* If YYLEN is nonzero, implement the default value of the action:
+ `$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 10:
+#line 144 "testpatterny.y"
{
- int i;
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>cmykspec %d\n", yyvsp[0].ival);
+ global_image_type = "CMYK";
+ global_channel_depth = 4;
+ global_invert_data = 0;
+ if (yyvsp[0].ival == 8 || yyvsp[0].ival == 16)
+ global_bit_depth = yyvsp[0].ival;
+ }
+ break;
- fprintf (stderr, "Reducing via rule %d (line %d), ",
- yyn, yyrline[yyn]);
+ case 11:
+#line 156 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>kcmyspec %d\n", yyvsp[0].ival);
+ global_image_type = "KCMY";
+ global_channel_depth = 4;
+ global_invert_data = 0;
+ if (yyvsp[0].ival == 8 || yyvsp[0].ival == 16)
+ global_bit_depth = yyvsp[0].ival;
+ }
+ break;
- /* Print the symbols being reduced, and their result. */
- for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
- fprintf (stderr, "%s ", yytname[yyrhs[i]]);
- fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
- }
-#endif
+ case 12:
+#line 168 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>rgbspec %d\n", yyvsp[0].ival);
+ global_image_type = "RGB";
+ global_channel_depth = 3;
+ global_invert_data = 1;
+ if (yyvsp[0].ival == 8 || yyvsp[0].ival == 16)
+ global_bit_depth = yyvsp[0].ival;
+ }
+ break;
+ case 13:
+#line 180 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>cmyspec %d\n", yyvsp[0].ival);
+ global_image_type = "CMY";
+ global_channel_depth = 3;
+ global_invert_data = 0;
+ if (yyvsp[0].ival == 8 || yyvsp[0].ival == 16)
+ global_bit_depth = yyvsp[0].ival;
+ }
+ break;
- switch (yyn) {
-
-case 1:
-#line 88 "testpatterny.y"
-{ global_c_level = yyvsp[0].dval; ;
- break;}
-case 2:
-#line 91 "testpatterny.y"
-{ global_m_level = yyvsp[0].dval; ;
- break;}
-case 3:
-#line 94 "testpatterny.y"
-{ global_y_level = yyvsp[0].dval; ;
- break;}
-case 4:
-#line 97 "testpatterny.y"
-{ global_c_gamma = yyvsp[0].dval; ;
- break;}
-case 5:
-#line 100 "testpatterny.y"
-{ global_m_gamma = yyvsp[0].dval; ;
- break;}
-case 6:
-#line 103 "testpatterny.y"
-{ global_y_gamma = yyvsp[0].dval; ;
- break;}
-case 7:
-#line 106 "testpatterny.y"
-{ global_k_gamma = yyvsp[0].dval; ;
- break;}
-case 8:
-#line 109 "testpatterny.y"
-{ global_gamma = yyvsp[0].dval; ;
- break;}
-case 9:
-#line 112 "testpatterny.y"
-{ levels = yyvsp[0].ival; ;
- break;}
-case 10:
-#line 115 "testpatterny.y"
-{ ink_limit = yyvsp[0].dval; ;
- break;}
-case 11:
-#line 118 "testpatterny.y"
-{ printer = c_strdup(yyvsp[0].sval); ;
- break;}
-case 12:
-#line 121 "testpatterny.y"
-{ ink_type = c_strdup(yyvsp[0].sval); ;
- break;}
-case 13:
-#line 124 "testpatterny.y"
-{ resolution = c_strdup(yyvsp[0].sval); ;
- break;}
-case 14:
-#line 127 "testpatterny.y"
-{ media_source = c_strdup(yyvsp[0].sval); ;
- break;}
-case 15:
-#line 130 "testpatterny.y"
-{ media_type = c_strdup(yyvsp[0].sval); ;
- break;}
-case 16:
-#line 133 "testpatterny.y"
-{ media_size = c_strdup(yyvsp[0].sval); ;
- break;}
-case 17:
-#line 136 "testpatterny.y"
-{ dither_algorithm = c_strdup(yyvsp[0].sval); ;
- break;}
-case 18:
-#line 139 "testpatterny.y"
-{ density = yyvsp[0].dval; ;
- break;}
-case 19:
-#line 142 "testpatterny.y"
-{ xtop = yyvsp[0].dval; ;
- break;}
-case 20:
-#line 145 "testpatterny.y"
-{ xleft = yyvsp[0].dval; ;
- break;}
-case 21:
-#line 148 "testpatterny.y"
-{ hsize = yyvsp[0].dval; ;
- break;}
-case 22:
-#line 151 "testpatterny.y"
-{ vsize = yyvsp[0].dval; ;
- break;}
-case 23:
-#line 154 "testpatterny.y"
-{ noblackline = !(yyvsp[0].ival); ;
- break;}
-case 24:
-#line 160 "testpatterny.y"
-{
- testpattern_t *t = get_next_testpattern();
- t->t = E_PATTERN;
- t->d.p.c_min = yyvsp[-16].dval;
- t->d.p.c = yyvsp[-15].dval;
- t->d.p.c_gamma = yyvsp[-14].dval;
- t->d.p.m_min = yyvsp[-13].dval;
- t->d.p.m = yyvsp[-12].dval;
- t->d.p.m_gamma = yyvsp[-11].dval;
- t->d.p.y_min = yyvsp[-10].dval;
- t->d.p.y = yyvsp[-9].dval;
- t->d.p.y_gamma = yyvsp[-8].dval;
- t->d.p.k_min = yyvsp[-7].dval;
- t->d.p.k = yyvsp[-6].dval;
- t->d.p.k_gamma = yyvsp[-5].dval;
- t->d.p.c_level = yyvsp[-4].dval;
- t->d.p.m_level = yyvsp[-3].dval;
- t->d.p.y_level = yyvsp[-2].dval;
- t->d.p.lower = yyvsp[-1].dval;
- t->d.p.upper = yyvsp[0].dval;
- ;
- break;}
-case 25:
-#line 184 "testpatterny.y"
-{
- testpattern_t *t = get_next_testpattern();
- t->t = E_IMAGE;
- t->d.i.x = yyvsp[-1].ival;
- t->d.i.y = yyvsp[0].ival;
- if (t->d.i.x <= 0 || t->d.i.y <= 0)
+ case 14:
+#line 192 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>grayspec %d\n", yyvsp[0].ival);
+ global_image_type = "Grayscale";
+ global_channel_depth = 1;
+ global_invert_data = 0;
+ if (yyvsp[0].ival == 8 || yyvsp[0].ival == 16)
+ global_bit_depth = yyvsp[0].ival;
+ }
+ break;
+
+ case 15:
+#line 204 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>whitespec %d\n", yyvsp[0].ival);
+ global_image_type = "Whitescale";
+ global_channel_depth = 1;
+ global_invert_data = 1;
+ if (yyvsp[0].ival == 8 || yyvsp[0].ival == 16)
+ global_bit_depth = yyvsp[0].ival;
+ }
+ break;
+
+ case 16:
+#line 216 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>extendedspec %d\n", yyvsp[-1].ival);
+ global_image_type = "Raw";
+ global_invert_data = 0;
+ global_channel_depth = yyvsp[-1].ival;
+ if (yyvsp[-1].ival == 8 || yyvsp[-1].ival == 16)
+ global_bit_depth = yyvsp[0].ival;
+ }
+ break;
+
+ case 25:
+#line 234 "testpatterny.y"
+ {
+ int channel = find_color(yyvsp[-1].sval);
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>level %s %f\n", yyvsp[-1].sval, yyvsp[0].dval);
+ if (channel >= 0)
+ global_levels[channel] = yyvsp[0].dval;
+ }
+ break;
+
+ case 26:
+#line 244 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>channel_level %d %f\n", yyvsp[-1].ival, yyvsp[0].dval);
+ if (yyvsp[-1].ival >= 0 && yyvsp[-1].ival <= STP_CHANNEL_LIMIT)
+ global_levels[yyvsp[-1].ival] = yyvsp[0].dval;
+ }
+ break;
+
+ case 27:
+#line 253 "testpatterny.y"
+ {
+ int channel = find_color(yyvsp[-1].sval);
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>gamma %s %f\n", yyvsp[-1].sval, yyvsp[0].dval);
+ if (channel >= 0)
+ global_gammas[channel] = yyvsp[0].dval;
+ }
+ break;
+
+ case 28:
+#line 263 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>channel_gamma %d %f\n", yyvsp[-1].ival, yyvsp[0].dval);
+ if (yyvsp[-1].ival >= 0 && yyvsp[-1].ival <= STP_CHANNEL_LIMIT)
+ global_gammas[yyvsp[-1].ival] = yyvsp[0].dval;
+ }
+ break;
+
+ case 29:
+#line 272 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>global_gamma %f\n", yyvsp[0].dval);
+ global_gamma = yyvsp[0].dval;
+ }
+ break;
+
+ case 30:
+#line 279 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>steps %d\n", yyvsp[0].ival);
+ global_steps = yyvsp[0].ival;
+ }
+ break;
+
+ case 31:
+#line 286 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>ink_limit %f\n", yyvsp[0].dval);
+ global_ink_limit = yyvsp[0].dval;
+ }
+ break;
+
+ case 32:
+#line 293 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>printer %s\n", yyvsp[0].sval);
+ global_printer = strdup(yyvsp[0].sval);
+ free(yyvsp[0].sval);
+ }
+ break;
+
+ case 33:
+#line 302 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>page_size_name %s\n", yyvsp[0].sval);
+ stp_set_string_parameter(global_vars, "PageSize", yyvsp[0].sval);
+ free(yyvsp[0].sval);
+ }
+ break;
+
+ case 34:
+#line 311 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>page_size_custom %d %d\n", yyvsp[-1].ival, yyvsp[0].ival);
+ stp_set_page_width(global_vars, yyvsp[-1].ival);
+ stp_set_page_height(global_vars, yyvsp[0].ival);
+ }
+ break;
+
+ case 37:
+#line 323 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>parameter_string %s %s\n", yyvsp[-1].sval, yyvsp[0].sval);
+ stp_set_string_parameter(global_vars, yyvsp[-1].sval, yyvsp[0].sval);
+ free(yyvsp[-1].sval);
+ free(yyvsp[0].sval);
+ }
+ break;
+
+ case 38:
+#line 333 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>parameter_int %s %d\n", yyvsp[-1].sval, yyvsp[0].ival);
+ stp_set_int_parameter(global_vars, yyvsp[-1].sval, yyvsp[0].ival);
+ free(yyvsp[-1].sval);
+ }
+ break;
+
+ case 39:
+#line 342 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>parameter_float %s %f\n", yyvsp[-1].sval, yyvsp[0].dval);
+ stp_set_float_parameter(global_vars, yyvsp[-1].sval, yyvsp[0].dval);
+ free(yyvsp[-1].sval);
+ }
+ break;
+
+ case 43:
+#line 367 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>density %f\n", yyvsp[0].dval);
+ global_density = yyvsp[0].dval;
+ }
+ break;
+
+ case 44:
+#line 374 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>top %f\n", yyvsp[0].dval);
+ global_xtop = yyvsp[0].dval;
+ }
+ break;
+
+ case 45:
+#line 381 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>left %f\n", yyvsp[0].dval);
+ global_xleft = yyvsp[0].dval;
+ }
+ break;
+
+ case 46:
+#line 388 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>hsize %f\n", yyvsp[0].dval);
+ global_hsize = yyvsp[0].dval;
+ }
+ break;
+
+ case 47:
+#line 395 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>vsize %f\n", yyvsp[0].dval);
+ global_vsize = yyvsp[0].dval;
+ }
+ break;
+
+ case 48:
+#line 402 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>blackline %d\n", yyvsp[0].ival);
+ global_noblackline = !(yyvsp[0].ival);
+ }
+ break;
+
+ case 49:
+#line 410 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>color_block1 %f %f %f (%d)\n", yyvsp[-2].dval, yyvsp[-1].dval, yyvsp[0].dval,
+ current_index);
+ if (current_index < STP_CHANNEL_LIMIT)
+ {
+ current_testpattern->d.p.mins[current_index] = yyvsp[-2].dval;
+ current_testpattern->d.p.vals[current_index] = yyvsp[-1].dval;
+ current_testpattern->d.p.gammas[current_index] = yyvsp[0].dval;
+ current_index++;
+ }
+ }
+ break;
+
+ case 55:
+#line 434 "testpatterny.y"
+ {
+ int channel = find_color(yyvsp[-3].sval);
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>color_block2a %s %f %f %f\n", yyvsp[-3].sval, yyvsp[-2].dval, yyvsp[-1].dval, yyvsp[0].dval);
+ if (channel >= 0 && channel < STP_CHANNEL_LIMIT)
+ {
+ current_testpattern->d.p.mins[channel] = yyvsp[-2].dval;
+ current_testpattern->d.p.vals[channel] = yyvsp[-1].dval;
+ current_testpattern->d.p.gammas[channel] = yyvsp[0].dval;
+ }
+ }
+ break;
+
+ case 56:
+#line 448 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>color_block2b %d %f %f %f\n", yyvsp[-3].ival, yyvsp[-2].dval, yyvsp[-1].dval, yyvsp[0].dval);
+ if (yyvsp[-3].ival >= 0 && yyvsp[-3].ival < STP_CHANNEL_LIMIT)
+ {
+ current_testpattern->d.p.mins[yyvsp[-3].ival] = yyvsp[-2].dval;
+ current_testpattern->d.p.vals[yyvsp[-3].ival] = yyvsp[-1].dval;
+ current_testpattern->d.p.gammas[yyvsp[-3].ival] = yyvsp[0].dval;
+ }
+ }
+ break;
+
+ case 65:
+#line 473 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>patvars %f %f %f %f %f\n", yyvsp[-4].dval, yyvsp[-3].dval, yyvsp[-2].dval, yyvsp[-1].dval, yyvsp[0].dval);
+ current_testpattern->t = E_PATTERN;
+ current_testpattern->d.p.lower = yyvsp[-4].dval;
+ current_testpattern->d.p.upper = yyvsp[-3].dval;
+ current_testpattern->d.p.levels[1] = yyvsp[-2].dval;
+ current_testpattern->d.p.levels[2] = yyvsp[-1].dval;
+ current_testpattern->d.p.levels[3] = yyvsp[0].dval;
+ current_testpattern = get_next_testpattern();
+ current_index = 0;
+ }
+ break;
+
+ case 67:
+#line 491 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>xpattern\n");
+ if (global_channel_depth == 0)
+ {
+ fprintf(stderr, "xpattern may only be used with extended color depth\n");
+ exit(1);
+ }
+ current_testpattern->t = E_XPATTERN;
+ current_testpattern = get_next_testpattern();
+ current_index = 0;
+ }
+ break;
+
+ case 68:
+#line 506 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>grid %d\n", yyvsp[0].ival);
+ current_testpattern->t = E_GRID;
+ current_testpattern->d.g.ticks = yyvsp[0].ival;
+ current_testpattern = get_next_testpattern();
+ current_index = 0;
+ }
+ break;
+
+ case 69:
+#line 517 "testpatterny.y"
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>image %d %d\n", yyvsp[-1].ival, yyvsp[0].ival);
+ current_testpattern->t = E_IMAGE;
+ current_testpattern->d.i.x = yyvsp[-1].ival;
+ current_testpattern->d.i.y = yyvsp[0].ival;
+ if (current_testpattern->d.i.x <= 0 ||
+ current_testpattern->d.i.y <= 0)
{
fprintf(stderr, "image width and height must be greater than zero\n");
exit(1);
}
return 0;
- ;
- break;}
-}
- /* the action file gets copied in in place of this dollarsign */
-#line 498 "/usr/share/bison.simple"
-
- yyvsp -= yylen;
- yyssp -= yylen;
-#ifdef YYLSP_NEEDED
- yylsp -= yylen;
-#endif
+ }
+ break;
-#if YYDEBUG != 0
- if (yydebug)
+ case 70:
+#line 534 "testpatterny.y"
{
- short *ssp1 = yyss - 1;
- fprintf (stderr, "state stack now");
- while (ssp1 != yyssp)
- fprintf (stderr, " %d", *++ssp1);
- fprintf (stderr, "\n");
- }
-#endif
+ fprintf(stderr, yyvsp[0].sval);
+ free(yyvsp[0].sval);
+ }
+ break;
- *++yyvsp = yyval;
+ case 71:
+#line 540 "testpatterny.y"
+ {
+ fprintf(stderr, yyvsp[-1].sval, yyvsp[0].sval);
+ free(yyvsp[-1].sval);
+ free(yyvsp[0].sval);
+ }
+ break;
-#ifdef YYLSP_NEEDED
- yylsp++;
- if (yylen == 0)
+ case 72:
+#line 547 "testpatterny.y"
{
- yylsp->first_line = yylloc.first_line;
- yylsp->first_column = yylloc.first_column;
- yylsp->last_line = (yylsp-1)->last_line;
- yylsp->last_column = (yylsp-1)->last_column;
- yylsp->text = 0;
- }
- else
+ fprintf(stderr, yyvsp[-2].sval, yyvsp[-1].sval, yyvsp[0].sval);
+ free(yyvsp[-2].sval);
+ free(yyvsp[-1].sval);
+ free(yyvsp[0].sval);
+ }
+ break;
+
+ case 73:
+#line 555 "testpatterny.y"
{
- yylsp->last_line = (yylsp+yylen-1)->last_line;
- yylsp->last_column = (yylsp+yylen-1)->last_column;
+ fprintf(stderr, yyvsp[-3].sval, yyvsp[-2].sval, yyvsp[-1].sval, yyvsp[0].sval);
+ free(yyvsp[-3].sval);
+ free(yyvsp[-2].sval);
+ free(yyvsp[-1].sval);
+ free(yyvsp[0].sval);
+ }
+ break;
+
+ case 74:
+#line 564 "testpatterny.y"
+ {
+ fprintf(stderr, yyvsp[-4].sval, yyvsp[-3].sval, yyvsp[-2].sval, yyvsp[-1].sval, yyvsp[0].sval);
+ free(yyvsp[-4].sval);
+ free(yyvsp[-3].sval);
+ free(yyvsp[-2].sval);
+ free(yyvsp[-1].sval);
+ free(yyvsp[0].sval);
+ }
+ break;
+
+ case 99:
+#line 586 "testpatterny.y"
+ { global_did_something = 1; }
+ break;
+
+ case 104:
+#line 593 "testpatterny.y"
+ { global_did_something = 1; }
+ break;
+
+ case 107:
+#line 600 "testpatterny.y"
+ { global_did_something = 1; }
+ break;
+
+ case 113:
+#line 610 "testpatterny.y"
+ { return 0; }
+ break;
+
+ case 114:
+#line 614 "testpatterny.y"
+ {
+ current_testpattern = get_next_testpattern();
+ }
+ break;
+
+
}
-#endif
- /* Now "shift" the result of the reduction.
- Determine what state that goes to,
- based on the state we popped back to
- and the rule number reduced by. */
+/* Line 1010 of yacc.c. */
+#line 1760 "testpatterny.c"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+
+
+ YY_STACK_PRINT (yyss, yyssp);
+
+ *++yyvsp = yyval;
+
+
+ /* Now `shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
yyn = yyr1[yyn];
- yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
- if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
yystate = yytable[yystate];
else
- yystate = yydefgoto[yyn - YYNTBASE];
+ yystate = yydefgoto[yyn - YYNTOKENS];
goto yynewstate;
-yyerrlab: /* here on detecting error */
- if (! yyerrstatus)
- /* If not already recovering from an error, report this error. */
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
{
++yynerrs;
-
-#ifdef YYERROR_VERBOSE
+#if YYERROR_VERBOSE
yyn = yypact[yystate];
- if (yyn > YYFLAG && yyn < YYLAST)
+ if (YYPACT_NINF < yyn && yyn < YYLAST)
{
- int size = 0;
- char *msg;
- int x, count;
-
- count = 0;
- /* Start X at -yyn if nec to avoid negative indexes in yycheck. */
- for (x = (yyn < 0 ? -yyn : 0);
- x < (sizeof(yytname) / sizeof(char *)); x++)
- if (yycheck[x + yyn] == x)
- size += strlen(yytname[x]) + 15, count++;
- msg = (char *) malloc(size + 15);
- if (msg != 0)
+ YYSIZE_T yysize = 0;
+ int yytype = YYTRANSLATE (yychar);
+ const char* yyprefix;
+ char *yymsg;
+ int yyx;
+
+ /* Start YYX at -YYN if negative to avoid negative indexes in
+ YYCHECK. */
+ int yyxbegin = yyn < 0 ? -yyn : 0;
+
+ /* Stay within bounds of both yycheck and yytname. */
+ int yychecklim = YYLAST - yyn;
+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+ int yycount = 0;
+
+ yyprefix = ", expecting ";
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+ {
+ yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]);
+ yycount += 1;
+ if (yycount == 5)
+ {
+ yysize = 0;
+ break;
+ }
+ }
+ yysize += (sizeof ("syntax error, unexpected ")
+ + yystrlen (yytname[yytype]));
+ yymsg = (char *) YYSTACK_ALLOC (yysize);
+ if (yymsg != 0)
{
- strcpy(msg, "parse error");
+ char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
+ yyp = yystpcpy (yyp, yytname[yytype]);
- if (count < 5)
+ if (yycount < 5)
{
- count = 0;
- for (x = (yyn < 0 ? -yyn : 0);
- x < (sizeof(yytname) / sizeof(char *)); x++)
- if (yycheck[x + yyn] == x)
+ yyprefix = ", expecting ";
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
{
- strcat(msg, count == 0 ? ", expecting `" : " or `");
- strcat(msg, yytname[x]);
- strcat(msg, "'");
- count++;
+ yyp = yystpcpy (yyp, yyprefix);
+ yyp = yystpcpy (yyp, yytname[yyx]);
+ yyprefix = " or ";
}
}
- yyerror(msg);
- free(msg);
+ yyerror (yymsg);
+ YYSTACK_FREE (yymsg);
}
else
- yyerror ("parse error; also virtual memory exceeded");
+ yyerror ("syntax error; also virtual memory exhausted");
}
else
#endif /* YYERROR_VERBOSE */
- yyerror("parse error");
+ yyerror ("syntax error");
}
- goto yyerrlab1;
-yyerrlab1: /* here on error raised explicitly by an action */
+
if (yyerrstatus == 3)
{
- /* if just tried and failed to reuse lookahead token after an error, discard it. */
-
- /* return failure if at end of input */
- if (yychar == YYEOF)
- YYABORT;
-
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
-#endif
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* If at end of input, pop the error token,
+ then the rest of the stack, then return failure. */
+ if (yychar == YYEOF)
+ for (;;)
+ {
+ YYPOPSTACK;
+ if (yyssp == yyss)
+ YYABORT;
+ YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+ yydestruct (yystos[*yyssp], yyvsp);
+ }
+ }
+ else
+ {
+ YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
+ yydestruct (yytoken, &yylval);
+ yychar = YYEMPTY;
- yychar = YYEMPTY;
+ }
}
- /* Else will try to reuse lookahead token
- after shifting the error token. */
-
- yyerrstatus = 3; /* Each real token shifted decrements this */
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab1;
- goto yyerrhandle;
-yyerrdefault: /* current state does not do anything special for the error token. */
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
-#if 0
- /* This is wrong; only states that explicitly want error tokens
- should shift them. */
- yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/
- if (yyn) goto yydefault;
+#ifdef __GNUC__
+ /* Pacify GCC when the user code never invokes YYERROR and the label
+ yyerrorlab therefore never appears in user code. */
+ if (0)
+ goto yyerrorlab;
#endif
-yyerrpop: /* pop the current state because it cannot handle the error token */
-
- if (yyssp == yyss) YYABORT;
- yyvsp--;
- yystate = *--yyssp;
-#ifdef YYLSP_NEEDED
- yylsp--;
-#endif
+ yyvsp -= yylen;
+ yyssp -= yylen;
+ yystate = *yyssp;
+ goto yyerrlab1;
-#if YYDEBUG != 0
- if (yydebug)
- {
- short *ssp1 = yyss - 1;
- fprintf (stderr, "Error: state stack now");
- while (ssp1 != yyssp)
- fprintf (stderr, " %d", *++ssp1);
- fprintf (stderr, "\n");
- }
-#endif
-yyerrhandle:
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
- yyn = yypact[yystate];
- if (yyn == YYFLAG)
- goto yyerrdefault;
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (yyn != YYPACT_NINF)
+ {
+ yyn += YYTERROR;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
- yyn += YYTERROR;
- if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
- goto yyerrdefault;
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
- yyn = yytable[yyn];
- if (yyn < 0)
- {
- if (yyn == YYFLAG)
- goto yyerrpop;
- yyn = -yyn;
- goto yyreduce;
+ YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+ yydestruct (yystos[yystate], yyvsp);
+ YYPOPSTACK;
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
}
- else if (yyn == 0)
- goto yyerrpop;
if (yyn == YYFINAL)
YYACCEPT;
-#if YYDEBUG != 0
- if (yydebug)
- fprintf(stderr, "Shifting error token, ");
-#endif
+ YYDPRINTF ((stderr, "Shifting error token, "));
*++yyvsp = yylval;
-#ifdef YYLSP_NEEDED
- *++yylsp = yylloc;
-#endif
+
yystate = yyn;
goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+#ifndef yyoverflow
+/*----------------------------------------------.
+| yyoverflowlab -- parser overflow comes here. |
+`----------------------------------------------*/
+yyoverflowlab:
+ yyerror ("parser stack overflow");
+ yyresult = 2;
+ /* Fall through. */
+#endif
+
+yyreturn:
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+ return yyresult;
}
-#line 215 "testpatterny.y"
+
+
+#line 620 "testpatterny.y"
+
diff --git a/src/testpattern/testpatterny.h b/src/testpattern/testpatterny.h
index 710b310..989d144 100644
--- a/src/testpattern/testpatterny.h
+++ b/src/testpattern/testpatterny.h
@@ -1,33 +1,136 @@
-#define tINT 258
-#define tDOUBLE 259
-#define tSTRING 260
-#define C_GAMMA 261
-#define M_GAMMA 262
-#define Y_GAMMA 263
-#define K_GAMMA 264
-#define GAMMA 265
-#define C_LEVEL 266
-#define M_LEVEL 267
-#define Y_LEVEL 268
-#define LEVELS 269
-#define INK_LIMIT 270
-#define INK 271
-#define WIDTH 272
-#define PRINTER 273
-#define INK_TYPE 274
-#define RESOLUTION 275
-#define MEDIA_SOURCE 276
-#define MEDIA_TYPE 277
-#define MEDIA_SIZE 278
-#define DITHER_ALGORITHM 279
-#define DENSITY 280
-#define TOP 281
-#define LEFT 282
-#define HSIZE 283
-#define VSIZE 284
-#define BLACKLINE 285
-#define PATTERN 286
-#define IMAGE 287
+/* A Bison parser, made by GNU Bison 1.875d. */
+/* Skeleton parser for Yacc-like parsing with Bison,
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+ 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. */
+
+/* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ tINT = 258,
+ tDOUBLE = 259,
+ tSTRING = 260,
+ CYAN = 261,
+ L_CYAN = 262,
+ MAGENTA = 263,
+ L_MAGENTA = 264,
+ YELLOW = 265,
+ D_YELLOW = 266,
+ BLACK = 267,
+ L_BLACK = 268,
+ GAMMA = 269,
+ LEVEL = 270,
+ STEPS = 271,
+ INK_LIMIT = 272,
+ PRINTER = 273,
+ PARAMETER = 274,
+ PARAMETER_INT = 275,
+ PARAMETER_FLOAT = 276,
+ PARAMETER_CURVE = 277,
+ DENSITY = 278,
+ TOP = 279,
+ LEFT = 280,
+ HSIZE = 281,
+ VSIZE = 282,
+ BLACKLINE = 283,
+ PATTERN = 284,
+ XPATTERN = 285,
+ EXTENDED = 286,
+ IMAGE = 287,
+ GRID = 288,
+ SEMI = 289,
+ CHANNEL = 290,
+ CMYK = 291,
+ KCMY = 292,
+ RGB = 293,
+ CMY = 294,
+ GRAY = 295,
+ WHITE = 296,
+ RAW = 297,
+ MODE = 298,
+ PAGESIZE = 299,
+ MESSAGE = 300,
+ END = 301
+ };
+#endif
+#define tINT 258
+#define tDOUBLE 259
+#define tSTRING 260
+#define CYAN 261
+#define L_CYAN 262
+#define MAGENTA 263
+#define L_MAGENTA 264
+#define YELLOW 265
+#define D_YELLOW 266
+#define BLACK 267
+#define L_BLACK 268
+#define GAMMA 269
+#define LEVEL 270
+#define STEPS 271
+#define INK_LIMIT 272
+#define PRINTER 273
+#define PARAMETER 274
+#define PARAMETER_INT 275
+#define PARAMETER_FLOAT 276
+#define PARAMETER_CURVE 277
+#define DENSITY 278
+#define TOP 279
+#define LEFT 280
+#define HSIZE 281
+#define VSIZE 282
+#define BLACKLINE 283
+#define PATTERN 284
+#define XPATTERN 285
+#define EXTENDED 286
+#define IMAGE 287
+#define GRID 288
+#define SEMI 289
+#define CHANNEL 290
+#define CMYK 291
+#define KCMY 292
+#define RGB 293
+#define CMY 294
+#define GRAY 295
+#define WHITE 296
+#define RAW 297
+#define MODE 298
+#define PAGESIZE 299
+#define MESSAGE 300
+#define END 301
+
+
+
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+typedef int YYSTYPE;
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
extern YYSTYPE yylval;
+
+
+
diff --git a/src/testpattern/testpatterny.y b/src/testpattern/testpatterny.y
index 36bb996..6d92bad 100644
--- a/src/testpattern/testpatterny.y
+++ b/src/testpattern/testpatterny.y
@@ -1,5 +1,5 @@
/*
- * "$Id: testpatterny.y,v 1.3.2.1 2002/07/23 00:54:08 rlk Exp $"
+ * "$Id: testpatterny.y,v 1.26 2004/08/21 22:35:18 rlk Exp $"
*
* Test pattern generator for Gimp-Print
*
@@ -37,7 +37,6 @@ extern int yylex(void);
char *quotestrip(const char *i);
char *endstrip(const char *i);
-extern int mylineno;
extern char* yytext;
static int yyerror( const char *s )
@@ -46,31 +45,68 @@ static int yyerror( const char *s )
return 0;
}
+typedef struct
+{
+ const char *name;
+ int channel;
+} color_t;
+
+static color_t color_map[] =
+ {
+ { "black", 0 },
+ { "cyan", 1 },
+ { "red", 1 },
+ { "magenta", 2 },
+ { "green", 2 },
+ { "yellow", 3 },
+ { "blue", 3 },
+ { "l_black", 4 },
+ { "l_cyan", 5 },
+ { "l_magenta", 6 },
+ { "d_yellow", 4 },
+ { NULL, -1 }
+ };
+
+static int current_index = 0;
+static testpattern_t *current_testpattern;
+extern FILE *yyin;
+
+static int
+find_color(const char *name)
+{
+ int i = 0;
+ while (color_map[i].name)
+ {
+ if (strcmp(color_map[i].name, name) == 0)
+ return color_map[i].channel;
+ i++;
+ }
+ return -1;
+}
+
%}
%token <ival> tINT
%token <dval> tDOUBLE
%token <sval> tSTRING
-%token C_GAMMA
-%token M_GAMMA
-%token Y_GAMMA
-%token K_GAMMA
+%token CYAN
+%token L_CYAN
+%token MAGENTA
+%token L_MAGENTA
+%token YELLOW
+%token D_YELLOW
+%token BLACK
+%token L_BLACK
%token GAMMA
-%token C_LEVEL
-%token M_LEVEL
-%token Y_LEVEL
-%token LEVELS
+%token LEVEL
+%token STEPS
%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 PARAMETER
+%token PARAMETER_INT
+%token PARAMETER_FLOAT
+%token PARAMETER_CURVE
%token DENSITY
%token TOP
%token LEFT
@@ -78,138 +114,507 @@ static int yyerror( const char *s )
%token VSIZE
%token BLACKLINE
%token PATTERN
+%token XPATTERN
+%token EXTENDED
%token IMAGE
+%token GRID
+%token SEMI
+%token CHANNEL
+%token CMYK
+%token KCMY
+%token RGB
+%token CMY
+%token GRAY
+%token WHITE
+%token RAW
+%token MODE
+%token PAGESIZE
+%token MESSAGE
+%token END
%start Thing
%%
-global_c_level: C_LEVEL tDOUBLE
- { global_c_level = $2; }
+COLOR: CYAN | L_CYAN | MAGENTA | L_MAGENTA
+ | YELLOW | D_YELLOW | BLACK | L_BLACK
;
-global_m_level: M_LEVEL tDOUBLE
- { global_m_level = $2; }
+
+cmykspec: CMYK tINT
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>cmykspec %d\n", $2);
+ global_image_type = "CMYK";
+ global_channel_depth = 4;
+ global_invert_data = 0;
+ if ($2 == 8 || $2 == 16)
+ global_bit_depth = $2;
+ }
;
-global_y_level: Y_LEVEL tDOUBLE
- { global_y_level = $2; }
+
+kcmyspec: KCMY tINT
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>kcmyspec %d\n", $2);
+ global_image_type = "KCMY";
+ global_channel_depth = 4;
+ global_invert_data = 0;
+ if ($2 == 8 || $2 == 16)
+ global_bit_depth = $2;
+ }
;
-global_c_gamma: C_GAMMA tDOUBLE
- { global_c_gamma = $2; }
+
+rgbspec: RGB tINT
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>rgbspec %d\n", $2);
+ global_image_type = "RGB";
+ global_channel_depth = 3;
+ global_invert_data = 1;
+ if ($2 == 8 || $2 == 16)
+ global_bit_depth = $2;
+ }
;
-global_m_gamma: M_GAMMA tDOUBLE
- { global_m_gamma = $2; }
+
+cmyspec: CMY tINT
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>cmyspec %d\n", $2);
+ global_image_type = "CMY";
+ global_channel_depth = 3;
+ global_invert_data = 0;
+ if ($2 == 8 || $2 == 16)
+ global_bit_depth = $2;
+ }
;
-global_y_gamma: Y_GAMMA tDOUBLE
- { global_y_gamma = $2; }
+
+grayspec: GRAY tINT
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>grayspec %d\n", $2);
+ global_image_type = "Grayscale";
+ global_channel_depth = 1;
+ global_invert_data = 0;
+ if ($2 == 8 || $2 == 16)
+ global_bit_depth = $2;
+ }
+;
+
+whitespec: WHITE tINT
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>whitespec %d\n", $2);
+ global_image_type = "Whitescale";
+ global_channel_depth = 1;
+ global_invert_data = 1;
+ if ($2 == 8 || $2 == 16)
+ global_bit_depth = $2;
+ }
+;
+
+extendedspec: EXTENDED tINT tINT
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>extendedspec %d\n", $2);
+ global_image_type = "Raw";
+ global_invert_data = 0;
+ global_channel_depth = $2;
+ if ($2 == 8 || $2 == 16)
+ global_bit_depth = $3;
+ }
+;
+
+modespec: cmykspec | kcmyspec | rgbspec | cmyspec | grayspec | whitespec | extendedspec
+;
+
+inputspec: MODE modespec
+;
+
+level: LEVEL COLOR tDOUBLE
+ {
+ int channel = find_color($2.sval);
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>level %s %f\n", $2.sval, $3);
+ if (channel >= 0)
+ global_levels[channel] = $3;
+ }
+;
+
+channel_level: LEVEL tINT tDOUBLE
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>channel_level %d %f\n", $2, $3);
+ if ($2 >= 0 && $2 <= STP_CHANNEL_LIMIT)
+ global_levels[$2] = $3;
+ }
+;
+
+gamma: GAMMA COLOR tDOUBLE
+ {
+ int channel = find_color($2.sval);
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>gamma %s %f\n", $2.sval, $3);
+ if (channel >= 0)
+ global_gammas[channel] = $3;
+ }
;
-global_k_gamma: K_GAMMA tDOUBLE
- { global_k_gamma = $2; }
+
+channel_gamma: GAMMA tINT tDOUBLE
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>channel_gamma %d %f\n", $2, $3);
+ if ($2 >= 0 && $2 <= STP_CHANNEL_LIMIT)
+ global_gammas[$2] = $3;
+ }
;
+
global_gamma: GAMMA tDOUBLE
- { global_gamma = $2; }
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>global_gamma %f\n", $2);
+ global_gamma = $2;
+ }
;
-levels: LEVELS tINT
- { levels = $2; }
+steps: STEPS tINT
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>steps %d\n", $2);
+ global_steps = $2;
+ }
;
ink_limit: INK_LIMIT tDOUBLE
- { ink_limit = $2; }
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>ink_limit %f\n", $2);
+ global_ink_limit = $2;
+ }
;
printer: PRINTER tSTRING
- { printer = c_strdup($2); }
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>printer %s\n", $2);
+ global_printer = strdup($2);
+ free($2);
+ }
;
-ink_type: INK_TYPE tSTRING
- { ink_type = c_strdup($2); }
+
+page_size_name: PAGESIZE tSTRING
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>page_size_name %s\n", $2);
+ stp_set_string_parameter(global_vars, "PageSize", $2);
+ free($2);
+ }
;
-resolution: RESOLUTION tSTRING
- { resolution = c_strdup($2); }
+
+page_size_custom: PAGESIZE tINT tINT
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>page_size_custom %d %d\n", $2, $3);
+ stp_set_page_width(global_vars, $2);
+ stp_set_page_height(global_vars, $3);
+ }
;
-media_source: MEDIA_SOURCE tSTRING
- { media_source = c_strdup($2); }
+
+page_size: page_size_name | page_size_custom
;
-media_type: MEDIA_TYPE tSTRING
- { media_type = c_strdup($2); }
+
+parameter_string: PARAMETER tSTRING tSTRING
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>parameter_string %s %s\n", $2, $3);
+ stp_set_string_parameter(global_vars, $2, $3);
+ free($2);
+ free($3);
+ }
+;
+
+parameter_int: PARAMETER_INT tSTRING tINT
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>parameter_int %s %d\n", $2, $3);
+ stp_set_int_parameter(global_vars, $2, $3);
+ free($2);
+ }
;
-media_size: MEDIA_SIZE tSTRING
- { media_size = c_strdup($2); }
+
+parameter_float: PARAMETER_FLOAT tSTRING tDOUBLE
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>parameter_float %s %f\n", $2, $3);
+ stp_set_float_parameter(global_vars, $2, $3);
+ free($2);
+ }
+;
+
+parameter_curve: PARAMETER_CURVE tSTRING tSTRING
+ {
+ stp_curve_t *curve = stp_curve_create_from_string($3);
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>parameter_curve %s %s\n", $2, $3);
+ if (curve)
+ {
+ stp_set_curve_parameter(global_vars, $2, curve);
+ stp_curve_destroy(curve);
+ }
+ free($2);
+ }
;
-dither_algorithm: DITHER_ALGORITHM tSTRING
- { dither_algorithm = c_strdup($2); }
+
+parameter: parameter_string | parameter_int | parameter_float
;
density: DENSITY tDOUBLE
- { density = $2; }
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>density %f\n", $2);
+ global_density = $2;
+ }
;
top: TOP tDOUBLE
- { xtop = $2; }
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>top %f\n", $2);
+ global_xtop = $2;
+ }
;
left: LEFT tDOUBLE
- { xleft = $2; }
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>left %f\n", $2);
+ global_xleft = $2;
+ }
;
hsize: HSIZE tDOUBLE
- { hsize = $2; }
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>hsize %f\n", $2);
+ global_hsize = $2;
+ }
;
vsize: VSIZE tDOUBLE
- { vsize = $2; }
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>vsize %f\n", $2);
+ global_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->t = E_PATTERN;
- t->d.p.c_min = $2;
- t->d.p.c = $3;
- t->d.p.c_gamma = $4;
- t->d.p.m_min = $5;
- t->d.p.m = $6;
- t->d.p.m_gamma = $7;
- t->d.p.y_min = $8;
- t->d.p.y = $9;
- t->d.p.y_gamma = $10;
- t->d.p.k_min = $11;
- t->d.p.k = $12;
- t->d.p.k_gamma = $13;
- t->d.p.c_level = $14;
- t->d.p.m_level = $15;
- t->d.p.y_level = $16;
- t->d.p.lower = $17;
- t->d.p.upper = $18;
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>blackline %d\n", $2);
+ global_noblackline = !($2);
+ }
+;
+
+color_block1: tDOUBLE tDOUBLE tDOUBLE
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>color_block1 %f %f %f (%d)\n", $1, $2, $3,
+ current_index);
+ if (current_index < STP_CHANNEL_LIMIT)
+ {
+ current_testpattern->d.p.mins[current_index] = $1;
+ current_testpattern->d.p.vals[current_index] = $2;
+ current_testpattern->d.p.gammas[current_index] = $3;
+ current_index++;
+ }
+ }
+;
+
+color_blocks1a: color_block1 | color_blocks1a color_block1
+;
+
+color_blocks1b: /* empty */ | color_blocks1a
+;
+
+color_blocks1: color_block1 color_blocks1b
+;
+
+color_block2a: COLOR tDOUBLE tDOUBLE tDOUBLE
+ {
+ int channel = find_color($1.sval);
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>color_block2a %s %f %f %f\n", $1.sval, $2, $3, $4);
+ if (channel >= 0 && channel < STP_CHANNEL_LIMIT)
+ {
+ current_testpattern->d.p.mins[channel] = $2;
+ current_testpattern->d.p.vals[channel] = $3;
+ current_testpattern->d.p.gammas[channel] = $4;
+ }
+ }
+;
+
+color_block2b: CHANNEL tINT tDOUBLE tDOUBLE tDOUBLE
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>color_block2b %d %f %f %f\n", $2, $3, $4, $5);
+ if ($2 >= 0 && $2 < STP_CHANNEL_LIMIT)
+ {
+ current_testpattern->d.p.mins[$2] = $3;
+ current_testpattern->d.p.vals[$2] = $4;
+ current_testpattern->d.p.gammas[$2] = $5;
+ }
+ }
+;
+
+color_block2: color_block2a | color_block2b
+;
+
+color_blocks2a: color_block2 | color_blocks2a color_block2
+;
+
+color_blocks2: /* empty */ | color_blocks2a
+;
+
+color_blocks: color_blocks1 | color_blocks2
+;
+
+patvars: tDOUBLE tDOUBLE tDOUBLE tDOUBLE tDOUBLE
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>patvars %f %f %f %f %f\n", $1, $2, $3, $4, $5);
+ current_testpattern->t = E_PATTERN;
+ current_testpattern->d.p.lower = $1;
+ current_testpattern->d.p.upper = $2;
+ current_testpattern->d.p.levels[1] = $3;
+ current_testpattern->d.p.levels[2] = $4;
+ current_testpattern->d.p.levels[3] = $5;
+ current_testpattern = get_next_testpattern();
+ current_index = 0;
+ }
+;
+
+pattern: PATTERN patvars color_blocks
+;
+
+xpattern: XPATTERN color_blocks
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>xpattern\n");
+ if (global_channel_depth == 0)
+ {
+ fprintf(stderr, "xpattern may only be used with extended color depth\n");
+ exit(1);
+ }
+ current_testpattern->t = E_XPATTERN;
+ current_testpattern = get_next_testpattern();
+ current_index = 0;
+ }
+;
+
+grid: GRID tINT
+ {
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>grid %d\n", $2);
+ current_testpattern->t = E_GRID;
+ current_testpattern->d.g.ticks = $2;
+ current_testpattern = get_next_testpattern();
+ current_index = 0;
}
;
image: IMAGE tINT tINT
{
- testpattern_t *t = get_next_testpattern();
- t->t = E_IMAGE;
- t->d.i.x = $2;
- t->d.i.y = $3;
- if (t->d.i.x <= 0 || t->d.i.y <= 0)
+ if (getenv("STP_TESTPATTERN_DEBUG"))
+ fprintf(stderr, ">>>image %d %d\n", $2, $3);
+ current_testpattern->t = E_IMAGE;
+ current_testpattern->d.i.x = $2;
+ current_testpattern->d.i.y = $3;
+ if (current_testpattern->d.i.x <= 0 ||
+ current_testpattern->d.i.y <= 0)
{
fprintf(stderr, "image width and height must be greater than zero\n");
exit(1);
}
return 0;
}
+;
+
+Message0: MESSAGE tSTRING
+ {
+ fprintf(stderr, $2);
+ free($2);
+ }
+;
+Message1: MESSAGE tSTRING tSTRING
+ {
+ fprintf(stderr, $2, $3);
+ free($2);
+ free($3);
+ }
+;
+Message2: MESSAGE tSTRING tSTRING tSTRING
+ {
+ fprintf(stderr, $2, $3, $4);
+ free($2);
+ free($3);
+ free($4);
+ }
+;
+Message3: MESSAGE tSTRING tSTRING tSTRING tSTRING
+ {
+ fprintf(stderr, $2, $3, $4, $5);
+ free($2);
+ free($3);
+ free($4);
+ free($5);
+ }
+;
+Message4: MESSAGE tSTRING tSTRING tSTRING tSTRING tSTRING
+ {
+ fprintf(stderr, $2, $3, $4, $5, $6);
+ free($2);
+ free($3);
+ free($4);
+ free($5);
+ free($6);
+ }
+;
+
+A_Message: Message0 | Message1 | Message2 | Message3 | Message4
+;
+
+message: A_Message
+;
+
+A_Rule: gamma | channel_gamma | level | channel_level | global_gamma | steps
+ | ink_limit | printer | parameter | density | top | left | hsize
+ | vsize | blackline | inputspec | page_size | message
+;
+
+Rule: A_Rule SEMI
+ { global_did_something = 1; }
+;
-Empty:
+A_Pattern: pattern | xpattern | grid | message
+;
-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: A_Pattern SEMI
+ { global_did_something = 1; }
+;
-Patterns: Patterns pattern | Empty
+Patterns: /* empty */ | Patterns Pattern
+;
Image: image
+ { global_did_something = 1; }
+;
-Rules: Rules Rule | Empty
+Rules: /* empty */ | Rules Rule
+;
Output: Patterns | Image
+;
-Thing: Rules Output Empty
+EOF: /* empty */ | END SEMI
+ { return 0; }
+;
+
+Thing: Rules
+ {
+ current_testpattern = get_next_testpattern();
+ }
+ Output EOF
+;
%%