diff options
author | Roger Leigh <rleigh@debian.org> | 2008-10-26 16:11:41 +0000 |
---|---|---|
committer | Roger Leigh <rleigh@debian.org> | 2008-10-26 16:11:41 +0000 |
commit | dfae5860833782af557deb35e286d7e186fe3cf5 (patch) | |
tree | e3b4282ae08e120f78cd0c097f7cb3b570e94da2 /src/main | |
parent | 3b59bb0a607ec27ea60f07d1cd5d1bbb4483c832 (diff) |
Imported Upstream version 4.3.99+cvs20050702
Diffstat (limited to 'src/main')
71 files changed, 56913 insertions, 40219 deletions
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 = ˙ + 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, µ) != 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 <, &, >, , ", &#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, "&")) + ch = '&'; + else if (!strcmp(entity, ">")) + ch = '>'; + else if (!strcmp(entity, "<")) + ch = '<'; + else if (!strcmp(entity, " ")) + ch = 0xa0; + else if (!strcmp(entity, """)) + 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; +} + + + |